포스트그레스 postgis 속도

박제권
레일즈 + PostGIS 조합을 잘 쓰고 있었다. // migration add_column :spots, :gps, :point, :geographic=>true , :srid => 4326, :spatial => true // model scope :nearby_to, lambda { |spot, distance| where("ST_DWithin(gps, ?, ?) AND id != ?", spot.gps, max_distance, spot.id) } // controller: @near_spots = Spot.nearby_to(@spot, 100) 여기까지 하면 문제없이 근처의 스팟들이 잘 뽑아지니까, 아무생각없이 쓰고 있었는데…. 로그를 보니… 개발 머신쪽에서 30ms 정도 걸리고 있었다. 일반적인 검색이 1ms 이하로 응답이 나와야하는데!

매버릭에 루비 irb 에서 한글 문제

박제권
의외로 안쓰셔서인지, irb 에서 한글이 안먹는데 대해 글이 없군요. 매버릭에 기본으로 설치된 루비는 dlopen 따위나 권한문제가 계속 생기더군요. 애플께서 디폴트로 2.0.0p247 이 설치해 주셨음에도 불구하고, 이걸 못쓰네요. 결국 rbenv 를 동원해서 설치하는 했는데요. 설치는 http://blog.55minutes.com/2013/09/rails-os-x-install-guide에서 설명하는대로 따라가면 잘 됩니다. (중간에 brew install qt 는 부담스러워서 안했습니다) 다만, rbenv install 하는 장면에서 brew install readline export RUBY_CONFIGURE_OPTS=--with-readline-dir="$(brew --prefix readline)" CFLAGS=-O3 rbenv install 2.0.0-p247 라고 하셔야 irb에서 한글 입력이 됩니다. 그리고, 앞의 링크에 postgres 설치하는 부분이 있는데요.

앵귤러 공부하기

박제권
백본이나 엠버따위가 나왔을 때, 한번씩 따라해 보기는 했지만 오랫동안 붙잡게 되질 않았습니다. 앵귤러는 좀 오래 붙잡고 있는데요. 앵귤러 홈페이지내의 튜토리얼은 별로네요. 밖에 있는 사람들이 더 잘 가르쳐주시는 듯합니다. 쓸만해 보이는 링크들을 정리해 둡니다. 인강+자습가이드 http://egghead.io/lessons : 동영상 강의입니다. 가만히 앉아서 쳐다보면 앵귤러 기본개념들이 눈에 들어옵니다. 레일즈 캐스트라는 선례가 있으니까, 인강이 곧바로 나오는 군요. 최근 몇개는 유료입니다. http://www.thinkster.io : 이 녀석이 시키는 순서대로 공부하는 것이 올바른 순서인 듯 합니다. 앞의 동영상을 보고 배워야겠다는 뽐뿌를 당하신 다음 정독하면 어떨까 싶습니다.

핸들바

박제권
이밤, 핸들바 튜토리얼을 따라해봅니다. 와! 재미있네요!

루비온레일즈 기본을 잊어버리면

박제권
1. Rails 의 changed? 레일즈에 얼마나 많은 기능이 있는걸까. 책 본지 너무 오래되었고, 쓰는 기능만 쓰기 때문에 벌어진 사건. CSV 파일을 읽어서 SQL 테이블에 넣는 작업을 하는데, CSV 파일은 주기적으로 새 버전이 올라온다. 그러면 기존의 값들과 비교해서 바뀐 것이 있으면 관리자에게 알려주어야 한다는 요구사항이 있었다. 어느 레코드의 어느 필드가 바뀌었는지 확인하는 기능을 구현하는 것이, CSV 이 여러개이고, SQL테이블과 1:1 대응도 아니기 때문에 복잡해보였다. 이런 저런 안을 내고, 고민하고 코드를 만들었는데, 며칠을 헤맨뒤에야 ActiveRecord 의 changed?

PostgreSQL 한글 정렬

박제권
포스트그레스에서 국가이름을 입력하고 정렬을 시켜봤습니다. 뭔가 이상합니다. 검색을 해보니, http://stackoverflow.com/questions/14191848/postgresql-order-by-is-very-weird에 문제와 원인이 잘 설명되어있습니다. collate 때문이랍니다. 따라서 쿼리를 다음처럼 주면. select name_ko_kr from countries order by name_ko_kr collate “C”; 출력은 아래처럼 정상적으로 나옵니다. 하지만, 모든 쿼리마다 collate 를 주는 건 뭔가 모질라보여서, 디폴트를 찾아봤는데, 실패했습니다. 현재까지 발견한 유일한 방법은 initdb 를 호출하기 전에 환경변수에 LC_COLLATE 를 넣어주는 것 뿐이네요. (http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=165894) 즉, export LC_COLLATE=“C” 라고 쉘에서 입력하면 해준다음에, brew intall postgresql 이나 apt-get install postgresql 을 하던지 하면 한글 정렬을 제대로 해주십니다.

PostGIS 덕분에

박제권
최근에는 MySQL대신 PostgresQL을 사용하고 있습니다. 테이블에서 필드를 추가/삭제하는 경우에도 table lock이 걸리지 않는다는 점1이 가장 큰 이유였습니다. 손에 익기까지 시간이 좀걸리긴 하지만, 서비스 다운타임을 최소화 시켜줄 수 있지 않을까 생각합니다. PostGIS는 설치과정이 좀 복잡한데요. gist에서 올바른 설치 법을 발견했습니다. 몇가지 오류를 수정해서 gist에 올렸습니다. (우분투버전도 있습니다.) 레일즈에서 사용하려면, 젬이 필요한데, rgeo + activerecord-postgis-adapter 조합이 제일 편한 듯 합니다. 사실, 예전부터 실무에서 이 조합을 적용해보고 싶었지만 적당한 데이터가 없었습니다. 다행히 이번 과제에서 아주 딱 맞는 상황을 발견해서 적용할 수 있었습니다.

간단한 데이터베이스 입출력, 루비, 그루비, 스칼라.

박제권
데이터 데이터베이스에 간단한 항목들을 넣고 빼는 코드를 만들어보았습니다. 과연 속도차이가 얼마나 날지 궁금했는데, 결과는 별로 차이가 없네요. 각각의 코드는 다음과 같습니다. 루비 require 'pg' con = PGconn.connect("localhost", 5432, '', '', "testdb", "testdb", "") res = con.exec('delete from wikititle') i = 0 File.open("wikipedia.txt", "r") do |f| while(line = f.gets) line = line.strip puts "inserting [#{line}]" con.exec("insert into wikititle values(#{i}, '#{line}')") i += 1 end end res = con.exec('select * from wikititle') res.

루비, 그루비, 클로저, 람다

박제권
www.slideshare.net/aalmiray/jfokus-functional-groovy에 나온 깔끔한 그루비 코드를 보고 루비로도 가능한지 궁금해졌습니다. 클로저는 아주 유용한 녀석입니다. 대체로 따로 선언해서 사용하기 보다는 루프나 함수호출에 인자로 전달하는 경우가 많고, 그래서 관련 문법을 잘 모르고 지나쳤었는데, 덕분에 한번 뒤져보았습니다. 첫번째 코드는 그루비의 클로저. def dub = {int base, int factor -> base * factor } assert 4 == dub(2,2) assert 4 == dub.call(2,2) 이걸 루비로 고쳐보면 다음과 같습니다. a = lambda{|base,factor| base*factor} puts a.call(2,3) puts a.

스퀘어의 레일즈

박제권
스퀘어의 RubyConf 발표 동영상에서 기억해둘만한 부분들이 있어 정리/공유 합니다. JRuby, Clojure, Jython 등 사용, 모두 JVM위에서 동작,디플로이 할때 JVM만 고민하면 된다. API 만들 때는 fdoc을 이용, 문서부터 만든다. 자꾸 기능 추가하다보니 거대한 한덩어리 서비스가 되어버림. CI 에 오랜시간걸림 이제는 한덩어리 레일즈 서비스가 아니라, 여러 서비스의 조합으로 나가려고 함. 이를 위해 doc, deploy, security를 고민한 템플릿을 만들어 두었슴. 테스트에 참고한 책 “Growing object-oriented software guided by Tests“