팀내에서 node.js에서의 dbms에 대해 간략하게 정리할 일이 있어서 정리해봤습니다.


AND

jquery 내부 소스를 보면 이런 코드가 많다.


jQuery.each("a b c d e".split(" "), function( i, name ) {
        // do something
});

처음에는 귀찮게 뭐 이런걸다...란 마음으로 봤는데, 짜다보니 중복되는 코드를 상당히 줄일 수가 있어서 좋네.

예를 들면,
$("#a").text($.temp.a);
$("#b").text($.temp.b);
$("#c").text($.temp.c);
$("#d").text($.temp.d);
$("#e").text($.temp.e);

이런 스타일을 아래와 같이 줄여 버릴 수 있다.

jQuery.each("a b c d e".split(" "), function( i, n ) {
        $("#"+n).text($.temp[n]);
});

AND

4월26일 목요일에 월차내고 SW공학센터에 다녀왔습니다.


아래 사진은 광역 슬립 스킬을 시전하고 있는 모습입니다.

이런 대규모 강의에 익숙하지 않다보니 본의아니게 졸립게 만들어 들인듯 합니다. 아니면 전날 디아블로3 클로즈베타 시작일이라서 그런것이라 위로를...


ps. 이런 자리를 만들어준 강승준 책임, 땡큐~


AND

몇 주전에 기다리고 기다리던 jQuery mobile 1.1.0 stable 버전이 릴리즈 되었습니다. ( http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/ )

이거저거 바뀐 부분도 많지만, 개인적으로 흥미가 가는 부분은 transition 부분입니다.
transition이 부드럽고 빨라졌다고 써져 있긴 하지만, 실제로는 android에서의 transition은 거의 포기한 것과 마찬가지로 보입니다. 특히 slide 효과의 경우는 fade효과가 곁들여져 있는게 좋은지 없는게 좋은지는 device 혹은 상황마다 다르니 사용자가 알아서 써라!라는 뜻에서 slidefade라는 effect가 추가되었습니다.

slide를 쓸지 slidefade를 쓸지는 demo페이지만 해당 device에서 돌려봐도 금방 파악할 수 있는 문제이니, 잡설은 이정도에서 그치고, transition 코드 상에서의 흥미로운 변화를 살펴보도록 하죠.

1.1.0 RC2까지만 해도 transition handler는 1개만 존재했었는데, 1가지 종류의 handler로는 무리가 있는듯하여 2가지 종류의 default handler를 추가했습니다. 바로 sequential handler와 simulataneous handler입니다.
   
jquery mobile의 transition의 동작은, 다음과 같습니다. (내부함수명 기준)
startOut --> doneOut --> startIn --> doneIn

함수명에서 유추가능하듯이 startOut은 사라질 페이지에 대해 effect를 주는 함수이며, doneOut은 해당 effect가 끝나는 시점에 수행되서 마무리해주는 함수, startIn은 새로 전환되는 페이지에 effect를 주는 함수이고 doneIn은 새 페이지에 대한 effect가 끝날때 호출되는 함수입니다.
즉, page1에서 page2로 전환이 일어난다고 가정하면, 지금 말씀드린 순서로 수행될 경우에는 page1이 모두 사라지고 나서 page2가 나타나기 시작하는 것입니다. 이것이 sequential입니다.
그럼 simultaneous는 말그대로 동시에 모든 effect가 일어나는 것입니다. page1의 사라지는 효과와 page2의 나타나는 효과가 동시에 수행되는 것이죠.

아래 코드를 보시면, jqm 내부적으로 앞에서 이야기드린 두가지 handler를 사용하고 있는 것을 볼 수 있습니다.

// generate the handlers from the above
var sequentialHandler = createHandler(),
    simultaneousHandler = createHandler( false );

기본적으로는 sequential handler를 쓰지만,

// Make our transition handler the public default.
$.mobile.defaultTransitionHandler = sequentialHandler;

slide transition에 대해서만 simultaneous handler를 쓰는 것을 확인할 수 있습니다.

// Use the simultaneous transition handler for slide transitions
$.mobile.transitionHandlers.slide = $.mobile.transitionHandlers.simultaneous;

이정도만 이해하시면, 두 가지 핸들러를 자유자재로 선택해서 사용하실 수 있을 것입니다.

AND

며칠 전, 강의+자문 요청이 들어왔다.

그 업체에서 자사 엔진 위에 사용자 변경이 가능한 script를 올리고 싶은데, script 언어들에 대한 대략적인 소개 및 비교를 하고, 요구사항들에 대한 가능성, 디자인 등에 대한 조언을 요청한 것이었다.

남 앞에 서는것도 별로 안 좋아하고 방콕 스타일인 나에겐 일상적이지 않은 일이기에 심사숙고를 하다가, 진행하기로 결정하고 오늘 다녀왔다.

첫번째 시간은 2시간 동안 진행되는 강의세션, 두번째 시간은 2시간 동안 해당 프로젝트에 대한 논의 세션으로 진행했다. 개인적으론, 양쪽 모두 원하는 바를 얻은 유익한 시간이었다고 생각하고 있는 중이다... :)

아래 자료는 내가 맡은 부분들에 대한 발표자료들이다. 언젠가 쓸모 있지 않을까 해서 slideshare에 올려 놓았다 ㅎㅎ




ps. C binding쪽의 발표를 맡은 최동진선임도 밤 늦게까지 수고 많이 하셨어요.



AND

간만에 정규식에 대해서 정리할 일이 생겨서 블로그에도 정리해 봅니다. :)


정규식에는 greedy한 방식과 lazy(non-greedy)한 방식이 있습니다.

일예로 ".*"의 경우가 greedy한 방식입니다. 즉, 조건을 만족하는 한 가장 긴 문자열을 선택하려고 합니다.
그리고 반대의 경우, ".*?"의 경우가 lazy한 방식입니다. 조건을 만족하는 한 가장 짧은 문자열을 선택하려고 합니다.

음, 저도 써 놓고 보니 무슨 소리인지 모르겠네요 :)
예제를 살짝 바꿔서 돌려보면 차이를 이해하실 수 있을 것입니다.

아래와 같이 "<"과 ">"로 둘러싼 문자열을 greedy하게 선택해 보겠습니다.  (@python 2.6)

>>> import urllib
>>> html = urllib.urlopen('http://www.python.org').read()
>>> import re
>>> greedy = re.compile(r'<.*>', re.I|re.S)
>>> len( greedy.findall(html) )
1

엇, 결과 개수가 1개네요. 즉, <>로 둘러싼 가장 긴 문자열을 선택하려고 했으니 html 태그 전체를 선택하게 된 것을 보
실 수 있습니다.
이번에는 살짝 바꿔서 lazy하게 선택해 보겠습니다.

>>> lazy = re.compile(r'<.*?>', re.I|re.S)
>>> len ( lazy.findall(html) )
469

네, 이번에는 <>로 둘러싼 짧은 문자열을 선택했으니, 모든 태그들을 선택하게 되었습니다.


원문 : http://groups.google.com/group/python3/browse_thread/thread/c6c40a3738818d77
AND

그럴리 없겠지만,
회의하다가, 혹은 길 가다가,
문득! (SQLite3의) SQL문이 궁금해 진다!
두둥! 그럴때는 이 어플을 추천합니다! ㅋㅋ



AppStore URL : http://itunes.apple.com/us/app/sql-commandline-manager/id371881411?mt=8

ps.
유지보수는 없습니다.
소스가 간략하오니, 추후 소스 공개하면 수정해서 쓰세요 ㅎㅎ;
AND

만화 트윗봇

개발/python 2010. 4. 15. 13:26
요즘 제가 RSS보다 트위터를 자주 보는거 같아서, 만화전용 트윗봇을 런칭했습니다 --;
게다가 자주가던 번역 블로그들마저, 저작권에 걸려 추풍낙엽으로 떨어져 나가더라구요.

수집 대상 만화는 강철의 연금술사, 클레이모어, 나루토, 블리치, 헌터x헌터, 원피스입니다.
강철의 연금술사, 클레이모어는 1달에 1번 나오고
나루토, 블리치, 헌터x헌터, 원피스는 매주 금요일 정도에 나오네요.


이 만화들에 관심있으시면 팔로우 하세요~
http://twitter.com/hotmanga

다만 단점은 영문이라는 점과 만화선정이 제맘이라는... --;
감사합니다.
AND

이번에는 지난주 문제입니다. 이 문제는 milkelf님이 출제했습니다.

문제의 요는 다음과 같습니다.
word에 들어있는 1비트가 몇개인지 구하라입니다.
만약 9가 입력으로 들어오면 1001이므로 1은 2개가 있는 것입니다.
1000*30개의 입력에 대해서 수행하며 시간이 가장 빠른 사람이 이기는 룰입니다.
언어는 C로 제한됩니다.

기본으로 주어진 함수는 다음과 같습니다.
  1. int binw(int v)
  2. {
  3.  int i;
  4.  int x=v;
  5.  for(i=0;i<32;i++) {
  6.   if (x&1) sum+=1;
  7.   x = x >> 1;
  8.  }
  9.  return x;
  10. }
즉, 이 함수를 각자 최대한 성능향상을 꾀하는 문제입니다.

재미있는 것은 정말 답이 다양하게 나오더군요.

*. 비트연산을 테이블로 대체하는 분...
*. 1000개의 입력이 30번 반복되는 문제라, 답을 저장해서 쓰는 분.
*. inline, register, 함수없애기 등의 노력을 하는 분.
*. 그외 다음과 같이 알고리즘을 바꾸는 후보들도 있었습니다.
  1. while(x) {
  2.  sum+=1;
  3.  x = x & (x-1);
  4. }
아래와 비슷한 답도 있었으나 여기 설명이 더 자세하고 이해하기 편한듯하여 따로 paste합니다. 이 방법이 가장 빨랐다네요...
http://www.experts-exchange.com/Programming/Algorithms/Q_23629662.html
  1. unsigned int v; // count bits set in this (32-bit value)
  2. unsigned int c; // store the total here
  3. static const int S[] = {1, 2, 4, 8, 16}; // Magic Binary Numbers
  4. static const int B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF};
  5.  
  6. c = v - ((v >> 1) & B[0]);
  7. c = ((c >> S[1]) & B[1]) + (c & B[1]);
  8. c = ((c >> S[2]) + c) & B[2];
  9. c = ((c >> S[3]) + c) & B[3];
  10. c = ((c >> S[4]) + c) & B[4];

여러분은 뭘로 푸셨을 것 같나요? :)

AND

몆 주 전부터 몇 명이 모여서 아주 간단한 코딩퀴즈를 하고 있습니다. 업무에 지장을 주면 안되기 때문에 쉬는시간에 풀 수 있는 수준의 문제여야 합니다. 즉 출제자가 생각하기에 총 1시간 미만(점심시간+저녁시간) 정도가 걸릴 것으로 예상되는 문제를 내야 하죠.

이번 문제는 again4you님이 내 주셨고, 다음과 같았습니다.
*과 -로 이루어진 M by N의 직사각형 지뢰밭 지도를 파일로부터 입력 받고, (M,N<10, *=지뢰, -=땅)
출력은 각 칸에서 인접한 지뢰가 있는지를 숫자로 나타내면 됨.
예를 들면, 아래와 같은 입력이 들어온 경우,
*---
----
-*--
----
결과는 다음과 같아야 합니다.
*100
2210
1*10
1110

언어는 C,C++,Java, python, bash shell 등 아무거나 써도 되지만,
문제 조건에 속도도 따진다고 하여 c로 결정했습니다. ㅠㅜ; (난 파이썬이 좋은데...)
시간나면 다른분들 답도 슬슬 살펴봐야겠습니다~~ :)

제 답은 다음과 같습니다.


  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6.     FILE* fp;
  7.     char buf[20];
  8.     char result[11][11];
  9.     int x,y,x1,y1, xLimit, yLimit;
  10.    
  11.     for(x=0;x<10;x++)
  12.         for(y=0;y<10;y++)
  13.             result[x][y]=48;
  14.  
  15.     y=0;
  16.     fp = fopen(argv[1], "rt");
  17.     while(fgets(buf, 20, fp)!=NULL) {
  18.         xLimit = strlen(buf);
  19.         // ignore whitespace;
  20.         if (buf[xLimit-1]=='\n') xLimit--;
  21.  
  22.         for(x=0;x<xLimit;x++){
  23.             if (buf[x]=='*'){
  24.                 result[y][x] = '*';
  25.                 // inc around
  26.                 for(y1=(y-1>=0)?y-1:0; y1<=y+1; y1++){
  27.                     for(x1=(x-1>=0)?x-1:0; x1<=x+1; x1++) {
  28.                         if (result[y1][x1]!='*') result[y1][x1]++;
  29.                     }
  30.                 }
  31.             }
  32.         }
  33.         y++;
  34.     }
  35.     fclose(fp);
  36.  
  37.     // print result
  38.     yLimit = y;
  39.     for(y=0;y<yLimit;y++){
  40.         for(x=0;x<xLimit;x++){
  41.             printf("%c", result[y][x]);
  42.         }
  43.         printf("\n");
  44.     }
  45. }
AND