2012-02-27

NODE.JS : 파일 MD5SUM 구하기

기본 모듈 crypto 를 이용해서 파일의 md5sum 을 구하는 스크립트를 만들어보자. 별도로 제공이 안되므로 직접 만들어써야 한다. 일단 아래와 같이 만들어보면 md5 뿐만 아니라 sha1 에 대한 checksum 을 쉽게 구할 수도 있을 것이다.
  • 동기IO를 이용한 방법 (파일을 조금씩 읽어서 처리하는 방법) => Windows 에서는 에러가 발생하고 제대로 실행되지 않는다. 원인을 찾아보려고 했으나, 알 수가 없다. 혹시 누구 아시는분? node.js v0.6.11 에서 문제가 있었으나, v0.6.12 에서 잘 되고 있다.
    var fs     = require('fs');
    var crypto = require('crypto');
     
    var filename = 'walk_test.js';
    function md5sum(filename) {
      var genChecksum = null;
      var checksum = crypto.createHash('md5');
      var bytesRead = 1;
      var pos = 0
      var buffer = new Buffer(1024*64); // 64Kbyte
      var fd = fs.openSync(filename, 'r');
      var data = null;
      while (bytesRead > 0) {
        bytesRead = fs.readSync(fd, buffer, 0, buffer.length, pos);
        pos += bytesRead;
        if (bytesRead === buffer.length) {
          checksum.update(buffer);
        } else {
          data = buffer.slice(0, bytesRead);
          checksum.update(data);
        }
      }
      fs.closeSync(fd);
      genChecksum = checksum.digest('hex');
      return genChecksum;
    }
    
    console.log('checksum is : ' + md5sum(filename));
    
  • 동기IO를 이용한 방법 (파일은 한번에 읽어서 처리하는 방법) ⇒ 주의 : 한번에 큰 파일을 읽어서 처리하므로, 메모리를 많이 소모하게 될 것이다.
    var fs     = require('fs');
    var crypto = require('crypto');
     
    var filename = 'walk_test.js';
     
    function md5sum(filename) {
      var genChecksum = null;
      var checksum = crypto.createHash('md5');
      var data = fs.readFileSync(filename);
      checksum.update(data);
      genChecksum = checksum.digest('hex');
      return genChecksum;
    }
     
    console.log('checksum is : ' + md5sum(filename));
    
  • 비동기IO를 이용한 방법
    var fs     = require('fs');
    var crypto = require('crypto');
     
    var filename = 'walk_test.js';
    var genChecksum = null;
    var checksum = crypto.createHash('md5');
    var fin = fs.ReadStream(filename);
    fin.on('data', function(data){
      checksum.update(data);
    });
     
    fin.on('end', function(){
      genChecksum = checksum.digest('hex');
      console.log('checksum is : ' + genChecksum);
    });
    

2012-02-23

nvm 이용하여 여러 버전의 node.js 설치하기

node.js 에도 Ruby 의 rvm 와 비슷한 툴이 제공됩니다. 바로 nvm 이지요.

설치방법은 아래와 같습니다. (FreeBSD에서는 ./nvm/nvm.sh 를 열어서 make 를 gmake 로 바꾸어주고 사용합니다.)

$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ echo 'source ~/.nvm/nvm.sh' >> ~/.profile; source ~/.profile
$ nvm install v0.6.11
$ nvm use v0.6.11
$ nvm alias default v0.6.11
$ node -v
v0.6.11
이외에도 아래의 툴들도 고려해볼 만 하니 살펴봐주세요.
  • https://github.com/isaacs/nave
  • https://github.com/visionmedia/n
  • http://pypi.python.org/pypi/nodeenv/

2012-02-17

more(less) ANSI Color 제대로 보여주기

보통 Linux 나 FreeBSD에서 ls 명령어를 이용하면 파일/디렉토리 속성에 따라서 다양한 ANSI Color 로 나오게 되어 있다.


목록이 좀 긴 경우, more (or less) 를 이용해서 한 화면씩 끊어서 보게 되는데, 어떤 경우, ANSI 제어문자가 그대로 나오며, 색깔이 전혀 표시되지 않는 경우도 발생하는데, 보는데 상당히 괴로워진다. 다음은 ls -al | more 를 실행한 화면이다.


이것을 Color가 제대로 나오게 하려면 more (or less) 에 -R 옵션을 추가해주면 된다. ls -al | more -R 과 같이 해주면 다음과 같이 정상적으로 색깔이 잘 나오게 될 것이다.



2012-02-15

FreeBSD 9.0 에서 pysqlite 설치

보통 pysqlite 를 설치하려면, pip install pysqlite 명령을 이용해서 쉽게 할 수 있다. 그러나, FreeBSD 9.0 에 pythonbrew를 이용해서 직접 python 을 설치한 경우에는 sqlite3 의 include, library 경로의 문제로 바로 되지 않는다. 이 때문에 직접 소스를 받아서, 올바른 경로를 설정하고 설치해주어야 한다.

설치 순서는 아래와 같다.

$ pkg_add -r sqlite3
$ wget http://pysqlite.googlecode.com/files/pysqlite-2.6.3.tar.gz
$ tar xvfz pysqlite-2.6.3.tar.gz
$ cd pysqlite-2.6.3
$ vi setup.cfg
include_dirs=/usr/local/include
library_dirs=/usr/local/lib
$ python setup.py install

2012-02-13

JRuby 1.6.6 인코딩 관련 버그

오랜만에 JRuby 를 PC에 설치해보고 테스트하려고 설치하고 간단히 jruby -v 명령을 실행하는데, 에러를 뱉어낸다.


뭔가 하고 찾아보니, 인코딩 관련 버그라고 한다.
관련 버그에 대한 내용은 http://jira.codehaus.org/browse/JRUBY-6398?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel#issue-tabs 에서 찾아볼 수 있으며, 1.6.7 에서는 해결될 것이라고 한다. 조만간 릴리즈한다고는 하던데~

그 전까지는 1.6.6 을 삭제하고 1.6.5 를 받아서 다시 설치해서 사용해야 할 듯 싶다.

참고로, Linux/FreeBSD 등에서는 기본 인코딩을 UTF-8을 사용하고 있는데, 별 문제 없이 잘 동작되는 것 같다.

2012-02-09

FreeBSD 에 Scala 설치하기

이번에는 FreeBSD에 Scala 설치하는 방법을 알아보자.
  • 우선, bash 와 openjdk 가 설치되어 있다고 가정한다. bash 의 Path는 /bin/bash 여야 한다.
  • 직접 다운로드 하여 설치하는 방법
    $ cd
    $ wget http://www.scala-lang.org/downloads/distrib/files/scala-2.9.1.final.tgz
    $ tar xvfz scala-2.9.1.final.tgz
    $ mv scala-2.9.1.final scala
    $ echo 'export PATH=$PATH:$HOME/scala/bin' >> ~/.profile
    $ source ~/.profile
    $ scala -version
    Scala code runner version 2.9.1.final -- Copyright 2002-2011, LAMP/EPFL
    
  • 패키지로 설치하기
    $ pkg_add -r scala
    $ scala -version
    Scala code runner version 2.9.1.final -- Copyright 2002-2011, LAMP/EPFL
    
    FreeBSD 9.0 에서 패키지로 설치하는 경우 다음과 같이 에러가 발생하지만, 먼저 openjdk 를 설치해 놓으면 문제 없이 실행된다. 찝찝한 생각이 들면 직접 다운로드하여 설치하자.
    Error: Unable to get ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-9.0-release/All/jdk-1.6.0.3p4_27.tbz: File unavailable (e.g., file not found, no access)
    

FreeBSD 에서 Java 사용하기

기존에 Sun JDK 를 사용하려면 많이 불편했었지요. FreeBSD 에서도 OpenJDK 를 사용할 수 있습니다. 설치는 아래와 같이 간단합니다.

# pkg_add -r openjdk7
# mount -t fdescfs fdesc /dev/fd
# echo "fdesc   /dev/fd         fdescfs         rw      0       0" >> /etc/fstab

혹시라도 JAVA_HOME 을 잡아주어야 하는 상황이라면, 아래와 같이 잡아주시면 되겠습니다.

export JAVA_HOME="/usr/local/openjdk7"

이제 실행해보면

# java -version
openjdk version "1.7.0"
OpenJDK Runtime Environment (build 1.7.0-root_2011_12_03_14_00-b00)
OpenJDK Client VM (build 21.0-b17, mixed mode)

어때요? FreeBSD 에서도 OpenJDK 덕분에 Java 환경을 쉽게 구성할 수 있어서 좋네요~