멜버른에도 많은 개발자 모임이 활성화되어 있고 세션이 운영되고 있는데 그 중 MPUG(Melbourne Python Users Group)에서 매월 첫주 월요일에 열리는 meetup에 처음으로 다녀왔다. 장소는 협업 공간인 Inspire9이고 Richmond역에서 3분 정도 거리에 있다.

Don’t do this! — Richard Jones

어떤 방식으로 파이썬 코드를 작성해야 하는가에 대한 세션으로 동일한 내용을 PythonAU 2013에서 진행했었다고. 많은 코드 예제들과 함께 어떤 방식으로 작성하면 좋은지에 대해 세세하게 설명해줬다. 디버깅을 위한 q1와 Java와 같은 방식으로 overload할 수 있게 도와주는 Overload2에 대한 이야기3가 인상적이었다.

Show and Tell: The Great Language Game — Lars Yencken

근래 여러번 트윗에 남겼던, Great Language Game에 대한 세션. 멜버른 대학교에서 개발한 langid.py를 이용하면 해당 문자열이 어떤 언어로 작성되었는지 알 수 있는데 그걸 음성 데이터를 불러와 어떤 언어인지 판단하도록 만들었다고. 슬라이드에 개략적인 내용이 잘 정리되어 있다.

HN에 뜬 이후 방문자에 엄청 몰렸는데 geventflask로 문제 없이 잘 버티고 있다는 후기를 메일링 리스트에 남겼다.

PyPy.js: towards a fast and compliant python shell for your browser — Ryan Kelly

이 날 가장 핫한 주제였던 PyPy.js는 주제도 흥미로웠고 내용도 재미있었다. 발표자는 현재 모질라에서 일하고 있다고. asm.js이라는 low-level subset이 있는데 슬라이드에서처럼 asm.js + PyPy = PyPy.js의 아이디어로 시작했다고 한다. 시연에서 실제로 구동하는 모습을 보여줬는데 Python 표준 라이브러리를 포함해 275MB 크기(…)의 js가 나오고 그걸 구동하는데 FF가 스피너마저 굳는 모습을 보여줬지만 신기하게 잘 동작했다.

JIT에 대한 설명도 있었는데 내가 JIT에 대해 잘 몰라서… 이렇게 깊은 얘기까지 할 줄 몰랐다.

나도 처음 들었을 때 똑같은 의문이 들었는데 역시나 사람들이 물어봤다. 이거 완전 멋지다. 근데 왜만듬ㅋ? 답변도 역시, 브라우저에서 되면 쿨하잖아? (쿨문쿨답)

일단 구현이 완료되고 실용적으로 쓸만큼 안정적인 환경이 된다면 Python을 웹으로 바로 포팅도 가능한데다 Firefox OS에서의 Python app까지 고려할 수 있을 만큼 재미있는 아이디어라고. 앞으로 가능성도, 수효도 분명 많을 프로젝트라는 설명.

생각 조각들

  • 처음이라 어색했지만 꾸준히 와야겠다는 생각. 그래도 분위기가 딱딱하지 않아서 좋았다.
  • 연령대가 상당히 다양했다.
  • 첫 세션에서 C API 부분까지 내려가서 이야기 하는 것을 보고, Python을 잘 하려면 C에 대해서도 잘 알아야겠구나 싶었다.
  • 다녀오기 전까지는 메일링 리스트에 가입되어 있어도 별 관심이 없었는데 다녀오니 내용도 재밌고 관심도 더 생겼다. 좋은 자극.

Footnotes

  1. q — pypi

  2. overload — pypi

  3. 딜리게이터를 이용해 overload를 할 수 있도록 구현해줬는데 다들 왜 이런게 필요하지? 식의 반응. Python 커뮤니티 답다.

When I installed W3 Total Cache, It was always problem with Comprehensive Google Map Plugin. Although W3 Total Cache is awesome plugin, I couldn’t use it for this problem. I spent time today and I found what problem is.

It was problem with JSON parsing. In W3 Total cache, every page minify by replacing space to new line(\n). So we can fix a code like below:

/plugins/comprehensive-google-map-plugin/assets/js/cgmp.framework.js

// CGMPGlobal.errors = parseJson(CGMPGlobal.errors);<br /> CGMPGlobal.errors = parseJson(CGMPGlobal.errors.replace(/\n/gi,""));

And then, wrapping jQuery. It need to be run after jQuery loaded.

jQuery(function(){ /* all code */ });

/plugins/comprehensive-google-map-plugin/assets/js/cgmp.framework.min.js

// find w(i) and then change to the code<br /> w(i.replace(/\n/gi,""))

Also wrapping jQuery in same way.

jQuery(function(){ /* all code */ });

I hope you get answer what you want.

얼마 전 생활코딩에서 즉시실행 익명함수라는 표현을 보고 깜짝 놀랐다. 근래에 JavaScript로 몇번 개발을 해봤다면 예제를 보면 이게 무슨 의미인지 바로 이해할 수 있겠지만 "이건 아무래도 과하지 않은가" 라고 생각했다. 이렇게까지 거창한(?) 이름이 붙는 내용이었나 하고.

개발을 배우다보면 첫눈에 이해하기 힘든 한자 조어들이 꽤 있다. 함수, 변수와 같은 용어도 프로그래밍 강의 첫시간에 나와서 쉽게 쓰는거지 그 자체로 상당히 어려운 용어다. 객체 생성자, 논리 연산자 정도는 어떤 내용을 정의한 단어인지 쉽게 이해(내지는 유추) 할 수 있지만 대리자, 비동기와 같은 단어는 쉽게 내용을 생각해내기 어렵다. 용어의 정의는 모두가 동의할 수 있고 그 정의한 용어가 해당 용례에 대한 대표성을 띌 수 있어야 한다. 용어 함의적이라면 문제가 생길 수 밖에 없다.

물론 개발에만 국한된 것이 아니라 대다수의 학문에서 사용되는 용어가 과도하게 한자로 조어되는 경향이 있다. 한자문화권이기에 이해도 되고, 서양-일본-한국의 경로로 학문이 들어오는 경우도 적잖은 영향이 있을듯 하다. 배경은 뒤로 밀어두고서 단순히 직역해 한자로 옮겨 조어를 만드는게 올바른가에 대해 좀 생각해볼 필요가 있다.

영어권 환경에서 일을 하다보니 가장 크게 느끼는, 한국과 다른 점은 용어에 대한 설명이 거의 필요 없을 정도로 쉽게 이해한다는 점이다. 디자이너도, 세일즈도, CS담당자도 모두 개발용어를 거침없이 쉽게 사용한다. 영어권이니까. 그 개발용어 자체로도 별다른 설명없이 알 수 있다는 것이 얼마나 큰 장점인지 모른다. 그런 언어적 이점에 명확한 설명을 선호하는 문화적 배경이 영어권 IT기업이 가지는 장점이라고 본다. (이와 관련해서는 적자면 내용이 더 많을 것 같아 여기까지)

단어만으로 더 쉽게 이해할 수 있는 개발언어 용어를 만들 순 없을까. 모두가 쉽게 이해할 수 있는 용어는 위에서 말한 것처럼 충분히 매력적이다. 한자어로 단어를 만들더라도 단순 사전식 직역 말고 보다 정서에 맞게 옮길 순 없을까. 앞서 언급한 즉시실행 익명함수를 예로 해보면, 함수란 원래 호출하면 바로 실행되는건데 즉시실행이란 표현도 좀 재미있는듯 하다. 익명함수는 어딘가에 선언 없이 바로 사용하는거니까, 임시함수 실행, 호출 정도가 되지 않을까. (하루종일 고민한 단어가 이 수준이라 아쉽긴 하지만;)


추가. 작성하고 나니 이전에 SICP 번역서가 생각났는데, 쉽게 풀어쓴 용어가 기존에 조금이라도 알고 있던 사람들에게는 요즘말로 멘붕을 야기했다는 후기. 차라리 한자로 쓴, 이전의 용어체계가 훨씬 이해하기 쉽다는 얘기였다. 쉽게 이해할 수 있는 용어는 매력이 있지만, 그런 용어의 정의는 역시 말처럼 쉽게 되지 않는다.

오랜만에 wp 사이트에 들어가서 좋은 테마 없나 찾자마자 튀어나온 새로운 테마 Twenty Twelve. 2012년 9월부터 제공했는데 여태껏 보지 못했다니 내가 너무 소홀했나보다.

이전 Twenty Eleven 과 같이 Responsive Design이 적용되어 있으며 테스트해본 결과 상당히 Twenty Eleven에 비해 훨씬 깔끔하고 이쁘다. 기본 글꼴도 Open sans로 설정되어 미려함을 더해준다.

Twenty Eleven에 Open Sans를 적용해 썼었는데 글꼴 자체가 이런 깔끔한 분위기에 더 맞는듯 하다. 오랜만에 정말 제대로 설레는 테마가 나온듯!

내려받기는 아래의 링크에서 가능하며 wp 대시보드에서도 당연히 바로 설치 가능하다.

http://wordpress.org/extend/themes/twentytwelve

몇번이고 키워드를 바꿔 검색해봤지만 나오질 않았다. 그래서 영어로 검색했더니 바로 나오는… 영어로 검색하면 커맨드 라인으로 추출하라느니 얘기가 많이 나온다. 혹시나 같은 고민 하는 분 있을까 싶어 글을 적어본다.

업데이트 또는 특정 이유로 인해 해당 리비전에서 업데이트 된 파일을 추출할 경우 TortoiseHg에서 아래와 같은 방식으로 처리할 수 있다.

screenshot

  1. 추출하고자 하는 리비전에서 우클릭 후 export > archive…
  2. 추출할 리비전을 선택
  3. Only files modified/created in this revision 체크
  4. 경로 설정… 나머지 필요것 설정 후 Archive

(이런 별 것 아닌 부분에 이렇게 시간을 허비할 줄은 몰랐다.)

맥에서는 Atlassian SourceTree를 사용하면 mercurial, git을 동일한 UI에서 사용할 수 있어 둘 다 별 차이 없는 기분으로 쓸 수 있지만 윈도우에서는 그렇게 멋진 도구를 아직 보질 못했다. 그래서 그나마 간편한 TortoiseHg 설치하고 사용하는 중이고 만족하는 편. 그렇게 복잡한 기능을 사용하고 있지 않아서 어떤 Version Control이든 크게 차이를 느끼지 못하고 있다.

Mercurial을 위한 서비스는 bitbucket에서 제공하고 있으며 소규모 개발을 위한 private 리포지터리도 무료로 준다. 로컬 작업용으로 많이 쓰고 있어서 bitbucket을 사용해본 적이 거의 없지만 GitHub를 조금이라도 본 적 있다면 상당히 비슷한 느낌으로 사용할 수 있다.

WordPress에 폼메일을 위한 강력한 플러그인이 참 많은데 그 중 contact form 7이 유명하기도 하고 편리하다. 이 폼메일과 mailchimp를 연동하기 위해 플러그인을 검색해봤지만 3rd party integration plugin은 있는데 영 사용하는 방법이 직관적이지 않아서 contact form 7 with mailchimp plugin을 만들게 되었다.

독립적으로 운영되는 plugin이 아닌 dependancy가 있는 plugin이지만 wordpress에서 기능 확장을 어떤 방식으로 하는지 알 수 있는 좋은 기회였다.

플러그인에서 가장 기본적인 방식은 hooking 인데 값을 변경하거나 프로세스를 추가하고 싶은 소스에서 do_action()을 찾아 메소드를 add_action()을 통해 붙여주면 hooking으로 실행되는 방식이다. 쉽게 생각해보면 소스에 일종의 색인이 있는데 그 색인에 기능을 연결해주면 그곳을 통과할 때 그 기능도 실행이 된다는 것.

더 나아가 워드프레스 플러그인 개발에 확장성을 고려한다면 do_action()을 메소드의 before, after 또는 각 프로세스 부분마다 미리 넣어주는 것이 중요하다.

워드프레스 관리자에 메뉴를 추가할 때도 submenu 관련 함수와 해당 메뉴에 접근했을 때 실행될 function을 연결(binding 하는 느낌으로..)하면 해당 메뉴가 생성되며 그 페이지로 들어갔을 때 해당 function이 실행이 된다.

워낙에 reference가 잘 되어 있어서 필요한 method는 금방 금방 검색해서 찾을 수 있었다.

filter도 mailchimp로 전송하는 내용을 치환하는 부분에서 사용하긴 했는데 기존 contact form 7에 것 그대로 사용해서 자세히 들여보지는 않았는데 callback method도 사용 가능한 것으로 보아… 모르겠다. 나중에 더 자세히 보고.

환경설정을 저장할 때는 get_config()랑 set_config()가 있는데 따로 데이터베이스 작업 없이도 알아서 저장된다. custom post type도 따로 작업 없이 가능하다.

각각의 contact form에 맞는 mailchimp 데이터를 저장하기 위해 custom post type을 사용했는데 해당 post를 잡아내 post_id를 가져오려는데 WP_Query()의 s 파라미터를 사용했다. 더 간편한 방법이 있을 것 같은데 문서 찾아봐도 잘 모르겠어서 그냥 while statement로 작업했다.

한두번 작업 더하면 익숙해져서 뭐든 할 것 같은 이 근거없는 자신감!

joomla에서도 플러그인 작업을 해봤는데 MVC로 구현할 수 있는 샘플 플러그인으로 작업했는데 모델, 컨트롤러, 뷰컨트롤러, 뷰 이렇게 4단계인 기분이었다. 줌라는 그냥 CI처럼 추가기능 개발하고 그냥 데이터베이스에 바로 쿼리 넣고 받아오고 이랬는데 wordpress는 wp만의 스타일을 느낄 수 있어서 좋았다.

drupal이나 magento도 경험해볼 기회가 왔으면 좋겠다.

늘 이것저것 테마를 사용해보곤 하지만 기본적으로 지원해주는 테마보다 깔끔한 것이 없는 기분이 들어 결국 이 테마를 설정하는데 오늘은 사진도 바꿔보고 색도 바꿔보고 했더니 정말 색다른 느낌!

2012년에 들어 하고싶은, 해야 할 계획도 참 많이 세워야지 하고 시작했는데 벌써 1월도 반이나 지나갔고 온전히 다이어리 앞에 마주하지 못해서… 올해에는 글도 열심히 쓰고 공부도 열심히 하는 한 해가 될 수 있으면 좋겠다.

java는 기껏해야 headfirst 한권 읽은 수준인데 tomcat 서버 설정을 하려니 막막했다. 검색을 해봐도 한글 문서는 흔치 않았고… 며칠 생각했는데 답은 그냥 레퍼런스에서 나오는 내용이었다. 바로 레퍼런스 봤으면 5분도 안되서 해결했을 내용 XP

tomcat에서 도메인을 기준으로 여러개의 사이트를 운영 즉, 가상호스트를 설정하려면 아래와 같이 하면 된다.

<Hostname="localhost" appBase="webapps"
  unpackWARs="true" autoDeploy="true"
  xmlValidation="false" xmlNamespaceAware="false">
</Host>
<Host name="www.testdomain.com" appBase="new_webapps"
  unpackWARs="true" autoDeploy="true"
  xmlValidation="false" xmlNamespaceAware="false">
</Host>

appBase 경로는 tomcat 경로를 기준으로 되어 있고 절대경로를 입력해줘도 된다. 그리고 ROOT라는 파일 또는 디렉토리가 default값으로 설정되는데 심볼릭 링크로 /home/아이디 식으로 주면 그쪽 파일로 연결된다. ftp 생각하면 유저 발급해주고 이렇게 걸어주면 편하다. (SVN 없는… 상황에서는;)

그런데 이렇게 걸었더니 문제가 www 없이 도메인을 입력하고 들어가면 not found가 되거나 localhost로 연결이 된다. 그냥 apache라면 alias를 지정해주면 되었는데… xml 형태라 어떻게 해줘야하나 몰라서 host를 동일하게 추가해보기도 했고 name에 와일드카드(*)를 넣어보기도 했다. 당연히 결과는…ㅋㅋ 답은 레퍼런스에서 찾았다.

<Host name="www.testdomain.com" appBase="new_webapps"
  unpackWARs="true" autoDeploy="true"
  xmlValidation="false" xmlNamespaceAware="false">
  <Alias>testdomain.com</Alias>
</Host>

다시금 레퍼런스의 중요함을 깨닫는 순간이었다;;

호스팅 서비스를 이용해보면 호스팅 아이디를 기준으로 생성된 파일들의 uid, gid가 설정된다. 별도의 모드를 설치해줘야 해당 방식대로 아파치를 운영할 수 있는데 apache1.x는 mod_become, apache2.x는 mod_ruid 또는 apache2-mpm-itk를 설치하면 된다. 각 VirtualHost마다 설정해주면 해당 유저 권한으로 생성/제어가 가능하다.

cafe24에서 서버 호스팅을 구입하면 세팅 연락이 오는데 추가 요청 시 아래와 같은 기본적인 사항을 설치해준다. centOS 5.x(x64) 서버 구입시 설치해준 항목이다.

httpd-2.2.20.tar.gz
iozone-3-327.src.rpm
iperf-2.0.5-1.el5.src.rpm
iperf-2.0.5-1.el5.x86_64.rpm
jfsutils-1.1.12-1.x86_64.rpm
mirrordir-0.10.49-1.2.el4.rf.x86_64.rpm
mysql-5.1.45.tar.gz
mysql-5.1.59.tar.gz
openssl-0.9.8d.tar.gz
php-5.2.16.tar.gz
qpopper4.0.13.tar.gz
reiserfs-utils-3.6.19-2.4.1.x86_64.rpm
smartmontools-5.37.tar.gz
ZendOptimizer-3.0.2-linux-glibc23-x86_64.tar.gz
ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz
ZendOptimizer-3.3.0a-linux-glibc23-x86_64.tar.gz
ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz

색상을 바꿔요

눈에 편한 색상을 골라보세요 :)

Darkreader 플러그인으로 선택한 색상이 제대로 표시되지 않을 수 있습니다.