<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mustache :{ RSS Feed]]></title><description><![CDATA[What the..]]></description><link>https://aanoaa.github.io</link><generator>GatsbyJS</generator><lastBuildDate>Fri, 12 Mar 2021 01:32:28 GMT</lastBuildDate><item><title><![CDATA[kubelet 요청에 대한 kube-apiserver 의 응답실패]]></title><description><![CDATA[on-premise 에서 운영중이던 1.20 클러스터에서 KubeAPIErrorBudgetBurn alert 이 발생 The API server is burning too much error budget.
API…]]></description><link>https://aanoaa.github.io/apiserver-kubelet-resource-version/</link><guid isPermaLink="false">https://aanoaa.github.io/apiserver-kubelet-resource-version/</guid><pubDate>Fri, 12 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;on-premise 에서 운영중이던 &lt;code&gt;1.20&lt;/code&gt; 클러스터에서 &lt;a href=&quot;https://monitoring.mixins.dev/kubernetes/#kube-apiserver-slos&quot;&gt;KubeAPIErrorBudgetBurn&lt;/a&gt; alert 이 발생&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The API server is burning too much error budget.
API 서버가 너무 많은 오류 예산을 소모하고 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;용어가 생소해서 무서웡.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sre.google/workbook/alerting-on-slos/#4-alert-on-burn-rate&quot;&gt;burn rate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.atlassian.com/incident-management/kpis/error-budget&quot;&gt;error budget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SLI: Service Level Indicator&lt;/li&gt;
&lt;li&gt;SLA: Service Level Agreement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;얼추 SLA 가 99% 라고 가정한다면, (우리 서비스는 연 99% 의 가용성을 보장합니다. 라고 뻥쳤다면..)
burn rate 가 늘어나면 이를 만족 시킬 수 없음.
시간이 지남에 따라 burn rate 에 비례해서 SLA 도 낮아짐.&lt;/p&gt;
&lt;p&gt;이러한 상황을 대비해서 전문가형님들이 &lt;code&gt;KubeAPIErrorBudgetBurn&lt;/code&gt; 이라는 alert rule 을 정의해 놓은 것인데 이게 발생.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alert: KubeAPIErrorBudgetBurn
annotations:
  description: The API server is burning too much error budget.
  runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubeapierrorbudgetburn
  summary: The API server is burning too much error budget.
expr: |
  sum(apiserver_request:burnrate1h) &gt; (14.40 * 0.01000)
  and
  sum(apiserver_request:burnrate5m) &gt; (14.40 * 0.01000)
for: 2m
labels:
  long: 1h
  severity: critical
  short: 5m
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;대충 쓰면.. kube apiserver 요청에서 최근 1시간동안 burnrate 높으면 발생.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;../assets/grafana-kube-apiserver.png&quot; alt=&quot;grafana-kube-apiserver&quot;&gt;&lt;/p&gt;
&lt;p&gt;실제로 grpc, http 요청에 대해서 404, 504 에러가 1 rps 정도로 발생.&lt;/p&gt;
&lt;p&gt;apiservice 는 존나 많은데 어디에서 발생하는거지? 를 파악해야 하는데, 친절하게도 &lt;code&gt;READ SLI - Errors&lt;/code&gt; 에 서비스이름이 표시됨.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apiserver_request_total{code=&quot;504&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;로 질의해보니까 꾸준히 증가하고 있었음.&lt;/p&gt;
&lt;p&gt;kube api-server 로그에는 실패한 request 에 대한 로그가 나타남.
on-premise 환경이라서 control plane 은 pods 가 아닌 host 노드에 docker 서비스로 실행 중.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ docker logs -f kube-apiserver
...
I0311 06:34:27.831861       1 trace.go:205] Trace[499901619]: &quot;List&quot; url:/apis/node.k8s.io/v1beta1/runtimeclasses,user-agent:kubelet/v1.19.4 (linux/amd64) kubernetes/d360454,client:10.107.100.22 (11-Mar-2021 06:34:24.831) (total time: 3000ms):
Trace[499901619]: [3.000718126s] [3.000718126s] END
I0311 06:34:27.863066       1 trace.go:205] Trace[1117820138]: &quot;cacher list&quot; type:*storage.CSIDriver (11-Mar-2021 06:34:24.862) (total time: 3000ms):
Trace[1117820138]: [3.000170923s] [3.000170923s] END
I0311 06:34:27.863518       1 trace.go:205] Trace[1580916889]: &quot;List&quot; url:/apis/storage.k8s.io/v1/csidrivers,user-agent:kubelet/v1.19.4 (linux/amd64) kubernetes/d360454,client:10.107.100.16 (11-Mar-2021 06:34:24.862) (total time: 3000ms):
Trace[1580916889]: [3.000655319s] [3.000655319s] END
I0311 06:34:31.843461       1 trace.go:205] Trace[8763432]: &quot;cacher list&quot; type:*node.RuntimeClass (11-Mar-2021 06:34:28.843) (total time: 3000ms):
Trace[8763432]: [3.0001488s] [3.0001488s] END
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;뭔말인지 모르겠고, 지표에 나타난 csidriver 랑 runtimeclass api 목록조회 요청임. 이게 실패한다고?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ kubectl get runtimeclass
No resources found

$ kubectl get csidriver
NAME                            ATTACHREQUIRED   PODINFOONMOUNT   MODES        AGE
rook-ceph.cephfs.csi.ceph.com   true             false            Persistent   38d
rook-ceph.rbd.csi.ceph.com      true             false            Persistent   38d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;실패안하는데?&lt;/p&gt;
&lt;p&gt;kubectl 말고 api 에 대한 raw 요청을 시도.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ kubectl get --raw /apis/node.k8s.io/v1beta1/runtimeclasses | jq .
$ kubectl get --raw /apis/storage.k8s.io/v1/csidrivers | jq .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;둘다 OK.&lt;/p&gt;
&lt;p&gt;???&lt;/p&gt;
&lt;p&gt;아 그냥 EKS 쓰고 싶음.&lt;/p&gt;
&lt;p&gt;control plane 에는 &lt;code&gt;/var/log/kube-audit/&lt;/code&gt; 디렉토리에 audit log 가 쌓임.&lt;/p&gt;
&lt;p&gt;여기에서 조회하니까&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &quot;userAgent&quot;: &quot;kubelet/v1.19.4 (linux/amd64) kubernetes/d360454&quot;,
  &quot;requestURI&quot;: &quot;/apis/node.k8s.io/v1beta1/runtimeclasses?resourceVersion=191700552&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;kubelet 에서 오류가 발생하는 apiservice 를 이용할때에 resourceVersion parameter 를 넘겨줌&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ kubectl get --raw /apis/node.k8s.io/v1beta1/runtimeclasses?resourceVersion=191700552 | jq .
Error from server (Timeout): Timeout: Too large resource version: 191700552, current: 187970861
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes/kubernetes/issues/91073&quot;&gt;https://github.com/kubernetes/kubernetes/issues/91073&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It handled the &quot;too old RV&quot; error, but it doesn&apos;t handle &quot;too large RV&quot; correctly. What it should be doing instead is to:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;위 형님께서 이미 다 알고 계셨고 패치 하셨음.&lt;/p&gt;
&lt;p&gt;근데 왜 나만? EKS 로 옮겨야..&lt;/p&gt;
&lt;p&gt;kubelet 이 사용하는 resource version 을 patch 해주면 되지 않을까?
(configmap 등을 뒤져봤는데 map 데이터 못찾겠음)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kubernetes/kubernetes/issues/70674&quot;&gt;https://github.com/kubernetes/kubernetes/issues/70674&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;그런거 없음.&lt;/p&gt;
&lt;p&gt;그러던 와중에 audit log 에서 source ip 를 발견&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &quot;sourceIPs&quot;: [
    &quot;10.107.1.2&quot;
  ],
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;저건 예전에 사용하던 worker 노드의 ip.&lt;/p&gt;
&lt;p&gt;들어가보니 kubelet 이 떠 있음.&lt;/p&gt;
&lt;p&gt;홀리..&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;추적하면서 github 이슈 및 패치된 소스코드등을 훑어봤는데 존나 대단.
존경합니다 형님들.&lt;/p&gt;
&lt;p&gt;이렇게 사이즈가 큰 프로젝트도 잘 굴리는구나..&lt;/p&gt;
&lt;p&gt;교훈.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;청소를 잘하자.&lt;/li&gt;
&lt;li&gt;alert 님 말씀 잘 듣자.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[강남빵집]]></title><description><![CDATA[어제 강남역 근처 어디 빵집(카페?) 갔는데, 프랑스밀가루 안데스솔트(소금) 을 사용한 프리미엄 빵을 팔더라.
쬐간하고 비싸. 맛있냐면 뭐 그냥 빵. 안데스솔트 뭔데 프랑스밀가루 ㅋㅋㅋ 뒤진다.]]></description><link>https://aanoaa.github.io/gangnam-bread/</link><guid isPermaLink="false">https://aanoaa.github.io/gangnam-bread/</guid><pubDate>Sat, 27 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;어제 강남역 근처 어디 빵집(카페?) 갔는데,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;프랑스밀가루&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;안데스솔트(소금)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;을 사용한 프리미엄 빵을 팔더라.
쬐간하고 비싸. 맛있냐면 뭐 그냥 빵.&lt;/p&gt;
&lt;p&gt;안데스솔트 뭔데&lt;/p&gt;
&lt;p&gt;프랑스밀가루 ㅋㅋㅋ&lt;/p&gt;
&lt;p&gt;뒤진다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[1m 목줄에 묶여...시골개의 하루를 보냈다]]></title><description><![CDATA['1m 목줄'에 묶여...시골개의 하루를 보냈다 너무 슬프다.
행동하지 못하고 주둥이로만 슬퍼하는 것도 죄책감이 든다.]]></description><link>https://aanoaa.github.io/tied-dogs/</link><guid isPermaLink="false">https://aanoaa.github.io/tied-dogs/</guid><pubDate>Sun, 14 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://news.mt.co.kr/mtview.php?no=2021021017593615771&quot;&gt;&apos;1m 목줄&apos;에 묶여...시골개의 하루를 보냈다&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;너무 슬프다.
행동하지 못하고 주둥이로만 슬퍼하는 것도 죄책감이 든다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[prometheus-operator 의 defaultRules]]></title><description><![CDATA[prometheus-community/kube-prometheus-stack 차트를 사용하면, defaultRules…]]></description><link>https://aanoaa.github.io/prometheusrules/</link><guid isPermaLink="false">https://aanoaa.github.io/prometheusrules/</guid><pubDate>Thu, 04 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack&quot;&gt;prometheus-community/kube-prometheus-stack&lt;/a&gt; 차트를 사용하면, defaultRules 가 굉장히 많이 켜져 있는데, 이게 편리하달지 모르고 쓰는 무기랄지 모르겠음.&lt;/p&gt;
&lt;p&gt;검증용 도구로써 활용하면 좋을 것 같긴 함.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;일단 다 켜두고 alert 이 오는지 확인.&lt;/li&gt;
&lt;li&gt;근데 다 켜두고 alert 을 제대로 오게 하는 것도 볼게 많은게 함정.&lt;/li&gt;
&lt;li&gt;다 켰으면 발생하는 alert 확인하고 뭐가 제대로 동작하지 않는 건지 원인파악해서 해결.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;3번 까지 마쳤으면 뭔가 상태가 이상하면 알아서 잘 alert 이 오는 건 좋긴한데..
아 이제 된건가? 하고 안심할 수도 없다.
defaultRules 에 얼마나 많은 alert 이 설정됐고 각각의 rule 이 어떤 상황을 설명하는건지 모르거던.
커뮤니티에서 알아서 잘 해줬겠지.. 믿고 가고 싶지만 아 이제 alert 이 안오는 걸 보니 제대로 됐군 이라는 안정감보다는 불명확한 구성을 인스톨했다는데서 오는 불안감이 있음.&lt;/p&gt;
&lt;p&gt;차트로써 인스톨하는 것들이 다 그러함.
차트제작자님 믿습니다. :pray: 랄까.&lt;/p&gt;
&lt;p&gt;클라우드에서는 모르겠는데 on-premise 에서는 default 로 설치했다? -&gt; 뭐가 잘 안됨이라서..&lt;/p&gt;
&lt;p&gt;metric 이 잘 수집되게 하는데만해도 이것저것 살필게 많음.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kube component 들이 auto-discovery 가 안되고,&lt;/li&gt;
&lt;li&gt;컴포넌트 metric 수집 endpoint 에 tls 를 사용했다면 인증 문제를 해결해야 하고,&lt;/li&gt;
&lt;li&gt;각 컴포넌트들의 exporter 에 버그들이 존재하는데 살펴보면 해결하는 중이고, (이런 건 패치할 능력이 안되니 alert off)&lt;/li&gt;
&lt;li&gt;component 를 실행시키는 옵션에 따라 수집되고 안되고,&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;alert 이 발생해도 피곤한 것이 어느 rule 의 어느 expression 이 무슨역할을 하는지 왜 alert 이 발생했는지 살펴봐야하고,
문제를 트러블슈팅하는 것도 상황이 넘 다양해서 어려웡..&lt;/p&gt;
&lt;p&gt;수집되는 metric 이 엄청나게 많고 누가 뭘 쓰고 이 metric 은 뭐고를 모르는 상황.
근데 alert 이 발생. 반복.
뭐지? 하고 넘기면 이건 alert 붙여놓은거나 마나인거고(쿨타임 찰때마다 불멸의 alert 을 받게됨)&lt;/p&gt;
&lt;p&gt;각각의 지표가 무슨 역할을 하는건지 알아야 하고, alert 을 발생시킨 prometheus rule 을 알아야 하는데,
그걸 어케 다 들여다보지. 이거는 클러스터 개발/운영의 작은 부분집합일 뿐인데.&lt;/p&gt;
&lt;p&gt;남들은 어케 이걸 다 하고 있는건가 싶기도 하고 존경스러움.&lt;/p&gt;
&lt;p&gt;오픈소스 형님들 믿습니다.&lt;/p&gt;
&lt;p&gt;또 똥글을..&lt;/p&gt;
&lt;p&gt;뭔가 실용적인 내용을 써보고 싶은데 힝..&lt;/p&gt;</content:encoded></item><item><title><![CDATA[yasnippet 안의 elisp]]></title><description><![CDATA[typescript 의 시작을 emacs 로 했었는데, 이때 lsp 을 사용해서 넘 경쾌하게 썼었다.
근데 IDE 써봐야지 하면서 억지로 vscode 썼는데 이것도 쓰다보니 훌륭. 그러다 보니 go…]]></description><link>https://aanoaa.github.io/elisp/</link><guid isPermaLink="false">https://aanoaa.github.io/elisp/</guid><pubDate>Mon, 01 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;typescript 의 시작을 emacs 로 했었는데, 이때 lsp 을 사용해서 넘 경쾌하게 썼었다.
근데 IDE 써봐야지 하면서 억지로 vscode 썼는데 이것도 쓰다보니 훌륭.&lt;/p&gt;
&lt;p&gt;그러다 보니 go 작업할때에 설정없이 간편하게 시작할 수 있어서 vscode 를 썼었다.
버튼 누르면 알아서 다되더라고.&lt;/p&gt;
&lt;p&gt;그러다가 go 를 script 처럼 쓰려고 다시 emacs 에 설정해서 쓰는데 경쾌함이 다르다.
&lt;a href=&quot;https://github.com/dominikh/go-mode.el&quot;&gt;go-mode.el&lt;/a&gt; 이 외부 툴 연동도 훌륭하고,
vscode 에서의 답답함이 없다.&lt;/p&gt;
&lt;p&gt;맥부기라서 그랬나..&lt;/p&gt;
&lt;p&gt;답답함을 느꼈던 건 vscode on macOS
지금은 emacs on linux&lt;/p&gt;
&lt;p&gt;아무튼 다시 설정 지옥에 빠져서 &quot;그래 반복되는 타이핑을 줄이자&quot; snippet 을 작성.
남의 snippet 중에 뭐 쓸거 없나 구경하던차에..&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;package ${1:`(car (last (split-string (file-name-directory buffer-file-name) &quot;/&quot;) 2))`}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;요런게 보였음.
alias 로 걸어둔 &lt;code&gt;pkg&lt;/code&gt; 또는 &lt;code&gt;package&lt;/code&gt; 를 입력하고 tab 누르면&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package &amp;#x3C;현재디렉토리명&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 뙇&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;${1:`()`}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;back quote 로 감싼 괄호 안에서 elisp 표현식을 써서 default 값을 지정할 수 있음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;Example_foo() {

    // Output:
    // .
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이거 매번 작성하기 조띠 귀찮아서 perl 로 template 만들어서 사용했는데 그럴 필요가 없었던 거임.
그래서 저 lisp 좀만 변경하면 어케 될 거 같아서 스슥.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;(car (last (split-string (file-name-directory buffer-file-name) &quot;/&quot;) 2))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ㅋㅋㅋ lisp 는 어케 매번 새로움&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;(buffer-file-name) ;; 현재 버퍼의 파일명 foo_test.go 여기서 내가 필요한게 foo
(file-name-directory FILE) ;; 전체 경로 주는 건데 이건 필요없음
(split-string STRING &amp;#x26;optional SEPARATOR...) ;; 구분자로 잘라주겠거니..
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;어케어케 해서 &lt;code&gt;foo_test.go&lt;/code&gt; 파일에서 &lt;code&gt;foo&lt;/code&gt; 가져와야 하는데 &lt;code&gt;foo_test&lt;/code&gt; 까진 됐음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;(car (last (split-string (car (last (split-string (buffer-file-name) &quot;\\.&quot;) 2)) &quot;/&quot;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;영역잡고 괄호열면 양 끝에 괄호 열어주고 괄호 닫으면 pair 괄호 닫아주고 신통방통&lt;/p&gt;
&lt;p&gt;이번에 하나 얻은건 표현식 값을 확인하는 방법
지금까지는 젤 마지막 괄호에 대해서만 동작하는 줄 알았는데, 중간 괄호에 대고 &lt;code&gt;C-x C-e&lt;/code&gt; eval-last-sexp 해주면 이게 동작해서 잘라서 확인해볼 수 있음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-emacs-lisp&quot;&gt;(car (last (split-string (car (last (split-string (buffer-file-name) &quot;\\.&quot;) 2)) &quot;/&quot;))) ;; a  &amp;#x3C;- current-buffer 가 a.el 이라서


(last (split-string (buffer-file-name) &quot;\\.&quot;) 2) ;; (&quot;...&quot; &quot;el&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;뭐 이런식으로 넓혔다가 좁혔다가 하고 eldoc 보면서 어케어케&lt;/p&gt;
&lt;p&gt;암튼 go 개발환경으로써 emacs 조띠 좋음&lt;/p&gt;</content:encoded></item><item><title><![CDATA[golang pointer receiver]]></title><description><![CDATA[golang 을 만지다가 이게 뭔일이여 싶어서..
pointer receiver method 안에서 address 가 아닌 value 로 사용해도 동작한다? https://tour.golang.org/methods/…]]></description><link>https://aanoaa.github.io/go-lang-pointer-receiver/</link><guid isPermaLink="false">https://aanoaa.github.io/go-lang-pointer-receiver/</guid><pubDate>Sat, 30 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;golang 을 만지다가 이게 뭔일이여 싶어서..
pointer receiver method 안에서 address 가 아닌 value 로 사용해도 동작한다?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tour.golang.org/methods/4&quot;&gt;https://tour.golang.org/methods/4&lt;/a&gt; 여기에서 예제를 보니까 pointer receiver 메소드 안에서,
value 를 사용하길래 어? 이상하다 했는데 테스트해보니까 그러함&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;package main

import (
    &quot;fmt&quot;
    &quot;math&quot;
)

type Vertex struct {
    X, Y float64
}

func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func main() {
    v := Vertex{3, 4}
    v.Scale(10)
    fmt.Println(v.Abs())
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;모르겠는 부분은 여기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f

    // 왜 이게 아니고..
    // (*v).X = (*v).X * f
    // (*v).Y = (*v).Y * f
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아래는 테스트 해본거&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;package test

type multiset struct {
    values []int
}

// pointer receiver (1)
func (m *multiset) append(val int) {
    for _, v := range (*m).values {
        if v == val {
            return
        }
    }

    (*m).values = append((*m).values, val)
}

// pointer receiver (2)    &amp;#x3C;- 왜 됨?
func (m *multiset) append(val int) {
    for _, v := range m.values {
        if v == val {
            return
        }
    }

    m.values = append(m.values, val)
}

// value receiver (3)
func (m multiset) append(val int) {
    for _, v := range m.values {
        if v == val {
            return
        }
    }

    m.values = append(m.values, val)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;package test

import &quot;fmt&quot;

func Example_pr() {
    var ms multiset
    ms = multiset{[]int{1, 2, 3}}
    fmt.Println(ms) // 123

    ms.append(4)
    fmt.Println(ms) // 1234

    ms.append(4)
    fmt.Println(ms) // 1234

    // Output:
    // {[1 2 3]}
    // {[1 2 3 4]}
    // {[1 2 3 4]}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각 케이스 별로 위 테스트 돌리면..&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 성공&lt;/li&gt;
&lt;li&gt;(2) 실패&lt;/li&gt;
&lt;li&gt;(3) 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;로 예상했는데&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 성공&lt;/li&gt;
&lt;li&gt;(2) 성공 &amp;#x3C;- ???&lt;/li&gt;
&lt;li&gt;(3) 실패&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;가 됨&lt;/p&gt;
&lt;p&gt;왜죠?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;이것은 포인트 리시버와 무관하고, struct 에 대한 내용이다.
그리고 그것을 사용하는 표현식.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;some := mystruct{}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;some 은 struct 의 값인데, 배열/슬라이스와 마찬가지로 다른 데이터들의 집합을 가리키는 값을 가진다.
(struct 가 기본자료형의 alias 가 아니라면)&lt;/p&gt;
&lt;p&gt;struct 와 struct pointer 둘다 dot 표기법 사용이 가능하다.
뭘 써야 되는지는 아직 모르겠지만..&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tour.golang.org/methods/4&quot;&gt;https://tour.golang.org/methods/4&lt;/a&gt; 예제에서는 간결한 표현을 위해서인지 struct 의 value 대신에 struct 의 pointer 를 사용.&lt;/p&gt;
&lt;p&gt;이거..&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;어느 구루께서 명쾌하게 이거써~ 하면 그거 쓸텐데 일단 이렇게 써야..&lt;/p&gt;
&lt;p&gt;이건 caller 가 struct data type 이 아니고 내부 자료형일때에..
헛갈리지 않는다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;type myint int

func (m *myint) increase() myint {
    fmt.Println(&quot;  m&quot;, m)  //  m 0xc000014168
    fmt.Println(&quot; *m&quot;, *m) // *m 1
    (*m)++
    return (*m)
}

func Example_myint() {
    var mi myint
    mi = myint(1)
    fmt.Println(mi)  // 1
    fmt.Println(&amp;#x26;mi) // 0xc000014168

    mi.increase()
    fmt.Println(mi) // 2

    // Output:
    // 1
    // 0xc000014168
    //   m 0xc000014168
    //  *m 1
    // 2
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이건 caller 가 struct data type&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fmt&lt;/code&gt; 에서 struct 의 address 는 실제 주소대신에 &lt;code&gt;&amp;#x26;{x}&lt;/code&gt; 이런식으로 표현해주어서 &lt;code&gt;%p&lt;/code&gt; 포매터로 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;type mystruct struct {
    foo int
}

func (m *mystruct) increase() int {
    fmt.Printf(&quot;  m %d %p\n&quot;, m, m) //  m &amp;#x26;{1} 0xc0000a0050
    fmt.Println(&quot; *m&quot;, *m)          // *m {1}

    m.foo++
    return m.foo
}

func Example_mystruct() {
    var ms mystruct
    ms = mystruct{1}
    fmt.Println(ms)  // {1}
    fmt.Println(&amp;#x26;ms) // &amp;#x26;{1}

    ms.increase()
    fmt.Println(ms) // 2

    // Output:
    // {1}
    // &amp;#x26;{1}
    //   m &amp;#x26;{1} 0xc0000a0050
    //  *m {1}
    // {2}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;struct 의 pointer 와 struct 의 첫번째 멤버의 pointer 가 같음
값은 같지만 자료형에 따라 사용방법이 달라짐&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func Example_mystruct2() {
    var ms mystruct
    ms = mystruct{1}

    var msp *mystruct
    var foop *int

    msp = &amp;#x26;ms
    foop = &amp;#x26;(ms.foo)

    fmt.Printf(&quot;%d %p\n&quot;, msp, msp)                                // &amp;#x26;{1} 0xc0000141a8
    fmt.Println(foop)                                              // 0xc0000141a8
    fmt.Println(fmt.Sprintf(&quot;%p&quot;, msp) == fmt.Sprintf(&quot;%p&quot;, foop)) // true

    // 일반적인 사용법
    ms.foo++

    // compile error! invalid operation
    // *msp 는 *foo 와 같지만 내부에 metadata 가 있어서 구별하는 듯
    (*msp)++    // 요거 에러남

    // msp 는 ms 의 pointer 이지만 dot notation 으로 사용가능
    // 왜 가능? 그렇게 만들어놨으니까 가능. 이건 내부 구현을 몰라서 되는갑다 하능..
    // pointer reciever method 에서 이렇게 사용
    msp.foo++

    (*msp).foo++ // 이제 이게 요상해보이네..
    (*foop)++    // struct 내부의 값을 직접변경

    fmt.Println(ms)

    // Output:
    // &amp;#x26;{1} 0xc00010c050
    // 0xc00010c050
    // true
    // {5}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;struct 의 pointer 에서 struct 처럼 dot notation 을 사용할 수 있다.
정도가 되겠다.&lt;/p&gt;
&lt;p&gt;다른 예외케이스가 있는지 모르겠지만..&lt;/p&gt;
&lt;p&gt;컴파일러가 알아서 해주겠지.. 믿습니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[미국책 주문]]></title><description><![CDATA[쇼핑을 거의 안하는(못하는?) 편인데, 미국책이 필요했다. 용사장한테 물어보니까 amazon.com 에서 사면 된다고..
배달 받으려면 미국식 주소명이 필요해서 https://www.jusoen.com…]]></description><link>https://aanoaa.github.io/american-book-order/</link><guid isPermaLink="false">https://aanoaa.github.io/american-book-order/</guid><pubDate>Fri, 15 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;쇼핑을 거의 안하는(못하는?) 편인데, 미국책이 필요했다.&lt;/p&gt;
&lt;p&gt;용사장한테 물어보니까 amazon.com 에서 사면 된다고..
배달 받으려면 미국식 주소명이 필요해서&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jusoen.com/&quot;&gt;https://www.jusoen.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;에서 바꿔주고..&lt;/p&gt;
&lt;p&gt;&apos;-&apos;] 고맙습니다.&lt;/p&gt;
&lt;p&gt;결제는 카뱅 체크카드 등록해서..(비자? 마스터? 그림 있던데)&lt;/p&gt;
&lt;p&gt;&apos;-&apos;] 고맙습니다.&lt;/p&gt;
&lt;p&gt;&apos;-&apos;] 버럭 yes24, 알라딘 일 안하냐.&lt;/p&gt;
&lt;p&gt;킨들 있어서 전자책으로 살까 했지만..
안읽을거야 아마..&lt;/p&gt;
&lt;p&gt;&apos;-&apos;] 미국책 오면 볼거다.
안 볼걸 아마..&lt;/p&gt;
&lt;p&gt;읽혀야 보든말든..&lt;/p&gt;
&lt;p&gt;&apos;-&apos;] 번역안하냐&lt;/p&gt;
&lt;p&gt;산거는 이거 &lt;a href=&quot;https://programming-kubernetes.info/&quot;&gt;https://programming-kubernetes.info/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;이거 왜 썻냐면 나같은 인터넷 쇼핑 고자도 주소변환 사이트랑 카뱅 체크 카드 있으면 미국에서 책 주문 할 수 있다고.&lt;/p&gt;
&lt;p&gt;아 용사장 시키고 싶네 이런거&lt;/p&gt;
&lt;p&gt;왜 하인을 부렸는지 알거 같음&lt;/p&gt;
&lt;p&gt;출세해서 용사장 하인으로 부려야지&lt;/p&gt;</content:encoded></item><item><title><![CDATA[동트는 농가]]></title><description><![CDATA[http://m.dnfood.kr/main/index…]]></description><link>https://aanoaa.github.io/dnfood/</link><guid isPermaLink="false">https://aanoaa.github.io/dnfood/</guid><pubDate>Thu, 31 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://m.dnfood.kr/main/index&quot;&gt;http://m.dnfood.kr/main/index&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;동트는농가라고 찌개거리 냉동해서 판다.
이게 조띠 맛있다.&lt;/p&gt;
&lt;p&gt;그냥 암것도 없이 요것만 끓이면 부실하고 별론데 감자, 두부, 돼지고기, 애호박 이런거 사서 끓이면 조띠 맛있다.&lt;/p&gt;
&lt;p&gt;온라인으로 구매하는 완전 조리식품은 대부분 별로인데 이건 집에서 요리한 느낌난다.&lt;/p&gt;
&lt;p&gt;못나가니까 시부럴 집에서 밥을 다 해먹네&lt;/p&gt;</content:encoded></item><item><title><![CDATA[포장된 단어]]></title><description><![CDATA[내가 싫어하는 단어/문장이 몇 개 있다. 찰 수제 정중히 거절합니다 1은 찰토마토 등의 프리미엄을 가장한 수식어
그냥 토마토 팔면서 앞에 "찰" 이라는 마법의 수식어를 붙여서 더 비싸게 팜 뭐가 찰인데 2는 hand made…]]></description><link>https://aanoaa.github.io/words/</link><guid isPermaLink="false">https://aanoaa.github.io/words/</guid><pubDate>Mon, 28 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;내가 싫어하는 단어/문장이 몇 개 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;찰&lt;/li&gt;
&lt;li&gt;수제&lt;/li&gt;
&lt;li&gt;정중히 거절합니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1은 찰토마토 등의 프리미엄을 가장한 수식어
그냥 토마토 팔면서 앞에 &quot;찰&quot; 이라는 마법의 수식어를 붙여서 더 비싸게 팜&lt;/p&gt;
&lt;p&gt;뭐가 찰인데&lt;/p&gt;
&lt;p&gt;2는 hand made 를 뜻하는 수제
이것도 보통의 상품을 프리미엄 붙게 하는 마법의 단어.
수제 치킨도 봄&lt;/p&gt;
&lt;p&gt;납품 받아서 조립해놓고 수제xxx
당연히 손으로 조립하지&lt;/p&gt;
&lt;p&gt;3은 요새 당근 마켓 볼때 자주 나타나는 문장.
전혀 정중하지 않다.
닥치고 토달지마 처럼 보인다.
&quot;xxx 팝니다. 네고 문의는 정중히 거절합니다.&quot; eq &quot;xxx 팝니다. 닥치고 깍으려 들지마셈&quot;&lt;/p&gt;
&lt;p&gt;별거 없는데 뻥치는 거라던지.. 예의 있게 거절하는 척을 한달까..
뭔가 빡친다.&lt;/p&gt;
&lt;p&gt;완성형.&lt;/p&gt;
&lt;p&gt;직접 재배한 수제 찰 토마토 팝니다.
네고 문의는 정중히 거절합니다.&lt;/p&gt;
&lt;p&gt;죽여버린다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[소문난 순대국]]></title><description><![CDATA[…]]></description><link>https://aanoaa.github.io/famous-soondaeguk/</link><guid isPermaLink="false">https://aanoaa.github.io/famous-soondaeguk/</guid><pubDate>Fri, 17 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;전문 맛집 블로거로 거듭나기 위한 첫 포스팅.&lt;/p&gt;
&lt;p&gt;우리동네 &quot;소문난 순대국&quot; 이라는 가게인데 여기 엄청남.&lt;/p&gt;
&lt;p&gt;사장님 혼자서 재료 준비하시고 국밥 말아주시고 서빙도 하는데,
지나가면서 볼때마다 은근히 존경심이 들면서 게으른 내가 부끄러워짐.&lt;/p&gt;
&lt;p&gt;밤새 술 마시고 첫차 탔을때의 부끄러움이랄까.&lt;/p&gt;
&lt;p&gt;암튼 이수역에는 그 유명한 &quot;남성집&quot; 이 있는데 개인적으로 여기는 잘 안가고,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;소문난 순대국&lt;/li&gt;
&lt;li&gt;용산 순대국&lt;/li&gt;
&lt;li&gt;광주집&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;요렇게 다님.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://store.naver.com/restaurants/detail?id=1652606716&quot;&gt;https://store.naver.com/restaurants/detail?id=1652606716&lt;/a&gt; 네이버가 장소 서비스도 다 먹었네;
무시무시하고만&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Sign in with apple]]></title><description><![CDATA[apple 이 제 3자 서비스 인증을 활용하는 app 에 대해서, apple 로 로그인 기능을 넣으라고 협박하고 있습니다.
지가 뭔데 남의 서비스에 감 놔라 배 놔라 하는지 모르겠습니다. https://developer.apple.com/news…]]></description><link>https://aanoaa.github.io/signin-with-apple/</link><guid isPermaLink="false">https://aanoaa.github.io/signin-with-apple/</guid><pubDate>Sat, 14 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;apple 이 제 3자 서비스 인증을 활용하는 app 에 대해서, apple 로 로그인 기능을 넣으라고 협박하고 있습니다.
지가 뭔데 남의 서비스에 감 놔라 배 놔라 하는지 모르겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.apple.com/news/?id=09122019b&quot;&gt;https://developer.apple.com/news/?id=09122019b&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We’ve updated the App Store Review Guidelines to provide criteria for
when apps are required to use Sign in with Apple. Starting today, new
apps submitted to the App Store must follow these guidelines. Existing
apps and app updates must follow them by April 2020. We’ve also
provided new guidelines for using Sign in with Apple on the web and
other platforms.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.apple.com/app-store/review/guidelines/#sign-in-with-apple&quot;&gt;https://developer.apple.com/app-store/review/guidelines/#sign-in-with-apple&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Apps that use a third-party or social login service (such as Facebook
Login, Google Sign-In, Sign in with Twitter, Sign In with LinkedIn,
Login with Amazon, or WeChat Login) to set up or authenticate the
user’s primary account with the app must also offer Sign in with
Apple as an equivalent option. A user’s primary account is the
account they establish with your app for the purposes of identifying
themselves, signing in, and accessing your features and associated
services.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;함정&lt;/h1&gt;
&lt;p&gt;어케 맨질일이 있어서 경험해봤는데 함정이 곳곳에 있습니다.
일반적인 OAuth provider 가 아닙니다.&lt;/p&gt;
&lt;p&gt;함정은..&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;access_token 으로 사용자 profile 을 얻어올 수 있는 REST API 가 없고(..못찾겠고)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;callback 이 POST 로 오고&lt;/strong&gt; (..scope 지정하면)&lt;/li&gt;
&lt;li&gt;token 요청할때 &lt;code&gt;client_secret&lt;/code&gt; 을 제공받은 key 파일로 암호화 해서 생성해야하고,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사용자 프로필이 callback&lt;/strong&gt; 의 body 에 들어있는데,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이게 최초 한번만&lt;/strong&gt; 옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;홀리쉿&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/signin-with-apple-sequence-diagram.png&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
&lt;h2&gt;callback 이 POST (..scope 을 지정했을때)&lt;/h2&gt;
&lt;p&gt;일반적인 OAuth provider 는 사용자 인증후에 token 교환에 필요한 &lt;code&gt;code&lt;/code&gt; 와 위변조여부를 체크 하기 위한 &lt;code&gt;state&lt;/code&gt; 를 줍니다.
근데 apple 은 여기에 사용자 profile 을 최초 한번만 줍니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;state=0b24bxxxxx&amp;#x26;
code=xxxxxxxxxxx.0.nsww.XX2b-XXXXKqm2JYHb4Pyeg&amp;#x26;
user=%7B%22name%22%3A%7B%22firstName%22%3A%22xxxxx%22%2C%22middleName%22%3A%22%22%2C%22lastName%22%3A%22xxxx%22%7D%2C%22email%22%3A%2227xxxxkb%40privaterelay.appleid.com%22%7D
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런식인데 body 에 담아서 POST request 로 주는데 그 와중에 &lt;code&gt;user&lt;/code&gt; keyword 는 또 json string 입니다.
사용자가 최초로 인증한 이후에는 &lt;code&gt;user&lt;/code&gt; parameter 없이 옵니다.&lt;/p&gt;
&lt;p&gt;보통의 경우에는 &lt;code&gt;access_token&lt;/code&gt; 으로 사용자 profile 을 fetch 할 수 있는 REST API 를 제공하는데,
apple 은 그런 api 없습니다.(못찾음)&lt;/p&gt;
&lt;h2&gt;Create a signed jwt&lt;/h2&gt;
&lt;p&gt;appleid 에 OAuth application 설정할때에 &lt;code&gt;.p8&lt;/code&gt; key 파일을 줍니다.
이 key 파일로 &lt;a href=&quot;https://appleid.apple.com/auth/token&quot;&gt;https://appleid.apple.com/auth/token&lt;/a&gt; 에 전달할 jwt 를 sign 합니다.
이 jwt 가 &lt;code&gt;client_secret&lt;/code&gt; 입니다.&lt;/p&gt;
&lt;p&gt;expiration 때문에 생성해놓지 못하고 요청마다 생성해서 전달해야 합니다.&lt;/p&gt;
&lt;h1&gt;passport-apple&lt;/h1&gt;
&lt;p&gt;typescript 프로젝트에서 &lt;a href=&quot;http://www.passportjs.org/&quot;&gt;passport&lt;/a&gt; 를 사용했습니다.
&lt;a href=&quot;https://github.com/ananay/passport-apple&quot;&gt;https://github.com/ananay/passport-apple&lt;/a&gt; 이라는 훌륭한 오픈소스가 있지만 이걸로는 부족합니다.
scope 을 지원하지 않고, token 으로 profile 을 얻는 구조가 아니라서 hacky 하게 prototype 건들여가면서 고쳐써야 합니다.&lt;/p&gt;
&lt;p&gt;여력이 있다면 남들도 잘 쓸 수 있게 고쳐서 PR 하고 싶은데 능력과 여력이 안됩니다.&lt;/p&gt;
&lt;h1&gt;See Also&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sarunw.com/posts/sign-in-with-apple-1/&quot;&gt;https://sarunw.com/posts/sign-in-with-apple-1/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple&quot;&gt;https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://forums.developer.apple.com/thread/118209&quot;&gt;https://forums.developer.apple.com/thread/118209&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[better back]]></title><description><![CDATA[…]]></description><link>https://aanoaa.github.io/better-back/</link><guid isPermaLink="false">https://aanoaa.github.io/better-back/</guid><pubDate>Tue, 03 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;우리 주부님들~ 좋은 상품 하나 소개~ 는 구라고&lt;/p&gt;
&lt;p&gt;오래 전에 허리가 한번 넘 아파서 자세를 올바르게 하기 위해 노력하면서 이것 저것 좀 써봤다.&lt;/p&gt;
&lt;p&gt;개인적인 소감임&lt;/p&gt;
&lt;p&gt;요즘 좀 보이는 &apos;ㄴ&apos; 처럼 생긴 방석? 이건 별 건 없는데 인식 해주는 효과는 있는 것 같다.
저 방석이 내 자세를 바르게 해주진 않고 &quot;아 내가 바르게 앉으려고 이 방석 깐거지&quot; 해서 스스로 허리 펴야 효과가 있능&lt;/p&gt;
&lt;p&gt;담엔 니스툴이라고 무릎의자. 이건 비싸서 아 역시 좋아 하는데, 좀 쓰다보면 니스툴에 앉아서 구부정하게 앉아 있는 나를 발견.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://getbetterback.com/&quot;&gt;https://getbetterback.com/&lt;/a&gt; 이건 초 강력. 허리 좀 구부리고 싶어도 베러백이 구부리는 걸 허락해 주지 않음.&lt;/p&gt;
&lt;p&gt;장착하면 어디 아픈 사람이 쓰는 장치 같긴한데 초 강력.&lt;/p&gt;
&lt;p&gt;허리 못 구부리게 하는 고문도구임.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[degoogle]]></title><description><![CDATA[얼마 전에 팬티 사려고 팬티를 검색한 적이 있는데 google 및 온갖 SNS…]]></description><link>https://aanoaa.github.io/degoogle/</link><guid isPermaLink="false">https://aanoaa.github.io/degoogle/</guid><pubDate>Mon, 02 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;얼마 전에 팬티 사려고 팬티를 검색한 적이 있는데 google 및 온갖 SNS 에서 팬티 광고가 나오는 것이었다.
물론 내가 알지도 못하는 사이에 동의 했겠지만 지들끼리 내 검색 결과를 팔아먹는다는게 끔찍하게 느껴졌다.&lt;/p&gt;
&lt;p&gt;내가 뭘 검색했는지 아는 거자나; 다행히도 나만 이런 생각을 하는 건 아닌 듯&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tycrek/degoogle&quot;&gt;https://github.com/tycrek/degoogle&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&apos;t have anything to hide, but I don&apos;t have anything to show you either.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이런 연유로 구글 대신에 &lt;a href=&quot;https://duckduckgo.com/&quot;&gt;duckduckgo.com&lt;/a&gt; 을 쓰고 있는데 좋다.
검색 결과가 구글 만큼이나 훌륭하게 나오는 것 같다.
더 많은 결과를 보고 싶을 때만 구글 드가서 검색하는데 그럴 일이 별로 없다.&lt;/p&gt;
&lt;p&gt;firefox 랑 duckduckgo 쓴다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/screenshot.png&quot; alt=&quot;duckduckgo on firefox&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[pyenv, virtualenv]]></title><description><![CDATA[요새 업무때문에 python 을 만집니다.
사용하는 솔루션의 공식 sdk 가 python 2.7 을 사용해서 그걸 사용해야 합니다. rbenv 나 plenv 처럼 pyenv 있으니 그걸 쓰면 되겠지 싶었는데.. venv pyvenv pyenv…]]></description><link>https://aanoaa.github.io/pyenv-virtualenv/</link><guid isPermaLink="false">https://aanoaa.github.io/pyenv-virtualenv/</guid><pubDate>Tue, 25 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;요새 업무때문에 python 을 만집니다.
사용하는 솔루션의 공식 sdk 가 python 2.7 을 사용해서 그걸 사용해야 합니다.&lt;/p&gt;
&lt;p&gt;rbenv 나 plenv 처럼 pyenv 있으니 그걸 쓰면 되겠지 싶었는데..&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;venv&lt;/li&gt;
&lt;li&gt;pyvenv&lt;/li&gt;
&lt;li&gt;pyenv&lt;/li&gt;
&lt;li&gt;virtualenv&lt;/li&gt;
&lt;li&gt;virtualenvwrapper&lt;/li&gt;
&lt;li&gt;pipenv&lt;/li&gt;
&lt;li&gt;etc..&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;홀리쉿&lt;/p&gt;
&lt;p&gt;지나가는 얘기로 섞어써야 한다는 얘기를 들었던 기억이 있습니다.
오늘에야 왜 섞어쓰는지 알았습니다.&lt;/p&gt;
&lt;p&gt;system python 을 더럽히기 싫다면 &lt;a href=&quot;https://github.com/pyenv/pyenv&quot;&gt;pyenv&lt;/a&gt; 를 설치합니다.
여기에 2.x, 3.x 버전을 설치합니다.&lt;/p&gt;
&lt;p&gt;각 버전에서 pip 로 &lt;a href=&quot;https://virtualenv.pypa.io/en/stable/&quot;&gt;virtualenv&lt;/a&gt; 를 설치할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pyenv global 3.7.1
$ pip install virtualenv

$ pyenv global 2.7.15
$ pip install virtualenv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여튼 이렇게 각 버전별로 virtualenv 를 설치하고 난 이후에는 이제 프로젝트 디렉토리에 들어가서 사용할 python 버전을 고른뒤에,
virtualenv 를 사용해서 프로젝트별 독립된 환경을 만듭니다.
rbenv, plenv 에는 없는 기능을 virtualenv 가 하는 것 입니다.
사용자가 버전별 python 을 설치하고 pip 를 사용해서 모듈을 설치하면 그때에는 해당 버전의 python 의 global 영역에 모듈이 install 되는데,
virtualenv 를 사용하면 nodejs 의 node_modules 처럼 프로젝트 단위로 module 이 install 되는 공간을 격리 시킬 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd /path/to/project
$ pyenv local 3.7.1    # 원하는 python version 을 고른다
$ virtualenv venv
$ source venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;편리한 점은 명령어로 의존성 모듈을 관리할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pip freeze &gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;perl 로 따지면.. 요런식이랄까..&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cpanm -L extlib Foo    # install Foo and all non-core deps into extlib

# a.pl
# use lib &apos;extlib&apos;;
# use Foo;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;시스템 영역이 아닌 사용자의 버전별 python 을 설치할때에는 pyenv.
프로젝트 단위로 의존성 모듈을 격리시켜서 사용하고자 할때에는 virtualenv 를 활용.&lt;/p&gt;
&lt;p&gt;아래 포스트에 virtualenv 사용법이 잘 나와 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dgkim5360.tistory.com/entry/python-virtualenv-on-linux-ubuntu-and-windows&quot;&gt;https://dgkim5360.tistory.com/entry/python-virtualenv-on-linux-ubuntu-and-windows&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[강북구 수유동 수도시락]]></title><description><![CDATA[…]]></description><link>https://aanoaa.github.io/2017-11-14-gangbuggu-suyudong-sudosirag/</link><guid isPermaLink="false">https://aanoaa.github.io/2017-11-14-gangbuggu-suyudong-sudosirag/</guid><pubDate>Tue, 14 Nov 2017 04:13:21 GMT</pubDate><content:encoded>&lt;p&gt;친한 친구가 강북구 수유동에 배달 전문 도시락가게를 열었습니다.
상호명은 &lt;strong&gt;수도시락&lt;/strong&gt; 입니다.&lt;/p&gt;
&lt;p&gt;혼자서 운영하다보니 매장에서 판매하는 것은 여력이 안되고,
배달의 민족, 요기요 등의 음식 주문 서비스를 통해 주문을 받아서 음식을 만들고 배달대행
서비스를 이용해서 배달합니다.&lt;/p&gt;
&lt;p&gt;배달료와 수수료 때문에 12,000 이상 주문해야 한다고 합니다.&lt;/p&gt;
&lt;p&gt;12,000원 주문이 들어오면,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;배달료 &lt;code&gt;3,000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;수수료 15%?(잘 모르겠음) - &lt;code&gt;1,800&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;재료 원가(요리마다 다름) - &lt;code&gt;3,000 ~ 4,000&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;하나 팔면 3-4천원 남습니다.
이걸로 남겨서 월세도 내야 하니까 우와 이건 너무 힘든 일입니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/soodosirak-menu.jpg&quot; alt=&quot;수도시락-메뉴&quot;&gt;&lt;/p&gt;
&lt;p&gt;왜 사진이 가로로 나오지..&lt;/p&gt;
&lt;p&gt;도시락류를 먹어봤는데 메인메뉴 + 5가지 반찬에 국도 줍니다.
맛집 블로거가 아니라 평가가 서툴지만 맛있게 먹었습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;음식 주문 서비스는 사용자는 편리하지만 부담은 가게가 가져가게 되는 것 같습니다.
주문 서비스 상위에 노출되는게 유리할테니 &lt;code&gt;요기요플러스&lt;/code&gt;, &lt;code&gt;네이버 파워링크&lt;/code&gt; 이런 것 들을
어쩔 수 없이 사용해야 되는 것도 별로입니다.
저런 것들은 당연히 돈받고 상위에 노출시켜주겠죠.&lt;/p&gt;
&lt;p&gt;요식업을 하는 자영업자들이 많을테니 오픈소스로 음식 주문 서비스 플랫폼을 만들어서 투명하게
운영해보면 어떨까 하는 생각도 해보았습니다.
전화주문이 아닌 모바일 주문이 중요하다고 생각이 들어서,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;상호를 등록하고 메뉴를 편집할 수 있게 합니다.&lt;/li&gt;
&lt;li&gt;상호명 혹은 전화번호로 검색가능하게 하고&lt;/li&gt;
&lt;li&gt;등록된 메뉴중에 골라서 주문가능&lt;/li&gt;
&lt;li&gt;업주에게 알람을 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;음식별 카탈로그를 제공하지 않고 검색창 하나만 있는 화면이 되겠습니다.(오! 심플)&lt;/p&gt;
&lt;p&gt;수수료 안떼이고 모바일 주문이 되니까 널리 사용된다면 좋을 것 같기도 합니다.&lt;/p&gt;
&lt;p&gt;1차 주문은 메이저 주문서비스를 이용하고, 2차 주문부터는 대신 사용될 수 도 있을 것
같습니다.&lt;/p&gt;
&lt;p&gt;흠 뭔가 도전해보고 싶어집니다.&lt;/p&gt;
&lt;p&gt;작게 시작해서 꾸준하게 하면 좋을 것 같지만 여력이 없고 혼자서는 감당 못할 것 같습니다.&lt;/p&gt;
&lt;p&gt;수도시락 많이 사랑해주세요. &lt;code&gt;&apos;-&apos;]/ ♥&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/soodosirak-postit.jpg&quot; alt=&quot;수도시락-포스트잇&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[AnyEvent 를 다시 보는 중]]></title><description><![CDATA[꽤 오래전부터 #perl-kr@freenode 채널에 hongbot(제가 운영하는 irc 봇)이 들어오지
않았습니다. heroku 에서 Deprecated 된 Cedar-10 Stack…]]></description><link>https://aanoaa.github.io/2017-05-14-anyevent-reul-dasi-boneun-jung/</link><guid isPermaLink="false">https://aanoaa.github.io/2017-05-14-anyevent-reul-dasi-boneun-jung/</guid><pubDate>Sat, 13 May 2017 19:57:19 GMT</pubDate><content:encoded>&lt;p&gt;꽤 오래전부터 &lt;code&gt;#perl-kr@freenode&lt;/code&gt; 채널에 hongbot(제가 운영하는 irc 봇)이 들어오지
않았습니다.&lt;/p&gt;
&lt;p&gt;heroku 에서 Deprecated 된 Cedar-10 Stack? 을 사용했던게 문제였던 것 같습니다.
여차저차 문서보고 Cedar-16? 으로 마이그레이숀 했습니다.&lt;/p&gt;
&lt;p&gt;아무튼 맨날 열린옷장 웹서비스만 하다가 오래간만에 irc bot 을 디버깅 하니까 재미가
있었습니다.&lt;/p&gt;
&lt;p&gt;헌데, 모듈 의존성이 너무 많고 테스트가 어려운게 거슬려서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;의존성도 확 줄이고&lt;/li&gt;
&lt;li&gt;테스트코드를 추가(강화?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;해서 lightweight hongbot 으로 운영하고 싶어졌습니다.
요즘 들여다보면서 고치고 있습니다.&lt;/p&gt;
&lt;p&gt;머릿속에서 AnyEvent 가 싹 잊혀져서, 문서를 다시 처음부터 보고 있습니다.(조따 괴로운
일입니다.)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;아무튼 오늘은 4시간 동안 삽질했습니다.&lt;/p&gt;
&lt;p&gt;뭐냐면, heroku 에서 idle 상태에 빠지지 않기 위해서 스스로 ping/pong 하는 기능의 테스트
코드를 작성하던 중에 제대로 동작하지 않아서 괴로웠습니다.&lt;/p&gt;
&lt;p&gt;AnyEvent::HTTPD 에 등록된 콜백을 AnyEvent main loop 안에서 Blocking 연결로 요청하면
동작하지 아니합니다.&lt;/p&gt;
&lt;p&gt;아래는 1초 뒤에 &lt;code&gt;GET http://localhost:5000/ping&lt;/code&gt; 을 요청하는 간단한 코드입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;use utf8;
use strict;
use warnings;

use AnyEvent;
use AnyEvent::HTTPD;
use HTTP::Tiny;

my $httpd = AnyEvent::HTTPD-&gt;new( host =&gt; &apos;0.0.0.0&apos;, port =&gt; 5000 );
$httpd-&gt;reg_cb(
    &apos;/ping&apos; =&gt; sub {
        my ( $httpd, $req ) = @_;
        $req-&gt;respond( { content =&gt; [ &apos;text/plain&apos;, &quot;pong&quot; ] } );
    }
);

my $wait = AnyEvent-&gt;condvar;
my $t    = AnyEvent-&gt;timer(
    after =&gt; 1,   # 1sec
    cb    =&gt; sub {
        my $http = HTTP::Tiny-&gt;new( timeout =&gt; 1 );
        my $url = &apos;http://localhost:5000/ping&apos;;
        print &quot;GET $url\n&quot;;

        my $res = $http-&gt;get($url); # &amp;#x3C;- 여기서 멈춤
        print &quot;$res-&gt;{status}: $res-&gt;{reason}\n&quot;;

        ## my $res = $http-&gt;get(&apos;https://www.google.com&apos;); # 이거는 됨
        ##
        ## or
        ##
        ## AnyEvent::HTTP::ScopedClient-&gt;new($url)-&gt;get(
        ##     sub {
        ##         my ( $body, $hdr ) = @_;
        ##         print &quot;$body\n&quot;; # pong
        ##         $wait-&gt;send;
        ##     }
        ## );

        $wait-&gt;send;
    }
);

$wait-&gt;recv;
print &quot;done\n&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;비동기 요청을 하도록 바꾸거나,&lt;/li&gt;
&lt;li&gt;AnyEvent::HTTPD 의 문제를 해결해야겠지요.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;뭐가 문제인지 들여다보고 싶은 맘은 없습니다.
쉬운 1번 으로 해결할 것 같습니다.&lt;/p&gt;
&lt;h2&gt;See also&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://metacpan.org/pod/AnyEvent&quot;&gt;AnyEvent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Git 데이터 복구]]></title><description><![CDATA[오늘 실수로 고객의 한달간의 데이터를 잃어버렸습니다. 고객의 데이터를 git 으로 관리하는 프로젝트가 있는데,
지난 한달간의 unstaging…]]></description><link>https://aanoaa.github.io/2017-05-12-git-deiteo-boggu/</link><guid isPermaLink="false">https://aanoaa.github.io/2017-05-12-git-deiteo-boggu/</guid><pubDate>Fri, 12 May 2017 10:12:13 GMT</pubDate><content:encoded>&lt;p&gt;오늘 실수로 고객의 한달간의 데이터를 잃어버렸습니다.&lt;/p&gt;
&lt;p&gt;고객의 데이터를 git 으로 관리하는 프로젝트가 있는데,
지난 한달간의 unstaging 되어 있는 고객의 데이터를&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git add .
$ git commit -m &apos;sync&apos;
$ git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런식으로 저장했습니다.
이후에 우리 말썽꾸러기가 이상하게 작업해놓은 이력을 발견하고 업무 쓰로잉 욕구가 생겨서,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 아 짱나넴 걍 원래대로 해놓고 알아서 하라고 해야겠다.
$ git reset --hard HEAD^
$ git push
$ git push -f origin &amp;#x3C;current-branch&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;를 했습니다.
이때에 방금 커밋한 이력을 날렸습니다.&lt;/p&gt;
&lt;p&gt;순간, &lt;strong&gt;아아아아 받은 돈 토해내고 마포대교 가야겠다&lt;/strong&gt; 라는 생각이 들었습니다.&lt;/p&gt;
&lt;p&gt;하지만 곧 pointer 만 잃고 objects 는 그대로 있을 것 같아서 검색했습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://stackoverflow.com/questions/5788037/recover-from-git-reset-hard&quot;&gt;http://stackoverflow.com/questions/5788037/recover-from-git-reset-hard&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git reflog show
d5d92ec HEAD@{0}: reset: moving to HEAD^
3adf160 HEAD@{1}: commit: sync
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런 이력이 있어서,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git show 3adf160
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;으로 커밋내용이랑 시간을 확인하고,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git reset --hard 3adf160
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;해서 복구 했습니다.
뒤지는 줄 알았습니다.&lt;/p&gt;
&lt;p&gt;웃겼던 것은 저 위에 스택오버플로 코멘트였습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This trick saved my life a couple of times.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;saved me just now! :D&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You saved me. Thanks a ton.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;saved me too - perfect&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;See also&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/book/ko/v1/Git%EC%9D%98-%EB%82%B4%EB%B6%80-%EC%9A%B4%EC%98%81-%EB%B0%8F-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%B5%EA%B5%AC&quot;&gt;Git의 내부 - 운영 및 데이터 복구&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Firefox CSP problem at github]]></title><description><![CDATA[제가 쓰는 브라우저는 firefox 이고
주업무의 이슈트래킹은 github 에서 하고 있습니다.
거의 모든 편집은 emacs 에서 하고요.(지금도 emacs 에서 편집하고 있습니다.) 셋중 하나만 안되도 뭘 못합니다. 작년인가부터 Debian…]]></description><link>https://aanoaa.github.io/2017-05-09-firefox-csp-problem-at-github/</link><guid isPermaLink="false">https://aanoaa.github.io/2017-05-09-firefox-csp-problem-at-github/</guid><pubDate>Tue, 09 May 2017 02:20:30 GMT</pubDate><content:encoded>&lt;p&gt;제가 쓰는 브라우저는 &lt;a href=&quot;https://www.mozilla.org/ko/firefox/new/&quot;&gt;firefox&lt;/a&gt; 이고
주업무의 이슈트래킹은 &lt;a href=&quot;https://github.com&quot;&gt;github&lt;/a&gt; 에서 하고 있습니다.
거의 모든 편집은 emacs 에서 하고요.(지금도 emacs 에서 편집하고 있습니다.)&lt;/p&gt;
&lt;p&gt;셋중 하나만 안되도 뭘 못합니다.&lt;/p&gt;
&lt;p&gt;작년인가부터 Debian 에서 iceweasel 대신에 firefox 를 지원해주기 시작해서 데비안 패키지
firefox 를 사용하고 있습니다.(&lt;code&gt;firefox ESR 45.9.0&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;그런데 오늘(2017-05-09 투표날) github project 도 안보이고 assignee 도 지정할 수 없고
comment 에 사진도 업로드가 아니되는 것 입니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/firefox-csp-at-github.png&quot; alt=&quot;firefox-csp-at-github&quot;&gt;&lt;/p&gt;
&lt;p&gt;크롬이나 다른 브라우저 쓰면 되긴 하지만, 여러 플러그인 설정과&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/vimfx/&quot;&gt;vimfx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/markdown-here/&quot;&gt;markdown-here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;send to kindle&lt;/li&gt;
&lt;li&gt;uBlock&lt;/li&gt;
&lt;li&gt;awesome screenshot&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;북마크등을 옮기려고 생각하면 아찔합니다.&lt;/p&gt;
&lt;p&gt;괴롭다..&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Tekken premier league 2017]]></title><description><![CDATA[철권은 조빱이지만 철권 방송은 재밌게 보고 있습니다. 오랜만에 철권대회 입니다. 1등 상금이 60만원? 입니다. 나중에 1,000만원으로 오른다고 하는데 비인기 종목은 e스포츠에서도 서러운 것 같습니다. 오랜만의 철권대회라서 반갑긴한데 해설이 hols…]]></description><link>https://aanoaa.github.io/2017-04-28-tekken-premier-league-2017/</link><guid isPermaLink="false">https://aanoaa.github.io/2017-04-28-tekken-premier-league-2017/</guid><pubDate>Thu, 27 Apr 2017 15:42:49 GMT</pubDate><content:encoded>&lt;p&gt;
        &lt;div class=&quot;embedVideo-container&quot;&gt;
            &lt;iframe
              width=&quot;800&quot;
              height=&quot;452&quot;
              src=&quot;https://www.youtube.com/embed/MIPBW8BbknI?rel=0&quot;
              class=&quot;embedVideo-iframe&quot;
              style=&quot;border:0&quot;
              allowfullscreen
            &gt;&lt;/iframe&gt;
        &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;철권은 조빱이지만 철권 방송은 재밌게 보고 있습니다.&lt;/p&gt;
&lt;p&gt;오랜만에 철권대회 입니다.&lt;/p&gt;
&lt;p&gt;1등 상금이 60만원? 입니다.&lt;/p&gt;
&lt;p&gt;나중에 1,000만원으로 오른다고 하는데 비인기 종목은 e스포츠에서도 서러운 것 같습니다.&lt;/p&gt;
&lt;p&gt;오랜만의 철권대회라서 반갑긴한데 해설이 hols(나겜사장) 입니다.
철권의 ㅊ도 모르는 사람이 해설해서 많이 별로 입니다.&lt;/p&gt;
&lt;p&gt;무릎 출전 안했으니까 지난번 오락실 매치처럼 인드라+무릎 시키면 좋을 것 같은데 역시
게임방송도 돈이 문제인 것 같습니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[수영 2km]]></title><description><![CDATA[…]]></description><link>https://aanoaa.github.io/2017-04-27-suyeong-2km/</link><guid isPermaLink="false">https://aanoaa.github.io/2017-04-27-suyeong-2km/</guid><pubDate>Thu, 27 Apr 2017 14:57:48 GMT</pubDate><content:encoded>&lt;p&gt;간만에 블로그 쓴다고 늦게 자서 늦게 인나고 늦게 출근했습니다.
도착하니 점심시간이었습니다.&lt;/p&gt;
&lt;p&gt;보통은 민들레에서 백반 먹는데, 어제 중길씨가 국밥 좋아한다고 해서 둘이 고흥순대국 다녀왔습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/mindle-coupon.jpg&quot; alt=&quot;민들레쿠폰&quot;&gt;&lt;/p&gt;
&lt;p&gt;민들레는 제가 가장 좋아하는 식당입니다.&lt;/p&gt;
&lt;p&gt;밥먹고 일했습니다. 요새는 딴짓도 잘 안하고 일만하는 것 같습니다.
하루종일 컴피터 앞에 앉아 있는데 하루종일 바쁜 것 같습니다. 담배도 안피니까 화장실 가는거
말고는 계속 컴피터 합니다.&lt;/p&gt;
&lt;p&gt;집중을 오래하다보면 무기력해지곤 합니다. 딴짓을 섞어줘야 하는데 얹혀지내기 시작한 이후로는
벽을 바라보고 앉기 때문에 남들이 제 모니터를 볼까봐 딴짓을 못합니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/github-frame.jpg&quot; alt=&quot;github액자&quot;&gt;&lt;/p&gt;
&lt;p&gt;열린옷장의 대여비를 %로 할인해주는 쿠폰시스템을 만드는 중 입니다.
한벌대여쿠폰, 10,000원 쿠폰 이런게 있었는데 이번에 요구가 있어서 합니다.
점점 복잡해져서 걱정입니다. &quot;%할인 못한다&quot; 라고 하고 시스템을 되도록 단순하게 유지하고
싶은데 결정은 제가 하는게 아닙니다.&lt;/p&gt;
&lt;p&gt;하다가 피곤해져서 농땡이 좀 부리다가 수영장 갔습니다. 화장실에 휴지가 없었는데 모르는
사람의 도움으로 위기를 벗어났습니다.&lt;/p&gt;
&lt;p&gt;4월의 마지막주 목요일이라서 자유수영하는 날 입니다.
이런 날은 아름사마(에이스)가 프로그램을 계획해서 옵니다.&lt;/p&gt;
&lt;p&gt;요새 몸이 안좋은지 탕에서 나오거나 체조할때 어질어질합니다.
쉬엄쉬엄 하고 싶은데 같이 수영하시는 분들이 그렇게 못하게 합니다.(앞에 서라고 부추김)&lt;/p&gt;
&lt;p&gt;오늘은 2km 수영했습니다.&lt;/p&gt;
&lt;p&gt;끝&lt;/p&gt;</content:encoded></item><item><title><![CDATA[요즘 하는 일]]></title><description><![CDATA[…]]></description><link>https://aanoaa.github.io/2017-04-26-yojeum-haneun-il/</link><guid isPermaLink="false">https://aanoaa.github.io/2017-04-26-yojeum-haneun-il/</guid><pubDate>Wed, 26 Apr 2017 14:37:35 GMT</pubDate><content:encoded>&lt;p&gt;요즘이랄까 제작년부터 거의 &lt;a href=&quot;https://www.theopencloset.net/&quot;&gt;열린옷장&lt;/a&gt;의 서비스를 만들고
있습니다.&lt;/p&gt;
&lt;p&gt;어떤거냐면,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://visit.theopencloset.net/visit&quot;&gt;방문예약 서비스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://staff.theopencloset.net/&quot;&gt;재고관리 서비스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://donation.theopencloset.net/&quot;&gt;의류 기증 신청 및 관리 서비스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://volunteer.theopencloset.net/&quot;&gt;봉사활동 신청 및 관리 서비스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://monitor.theopencloset.net/&quot;&gt;대기자 현황 서비스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://share.theopencloset.net/&quot;&gt;온라인 대여 서비스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;등을 만들고 있습니다.&lt;/p&gt;
&lt;p&gt;제가 하는 작업의
이력은
&lt;a href=&quot;https://github.com/opencloset/opencloset/issues?q=assignee%3Aaanoaa+is%3Aopen&quot;&gt;opencloset/opencloset assignee:aanoaa is:open&lt;/a&gt; 에서
볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/assignee-aanoaa.png&quot; alt=&quot;assignee-aanoaa&quot;&gt;&lt;/p&gt;
&lt;p&gt;열린옷장 직원은 아닙니다. 열린옷장 옆사무실에 SILEX 라는 소프트웨어 회사 댕기고
있는데(이번에 건물에서 쫓겨나서 옆사무실 아님) 초창기에 열린옷장 재고관리 라는 작은
프로젝트를 계기로 일하게 되었는데 어쩌다보니 이것만 하고 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;SILEX 에는 yongbin, keedi, aanoaa(나) 세명인데, 얼마전 건물에서 쫓겨나서 망한느낌이 물씬
납니다. 한명은 집에서 애보고 한명은 알바하고 저는 그냥 하던거 계속 하고 있습니다. 저는
열린옷장에 책상 한자리 부탁해서 얹혀 살고 있습니다.&lt;/p&gt;
&lt;p&gt;모두들 고생하고 있는데 잘되면 좋겠습니다.&lt;/p&gt;
&lt;p&gt;끗&lt;/p&gt;</content:encoded></item><item><title><![CDATA[인상적인 블로그]]></title><description><![CDATA[요즘 재미있게 보는 블로그가 있습니다. 조광사진관 일기장 별거 없는 얘기인데 좋습니다.
저도 비슷한 컨셉으로 적당적당 있었던 일들이나 생각을 올려볼까 합니다.
귀찮아져서 금방 안하게 되겠지만..]]></description><link>https://aanoaa.github.io/2017-04-26-insangjeogin-beulrogeu/</link><guid isPermaLink="false">https://aanoaa.github.io/2017-04-26-insangjeogin-beulrogeu/</guid><pubDate>Wed, 26 Apr 2017 14:17:44 GMT</pubDate><content:encoded>&lt;p&gt;요즘 재미있게 보는 블로그가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.naver.com/ccgoodjob&quot;&gt;조광사진관 일기장&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;별거 없는 얘기인데 좋습니다.
저도 비슷한 컨셉으로 적당적당 있었던 일들이나 생각을 올려볼까 합니다.
귀찮아져서 금방 안하게 되겠지만..&lt;/p&gt;</content:encoded></item><item><title><![CDATA[한글이 되는가]]></title><description><![CDATA[octopress 에서는 한글 tags 와 한글제목을 지원하는가 궁금했습니다. 이렇게 됩니다.]]></description><link>https://aanoaa.github.io/2017-04-26-hangeuli-doeneunga/</link><guid isPermaLink="false">https://aanoaa.github.io/2017-04-26-hangeuli-doeneunga/</guid><pubDate>Wed, 26 Apr 2017 13:46:10 GMT</pubDate><content:encoded>&lt;p&gt;octopress 에서는 한글 tags 와 한글제목을 지원하는가 궁금했습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ bundle exec rake new_post[&apos;한글이 되는가&apos;]
mkdir -p source/_posts
Creating new post: source/_posts/2017-04-26-hangeuli-doeneunga.markdown
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게 됩니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[yongbin-mode]]></title><description><![CDATA[외래어의 한글표기 보통 외래서를 한글로 적을때, e 는 ㅔ 로, a 또는 ae 는 ㅐ 로
적습니다. 그런데 @yongbin님은 바꿔씁니다.
helper 를 한글로 적으면 보통은 헬퍼이지만 @yongbin…]]></description><link>https://aanoaa.github.io/2016-06-08-yongbin-mode/</link><guid isPermaLink="false">https://aanoaa.github.io/2016-06-08-yongbin-mode/</guid><pubDate>Tue, 07 Jun 2016 15:22:00 GMT</pubDate><content:encoded>&lt;h2&gt;외래어의 한글표기&lt;/h2&gt;
&lt;p&gt;보통 외래서를 한글로 적을때, &lt;code&gt;e&lt;/code&gt; 는 &lt;code&gt;ㅔ&lt;/code&gt; 로, &lt;code&gt;a&lt;/code&gt; 또는 &lt;code&gt;ae&lt;/code&gt; 는 &lt;code&gt;ㅐ&lt;/code&gt; 로
적습니다.&lt;/p&gt;
&lt;p&gt;그런데 &lt;a href=&quot;https://twitter.com/yongbin&quot;&gt;@yongbin&lt;/a&gt;님은 바꿔씁니다.
&lt;code&gt;helper&lt;/code&gt; 를 한글로 적으면 보통은 &lt;code&gt;헬퍼&lt;/code&gt;이지만 @yongbin 님은 &lt;code&gt;핼퍼&lt;/code&gt;
입니다. 오래된 이야기입니다.&lt;/p&gt;
&lt;p&gt;디랙토리, 핼퍼, 렌덤 등등..&lt;/p&gt;
&lt;p&gt;&lt;code&gt;생일&lt;/code&gt;도 &lt;code&gt;셍일&lt;/code&gt;로 적고, &lt;code&gt;요새&lt;/code&gt;도 &lt;code&gt;요세&lt;/code&gt; 적는걸 보면, 외래어만 그런 것 같진 않습니다.&lt;/p&gt;
&lt;h2&gt;*-mode&lt;/h2&gt;
&lt;p&gt;제 작은소원은 조국의 통일도 편경장의 팔모가지도 아닙니다.
제가 필요한 emacs의 mode 를 만드는 것입니다.
elisp 관련 책도 읽다가 포기한 적도 많습니다.&lt;/p&gt;
&lt;p&gt;그런데 몇일 전
&lt;a href=&quot;https://github.com/opencloset/monitor/issues/94#issuecomment-223536395&quot;&gt;github-comment&lt;/a&gt; 에서&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;핼퍼에 구현된 코드중에&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;라는 코멘트가 결정적인 계기가 되어서 &lt;code&gt;yongbin-mode&lt;/code&gt; 를 만들어보자 라고
결심하게 되었습니다.&lt;/p&gt;
&lt;h3&gt;yongbin-mode&lt;/h3&gt;
&lt;p&gt;아이디어는 이랬습니다.&lt;/p&gt;
&lt;p&gt;emacs 내에서 &lt;code&gt;ㅔ&lt;/code&gt; 를 누르면 &lt;code&gt;ㅐ&lt;/code&gt; 가 입력되고 &lt;code&gt;ㅐ&lt;/code&gt;를 누르면 &lt;code&gt;ㅔ&lt;/code&gt;가
입력되도록 하자.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pre-command-hook&lt;/code&gt; 에서 스슥 하면 될 것 같았는데, multibyte 입력은
이벤트가 발생되지 않았습니다.&lt;/p&gt;
&lt;p&gt;(아직도 왜 그런지 모르겠고, 어디서 무얼 찾아야 하는지도
모르겠습니다. elisp 도사님 찾아가서 제자 하고 싶음)&lt;/p&gt;
&lt;p&gt;여튼 꼼수를 써서 익숙한 perl 로 프로그램을 만들고 emacs 에서는 호출만
하자 싶었습니다.&lt;/p&gt;
&lt;p&gt;해서 &lt;code&gt;yb&lt;/code&gt; 라는 perl 스크립트를 만들어서 &lt;code&gt;ㅐ&lt;/code&gt;와 &lt;code&gt;ㅔ&lt;/code&gt; 를 바꾸도록
하였습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ echo &quot;안녕하세요&quot; | yb
안녕하새요
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 &lt;code&gt;yongbin-mode&lt;/code&gt; 라는 minor mode 를 만들어서 채팅할때 알아서
변환되게 하고 싶었습니다.(저는 irc 채팅을 emacs 에서 합니다)&lt;/p&gt;
&lt;p&gt;아무것도 몰라서(지금도 모름) 구글링하고 문서읽고 다른 코드들을 참고하면서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yongbin-mode : 마이너 모드(yongbin-mode)를 켜고끈다&lt;/li&gt;
&lt;li&gt;yongbinize-buffer : 현재버퍼의 텍스트를 용빈화시킨다&lt;/li&gt;
&lt;li&gt;yongbinize-region(start, end) : 영역의 텍스트를 용빈화시킨다&lt;/li&gt;
&lt;li&gt;yongbinize-line : 현재 라인을 용빈화 시킨다&lt;/li&gt;
&lt;li&gt;erc-yongbinize : irc 의 입력을 용빈화 시킨다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;기능을 맨들었습니다.&lt;/p&gt;
&lt;p&gt;그걸 여차저차 해서 irc 에서&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;aanoaa&gt; &apos;-&apos;]/ 안녕하세요&amp;#x3C;RET&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;하면,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;aanoaa&gt; &apos;-&apos;]/ 안녕하새요
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;로 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/aanoaa/yongbin-mode&quot;&gt;https://github.com/aanoaa/yongbin-mode&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;느낀점&lt;/h2&gt;
&lt;p&gt;개발환경이 넘 구립니다. 코드 변경하고 &lt;code&gt;M-x eval-buffer&lt;/code&gt; 해서 다시 컴파일
하고 어디어디 찾아가서 &lt;code&gt;C-x C-e&lt;/code&gt; 해서 한줄만 실행하고 등등..&lt;/p&gt;
&lt;p&gt;뭘 모르는데 뭘 어떻게 해야할지가 젤 어렵고,
또 어떻게 디버깅 해야 할지가 어렵습니다.
괄호가 넘 많고 &lt;code&gt;if else&lt;/code&gt; 문에 대한 문서를 봐도 어케 쓰는지 모르겠능;;
한글처리에 관한 문서는??&lt;/p&gt;
&lt;p&gt;등등 어려움이 넘 많습니다.&lt;/p&gt;
&lt;p&gt;하지만 context 가 오묘하달까?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(with-current-buffer yongbinize-buffer-name
  (goto-char (point-min))
  (setq yongbinized-text (...)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런거?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;point-min&lt;/code&gt; 이라는걸 buffer 마다 가지고 있는 모양인데, 그게 context 에 따라
선택된다는게 참 신통방통&lt;/p&gt;
&lt;p&gt;perl 뉴비 시절에 perl-kr 커뮤니티에서 도움을 많이 받았던게 넘 좋았는데,
elisp 는 한국사용자 커뮤니티가 없는 것 같습니다(?)
한글문서도 오래되었거나 거의 없는 것 같고..
closure 는 있는데 이건 elisp 가 아니고..&lt;/p&gt;
&lt;p&gt;elisp 에 관심있는 emacs 사용자들에게서 뭔가 도움을 구해보고 싶습니다.
관련된 커뮤니티를 알고 계시면 알려주세요.&lt;/p&gt;
&lt;h2&gt;레알 결론&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ㅔ&lt;/code&gt; 와 &lt;code&gt;ㅐ&lt;/code&gt; 가 바뀐게 보이면 너무 꼴보기 싫었습니다.
이제 몇주동안 저도 똑같이 바꿔쓰면서 고통을 주도록 하겠습니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[redis path and db number]]></title><description><![CDATA[redis://localhost:6397/1 흔한 redis-url 입니다.
/1 의 역할은 뭘까요? 뭐냐면 Database number 입니다. /1 없이 연결하면 기본으로 0 번 database…]]></description><link>https://aanoaa.github.io/2015-07-15-redis-path-and-db-number/</link><guid isPermaLink="false">https://aanoaa.github.io/2015-07-15-redis-path-and-db-number/</guid><pubDate>Wed, 15 Jul 2015 09:10:25 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;redis://localhost:6397/1&lt;/code&gt; 흔한 redis-url 입니다.
&lt;code&gt;/1&lt;/code&gt; 의 역할은 뭘까요? 뭐냐면 Database number 입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ redis-cli --help
redis-cli 3.0.2

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
  ...
  -n &amp;#x3C;db&gt;            Database number.
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;/1&lt;/code&gt; 없이 연결하면 기본으로 &lt;code&gt;0&lt;/code&gt; 번 database 를 사용합니다.&lt;/p&gt;
&lt;p&gt;디버그 하면서 값을 확인하려고 제아무리 &lt;code&gt;keys *&lt;/code&gt; 을 찍어도 암것도
안나와서 넘 답답했는데..&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;127.0.0.1:6379&gt; keys *
(empty list or set)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;select&lt;/code&gt; 명령으로 선택해주거나,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;127.0.0.1:6379&gt; select 1
OK
127.0.0.1:6379[1]&gt; keys *
1) &quot;user:aanoaa&quot;
2) &quot;users&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;redis-cli&lt;/code&gt; 에서 &lt;code&gt;-n&lt;/code&gt; 옵션을 사용하거나&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ redis-cli -n 1
127.0.0.1:6379[1]&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;redis-url path 로 졸 검색했는데 암것도 안나옴.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[perltidy profile option]]></title><description><![CDATA[여기서 중요한것은 ... 으로 시작하면 현재 디렉토리에서부터 위로
올라가면서 이름으로 프로파일을 찾는다는 것 global 설정은 $HOME/.perltidyrc 로 두고 각 프로젝트 root 마다
.perltidyrc…]]></description><link>https://aanoaa.github.io/2015-07-15-perltidy-profile-option/</link><guid isPermaLink="false">https://aanoaa.github.io/2015-07-15-perltidy-profile-option/</guid><pubDate>Wed, 15 Jul 2015 07:31:41 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;$ perldoc perltidy

...
-pro=filename or --profile=filename
    To simplify testing and switching .perltidyrc files, this command
    may be used to specify a configuration file which will override the
    default name of .perltidyrc. There must not be a space on either
    side of the &apos;=&apos; sign. For example, the line

       perltidy -pro=testcfg

    would cause file testcfg to be used instead of the default
    .perltidyrc.

    A pathname begins with three dots, e.g. &quot;.../.perltidyrc&quot;, indicates
    that the file should be searched for starting in the current
    directory and working upwards. This makes it easier to have multiple
    projects each with their own .perltidyrc in their root directories.
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여기서 중요한것은 &lt;code&gt;...&lt;/code&gt; 으로 시작하면 현재 디렉토리에서부터 위로
올라가면서 이름으로 프로파일을 찾는다는 것&lt;/p&gt;
&lt;p&gt;global 설정은 &lt;code&gt;$HOME/.perltidyrc&lt;/code&gt; 로 두고 각 프로젝트 root 마다
&lt;code&gt;.perltidyrc&lt;/code&gt; 파일을 두면 신경쓰지 않고 사용할 수 있다는 겁니다.&lt;/p&gt;
&lt;p&gt;굳&lt;/p&gt;
&lt;p&gt;alias 걸어두고 사용하면 편리하겠습니다.
emacs 를 사용하는 인간이라면 &lt;code&gt;perltidy-mode&lt;/code&gt; 의 &lt;code&gt;perltidy-bin&lt;/code&gt; 을
수정해주면 되겠습니다.&lt;/p&gt;
&lt;p&gt;선조들은 훌륭합니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Octopress 3.0]]></title><description><![CDATA[블로그에 글을 1년 넘게 안썻더니 어케 쓰는줄 모르겠음.
하는김에 octopress 도 업그레이드 이제 gh-pages 브랜치 아니어도 되는건가.. 아 몰랑]]></description><link>https://aanoaa.github.io/2015-07-14-octopress-3-dot-0/</link><guid isPermaLink="false">https://aanoaa.github.io/2015-07-14-octopress-3-dot-0/</guid><pubDate>Tue, 14 Jul 2015 06:51:02 GMT</pubDate><content:encoded>&lt;p&gt;블로그에 글을 1년 넘게 안썻더니 어케 쓰는줄 모르겠음.
하는김에 octopress 도 업그레이드&lt;/p&gt;
&lt;p&gt;이제 &lt;code&gt;gh-pages&lt;/code&gt; 브랜치 아니어도 되는건가..&lt;/p&gt;
&lt;p&gt;아 몰랑&lt;/p&gt;</content:encoded></item><item><title><![CDATA[keep simple dist.ini]]></title><description><![CDATA[Dist::Zilla
는 매우 편리한 배포도구 입니다. 기능이 넘 많아서 잘 모르고 써왔는데, 이게 뭔지도 모르는걸 쓰다보니
헛갈려서 요새는 레알 간단하게만 쓰고 있습니다. 갠적으로 딱 필요한 메타파일은 이거 3개 입니다. dist.ini…]]></description><link>https://aanoaa.github.io/2014-02-12-keep-simple-dist-dot-ini/</link><guid isPermaLink="false">https://aanoaa.github.io/2014-02-12-keep-simple-dist-dot-ini/</guid><pubDate>Wed, 12 Feb 2014 08:20:06 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;http://search.cpan.org/~rjbs/Dist-Zilla/lib/Dist/Zilla.pm&quot;&gt;Dist::Zilla&lt;/a&gt;
는 매우 편리한 배포도구 입니다.&lt;/p&gt;
&lt;p&gt;기능이 넘 많아서 잘 모르고 써왔는데, 이게 뭔지도 모르는걸 쓰다보니
헛갈려서 요새는 레알 간단하게만 쓰고 있습니다.&lt;/p&gt;
&lt;p&gt;갠적으로 딱 필요한 메타파일은 이거 3개 입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dist.ini&lt;/li&gt;
&lt;li&gt;MANIFEST.SKIP&lt;/li&gt;
&lt;li&gt;cpanfile&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;cpanfile&lt;/code&gt; 이 없을적에는 &lt;code&gt;Makefile.PL&lt;/code&gt; 로 부터 의존성문제를 해결했기
때문에 복잡했는데 이제는 &lt;code&gt;cpanm --installdeps .&lt;/code&gt; 덕분에 몹.시.편.리.&lt;/p&gt;
&lt;p&gt;배포할때 빼고 싶은 파일은 &lt;code&gt;MANIFEST.SKIP&lt;/code&gt; 에 적어주고, &lt;code&gt;dist.ini&lt;/code&gt; 로
build 하고 배포&lt;/p&gt;
&lt;p&gt;좋은 플러그인이 많은데 나중되면 어케 쓰는지도 몰겟고 의존성문제로 인해
불편하기도 해서 그냥 자잘구레한 작업은 직접 손으로 하는걸로..&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dist.ini&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;name = mymodule
abstract = wat
author = aanoaa &amp;#x3C;wat@wat.wat&gt;
license = Perl_5
copyright_holder = aanoaa
copyright_year = 2014
version = v0.0.1
[@Basic]
[PkgVersion]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;MANIFEST.SKIP&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Makemaker generated files and dirs.
^MANIFEST\.
^Makefile$
^blib/

# version-control
^.git/
^.gitignore

^dist.ini
^README.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게 쓰고 있습니다.
제일 간단한 설정이라고 생각합니다.&lt;/p&gt;
&lt;p&gt;전에는 dzil profile 같은 것도 만들고 그랬는데 이제는 그냥 예전거
복사해다 쓰고 그럽니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[shut the fuck up and perltidy]]></title><description><![CDATA[$HOME/.perltidyrc 여기에 emacs 에다가
perltidy-mode.el load
하고  하고 저장하면 저장할때마다 알아서 perltidy 되기 땜시 굳입니다
팀에서 통일해서 쓰면 좋겟습니다. SEE ALSO tidyall]]></description><link>https://aanoaa.github.io/2014-02-12-shut-the-fuck-up-and-perltidy/</link><guid isPermaLink="false">https://aanoaa.github.io/2014-02-12-shut-the-fuck-up-and-perltidy/</guid><pubDate>Wed, 12 Feb 2014 08:07:08 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;$HOME/.perltidyrc&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# https://github.com/kraih/mojo/blob/master/.perltidyrc
-pbp # Start with Perl Best Practices
-w # Show all warnings
-iob # Ignore old breakpoints
-l=79 # 79 characters per line
-mbl=2 # No more than 2 blank lines
-i=4 # Indentation is 4 columns
-ci=2 # Continuation indentation is 2 columns
-vt=0 # Less vertical tightness
-pt=2 # High parenthesis tightness
-bt=2 # High brace tightness
-sbt=2 # High square bracket tightness
-isbc # Don&apos;t indent comments without leading space
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여기에 emacs 에다가
&lt;a href=&quot;http://search.cpan.org/~jjore/perltidy-mode/&quot;&gt;perltidy-mode.el&lt;/a&gt; load
하고 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(eval-after-load &quot;cperl-mode&quot;
  &apos;(add-hook &apos;cperl-mode-hook &apos;perltidy-mode))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;하고 저장하면 저장할때마다 알아서 &lt;code&gt;perltidy&lt;/code&gt; 되기 땜시 굳입니다
팀에서 통일해서 쓰면 좋겟습니다.&lt;/p&gt;
&lt;h3&gt;SEE ALSO&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://aanoaa.github.io/blog/2012/09/12/tidyall/&quot;&gt;tidyall&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Private Git Repo With Dropbox]]></title><description><![CDATA[개인적인 private repo 는 bitbucket 을 사용하고 있었는데, 아래 링크를
보고 Dropbox 를 사용하고 있습니다. Forget github limits: Free private git repositories with Dropbox…]]></description><link>https://aanoaa.github.io/2013-12-23-private-git-repo-with-dropbox/</link><guid isPermaLink="false">https://aanoaa.github.io/2013-12-23-private-git-repo-with-dropbox/</guid><pubDate>Mon, 23 Dec 2013 09:18:35 GMT</pubDate><content:encoded>&lt;p&gt;개인적인 private repo 는 bitbucket 을 사용하고 있었는데, 아래 링크를
보고 Dropbox 를 사용하고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mrdanadams.com/2011/github-free-private-git-repositories-dropbox/&quot;&gt;Forget github limits: Free private git repositories with Dropbox&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;근데 아쉬운거는 github repo 에는 issue board 도 있어서 프로젝트별로
할일을 관리할 수 있어서 참 좋은데 그런 기능이 필요했습니다.&lt;/p&gt;
&lt;p&gt;해서 둘러보던 차에 &lt;a href=&quot;http://todotxt.com/&quot;&gt;Todo.txt&lt;/a&gt; CLI 를 사용해보고
있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# todo.cfg
export TODO_DIR=$HOME/Dropbox/todo/`basename $PWD`
alias t=todo.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;요래해서 사용중입니다.&lt;/p&gt;
&lt;p&gt;프로젝트 root 에서 밖에 사용못하고 이름 중복에 대응할 순 없지만 아주
만족합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Dropbox&lt;/code&gt;++, &lt;code&gt;Todo.txt&lt;/code&gt;++&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd ~/Desktop/t
$ t add &apos;요래 조래&apos;
1 요래 조래
TODO: 1 added.
~/Desktop/t $ t add &apos;이러쿵 저러쿵&apos;
2 이러쿵 저러쿵
TODO: 2 added.
~/Desktop/t $ t add &apos;어쩌고 저쩌고&apos;
3 어쩌고 저쩌고
TODO: 3 added.
~/Desktop/t $ t ls
3 어쩌고 저쩌고
1 요래 조래
2 이러쿵 저러쿵
--
TODO: 3 of 3 tasks shown
~/Desktop/t $ t do 3
3 x 2013-12-23 어쩌고 저쩌고
TODO: 3 marked as done.
x 2013-12-23 어쩌고 저쩌고
TODO: /home/hshong/Dropbox/todo/t/todo.txt archived.
~/Desktop/t $ t ls
1 요래 조래
2 이러쿵 저러쿵
--
TODO: 2 of 2 tasks shown
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;뭐 대략 이런느낌&lt;/p&gt;
&lt;p&gt;Dropbox 에서 동기화 되기 땜시 다른 PC 로 옮겨서도 같은 프로젝트에서
같은 TODO list 를 관리할 수 있다는게 좋은 것 같습니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[coffeescript-compile-args]]></title><description><![CDATA[javascript 는 html 의 script 로써만 사용하고 있습니다.
직접 사용하진 않고 CoffeeScript 를 쓰고
있습니다. 위 결과처럼 별 옵션없이 --compile 하면 무명함수로 감싼뒤에 실행합니다. lexical scope…]]></description><link>https://aanoaa.github.io/2013-12-20-coffeescript-compile-args/</link><guid isPermaLink="false">https://aanoaa.github.io/2013-12-20-coffeescript-compile-args/</guid><pubDate>Thu, 19 Dec 2013 15:34:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;$ coffee -h

Usage: coffee [options] path/to/script.coffee -- [args]

If called without options, `coffee` will run your script.

  -b, --bare         compile without a top-level function wrapper
  -c, --compile      compile to JavaScript and save as .js files
  -e, --eval         pass a string from the command line as input
  -h, --help         display this help message
  -i, --interactive  run an interactive CoffeeScript REPL
  -j, --join         concatenate the source CoffeeScript before compiling
  -m, --map          generate source map and save as .map files
  -n, --nodes        print out the parse tree that the parser produces
      --nodejs       pass options directly to the &quot;node&quot; binary
  -o, --output       set the output directory for compiled JavaScript
  -p, --print        print out the compiled JavaScript
  -s, --stdio        listen for and compile scripts over stdio
  -l, --literate     treat stdio as literate style coffee-script
  -t, --tokens       print out the tokens that the lexer/rewriter produce
  -v, --version      display the version number
  -w, --watch        watch scripts for changes and rerun commands
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;javascript 는 html 의 script 로써만 사용하고 있습니다.
직접 사용하진 않고 &lt;a href=&quot;http://coffeescript.org/&quot;&gt;CoffeeScript&lt;/a&gt; 를 쓰고
있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-coffeescript&quot;&gt;$ coffee -cps
$ -&gt;
  console.log &apos;oops&apos;
&amp;#x3C;Ctrl+d&gt;
// Generated by CoffeeScript 1.6.3
(function() {
  $(function() {
    return console.log(&apos;oops&apos;);
  });

}).call(this);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 결과처럼 별 옵션없이 &lt;code&gt;--compile&lt;/code&gt; 하면&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(function() { ... }).call(this)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;무명함수로 감싼뒤에 실행합니다. lexical scope 이 자동으로 적용되어서
훌륭합니다만, 여러개의 파일을 하나의 html 에서 사용하고자 할때는 다른
파일에서 선언한 함수에 접근을 못하는 상황이 발생할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;script src=&quot;jquery.js&quot;&gt;&amp;#x3C;/script&gt;
&amp;#x3C;script src=&quot;a.js&quot;&gt;&amp;#x3C;/script&gt;
&amp;#x3C;script src=&quot;b.js&quot;&gt;&amp;#x3C;/script&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;a.js&lt;/code&gt; 에 &lt;code&gt;foo&lt;/code&gt; 라는 함수를 만들어 놓고 &lt;code&gt;b.js&lt;/code&gt; 에서 사용하고자 하면
못찾습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ReferenceError: foo is not defined
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이를 해결하는 방법은 3가지가 있습니다. (더 있을 수도..)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;requirejs 같은거 쓴다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;define&lt;/code&gt;, &lt;code&gt;require&lt;/code&gt; 으로 스슥&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Window 이름공간을 더럽힌다.&lt;/p&gt;
&lt;p&gt;브라우저의 전역적 이름공간인 &lt;code&gt;Window&lt;/code&gt; 의 프로토타입에 함수를
추가해서 사용&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;무명함수를 벗긴다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;coffee&lt;/code&gt; 명령어의 &lt;code&gt;--bare&lt;/code&gt; 옵션인데, &lt;code&gt;compile without a top-level function wrapper&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-coffeescript&quot;&gt;$ coffee -bcps
$ -&gt;
  console.log &apos;oops&apos;
&amp;#x3C;Ctrl+d&gt;
// Generated by CoffeeScript 1.6.3
$(function() {
  return console.log(&apos;oops&apos;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;  요래 하는 것입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;emacs 사용자라면 어찌 매번 컴파일하는 번거로운 작업을 한단 말입니까.
&lt;code&gt;coffee-cos-mode&lt;/code&gt;(coffee compile-on-save mode) 에 컴파일 옵션을
수정해둬야 하겠습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(defun coffee-custom ()
  &quot;coffee-mode-hook&quot;
  (set (make-local-variable &apos;tab-width) 2)
  (setq coffee-args-compile &apos;(&quot;-bc&quot;))
)
&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title><![CDATA[p5-hubot onto heroku]]></title><description><![CDATA[오리지날 hubot 에는
heroku 어쩌고 저쩌고 하는 기능이 있습니다. 이제 p5-hubot 에서도 됩니다. OVERVIEW 가장 기본은 이렇습니다만, 확장 스크립트를 추가하시려면
hubot-scripts.json…]]></description><link>https://aanoaa.github.io/2013-06-10-p5-hubot-onto-heroku/</link><guid isPermaLink="false">https://aanoaa.github.io/2013-06-10-p5-hubot-onto-heroku/</guid><pubDate>Mon, 10 Jun 2013 08:31:00 GMT</pubDate><content:encoded>&lt;p&gt;오리지날 &lt;a href=&quot;https://github.com/github/hubot&quot;&gt;hubot&lt;/a&gt; 에는
&lt;a href=&quot;https://www.heroku.com/&quot;&gt;heroku&lt;/a&gt; 어쩌고 저쩌고 하는 기능이 있습니다.&lt;/p&gt;
&lt;p&gt;이제 &lt;a href=&quot;https://github.com/aanoaa/p5-hubot&quot;&gt;p5-hubot&lt;/a&gt; 에서도 됩니다.&lt;/p&gt;
&lt;h3&gt;OVERVIEW&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ cpanm Hubot                      # requires Hubot &gt;= 0.2.0
$ hubot --create /path/to/hubot    # 배치가능한 형태의 패키지 저장소를 생성합니다
$ cd /path/to/hubot
$ git init ; git add . ; git commit -m &quot;init commit&quot;

$ heroku create --stack cedar --buildpack https://github.com/aanoaa/heroku-buildpack-perl.git

$ heroku config:add HEROKU_URL=http://your-herokuapp.herokuapp.com
$ heroku config:add HUBOT_IRC_ROOMS=&apos;#channel&apos;
$ heroku config:add HUBOT_IRC_SERVER=&apos;irc.freenode.net&apos;

$ git push heroku master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;가장 기본은 이렇습니다만, 확장 스크립트를 추가하시려면
&lt;code&gt;hubot-scripts.json&lt;/code&gt; 파일에 적어주시고 그에 따른 모듈 의존성은
&lt;code&gt;cpanfile&lt;/code&gt; 에 적어서 해결해야 합니다.&lt;/p&gt;
&lt;h3&gt;CREATE A DEPLOYABLE HUBOT&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://search.cpan.org/&quot;&gt;CPAN&lt;/a&gt; 을 이용한다면,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cpanm Hubot
$ hubot -c ~/Desktop/hubot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어로 deploy 저장소를 만들 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd ~/Desktop/hubot/
~/Desktop/hubot $ find
.
./.gitignore
./cpanfile
./hubot-scripts.json
./bin
./bin/hubot
./README.md
./lib
./lib/Hubot
./lib/Hubot/EventEmitter.pm
./lib/Hubot/Scripts
./lib/Hubot/Scripts/help.pm
./lib/Hubot/Scripts/ascii.pm
./lib/Hubot/Scripts/shorten.pm
./lib/Hubot/Scripts/tweet.pm
./lib/Hubot/Scripts/roles.pm
./lib/Hubot/Response.pm
./lib/Hubot/Robot.pm
./lib/Hubot/User.pm
./lib/Hubot/Adapter.pm
./lib/Hubot/TextListener.pm
./lib/Hubot/Listener.pm
./lib/Hubot/Adapter
./lib/Hubot/Adapter/Irc.pm
./lib/Hubot/Adapter/Shell.pm
./lib/Hubot/Adapter/Campfire.pm
./lib/Hubot/Message.pm
./lib/Hubot/Brain.pm
./lib/Hubot/Creator.pm
./lib/Hubot.pm
./Procfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 디렉토리를 git 저장소로 만들고요, &lt;code&gt;heroku&lt;/code&gt; tool 을 사용해서 heroku
에서 돌아갈 서비스 저장소로 만듭니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Procfile&lt;/code&gt; 은 heroku 에서 사용하는 process 타입별로 실행 명령어를
담고 있는 어쩌고 저쩌고;;
&lt;a href=&quot;https://devcenter.heroku.com/articles/procfile&quot;&gt;Process Types and the Procfile&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cpanfile&lt;/code&gt; 은 모듈의존성을 해결하기 위해 꼭 필요합니다. 그렇지 않으면
아래와 비슷한 오류가 발생되면서 프로그램이 실행되지 않습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Can&apos;t locate xxx.pm in @INC (@INC contains: ~~~) at line 1.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;나머지는 p5-hubot core 모듈입니다.(서비스엔 필요없는것도 잇지만..)&lt;/p&gt;
&lt;h3&gt;CREATE A HEROKU INSTANCE?&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ heroku create --stack cedar --buildpack https://github.com/aanoaa/heroku-buildpack-perl.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;heroku&lt;/code&gt; 라는 &lt;code&gt;remote&lt;/code&gt; 를 등록하고 &lt;code&gt;BUILDPACK_URL&lt;/code&gt; 설정변수를 추가하는
것 정도가 아닐까 추측 합니다.&lt;/p&gt;
&lt;p&gt;BUILDPACK_URL 은 git 저장소인데,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bin/detect&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bin/compile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bin/release&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;를 가지고 있습니다. 자세한 내용은
&lt;a href=&quot;https://devcenter.heroku.com/articles/buildpacks#creating-a-buildpack&quot;&gt;Creating a Buildpack&lt;/a&gt;
을 참고하시고, 이부분의 매직은 &lt;code&gt;bin/compile&lt;/code&gt; 이 수행될때 &lt;code&gt;cpanm&lt;/code&gt; 을
이용해서 &lt;code&gt;./local&lt;/code&gt; 에 의존모듈을 설치합니다. 그리고 실행할때에
&lt;code&gt;-Ilocal/perl5/lib&lt;/code&gt; &lt;code&gt;PERL5LIB&lt;/code&gt; 에 추가합니다. 풀어쓰면 아래와
같습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cpanm --quiet --notest -l $BUILD_DIR/local --installdeps .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/miyagawa&quot;&gt;@miyagawa&lt;/a&gt;++ 입니다.&lt;/p&gt;
&lt;p&gt;그리고 heroku 에 push 하면 알아서 돌아갑니다(별일 없으면..)&lt;/p&gt;
&lt;h3&gt;SEE ALSO&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/github/hubot/wiki/Deploying-Hubot-onto-Heroku&quot;&gt;Deploying Hubot onto Heroku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/aanoaa/heroku-buildpack-perl&quot;&gt;heroku-buildpack-perl for Perl/hubot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devcenter.heroku.com/articles/procfile&quot;&gt;Process Types and the Procfile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[p5-hubot]]></title><description><![CDATA[p5-hubot scipts explained 필요해서 hubot 을 perl 로 옮기고
있습니다. - p5-hubot 아직 해야할 일이 많지만 테스트 + 문서화를 해서
CPAN 에 올릴 생각입니다. hubot-scripts contributors…]]></description><link>https://aanoaa.github.io/2012-10-04-p5-hubot/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-10-04-p5-hubot/</guid><pubDate>Thu, 04 Oct 2012 06:30:00 GMT</pubDate><content:encoded>&lt;h3&gt;p5-hubot scipts explained&lt;/h3&gt;
&lt;p&gt;필요해서 &lt;a href=&quot;https://github.com/github/hubot&quot;&gt;hubot&lt;/a&gt; 을 &lt;code&gt;perl&lt;/code&gt; 로 옮기고
있습니다. - &lt;a href=&quot;https://github.com/aanoaa/p5-hubot&quot;&gt;p5-hubot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;아직 해야할 일이 많지만 테스트 + 문서화를 해서
&lt;a href=&quot;http://search.cpan.org/&quot;&gt;CPAN&lt;/a&gt; 에 올릴 생각입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/github/hubot-scripts/graphs/contributors&quot;&gt;hubot-scripts contributors&lt;/a&gt;
는 100명이 넘습니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;p5-hubot&lt;/code&gt; 도 도움을 받아서 멋진 기능을 장착하고 싶습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://search.cpan.org/&quot;&gt;CPAN&lt;/a&gt; 에 &lt;code&gt;Hubot::Scripts::*&lt;/code&gt; 모듈이
많아지면 좋겠습니다.&lt;/p&gt;
&lt;p&gt;robot 에게 &lt;code&gt;http://twitter.com/&amp;#x3C;username&gt;/status/&amp;#x3C;tweetid&gt;&lt;/code&gt; 의 패턴이
들리면 그 내용을 파싱해서 말하는 스크립트 입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot; data-meta=&quot;Hubot::Scripts::tweet&quot;&gt;package Hubot::Scripts::tweet;
use strict;
use warnings;
use JSON::XS;

sub load {
    my ( $class, $robot ) = @_;
    $robot-&gt;hear(
        qr/https?:\/\/(mobile\.)?twitter\.com\/.*?\/status\/([0-9]+)/i,
        sub {
            my $msg = shift;    # Hubot::Response
            $msg-&gt;http( &apos;https://api.twitter.com/1/statuses/show/&apos;
                  . $msg-&gt;match-&gt;[1]
                  . &apos;.json&apos; )-&gt;get(
                sub {
                    my ( $body, $hdr ) = @_;
                    return if ( !$body || !$hdr-&gt;{Status} =~ /^2/ );
                    my $tweet = decode_json($body);
                    $msg-&gt;send(&quot;$tweet-&gt;{user}{screen_name}: $tweet-&gt;{text}&quot;);
                }
                  );
            $msg-&gt;message-&gt;finish;
        }
    );
}

1;

=head1 SYNOPSIS

http://twitter.com/&amp;#x3C;username&gt;/status/&amp;#x3C;tweetid&gt;

=head1 DEPENDENCIES

None

=head1 CONFIGURATION

None

=head1 AUTHOR

Hyungsuk Hong

=cut
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-coffee-script&quot; data-meta=&quot;tweet.coffee&quot;&gt;# Description:
#   Detect tweet URL and send tweet content
#
# Dependencies:
#   None
#
# Configuration:
#   None
#
# Commands:
#
# Author:
#   Vrtak-CZ

module.exports = (robot) -&gt;
    robot.hear /https?:\/\/(mobile\.)?twitter\.com\/.*?\/status\/([0-9]+)/i, (msg) -&gt;
        msg.http(&quot;https://api.twitter.com/1/statuses/show/#{msg.match[2]}.json&quot;).get() (err, res, body) -&gt;
            return if err or (res.statusCode != 200)

            tweet = JSON.parse(body)

            msg.send &quot;@#{tweet.user.screen_name}: #{tweet.text}&quot;
        msg.message.finish()
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;robot.hear /foo/&lt;/code&gt;: &lt;code&gt;foo&lt;/code&gt; 가 들리면 반응합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;robot.respond /foo/&lt;/code&gt;: &lt;code&gt;hubot: foo&lt;/code&gt; 에 반응합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;robot.send &apos;hi&apos;&lt;/code&gt;: 로봇이 &lt;code&gt;hi&lt;/code&gt; 라고 합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;robot.reply &apos;hi&apos;&lt;/code&gt;: 로봇이 말건사람한테 &lt;code&gt;&amp;#x3C;user&gt;: hi&lt;/code&gt; 라고 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;요거 4개의 기능만 알면 스크립트를 작성하긴 쉽습니다.&lt;/p&gt;
&lt;p&gt;저희회사에서는 이걸 이용해서
&lt;a href=&quot;https://github.com/miyagawa/hubot-standup&quot;&gt;standup-meeting&lt;/a&gt; 도 하고
그럽니다.&lt;/p&gt;
&lt;p&gt;우선 아이디어가 있으면 남겨주세요.&lt;/p&gt;
&lt;p&gt;테스트환경구축이랑 의존성문제는 해결해서 다시 포스팅하겠습니다.&lt;/p&gt;
&lt;h3&gt;SEE ALSO&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://silexkr.github.com/blog/2012/02/21/irc-bot/&quot;&gt;irc-bot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://theprogrammingbutler.com/blog/archives/2011/10/28/hubot-scripts-explained/&quot;&gt;hubot Scripts Explained&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[tidyall]]></title><description><![CDATA[Perl 에는 Best Practices 가 있습니다. cat Damian Conway (일명 '대곤이횽') 의 Perl Best Practices 가 그것입니다. (저는 아직 안읽어봤습니다) Perl::Critic은 정적 소스코드 분석기로써 Perl…]]></description><link>https://aanoaa.github.io/2012-09-12-tidyall/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-09-12-tidyall/</guid><pubDate>Tue, 11 Sep 2012 16:11:00 GMT</pubDate><content:encoded>&lt;p&gt;Perl 에는 Best Practices 가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://akamaicovers.oreilly.com/images/9780596001735/cat.gif&quot; alt=&quot;cat&quot;&gt;&lt;/p&gt;
&lt;p&gt;Damian Conway (일명 &apos;대곤이횽&apos;) 의 &lt;a href=&quot;http://shop.oreilly.com/product/9780596001735.do&quot;&gt;Perl Best Practices&lt;/a&gt; 가 그것입니다. (저는 아직 안읽어봤습니다)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://search.cpan.org/~thaljef/Perl-Critic-1.118/lib/Perl/Critic.pm&quot;&gt;Perl::Critic&lt;/a&gt;은 정적 소스코드 분석기로써 &lt;code&gt;Perl Best Practices&lt;/code&gt; 의 정책을 따릅니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://search.cpan.org/~shancock/Perl-Tidy-20120714/bin/perltidy&quot;&gt;perltidy&lt;/a&gt; 도 있습니다.
작성한 perlcode 를 깔끔하게 정돈해줍니다.&lt;/p&gt;
&lt;p&gt;이와 같은 도구를 사용하면 협업팀으로써 일관된 코딩스타일을 유지시켜 줄
수 있을 거라고 생각했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개인이 스스로 알아서 지킬 수 있겟고,&lt;/li&gt;
&lt;li&gt;git &lt;code&gt;pre-commit&lt;/code&gt; hook 을 활용할 수 도 있겠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1번은 잘 안되더라고요.
그래서 2번을 시도중입니다.&lt;/p&gt;
&lt;p&gt;방법은 이렇습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cpanm Code::TidyAll
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;설치하고 project repo 에 &lt;code&gt;pre-commit&lt;/code&gt; hook 을 작성합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot; data-meta=&quot;.git/hooks/pre-commit&quot;&gt;#!/usr/bin/env perl
use strict;
use warnings;
use Code::TidyAll::Git::Precommit;

Code::TidyAll::Git::Precommit-&gt;check();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;project root 에 &lt;code&gt;tidyall.ini&lt;/code&gt; 를 작성합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot; data-meta=&quot;tidyall.ini&quot;&gt;[PerlTidy]
select = **/*.{pl,pm,t}
ignore = lib/*/Schema/Result/*.pm
argv = -noll -it=2

[PerlCritic]
select = lib/**/*.pm
argv = -severity 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 코드를 작성하고 commit 합니다.
참 쉽죠?&lt;/p&gt;
&lt;p&gt;거지 같이 작성했다면 커밋에 실패하고 적절한 메세지가 나타납니다.&lt;/p&gt;
&lt;p&gt;커밋전에 스스로 확인해 보려면 &lt;code&gt;$ tidyall -a&lt;/code&gt; 하시면 됩니다.&lt;/p&gt;
&lt;h3&gt;SEE ALSO&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openswartz.com/2012/09/05/tidying-and-checking-code-on-commit/&quot;&gt;Tidying and checking code on commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openswartz.com/2012/08/21/one-tidier-to-rule-them-all/&quot;&gt;One tidier to rule them all&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[git push --force]]></title><description><![CDATA[저는 pull-request workflow가 갑이라고 생각합니다.
비동기 방식으로 업무가 진행되고, merge 하기전에 자연스런 review 도
되고요. 근데 궁금한점이 생겻습니다.
이게 말로 한문장으로 설명하기 참 어려워서 예를 들겠습니다.…]]></description><link>https://aanoaa.github.io/2012-09-11-git-push-force/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-09-11-git-push-force/</guid><pubDate>Tue, 11 Sep 2012 14:28:00 GMT</pubDate><content:encoded>&lt;p&gt;저는 &lt;code&gt;pull-request workflow&lt;/code&gt;가 갑이라고 생각합니다.
비동기 방식으로 업무가 진행되고, merge 하기전에 자연스런 review 도
되고요.&lt;/p&gt;
&lt;p&gt;근데 궁금한점이 생겻습니다.
이게 말로 한문장으로 설명하기 참 어려워서 예를 들겠습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# alias.br=branch
# alias.co=checkout
$ git br
* master
  topic1
  topic2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3개의 브랜치가 있고 이렇게 저렇게 작업해서 각각의 이력은 아래와
같습니다. &lt;code&gt;topic1&lt;/code&gt; 과 &lt;code&gt;topic2&lt;/code&gt; 가 분기한 시점은 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;master&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;bfb49285 * [origin/master] [master] init commit
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;topic1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;c94f01bb * [origin/topic1] [topic1] add b.c
90d550b0 * add a.c
bfb49285 * [origin/master] [master] init commit
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;topic2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;b9f6b81a * [origin/topic2] [topic2] add e.c
95ea73d0 * add d.c
2a44208b * add c.c
bfb49285 * [origin/master] [master] init commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;두개의 &lt;code&gt;topic&lt;/code&gt; 모두 &lt;code&gt;pull-request&lt;/code&gt; 상태이고(github 을 사용한다고
가정합니다), 매니저가 &lt;code&gt;topic1&lt;/code&gt; 을 &lt;em&gt;merge&lt;/em&gt; 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    ed02ed2e *   [origin/master] [master] Merged in aanoaa/test/topic1 (pull request #1)
             |\
    c94f01bb | * [origin/topic1] [topic1] add b.c
    90d550b0 | * add a.c
             |/
    bfb49285 * init commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;topic1&lt;/code&gt; 이 먼저 &lt;em&gt;merge&lt;/em&gt; 되었기에 &lt;code&gt;topic2&lt;/code&gt; 에서 &lt;code&gt;master&lt;/code&gt; 를 &lt;em&gt;rebase&lt;/em&gt;
합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    963cd74c * [topic2] add e.c
    fcaba0cc * add d.c
    f28849aa * add c.c
    ed02ed2e *   [origin/master] [master] Merged in aanoaa/test/topic1 (pull request #1)
             |\
    c94f01bb | * [origin/topic1] [topic1] add b.c
    90d550b0 | * add a.c
             |/
    bfb49285 * init commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;rebase&lt;/em&gt; 되었기 때문에 &lt;code&gt;topic2&lt;/code&gt; 는 &lt;code&gt;origin/topic2 HEAD&lt;/code&gt; 를 잃습니다.
이때 &lt;code&gt;push&lt;/code&gt; 하게 되면 &lt;code&gt;reject&lt;/code&gt; 됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    $ git push origin topic2
    To ssh://git@example.com/aanoaa/test.git
     ! [rejected]        topic2 -&gt; topic2 (non-fast-forward)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여기서 다른 사람들은 어떻게 처리하는지가 궁금합니다.
두개의 방법이 있을 수 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$ git pull &amp;#x26;&amp;#x26; git push&lt;/code&gt; &lt;em&gt;non-fast-forward&lt;/em&gt; 이기 때문에 쉽게 생각할 수
있는 방법입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ git push --force origin topic2&lt;/code&gt; remote 의 이력을 바꿔버립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;첫번째 방법으로 해결했을때는 &lt;code&gt;topic2&lt;/code&gt; 에서 작업한 이력이 두번씩 남게
됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    9647d196 *   [topic2] Merge branch &apos;topic2&apos; of ssh://example.com/aanoaa/test into topic2
             |\
    b9f6b81a | * [origin/topic2] add e.c
    95ea73d0 | * add d.c
    2a44208b | * add c.c
    963cd74c * | [ref-topic2] add e.c
    fcaba0cc * | add d.c
    f28849aa * | add c.c
    ed02ed2e * |   [origin/master] [master] Merged in aanoaa/test/topic1 (pull request #1)
             |\ \
             | |/
             |/|
    c94f01bb | * [origin/topic1] [topic1] add b.c
    90d550b0 | * add a.c
             |/
    bfb49285 * init commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;rebase&lt;/em&gt; 의 동작방식을 이해한다면 당연한 결과입니다. 마지막의 &lt;em&gt;merge&lt;/em&gt;
커밋도 &lt;em&gt;pull&lt;/em&gt; 을 사용했기 때문에 이해할 수 있습니다.&lt;/p&gt;
&lt;p&gt;두번째 방식을 사용한다면 아까 &lt;code&gt;topic2&lt;/code&gt; 에서 &lt;code&gt;master&lt;/code&gt; 를 &lt;em&gt;rebase&lt;/em&gt;
했을때의 이력을 가지게 됩니다만 공동작업에서 remote 의 이력을 변경하게
되는 것이라서 부담이 생깁니다.&lt;/p&gt;
&lt;p&gt;두개의 결과는 같습니다만 첫번째는 중복된 이력을 가지게 되고, 두번째는
협업간에 불화가 생길 수 있습니다.&lt;/p&gt;
&lt;p&gt;어떻게들 사용하시나요?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[chrome scrollbar style]]></title><description><![CDATA[$HOME/.config/google-chrome/Default/User StyleSheets/Custom.css 에다가
아래 내용을 추가하면 scroll-bar…]]></description><link>https://aanoaa.github.io/2012-07-02-chrome-scrollbar-style/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-07-02-chrome-scrollbar-style/</guid><pubDate>Mon, 02 Jul 2012 03:50:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;$HOME/.config/google-chrome/Default/User StyleSheets/Custom.css&lt;/code&gt; 에다가
아래 내용을 추가하면 scroll-bar 가 얄상하니 이쁩니다.&lt;/p&gt;
&lt;p&gt;근데 불편해서 안쓸라고.. 나중에 검색하기 힘들까봐 로그 남겨 둡니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot; data-meta=&quot;$HOME/.config/google-chrome/Default/User StyleSheets/Custom.css&quot;&gt;::-webkit-scrollbar-track-piece{
    background-color:#fff;
    -webkit-border-radius:0;
}
::-webkit-scrollbar{
    width:12px;
    height:8px;
}
::-webkit-scrollbar-thumb{
    height:50px;
    background-color:#999;
    -webkit-border-radius:4px;
    outline:2px solid #fff;
    outline-offset:-2px;
    border: 2px solid #fff;
}
::-webkit-scrollbar-thumb:hover{
    height:50px;
    background-color:#9f9f9f;
    -webkit-border-radius:4px;
}
&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title><![CDATA[perl y operator]]></title><description><![CDATA[사건의 발단 어느날 오후 @freenode #perl-kr 에서 일어난 일입니다. 저는 손으로 세봤습니다. 100 까지 세는데, 한참 걸렸습니다. 이렇게 세어보고 다시 irc 화면을 봤는데.. 떡밥이 흥하질 않자 a3r…]]></description><link>https://aanoaa.github.io/2012-06-21-perl-y-operator/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-06-21-perl-y-operator/</guid><pubDate>Thu, 21 Jun 2012 04:59:00 GMT</pubDate><content:encoded>&lt;h2&gt;사건의 발단&lt;/h2&gt;
&lt;p&gt;어느날 오후 @freenode #perl-kr 에서 일어난 일입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;a3r0_&gt; 오랜만에 퀴즈
&amp;#x3C;a3r0_&gt; 구글 입사문제인데
&amp;#x3C;a3r0_&gt; 1에서 100000 사이에 8이 몇번 나오는지 맞춰라~
&amp;#x3C;a3r0_&gt; 답은 perl 원라이너로만 받음
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;저는 손으로 세봤습니다. 100 까지 세는데, 한참 걸렸습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;8,18,28,38,48,58,68,78,80,81,82,83,84,85,86,87,88,89,98 
20개 (88에서 8이 두개 입니다)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게 세어보고 다시 irc 화면을 봤는데..&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&amp;#x3C;EnGoon&gt; eval my $count =0; for (0..100000) { /(8)/; $count += $+;} print $count;
&amp;#x3C;hongbot&gt; 799944
&amp;#x3C;a3r0_&gt; 구글 입사 불합격 하셨습니다.
&amp;#x3C;ascendo&gt; for i in $(seq 1 100000); do echo $i; done | egrep &apos;8&apos; | wc -l # syntax error
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;떡밥이 흥하질 않자 &lt;code&gt;a3r0&lt;/code&gt; 님이 정답을 공개해 주셧습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&amp;#x3C;a3r0_&gt; $ perl -E &apos;for(1..100000) { $c+=@{[$_ =~ m/8/g]} }; say $c&apos;
&amp;#x3C;a3r0_&gt; 50000
&amp;#x3C;a3r0_&gt; $ perl -E &apos;for(1..100000) { $c+=(tr/8//) }; say $c&apos;
&amp;#x3C;a3r0_&gt; 50000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이렇게 묻히나 싶었는데, 뒤늦게 보신 &lt;code&gt;nol2ter_work&lt;/code&gt; 님의 bash oneliner&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&amp;#x3C;nol2ter_work&gt; 오홍.. bash 로는.. expr `echo {1..100000} | sed -r &quot;s/[^8]//g&quot; | wc -m` - 1 로 되네영..
&amp;#x3C;a3r0_&gt; python으로 해보셈
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;여기서 python 의 대반격&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;#x3C;nol2ter_work&gt; 피똥으로.. str(range(100000)).count(&apos;8&apos;)
&amp;#x3C;nol2ter_work&gt; 아.. 이건 편법일라나요 캬캬캬
&amp;#x3C;a3r0_&gt; str 함수가 문자열 이어붙여주나여?
&amp;#x3C;nol2ter_work&gt; &gt;&gt;&gt; str(range(100000)).count(&apos;8&apos;)
&amp;#x3C;nol2ter_work&gt; 50000
&amp;#x3C;nol2ter_work&gt; 라고 나오긴 하네용
&amp;#x3C;a3r0_&gt; 오
&amp;#x3C;jeen___&gt; 피똥이 갑이네..
&amp;#x3C;jeen___&gt; 피똥배워야지...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;분위기가 술렁이기 시작했습니다.
파이썬으로 저렇게 그레이스풀한 방법이 잇엇나 싶기도 했습니다.
거기에 더해 &lt;code&gt;진사마&lt;/code&gt;는 파이썬으로 갈아탈 준비를 마친 상태.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&amp;#x3C;a3r0_&gt; say &quot;@{[0..100000]}&quot;=~y/8//
&amp;#x3C;a3r0_&gt; str(range(100000)).count(&apos;8&apos;)
&amp;#x3C;a3r0_&gt; 2글자 승?
&amp;#x3C;a3r0_&gt; say 빼면 6글자 승?  [13:40]
&amp;#x3C;a3r0_&gt; $ perl -E &apos;say &quot;@{[0..100000]}&quot;=~y/8//&apos;
&amp;#x3C;a3r0_&gt; 50000
&amp;#x3C;a3r0_&gt; 줄이기 최종버젼은 &quot;@{[0..1E5]}&quot;=~y/8//
&amp;#x3C;nol2ter_work&gt; 달달달
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;찰나 &lt;code&gt;a3r0&lt;/code&gt; 님의 신의 한수
결국 &lt;code&gt;1E5&lt;/code&gt; 까지쓰며 더 줄일 수 없도록 만들었습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;jeen___&gt; 1E5 ㅋㅋㅋㅋ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;저만 여기서 터진게 아니엇습니다.
이때, 원라이너의 귀재 &lt;code&gt;pung96&lt;/code&gt;님의 등장&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*** pung96 (~pung96@46.162.162.115) has joined channel #perl-kr
&amp;#x3C;a3r0_&gt; 원라이너의 귀재 pung96님 오셨
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;같은 문제를 내어 봤는데 역시나 금방 답이 나오더군요.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&amp;#x3C;pung96&gt; 그냥,, 초 단순하게 생각하면,,
&amp;#x3C;pung96&gt; map{$s+=()=/8/g}1..100000;say$s 이럼 되는데
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이쯤에서 짧은 답안 공개&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&amp;#x3C;a3r0_&gt; &quot;@{[0..1E5]}&quot;=~y/8//
&amp;#x3C;pung96&gt; 헐,
&amp;#x3C;pung96&gt; 1E5 ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ㅋㅋㅋ &lt;code&gt;1E5&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;계속되는 덕질&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&amp;#x3C;a3r0_&gt; map{$s+=()=/8/g}1..100000
&amp;#x3C;a3r0_&gt; map{$s+=@{[/8/g]}}1..100000
&amp;#x3C;pung96&gt; map{$s+=y/8//} 이럼,, 좀더 짧아지는군요.
&amp;#x3C;a3r0_&gt; map{$s+=y/8//}1..1E5
&amp;#x3C;a3r0_&gt; &quot;@{[1..1E5]}&quot;=~y/8//
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;결국 &lt;code&gt;pung96&lt;/code&gt;님의 타이기록&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&amp;#x3C;pung96&gt; map$s+=y/8//,1..1E5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pung96&lt;/code&gt;님의 신기록!&lt;/p&gt;
&lt;p&gt;저는 이미 예전에 gg&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&amp;#x3C;jeen___&gt; use Alias ( map =&gt; m, print =&gt; p );
&amp;#x3C;pung96&gt; jeen___: ++
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;폭풍같은 시간이었습니다.&lt;/p&gt;
&lt;h2&gt;분석&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&quot;@{[0..1E5]}&quot;=~y/8//; # 50000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아.. 아릅답습니다.&lt;/p&gt;
&lt;p&gt;먼저 &lt;code&gt;y&lt;/code&gt; operator 를 &lt;code&gt;perldoc&lt;/code&gt; 에서 찾아보면,&lt;/p&gt;
&lt;p&gt;&lt;code&gt;The transliteration operator. Same as tr///. See Quote and Quote-like Operators in perlop.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tr&lt;/code&gt; operator 와 같다고 나옵니다.
&lt;code&gt;tr&lt;/code&gt; 의미는 Transliteration(바꿔 씀) 입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tr/SEARCHLIST/REPLACEMENTLIST/cdsr
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;cdsr&lt;/code&gt; modifier 는 &lt;code&gt;perldoc&lt;/code&gt; 에서 못찾았습니다.
그래서 검색했더니 아래와 같은 내용이 있어서 붙입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;c - is used to specify that the SEARCHLIST character set is complemented
d - is used to delete found but not replaced characters
s - is used to specify that the sequences of characters that were transliterated to the same character are squashed down to a single
instance of the character

c   Complement the SEARCHLIST.
d   Delete found but unreplaced characters.
s   Squash duplicate replaced characters.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;예제&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;$ARGV[1] =~ tr/A-Z/a-z/;    # canonicalize to lower case 
$cnt = tr/*/*/;             # count the stars in $_ 
$cnt = $sky =~ tr/*/*/;     # count the stars in $sky 
$cnt = tr/0-9//;            # count the digits in $_ 
tr/a-zA-Z//s;               # bookkeeper -&gt; bokeper 
($HOST = $host) =~ tr/a-z/A-Z/; 
tr/a-zA-Z/ /cs;             # change non-alphas to single space 
tr [\200-\377] 
   [\000-\177];             # delete 8th bit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;tr|y&lt;/code&gt; operator 는 &lt;code&gt;SEARCHLIST&lt;/code&gt; 가 매칭된 갯수를 반환하는 걸
알겠습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&quot;@{[0..1E5]}&quot;=~y/8//; # 50000
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&quot;@{[0..1E5]}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1E5&lt;/code&gt; 는 10의 5 제곱입니다. 해서 -&gt; 1..100000&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@{[]}&lt;/code&gt; 는 array 를 reference 하고 다시 dereference 하는 과정입니다.
이유는 문자열상수 안에서 perl code 를 evaluate 하고 다시 집어넣는
보간(interpolation) 하기 위한 꼼수 입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@{[1..100000]}&lt;/code&gt; 은 &lt;code&gt;(1, 2, 3, ..., 100000)&lt;/code&gt; 을 가지고 있는 array
입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;(1,2,3,...,100000)&quot;&lt;/code&gt; array 가 &lt;code&gt;&quot;&lt;/code&gt; 로 묶여 있으면 &lt;code&gt;&lt;/code&gt;(SPACE) 를
구분자로 삽입한 scalar 자료형이 됩니다. 즉, &apos;1 2 3 4 ... 100000&apos;&lt;/li&gt;
&lt;li&gt;&quot;@{[0..1E5]}&quot; 는 &apos;1 2 3 4 ... 100000&apos; 이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;&apos;1 2 3 ... 100000&apos;=~y/8//;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;문자열 &lt;code&gt;1 2 3 ... 100000&lt;/code&gt; 에 &lt;code&gt;8&lt;/code&gt; 이 몇번 나오는지 돌려줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;오늘도 즐거운 하루중입니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[같이걸을까 게스트하우스]]></title><description><![CDATA[…]]></description><link>https://aanoaa.github.io/2012-04-27-gatigeoleulgga-geseuteuhauseu/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-04-27-gatigeoleulgga-geseuteuhauseu/</guid><pubDate>Fri, 27 Apr 2012 08:43:00 GMT</pubDate><content:encoded>&lt;h2&gt;제목은 회이크&lt;/h2&gt;
&lt;p&gt;그냥 어제 오늘 있엇던 일을 적을까 합니다.
지금 묵고 있는 데가 &lt;a href=&quot;http://www.facebook.com/togetherjeju&quot;&gt;같이걸을까 게스트하우스&lt;/a&gt; 입니다.
여기 대장님이 블로그 하냐고 물어보셔서 한다고 하니까 포스팅 한개만
해달라고.. 잉여롭던 찰나에 잘됐다 싶어서 올려봅니다.&lt;/p&gt;
&lt;h2&gt;워크샵(샾?)&lt;/h2&gt;
&lt;p&gt;회사에서 제주도로 워크샵(샾?)을 가게 되었습니다. 랄까 지금 제주돕니다.
공식일정은 &lt;code&gt;4/30(월) ~ 5/4(금)&lt;/code&gt; 까지. 용사장++&lt;/p&gt;
&lt;p&gt;근데 저는 좀 앞당겨서 목요일날(지금으로선 어제) 왔습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh6.googleusercontent.com/-GZfDcnkoKZs/T5pjdLevt_I/AAAAAAAAACI/D9jC7mPXVAQ/%2525C3%2525AA%2525C2%2525B3%2525C2%2525B5%2525C3%2525AD%2525C2%252595%2525C2%2525AD.jpg&quot; alt=&quot;제주도&quot;&gt;&lt;/p&gt;
&lt;h2&gt;미라클 게스트하우스&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/#!/jeen_lee&quot;&gt;@jeen&lt;/a&gt;님이 미리 손을 써놔서 게스트하우스인데 방을 한개 빌렸습니다.
일본에 있을때 게스트하우스에 묵어봐서 여인숙정도겠거니~
생각했는데(여인숙 안가봤지만..) 너무 잘해놔서 놀랐습니다. 이 무슨
병신같은 말이냐만 저의 마이너한 성향으로서는 너무 잘해놔서
별로라능ㅋㅋ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh6.googleusercontent.com/-xmrIg8p3dio/T5pnBDf_PNI/AAAAAAAAACU/w0xsaKy41cM/%2525C3%2525AB%2525C2%2525AF%2525C2%2525B8%2525C3%2525AB%2525C2%25259D%2525C2%2525BC%2525C3%2525AD%2525C2%252581%2525C2%2525B4.jpg&quot; alt=&quot;미라클&quot;&gt;&lt;/p&gt;
&lt;p&gt;친절하고, 픽업도 해주고, 밥도 먹을 수 있고, 자전거, 책 도 빌려주고
온수도 빠방하고 다 좋았습니다.&lt;/p&gt;
&lt;h2&gt;짜장면&lt;/h2&gt;
&lt;p&gt;근데 짜장면이 먹고 싶었습니다.
검색해서 동네 짱개집으로 ㄱㄱ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-fY-9EEpLKJ0/T5pothlejmI/AAAAAAAAAC0/127sZpZThRk/%2525C3%2525AC%2525C2%2525B2%2525C2%25259C%2525C3%2525AC%2525C2%252599%2525C2%252595%2525C3%2525AC%2525C2%252584%2525C2%2525B1.png&quot; alt=&quot;천왕성&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-bpI6buaYNgo/T5poSUELlvI/AAAAAAAAACk/lD55-dknihg/%2525C3%2525AC%2525C2%2525A7%2525C2%25259C%2525C3%2525AC%2525C2%25259E%2525C2%2525A5%2525C3%2525AB%2525C2%2525A9%2525C2%2525B4.jpg&quot; alt=&quot;짜장면&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh4.googleusercontent.com/-u5qSLy9Pt-4/T5poPuSPClI/AAAAAAAAACc/ogiPOP6BRRk/%2525C3%2525AC%2525C2%2525A7%2525C2%25259C%2525C3%2525AC%2525C2%25259E%2525C2%2525A5.jpg&quot; alt=&quot;짜장&quot;&gt;&lt;/p&gt;
&lt;p&gt;전설의 中 짜리 탕수육&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh4.googleusercontent.com/-7Whecv6cE4Q/T5poWQK0TDI/AAAAAAAAACs/VKZsbUTMuFw/%2525C3%2525AD%2525C2%252583%2525C2%252595%2525C3%2525AC%2525C2%252588%2525C2%252598%2525C3%2525AC%2525C2%25259C%2525C2%2525A1.jpg&quot; alt=&quot;전설의 탕수육 中 짜리&quot;&gt;&lt;/p&gt;
&lt;p&gt;인심이 너무 좋아서 맛잇게 많이 먹엇습니다.&lt;/p&gt;
&lt;h2&gt;같이걸을까 게스트하우스&lt;/h2&gt;
&lt;p&gt;짜장면 먹고 일행과 헤어지고 주변 게스트하우스 검색해봤더니 평가가
&lt;strong&gt;오성급&lt;/strong&gt;이라서 여기로 결정했습니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-dTwRlBj2vLM/T5pqWTbHReI/AAAAAAAAAC8/kR1Fz3TiBmI/%2525C3%2525AC%2525C2%252598%2525C2%2525A4%2525C3%2525AC%2525C2%252584%2525C2%2525B1%2525C3%2525AA%2525C2%2525B8%2525C2%252589.png&quot; alt=&quot;오성급&quot;&gt;&lt;/p&gt;
&lt;p&gt;올레길 &lt;strong&gt;17코스&lt;/strong&gt; 근처입니다만 좀 숨어 있습니다. 저는 스쿠터 타고와서 지도
보고 왔는데 버스 타고오면 &lt;code&gt;외도 파출소&lt;/code&gt; 에서 내리면 걸어서 5분입니다.&lt;/p&gt;
&lt;p&gt;친구네집 놀러온 느낌입니다. &lt;a href=&quot;http://www.facebook.com/togetherjeju&quot;&gt;여기&lt;/a&gt;에서 사진보세여.
무계획으로 있엇는데 대장님이 어디어디 괜찮을 거라고 추천해줘서 거기
갓다가 아마 내일도 여기에 묵지 않을까 싶습니다. 맥주도 맨드신다고..&lt;/p&gt;</content:encoded></item><item><title><![CDATA[backbon.js jsonp collection sync]]></title><description><![CDATA[외부 도메인을 사용하고자 할때 jsonp 를 이용해야 하는데,
이때, Backbone.sync 메소드를 override 해서 쓸 수 있습니다. jquery $.ajax 메소드의 옵션을 보면 dataType을 jsonp로 설정하면
url…]]></description><link>https://aanoaa.github.io/2012-02-27-backbon-dot-js-jsonp-collection-sync/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-02-27-backbon-dot-js-jsonp-collection-sync/</guid><pubDate>Sun, 26 Feb 2012 20:07:00 GMT</pubDate><content:encoded>&lt;p&gt;외부 도메인을 사용하고자 할때 &lt;code&gt;jsonp&lt;/code&gt; 를 이용해야 하는데,
이때, &lt;code&gt;Backbone.sync&lt;/code&gt; 메소드를 override 해서 쓸 수 있습니다.&lt;/p&gt;
&lt;p&gt;jquery &lt;code&gt;$.ajax&lt;/code&gt; 메소드의 옵션을 보면 &lt;code&gt;dataType&lt;/code&gt;을 &lt;code&gt;jsonp&lt;/code&gt;로 설정하면
&lt;code&gt;url&lt;/code&gt; 꽁지에 자동으로 &lt;code&gt;?callback=jqueryblablablabla_timestamp&lt;/code&gt;
query_parameter 를 추가해줍니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-coffeescript&quot;&gt;class MyCollection extends Backbone.Collection
  model: Log
  sync: (method, model, options) -&gt;
    options.dataType = &apos;jsonp&apos;
    Backbone.sync(method, model, options)

collection = new MyCollection
collection.url = &apos;http://otherdomain.com&apos;
collection.fetch # 요래하면 GET/ http://otherdomain.com?callback=jqueryblablablabla_timestamp
  success: (collection, response) -&gt;
    # do something
  error: (collection, response) -&gt;
    # error handling
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;서버로부터 응답은 요래 와야..&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jqueryblablablabla_timestamp(&amp;#x3C;stringifiedJSON&gt;)
&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title><![CDATA[bitlbee]]></title><description><![CDATA[근데 제가 BitlBee 를
사용하는 이유는 바로 이겁니다. BitlBee brings IM (instant messaging) to IRC clients. It's a great
solution for people who have an IRC…]]></description><link>https://aanoaa.github.io/2012-01-06-bitlbee/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-01-06-bitlbee/</guid><pubDate>Fri, 06 Jan 2012 09:49:00 GMT</pubDate><content:encoded>&lt;p&gt;근데 제가 &lt;a href=&quot;http://www.bitlbee.org/main.php/news.r.html&quot;&gt;BitlBee&lt;/a&gt; 를
사용하는 이유는 바로 이겁니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BitlBee brings IM (instant messaging) to IRC clients. It&apos;s a great
solution for people who have an IRC client running all the time and
don&apos;t want to run an additional MSN/AIM/whatever client.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;irc client 로는 emacs &lt;a href=&quot;http://www.emacswiki.org/emacs/ERC&quot;&gt;erc&lt;/a&gt; 를
사용합니다.&lt;/p&gt;
&lt;p&gt;메신져는 &lt;a href=&quot;http://www.google.com/talk/&quot;&gt;gtalk&lt;/a&gt; 을 씁니다.&lt;/p&gt;
&lt;p&gt;꼭 erc 를 사용하지 않더라도 bitlbee 를 통해, 선호하는 irc client
안에서 IM 서비스를 이용할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;설치&lt;/h2&gt;
&lt;p&gt;우분투에서..&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install bitlbee
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;사용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;irc client 설정파일에 localhost:6667 에 연결하도록 추가합니다.&lt;/li&gt;
&lt;li&gt;접속합니다.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;#x26;bitlbee 버퍼에 다음과 같이 설정합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ERC&gt; account add jabber username@gmail.com mypasswd talk.google.com:5223:ssl
ERC&gt; save
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;안될수도 있습니다.
저도 예전에 한번 설정하고 까먹엇거든요.
검색해서 잘 해보세요&lt;/p&gt;
&lt;p&gt;아무튼 접속되었으면 &lt;code&gt;ERC&gt; /query ID&lt;/code&gt; 해서 슥슥
대화합니다. 편리합니다. 좋습니다.&lt;/p&gt;
&lt;p&gt;누가 말시키면 그냥 버퍼 나뉘어져서 바로 보여요&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.bitlbee.org/img/comic_3.0.png&quot; alt=&quot;comic&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[org-mode]]></title><description><![CDATA[Google tasks remember the milk Tada list trello workflowy 그냥 excel 제가 그간 거쳐왔던 훌륭한 task 관리 툴입니다.
근데 저는 몇일 쓰다보면 못쓰겟더라고요. 그리고 얼마전에 emacs org…]]></description><link>https://aanoaa.github.io/2012-01-06-org-mode/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-01-06-org-mode/</guid><pubDate>Fri, 06 Jan 2012 05:55:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mail.google.com/mail/help/tasks/&quot;&gt;Google tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.rememberthemilk.com/&quot;&gt;remember the milk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tadalist.com/&quot;&gt;Tada list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trello.com/&quot;&gt;trello&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://workflowy.com/&quot;&gt;workflowy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;그냥 &lt;code&gt;excel&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;제가 그간 거쳐왔던 훌륭한 task 관리 툴입니다.
근데 저는 몇일 쓰다보면 못쓰겟더라고요.&lt;/p&gt;
&lt;p&gt;그리고 얼마전에 emacs &lt;code&gt;org-mode&lt;/code&gt; 라는 것을 알게 되었습니다. org-mode
참 좋습니다. pdf, excel, plain/text, html, latex, .. 으로 export 되고
단축키로 뿅뿅 눌러서 TODO 관리도 할 수 있고 emacs 안에서, 오프라인에서
일정관리도 되고, 태그도 되고, 해야할 일을 쉽게 내 todo 에 올릴 수도
있고요..&lt;/p&gt;
&lt;p&gt;기능도 많고 안되는게 없고 문서화도 아주 잘되어 있습니다 android,
iphone app 도 있습니다. 근데 배우고 알아야 할게 너무 많습니다.&lt;/p&gt;
&lt;p&gt;되돌아 보면, github issue 만 사용할때 가장 업무 효율이 높았던 것
같습니다.&lt;/p&gt;
&lt;p&gt;github 만세입니다.&lt;/p&gt;
&lt;h3&gt;결론은 버킹검&lt;/h3&gt;
&lt;p&gt;아아 뭔소리래..&lt;/p&gt;</content:encoded></item><item><title><![CDATA[picasa upload script]]></title><description><![CDATA[$HOME/.google.conf 에다가 자신의 계정 정보를 슥슥하고요. 이중보안 설정한 계정은 업로드 안됩니다. 제가 샘플로 올린 이미지 퍼블릭 링크입니다. 어쩌고저쩌고/s[SIZE]/파일명.jpg…]]></description><link>https://aanoaa.github.io/2012-01-03-picasa-upload-script/</link><guid isPermaLink="false">https://aanoaa.github.io/2012-01-03-picasa-upload-script/</guid><pubDate>Tue, 03 Jan 2012 14:18:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;$HOME/.google.conf&lt;/code&gt; 에다가 자신의 계정 정보를 슥슥하고요.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;이중보안 설정한 계정은 업로드 안됩니다.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ picasa-upload.pl &amp;#x3C;PHOTO.png&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/2011082200618_10.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;제가 샘플로 올린 이미지 퍼블릭 링크입니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;어쩌고저쩌고/s[SIZE]/파일명.jpg&lt;/code&gt; 으로 바꾸면 파일크기가 바뀌어서
보여집니다. 굳 :+1:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s72/2011082200618_10.jpg
https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s144/2011082200618_10.jpg
https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s200/2011082200618_10.jpg
https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s320/2011082200618_10.jpg
https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s400/2011082200618_10.jpg
https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s512/2011082200618_10.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;s72&lt;/li&gt;
&lt;li&gt;s144&lt;/li&gt;
&lt;li&gt;s200&lt;/li&gt;
&lt;li&gt;s320&lt;/li&gt;
&lt;li&gt;s400&lt;/li&gt;
&lt;li&gt;s512&lt;/li&gt;
&lt;li&gt;s576&lt;/li&gt;
&lt;li&gt;s640&lt;/li&gt;
&lt;li&gt;s720&lt;/li&gt;
&lt;li&gt;s800&lt;/li&gt;
&lt;li&gt;s912&lt;/li&gt;
&lt;li&gt;s1024&lt;/li&gt;
&lt;li&gt;s1152&lt;/li&gt;
&lt;li&gt;s1280&lt;/li&gt;
&lt;li&gt;s1440&lt;/li&gt;
&lt;li&gt;s1600&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;뭐 사이즈는 요로코롬 슥슥해서 쓰면 되겠죠.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/2011082200618_10.jpg&quot; alt=&quot;원본&quot;&gt;&lt;/p&gt;
&lt;p&gt;원본이고요&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s72/2011082200618_10.jpg&quot; alt=&quot;s72&quot;&gt;
&lt;img src=&quot;https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s144/2011082200618_10.jpg&quot; alt=&quot;s144&quot;&gt;
&lt;img src=&quot;https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s200/2011082200618_10.jpg&quot; alt=&quot;s200&quot;&gt;
&lt;img src=&quot;https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s320/2011082200618_10.jpg&quot; alt=&quot;s320&quot;&gt;
&lt;img src=&quot;https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s400/2011082200618_10.jpg&quot; alt=&quot;s400&quot;&gt;
&lt;img src=&quot;https://lh4.googleusercontent.com/-mmv40wXKaM4/TwMP0BKUVhI/AAAAAAAAABA/AM3KBgCuf8Q/s512/2011082200618_10.jpg&quot; alt=&quot;s512&quot;&gt;&lt;/p&gt;
&lt;p&gt;72, 144, 200, 320, 400, 512 입니다.&lt;/p&gt;
&lt;p&gt;파일 한개를 간편하게 올려서 요로코롬 크기를 조절해가면서 사용할 수
있습니다.
게다가 &lt;strong&gt;무료&lt;/strong&gt;! google++&lt;/p&gt;
&lt;p&gt;편리한 스크립트를 맨들어주시고 유용한 팁까지 알려주신
&lt;a href=&quot;https://twitter.com/pung96&quot;&gt;@pung96&lt;/a&gt;++ 님 감사합니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[sass &amp; scss]]></title><description><![CDATA[oops.scss 파일을 아래처럼 맨들고, 콤퓨타로 뭔가를 하면, oops.css 파일을 맨들어 줍니다. 이처럼 sass는 .sass 또는 .scss를 .css로 맨들어 줍니다. 장점으로는 oops.scss에서 @include border-radius…]]></description><link>https://aanoaa.github.io/2011-12-17-sass-and-scss/</link><guid isPermaLink="false">https://aanoaa.github.io/2011-12-17-sass-and-scss/</guid><pubDate>Fri, 16 Dec 2011 15:08:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;oops.scss&lt;/code&gt; 파일을 아래처럼 맨들고,&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-scss&quot; data-meta=&quot;oops.scss&quot;&gt;@import &quot;compass/css3&quot;;
#header,
#footer {
  margin: 0 auto;
}
.error {
  @include border-radius(5px);
  background-color: #dd0000;
  .important {
    border-width: 3px;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;콤퓨타로 뭔가를 하면,&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ sass --watch oops.scss:oops.css

or

$ compass watch /path/to/     # 끝판왕임 저는 이렇게 씀

or

# emacs scss-mode 쓰면 그냥 저장함과 동시에 변환할 수 있는데 compass
# 의 기능은 사용할 수 없음
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;oops.css&lt;/code&gt; 파일을 맨들어 줍니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot; data-meta=&quot;oops.css&quot;&gt;/* line 2, ../sass/oops.scss */
#header,
#footer {
  margin: 0 auto;
}

/* line 5, ../sass/oops.scss */
.error {
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  -o-border-radius: 5px;
  -ms-border-radius: 5px;
  -khtml-border-radius: 5px;
  border-radius: 5px;
  background-color: #dd0000;
}
/* line 8, ../sass/oops.scss */
.error .important {
  border-width: 3px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이처럼 &lt;a href=&quot;http://sass-lang.com/&quot;&gt;sass&lt;/a&gt;는 &lt;code&gt;.sass&lt;/code&gt; 또는 &lt;code&gt;.scss&lt;/code&gt;를 &lt;code&gt;.css&lt;/code&gt;로 맨들어 줍니다.&lt;/p&gt;
&lt;p&gt;장점으로는 &lt;code&gt;oops.scss&lt;/code&gt;에서 &lt;code&gt;@include border-radius(5px);&lt;/code&gt; 를 보듯이
함수와 변수를 사용할 수 있다는 것입니다. 코드의 중복을 막아주고(Don&apos;t
Repeat Yourself), 셀렉터들의 계층을 두어서 쉽게 작성할 수 있습니다.
&lt;code&gt;compass&lt;/code&gt;를 함께 사용하면 이미 흔하게 사용되고 있는 선조들의 &lt;code&gt;best practice&lt;/code&gt;를 &lt;code&gt;import&lt;/code&gt; 해서 쓸 수 있습니다.&lt;/p&gt;
&lt;h1&gt;설치 및 사용&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ gem install sass compass    # 저는 compass도 씀
$ compass create /path/to/Your-Awesome-Project/
# config.rb 를 수정하고, stylesheets, sass, images 등의 경로를
# 프로젝트 환경에 맞게 바꿔줍니다. rails 라면 필요없어 보입니다.
$ compass watch .    # config.rb 있는 곳을 지정해 줘야 합니다.
# scss 파일을 수정하면 css 파일에도 반영됩니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;저는 &lt;code&gt;config.rb&lt;/code&gt; 를 다음과 같이 변경해서 사용중입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rb&quot; data-meta=&quot;config.rb&quot;&gt;http_path = &quot;/&quot;
css_dir = &quot;static/css&quot;
sass_dir = &quot;static/sass&quot;
images_dir = &quot;static/images&quot;
javascripts_dir = &quot;static/scripts&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;그밖에..&lt;/h1&gt;
&lt;p&gt;emacs &lt;a href=&quot;http://www.emacswiki.org/emacs/ScssMode&quot;&gt;scss-mode&lt;/a&gt;를 사용하면 watcher 를 띄우지 않고도
저장과 동시에 &lt;code&gt;css&lt;/code&gt;파일을 맨들 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(add-to-list &apos;load-path &quot;~/.emacs.d/vendor/scss-mode&quot;)
(require &apos;scss-mode)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://blueprintcss.org/&quot;&gt;blueprint&lt;/a&gt;와 같은 grid framework 와 함께 사용할 수
있습니다. 저는 그렇게 쓰고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;octopress&lt;/code&gt; 도 &lt;code&gt;scss&lt;/code&gt;사용합니다.&lt;/p&gt;
&lt;h1&gt;결론&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;ruby&lt;/code&gt; 모듈이자 툴입니다. 저희 회사는 &lt;code&gt;perl&lt;/code&gt;로 개발합니다만 물론
사용할 수 있습니다. 너무나도 훌륭한 오픈소스 입니다.&lt;/p&gt;
&lt;p&gt;훌륭한 개발환경을 가지고 있고, 프로그래밍에는 능숙하지만, &lt;code&gt;css&lt;/code&gt;만
잡으면 한없이 약해지는 분들이라면 간단한 &lt;code&gt;scss&lt;/code&gt;문법을 공부하고
&lt;code&gt;compass&lt;/code&gt;툴 사용법을 익혀서 써먹으면 좋을 것 같습니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[emacs mo-git-blame mode]]></title><description><![CDATA[프로젝트 환경 silex라는 조그마한 회사를 댕기고 있습니다. 소스관리는 git사용하고 있고요, 내부에도 gitosis를
운영하고 있긴 하지만, 주요 프로젝트는 github 유료 서비스를
사용하고 있습니다. 이슈 관리도 github…]]></description><link>https://aanoaa.github.io/2011-12-02-emacs-mo-git-blame-mode/</link><guid isPermaLink="false">https://aanoaa.github.io/2011-12-02-emacs-mo-git-blame-mode/</guid><pubDate>Fri, 02 Dec 2011 06:07:00 GMT</pubDate><content:encoded>&lt;h2&gt;프로젝트 환경&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.facebook.com/silexkr&quot;&gt;silex&lt;/a&gt;라는 조그마한 회사를 댕기고 있습니다.&lt;/p&gt;
&lt;p&gt;소스관리는 &lt;a href=&quot;http://git-scm.com/&quot;&gt;git&lt;/a&gt;사용하고 있고요, 내부에도 &lt;a href=&quot;http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way&quot;&gt;gitosis&lt;/a&gt;를
운영하고 있긴 하지만, 주요 프로젝트는 &lt;a href=&quot;https://github.com/&quot;&gt;github&lt;/a&gt; 유료 서비스를
사용하고 있습니다. 이슈 관리도 &lt;a href=&quot;https://github.com/&quot;&gt;github&lt;/a&gt;에서
합니다. (버그질라를 사용하는 프로젝트도 있습니다)&lt;/p&gt;
&lt;h2&gt;코드리뷰&lt;/h2&gt;
&lt;p&gt;아주 느슨합니다.
repo 접근 권한이 있다면 누구나 commit, push 할 수 있습니다.
코드 리뷰는 push후에 프로젝트 참여자가 알아서 합니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;이건 요래서 그지같고, 저건 조래서 다시해라, 발로 썻냐 등등..&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;좋은 얘기도 합니다만, 지적질이 대세를 이루죠.&lt;/p&gt;
&lt;p&gt;몇일전에는 바로 옆에서 &lt;a href=&quot;https://twitter.com/#!/jeen_lee&quot;&gt;jeen&lt;/a&gt;님이 그지같이 썻다고 해서
소주병 나발을 불기도 하고 뭐 그랬습니다.&lt;/p&gt;
&lt;h2&gt;git blame&lt;/h2&gt;
&lt;p&gt;누가 무슨 짓 했는지 다 알 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;519aaa9b (yongbin       2011-07-23 23:23:33 +0900 1) #!/bin/sh
686cb0fb (Yongbin Yu    2011-09-24 15:58:03 +0900 2) TRUNNER_CONFDIR=t/selenium \
2b3e6736 (Hyungsuk Hong 2011-10-13 11:25:22 +0900 3) plackup -Ilib -s Starman -p 3000 -a best_web.psgi --access-log /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;문제점 그리고 새로운 인력의 투입&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;push 했을때 review 하지 못하고 그냥 넘길때가 있습니다(많습니다)&lt;/li&gt;
&lt;li&gt;프로젝트 중간에 커밋터 보급받았을때&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;남이 써놓은 코드를 열었는데 그지 같으면 말해줘서 바로 잡아야 합니다.
쓰다보니 거지 같아서 &lt;code&gt;git blame&lt;/code&gt;으로 살폈는데 제 코드일 수도 있습니다.&lt;/p&gt;
&lt;p&gt;뭐 어찌됐든 이 일련의 과정을 커맨트라인으로 하려면 불편합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;while(1) {
    $ git blame oops
    $ git log 72ddf38
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;a href=&quot;http://www.vim.org/&quot;&gt;vim&lt;/a&gt; vs &lt;a href=&quot;http://www.gnu.org/s/emacs/&quot;&gt;emacs&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;@JEEN_LEE,  about 2 hours ago:
예를 들어 vim 으로 특정 코드부분을 주시한다고 할 때, 어.. 이거 누가
고쳤지 하는 부분이 있는데... 그때마다 blame 으로 파일을 지정해서
찾아보는 데, 그 라인에서 어떻게 바로 뿅하고
알 수 있게끔 하는 거 없을까.. // from Twitter for iPhone [Seoul,
Korea]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;조금 찾아 봤는데 뭐 그런거 없습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;@semtlnori,  18 minutes ago:
@JEEN&lt;em&gt;LEE :exe &quot;!git blame -L&quot;.line(&quot;.&quot;).&quot;,&quot;.line(&quot;.&quot;).&quot; -- %&quot; 이거
단축키 바인딩해서 쓰는 방법도 대충 될듯요. // from web [Seoul] in
reply to JEEN&lt;/em&gt;LEE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;@semtlnori: ㄱㅅ&lt;/p&gt;
&lt;p&gt;회사에서 저만 &lt;a href=&quot;http://www.gnu.org/s/emacs/&quot;&gt;emacs&lt;/a&gt;씁니다.
&lt;code&gt;해서&lt;/code&gt;, 찾아봤더니 &lt;a href=&quot;https://github.com/voins/mo-git-blame&quot;&gt;mo-git-blame&lt;/a&gt;이 있었습니다.&lt;/p&gt;
&lt;h2&gt;mo-git-blame&lt;/h2&gt;
&lt;h3&gt;설치&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.emacs.d/vendor/mo-git-blame/mo-git-blame.el&lt;/code&gt;을 두었습니다.&lt;/p&gt;
&lt;h3&gt;설정&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;;; mo-git-blame
(add-to-list &apos;load-path &quot;~/.emacs.d/vendor/mo-git-blame&quot;)
(require &apos;mo-git-blame)
(global-set-key [?\C-c ?g ?c] &apos;mo-git-blame-current)
(global-set-key [?\C-c ?g ?f] &apos;mo-git-blame-file)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;사용법&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;파일을 열고 작업을 합니다.&lt;/li&gt;
&lt;li&gt;거지같은 코드를 발견합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-c g c&lt;/code&gt;(command git current 의 약자인듯..)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;커맨드를 마구마구 입력하면서 확인합니다.&lt;/p&gt;
&lt;p&gt;  TAB
l
s
Ctrl + n
Ctrl + n
Ctrl + n
TAB
l
...&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;내가 했던거면 말없이 수정하고, 남이 한거면 &lt;em&gt;Scratch&lt;/em&gt; 에 메세지를
남겨두거나 바로 지적질 합니다.(아직 어케 할지 몰겟네요)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;결론&lt;/h1&gt;
&lt;h1&gt;vim 이 뭐져?&lt;/h1&gt;</content:encoded></item><item><title><![CDATA[termiator]]></title><description><![CDATA[terminator를 사용하면 emacs를 쓰지 않고도 하나의 window 내에서 여러개의 terminal 을 사용할 수 있습니다. install ubuntu: 기본적으로 등록되어 있는 keybinding 은 아래와 같습니다. Ctrl + Shift…]]></description><link>https://aanoaa.github.io/2011-11-10-termiator/</link><guid isPermaLink="false">https://aanoaa.github.io/2011-11-10-termiator/</guid><pubDate>Wed, 09 Nov 2011 20:59:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://launchpad.net/terminator/+download&quot;&gt;terminator&lt;/a&gt;를 사용하면 emacs를 쓰지 않고도 하나의 window 내에서 여러개의 terminal 을 사용할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;install&lt;/h2&gt;
&lt;p&gt;ubuntu:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install terminator
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기본적으로 등록되어 있는 keybinding 은 아래와 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Shift + O&lt;/code&gt; 수평분할&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl + Shift + E&lt;/code&gt; 수직분할&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Crtl + Shift + Z&lt;/code&gt; 최대화 토글&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Alt + 방향키&lt;/code&gt; 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여러개의 로그를 동시에 볼때 유용합니다.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Blogging basics]]></title><description><![CDATA[http://pages.github.com/ http://octopress.org/docs/ http://octopress.org/docs/blogging/ http://octopress.org/docs/configuring/ http…]]></description><link>https://aanoaa.github.io/2011-10-27-blogging-basics/</link><guid isPermaLink="false">https://aanoaa.github.io/2011-10-27-blogging-basics/</guid><pubDate>Wed, 26 Oct 2011 19:38:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://pages.github.com/&quot;&gt;http://pages.github.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://octopress.org/docs/&quot;&gt;http://octopress.org/docs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://octopress.org/docs/blogging/&quot;&gt;http://octopress.org/docs/blogging/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://octopress.org/docs/configuring/&quot;&gt;http://octopress.org/docs/configuring/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://octopress.org/docs/deploying/&quot;&gt;http://octopress.org/docs/deploying/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;new post&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;rake new_post[&quot;Blogging basics&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;source/_posts/YYYY-MM-DD-blogging-basics.markdown&lt;/code&gt; 파일이 맨들어짐&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
layout: post
title: &quot;Blogging basics&quot;
date: 2011-10-27 04:38
comments: true
categories: octopress               # 여러개도 가능함   ex: [one, two, three]
published: false                    # optional for draft
author: [Yongbin Yu, Keedi Kim]     # optional for multiple author
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.markdown&lt;/code&gt; 대신에 &lt;code&gt;.html&lt;/code&gt; 로도 맨들 수 있음&lt;/p&gt;
&lt;h3&gt;generate, preview and deploy&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;rake generate
rake watch
rake preview    # http://localhost:4000/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://pow.cx/&quot;&gt;POW&lt;/a&gt; 라는 것도 이용할 수 있는가 보네 멋진뎅&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rake deploy
git add .                       # 여기부턴 optional, 하는게 좋겟지
git cm -am &quot;what the commit&quot;
git push origin source
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;source/_posts/YYYY-MM-DD-blogging-basics.markdown&lt;/code&gt; 의 전체 내용&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
layout: post
title: &quot;Blogging basics&quot;
date: 2011-10-27 04:38
comments: true
categories: octopress
---

- [http://octopress.org/docs/](http://octopress.org/docs/)
- [http://octopress.org/docs/blogging/](http://octopress.org/docs/blogging/)
- [http://octopress.org/docs/configuring/](http://octopress.org/docs/configuring/)
- [http://octopress.org/docs/deploying/](http://octopress.org/docs/deploying/)

### new post

    rake new_post[&quot;Blogging basics&quot;]

`source/_posts/YYYY-MM-DD-blogging-basics.markdown` 파일이 맨들어짐

    ---
    layout: post
    title: &quot;Blogging basics&quot;
    date: 2011-10-27 04:38
    comments: true
    categories: octopress               # 여러개도 가능함   ex: [one, two, three]
    published: false                    # optional for draft
    author: [Yongbin Yu, Keedi Kim]     # optional for multiple author
    ---

`.markdown` 대신에 `.html` 로도 맨들 수 있음

### generate, preview and deploy

    rake generate
    rake watch
    rake preview    # http://localhost:4000/

[POW](http://pow.cx/) 라는 것도 이용할 수 있는가 보네 멋진뎅

    rake deploy
    git add .                       # 여기부턴 optional, 하는게 좋겟지
    git cm -am &quot;what the commit&quot;
    git push origin source
&lt;/code&gt;&lt;/pre&gt;</content:encoded></item><item><title><![CDATA[hello world]]></title><description><![CDATA[hello world hello world]]></description><link>https://aanoaa.github.io/2011-10-27-hello-world/</link><guid isPermaLink="false">https://aanoaa.github.io/2011-10-27-hello-world/</guid><pubDate>Wed, 26 Oct 2011 19:16:00 GMT</pubDate><content:encoded>&lt;h1&gt;hello world&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;hello world&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-perl&quot;&gt;#!/usr/bin/env perl
print &quot;hello world\n&quot;;
&lt;/code&gt;&lt;/pre&gt;</content:encoded></item></channel></rss>