우분투에서 루비 온 레일즈를 이용해서 이것 저것 삽질하고 있습니다. ^^;;;; 아무래도 처음하다보니 이것저것 문제가 많은데요. 이번에는 만든 예제를 릴리즈하려고 bundle package를 하다보니 mysql2 관련 오류를 만났습니다. ㅠㅠ

kkamagui@kkamagui-VirtualBox:~/project/blog$ sudo gem install mysql2 -v '0.3.11'Building native extensions.  This could take a while...
ERROR:  Error installing mysql2:
        ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.8 extconf.rb
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... no
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... yes
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=/usr/bin/ruby1.8
        --with-mysql-config
        --without-mysql-config
        --with-mysql-dir

역시나 해결책은 구글신이 알려주셨습니다. ㅠㅠ 구글신 쵝오 ㅠㅠ)-b (http://railsforum.com/viewtopic.php?id=40776)
아래처럼 libmysqlclient-dev 패키지를 설치하면 깔끔하게 해결됩니다.

sudo apt-get install libmysqlclient-dev

아흑... 뭐라도 하나 제대로 되야할텐데... 쉽지 않네요 ㅠㅠ

우분투(Ubuntu)에서 루비 온 레일즈(Ruby on Rails)버전을 3.2.1로 업그레이드한 뒤에, rails server를 실행했더니 아래와 같은 오류가 발생했습니다. OTL... 정말 이거 원 쉬운 게 하나도 없군요. ㅠㅠ

kkamagui@ubuntu:~/rails/blog/script$ rails server
/usr/lib/ruby/gems/1.8/gems/execjs-1.3.0/lib/execjs/runtimes.rb:50:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
    from /usr/lib/ruby/gems/1.8/gems/execjs-1.3.0/lib/execjs.rb:5

역시 구글을 검색했더니 아래와 같은 해결책을 하사해주셨습니다.(http://stackoverflow.com/questions/6282307/rails-3-1-execjs-and-could-not-find-a-javascript-runtime)

In your Gemfile

write this

gem 'execjs'
gem
'therubyracer'

and then run

bundle install

everything works fine for me :)


역시 구글은 짱인 것 같아요. ㅠㅠ)-b
요 근래 Ruby on Rails로 만들어 보고 싶은 게 있어서 Rails를 좀 보고 있습니다. 아직 잘은 모르지만 그 심플함과 강력함에 깜짝 놀라고 있는데요, 우분투(Ubuntu)에 깔려있는 레일즈(Rails)버전이 2.3 버전대라 3.0 버전 이상으로 올라가고 싶어서 레일즈 버전을 올렸습니다.

레일즈 버전을 올리는 방법은 아래와 같이 하면 됩니다. ;)
sudo apt-get install ruby-full rubygems
sudo su -
export REALLY_GEM_UPDATE_SYSTEM=true
gem update --system
exit
gem install rails

레일즈 버전은 깔끔하게 올라갔는데, 문제는 그 뒤더군요. 예제를 따라한다고 rails new blog를 입력하는 순간... 아래와 같은 오류가 발생하면서 더이상 진행이 안되었습니다. OTL...
/usr/bin/ruby1.8 extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal' or 'yum install sqlite3-devel'
*** 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.

그래서 이걸 해결할려고 구글신에게 여쭈었더니... 아래와 같이 하면 된다고 알려주시더군요. 역시 구글신 쵝오... ㅠㅠ(http://stackoverflow.com/questions/3458602/sqlite3-ruby-install-error-on-ubuntu)
sudo apt-get install libsqlite3-dev

아아... 역시 구글은 최고인 것 같아요... OTL...
아시는 분은 다 아시겠지만, 티스토리에는 텍스트에 예쁜 박스를 씌워주는 글상자 기능이 있습니다. 바로 아래처럼 말이지요 ;)

이것이 바로 글상자입니다. ;)

제가 글상자를 좀 좋아하는지라 파일 목록이나 기능 목록을 나열하면서 강조할 때 종종 쓰는데요, 쓸때는 좋은데 블로그의 스킨을 바꾸고나니 살짝 문제가 있더라구요. ㅠㅠ

블로그의 스킨을 바꾸면 글자의 기본 색도 바뀝니다. 그런데 글상자는 그대로라서 지금처럼 검은 블로그 스킨을 사용하면 밝은 색 글상자 내부에 글자가 잘 보이지 않습니다. ㅠㅠ 그렇다고 안쓰기도 뭐하고... 그래서 제 블로그의 글들을 모두 긁어서 소스에 글상자가 있는지 여부를 판단하는 루비 스크립트를 만들었습니다.

코드는 아주 간단하구요, 직접 블로그 페이지에 접근한 다음 글상자를 사용하면 꼭 들어가는 "background-color: rgb" 문자열을 찾도록 했습니다. 아래는 이러한 방식으로 동작하는 루비 코드입니다. ;)


위의 코드를 저장하여 ruby로 실행하면 output.txt 파일에 결과가 저장됩니다(어휴 이거 원 생각보다 엄청 많군요 ㅠㅠ). 스프링노트에서 블로그로 내보낸 글이 거의 절반 이상인데... 이건 어떻게 처리해야할 지 암담하네요. 그냥 다시 밝은 스킨으로 돌아갈까나... ㅠㅠ

그럼 좋은 밤 되세요 ;)

그동안 사용하던 데스크탑 PC에 문제가 생겨서 OS를 얼마전에 OS를 새로 깔았습니다. ㅠㅠ 새로까는 김에 그동안 작업하는것 때문에 못깔았던 윈도우 7으로 업그레이드를 했습니다. 그래서 툴을 이것 저것 깔고 재부팅을 했는데... 디렉토리를 열었더니 예전에 쓰던 모양하고 뭔가 다른겁니다.

처음에는 뭐가 다른지 파악을 못해서 한참을 고민했는데, 불현듯 머리를 스치는 것이 있더군요. ㅠㅠ 그렇습니다. 바로 서브버전으로 관리되고 있던 디렉토리에 아이콘이 정상적으로 표시되지 않았던 겁니다. 혹시나해서 다시 봤더니 아이콘만 표시되지 않을 뿐... SVN은 정상적으로 동작을 하더군요.

그래서 구글님께 여쭤보기를 한지 30분만에 답을 찾았습니다. 윈도우 레지스트리를 보면 탐색기(Explorer)에 아이콘을 표시하는 항목이 있는데, 여기서 TortoiseSVN 항목이 뒤쪽으로 밀려나 있어서 아이콘이 표시되지 않았던 겁니다.
(이것으로 미루어보아 탐색기가 아이콘을 표시할 때 레지스트리에 들어있는 항목을 순서대로 검색하여 일치하는 것이 나오면 그냥 그것으로 표시하는 것이 아닐까 생각합니다. ^^;;;)

레지스트리는 "시작" -> "실행"으로 가셔서 "regedit"라고 입력하시면 아래와 같은 화면이 표시되는데, 여기서 HKEY_LOCAL_MACHINE -> SOFTWARE -> Microsoft -> Windows -> CurrentVersion -> Explorer -> ShellIconOverlayIdentifiers 아래의 항목을 수정하면 됩니다.

<TortoiseXXXX라고 표시된 항목을 붉게 표시된 사각형처럼 0_를 붙여서 수정하세요>

레지스트리 아래에 TortoiseXXX라고 표시된 항목이 바로 TortoiseSVN과 관련된 항목이며, 이 항목 앞에 0_라는 접두사를 붙여서 맨 앞으로 옮겨주시면 됩니다. 접두사를 붙이실 때는 해당 항목을 클릭하시고 F2 키를 누르시거나, 오른쪽 버튼을 눌러 "이름 바꾸기" 메뉴를 클릭하시면 됩니다.

그리고 마지막으로 재부팅을 한번 해주시면 예쁘게 아이콘이 오버레이된 디렉터리를 보실 수 있을 겁니다. ^^
그럼 좋은 하루 되세요 ;)

요즘 옛날에 하던 MUD 생각이 자꾸나서 간단하게 테스트나 해볼 요량으로 telnet.exe을 실행했더니, 아래처럼 당황스러운 메시지가 나왔습니다. ^^;;;

'telnet'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.

아무리 그래도 그렇지... 필수 유틸리티에 속하는  Telnet이 없다니... 이게 무슨 괴상망측한 상황인가 싶어서, 한참을 생각하다가 우리의 전지전능하신 구글님께 여쭤봤더니 역시 답을 주시더군요. ^^;;;

아르님의 블로그(http://cheum.net/232)를 참고하자면...

[제어판] -> [모든 제어판 항목] -> [프로그램 및 기능]에 가서 왼쪽 아래에 있는 "Windows 기능 사용/사용 안함"을 클릭하면 뜨는 "Windows 기능" 창에서 가장 아래쪽에 있는 "텔넷 클라이언트"를 체크한 뒤 확인을 누르면 됩니다.
(아래 그림을 참고하시면 더 쉽게 하실 수 있을 겁니다 ^^)


이제야 잘 되는군요. ;)

그럼 좋은 하루 되세요 ^^

ps) 왜 윈도우 7 에서는 telnet client를 막아 놨을까요...?  보안 때문에 그런걸까요? ^^;;;;
연휴에 블로그를 돌아다니다가 루비로 간단한 웹서버를 만들어보면 어떨까하는 생각이 들었습니다. 그래서 참고 자료를 찾아보고 있었는데... MSDN 블로그(여기)에서 루비로 만든 웹서버를 찾았습니다. @0@)-b 그것도 무려 70줄짜리~!!!

물론, GET 밖에는 처리하지 못하는 초 간단한 웹서버지만 일단 루비 언어(Ruby)의 간결함과 강력함을 확인하는데는 그만인 것 같습니다. ^^;;; 저도 비슷한 역할을 하는 웹서버를 C++로 작성해봤는데, 문자열 처리하고 경로 찾는 부분이 거의 절반이고, 소켓 연결을 관리하는 코드가 절반이었습니다. ㅠㅠ

그런데, 루비로 만든 웹 서버는 그냥 몇 줄에 다 처리가 가능하군요. @0@)-b... 제가 예전에 C++로 만든 웹서버 수준으로 맞춘다면 40줄 미만으로 끝날듯도... 쿨럭..;;;; ㅠㅠ 

좋은 참고 자료가 될 것 같아서 까먹기 전에 링크와 코드를 남겨둡니다. ;)
(정말 편하기는 짱이로군요. ㅠㅠ)

require 'socket'
class HttpServer
  def initialize(session, request, basePath)
    @session = session
    @request = request
    @basePath = basePath
  end

  def getFullPath()
    fileName = nil
    if @request =~ /GET .* HTTP.*/
      fileName = @request.gsub(/GET /, '').gsub(/ HTTP.*/, '')
    end
    fileName = fileName.strip
    unless fileName == nil
      fileName = @basePath + fileName
      fileName = File.expand_path(fileName, @defaultPath)
      fileName.gsub!('/', '\\')
    end
    fileName << "\\index.html" if  File.directory?(fileName)
    return fileName
  end

  def serve()
    @fullPath = getFullPath()
    src = nil
    begin
      if File.exist?(@fullPath) and File.file?(@fullPath)
        if @fullPath.index(@basePath) == 0 #path should start with base path
          contentType = getContentType(@fullPath)
          @session.print "HTTP/1.1 200/OK\r\nServer: Makorsha\r\nContent-type: #{contentType}\r\n\r\n"
          src = File.open(@fullPath, "rb")
          while (not src.eof?)
            buffer = src.read(256)
            @session.write(buffer)
          end
          src.close
          src = nil
        else
          # should have sent a 403 Forbidden access but then the attacker knows that such a file exists
          @session.print "HTTP/1.1 404/Object Not Found\r\nServer: Makorsha\r\n\r\n"
        end
      else
        @session.print "HTTP/1.1 404/Object Not Found\r\nServer: Makorsha\r\n\r\n"
      end
    ensure
      src.close unless src == nil
      @session.close
    end
  end

  def getContentType(path)
    #TODO replace with access to HKEY_CLASSES_ROOT => "Content Type"
    ext = File.extname(path)
    return "text/html"  if ext == ".html" or ext == ".htm"
    return "text/plain" if ext == ".txt"
    return "text/css"   if ext == ".css"
    return "image/jpeg" if ext == ".jpeg" or ext == ".jpg"
    return "image/gif"  if ext == ".gif"
    return "image/bmp"  if ext == ".bmp"
    return "text/plain" if ext == ".rb"
    return "text/xml"   if ext == ".xml"
    return "text/xml"   if ext == ".xsl"
    return "text/html"
  end
end

def logger(message)
  logStr =  "\n\n======================================================\n#{message}"
  puts logStr
  $log.puts logStr unless $log == nil
end

basePath = "d:\\web"
server = TCPServer.new('XXX.XXX.XXX.XXX', 9090)
logfile = basePath + "\\log.txt"
$log = File.open(logfile, "w+")

loop do
  session = server.accept
  request = session.gets
  logStr =  "#{session.peeraddr[2]} (#{session.peeraddr[3]})\n"
  logStr += Time.now.localtime.strftime("%Y/%m/%d %H:%M:%S")
  logStr += "\n#{request}"
  logger(logStr)

  Thread.start(session, request) do |session, request|
    HttpServer.new(session, request, basePath).serve()
  end
end
log.close

그럼 좋은 하루 되세요 ;) 
요즘 루비 언어(Ruby Language)를 이용해서 장난감을 만드는 재미에 푹~ 빠져 있습니다. ^^;;; 아무래도 내장 기능 자체가 강력하고 다양한 모듈들 때문에 별다른 부담없이 시작할 수 있어서, 이것 저것 재미삼아 만들기가 좋네요. ;)

사실 장난감이라고 해봤자 그냥 언어를 익히는 수준 정도라서 보잘것 없지만... 이번엔 나름대로 쓸모있는 걸 만들어놔서 올려봅니다. ^^;;; 이번에 공을 들여 만든 것은 바로... 멜론 다운로드 폴더를 정리해주는 프로그램입니다. @0@)-b

멜론은 벅스, 도시락과 더불어 많이 이용되고 있는 음악 스트리밍/다운로드 프로그램인데요. MP3를 다운로드하면 앨범 단위로 다운로드하던 개별 파일로 다운로드하던 그대로 다운로드 폴더에 주욱 쌓입니다. 그래서 조금만 방심하면 여러 파일이 뒤섞여서 충격과 공포의 도가니(?)로 변하지요. ㅠㅠ

그래서 마구 다운로드하되 파일이 Artist 별로 정리되어 폴더에 저장되면 좋겠다는 생각이 들어서, 파일을 폴더 별로 정리하는 루비 프로그램을 만들었습니다. 아이디어는 간단하구요, 멜론에서 저장하는 파일 형식이 아래처럼 Artist-Track Number-Song.mp3의 순서라 여기서 Artist 부분을 잘라내 디렉터리로 만들고 파일을 해당 디렉터리로 옮기되 Artist를 제외한 나머지로 파일명을 바꾸는 겁니다. ^^;;;

2NE1-04-Hate You.mp3

자, 그럼 아래 루비 프로그램 나갑니다. ;)



위의 코드를 arrange.rb로 저장한 뒤, 멜론 다운로드 폴더로 이동한 다음 아래와 같이 입력하시면 파일 정리가 순식간에 끝납니다. ^^;;; 배치 파일로 만들면 더 편리하게 실행할 수 있습니다(배치 파일과 arrange.rb 파일 모두 첨부 파일로 올려두었습니다). 물론 루비를 설치하지 않으셨다면 루비를 먼저 설치하셔야겠지요. ;) 루비는 http://www.ruby-lang.org/ko/에서 다운로드하여 설치할 수 있습니다.

ruby arrange.rb

아래는 충격과 공포의 도가니(?)에서 벗어나 깔끔해진 멜론 폴더입니다. ;)



첨부 파일


ps 1) Artist와 Track Number를 구분하는 규칙이 - 이기 때문에 Artist 명에 -이 들어가 있다면 정상적으로 분리가 되지 않습니다. ㅠㅠ
ps 2) 다음 버전은 MP3의 Tag 정보를 읽어서 분리하도록 만들어야 겠어요. ㅠㅠ

루비 개발 툴로는 이클립스를 비롯해서 여러가지가 있겠지만 저는 NetBeans를 선택했습니다. 그동안 이클립스를 써와서 좀 다른 툴을 써보고 싶었거든요. ^^;;; 실제로 써보니 NetBeans도 이클립스만큼 쓸만하더군요. >ㅁ<)-b

우분투에서 NetBeans를 설치하는 방법은 아주 간단합니다. 시작 메뉴의 "우분투 소프트웨어 센터"를 클릭하여 소프트웨어 센터를 띄운 다음 아래처럼 검색창에 NetBeans를 입력하면 됩니다. 저는 이미 설치가 되어 있어서 제거로 표시되는데, 실제로 다른 분들은 설치로 표시될 겁니다. ^^;;;

<NetBeans 설치 방법>


NetBeans를 설치하고 나면 이제 Ruby 개발을 위해 플러그인을 설치해야 합니다. NetBeans 플러그인을 설치하려면 먼저 NetBeans를 실행해야 하는데, 시작 메뉴의 "개발" 메뉴를 보면 아까 설치한 NetBeans가 표시될 것입니다. 이를 실행하면 아래와 같은 화면이 표시되는데, 화면의 오른쪽에 빨간 사각형으로 표시된 "Install Plugins"을 클릭합니다.

<루비 개발용 플러그인 설치 화면>


클릭하고나면 플러그인 설치 화면이 표시되는데 여기에 ruby를 입력하면 "Ruby and Rails" 항목이 표시됩니다. 이 항목을 설치했으면 NetBeans를 다시 시작한 뒤에 "File" 메뉴의 "New Project" 메뉴를 선택합니다. 그러면 프로젝트 항목에서 Ruby가 표시되며 Ruby 프로젝트를 만들어서 프로그래밍을 할 수 있습니다. ^^


그럼 좋은 하루 되세요 ^^


새로운 프로젝트를 앞두고 있어서 얼마 전부터 그동안 프로젝트를 하면서 가장 불만이었던 것이 무엇인가를 고민하고 있었습니다(그러고 보니 작년부터 지금까지 프로젝트가 끊이질 않는군요. ㅠㅠ 쉴 시간도 없이 계속 달려왔는데 또 달리라니... ㅠㅠ). 그러다가 문득 생각난게 반복되는 작업이 너무 많다는 것이었습니다. 개발하고 테스트 돌리고 분석하고 디버깅하는 사이클을 매번 반복하는데... 분석하고 디버깅하는 시간은 그렇다 치지만 개발하고 테스트를 돌리는데 공수가 드는건 뭔가 잘못됬다는 생각이 들더군요.

개발하는 것에 비하면 테스트 돌리는 건 일도 아니지만, 실제로 여러 옵션을 주게 되어 있어서 귀찮았거든요. 실제로 이런 옵션들 때문에 팀원들 중에서는 지금도 통합 테스트를 제대로 못 돌리는 사람이 있을 정도니까요. ^^;;;; 그래서 테스트를 좀 자동화하고 편하게 하고자 쉽게 프로그램을 만들 수 있는 스크립트 언어에 다시 눈을 돌리게 되었습니다. 물론 배치 파일로도 할 수 있지만, 이왕이면 다홍치마라고 이 기회에 새로운 언어를 배우고 싶었습니다. ;)

예전에도 이런 고민을 한번 했는데 그때 파이썬(Python)이라는 언어가 좋다는 이야기를 듣고 잠시 배웠습니다. 실제로 써보니 C와 궁합도 좋고 여러모로 강력하더군요. >ㅁ<)-b 그런데, 들여쓰기를 코드 블록으로 사용하는 점과 클래스를 만들 때 Self 키워드를 사용하는 부분이 저와 맞지 않아서 그렇게 많이 쓰지는 못했습니다. ㅠㅠ

<루비(Ruby) 사이트 - http://www.ruby-lang.org/ko/>


그래서 이번에는 좀 C/C++ 스타일과 비슷한 스크립트 언어를 찾기로 했는데, 이때 딱 눈에 띈게 바로 루비(Ruby)였습니다. 루비의 문법을 보니 C/C++과 상당이 비슷해서 조금만 익숙해지니 이것 저것 해볼 수 있더라구요. ^^;;; 거기다가 라이브러리도 꽤 많아서 완전 제 마음에 들었습니다. ^^)/~ 루비 언어를 만든 마츠모토 유키히로씨가 스트레스가 없는 쉬운 프로그래밍 언어를 목표로 했다고 하던데 정말 그런 느낌이 들었습니다(물론 스크립트 언어라서 제가 그렇게 느낀 걸수도 있습니다만... 쿨럭...;;;).

지금까지는 아이디어가 떠오르면 C나 C++로 코딩하곤 했는데, C는 뭐랄까요... 왠지 마음을 단단히 먹고 시작해야 할 것 같은데, 루비는 그런 느낌도 없고 편하니 좀더 쉽게 여러가지를 해볼 수 있지 않을까 생각합니다. ^^;;;

그럼 즐거운 루비 라이프를 위해 화이팅~!!

ps)  며칠 해본 결과 상당히 마음에 들던데... 
      이러다가 MINT64 OS에 루비를 올리는 날이 올지도 모르겠군요... ㅠㅠ

윈도우에서 Cygwin을 사용하여 개발 환경을 설정하신 분들이 꽤 되실겁니다. 저 역시 MINT64 OS의 개발 환경을 cygwin으로 구성했습니다. ^^;;;

그런데 Cygwin을 설치한 뒤에 윈도우 콘솔창(cmd.exe)을 실행시켜 gcc를 입력하면, "액세스가 거부되었습니다."라는 메시지가 표시됩니다. 이는 /usr/bin 디렉터리에 있는 gcc.exe 파일이 실제로는 /etc/alternative/gcc에 연결된 링크 파일이기 때문인데요, 이 파일은 다시 /usr/gcc-4.exe에 연결되어 있습니다. ^^;;;
 



따라서 윈도우 콘솔창에서 gcc를 직접 실행하려면 gcc-4를 입력하면 됩니다.아니면 Grampus님이 하신 방법처럼 윈도우에서 심볼 링크를 걸어주셔도 됩니다.(지나다가님, Grampus님 제보 감사합니다. ^^;;;) 

C:\Cygwin\bin>mklink gcc.exe gcc-4.exe

단, makefile을 이용해서 make를 실행하는 경우는 gcc를 사용해도 괜찮습니다.  ^^


cygwin에서 윈도우 폴더에 접근하는 방법은 루트 디렉터리 아래에 있는 cygdrive로 이동하시면 됩니다. cygdrive 아래에는 윈도우 드라이브들이 존재하는데, 이 드라이브로 이동하면 해당 드라이브에 들어있는 파일들이 아래와 같이 표시됩니다.
 


 따라서 원하시면 cygwin 쉘에서 윈도우 디렉터리에 접근하여 작업을 진행할 수도 있습니다. ^^

그럼 좋은 하루 되세요 ;)

 
하드 디스크에서만 잠자고 있던 MINT64 OS의 소스 코드를 어디엔가 올려야겠다는 생각이 번득 들어서 지난주 금요일부터 고민했습니다. 그러다가 GIT라는 분산 버전 관리 시스템을 알게 되었는데요, 리누즈 토발즈옹께서 리눅스 커널 개발에 쓰신다는 이야기를 듣고 혹해서 깔게 되었습니다.
 
그동안 서브버전을 쓰고 있었는데요, Tortoise SVN이 너무 편해서 GIT도 없나 찾아봤더니~!!! 역시 있더군요. 아래의 두 가지를 설치해주면 Tortoise SVN을 쓸 수 있습니다. >ㅁ<)-b

 

(Download로 가서 윈도우 버전을 다운로드받아서 설치해주세요 ^^)
 
GIT 다운로드 : http://git-scm.com/
TortoiseGIT 다운로드 : http://code.google.com/p/tortoisegit/
 
설치가 끝나면 탐색기에서 오른쪽 버튼을 눌렀을 때, 아래처럼 “Git XXX” 관련 메뉴가 나타납니다.
 
<TortoiseGIT 설치 후 메뉴>
여기서 “Git Clone…”를 클릭하면 Remote Repository에서 프로젝트 전체를 내려 받을 수 있습니다. 저는 MINT64 OS의 소스코드가 올라간 기념으로 아래와 같이 https://mint64os@code.google.com/p/mint64os/를 URL로 선택하고 Directory는 C:\MINT64로 했습니다.
  
<Clone 설정 화면> 
 
위의 화면에서 OK를 누르면 암호를 입력하라고 나오는데요, 공개 프로젝트의 경우 그냥 엔터를 치시면 프로그래스바가 표시된 뒤에 C:\MINT64 디렉터리가 생성됩니다. ^^
 
이제 C:\MINT64 디렉터리에서 마음대로 작업을 한 뒤에, 어느 정도 성과가 나오면 다시 마우스 오른쪽 버튼을 눌러 메뉴를 표시하면 Git Commit -> “Master”… 항목이 보입니다. 이 항목을 클릭하면 Clone을 한 로컬 Repository(C:\MINT64 디렉터리)에 변경사항이 저장됩니다. 
 
말은 Commit인데, 사실 Subversion의 Commit과는 조금 개념이 다르더라구요. Subversion의 Commit은 Remote Repository에 변경사항을 올리는 건데, GIT에서 이 작업은 Push라고 하더라구요. Push는 오른쪽 버튼을 눌러 “TortoiseGIT” 항목 -> 가장 위에 있는 “Push” 항목을 선택하면 됩니다. 단, Push 할 때는 암호가 필요합니다(설정에 따라서 필요하지 않는 경우도 있는지는 모르겠네요. ^^;;;)
 
조금 써보니까 Subversion과 큰 차이가 없어서, 그렇게 어렵거나 하지는 않더라구요. 이제 우리 모두 GIT와 MINT64 OS 프로젝트에 푸욱 빠져보아요. >ㅁ<)-b
 
요즘 이상하게 아이디어가 계속해서 떠오르는 바람에 밤낮없이 애플리케이션을 만들고 있습니다. ^^;;;; 밤낮없이 만들다보니 애플리케이션의 질은 좀 많이 떨어지는데... 공짜로 배포하고 있으니 부담이 없어서 마구 찍어(?)내고 있습니다. 오늘도 그 일환으로 윈도우 애플리케이션과 연동하는 요상한(?) 놈을 만들고 있었는데, 한참을 만들다보니 아이콘이 없더군요. ㅡ_ㅡa... 그래서 뚝딱 디자이너 준님께 부탁해서 그렸더니... 얼래... PNG 파일인 겁니다. ㅡ0ㅡ....

아직도 Visual Studio 6.0을 쓰고 있는지라 다른 파일은 절대 안되고 아이콘으로 ico 파일만 쓸 수 있는데... ㅠㅠ 상당히 난감하더군요. 한참을 고민하다가 설마하며 구글신께 물어봤더니... 멋진 사이트를 하나 점지해 주셨습니다.


위 사이트에 가면 PNG나 JPG 파일을 ICO로 바꾸거나 ICO를 그 역으로 바꾸는 것도 가능합니다. @0@)-b 역시 죽으라는 법은 없나보군요. ㅠㅠ

혹시나 필요하신 분들이 있을까봐 공유합니다. ;) 내일은 좀 일찍 출근해야되서 오늘은 이만 자야겠군요. 그럼 다들 좋은 밤 되시길~ :)

ps) 이상하게 한참을 쉴 때는 아무런 생각도 안나더니만... 회사 프로젝트 때문에 좀 바빠지니 갑자기 아이디어가 솟구치네요. 이건 도대체 무슨 상황인건지.... ㅡ_ㅡa...
주말에 와이프의 절친이 집들이를 한다고 해서 고향에 잠시 다녀왔다가 일요일 밤 늦게 돌아왔습니다. 심신이 피곤하고 내일은 와이프 사고 때문에 합의 문제가 있어서 바로 자고 싶었지만, 다른 분들 소식이 궁금해서 컴퓨터를 키고 RSS 목록을 훝어보기로 했습니다(역시 전 이 직업이 천직인듯... 쿨럭..;;;).

그러던 중 http://blog.wimy.com/316에서 넥슨 개발자 컨퍼런스가 열였다는 글을 따라가다 보니, 넥슨에서 데브캣(http://devcatpublications.wordpress.com/) 이라는 사이트를 만든 것을 알았습니다. 개발자 컨퍼런스에서 소개되었던 강의 자료를 모아 놓았던데 유용한 정보들이 많아서 상당히 인상적이었습니다. 시간이 없어서 몇 개만 봤는데 기획부터 실제 개발에 관련된 내용까지 다양하게 있더군요. ㅠㅠ

어흑... 나중에 찬찬히 한번 훝어봐야겠습니다. 넥슨은 대인배~!!!

RSS를 돌다가 firejun(http://firejune.com/1458)님의 사이트에서 재미난 것을 발견했습니다. 바로 그림 파일을 압축해 주는 사이트입니다. ;) 요즘 안 그래도 GUI 시스템 때문에 이미지를 넣어야 하는데... 용량이 크면 시리얼로 전송하는데 문제가 있어서 많이 고민 중이었습니다. 그런데 이 사이트가 그 고민을 좀 덜어 주는군요 ㅎㅎ

사이트 주소는 http://www.gracepointafterfive.com/punypng/ 이고 아래와 같이 멋진 압축률을 보여 줍니다.

<punypng의 이미지 압축률>

실제로 MINT64의 GUI 프로토타입 이미지를 압축해 봤더니 약 30% 정도가 줄어들더군요. 원리는 알 수 없지만 꽤 고마운(?) 웹사이트입니다. ㅠㅠ 어흑... 이제 그래도 여전히 손실 압축 방식인 JPG에 비해서는 무지 크군요. ㅠㅠ

요즘 같은 세상에도 Visual Studio 6.0을 사용하는 사람이 있나 하시는 분이 계실지 모르겠지만, 전 세월을 역행하는지라... 아직도 6.0을 쓰고 있습니다. ㅠㅠ(사실 예전에 만들었던 소스 코드가 다 Visual Studio 6.0을 쓰고 있어서 귀차니즘 때문에 그냥 쓰고 있는 것 뿐입니다. ㅠㅠ) 거기다가 플랫폼 SDK까지 깔아서 쓰고 있으니 저한테 소스 코드를 전달 받으신 분은 꽤나 고생을 하시더군요. ㅠㅠ


이번에도 플랫폼 SDK 때문에 조금 문제가 생겼었는데요, 다행히도 마소 웹에서 플랫폼 SDK를 아직 서비스하고 있더군요. 물론 6.0 용은 아니고 2003 용인데 VC 6.0에서도 사용할 수 있습니다. ;) 파일은 아래에서 다운로드 받을 수 있습니다.



아후~ 결혼식을 다녀왔더니만, 벌써 저녁이군요. ;) 일단 밥 먹구 작업을 또 시작해야겠습니다.

 블로그를 돌다가 스크랩 해놓은지 꽤나 됐는데, 이제서야 포스팅하는군요. ^^;;; 워낙 정신없이 살다보니 ㅎㅎㅎ
 
 자신만의 Network Set-Top Box를 만드는 방법에 대해서 설명해 놓은 자료입니다. YBox2 라는 이름을 가지고 있고 PAL과 NTSC 2가지 방식의 출력을 지원한다는 군요. 원문은 http://ladyada.net/make/ybox2/index.html 에서 보실 수 있습니다.

 아래는 원문에 포함된 스크린샷의 일부입니다. 아주 멋집니다~!! ;)
 







 시간나면 한번 만들어봐야겠군요. ^^
 그럼 좋은 하루 되세요. ;)

몇시간 삽질 끝에 드디어 가상 HID(Virtual HID)를 완성했습니다. ^^)/~ 약간 문제가 있긴 하지만 그래도 동작은 하니... ^^;;;;; 하나의 드라이버로 동작하게 할 생각이었습니다만은 보안 프로그램에 따라 특색이 조금씩 달라서 결국 포기했습니다.

이게 희한한게... 하나는 완전히 내렸다가 새로 올리고 다른 하나는 아예 그냥 잘라버립니다. ㅡ_ㅡa... 이것 참... 그래서 한쪽에 맞춰두면 다른 한쪽에서 문제가 발생하더군요. 결국 두가지 버전으로 구성했습니다. 이렇게 되면 버전관리가 힘든데... 흑흑.... ㅜ_ㅜ 어쩔수 없지요 ㅜ_ㅜ...

대충 키보드/마우스 이벤트를 넣어보고 정리하려고 키보드 쪽을 유심히 봤더니, HID 키보드의 값과 전통적으로 사용하는 스캔 코드(Scan Code)의 값이 서로 다르더군요. @0@)/

결국 기존의 LIbrary가 스캔 코드 값을 받도록 되어있었기에, 호환성 유지를 위해 HID 값으로 바꿔줘야 했습니다. 결국 Mapping Table을 만들어야 한다는 이야기!!! 그래도 구글신이 도와주셔서 괜찮은 문서를 구했고, 삽질 끝에 맵핑 테이블을 완성했습니다. ^^)/~

아아~ 일단 만들었으니 내일 테스트 해야겠습니다. ^^)/~ 다들 좋은 밤 되시길~

translate.pdf
0.13MB

문서와 Mapping Table 첨부합니다. ^^)/~

/*Key Name        PS/2 Set 1 Make*        HID Usage ID */    
{/*    DO NOT USE    0x00    */    0x00    ,
/*    Escape    0x01    */    0x29    ,
/*    1 !    0x02    */    0x1E    ,
/*    2 @    0x03    */    0x1F    ,
/*    3 #    0x04    */    0x20    ,
/*    4 $    0x05    */    0x21    ,
/*    0.05    0x06    */    0x22    ,
/*    6 ^    0x07    */    0x23    ,
/*    7 &    0x08    */    0x24    ,
/*    8 *    0x09    */    0x25    ,
/*    9 (    0x0A    */    0x26    ,
/*    0 )    0x0B    */    0x27    ,
/*    - _    0x0C    */    0x2D    ,
/*    = +    0x0D    */    0x2E    ,
/*    Backspace    0x0E    */    0x2A    ,
/*    Tab    0x0F    */    0x2B    ,
/*    q Q    0x10    */    0x14    ,
/*    w W    0x11    */    0x1A    ,
/*    e E    0x12    */    0x08    ,
/*    r R    0x13    */    0x15    ,
/*    t T    0x14    */    0x17    ,
/*    y Y    0x15    */    0x1C    ,
/*    u U    0x16    */    0x18    ,
/*    i I    0x17    */    0x0C    ,
/*    o O    0x18    */    0x12    ,
/*    p P    0x19    */    0x13    ,
/*    [ {    0x1A    */    0x2F    ,
/*    ] }    0x1B    */    0x30    ,
/*    Return    0x1C    */    0x28    ,
/*    Left Control    0x1D    */    0xE0    ,
/*    a A    0x1E    */    0x04    ,
/*    s S    0x1F    */    0x16    ,
/*    d D    0x20    */    0x07    ,
/*    f F    0x21    */    0x09    ,
/*    g G    0x22    */    0x0A    ,
/*    h H    0x23    */    0x0B    ,
/*    j J    0x24    */    0x0D    ,
/*    k K    0x25    */    0x0E    ,
/*    l L    0x26    */    0x0F    ,
/*    ; :    0x27    */    0x33    ,
/*    ' "    0x28    */    0x34    ,
/*    ` ~    0x29    */    0x35    ,
/*    Left Shift    0x2A    */    0xE1    ,
/*    \ |    0x2B    */    0x31    ,
/*    Europe 1 (Note    0x2B    */    0x32    ,
/*    z Z    0x2C    */    0x1D    ,
/*    x X    0x2D    */    0x1B    ,
/*    c C    0x2E    */    0x06    ,
/*    v V    0x2F    */    0x19    ,
/*    b B    0x30    */    0x05    ,
/*    n N    0x31    */    0x11    ,
/*    m M    0x32    */    0x10    ,
/*    , <    0x33    */    0x36    ,
/*    . >    0x34    */    0x37    ,
/*    / ?    0x35    */    0x38    ,
/*    Right Shift    0x36    */    0xE5    ,
/*    Keypad *    0x37    */    0x55    ,
/*    Left Alt    0x38    */    0xE2    ,
/*    Space    0x39    */    0x2C    ,
/*    Caps Lock    0x3A    */    0x39    ,
/*    F1    0x3B    */    0x3A    ,
/*    F2    0x3C    */    0x3B    ,
/*    F3    0x3D    */    0x3C    ,
/*    F4    0x3E    */    0x3D    ,
/*    F5    0x3F    */    0x3E    ,
/*    F6    0x40    */    0x3F    ,
/*    F7    0x41    */    0x40    ,
/*    F8    0x42    */    0x41    ,
/*    F9    0x43    */    0x42    ,
/*    F10    0x44    */    0x43    ,
/*    Num Lock    0x45    */    0x53    ,
/*    Scroll Lock    0x46    */    0x47    ,
/*    Keypad 7 Home    0x47    */    0x5F    ,
/*    Keypad 8 Up    0x48    */    0x60    ,
/*    Keypad 9 PageUp    0x49    */    0x61    ,
/*    Keypad -    0x4A    */    0x56    ,
/*    Keypad 4 Left    0x4B    */    0x5C    ,
/*    Keypad 5    0x4C    */    0x5D    ,
/*    Keypad 6 Right    0x4D    */    0x5E    ,
/*    Keypad +    0x4E    */    0x57    ,
/*    Keypad 1 End    0x4F    */    0x59    ,
/*    Keypad 2 Down    0x50    */    0x5A    ,
/*    Keypad 3 PageDn    0x51    */    0x5B    ,
/*    Keypad 0 Insert    0x52    */    0x62    ,
/*    Keypad . Delete    0x53    */    0x63    ,
/*    UNASSIGNED    0x54    */    0x00    ,
/*    UNASSIGNED    0x55    */    0x00    ,
/*    Europe 2 (Note    0x56    */    0x64    ,
/*    F11    0x57    */    0x44    ,
/*    F12    0x58    */    0x45    ,
/*    Keypad =    0x59    */    0x67    ,
/*    UNASSIGNED    0x5A    */    0x00    ,
/*    UNASSIGNED    0x5B    */    0x00    ,
/*    Keyboard Int'l 6    0x5C    */    0x8C    ,
/*    UNASSIGNED    0x5D    */    0x00    ,
/*    UNASSIGNED    0x5E    */    0x00    ,
/*    UNASSIGNED    0x5F    */    0x00    ,
/*    DO NOT USE    0x60    */    0x00    ,
/*    DO NOT USE    0x61    */    0x00    ,
/*    UNASSIGNED    0x62    */    0x00    ,
/*    UNASSIGNED    0x63    */    0x00    ,
/*    F13    0x64    */    0x68    ,
/*    F14    0x65    */    0x69    ,
/*    F15    0x66    */    0x6A    ,
/*    F16    0x67    */    0x6B    ,
/*    F17    0x68    */    0x6C    ,
/*    F18    0x69    */    0x6D    ,
/*    F19    0x6A    */    0x6E    ,
/*    F20    0x6B    */    0x6F    ,
/*    F21    0x6C    */    0x70    ,
/*    F22    0x6D    */    0x71    ,
/*    F23    0x6E    */    0x72    ,
/*    UNASSIGNED    0x6F    */    0x00    ,
/*    Keyboard Intl'2    0x70    */    0x88    ,
/*    UNASSIGNED    0x71    */    0x00    ,
/*    UNASSIGNED    0x72    */    0x00    ,
/*    Keyboard Int'l    0x73    */    0x87    ,
/*    UNASSIGNED    0x74    */    0x00    ,
/*    UNASSIGNED    0x75    */    0x00    ,
/*    F24    0x76    */    0x73    ,
/*    Keyboard Lang 4    0x77    */    0x93    ,
/*    Keyboard Lang 3    0x78    */    0x92    ,
/*    Keyboard Int'l4    0x79    */    0x8A    ,
/*    DO NOT USE    0x7A    */    0x00    ,
/*    Keyboard Int'l5    0x7B    */    0x8B    ,
/*    DO NOT USE    0x7C    */    0x00    ,
/*    Keyboard Int'l2    0x7D    */    0x89    ,
/*    Keypad ,Brazilian Keypad    0x7E    */    0x85    ,
/*    DO NOT USE    0x7F    */    0x00    }

 요즘 필터 드라이버 수정하랴 Virtual HID 드라이버 수정하랴 정신이 없습니다. ^^;;; 뭐랄까요... 필터 드라이버 같은 경우는 완성되긴 했지만... V3가 설치된 PC에서는 제대로 수행되지 않는 문제가 있었습니다.

 일단 수정을 위해서 V3 Internet Security 평가판을 설치하고 부랴부랴 테스트에 돌입했습니다. 결과가 어찌나올지는 모르겠지만 영향을 아주 안주는 것은 아닌 것 같군요. ^^;;;

 아휴... 이거 오늘도 피곤하게 생겼습니다. 그려... ^^;;; 뭔가 알아내면 제보(??) 날리겠습니다. ^^
 그럼 다들 좋은 밤 되시길~ ^^)/~

위모트(Wii Remote) 설정방법

원문 : http://www.wiili.org/index.php/How_To:_BlueSoleil

 

This tutorial will show you how to set up and connect to your Wiimote with BlueSoleil.

The version of BlueSoleil used in this tutorial (and has been tested on) is 1.6.2.1

 

Download BlueSoleil

 

  • You can download the latest BlueSoleil drivers from their website.
  • Or you can find different versions of it on FileMirrors.

 

BlueSoleil Tutorial

 

  • First, start up the BlueSoleil software and activate your Bluetooth adapters if needed.

 

Image:bs2.jpg

 

  • Then hit the 1+2 buttons on your Wiimote and click the center orange circle. It will take a few seconds and then find it.
  • Note: Make sure that the 4 LEDs on the bottom of the Wiimote are blinking during this whole process. Since the Wiimotes only stay on discover mode for several seconds, you can either hold down the 1+2 buttons the whole time or press them every few seconds.

 

  • If BlueSoleil does not detect your Wiimote, Unplug your bluetooth device and plug it back in. Then press the center orange circle and try again.

 


Image:bs3.jpg

 

  • Right click the Wiimote (NINTENDO-RVT-CNT-01) that shows up and click Refresh Services.
  • Should this not work, press 1+2 on the Wiimote and simply click on the Wiimote's icon in BlueSoleil

 


Image:bs4.jpg

 

  • Click the Bluetooth HID button that shows up at the top and you are done! Now you can use your Wiimote with programs such as GlovePIE and WiinRemote.

 


Image:bs5.jpg

 

Alternative Solution

 

This is with bluesoleil installed, and this is how you can make your wiimote work without opening or launching bluesoleil! Make sure Bluesoleil is closed before doing this.

1.) Go to your computer's control panel, and open the bluetooth device cp..(see icon)

2.) A dialogue will come up, click on "add device" button. (see image)

3.) Click the checkbox as seen on this image.

4.) Click next, and hold your Wiimote's 1 & 2 buttons together... or better, open up the back of your wiimote and press the sync button and hold it..and the device will appear as here.

5.) Select the new device and click next, DONT LET go of the 1 & 2 buttons or the sync buttons yet! Click the "no passcode" selection and press next..while NOT letting go of the buttons. If you're confused, look at this image.

6.) Your computer will now add the device accordingly, do not let go of the buttons until everything is set up.. no, you dont let go of it until you are back in the window where it says "add devices". If you successfully performed this, your Wiimote will register as "connected" and you are able to use it with GlovePie.

Note: If you are unable to use it, even though the control panel says your device is connected - make sure that the "bluetooth fix" is selected in glovepie.


이 글은 스프링노트에서 작성되었습니다.

 아아~ 이거 힘드네요. ㅜ_ㅜ 일단 RSS를 통해 티스토리에서 댓글만 뽑아내려고 했는데, 잘 안되서 파이썬으로 파싱하는 걸로 방향을 바꿨습니다. 파이썬 라이브러리 중에 Beautiful Soup를 사용해서 간단히 파싱하여 댓글을 추출하는 것까지는 금방했습니다.

 그런데 문제는 UTF-8로 인코딩된 웹페이지를 파일로 저장하려니 ASCII로 저장하는 것이 기본인지 저장할 수 없다는 에러가.... 이렇게 황당한 일이... ㅡ_ㅡa... 파이썬을 쓰면서 한글 처리를 별로 안해서 크게 불편함을 몰랐는데, 이번에 제대로 걸렸네요. ㅜ_ㅜ

 이래 저래 해보다가 결국 포기 ㅜ_ㅜ)/~ 차라리 티스토리에 웹페이지를 하나 더 넣어서 댓글만 표시하게 하는게 더 편하겠습니다. ㅜ_ㅜ)/~

 댓글 추출하는 소스는 만든게 아까워서 올려놓습니다. 애휴... 밥이나 먹어야겠군요. ㅜ_ㅜ)/~




 ps) 아아... 이게 무슨 삽질인지... 쉽게 처리하는 방법을 아시면 댓글로 제보 부탁드립니다.


 점프 투 파이썬의 저자이신 박응용님께서 책의 내용을 공개해 놓으셨습니다. 책 내용은http://wikidocs.net/mybook/read/library?pageid=1 에서 보실 수 있습니다. 테스트 주도 개발(TDD)에 대한 내용도 있더군요. 관심 있으신 분은 한번쯤 들러보시면 좋을 것 같습니다.

사용자 삽입 이미지

 예전에 파이썬 공부할때 많이 봤던 책인데, 이렇게 웹에서 보게되니 반갑네요. ㅜ_ㅜ)/~ 박응용님 블로그(http://tdd.or.kr/tddlog/)에도 잠깐 들렀는데... 참 대단하신 분인것 같습니다. 직장생활 하시면서 저렇게 많은 웹서비스를 개발하다니... 역시 하기나름인 것 같습니다(저도 열심히 @0@)/`!!!).

 파이썬 만세~ >ㅁ<)/~!!~

 

 블로그를 돌다가 헐랭이님(http://swbae.egloos.com/1747493) 블로그에서 보안관련 무료 잡지를 찾았습니다. @0@)/~ 이런 잡지가 있다니 깜짝 놀랄일이군요. ;)

 http://www.net-security.org/insecuremag.php에서 받아 보실 수 있습니다. 시간이 나면 한번 읽어봐야겠군요. 득탬해서 너무 기분이 좋습니다. ㅎㅎ
 
 다들 좋은 주말 보내세요 ;)


 윈도우즈 업데이트 파일에서 실제 패치 파일을 추출할 수 있다고 합니다. 지금까지 윈도우즈 업데이트 파일은 파일을 직접 덮어쓰거나 수정해주는 통짜 덩어리인줄 알았더니, 그 안에 세부파일이 나누어져 있나보군요. ;)

 원문은 http://fullc0de.egloos.com/3645611 에서 보실 수 있으며, 중요한 내용만 인용하면 아래와 같습니다.
1. MS 보안업데이트 사이트를 방문해서 패치 인스톨러(보통 실행파일 형태죠)를 다운로드 합니다.
2. 커멘드 라인에서 /x:output 파라메터를 주고 실행합니다. 그럼 패치가 실행되지 않고 압축이 풀립니다.
3. 크게 두 개의 디렉토리가 있는데 SP2GDR 디렉토리로 들어가시면 됩니다. 아.. 물론 제 컴이 SP2라서 -_-;;;
   (GDR은 retail이나 OEM버전을 뜻하고 QFE는 checked/debug 버전을 뜻합니다.)
4. GDR 디렉토리에 들어가시면 패치되는 파일의 목록을 만나실 수 있습니다. ㅋㅋㅋ
5. 그다음 분석 고고씽~
 
 패치 파일을 잘 분석하면 역으로 패치 이후 취약해진 점을 빨리 찾을 수 있을지도 모르겠군요. ^^  이미 다른 분들은 다 아시는 내용인데, 왠지 뒷북성 포스트일지도... ㅎㅎ

 그럼 다들 좋은 밤 되시길~ ;)



 오늘 블로그 스킨을 바꾸고 나니 다른 것은 그럭저럭 마음에 드는데, 사이드바와 본문의 위치가 마음에 들지 않았습니다. 스킨 위저드에서 사이드바와 본문의 위치를 바꾸는 항목은 없더군요. 그래서 스킨 편집HTML/CSS 수정으로 가서 style.css 파일을 조금 손봤습니다.

 의외로 아주 간단하게 되어있더군요. 아래의 소스코드에서 content.sidebar 항목의 left와 right만 바꾸면 원하는 위치에 본문과 사이드바를 둘 수 있습니다.

 content는 본문의 위치를 나타내고 .sidebar는 사이드바의 위치를 나타냅니다. ;)
 진작 바꿀껄~ 괜히 마음 고생만 했네요 ^^)/~


 헛... 이런 마이크로소프트웨어 4월호가 온지 좀 됬는데 이제서야 봤습니다. ^^;;; 다른 것 하느라 정신이 없어서 미처 보질 못했네요. ;)

 이번호를 마지막으로 OS Framework에 대한 내용이 끝났습니다. >ㅁ<)/~ 사실 입사 한달 전에 4개월 연재가 결정이 나서 급하게 3개월분을 미리 썼기 때문에 내용이나 예제가 좀 미흡한 면이 있었습니다. 마지막 4월호 역시 급하게 정리해서 역시나 안타까움이 남습니다. ㅜ_ㅜ

 글을 정리하면서 꼭 해보고 싶었던 일이었기에 나름 최선을 다했는데,  다시 읽어보니 좀 부끄럽군요. 내용이 영 부실한게... ㅡ_ㅜ... 기회가 된다면 지금 보고있는 내용들(Dual Core)도 기고를 해봐야겠습니다. 뭐 실리게 될지는 알 수 없지만... 그냥 묵혀두는 것 보다는 좋겠지요 ;)

 아래는 마이크로소프트웨어 4월호의 목차입니다.

=====================================================
STEP BY STEP

VS 2008을 이용한 블로그 프로그래밍│최지훈  290
실전 블로그 프로그래밍 2

3D 소프트웨어 플러그인 개발기│조영락  298
가지각색 3ds Max 플러그인

리눅스 시스템 프로그래밍│서상원 306
고급 파일 입출력

프레임워크로 다시 보는 운영체제 개발│한승훈 314
스케줄러 및 동기화 객체 구현하기

오픈소스 검색 엔진의 세계│이성호 322
컴파스 프레임워크

=====================================================

ps) 끝으로 아무것도 아닌 제 글을 실어주신 마이크로소프트웨어의 문경수 기자님께 감사를 드립니다.
 
 어제 밤부터 DevkitPro와 VS2005 간의 DLL 문제(아마..) 때문에 시름하고 있습니다. ㅜ_ㅜ... 분명 Visual Studio 2005를 설치하기전에는 괜찮았는데 설치하고 난 뒤에 컴파일을 했더니 아래와 같은 오류가 발생합니다. ㅜ_ㅜ DLL을 덮어씌워보고 했는데도 계속 같은 오류가 발생하는군요.

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

 아아... 이거 원... ㅡ_ㅡa... 어떻게 해결해야할지... 답답합니다. ㅜ_ㅜ)/~ 혹시 누가 아시는분 있으시면 답글로 제보 부탁드립니다. ^^)/~

 그럼 좋은 주말 보내세요 ;)


 몇시간 전부터 본격적으로 PSP 스펙을 보고 있습니다. 상당히 흥미롭더군요. MIPS CPU 1개가 있고, Media 처리를 위한 MIPS가 또 하나있으며, GPU도 있더군요. @0@.... 이런 괴물머신을 봤나....

 SDK를 보니 sce어쩌구로 시작하는 함수가 많던데, 혹시 SDK에 다 구현되어있나 싶어서 확인했더니 Stub만 있었습니다. 아직 본지 얼마 안되서 확실치는 않지만, 프로그램 로딩할때 PSP Firmware의 함수와 Link 시켜주는 것 처럼 보이는데... 다시말하면 Firmware에서 지원하는 함수일지 모른다는 것이지요.

 별별 함수가 다 있던데, NDS 홈브루를 개발할 때와는 천지 차입니다. NDS에서는 전부 일일이 구현해야 했거든요. 물론 NDS에도 개발을 편리하게 해주는 PALib가 있긴 합니다만, PSP SDK 처럼 많은 기능을 제공하지는 않습니다. ^^;;;;

 아아~ 신납니다. ;) 글을 정리하던지 홈브루를 하나 만들던지 해야겠네요 ^^
 그럼 다들 좋은 밤 되시길~


ps) 기념으로 PSP 홈브루 개발에 도움이 되는 유용한 사이트 링크를 올립니다.
http://www.ps2dev.org

 화요일쯤에 RSS를 돌다가 재미있는 글을 찍어놨는데, 오늘에야 겨우 읽어봤습니다.Cell Processor를 제대로 활용하기 위해서 프로그래밍을 어떻게 해야하는가에 대한 내용을 간략하게 설명해 놓은 글인데, 원문은 http://www.ddj.com/hpc-high-performance-computing/197801624 에서 볼 수 있습니다.
사용자 삽입 이미지

Mercury사에서 팔고있는 PCI Cell Accelerator Board


 PS3에 사용된 Processor가 Cell Processor인 관계로 한번쯤은 다들 들어보셨을 것이라 생각합니다. 저도 "엄청난 성능을 내는 괴물" 정도로 생각하고 있었는데, 찾아보니 자세한 Spec이 나오더군요(Spec은 http://www.mc.com/uploadedfiles/Cell_accelerator_board.pdf 에서 볼 수 있습니다). 문서를 보면 총 9개의 Processor와 그것들을 연결해 주는 Bus로 구성된다는 것을 알 수 있습니다.

* The Power™ processing element (PPE) has dual hardware multithreading and a standard VMX vector processing engine. It has separate 32 KB L1 data and instruction caches and 512 KB of L2
cache. The processing power of the PPE is in addition to the 180 GFLOPS from the SPE array.
* In the array of eight synergistic processing elements (SPEs), each has a dual-issue pipeline, a 128-bit-wide vector processing engine, a very large register set (128 registers, each 128 bits wide), and 256 KB of local store (LS). Each SPE accesses system memory via its memory flow controller (MFC), which is a high-performance
DMA engine.
* A high-speed data ring called the element interconnect bus (EIB) consists of two pairs of counter-rotating rings with a sustained aggregate bandwidth of 180 GB/s.

 좀 복잡한 구조를 가지고 있는 듯 한데, 아래의 블럭 다이어그램을 보시면 이해하는데 도움이 되실겁니다.
사용자 삽입 이미지

 원문에서는 BFS(Breath First Search)를 예로 들어 Cell Processor Programming에 대해서 설명하고 있습니다. 각 Processor에 Branch를 어떻게 할당하며, 공유된 Memory에 접근은 어떻게 하는가 등등에 대한 내용이더군요. 간단히 아래와 같이 요약하면 아래와 같습니다.

1. SPELocal Storage를 잘 이용하고
2. DMADouble Buffering을 이용해서 Data Transfer Time을 줄이며
3. Data Structure를 효율적으로 구성하라

 원문을 잘 찾아보면 IBM에서 제공하는 Cell Processor SDK의 링크도 찾아볼 수 있는데, Simulator도 포함하고 있다니 관심있으신 분은 환경을 구성해 보는 것도 좋을 듯 합니다(http://www-128.ibm.com/developerworks/power/cell/downloads.html?S_TACT=105AGX16&S_CMP=LP).

 Cell Processor가 좋긴 하지만, 병렬 처리(Parallel Processing)를 위한 Overhead가 있어서 좀 꺼려집니다. 하지만 Performance가 무엇보다 중요하다면 Cell Processor는 좋은 대안이 될 수 있을 것 같습니다. 무시무시한 성능을 낸다고 하니 나중에 시간나면 보드라도 하나 구매해야겠습니다. ^^;;;

 그럼 다들 좋은밤 되시길~ ;)


 회사에서 정리할 것이 있어서 고민 끝에 도쿠 위키(doku wiki)를 고르고 오늘 설치했습니다. 사실 뭐 설치랄 것도 없지요. ;) 그냥 http://kkamagui.tistory.com/421에 있는 파일을 다운받아서 압축을 푼다음 mapache.exe를 실행하면 됩니다. ^^)/~ 실행하면 아래와 같은 검은색 콘솔 화면이 표시됩니다.
사용자 삽입 이미지

 그후 브라우저를 띄워서 http://localhost:8800 으로 접근하면 위키에 접근할 수 있습니다. 접근하면 아래와 비슷한 화면이 표시되는데, 아래쪽에 "Edit this page" 버튼을 눌러서 편집할 수 있습니다. 위키 문법은 Search 창에서 Syntax로 검색하면 바로 찾을 수 있습니다. 물론 웹에도 많은 자료가 있지요 ;)
사용자 삽입 이미지

 작년부터 위키에 적는 습관을 들였더니, 이제는 어디다 적지 않으면 불안한 지경까지 왔습니다. ㅜ_ㅜ... 그래도 기록을 남긴다는 의미에서 보면 상당히 좋은 습관인 듯 합니다. 항상 뭘 까먹고 다니니까요 ^^;;;

 위키는 구조화된 문서를 아주 빨리 만들 수 있다는 것이 가장 큰 장점인 것 같습니다. 정말 프로그래머에게는 딱이네요. ^^)/~!!!

 도쿠 위키 만세~!!!

ps) 도쿠 위키는 섹션 에디팅 기능을 제공합니다. 즉 글이 길어질 경우에 헤드라인 별로 따로 편집할 수 있다는 이야기지요. 마치 위키피디아에서 사용되는 미디어위키처럼요 ;) 한번 시험삼아 써보시는 것도 괜찮을 것 같습니다.


+ Recent posts