글쓰기 메뉴

rbenv 새로운 버전의 루비 설치하기

설치가능한 루비 버전의 목록은 아래처럼 확인할 수 있지


$ rbenv install --list


목록에 없는 최신 릴리즈의 Ruby 를 설치하려 할 때 rbenv 를 업데이트하면 되지. (Git 버전)


$ cd ~/.rbenv
$ git pull


이렇게 하고 설치가능 목록을 다시 확인하면 따단~ 하고 새로운 릴리즈가 떠야하는데 새로운 버전의 루비가 목록에 없는 경우가 있어. 그럴땐 ruby-build 를 업데이트해주자.


$ cd ~/.rbenv/plugins/ruby-build
$ git pull


잘 될꺼야.


어디서 왔지?
[["synd.kr", 2], ["www.google.co.jp", 1], ["unknown", 649], ["www.google.co.kr", 41], ["www.google.com.sg", 1], ["www.google.com", 3]]
다른 글들
1 0

우분투 몽고DB 설치 및 부팅 시 자동 실행 - Install MongoDB on Ubuntu & Start MongoDB on system start

설치는 매우 간단하고 MongoDB 공홈에 최신 버전으로 갱신된 문서가 있어 해당 페이지를 참고하면 된다.
공홈 설치 문서 링크:

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
GPG Key
리스트파일 생성 (16.04. 기타 버전은 공홈 참조)

패키지 디비 갱신
MongoDB 설치

근래의 대부분의 배포본은 Upstart  대신 Systemd를 사용하기 때문에 위와 같이 설치된 MongoDB 역시 init 스크립트를 제공하지 않는다.
service 커맨드로 시작, 중지, 재시작 등의 관리가 가능하나 systemctl 커맨드를 익히는게 바람직하다고 본다.
systemd 를 사용해 MongoDB 를 초기 실행 시키기 위해 다음의 파일을 작성한다.
/etc/systemd/system/mongodb.service

Unit 섹션의 Description 은 서비스에 대한 간단한 설명을 포함한다.
같은 섹션의 After 는 네트워크 연결 후 구동하겠다는 의미
Service 섹션의 User 는 서비스 실행 사용자를 지정하고 ExecStart 는 실제 구동 커맨드를 입력한다.
Install 섹션의 WantedBy 는 실행 타깃을 구분하는데 multi-user.target 은 기존 런레벨 2,3,4 로 일반적인 부팅 시에 동작된다.
구동
상태 확인
정지
부팅 시 실행
systemd 의 target 에 대해 보다 자세히 알고 싶다면 아래의 링크를 참조.
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Targets.html
systemd 에 대해 보다 자세히 알고 싶다면 아래의 링크를 참조
http://lunatine.net/about-systemd/
0 0

Rails 모든 연결 SSL 로 변경하기 + Nginx Redirect

Let's encrypt 와 EFF 그리고 여러 스폰서들과 개인기부자들 덕분에 간단하게 SSL 을 적용했으니 이제 모든 http 연결을 ssl 로 돌려보자.
Rails 에서는 Controller 단위에서 force_ssl 을 사용할 수도 있고 보다 와이드하게 전체 설정에서 다룰 수도 있다.
씬디는 https 변경에 다른 별 이슈가 없기때문에 config/environments/production.rb 에 force_ssl 을 설정했다.
이렇게 설정하면 route 룰을 포함해 모두 ssl 연결로 변경된다.
NginX 나 Apache 등을 리버스 프락시로 구성하여 백단에 서버들에게 넘겨준다면 다음의 헤더를 반드시 포함시켜야한다.
Rack 서버는 1) 443 포트로 연결되었는지 2) ENV['HTTPS'] 값이 "on" 인지 3) X-Forwarded-Proto 헤더가 "HTTPS" 인지 3 가지를 보고 판단하기 때문에 리버스 프락시 뒤에 있는 puma 나 unicorn 등은 443 포트가 아닌 다른 포트나 유닉스소켓으로 통신하기 때문에 HTTPS 연결인지 확인하지 못하고 계속 리디렉션 시키게 된다.
NginX 나 Apache 단에서 301 리디렉션으로 연결 프로토콜을 변경할 수도 있겠다.
80 포트를 수신하는 서버 설정을 넣고 해당 설정에서는 http 를 https 로 변경하여 리디렉션시키면 443 을 리스닝하고 있는 아래의 설정이 요청을 수신하게 된다. 
끝.
0 0

우분투 14.04 wkhtmltopdf 설치

wkhtmltopdf 는 HTML 페이지를 PDF 로 만들어주는 오픈소스 도구로 Qt WebKit 엔진을 사용한다. 자매품인 wkhtmltoimage 는 같은 방식으로 HTML 을 다양한 형식의 이미지로 변환시켜준다.
Ubuntu 14.04 에서 apt-get 으로 wkhtmltopdf 패키지를 설치할 수 있으나 Qt 가 wkhtmltopdf 에 맟춰 패치되지 않았다면 몇 가지 기능이 제한된다. 예를 들면 HTML 에 있는 링크가 PDF 에 사라지는 등의 오류가 있을 수 있다. 관련 옵션은 --enable-external-link 인데 Qt 가 패치되어 있지 않으면 해당 옵션을 켤 수 없다. 
그러니 wkhtmltopdf 홈페이지에서 컴파일되어 있는 바이너리를 다운받아 설치하도록 하자. 만사가 편하다.
* 우분투 서버를 사용하고 있을 경우 X 시스템과 폰트관련 패키지가 설치되어 있지 않다. 이럴 경우 먼저 필요한 패키지와 폰트를 설치하자.
폰트는 마음에 드는 패키지를 찾아 설치하면 되는데 별도의 설정없이 바로 사용할 수 있는 한글 폰트는 unfonts, baekmuk, nanum 정도 되겠다. 각각 패키지는 아래와 같다. (우분투위키에서 CJK 폰트 참고)
은폰트 - unfonts
백묵폰트 - baekmuk
나눔폰트 - nanum
폰트툴과 폰트가 설치 된 후 wkhtmltopdf 다운로드 페이지에서 Ubuntu Trusty (14.04.1) 버전(64-bit)의 .deb 파일을 다운받아 아래와 같이 설치한다. 
설치 후 아래와 같이 확인할 수 있다.
webpage/url 이라는 주소의 웹페이지를 save.pdf 로 변환하는 명령어 예제는 다음과 같다. 자세한 옵션은 man wkhtmltopdf 로 확인할 수 있다.
--print-media-type
스크린 타입이 아니라 프린트 미디어로 PDF를 렌더한다.
--page-size
페이지 사이즈를 지정한다. Letter, A4, A3 등의 형식으로 지정할 수 있다.
* 공식 홈페이지에서 전체 리스트 링크를 제공하고 있으나 현재 사용이 연결이 되지 않는다. 소스에서 확인한 전체 리스트는 이 곳에 적어둔다.
* --page-width, --page-height 로 페이지 크기를 지정할 수 있다 
--dpi
dpi (dots per inch) 값을 지정한다.
-T, -B, -L, -R
상(Top), 하(Bottom), 좌(Left), 우(Right) 여백을 지정한다.
요즘 웹페이지의 PDF 변환이나 이미지 캡처는 요즘 PhantomJS 를 사용한 방식이 훨씬 많이 소개되고 있다. 의존패키지에 대한 고려나 설정에 대한 부담감이 없기 때문일텐데 개인적으로 wkhtmlto* 를 오래전부터 사용하고 있어서 정리해봤다.
0 0
Square

안드로이드 앱 업데이트

씬디는 원래 웹 버전이 베이스라 (아.. 시대착오적...) 초기부터 쓰시던 분들은 앱이 있는지도 모르실텐데 몇달전에 안드로이드만 우선적으로 (제가 안드유저라) 등록했었습니다.
저조차도 앱은 설치했지만 설치하고 보니 '당겨서 새로고침' 이 안되기에 뭔가 어색해서 안쓰고 있었죠.
그런데 간간히 안드 앱으로 사용자분들이 들어오시더니 급기야는 누군가 플레이스토어에 무려 리뷰를 남기신겁니다!!
화면 회전 시키면 첫페이지로 돌아간다는 오류 리포트를요.
엄청나게 짜증나는 오류일텐데 그걸 리뷰로 남겨주신 정성과 애정에 무한한 감사를 느꼈지만 과연 내가 언제 업뎃 작업을 할 수 있을까하는 걱정도 있었습니다.
그러다가 오늘 아침 드디어!!! 꽤 이른시간에 출근하게되어 상큼한 기분으로 풀충전되어있는 그 타이밍을 놓치지 않고! 앱을 업데이트했습니다.
회전 시 초기페이지 이동 오류와 '당겨서 새로고침' 을 추가했습니다.
혹시나 씬디 사용하시다가 오류나 버그가 아니여도 불편한점이 있거나 추가되면 좋겠다는 내용이 있으면 아무곳으로나 알려주세요.
씬디에 글로 써주시면 제일 좋구요.
사족)
당겨서 새로고침을 직접 구현하지 않고 안드로이드 SDK 에서 제공하는 SwipeRefreshLayout 을 사용해버렸네요.
구버전 호환성을 꼼꼼하게 확인하지 않았는데.. 업댓은 했으나 마음의 짐은 또 하나 생겼네요 ㅠ.ㅠ
0 0
Square

업데이트

프레임워크 버전이 너무 올라가서 나중에 따라가려면 대형 공사가 될까 걱정되어 프레임워크 버전업. 하지만 이미 큰 공사였음. 아 힘들어.
텍스트 에디터도 자잘한 오류들이 많이 보여서 코드 정리 및 라이브러리들 일부 업데이트. 완전 힘듬.
별로 테스트 해볼 시간은 없어서 대충 동작되는 것 같아서 서버에 적용.
오류나면? 알려주삼.
1 0

레일즈4 어플리케이션 이름 변경

2.x 버전에서 어플리케이션 이름 변경해봤었는데 '아, 그냥 프로젝트 새로 만들고 소스 카피가 좋겠다' 라는 생각이 들 정도로 변경해야 할 파일의 갯수가 찝찝한 기분을 지울 수 없었지.
그 이후로 한참 그럴 필요가 없었는데 이번에 기존 소스를 카피할 일이 생겼지.
레일즈 4.1.x 이상의 버전에서 단 2개의 파일에만 어플리케이션의 이름이 지정되어 있더군. 깔끔하게 정리된겨.
config/application.rb 파일에서 module 이름을 변경하고,
config/initializers/session_store.rb 파일에서는 세션 스토어의 키 이름만 변경해주면 끝!

수고하고 있는 루비 커뮤니티에 축복을! ㅋㅋ
+)
3버전이나 4.0.x 버전에서는 https://github.com/get/Rename 을 사용해서 깔끔하게 변경가능.
참고)
https://stackoverflow.com/questions/20988813/how-to-rename-rails-4-app/23753608#23753608?newreg=15907dbe38c743fa9f7aca841050ba57
0 0
Square

earth: windmap
어스 윈드맵으로 황사, 먼지 등 대기 상태 및 예보 보기

오늘은 정말 잠깐 밖에만 나가도 목이 칼칼하더군.
주변에 미세먼지와 황사의 강력한 조합으로 인해 목이 붓는 등 고통받고 계신분들도 꽤 보이고.
이놈의 황사는 언제 걷힐까 싶어 "어스"에 접속. 
은 노란 하늘 ㅋㅋ
저 두꺼운 먼지들이 언제쯤 걷힐까 예보화면을 확인함.
12일이 되면 한국 상공은 꽤나 투명하기에 주변인들에게 "어스"를 보여줬더니 "이게 머여?" 라는 반응.
미세먼지 예보는 앱들 설치 많이 했던데 "어스"는 잘 모르는 모양.
그래서 "어스" 에 대해 짧은 사용법을 작성하기로 함.
어스 윈드맵(earth: windmap)은 일본에 살고 있는 미국인 개발자 Cameron Beccario가 만든 웹사이트로 2013년 12월 11일 오픈했고 윈체스터 대학교에서 열린 The Graphical Web 2014 컨퍼런스에서 개발 배경 등에 대한 발표가 있었다.
일부에서 "어스"를 인디드(Indeed, 취업/채용 사이트)에서 만든 사이트라고 설명하는데 Cameron Beccario 는 위 컨퍼런스에서 개인 공부를 위해 시작한 개인적인 프로젝트였다고 밝혔다. (당시의 직장은 Indeed)
초기버전은 Air와 Ocean 두 개의 모드만 제공했으나 현재 Chem(케미컬)과 Particulates(dust, smoke, soot, clouds) 가 추가되었으며 GMAO/NASA 의 데이터를 사용한다.
대충 설명은 된 것 같고 짧은 사용법을 시작하기전에.. 진심으로 Cameron Beccario 의 수고와 노력에 감사한다.
여러분도 고마운 마음이 생긴다면 글 하단의 링크를 타고 Cameron Beccario 의 트위터에 인사를 남기거나, 어스의 아트웍을 구입해 직접적으로 도움을 줄 수 있다.
"어스" 사이트에 접속하면 기본값으로 설정된 지표면에 불고 있는 바람을 볼 수 있다.
https://earth.nullschool.net

미세먼지 및 대기 중 화학물질(일산화탄소와 이산화탄소, 황산화물)을 확인 하기 위해선 화면 좌하단의 "earth" 메뉴를 클릭해 설정을 변경해야한다.
[미세먼지 및 대기오염 물질 보기 설정] 
Height: Sfc (관측높이는 surface, 지표면으로 설정)
Mode: Chem
Overlay: COsc (일산화탄소)
Overlay: CO2sc (이산화탄소)
Overlay: SO2sm (이산화황)
Mode: Particulates
Overlay: DUex ((미세)먼지 = dust, smoke, soot, clouds 등으로 대기의 광학적 두께를 - 얼마나 불투명한지를 - 표현)
Overlay: SO4ex (황산화물)
[예보 및 지난 데이터 보기]
Control 메뉴
<< : 24시간 이전 데이터 확인
< : 3시간 이전 데이터 확인
> : 3시간 이후 데이터 확인
>> : 24시간 이후 데이터 확인
⊕ : 현재 위치를 중심으로 

Grid : 그리드 표시
▷ : 바람 표시
HD : 고해상도 설정
- 끝 -
https://earth.nullschool.net [어스]
https://twitter.com/cambecc [개발자 트위터]

http://memory.org/point.b/earth.html [아트웍 구매]
https://en.wikipedia.org/wiki/Cameron_Beccario [개발자 위키문서]

https://www.youtube.com/watch?v=QXNODLWhSbw [The Graphical Web 2014 발표]

https://gmao.gsfc.nasa.gov/GEOS/ [GEOS-5 - GMAO / NASA]
2 3
Square

아! 무선 해피해킹!
드디어 HHKB 블투버전!

해피 해킹 키보드 프로페셔널2 버전을 10년째 쓰고 있습니다.
2007년 이케부쿠로 빅카메라에서 구입한 해피 해킹 프로2 는 아직도 키감을 포함해 한결같은 성능으로 매일의 작업에 사용되고 있죠.
단 하나. hhkb 에 바라는 것이 있었다면.. "무선".
유선이라서 문제가 된적은 없습니다만 무선으로 책상을 정리하고 싶은 강한 욕망은 hhkb 를 대체할 수 없음에 항상 억눌려있었습니다.
그런데! 그런데! PFU 에서 드디어 블루투스 버전을 출시한답니다.
블루투스 3.0 클래스 2, 프로파일은 HID 1.0, 하위버전 호환가능하며 4대까지 페어링 지원이랍니다.
전원은 AA 건전지 2개로 스펙에 따르면 3개월 사용가능하다고 하네요. 전원 공급을 위한 USB 단자가 있습니다만 케이블은 미포함이고 연결용으로는 사용할 수 없다고 합니다.
일본 아마존에서 한정판매로 진행되고 있으며 4월 20일까지만 주문가능합니다.
가격은 29,700엔. 검정색만 있고 영문각인과 무각, 일본어배열-일본어 각인 총 3종이네요.
영문 무각으로 구매해야겠네요.. 안사고 버틸 방법이 없...
PFU Online,
HHKB BT
1 0

리디렉션 페이지에 구글 아날리틱스 코드 집어넣기

리디렉션 되는 페이지에 구글 웹로그 분석기 추적 코드를 넣고 meta 태그나 스크립트로 페이지를 이동시키면 데이터 수집이 완료되지 않은 상태로 페이지가 종료되고 로그가 남지 않는 문제가 있지.
리디렉션을 5초 정도로 잡아도 무관하다면 그냥 5초로 잡고 돌려도 OK.
리디렉션 타깃 페이지가 같은 도메인 아래에 있다면 타깃 페이지에 추적 코드가 있는 것 만으로 레퍼러로 처리되어 데이터가 수집되니까 이것도 OK.
하지만 리디렉션을 외부 사이트로 보내야하고 1~5초 정도 사용자를 묶어두는게 부담스럽다면 추적 코드의 동작이 완료된 후 리디렉션을 실행하면 되겠지.
2013년부터 사용된 Google Universal Analytics 추적 코드라면 hitCallback 콜백을 사용하면 되고 혹시 2013년 이전 코드라면 글로벌 오브젝트인 _gaq 큐에 함수를 밀어넣으면 된다네.
추적 코드 어딘가에 _gaq 가 있으면 그냥 오래된 코드, _gaq 가 없고 다음과 같이 추적코드가 시작된다면 Universal.
오래된 버전에서는 아래처럼 리디렉션이 가능
Universal 버전에서는 아래처럼 hitCallback을 사용할 수 있음
이상 끝!
1 2

파손

서피스 프로 3를 가방에 넣은채로 살짝 떨어트렸는데 모서리로 떨어졌나보다.
우측 상단이 살짝 깨지고, 액정 유리에 금이 하나 생겨서 점점 진화하고 있다. 다행인건, 액정 보호 필름을 붙여놔서 더 이상의 피해는 없을 것 이라는 점. 그리고, 터치도 이상없이 잘 먹힌다. 
서피스 프로 3는 부분 수리가 안되는 놈이라 리퍼를 받아야 하는데, 물경 464000원이 든다고 한다. 그래서 일단 이대로 쓰기로 결정을 했다. 서피스 프로 3가 시장에 풀리면서 과거 서피스 버전을 리퍼 받을때 서피스 프로 3로 해주던 때가 있었으니까, 이걸 이대로 좀 더 쓰다가 서피스 프로 4로 리퍼 제품을 줄때 리퍼를 받아야겠다(는 희망사항). 아니면, 기능에 이상이 생길 때 리퍼를 받자. 
속이 쓰리다. 부글부글.
0 2

Rails4, MySQL 4바이트 유니코드
(아이폰 특수문자 등의 Emoji) 지원 설정

MySQL의 utf8 문자셋은 3-Byte UTF-8 Unicode Encoding 을 지원하지.
3 bytes 면 사실 대부분의 글자가 다 표현되거든. 한중일, 중동, Latin 및 특수문자 다 포함해서 말이야.
그런데 원래 UTF-8 은 4 bytes 까지 기록할 수 있어. (그보다 더 옛날 스펙은 6 bytes 까지)
하지만 별로 쓸일도 없고 해서 MySQL 같은 몇몇 소프트웨어는 UTF-8 을 3 bytes 까지만 지원하는겨.
꽤 오랫동안 별 문제없었지만 아이폰의 특수문자 - Emoji 가 4 bytes 유니코드라서 이거 지원 안되는 DB에는 데이터가 제대로 안들어가는 문제가 생긴거지.
아이폰 사용자도 많고 이모지 사용도 꽤 잦기 때문에 - 인스타그램 이딴건 글자보다 이모지가 더 많아! - 이제는 우리도 4 bytes 유니코드를 지원해야 하는거지.
지금 서비스에서 이모지가 저장되는지 아닌지는 다음 문장을 복사해서 저장해보면 알 수 있지.
제대로 저장이 안된다면 이제 설정을 시작해보자.
준비물
MySQL 버전 5.5.3 이상!
차사고와 DB 사고는 항상 일어날 수 있지. 한 백번쯤 백업해놔.
1. database.yml 에서 인코딩 등 수정
2. MySQL 인덱스 길이 수정
3. 데이터베이스 재생성 또는 테이블 수정
이제 긴장 좀 때리자.
3-1 디비를 전부 삭제하고 다시 만들어도 되는 경우
3-2 디비 재성성이 불가능한 경우
1) 데이터베이스 수정
2) 테이블 수정
3) 컬럼 수정
3-3 점검걸고 데이터 백업하고 디비 재성성 후 restore
이거 편하긴하겠지만 무슨일이 생겨도 난 책임 못 진다.
진짜 책임 못 진다. 백업 백번하고 로컬 PC랑 다른 서버에 여기저기 보관해라.
뭔지 잘 모르겠으면 그냥 하지마라.
1) 일단 데이터만 백업
2) 디비 재생성
3) 데이터 리스토어
끝!
1 3

페이스북 임베드 URL,
소셜 플러그인 (XFBML) 파싱

임베드 대상 페이스북 콘텐츠는 "포스트", "비디오", "사진" 이렇게 종류별로, 웹과 모바일에서 각각 URL 형식이 조금씩 달라 프로그램으로 이를 처리하기 위해 동일한 형태의 주소가 필요하다.
SDK를 사용해 페북 컨텐츠를 임베드하는 경우 기준이 되는 URL 은 웹용 URL 이다.
뭐, URL은 딱보면 알겠지만 fbid 라는 고유ID만 빼오면 된다. 
모바일에서 포스트에 대한 주소만 URL 파라미터로 처리되어 있고 나머지는 전부 URL Path에 포함되어 있으니 아래와 같은 정규식으로 fbid부터 발라내자
정규식은 Ruby 2.x 버전에서만 동작을 확인했지만 look-behind 와 look-ahead 외에 정규식 엔진을 타는 내용이 없기 때문에 동작이 안된다면 그 부분만 수정하자.
사실 효율을 생각한다면 저딴 정규식으로 한방에 fbid 를 뽑는 것 보다 fbid 가 파라미터로 존재하는 케이스를 분리시키고 나머지 정규식도 2회로 나눠 돌리는게 더 좋지만... 귀찮으니 한 줄로 하자.
상식적으로 fbid 만 뽑아내면 될 것 같으나 페북 임베드에 사용되는 URL은 사용자 아이디가 버킷 이름처럼 포함되어 있다. 문제는 모바일 URL에 사용자 아이디-문자-가 없다는 점.
이 문제는 페이스북의 짧은 주소 fb.com 을 사용해 해결할 수 있다. http://fb.com/<fbid>의 형식으로 리퀘스트를 보내면 해당하는 완성된 주소로 리디렉션 시켜준다. - 임베드 코드 생성 시 fb.com 을 그냥 쓸 수 있으면 좋을텐데 안되더라.
curl 로 리디렉션된 최종 URL을 뽑는 코드는 아래와 같다.
내가 쓰는 Typhoeus 에선 아래처럼 최종 URL을 받으면 된다. 
이렇게 얻은 URL 로 
위와 같은 XFBML을 사용해 임베드가 가능하다. 다양한 옵션은 페북 문서 확인.
Javascript SDK 를 사용하는 경우 SDK 가 로드된 후 FB 객체를 initialize 하면서 페이지에 있는 모든 XFBML 을 파싱할 수 있고, 이와 다른 타이밍에 추가적으로 XFBML 을 파싱해야하는 경우는 아래의 코드로 가능하다.
특정 엘레먼트만 파싱하려면
jQuery 로 돔을 잡아 파싱하려면
이렇게 파싱하면 컨텐츠가 임베드된다.