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



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

ps.
유지보수는 없습니다.
소스가 간략하오니, 추후 소스 공개하면 수정해서 쓰세요 ㅎㅎ;
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



어제 짬짬히 구글코드잼 2009 에 참가해서 문제를 풀었는데, 2문제 밖에 못 풀었네요. 머리가 엄청 굳었나 봅니다. 늦게 풀기 시작한데다가 중간에 병원 갔다오고 잡무를 처리했는데도, 시간 카운트를 다 하네요 ㅎㅎ

33점만 넘으면 Qualification Round는 통과하니 별 문제 없겠지만, 이 다음 round 부터 통과하려면 2시간 내에 풀 수 있는 문제와 없는 문제를 후딱 선별해서 푸는 능력이 필요할 듯 합니다.

누구나 다 그렇겠지만, 코딩보다는 문제해석과 적당한 알고리즘을 선택하는게 시간이 걸리네요. 특히 전 문제해석이 너무 오래 걸리는 것 같아요. 이번에 1번과 3번 문제를 풀었는데, 1번은 금새 풀었지만 3번 문제를 특히나 아주 살짝 잘못 이해해서 왜 오답이 나오는지 모르고 오답 제출을 8번이나 하는 추태를 보였답니다 ㅠㅜ; 이 다음 목표는 round 1 통과인데, 과연 잘 되려나 모르겠네요 ^^;
AND

며칠 전에 다움위젯뱅크에 등록했던 워크3 profiler 위젯을 iGoogle에도 등록했습니다.

등록해서 왼쪽 블로그 메뉴에도 달아놨어요 ^^;

음, 그런데 다움과 구글이 widget api가 전혀 다르군요.

다움에서 쓰던 소스가 그대로 구글에도 잘 될 줄로만 알았는데, gadgets api를 모두 바꿔야하는군요.

제 경우는 아래 정도만 수정을 하면 되었지만, 다른 분들은 수정사항이 더 많겠죠?
  • gadgets.Prefs --> _IG_Prefs
  • gadgets.io.makeRequest --> _IG_FetchContent
  • gadgets.util.registerOnLoadHandler --> _IG_RegisterOnloadHandler
그리고, google gadget editor는 창이 너무 작아서 불편하더군요.
또한 서버가 울나라에 있지 않아서 그런지 MyGadgets에서 cached를 uncheck해도, 소스의 업데이트가 굉장히 늦더라구요.. ㅠㅜ;

하여간 우여곡절 끝에 iGoogle에 등록한 제 위젯의 주소입니다.
http://www.google.com/ig/directory?url=hosting.gmodules.com/ig/gadgets/file/103836370352707363627/warcraft3.xml

AND

어제 위젯=가젯 컨퍼런스에 다녀왔습니다.
9시에 끝나서 좀 피곤한 것 이외에는 재미있었고, 도시락도 맛있었고, 매우 유익한 행사였습니다 ^^;
그 외에도 구글코리아의 이해민 Product Manager님은 예전에 저희 회사에 오실 뻔도 하신 분이고 개발자 출신인걸로 알고 있는데 Product Manager를 하고 계셔서 깜짝 놀랐습니다. 그 외에도 서명덕 기자님 등등 유명하신 분들도 많이 오셔서 간만에 눈팅을 많이 했네요.

Track1 (컨퍼런스위주), Track2(실습위주)의 2 가지 트랙으로 운영이 되었는데요. 전 가만히 앉아 있는 것을 좋아하는지라 Track1에서 x구루형이랑 가만히 앉아서만 있었습니다.
모든 분들이 발표를 잘 하셨지만, 아무래도 그 중 가장 으뜸은 마지막으로 발표하신 위자드웍스의 표철민 대표이신듯합니다. 개발자 위주로 포진되어있는걸 감안하여... 무엇이 돈되는지에 대해 알려주시고, 웹위젯 뿐만 아니라 보다 광의의 위젯에 대해서도 잘 설명해 주셨습니다 ^^;

다른 분들은 사진도 많이 찍어서 올리시던데, 전 그냥 방금 만든 초간단 위젯으로 대신하겠습니다. --;

이제 본론으로 들어가면, 위젯=가젯 컨퍼런스에 다녀온 기념으로 초간단 위젯 하나를 만들어 봤습니다.
서비스 마인드 같은건 제게 없으므로, 복잡하지 않고 그냥 재미 위주의 위젯으로 만들었답니다.

두둥... 바로, 워크래프트3 profiler !
워크래프트3의 초상화와 레벨을 간단히 표시해주는 위젯이죠.
정말 간단하죠?

대략 아래와 같은 생김새입니다.

dspshin
Level 9

당연히 UserPrefs로 ID, gateway를 입력할 수 있습니다 :)

Ps1.
그런데, 다움 위젯 뱅크에 등록을 했는데 !
이거 진행상황도 알수가 없고, 등록이 된건지 알수가 없네요..
너무 불편해요, 고쳐주세요 !

Ps2.
iGoogle에도 위젯 등록하는게 쉽지 않더군요.
저같은 초보는 머... 올리다가 gg 치겠어요...
AND

루아를 대체 어디에 써야할지 궁금해 하시는 분들이 있을 것 같아서, 간단하게 정리해 봅니다.

루아의 특징을 아주 간단히 보면, 다음과 같습니다.
  • 가볍고 빠릅니다.
  • 잘 붙습니다.
즉, 사이즈가 가볍고 속도가 빠릅니다.
또한 glue 언어로 불리는 만큼 embed 하기가 쉽습니다.
물론 이러한 장점 뒤에는 라이브러리가 다소 빈약하다는 단점이 있긴 합니다만...

현재 주로 사용되고 있는 분야는 게임분야입니다.
우리나라 게임에서도 많이 쓰이고, 현재 가장 성공한 게임인 WOW(World of Warcraft)에서도 쓰이고 있죠.
물론 게임 분야 뿐만 아니라 embedded 쪽에서도 사용되고 있습니다. 징가(Ginga)라는 데이터방송 규격에서도 사용되고 있죠.

물론, 꼭 이렇게 대단한 데만 쓰일 필요는 없습니다.

제가 그동안 관여했던 일에 쓸만한 곳을 생각해 보면 다음과 같이 활용할 수 있을 것입니다.
  1. 큰 프로그램 내에서 환경설정 파일을 읽기 위한 수단으로 사용될 수 있습니다.
    예를 들면, 예전에 제가 있었던 Acedb(embedded dbms의 일종)팀에서 환경설정 파일을 읽어들이는데 사용할 수 있습니다. 큰 환경설정 파일을 사용자가 마음대로 고칠 수 있고 동적으로 읽으려면 lex&yacc을 써야하겠죠. 그러나 루아를 이용하면 비교적 쉽게 붙일 수 있으며, 환경설정 파일 내에서 연산은 물론 간단한 함수까지도 쓸 수 있게 됩니다.

  2. Command-line utility를 쉽게 만들어 낼 수 있습니다.
    이 것도 루아를 사용하면, Acedb와 같은 엔진에 command-line utility를 매우 쉽게 붙여낼 수 있습니다. 1번과 마찬가지로 파싱을 다 하는 것보다는 효율이 매우 좋죠. wrapper 함수만 만들어서 연결해 주면 된답니다.

  3. 이번 건, 제가 현재 하는 일과 약간 상관이 있는데요.
    현재 우리나라의 Mobile domain에서 어플리케이션을 만드려면 좀 귀찮은 점이 많고, c/c++로 하려면 코드량이 많아집니다.(코드를 보면 ㅎㄷㄷ합니다...)
    mobile app에서 lua를 쓸 수 있도록 지원이 된다면 모든면에서 좀더 편해질텐데 말입니다.
    (간단하게 실험을 해봤는데 그리 어려울 점은 없어 보이네요)

    물론 이와 유사한 일을 nokia는 1등 기업답게 이미 하고 있답니다.(python for s60)
자, 이정도면 루아가 어떻게 쓰일 수 있는지 감을 어느 정도 잡으셨겠죠?



AND

Google AJAX Language API가 나왔다는 소식을 듣고,
제 블로그에도 한번 적용해 보았습니다.

각 포스트의 하단에 보면 아래 스샷과 같이 "Translate to English..."라는 버튼이 있습니다.



이 버튼을 누르면 아래 스샷과 마찬가지로 영어로 번역된 결과가 펼쳐집니다.



구현은 거의 할게 없었으며, 스킨을 약간 수정하고,
단순히 google api를 부르기면 하면 되네요.

그런데 tag가 달린 상태로 html 입력문자열을 던지거나, 자세히 세어보지는 않았지만 입력이 약 1KBytes 이상이 되면 뻗어버리더군요.
그래서 어쩔수 없이 <br>태그를 구분자로 나눠서 나머지 html tag들은 간단하게만 제거해서 입력인자로 주었습니다.
( 고로 이미지 등의 태그는 모두 날라가고 영어로 번역한 결과만 나옵니다. )

헤더의 소스는 다음과 같습니다.



마지막으로, 번역을 하기 위한 소스를 가져오기 위해서 아래와 같이 "source"와 "translation"의 위치를 지정해 줍니다.
<div id="source"></div>
<div id="translation"></div>
전 textcube를 쓰기 때문에 본문의 치환자인 를 "source"로 지정해 주었습니다.
물론 More/Less를 위한 부분이 추가적으로 있지만, 그 부분은 취향차에 따라 다르게 가져가시면 될듯 합니다.

음, 그런데 생각보다 번역 결과가 구리네요.
제가 너무 한국말을 이상하게 써서 그런지, 거의 결과가 알아볼 수 없는 수준으로 나옵니다...
구글이 쓰는 통계적 방식이라면 이런 것도 다 잘 처리해야 하는거 아닌가요 --?
약간 실망했습니다... ^^;

ps.
그리고 번역 결과를 보시려면, 블로그 main과 같이 여러 글이 포스팅되어있는 화면에서 누르면 제일 위의 글에 대한 결과만 나옵니다. 각각의 포스트로 가서 번역 버튼을 눌러야 제대로 동작합니다~
귀차니즘의 부작용이죠 ㅎㅎ...
AND

Mediawiki 설치

개발/기타 2008. 2. 15. 16:42
Mediawiki를 설치해 봤습니다.

자세한 설정법은 http://www.mediawiki.org/wiki/Manual:Installing_MediaWiki/ko 를 참조하면 됩니다.

저는 mediawiki-1.11.1을 설치했는데, 그냥 설치하게 되면 위키가 보이기는 하는데,

여기저기 #ifeq 등 ParserFunctions 등이 없다며 지저분하게 나오네요.

이를 해결하기 위해서는 mediawiki extension을 설치해야 합니다.

자세한 설치과정은 http://www.mediawiki.org/wiki/Manual:Extensions 에 나와있습니다만, 정리하면...

svn checkout http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/ 를 수행한 후,
( 물론 ParserFunctions만 설치해도 된다 )

LocalSettings.php 파일 내에 다음을 추가한다.
require_once "$IP/extensions/ParserFunctions/ParserFunctions.php";
AND

Google Chart API

개발/기타 2007. 12. 7. 13:46
구글이 chart api도 open 했습니다.

그동안은 그래프를 그리려면 포토샵으로 저장한 다음에 파일을 올리고 그담에 링크를 걸어야 했는데...

이제는 그냥 이 api를 이용하면 되겠네요.



http://code.google.com/apis/chart/

데이터의 길이 제한과 크기에 대한 제한이 있어서 좀 불편한 점이 있습니다만,
없는거 보다야 훠~얼씬 낫겠습니다.

이 api를 이용해서 아래 글인 [Python] 웹페이지 내에서 원하는 부분 가져오기.의 차트를
얼추 비슷하게 그려보자면 다음과 같이 나옵니다.



데이터 크기에 대한 제한이 있어서 다음과 같이 값을 좀 수정해야 했습니다...
http://chart.apis.google.com/chart?cht=lc&chs=300x100&chf=bg,s,efefef&chco=0000ff&chd=t:28,12,10,80,80,80,82,72,62,66,25,15,19,17,37,47,51,51,51,65,49,43,47,61,51,31,45
AND