12월 182013
 

BOINC0

지금으로 18개월 전 대학원 연구실에서 일을 하고 있을 때, 컴퓨터를 켜놓고 작업을 하는 일이 많았다. 논문을 읽기위해 인쇄를 하여 보고, 모르는 부분에 한하여 컴퓨터로 찾아보았기 때문이다. 그러다 보니 컴퓨터는 그냥 무심히 아무작업도 안하며 켜져있는 경우가 많았고, 이렇게 남아도는 컴퓨터 자원을 통하여 어떻게 세상에 도움이 될 수 없을까란 생각을 하게 되었다. 컴퓨터 분산컴퓨팅에 대한 논문을 읽으면서 봤던 BOINC라고 하는 시스템이 떠올랐다.

최초에 BOINC1는 SETI@HOME이라고 하는 외계생명체를 찾기 위한 프로젝트의 일부였다. BOINC는 자원봉사자들의 컴퓨터 자원(CPU, Memory, 그래픽카드 등)을 연구목적으로 이용하기 위한 프로젝트였다. 인터넷만 연결이 되어 있다면 컴퓨터로 계산해야하는 프로젝트의 일부를 자원봉사자의 컴퓨터로 전송하고 설정한 값(CPU 사용률 제한, 네트워크 제한, 작업시 실행 안함 등등)에 따라서 작업을 수행하고, 결과물을 프로젝트 서버에서 수거하는 것이었다. 사람들의 흥미를 끌기 위해서 Credit이라고 하는 봉사자의 자원을 사용한 양을 포인트로 돌려주고, 팀으로 뭉쳐서 활동을 할 수 있게 함으로써 선의적 경쟁을 유도하는 것이었다. 지금은 돈이 되지 않기 때문에 자원봉사자의 도움이 필요한 여러분야(수학, 물리학, 기상학, 의학 등등)의 프로젝트가 운영되고 있다.

자원봉사자들은 단지 컴퓨터에 BOINC 홈페이지에서 프로그램을 다운로드 받고, 어떤 프로젝트를 지원할 것인지 설정만 하면 된다. 다른 작업을 하고 있을 때 속도가 느려지는 것이 걱정이라면 설정에서 그 부분을 바꾸면 된다. 너무 부담을 가지고 시작할 필요는 없는 것이다. 대부분 듀얼CPU이상의 컴퓨터를 사용하면서 게임을 하지 않고 단순한 작업만 하는 것이라면 같이 실행시켜도 문제는 없다.

만약 자원봉사자로 참가한다면 얻을 수 있는 이득은 여러가지가 있는다. SETI@home 프로젝트의 경우 만약 외계생명체를 발견하게 된다면 이를 발견하는데 도움을 준 자원봉사자도 함께 이름이 남게 된다는 점이 참가하게 하는데 매우 고무적이다. Einstein@Home의 경우 링크와 같은 인증서를 발급해 주기도 한다.

어떠한 프로젝트에 참여할지 난감한 경우가 많은데 이것은 한국 위키2를 통해서 확인 가능하다. 필자의 경우는 “Einstein@Home”과 “NFC@Home” 그리고 “LHC@home 1.0″에 참여하고 있다. 꾸준히 한 결과 560,000크레딧을 모았고 지금도 계속 올라가고 있다. 딱히 보상이 없더라도 참여하고 있는 프로젝트에 도움이 되고 있다는 사실 만으로도 충분히 지원할 이유가 된다고 생각한다. 프로젝트 참여 방법은 아래의 링크를 참여하면 된다.

참고링크

(1) SETIKAH@KOREA(한국 SETI팀) , http://cafe.naver.com/setikah)
(2) SETI 프로젝트 참여 방법, ( http://goo.gl/AKntP )


  1. BOINC ( Berkeley Open Infrastructure for Network Computing ),http://boinc.berkeley.edu/
  2. Wikipedia (SETI@home),http://ko.wikipedia.org/wiki/SETI@home
12월 162013
 

루비(Ruby)언어 정리

소스코드를 통하여 주요한 기능만 확인해보고 넘어간다.

클래스와 객체

class Car
    @@run_car = 0  # 클래스 변수 / static 변수

    attr_reader :pos    # 읽기 전용 속성(attribute)
    attr_writer :pos    # 쓰기 전용 속성
    attr_accessor :light # 읽기/쓰기 가능 속성

    def initialize(color) # 생성자
        @color = color  # @는 멤버변수 없는 것은 지역변수
    end

    def get_color
        return @color
    end

    def get_run_car
        return @@run_car
    end

    def Car.run(num)  # 클래스 메소드 | static 함수
        @@run_car += num
    end

    def id_car()  # id_car값 반환 접근자 메소드
        @id_car
    end

    def id_car=(id_car)  # pos값 쓰기 접근자 메소드
        @id_car = id_car
    end

protected # 메소드 공개 범위 (JAVA와 같음)
    def alaram
    end

private # 메소드 공개 범위 (JAVA와 같음)
    def check 
    end
end

class SuperCar < Car   # 상속
   def initialize(color)
       super(color)  # 부모 생성자 호출
   end

   def get_color
       return "red"
   end
end

supercar = SuperCar.new("blue") # 인스턴스 생성
Car.run(100) # 클래스 메소드 호출 

모듈

module Computer
    def Computer.buy(com)
        puts com + " buy"
    end

    class CPU
        def CPU.run
            puts cpu + " run"
        end
    end
end

include "computer.pb" # 외부 루비 파일 입포트
Computer.buy "Alpha"
Computer::CPU.run   # module의 class는 ::을 이용하여 접근한다.

모듈 혼합

module LeftClick
    def lclick
        puts "Left Clicked"
    end
end

module RightClick
    def rclick
        puts "Right Clicked"
    end
end 

class Mouse
    include LeftClick
    include RightClick
end

mouse = Mouse.new() # Mouse는 LeftClick, RightClick 2가지 기능이 혼합된다. (다중상속), Module은 인스턴스 생성이 불가하나 Mouse는 class이므로 가능
12월 162013
 

루비(Ruby)언어 정리

조건문

if

if Boolean [then | :]
   code1
[elsif Boolean [then | :]
   code
]...
[else
   code ]
end
  • Boolean : 식의 Return 값이 Boolean형인 결과 값
  • code1 : 조건(Boolean)이 참일 경우 실행
  • elsif : elseif 가 아니고 elsif인 것에 주의할 것

unless

if문과 반대로 작동함

unless Boolean [then | :]
   code1
[else
   code ]
end
  • Boolean : 식의 Return 값이 Boolean형인 결과 값
  • code1 : 조건(Boolean)이 거짓일 경우 실행

if/unless를 수식어 형태로 사용

puts "true" if res > 100 : 100보다 클 경우 true를 출력

puts "false" if new <= 100 : 100 이하일 경우 false를 출력

case 문

case value
when expression [, comparision]... [then | :]
   code
when expression [, comparision]... [then | :]
   code
.
.
.
[else
    code]
end

조건에 알맞는 value값에 대해 when의 조건에 맞는 것을 실행함

goal = 100
case goal
when 95..100
    puts "A+"
when 90...95
    puts "A"
when 85...90
    puts "B+"
when 80...85
    puts "B"
when 75...80
    puts "C+"
when 70...75
    puts "C"
else
    puts "F"
end

위와 같은 형식으로 Range와 함께 사용 가능

? 연산자

condition ? true : false 형식으로 이용.

예제: res = r >= 70 ? "pass" : "fail"

순환문

while

while condition [ do | : ]
   code
end 

condition의 조건이 참일 경우에만 실행

until

until condition [ do | : ]
    code
end

condition의 조건을 만족할 때 까지 실행

while/until의 수식어 형태 사용

value += 10 until value == 100

value += 1 while value < 100

for

for variable [, variable]... in collection [do | :]
    code
end

collection을 차례대로 variable에 넣으면서 code를 실행한다.

  • 예제 1
for value in 1..10
   data += value
end
  • 예제 2
for data in ["I", "love", "you"]
   puts data
end

Ruby Iterator

collection do |variable|
   code
end

collection의 내용을 variable에 하나씩 넣으면서 code를 실행. 아래는 이를 사용한 예제.

data = ["Hello", "World", "!!"]
res = ""

0.upto(grades.length - 1) do |loop_index|
    res = data[loop_index] + " "
end

puts res
  • 0.upto(n) : 0부터 n까지 순환문을 만듬
  • 10.downto(0) : 10부터 0까지 값을 감소시키며 순환
  • 2.step(11, 3) : 11까지 2부터 3씩 증가시키는 순환문 작성(예 : 2, 5, 8, 11)
  • 5.times : 5회 반복
  • data.each : data가 컬렉션이면 모든 항목들을 순서대로 가져옴
  • loop : 무한 루프 (break문을 통해서 반복문 탈출)

반복문에서 사용할 수 있는 구문

  • break : 반복문을 탈출
  • redo : 반복문의 현재 단계를 한 번 더 실행
  • next : 다음 단계를 실행함 (C++/JAVA++의 continue와 같음)
  • retry : 반복문을 처음부터 다시 시작

메소드 정의

hello란 이름의 메소드 정의

def hello
   puts "Hello World!!"
end

사용 방법은 hello라고 하는 것 만으로 가능

  • 메개변수 전달방법
def hello(name)
   puts "Hello World!!, " + name
end

hello "Gildong"
  • 가변 개수
def hello(data, *others)
    puts data + "!! Hello World!! " + others.join(", ")
end

hello "Ruby", "Gildong", "Gilsoon", "Cheolsoo"

Ruby에서 *는 배열이라는 뜻임. 파라미터를 넘길 경우에도 사용 가능

  • 메소드 값을 리턴
def sum(a, b)
    return a + b
end
  • 2개 이상의 값 리턴
def sum_minus(a, b)
    return a+b, a-b
end
arr = sum_minus(30, 20)   # 배열 형태
s, m = sum_minus(30, 20)  # 각각 리턴값이 s, m으로 리턴
  • 변수의 유효 범위

동일 이름일 경우에 매소드 내부가 최우선

  • 블록 (block)

메소드에 파라미터(Parameter)처럼 전달될 수 있는 코드를 말함, {}를 이용하여 작성

{ puts "Hello World!!" }

또는

do
   puts "Hello World!!" 
end

형태로 작성 가능함

yield문을 이용하여 블록을 실행할 수 있다.

def hello
    yield
end

hello { puts "Hello World!!" }
  • 블록에 데이터 전달
def hello
   yield "Ruby", "Gildong"
end

hello { |word1, word2| puts word1 + " Hello World!! " + word2 }

||안에 있는 변수에 차례대로 데이터가 전달된다.

  • 반복자와 함께 블록 사용
["Hello", "World", "!!"].each {|word| puts word}
4.times {puts "!"}
  • BEGIN/END 블록
BEGIN {puts "Hi "}

puts "Hello World!"

END { puts "Bye!" }

Ruby 프로그램이 메모리에 올라갈 때 BEGIN 블록이 실행 되며 종료 될 때 END 블록이 실행된다.

12월 152013
 

숫자를 쓰는 몇가지 방법

  • 3.14
  • 31415.9e-4
  • 123456789
  • 12_345_678_910
  • 0x3D3A

문자열 (아래는 같은 문자열임)

  • “Hello World”
  • ‘Hello World’
  • %q!Hello World!
  • %Q!Hello World!
  • %q/Hello World/
  • %{Hello World}

HERE 문서 기능

print << HERE
Hello 
World 
!!
HERE`

1번째 줄의 HERE부터 마지막줄 HERE까지 하나의 문자열로 봄
즉 자동으로 개행문자를 붙여 줌

상수/변수

  • 대문자 Only : 상수
  • 그 이외 : 변수

큰따옴표 문자열 안에 변수 값 삽입

puts "My name is #{name}." #{}를 이용하여 해결한다.

간단한 입출력 예제

print please enter your name: 
gets
chomp
puts "Your name is #{$_}."
  1. gets$_에 키보드로 입력한 문자열을 저장한다.
  2. chomp$_ 뒤에 개행 문자를 제거한다.
  3. #{$_}를 입력받은 결과물을 출력한다.

심볼

C언어 enum에서 쓰는 값과 유사한 것이다. :data와 같은 형식으로 이용한다.

C언어와 다른 연산자

  • ** : Exponential(누승)
  • <=> : 작으면 음수, 같으면 0, 크면 양수 반환
  • == : 같다
  • === : case문의 when절에서 사용하는 동치 연산자
  • =~ : 정규 표현식 패턴 검사 연산자
  • defined? : 어떤 심볼이 정의되어 있으면 참
  • begin, end : 블록 표현식
  • if, unless, while, until : 실행문

배열 첨자 차이

array\[start, count] : 리턴값은 start부터 갯수 만큼의 원소를 가져온다.

해 쉬

res = {"first" => "Gildong", "last" => "Hong"} : 형식으로 사용

res["first"] : res에서 first라는 값을 가져온다

범 위(range)

1..4 : 1, 2, 3, 4

1...4 : 1, 2, 3

배열 변환

.to_a 라는 메소드를 이용

  • (1..4).to_a : [1,2,3,4]
  • (1...3).to_a : [1,2,3]

오름차순을 이용해야 배열로 변환 가능

12월 132013
 

윈도우에서 mysql2 ruby gem이 아래와 유사한 이유로 설치가 안되는 경우 해결방법. (rails4, ruby2 에서 확인)

Building native extensions. This could take a while…
ERROR: Error installing mysql2:
ERROR: Failed to build gem native extension.C:/Ruby200-x64/bin/ruby.exe extconf.rb
checking for ruby/thread.h… yes
checking for rb_thread_call_without_gvl() in ruby/thread.h… yes
checking for rb_thread_blocking_region()… yes
checking for rb_wait_for_single_fd()… yes
checking for rb_hash_dup()… yes
checking for rb_intern3()… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lm… yes
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lz… no
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lsocket… no
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lnsl… no
checking for mysql_query() in -lmysqlclient… no
checking for main() in -lmygcc… no
checking for mysql_query() in -lmysqlclient… no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options.

Provided configuration options:
–with-opt-dir
–without-opt-dir
–with-opt-include
–without-opt-include=${opt-dir}/include
–with-opt-lib
–without-opt-lib=${opt-dir}/lib
–with-make-prog
–without-make-prog
–srcdir=.
–curdir
–ruby=C:/Ruby200-x64/bin/ruby
–with-mysql-dir
–without-mysql-dir
–with-mysql-include
–without-mysql-include=${mysql-dir}/include
–with-mysql-lib
–without-mysql-lib=${mysql-dir}/
–with-mysql-config
–without-mysql-config
–with-mysql-dir
–without-mysql-dir
–with-mysql-include
–without-mysql-include=${mysql-dir}/include
–with-mysql-lib
–without-mysql-lib=${mysql-dir}/
–with-mysqlclientlib
–without-mysqlclientlib
–with-mlib
–without-mlib
–with-mysqlclientlib
–without-mysqlclientlib
–with-zlib
–without-zlib
–with-mysqlclientlib
–without-mysqlclientlib
–with-socketlib
–without-socketlib
–with-mysqlclientlib
–without-mysqlclientlib
–with-nsllib
–without-nsllib
–with-mysqlclientlib
–without-mysqlclientlib
–with-mygcclib
–without-mygcclib
–with-mysqlclientlib
–without-mysqlclientlib
Gem files will remain installed in C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/mysql2-0.3.14 for inspection.
Results logged to C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/mysql2-0.3.14/ext/mysql2/gem_make.out

 

 1. 이 유


1. mysqlclient 또는 mysql connector가 설치되어 있지 않기 때문

2. mysql connector가 설치되어 있다 하더라도 경로 지정이 안되있는 경우

 

2. 해결방법


1) mysql c connector를 설치한다. [http://dev.mysql.com/downloads/connector/c/] (설치되어 있는 경우 생략)

2) 아래와 같은 방법으로 설치한다. 굵은 글씨 부분은 mysql connector가 설치된 환경에 맞게 수정한다.

C:\>gem install mysql2 –platform=ruby — ‘–with-mysql-lib=”C:\Program Files\MySQL\MySQL Connector C 6.1\lib” –with-mysql-include=”C:\Program Files\MySQL\MySQL Connector C 6.1\include”‘

 

Reference

[1] http://stackoverflow.com/questions/5836959/cant-install-mysql2-for-rails-3-on-windows

12월 032013
 

OSX에는 알프레드(http://www.alfredapp.com/)라는 앱이 있습니다. 이 앱은 쉽게 키보드로 여러 기능을 빠르게 실행할 수 있게 해줍니다. 기본적인 기능은 무료 버전을 다운로드 받으시면 됩니다. 하지만 Alfred에 기능(워크플로우)을 추가할 수 있는 기능은 따로 파워팩을 구매해야만 합니다.

이 앱을 사용하다 보니 네이버 검색이나, 사전에서 같은 것을 쉽게 쓸 수 있었으면 좋을 것 같다는 생각을 하게 되었습니다. 기존에 자동완성은 되지 않지만 브라우져 창을 열어 주는 것은 기존에 있었습니다. 저는 자동완성도 되길 원했기 때문에 간단히 만들어 보았습니다. 그리고 작성한 코드는 github에(https://github.com/Kuniz/alfnaversearch) 공개하였습니다.  아래 링크에서 다운 받으면 됩니다.

다운로드 

사용하면서 버그나 추가적으로 필요하신 기능같은게 있다면 댓글을 달아주세요. 가능한 범위 내에서 적용하도록 하겠습니다.

[수정 2014-04-18 01:32+0900] shasing님, 이재호님께서 제보해주신 부분 중 자동완성 후 브라우져 작동시 잘 못되는 문제 해결하였습니다.
[수정 2014-04-18 01:38+0900] shasing님께서 말씀하신 일본어 한자 자동완성 기능도 추가하였습니다.
[수정 2014-04-22 01:32+0900] shasing님께서 말씀하신 일본어 자동완성 버그 수정하였습니다.
[수정 2014-05-18 18:26+0900] 1. 국빵님께서 요청하신 중국어 자동완성 기능 넣었습니다.  2. 라이브러리 성능을 개선하였습니다. 기존에 쓰시던 분들도 다시 받아주세요 ㅎㅎ 3. 중국어 자동완성에 있어서 한글로 입력을 했을 때 한글로만 나오는건 네이버 중국어 사전 자동완성 기능이 그 부분만 제공하기 때문입니다 ㅠㅠ
[수정 2014-07-23 12:07+0900] 독일어, 한자사전 추가됬습니다.
[수정 2014-11-08 16:36+0900] 프랑스어 추가 및 링크 깨진 것 수정 하였습니다.
[수정 2016-07-02 01:26+0900] norux님이 워크플로우에 한글 디렉토리명이 있는 경우에 대한 버그 수정 기여해주셨습니다~ 감사합니다.  버그 수정한 버전 업로드 되어 있습니다!
[수정 2016-10-01 01:09+0900] 이탈리아어 사전 추가했습니다.
[수정 2016-10-15 22:30+0900] 러시아어, 스페인어, 태국어, 베트남어 사전 추가했습니다.
[수정 2016-12-11 15:07+0900] 러시아어, 스페인어, 태국어, 베트남어 사전 추가했습니다.
[수정 2016-01-01 16:05+0900] 중국어 사전 자동완성 결과 개선
[수정 2017-07-25 03:45+0900] 연관 프레임워크 업데이트 (시에라 백그라운드 버그 해결)

[수정 2017-12-14 02:06+0900] 독일어사전 API주소 변경

[수정 2021-01-01 12:38+0900] 네이버 자동완성 API주소 변경
[수정 2021-08-23 01:15+0900] 24개 언어 추가 및 일본어 사전 자동완성 주소 변경

[수정 2021-10-20 12:00+0900] 네이버 쇼핑 자동완성 적용

[수정 2022-01-04 01:50+0900] 각종 버그 수정 및 macos 등 지원 강화

[수정 2022-01-28 01:17+0900] na명령 버그 수정 및 영영사전 추가

[수정 2022-02-09 01:53+0900] python2/3 지원. @kw-lee 님 감사합니다 🙂 -> macOS 12.3에서 안될시 python3 설치 후 다운받아주세요.
 

[수정 2022-04-06 01:22+0900] 자동완성의 상세내용을 cmd+C 로 클립보드 복사되도록 기능 추가

사용방법


 na 명령 : 네이버 일반 검색을 수행합니다.

2013-12-03_20-36-02

ns 명령 : 네이버 쇼핑 검색을 수행합니다.

nae 명령 : 네이버 영어사전 검색을 수행합니다.

영어로 입력시 한글 단어가 나오며, 한글로 입력시 영어 단어가 나옵니다.

2013-12-03_20-36-35

2013-12-03_20-36-56

 

naj 명령: 네이버에서 일어사전 검색을 합니다.

로마자 입력 검색시 일문, 일어 검색시 한국어, 한국어 검색시 일어 단어가 출력됩니다.

2013-12-03_20-37-57

2013-12-03_20-37-24

2013-12-03_20-37-10

 

* `nak ...` : Naver Korean Dictionary (국어 사전)
* `nae ...` : Naver Korean-English Dictionary (영어 사전)
* `naee ...` : Naver English-English Dictionary (영어 사전)
* `naj ...` : Naver Korean-Japanese Dictionary (일본어 사전)
* `nac ...` : Naver Korean-Chinese Dictionary (중국어 사전)
* `nah ...` : Naver Hanja Dictionary (한자 사전)
* `nad ...` : Naver Korean-German Dictionary (독일어 사전)
* `naf ...` : Naver Korean-French Dictionary (프랑스어 사전)
* `nai ...` : Naver Korean-Italian Dictionary (이탈리아어 사전)
* `nar ...` : Naver Korean-Russian Dictionary (러시아어 사전)
* `nas ...` : Naver Korean-Spanish Dictionary (스페인어 사전)
* `nat ...` : Naver Korean-Thai Dictionary (태국어 사전)
* `nav ...` : Naver Korean-Vietnamese Dictionary (베트남어 사전)
* `nan ...` : Naver Korean-Indonesian Dictionary (인도네시아어 사전)
* `nau ...` : Naver Korean-Uzbekistan Dictionary (우즈베키스탄어 사전)
* `nane ...` : Naver Korean-Nepali Dictionary (네팔어 사전)
* `namn ...` : Naver Korean-Mongolian Dictionary (몽골어 사전)
* `namy ...` : Naver Korean-Burmese Dictionary (미안마어 사전)
* `nasw ...` : Naver Korean-Swahili Dictionary (스와힐리어 사전)
* `naar ...` : Naver Korean-Aramaic Dictionary (아랍어 사전)
* `nakm ...` : Naver Korean-Cambodian Dictionary (캄보디아어 사전)
* `nafa ...` : Naver Korean-Persian Dictionary (페르시아어 사전)
* `nahi ...` : Naver Korean-Hindi Dictionary (힌디어 사전)
* `nanl ...` : Naver Korean-Dutch Dictionary (네덜란드어 사전)
* `nasv ...` : Naver Korean-Swedish Dictionary (스웨덴어 사전)
* `nauk ...` : Naver Korean-Ukrainian Dictionary (우크라이나어 사전)
* `naka ...` : Naver Korean-Gruziya Dictionary (조지아어 사전)
* `nacs ...` : Naver Korean-Czech Dictionary (체코어 사전)
* `nahr ...` : Naver Korean-Croatian Dictionary (크로아티아어 사전)
* `natr ...` : Naver Korean-Turkish Dictionary (터키어 사전)
* `napt ...` : Naver Korean-Portuguese Dictionary (포르투갈어 사전)
* `napl ...` : Naver Korean-Polish Dictionary (폴란드어 사전)
* `nafi ...` : Naver Korean-Finnish Dictionary (핀란드어 사전)
* `nahu ...` : Naver Korean-Hungarian Dictionary (헝가리어 사전)
* `nasq ...` : Naver Korean-Albanian Dictionary (알바니아어 사전)
* `naro ...` : Naver Korean-Rumanian Dictionary (루마니아어 사전)
* `nala ...` : Naver Korean-Latin Dictionary (라틴어 사전)
* `nael ...` : Naver Korean-Greek Dictionary (그리스어 사전)
11월 292013
 

요즘 간단한 홈페이지를 만들고 있다. 어떻게 만들까 고민하다가, 새로운 기술을 배울 겸 node.js를 이용하여 구현해보았다. 최신버젼을 경험하는 것을 좋아하다 보니, 간단한 기능을 추가할 때 마다 에로사항이 꽃피고 있다.  기존에 나와 있는 node.js책에 있는 내용들의 일부분은 deflcated되어 사용될 수 없는 상황이 대부분이였다. connect의 미들웨어 router 등등. 비슷한 기능을 하는 것을 만들어서 해결할 수 있다고 하였지만 그냥 express framework를 사용하기로 하였다. 그런데 이 조차도 최신 버젼(>=3.0)에서 레이아웃이 작동되지 않는다는 것을 알게 되었다[1].

조사해 보았더니, 해결 방안은 jade의 기능을 이용하라는 것이였다.

아래는 index.jade이다.

extends layout
block title
    =title

block contents
    p Hello World@!@!@

아래는 레이아웃 역할을 하는 layout.jade이다.

!!!  5
html
    head
        title
            block title
        link(rel = 'stylesheet', href = '/css/bootstrap.min.css')
        link(rel = 'stylesheet', href = '/css/bootstrap.theme.min.css')
    body
        block contents

아래는 node.js를 통해 실행된 결과물이다.

		

Hello World@!@!@

요는 jade기능인 “extends”와 “block”을 쓰면 되는 것이다. index.jade에 extends layout 명령을 통해 layout.jade를 읽어 들이고 block 구분에 적혀져 있는 내용이 자동으로 치환되게 된다. 물론 extends <<파일명>> 형태로 사용하고, block <<레이블>> 형태로 맞춰주면 된다.

최근에 나온 프레임워크는 어떻게 튀어나갈지 몰라서 안정된 환경을 원할 경우에는 좋은 선택이 못되는 듯 하다.

[1] http://stackoverflow.com/questions/13783687/the-layout-jade-is-not-working-why

11월 072013
 

2013년 11월 07일 현재 기준..

1. 최신 우분투버젼을 설치하고 있다는 가정하에 redmine을 apt-get install redmine 등의 방법으로 mysql을 이용하도록 설치하면 에러가 발생
-> /etc/redmine/default/database.yml 에서 adapter: 항목에 mysql을 mysql2로 변경

2. 성공적으로 설정이 끝나서 로그인 하려고 하면 에러 발생
-> “ruby-rack”의 버젼문제임 아래와 같이 해결(1.5.2 버젼의 경우 에러 발생)

2.1. /usr/share/redmine/Gemfile 의 마지막 줄에 아래 내용 추가

gem 'rack', '1.4.5'

2.2 다음과 같은 명령을 실행하여 1.4.5버젼의 rack를 설치
-> gem install rack –version 1.4.5
2.3 아래 명령을 실행하여 업데이트
-> bundle update

참조 : http://charles.lescampeurs.org/2013/11/01/redmine-on-ubuntu-13-10-with-apache2-and-passenger

10월 302013
 

메버릭스에서 지도가 잘 나오지 않는다면 DNS 설정을 의심해 보는 것이 좋다. 일단 확인한 것으로는 구글의 DNS(예: 8.8.8.8, 4.4.4.4)로 설정되어 있으면 잘 되지 않는 다는 것이였다. 해결방법은 구글의 DNS가 아닌 통신회사(IDS)에서 제공해 주는 DNS서버를 이용하는 것만으로도 충분히 해결이 된다. DNS 설정 방법은 운영체제 별로 다르기 때문에 관련 사용 설명서를 참조하면 된다.

7월 202013
 

  저는 맥북프로레티나 ’15(이하 맥프레)를 주력으로 이용하고 있습니다. 하지만 한국의 특성(ActiveX를 이용해야 하는 점)과 하는 일(Windows 기반 프로그래밍)을 위해 어쩔 수 없이 패러럴즈를 설치하여 가상머신으로 윈도우를 이용하고 있습니다. 재부팅하는 것은 성격에 맞지 않기 때문에 가상머신은 저에게 매우 좋은 선택입니다. 그런데 문제는 맥프레 기본형을 구매했기 때문에 용량이 256GB밖에 안된다는 문제점이 있었습니다. 가상머신에 개발환경을 세팅하고 덤으로 맥에도 설치가 되어 있다보니 용량이 부족하더군요.

2013-07-20_02-22-43

그림 1  패러럴즈로 다양한 곳에 있는 VM을 읽은 모습

1. 개인용 홈 서버를 이용하여 네트워크를 통하여 동작

  먼저 SMB를 이용하여 외장으로 접근을 시도하였습니다. 패러럴즈에서는 그림 1의 하늘색과 같은 형태로 표시되었습니다. 실제로 실행을 해본 결과 우분투VM에서는 잘 되었으나 윈도우7VM에서는 에러가 나서 동작이 안되었습니다. Apple社 프로토콜을 고려해 보았지만 외장하드를 구입할 예정에 있었기 때문에 2번째 방법을 택하였습니다.

2. 외장하드를 통하여 VM 동작

  구입한 맥프레의 용량부족으로 외장하드를 구입했습니다. 외장하드로 VM을 옮겨서 기본 머신의 용량을 좀 늘려보려는 계획이였죠. 그림 2의 Samsung P3 Portable 1TB를 구입하였습니다. 그림 1의 오렌지색과 같은 형태로 나타납니다.

Capture

그림 2  본인이 구입한 Samsung P3 Portable[1]

  하드디스크는 컴팩트하고 용량도 1TB라 만족스러웠습니다. 속도도 USB3.0을 쓰니 어느 정도 괜찮은 속도가 나오더군요. 하지만 아쉽게도 맥은 ntfs를 지원하지 않기 때문에 외장 하드 안에 기본으로 들어있는 Paragon ntfs for mac[2]이라는 프로그램을 설치해야 했습니다. 설치도 성공적으로 했고 재부팅을 하니 태스트 파일을 문제없이 읽기/쓰기가 되었습니다. 문제가 없는 것을 확인하고 나서 패러럴즈8기반의 윈도우용VM을 외장하드로 복사하였습니다. 그리고 패러럴즈를 통해 실행 시켰죠. 문제없이 되었습니다. 하지만 Suspend(대기)를 하고 나서 다시 Resume(다시 실행)을 하니”Problem id : 44″ 에러를 내뿜으며 제대로 동작을 하지 않더군요. 대기 기능은 VM을 껐다 켜는 시간을 줄여주었기 때문에 꼭 필요한 기능입니다. OS X에서 패러럴즈를 종료하면 실행 중인 VM을 전부 대기 모드로 바꾼 후에 꺼집니다. 만약 이 상태로 계속 쓴다면 실수로 패러럴즈를 종료시킨다거나, 재부팅을 시키는 일들을 통해 잘 못하면 데이터를 날릴 수도 있는 상황에 있는 것을 뜻합니다. 저는 로그를 확인한 다음에 Paragon ntfs에 문제가 있을 거라는 예상이 되어 최신버젼(ver 10)의 Paragon ntfs을 설치하였지만 마찬가지로 에러가 발생하면서 동작이 안되었습니다. 그래서 맥에서 제공하는 파일시스템인 HFS+를 이용하여 다시 포멧한 후에 외장하드에 VM을 복사하였더니 에러 없이 동작하였습니다. 대기모드에 들어갈 때 메모리를 덤프 떠서 저장하는 기능이 있는데, 이쪽 부분을 작업할 때 Paragon ntfs가 올바르게 작동되지 않는 듯 해 보입니다.

  외장하드를 이용하여 패러럴즈 VM을 동작시키실 때, 외장하드를 ntfs로 포멧하시면 대기모드에서 복구가 안됩니다. 따라서 외장하드를 HFS+로 재포멧 한 후에 하는 것을 추천합니다. HFS+로 바꾸면 외장하드의 내용을 윈도우에서 추가적인 프로그램 설치없이 읽을 수 없습니다.(2013.07.20 현재)

 

P.S. 책임의 한계 : 이 포스팅의 내용을 기반으로 작업중에 데이터가 깨지거나 손실된다면 그것을 수행한 본인의 책임입니다.

 

[1] Samsung p3 portable Data Sheet, http://samsunghdd.seagate.com/includes/samsung-p3-portable-external-ds.pdf (2013.07.20 02:01 KST 확인)

[2] Paragon Software Group, http://www.paragon-software.com