Sep 102016
 

우리는 ubuntu에서 패키지 인덱스를 업데이트 하기 위해 apt-get update 라는 명령을 사용하여 업데이트한다. 하지만 만약 커스텀 패키지를 이용하는 경우 (예: owncloud)에 keyexpired라는 문구를 볼 수 있다. 이는 패키지를 서명하는데 사용된 인증키가 시간이 지나 만료되었기 때문이다. 따라서 키를 다시 업데이트 해주는 작업이 필요하다. 아래의 절차를 따라 새로 받아보도록 하자.

1)  아래와 같은 메시지를  apt-get update 사용시 발견

Reading package lists... Done
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://download.opensuse.org  Release: The following signatures were invalid: KEYEXPIRED 1472205884

W: Failed to fetch http://download.opensuse.org/repositories/isv:/ownCloud:/community/xUbuntu_14.04/Release

W: Some index files failed to download. They have been ignored, or old ones used instead.

2) apt-key list 명령어를 통해 expired 키를 찾기

# apt-key list | grep "expired:"
pub 1024D/BA684223 2012-02-08 [expired: 2016-08-26]

3) 목록에 있는 내용을 통해 “BA684223″이란 키가 2016-08-26에 만료되었으며 업데이트 해야함을 확인 가능

4) apt-key 명령으로 새로 키(BA684223)를 업데이트 받음

# apt-key adv --recv-keys --keyserver keys.gnupg.net BA684223

# apt-key adv --recv-keys --keyserver keys.gnupg.net BA684223
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.DE4JfiHL45 --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyring /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg --keyring /etc/apt/trusted.gpg.d/docker-maint-testing.gpg --keyring /etc/apt/trusted.gpg.d/openjdk-r-ppa.gpg --keyring /etc/apt/trusted.gpg.d/webupd8team-java.gpg --recv-keys --keyserver keys.gnupg.net BA684223
gpg: requesting key BA684223 from hkp server keys.gnupg.net
gpg: key BA684223: "isv:ownCloud OBS Project <isv:ownCloud@build.opensuse.org>" 5 new signatures
gpg: Total number processed: 1
gpg:         new signatures: 5

5) 다시 우분투 패키지 업데이트 작업을 진행한다.

# apt-get update

# apt-get upgrade

 

참고 자료

[1] http://superuser.com/questions/513609/how-to-apt-update-when-apt-is-not-accepting-the-repository

Jul 312016
 

머신러닝이라는 과목에 대하여 어떻게 하면 공부를 효율적으로 즐겁게 할 수 있을지를 고민하던 중 “코세라”에 대하여 알게 되었다. 코세라는 컴퓨터과학과 교수인 Andrew Ng과  Daphne Koller가 공동 창업하여, 비싼 등록금을 내지 못하고 교육의 기회를 가지지 못하는 사람들을 위해 공짜로 온라인 수업을 제공하는 서비스이다[1]. 코세라에서 다양한 머신러닝 수업이 열려있는 것을 확인할 수 있었는데, 이 중 가장 빨리 시작하면서 강의가 길지 않고 요점만 들을 수 있는 수업을 찾다가 창업자인 Andrew Ng교수가 직접 강의하는 ML수업을 선택하게 되었다.

Coursera ML - https://www.coursera.org/learn/machine-learning

Coursera ML – https://www.coursera.org/learn/machine-learning

코세라의 좋은 점은 첫 번째로 공간에 제약없이 공짜로 좋은 강의를 들을 수 있다는 점이다. 일반적으로 이러한 강의를 듣기 위해서는 지정된 시각에 직접 수업하는 장소에 가서 수업을 들어야 한다는 문제가 있다. 스타트업에 다니고 있는 본인은 평일에 시간을 낸다거나 하는 것은 거의 불가능 하다. 그렇기 때문에 온라인 강의는 나에게 매우 필요하였고 이를 선택한 것은 적절한 결정이였다. 또한 세계 유수 대학의 수업을 들을 수 있다는 부분도 고무적이였다. 두 번째로는 돈을 내면 수료증을 받을 수 있다는 점이다. 물론 수업을 듣는 것은 공짜지만, 수료증은 돈(수업당 USD 79)을 내야한다는 점이 안타까운 점인데 그 부분은 수료증을 필요로 하는 사람만 하면 될 것이다. 수료증을 링크드인에 자격증 항목에 등록이 가능하다는 점, 수료증을 대학교 학점으로 인정해주는 곳도 있는 만큼 돈을 낸 값어치는 한다고 생각한다. 세 번째는 수업을 같이 듣고 있는 사람들과 함께 스터디를 하거나 멘토를 통해 도움을 받을 수 있다는 점이다. 수업이 시작하는 기간이 정해져 있기 때문에 수업을 나 뿐만 아니라 다른 사람도 함께 시작하기 때문에 이러한 시스템이 가능한 듯 하다. 물론 영어를 잘 해야한다.

하지만 이에 반해 단점도 있는데, 이는 결국은 영어권 기반의 서비스라는 한계이다. 물론 수업의 자막 번역 기부를 하는 것이 가능하기 때문에 자막이 여러 언어로 번역 되어 있긴 하지만 기본적으로 퀴즈나 과제 문서는 영어로 되어 있기 때문에 영어를 모르고서는 수업을 듣는 것, 과제 하고 퀴즈를 푸는 것이 불가능하다. 포럼에 질문 글을 올리거나 스레드를 여는 것 조차도 영어가 필요하다는 점이 하나의 장벽이 된다. 이번에 들은 ML수업은 일어, 중어, 스페인어 등으로 번역이 완료되어 있으나 한국어는 최초 강의 하나만 번역되어있었다.

Coursera ML - 두 번째 주 강의 스크린샷

Coursera ML – 두 번째 주 강의 스크린샷

ML수업의 경우 동영상 수업, 퀴즈, 과제로 구성되어 있다. 위의 그림은 ML 수업 둘째 주 수업에 대한 스크린 샷이다. 총 11주의 수업으로 구성되어 있으며, 모든 과제 제출, 강의 듣기, 퀴즈 풀기(각각 80점 이상)를 하면 수료상태가 되어 수료증을 받을 수 있게된다. 물론 수료증 없이도 진행 가능하며, 나중에 필요하게 된다면 신청 가능하다. 단 퀴즈를 풀 때 과제를 푸는 사람이 본인이 맞는지 확인하기위해 확인 과정을 거치게 되는데 이 부분에 대해서 설정 및 진행을 해두어야만 한다는 점을 유의 해야 한다. 퀴즈를 풀기 전에 인증 없이 퀴즈를 풀면 수료증을 받을 수 없는 듯 하다.

자막의 언어를 설정할 수 있음

자막의 언어를 설정할 수 있음

동영상 수업을 들을 때 플레이어를 통해 자막을 설정할 수 있다. 물론 아래 쪽에 자막의 스크립트 전문을 볼 수있다. 수업 중간중간에 간단한 퀴즈를 푸는 것도 있는데, 잘 이해했는지 확인하기 위해서 나오는 듯 하며, 풀고 싶지 않으면 스킵하는 것도 가능하다. 딱히 성적에 반영되는 것 같지는 않다.

퀴즈의 경우 ML수업은 5문제 객관식 문제를 푸는 방식이였고 4문제 이상 맞추면 통과된다. 5지선다 형도 있고 맞는 것 체크하는 것이 있고 계산 문제도 있지만 수업만 열심히 들었으면 크게 푸는데 어려움은 없다. 만약 한 번에 통과하지 못하더라도 세 번까지 연속적으로 풀 수 있으며, 제일 점수가 잘 나온 것을 기준으로 성적이 업데이트 된다. 만약 세 번을 다 했을 경우 8시간 이후에 다시 기회가 주어진다. 만약 제한시간(보통 북태평양기준시(PDT) 일요일 23:59:59, 한국시간(KST)으로 월요일 4시)까지 통과하지 못하면 점수를 깎는 조건으로 일 주일 더 도전 가능하다. 문제와 답이 재도전 할 때 마다 조금씩 바뀌기 때문에 문제와 답안을 잘 읽고 풀어야 한다. 수료증 받기 위한 인증으로는 데스크탑의 경우 타자 패턴, 모바일의 경우 사진 인증을 사용한다. 상황에 맞게 하면 된다. 혹시 사정이 생겨서 수업을 못듣개 되더라도 나중에 다시 들으면 된다고 하니 이 부분에 대해서 걱정은 안해도 될 듯 하다.

과제의 경우 ML은 Matlab(Octave)프로그래밍을 한 후 답을 올리는 방식을 취한다. 처음 보는 언어라도 기본 프로그래밍 실력이 있다면 수업중에 어떻게 하면 되는지 설명만 듣는 것으로 과제 풀이가 가능하다. 계속해서 도전이 가능하며 그 중 점수 제일 높게 나온 것이 최종 성적이 된다. 그러니 중간 중간에 한 문제, 한 문제 풀 때 마다 등록하면 된다. 물론 과제 문서에도 그렇게 하도록 시킨다. 왜냐하면 앞의 문제를 풀어서 정상동작해야 그 다음 과정이 진행 가능한 경우가 많기 때문이다. Octave 3.8이상부터 지원된다고 되어 있지만 Octave 4.0 이상에서는 과제 등록이 안되는 경우가 있는데 이 경우 패치 프로그램을 받아야 한다. 이 부분은 추후 다른 포스팅을 통해 방법을 설명하도록 하겠다.

Octave-gui with ex2 in Coursera ML

Octave gui – 2번째 과제 관련 스크린샷

친절하게 문제 하나 풀 때마다 업로드 시점을 알려 준다. - 코세라 과제Ex1

친절하게 문제 하나 풀 때마다 업로드 시점을 알려 준다.

필자는 주말에 주로 수업을듣고 과제를 풀었으며 다음과 같은 방식으로 스터디를 진행하였다. 첫 번째 차수에 영어자막을 띄어놓고 일단 쭉 봐서 대충 내용 파악을 하였다. 두 번째 차수에서 이해 안되는 부분을 위주로 보고, 만약 이해가 전혀 안되면 처음부터 다시 쭉 보는 방식으로 진행하였다. 세 번째는 일어 자막 스크립트를 가지고 한 번 쭉 보거나, 상황에 따라 번역기를 사용하여 이해를 하는 방향으로 스터디 했다. 마지막으로 스크린샷을 뜨고 요약하여 노트를 만들었다. 과제를 하면서는 소스코드가 공개 되어 있기 때문에 어떻게 동작 되는지, 동작 코드를 전체적으로 쭉 훑어 보는 방식으로 진행하니 ML 구현에서 숨겨진 부분이 어떻게 동작하는지 이해할 수 있었다. 과제도 수업 듣는것과 비슷하게 첫 번째에는 쭉 풀어보고, 실패하면 다시 노트를 확인해서 부족한 부분을 스터디 하는 방식으로 부족한 부분을 채워 나갔다.

에버노트를 이용하여 정리

에버노트를 이용하여 정리 – 코세라 수업 스크린샷 발췌

11주가 지나 마지막 퀴즈를 풀면 아래 그림과 같은 축하 메시지가 나오고, 수료증이 발급 된다. 물론 링크드인으로 수료증을 보낼 수 있다. 11주간의 결실이 나온 것이다.

물론 이 수업 하나를 들었다고 해서 머신 러닝 전문가가 된다거나 하는 것은 아니다. 하지만 머신러닝이 어떤 것이고 어떤 곳에 사용할 수 있는가 어떤 부분을 고려해야하는가와 같은 질문에는 강의를 통해 충분히 답변이 된 것 같다. 응용하는 부분은 좀 더 공부가 필요하겠지만 공부방향을 잡는 것은 가능할 것 같다.

수업 완료 후 화면 스크린샷

수업 완료 후 화면 스크린샷

코세라 인증서 및 링크드인 자격증란 등록 스크린샷

코세라 인증서 및 링크드인 자격증란 등록 스크린샷

처음으로 영어로 된 수업을 들으면서 많은 시행 착오도 있었고 어려움도 있었지만 어떻게 해쳐 나온 것 같다. 모르는 부분이 있다거나 실제 시스템을 잘 알고 이해하기 위해서 영어로된 글을 읽는 것은 대학원에서 짜증날 정도로 했던 일이지만, 여전히 영어로된 글은 적응이 되지 않는 정말 피곤한 일인 것 같다. 간단하게 나마 필자가 경험했던 것을 정리해 두었는데 추후 코세라를 시작하는 분들에게 많은 도움이 되길 바란다. 필자는 앞으로 ML 이외의 수업에도 도전해볼 생각이다.

참고자료

  1. Coursera – Wikipedia Korean, https://ko.wikipedia.org/wiki/%EC%BD%94%EC%84%B8%EB%9D%BC
Jul 242016
 

기존에 사용하고 있던 “러셀 홉스 – 자동커피메이커”가 고장나서, 이를 대체할 제품을 찾다가 핸드 드립이라는 새로운 분야에 도전해보기로 하였다. 예전에는 이미 갈아져 있는 원두가루를 사용하다가, 언젠가 부터 원두를 사서 수동 그라인더를 도입하여 갈아서 쓰기 시작하기도 하고 점점 아날로그 풍으로 넘어가고 있었던 점도 손 맛(?)을 느낄 수 있는 핸드 드립을 시작하게된 이유이기도 하다.  코스트코에서 커피서버, 드립퍼, 거름종이는 구할 수 있었지만 드립용 주전자는 구할 수 없었다. 대신 전기주전자가 그 자리를 차지하고 있는 듯 했다. 하지만 일단 드립세트를 구매해서 집에서 내려먹어 봤으나 집에는 냄비밖에 없었기 때문에 물을 내가 원하는데로 컨트롤 할 수가 없다는 문제가 있었다. 그래서 커피포트(주전자)를 구매하게 되었다.

칼리타는 일본에서 50년이 넘은 커피 용품 관련 브랜드이다. 코스트코 광명점에 커피 그라인더, 드립세트를 판매 중에 있는데 개인적으로는 코스트코에 판매할 정도의 제품이면 믿고 구매하기 때문에 이쪽으로 조사해보게 되었다. 그래서 칼리타 홈페이지에서 이것저것 검색하다가 마음에 드는 포트가 발견되어 구매로 이어지게 되었다.

이름은 칼리타 커피달인-펠리칸 1L 포트이다. 흰색과 빨간색을 고를 수 있는데 빨간색을 골랐다. 제질은 법랑[1](琺瑯、ホーロー)이라는 제질인데, 이는 금속 표면에 유리질의 세라믹스를 얇게 입히는 것을 말하며 단단하면서 녹슬지 않고 튼튼한 용기나 기구를 만들 수 있다는 장점이 있다고 한다[2]. 펠리칸포트는 일반 칼리타 포트와는 큰 차이가 있는데 물을 따르는 부분이 이름에도 있듯이 필리컨 처럼 생겼다는 점이다. 이는 점드립(물을 꾸준히 한 방울씩 떨어뜨려서 추출하는 방식)에 유리하다고 한다. 전문가 들이 보면 욕할 수도있겠지만 무엇보다도 모양이 이쁘다는 점도 한 목 했다.

문제는 국내에 본 커피포트는 정가[2]의 가격이 113,000원 정도로 좀 컸기 때문에 해외로 눈을 돌려 보았다. 주전자면 쉽게 문제가 발생하지 않을 것이라는 기대도 이 결정에 영향을 끼쳤다. 확실히 해외에서 구매하는 것이 가격이 정가보다는 싼편인데, 실제로 네이버에서 검색해보면 구매대행 관련된 항목이 먼저 출력 된다.

 

출처 : Amazon jp (https://www.amazon.co.jp/Kalita-カリタ-コーヒ-達人・ペリカン-1L-レッド/dp/B000H7BCJ4)

아마존 jp – 칼리타 커피달인 펠리컨 1L 포트 상품 페이지 (https://www.amazon.co.jp/Kalita-カリタ-コーヒ-達人・ペリカン-1L-レッド/dp/B000H7BCJ4)

2016/07/16 당시에는 할인 기간이라 약 2,752엔(약 31,000원 정도)의 가격으로 구매가 가능하였다(위의 스크린샷의 경우 시간이 지나면서 할인 가격 변동이 있었기 때문에 다름). 물론 당연히 배송비가 추가되기 때문에 저 가격은 불가능하고 배송비 포함하여 약 49,000원 정도 쓴 것 같다. 배대지(배송대행지)를 사용하는 방법도 있지만 귀찮기도 했고, 혹시 물건에 문제가 있을 때 교환이 용이하기 때문에 아마존 직배(직접배송)를 이용하였다.

Kalita horo pelican pot receipt - Amazon jp

아마존 주문 내역

아마존에서 16일(토요일)에 주문을 하였는데, 인천연수인 집에서 20일(수요일) 점심경에 받았기 때문에 약 3영업일 만에 한국에 도착하였다. 예상 배달 시간은 21일 도착이라고 되어 있었는데, 예상보다 하루 더 빨리 도착하였다. DHL배송은 정말 빠른 것 같다.

amazon jp box

아마존 재팬 배송 박스

배송은 거대한 박스 안에 한 쪽에 제품이 붙어있는 형태로 와서 엄청 쎄게 집어던지지만 않는다면 크게 문제는 되지 않을 듯 하였다. kalita pelican pot

비닐로 포장이 되어 있었기 때문에 실제 제품 박스에도 손상이 없게 하려는 배려가 보였다.

opened kalita coffee pot

박스의 내용물은 커피포트 뚜껑과 본체 그리고 사용설명서로 구성되어 있었다. 물론 일본어로 써있으며 해석 관련은 칼리타 홈페이지[2]에 잘 번역 되어 있다. 뚜껑과 본체가 정확하게 끼워지는 듯한 느낌이 들지 않고 얹어져 있다는 느낌이었다. 그렇기 때문에 물을 따르거나 할 때 뚜껑과 손잡이를 같이 잡고 하지 않으면 뚜껑이 벗겨질 수도 있다. 그래서 친절하게 사용 설명서에 어느 부분을 잡으면 좋은지 적혀있다^^. 정수기의 뜨거운 물을 받아서 드립을 해보았는데 손잡이나 뚜껑의 열 전도율이 높은지 뜨거웠다.  커피 드립할 때 이 부분을 주의해야할 것 같았다. 그 이외에 직접 끓일 때에 바닥에 스티커가 붙어 있으니 때고 하도록 하자. 인덕션 사용시 특정 제품은 사용 금지라고 하니 꼭 설명서 읽어보도록 하자. 주전자를 보면 제질이 도자기+쇠 제질 같은 느낌이 나는데 떨어뜨리거나 심하게 다루면 좋지 않을 듯 하다. 사실 이건 다른 주방용품도 비슷할 것이다.

drip coffee by kalita pot

주의사항 이야기하면 사용설명서에도 꽤 길게 적혀있으니 그 쪽을 참고하는 것으로 하고, 초보적인 실력으로 드립을 해본 결과 물 세기 조정하기가 용이했고, 점 드립도 크게 어렵지 않게 할 수 있었다. 좋은 점은 포트입구에서 물이 잘 못된 방향으로 새지 않아서 좋았다.

completed dripping coffee

이제 남은 것은 열심히 드립 연습하는 것만 남은 것 같다.

결과적으로 국내 정가 보다 브랙시트로 오른 엔화 환율에 비해서도 직구를 통해 저렴하게 구매할 수 있었고, 배송도 3영업일만에 제품에 문제 없이 도착하였고, 일부 사용설명서 적혀있는데로 주의할 점이 있지만, 드립용 커피포트가 하는 역할은 제대로 해낸다는 점에서 꽤 고무적이였다.

 

주의사항

  • 이 글은 아마존 광고글이 아닙니다. 구매하실 때에는 원하는 곳에서 구매하세요.
  • 가격은 언제나 변동될 수 있으며, 그 이외에 해외배송시 문제, 상품에 대한 문제, 사용중 발생하는 문제 등 문제점 발생시 직접 해결하셔야 합니다.
  • 필자는 커피를 전문적으로 배운 것은 아니라 부족한 부분이 있을 수 있으니, 관련 전공자나 전문가 분들의 의견은 언제든지 환영합니다. ^^

참고 자료

  1. 법랑 – Wikipedia Korean : https://ko.wikipedia.org/wiki/%EB%B2%95%EB%9E%91
  2. Horo Perican Pot  1L – RD (Kalita 한국 홈페이지), http://www.kalitakorea.kr/k2/product/product.php?cmd=view&mcat=1&scat=8&bid=132&curpage=1
Jun 122016
 

인천에서 태어난 나는 1995년 수인선이 영업정지 된다는 것을 방송을 통해서 보면서 한 번쯤은 타보고 싶다는 생각을 하곤 했었다. 물론 직접 타지는 못했지만 송도역이나 소래역은 직접 보기도 했었고 영업 정지 후에도 철로가 꽤 오래동안 남아 있었기 때문에, 한 번 쯤은 길 따라서 가볼일 있겠지라고 생각했는데, 나이를 먹으면서 점점 사라져가는 옛날 협궤 철도길을 보고 있어야 했다. 처음 연수지구에 이사 왔을 때 현재 일부구간 개통되어 있는 “수도권 전철 수인선”을 위한 다리도 노반도 이미 지어져 있었기 때문에 금방 개통될 줄 알았으나 설마 2012년에 개통될줄은 상상도 못했다.

나의 경우 이미 소래역에 있는 소래역사관[1], 증기기관차 견학을 마쳤기 때문에 이번에는 폐선로(철길)을 답사해보기로 하였다.

인터넷을 조사해보니 이미 거의 대부분 구간이 답사가 어려운 상황이라는 것을 알 수 있었기 때문에 그나마 보존되어 있다고 알려진 한대앞~초지역 구간을 답사해보기로 하였다. 답사 경로는 아래와 같다.

Screen Shot 2016-06-12 at 6.43.05 PM

수인선 답사 지도(한대앞~초지역 구간) – 출처 다음지도

 

한대앞 역에 내리니 아무것도 없이 썰렁했다. 학교로 가는 셔틀버스가 있어서인지 젊은 사람들이 많이 보였다. 한대역부터 중앙역 구간 사이는 크게 볼만한 것들은 없었고, 제대로된 시작은 중앙역 부터였다. 중앙역 주변을 둘러보면 옛날 수인선 철도 명판이 있던 부분이나 아래쪽에 플랫폼 돌 같은 것이 옛날에 수인선이 여기에 정차했다는 것을 보여주고있을 뿐이였다. 2~3년 전만 해도 플랫폼도 그대로 남아 있었던 듯 하나[2] 그 글에도 적혀 있듯이, 내가 갔을 때는 흔적만 남아 있고 철로는 걷어낸 상태였다.
suin-line jungang station

수인선 철도 중앙역 부근

답사하면서 어려운 점은 지도를 보면 알겠지만 중간, 중간에 큰 도로가 껴있다는 점이었다. 열차길을 좀 따라가는 듯 하면 도로가 막아서 횡단보도로 돌아가야했다. 참고자료[1] 소래역사관, http://museum.namdong.go.kr/

중앙역부터는 식물 터널이라던지 간단한 생태공원 같은 것이 있었고, 주변에 여러 종류의 식물도 심어져 있었다. 하지만 방문한 계절이 계절인지라 그다지 분위기는 한 겨울 분위기였다.

 

suin-line jungang station

수인선 철도 중앙역 부근

고잔역에 가까워 지자 나중에 설치한 듯한 철도 건널목을 발견할 수 있었다. 걸어가면서 느낀 점은 수인선 철도에 알맞은 형태로 복원되지는 않은 것 같았다. 역명판의 경우 플랫폼 모양으로 복원을 한 후 거기에 설치를 하거나 했으면 좋았을 것 같다. 건널목의 설치 방향이 90도 꺾여 있어야한다는 것은 옥의 티였다. 차라리 옛날 사진을 찾아서 건널목을 유사하게 만드는게 차라리 좋지 않았을까? 하지만 철길이 아직 남아있고 거기를 걸어갈 수 있다는 것 만으로도 만족하여야 했다.

고잔역 근쳐 건널목 - 수인선

고잔역 근처 건널목 – 수인선

 

고잔역을 넘어서자마자, 예전에 이 열차길을 정말 이용했는지 의구심이 들 정도로 삭막한 분위기에 철길이 덩그러니 있었다. 걸어가면서 세월의 풍파가 있었는지 철길이 이리저리 휘어져 있는 것도 볼 수 있었다.  초지로를 끝으로 철길은 찾지 못할 정도로 사려져있었기 때문에 큰길을 따라서 초지역으로 이동했다. 초지역 근처에서는 소사원시선 전철 공사가 한참인 듯 했다. 나중에 이 길을 따라서 서해쪽으로 갈 수 있게 될 것이다. 초지역을 지나 안산역으로 가서 근쳐 안산 다문화거리에서 식사를 하고 답사를 마쳤다.

답사하면서 어려운 점은 지도를 보면 알겠지만 중간, 중간에 큰 도로가 껴있다는 점이었다. 열차길을 좀 따라가는 듯 하면 도로가 막아서 횡단보도로 돌아가야했다. 또한, 거의 대부분의 시설이 철거 되었거나, 철도의 보존상태가 좋지는 않았다. 고잔~중앙역 사이는 짧게나마 공원화 되어 봄~가을에 방문하면 나을 것 같다는 생각이 들었다. 식사를 할 만한 곳은 중간에 딱히 보이지 않았다. 4호선을 중심으로 양쪽에 큰도로가 있기 때문에 그 부분은 유의해야할 것 같다.

오래된 철도를 걸으면서 옛날에는 어떤 모습이였을까? 여기에 열차가 다닐 때는 어땠을까? 하는 생각을 하며 열차가 다니는 것 조차 보지 못한 세대는 이 공원이 어떤 느낌일까? 같은 생각을 하며 뭔가 울적해지는 답사였다.

마지막으로 “데스크 영상 – 수인선 협궤열차”으로 글을 끝 마친다.

 

 

참고자료

[1] 소래역사관, http://museum.namdong.go.kr/

[2] “수인선 꼬마열차가 다닌 흔적, 안산선 중앙역”, 타티온s,  2014.09 , http://tjo4183.tistory.com/69

Mar 102016
 

윈도우에서 “bundler install”할 때 아래와 같은 에러가 발생했을 때 해결방법

C:\Ruby22\bin\ruby.exe -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) C:/Ruby22/bin/bundle install
Checksum of /versions does not match the checksum provided by server! Something
is wrong.

Process finished with exit code 17

의외로 간단하게 끝났다[1].

 

gem uninstall bundler
gem install bundler

번들러를 다시 깔아주면 해결되는 듯 하다.

 

참고문헌

[1] Rails initialization checksum error, Stackoverflow, http://stackoverflow.com/questions/35315712/rails-initialization-checksum-error

Dec 082014
 

올해도 여김없이 관제 연하장을 구매해 보았다. 작년에는 연하엽서 구매를 못했었는데, 이번에는 구매를 위해 11월 초에 우체국에 방문했다. 그런데 결국 구매할 수 있었던 건 2014년도 판 우체국 엽서 세트였다. 들어보니 올해는 연하 엽서만 따로 판매하지 않고, 홈페이지를 통해서만 구매할 수 있다는 것이였다. 온라인으로는 30장씩 판매하며, 총 500장밖에 준비 안되 있었어서 금세 동났다고 한다. 내년에는 홈페이지를 주기적으로 확인해야하는건지… 어쨋든 연하장은 딱히 바로 필요 없었기 때문에 엽서 세트만 구매 했다. 엽서 세트는 4,800원에 구매 가능했다. 그런데 왠지 요즘 유행하는 “허니버터칩 인질극[1]”을 보는 듯 해서 씁쓸했다.

2014년도 연하장 구매

2014년도 연하장/연하엽서

어그제 미국에 가 있는 연구실 형님에게 연하장을 보내기 위해 이번에는 평소 때 보다 연하장을 일찍 준비 했는데, 인천 우체국에 가니 벌써 매진 된 된 종류도 일부 있어서, 남은 것 중에서 고를 수 밖에 없었다.

관제 연하장에 어떤 종류가 있는지는 인터넷 우체국 연하장 페이지에서 확인 가능하다[2]. 2015년이 “양”의 해인 만큼 양을 이용한 디자인이 눈에 띈다. 고급형은 우편요금 포함하여 연하장 하나에 1,200원, 일반형은 900원에 구매 가능하다.

연하우표도 구매 가능하다. 2014-12-01에 발매 되었는데, 미국형님께 보낼 때 연하우표를 붙여 보내고 싶어서 구매했다. 전지형과 시트형으로 구매 가능하다. 아래 사진은 우체국에서 받은 설명서를 찍은 것이다. 장기 보관용으로 하나 더 구매했다. 시트형은 1,200원에 구매 가능하며, 300원 짜리 우표 4장으로 구성되어 있다.

연하우표 설명 시트

연하우표 설명 시트

 

새해를 기념하여 아날로그의 향기가 느껴지는 손글씨로 친한 지인들이나 자주 연락하지 못한 사람들에게 편지를 써보는 것이 어떨까?

 

참고자료

[1] “‘인질’로 잡힌 ‘허니버터칩들’ (사진)”, 인사이트, http://www.insight.co.kr/view.php?ArtNo=10057, 2014-12-02
[2] 인터넷 우체국 연하장 페이지, http://service.epost.go.kr/front.newyearcard.RetrieveNewyearcardList1.postal

Oct 302014
 

1. 서론
  mysql 데이터베이스의 파티션이 커지면 데이터베이스 파일을 새로운 파티션에 옮기고 심볼릭 링크를 걸어서 용량을 확보하는 방법이 있다. 한편 우분투에서는 apparmor라고 하는 권한 관리 시스템이 존재하여서, 심볼릭 링크 후에 새로운 경로(파티션)에 대한 권한을 줄 필요가 있다.
  여기서 apparmor가 설치된 mysql 환경에서 어떻게 파티션을 만들고, 공간을 확장하는지 알아 본다.
 
2. 수행 방법
1) 추가할 디스크 마운팅 및 포멧
 # fdisk -l      // 파티션 할당 상태 확인
 # fdisk /dev/xvdb  // /dev/xvdb : 추가된 디스크 주소
    n 누루고 파티션 설정(primary partition, cylinder etc)
    w 눌러서 저장
 # mkfs.ext4 /dev/xvdb1     // ext4로 포멧
 # mount /dev/xvdb1 /mnt/mysql_disk1   // 마운팅
 
 # blkid     // 추가된 /dev/xvdb1 의 UUID 확인
 # vi /etc/fstab    // 재부팅시 바로 자동 마운팅을 위해 설정
  UUID=<> /mnt/mysql_disk1 ext4 rw 0 0     # 제일 아래줄에 추가
 # df -h     // 디스크 용량 확인
 
2) Apparmor 설정파일 변경 [1]
 – 우분투는 접근관리를 좀 더 잘 하기 위해 파일에 권한을 사용자 단위로 지정하는 것이 아니라, 실행되어 있는 프로그램이 어디에 접근할 수 있는지를 설정함으로써 해결하고자 하였다. 이 편이 관리 측면에서 더 이득이 크다.
 
 # vi /etc/apparmor.d/user.sbin.mysqld
      # 제일 아래줄에 추가
      /mnt/mysql_disk1/mysql_data r,
      /mnt/mysql_disk1/mysql_data/** rwk,
 
3) sql 서버 종료
     # service mysql stop
4) 데이터파일을 새로 저장할 큰 용량의 디스크로 복사 (ubuntu mysql은 /var/lib/mysql 에 있음)
     # cd /var/lib/mysql
     # cp -R * /mnt/mysql_disk1/mysql_data
5) 기존 파일 백업
     # mv /var/lib/mysql /var/lib/mysql_bak
6) 심볼릭 링크 연결
     # cd /var/lib
     # ln -s /mnt/mysql_disk1/mysql_data mysql
7) sql 서버 다시 켜기
     # service mysql start
8) DB에 잘 접속되나 테스트
 
3. 정 리
 파일 복사하는데 꽤 시간이 걸리기 때문에 추후에는 mysql서버를 하나 더 준비하여 데이터를 옮기도록 작업하는 것이 더 좋을 것으로 예상된다. 그리고 데이터 베이스 파일을 하나로 하지 않고 여러개로 나누어서, 파일 단위로 심볼릭 링크를 걸어서 해결하는 방향이 더 좋을 것이라고 생각한다.
 
4. 관련 자료
[1] Recover an Innodb mysql database from an EBS on Ec2, Stack Exchange : http://dba.stackexchange.com/questions/57424/recover-an-innodb-mysql-database-from-an-ebs-on-ec2
[2] https://blogs.oracle.com/jsmyth/entry/running_out_of_physical_disk

Jul 032014
 

윈도우에서 레일즈로 프로그래밍하면서 뭔가 한 번에 되는 것이 없다는 것을 자주 느끼곤 하는데, rmagick 이라는 gem을 설치할 때도 마찬가지 였다. rmagick은 오픈소스 이미지 프로세싱 라이브러리로 유명한 ImageMagick라는 라이브러리를 루비에서도 쓸 수 있게 wrapping한 gem이다. 전부가 그런 것은 아니고 C나 C++로 만들어진 대다수의 오픈소스 라이브러리는 크로스 컴파일을 지원하지만, 제일 컴파일하고 실행하기 좋은 환경은 리눅스 환경일 것이다. 어쨋든 rmagick을 윈도우에서 써야하는 이상 Gemfile에 rmagick을 넣고 bundle을 돌렸다. 역시나 에러 발생. 이런쪽 문제가 발생하면 구글에게 물어보라고 했던가, 검색하자마자 스택오버플로우 글 하나를 첫번째로 띄어주었다[1]. 글을 읽어보니 이전 포스팅에서 확인한 것과 같이 라이브러리를 설치해야한다는 것이였다. 별 생각없이 다운로드 받아서 실행해본 결과 역시나 실패. [1][2]의 글을 좀 열심히 읽어보니 라이브러리를 설치한 디렉토리에 빈칸이 있으면 안된다는 것이었다. “Program files”폴더에 설치 됬으니 당연히 빈칸이 들어갈 수 밖에… 지우고 다시 설치하였다. 그랬는데도 컴파일이 되지 않았다. 무엇 때문인지 하고 봤더니 ” c:\ImageMagick-6.8.0-3-Q16″에 “-“기호나 “.” 같은 특수문자 때문인듯 했다. 그래서 시키는 대로 “c:\ImageMagick” 폴더에 설치를 했다. 그랬더니 gem 설치가 성공하는 듯 했다. 하지만 이렇게 성공했다면 여기에 글을 남기지는 않았을 것이다. 역시나 안됬다. 에러를 뿌리면서 안됬는데 아래의 에러가 발생한다.

Building native extensions with: '--with-opt-lib=c:/ImageMagick/lib --with-opt-include=c:/ImageMagic
k/include'
This could take a while...
ERROR:  Error installing rmagick:
        ERROR: Failed to build gem native extension.

    C:/Ruby200/bin/ruby.exe extconf.rb --with-opt-lib=c:/ImageMagick/lib --with-opt-include=c:/Image
Magick/include
checking for Ruby version >= 1.8.5... yes
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... yes
checking for snprintf() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,wand
/MagickWand.h... yes
checking for AcquireImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,
wand/MagickWand.h... yes
checking for AffinityImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h
,wand/MagickWand.h... no
checking for AffinityImages() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.
h,wand/MagickWand.h... no
checking for AutoGammaImageChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys
/types.h,wand/MagickWand.h... yes
checking for AutoLevelImageChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys
/types.h,wand/MagickWand.h... yes
checking for BlueShiftImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.
h,wand/MagickWand.h... yes
checking for ConstituteComponentTerminus() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint
.h,sys/types.h,wand/MagickWand.h... no
checking for DeskewImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,w
and/MagickWand.h... yes
checking for EncipherImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h
,wand/MagickWand.h... yes
checking for EqualizeImageChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/
types.h,wand/MagickWand.h... yes
checking for FloodfillPaintImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/t
ypes.h,wand/MagickWand.h... yes
checking for FunctionImageChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/
types.h,wand/MagickWand.h... yes
checking for GetAuthenticIndexQueue() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sy
s/types.h,wand/MagickWand.h... yes
checking for GetAuthenticPixels() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/ty
pes.h,wand/MagickWand.h... yes
checking for GetImageAlphaChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/
types.h,wand/MagickWand.h... yes
checking for GetVirtualPixels() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/type
s.h,wand/MagickWand.h... yes
checking for LevelImageColors() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/type
s.h,wand/MagickWand.h... no
checking for LevelColorsImageChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,s
ys/types.h,wand/MagickWand.h... yes
checking for LevelizeImageChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/
types.h,wand/MagickWand.h... yes
checking for LiquidRescaleImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/ty
pes.h,wand/MagickWand.h... yes
checking for MagickLibAddendum() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/typ
es.h,wand/MagickWand.h... yes
checking for OpaquePaintImageChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,s
ys/types.h,wand/MagickWand.h... yes
checking for QueueAuthenticPixels() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/
types.h,wand/MagickWand.h... yes
checking for RemapImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,wa
nd/MagickWand.h... yes
checking for RemoveImageArtifact() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/t
ypes.h,wand/MagickWand.h... yes
checking for SelectiveBlurImageChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h
,sys/types.h,wand/MagickWand.h... yes
checking for SetImageAlphaChannel() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/
types.h,wand/MagickWand.h... yes
checking for SetImageArtifact() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/type
s.h,wand/MagickWand.h... yes
checking for SetMagickMemoryMethods() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sy
s/types.h,wand/MagickWand.h... yes
checking for SparseColorImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/type
s.h,wand/MagickWand.h... yes
checking for SyncAuthenticPixels() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/t
ypes.h,wand/MagickWand.h... yes
checking for TransformImageColorspace() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,
sys/types.h,wand/MagickWand.h... yes
checking for TransparentPaintImage() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys
/types.h,wand/MagickWand.h... yes
checking for TransparentPaintImageChroma() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint
.h,sys/types.h,wand/MagickWand.h... yes
checking for QueryMagickColorname() new signature... yes
checking for Image.type in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,wand
/MagickWand.h... yes
checking for DrawInfo.kerning in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.
h,wand/MagickWand.h... yes
checking for DrawInfo.interline_spacing in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,
sys/types.h,wand/MagickWand.h... yes
checking for DrawInfo.interword_spacing in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,
sys/types.h,wand/MagickWand.h... yes
checking for DitherMethod in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,wa
nd/MagickWand.h... yes
checking for MagickFunction in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,
wand/MagickWand.h... yes
checking for ImageLayerMethod in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.
h,wand/MagickWand.h... yes
checking for long double in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,wan
d/MagickWand.h... yes
checking for AlphaChannelType.CopyAlphaChannel... yes
checking for AlphaChannelType.BackgroundAlphaChannel... yes
checking for CompositeOperator.BlurCompositeOp... yes
checking for CompositeOperator.DistortCompositeOp... yes
checking for CompositeOperator.LinearBurnCompositeOp... yes
checking for CompositeOperator.LinearDodgeCompositeOp... yes
checking for CompositeOperator.MathematicsCompositeOp... yes
checking for CompositeOperator.PegtopLightCompositeOp... yes
checking for CompositeOperator.PinLightCompositeOp... yes
checking for CompositeOperator.VividLightCompositeOp... yes
checking for CompressionType.DXT1Compression... yes
checking for CompressionType.DXT3Compression... yes
checking for CompressionType.DXT5Compression... yes
checking for CompressionType.ZipSCompression... yes
checking for CompressionType.PizCompression... yes
checking for CompressionType.Pxr24Compression... yes
checking for CompressionType.B44Compression... yes
checking for CompressionType.B44ACompression... yes
checking for DistortImageMethod.BarrelDistortion... yes
checking for DistortImageMethod.BarrelInverseDistortion... yes
checking for DistortImageMethod.BilinearForwardDistortion... yes
checking for DistortImageMethod.BilinearReverseDistortion... yes
checking for DistortImageMethod.DePolarDistortion... yes
checking for DistortImageMethod.PolarDistortion... yes
checking for DistortImageMethod.PolynomialDistortion... yes
checking for DistortImageMethod.ShepardsDistortion... yes
checking for DitherMethod.NoDitherMethod... yes
checking for FilterTypes.KaiserFilter... yes
checking for FilterTypes.WelshFilter... yes
checking for FilterTypes.ParzenFilter... yes
checking for FilterTypes.LagrangeFilter... yes
checking for FilterTypes.BohmanFilter... yes
checking for FilterTypes.BartlettFilter... yes
checking for FilterTypes.SentinelFilter... yes
checking for MagickEvaluateOperator.PowEvaluateOperator... yes
checking for MagickEvaluateOperator.LogEvaluateOperator... yes
checking for MagickEvaluateOperator.ThresholdEvaluateOperator... yes
checking for MagickEvaluateOperator.ThresholdBlackEvaluateOperator... yes
checking for MagickEvaluateOperator.ThresholdWhiteEvaluateOperator... yes
checking for MagickEvaluateOperator.GaussianNoiseEvaluateOperator... yes
checking for MagickEvaluateOperator.ImpulseNoiseEvaluateOperator... yes
checking for MagickEvaluateOperator.LaplacianNoiseEvaluateOperator... yes
checking for MagickEvaluateOperator.MultiplicativeNoiseEvaluateOperator... yes
checking for MagickEvaluateOperator.PoissonNoiseEvaluateOperator... yes
checking for MagickEvaluateOperator.UniformNoiseEvaluateOperator... yes
checking for MagickEvaluateOperator.CosineEvaluateOperator... yes
checking for MagickEvaluateOperator.SineEvaluateOperator... yes
checking for MagickEvaluateOperator.AddModulusEvaluateOperator... yes
checking for MagickFunction.ArcsinFunction... yes
checking for MagickFunction.ArctanFunction... yes
checking for MagickFunction.PolynomialFunction... yes
checking for MagickFunction.SinusoidFunction... yes
checking for ImageLayerMethod.FlattenLayer... yes
checking for ImageLayerMethod.MergeLayer... yes
checking for ImageLayerMethod.MosaicLayer... yes
checking for ImageLayerMethod.TrimBoundsLayer... yes
checking for VirtualPixelMethod.HorizontalTileVirtualPixelMethod... yes
checking for VirtualPixelMethod.VerticalTileVirtualPixelMethod... yes
checking for VirtualPixelMethod.HorizontalTileEdgeVirtualPixelMethod... yes
checking for VirtualPixelMethod.VerticalTileEdgeVirtualPixelMethod... yes
checking for VirtualPixelMethod.CheckerTileVirtualPixelMethod... yes
checking for ruby/io.h... yes
checking for rb_frame_this_func() in ruby.h,ruby/io.h... yes
creating extconf.h
creating Makefile


======================================================================
Thu 03Jul14 22:29:32
This installation of RMagick 2.13.2 is configured for
Ruby 2.0.0 (i386-mingw32) and ImageMagick 6.8.9
======================================================================



make "DESTDIR="
generating RMagick2-i386-mingw32.def
compiling rmagick.c
In file included from rmagick.c:13:0:
rmagick.h:81:2: error: #error Specified QuantumDepth is not supported.
rmagick.c: In function 'Magick_colors':
rmagick.c:40:5: warning: implicit declaration of function 'GetExceptionInfo' [-Wimplicit-function-de
claration]
rmagick.c:42:5: warning: passing argument 2 of 'GetColorInfoList' from incompatible pointer type [en
abled by default]
In file included from c:/ImageMagick/include/magick/image.h:21:0,
                 from c:/ImageMagick/include/magick/draw.h:22,
                 from c:/ImageMagick/include/magick/fx.h:21,
                 from c:/ImageMagick/include/magick/accelerate.h:21,
                 from c:/ImageMagick/include/magick/MagickCore.h:73,
                 from rmagick.h:47,
                 from rmagick.c:13:
c:/ImageMagick/include/magick/color.h:75:5: note: expected 'size_t *' but argument is of type 'long
unsigned int *'
rmagick.c: In function 'Magick_fonts':
rmagick.c:90:5: warning: passing argument 2 of 'GetTypeInfoList' from incompatible pointer type [ena
bled by default]
In file included from c:/ImageMagick/include/magick/draw.h:24:0,
                 from c:/ImageMagick/include/magick/fx.h:21,
                 from c:/ImageMagick/include/magick/accelerate.h:21,
                 from c:/ImageMagick/include/magick/MagickCore.h:73,
                 from rmagick.h:47,
                 from rmagick.c:13:
c:/ImageMagick/include/magick/type.h:98:5: note: expected 'size_t *' but argument is of type 'long u
nsigned int *'
rmagick.c: In function 'Magick_init_formats':
rmagick.c:178:5: warning: passing argument 2 of 'GetMagickInfoList' from incompatible pointer type [
enabled by default]
In file included from c:/ImageMagick/include/magick/MagickCore.h:118:0,
                 from rmagick.h:47,
                 from rmagick.c:13:
c:/ImageMagick/include/magick/magick.h:135:5: note: expected 'size_t *' but argument is of type 'lon
g unsigned int *'
make: *** [rmagick.o] Error 1


Gem files will remain installed in C:/Ruby200/lib/ruby/gems/2.0.0/gems/rmagick-2.13.2 for inspection
.
Results logged to C:/Ruby200/lib/ruby/gems/2.0.0/gems/rmagick-2.13.2/ext/RMagick/gem_make.out

또 열심히 구글링을 했더니 [3]의 문서를 발견하였다. 문서를 간단히 살펴보니 imagemagick 라이브러리의 버젼에 따라서 컴파일이 안된다는 말로 간단히 요약할 수 있었다. 직접 컴파일해서 연동하는 방법도 써있으니 필요하신분은 참고하시면 될 듯. 어쨋든 되는 버젼을 확인해보니 ‘ImageMagick-6.8.7-8-Q16-x86-dll’에서는 컴파일이 가능하다고 하여 다운로드 받아서 위와 같은 방법으로 실행해 보니 문제 없이 설치할 수 있었다. 이상으로 문제 해결!

– 필자는 Ruby 2.0 x86에서 테스트 했으며, ImageMagick라이브러리도 x86으로 준비하였음. 전에 64bit로 무리하게 진행하다가 고생한 선례가 있어 그나마 편하게 가고 싶으시면 x86을 추천함.

 

요 약


1. http://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binaries/ 에서 ImageMagick-6.8.7.8-Q16-x86-dll.exe 을 다운로드.

2. ImageMagick 설치시 경로를 “c:\ImageMagick” 으로 할 것. 그리고 설치시 체크하는 곳에서 “Add application directory to your path system”, “Install development headers and libraries for C and C++” 항목을 체크표시 할 것

3. rails 폴더에서 “gem install rmagick –platform=ruby — –with-opt-lib=c:/ImageMagick/lib –with-opt-include=c:/ImageMagick/include” 라고 명령 실행!

 

참고자료


[1] StackOverflow(I cant install gem on windows), http://stackoverflow.com/questions/4873276/i-cant-install-rmagick-gem-on-windows
[2] shubham’s blog(installing rmagick gem on windows 7), http://shoobm.wordpress.com/2013/01/03/installing-rmagick-gem-on-windows-7/
[3] 君の瞳はまるでルビー – Ruby 関連まとめサイト(RMagick を Windows 7 にインストールする方法), http://www.ownway.info/Ruby/index.php?rmagick%2Fhowtoinstall%2Fwindows

Jun 292014
 

  필자는 가끔씩 현재 미국에 방문연구원으로 가 있는 연구실 선배에게 편지를 보내곤 한다. 그러던 중 저렴하고 누구나 다 하는 방법이 아닌 새로운 방식으로 편지를 보내고 싶었다. 예전에 우체국에 물건을 납품하는 회사에 다니면서 별의 별 우체국의 발송 옵션이 있다는 것을 알게 되었기 때문에 분명히 국제 우편에도 이상하고, 특이한, 잘 알려지지 않은 발송 옵션이 있을 것이라고 생각하였다. 그래서 우정사업본부 홈페이지에서 국제통상우편에 대해서 공부해 보았다. 그 결과, 우편의 내용을 숨길 수 있으며(우편엽서 탈락), 가격은 비싸지 않고(서장 탈락), 간단한 A4용지 한 장 정도의 내용을 적어 보낼 수 있는 항공서간의 존재를 알게 되었다.

사제항공서간

필자가 만든 사제항공서간

 항공서간은 항공 우편물의 일종으로 세계 어디로든 같은 가격인 450 원(이하 가격은 2014년 6월 기준)으로 보낼 수 있는 국제통상우편의 한 종류이다. 원래 일반적인 방법으로 우편을 보낸다는 것은 국제서장(일반적인 국제 우편)으로 보내는 것인데, 이는 무게나 지역에 따라서 가격이 다르게 책정 된다. 예를 들면 일본으로 11g짜리 우편을 보낸다고 하면 580원을 내면 되지만 미국으로 같은 무게의 우편물을 보내려면 740월을 내야만 한다. 하지만 항공서간이면 도착 국가가 어디든지 450원으로 보낼 수 있다는 강점이 있다. 하지만 이 항공서간의 존재가 잘 알려져 있지 않은 듯 했다. 회사 근쳐의 우편취급국에서 450원 짜리 우표를 사러 갔는데, 우체국 직원분은 어디에 쓰길레 그런 가격의 우표를 구하냐고 물어볼 정도니 항공서장으로 보내는 사람이 그다지 없다는 것을 예상할 수 있었다. 항공서장을 보내려고 갔던 인천우체국 직원 분도 계산기를 두드리며 당황한 듯 하니 말은 다 한 것이나 다름 없다. 필자가 보기에는 일반 국제우편에 비해서 사람들에게 잘 알려지지 않았고, 항공서간은 A4용지 1장 크기의 내용만 보낼 수 있으며, 인터넷의 발달로 단순 글 편지는 이메일이나 메신져로 대체 가능하기 때문에 잘 사용되지 않는 듯 하다고 생각한다.

관제항공서간 - 출처: 어린이우체국 홈페이지(http://www.koreapost.go.kr/child/sub/subpage.jsp?contId=c80204)

관제항공서간 – 출처: 어린이우체국 홈페이지(http://www.koreapost.go.kr/child/sub/subpage.jsp?contId=c80204)

항공서간은 우체국에서 엽서를 사듯이 구매하는 것이 가능하다. 정부 발행 항공서간(관제항공서간)이 실제로 존재한다. 하지만 작은 우체국에는 가져다 놓지 않을 가능성이 높으니 만약 구매할 생각이라면 큰 우체국에 가는 것이 좋을 것이다.  원래 사제항공서간을 만들기 위해서는 1996년 전 까지는 국가의 허가를 필요로 하였다. 개정 이유를 살짝 읽어보면 현행규정의 운영상 나타 난 일부 미비점을 개선 보완 하려는 것[1]이라고 한다. 그 이전에는 5장 원본을 만들어서 체신청에 제출하는 등 보내기 위해서는 여러 절차를 거쳐야만 하였다. 하지만 지금은 양식대로 만들어서 인쇄하면 끝! 그럼 사제 항공 서장을 만들어 보자. 만들기 위해서 항공서간의 견본과 중량[2]이라는 미래창조과학부 고시를 참조하였다. 여기서 크게 중요하게 본 것은 색깔의 제한과 중량이였다. 나머지 모양은 최대한 비슷하게 길이를 맞춰서 잘 자르기만 하면 된다. 하지만 색깔과 중량은 구매를 해야할 A4용지, 즉 종이에 대한 제한이 있다는 것을 의미했기 때문이다. 그러면 제한 사항인 중량 5g 이내, 연청색의 종이를 찾아야 했다. 구매할 A4용지를 조사해 보니 색깔이 있는 용지가 존재한다는 것을 확인하였다. 회사 근쳐의 모닝글로리에 가서 연청색의 A4 용지를 구매하러 갔다. 모닝글로리에 가보니 색깔 A4용지의 종류가 여러가지가 있었다. 이 중에서 한 장당 5g을 넘지 않는 용지를 찾아야만 했다. 가게에서 A4용지 무게를 달아 볼 수도 없는 노릇이니, A4용지 봉투에 써있는 규격을 통해 유추해보기로 하였다.

색깔 있는 A4 용지, 무게가 80g/m²라고 적혀있다.

색깔 있는 A4 용지, 무게가 80g/m²라고 적혀있다.

  색깔있는 A4용지는 80g/m², 120g/m² 등 여러 종류가 있었다. A4용지의 크기는 210mmX297mm인데 이를 가지고 계산해보니 80g/m²이 한장에 4.9896g으로 5g내에 정확히 떨어지는 것을 알 수 있었다. 이 용지를 사면 A4용지의 일부는 가위로 잘라내니 5g이 넘을일은 없을 것이다. 그래서 80g/m²의 연청색 A4용지를 구매하였다. 나머지는 규정에 맞게 워드 작업만 하면 되었다. 세로에 비해 1.4(sqrt 2)배 넘어야 하는 등의 규정, 최대 높이, 너비 규정에 맞추어서 결국은 완성하였다. 우표 모양은 인쇄하면 안되며, 안에 아무것도 넣으면 안된다는 요건을 만족하도록 만들었다.

완성된 사제항공서간

완성된 사제항공서간

  만들어진 항공 서간을 가지고 근쳐에 있는 인천우체국에가서 접수를 했는데 저울 무게 4g, 항공서간 양식에 맞추어 만들었다고 말씀 드리니 바로 일부인을 찍어주셨다. 다음부터는 우체통으로 보내도 될 것 같다.

  필자는 사제항공서간이라는 것을 만들어 보고 직접 해외로 보내 보았다. 기존에 비해서 미국에 편지를 보낼 때 약 300원 정도 저렴하게 편지를 보낼 수 있다는 것이 좋았다. A4용지를 구매하는 등의 해야할 일은 있지만, 마음을 전하는데에는 아날로그 감성만큼 좋은 것도 없다. 빠르게 대화를 주고받는 수단이 아닌 천천히 흘러가고 답장을 기다리는 것을 즐길 수있는 편지를 보내 보도록 하자.

항공서간의 여러 이용 방법


  • 국제앰네스티의 긴급행동이라는 캠페인[3]의 경우, 해외에 탄원편지를 쓰는 캠패인을 하기도 하는데 이 때 저렴한 항공서간을 이용하기도 합니다.
  • 해외 일부인(스탬프) 수집을 위해서 항공서간을 보내서 반송 받는 방법을 쓰기도 합니다.

 

사제항공서간 보내기


  1. 연청색, 무게가 80g/m² 미만의 색깔있는 A4용지를 구매합니다. (용지가 튼튼하지 않으면 배송중에 찢어질 수도 있으니, 정해진 무게 안에서 튼튼한 용지를 고릅니다)
  2. 이 블로그에 있는 양식(사제항공서간 양식)을 구입한 A4용지에 인쇄합니다. (pdf 인쇄시 사이즈를 바꾸지 말고 그대로 인쇄해주세요)
  3. 틀에 맞게 자릅니다.
  4. 편지에 글을 씁니다. (당연히 인쇄되지 않은 면에 써야겠죠.)
  5. 내용을 볼 수 없도록 접어서 풀로 붙입니다. (안에 절대 아무것도 넣으면 안됩니다!)
  6. 주소를 쓰고 우표(450원)를 붙입니다. (우체국에서 접수시 우표는 생략가능)
  7. 우체통에 넣거나 우체국에 가서 편지를 보냅니다.

참고 자료


[1] 국제우편규정 [시행 1996.1.1] [대통령령 제14846호, 1995.12.29., 일부개정], 국가법령정보센터(http://www.law.go.kr/법령/국제우편규정)
[2] 미래창조과학부고시 제2013-8호, 항공서간의 견본과 중량
[3] 국제앰네스티 한국지부(긴급행동, UG), http://amnesty.or.kr/get-involved/urgent-action/

Jun 142014
 

다음 자동완성 워크플로우에 대한 수요가 있어서 만들어 보았습니다. 개인적으로 사전 자동완성은 타사 보다 다음이 좀 더 나은 것 같습니다. 혹시 원하는 사전이 있다면 말씀해 주시면 추가하도록 하겠습니다. 그리고 버그 알려주시는 것은 언제나 환영합니다^^ 방법은 이메일이나 코멘트를 통하여 부탁드립니다!

Screen Shot 2014-06-14 at 4.33.31 PM

 

설치 방법


방법은 간단합니다. Alfred 4 가 설치되어 있는 컴퓨터에서 아래의 workflow를 다운로드 받아서 실행하는 것 만으로 충분합니다.

링크

링크에 접속하여 `alfdaumsearch.alfredworkflow` 를 다운받아 설치합니다.

 

 사용 방법


사용방법은 다음과 같습니다.  제가 만든 네이버 검색 워크플로우 와 기본적인 방법은 같습니다.

  • ds ...  : 일반 키워드 검색
  • dk ...  : 국어사전 검색
  • dh ... : 한자사전 검색
  • dj ... : 일어사전 검색
  • de ... : 영어사전 검색
  • dc ... : 중국어사전 검색
  • di ... : 인도네시아어사전 검색
  • dv ... : 베트남어사전 검색
  • dit ... : 이태리어사전(이탈리아어) 검색
  • dru ... : 러시아어사전(노어) 검색
  • df ... : 프랑스어사전 검색
  • dtr ... : 터키어사전 검색
  • dth ... : 타이어사전(태국어) 검색
  • dpl ... : 폴란드어사전 검색
  • dpt ... : 포루투갈사전 검색
  • dcs ... : 체코어사전 검색
  • dhu ... : 헝가리어사전 검색
  • dar ... : 아랍어사전 검색
  • dsv ... : 스웨덴어사전 검색
  • dhi ... : 힌디어사전 검색
  • dnl ... : 네덜란드어사전 검색
  • dfa ... : 패르시아어사전 검색
  • dsw ... : 스와힐리어사전 검색
  • dro ... : 루마니아어사전 검색

 

 변경이력


  • [2014.06.30] v0.0.2 런치 : 알프레드에서 검색 후 엔터를 쳤을 때 "r"으로만 검색되는 버그 수정
  • [2016.12.09] v0.0.4 : 인도네시아어 사전 추가
  • [수정 2017-07-25 03:45+0900] 연관 프레임워크 업데이트 (시에라 백그라운드 버그 해결)
  • [2021-01-01] v0.0.5 : 다음 자동완성 주소 변경
  • [2021-01-07] v0.0.6 : 17 종류의 사전 추가
  • [2021-01-07] v0.2.0 : macOS 12.3 대응 -> python3 설치 필요
  • [2024-02-15] v0.3.0 : SSL에러 이슈 해결

 

기능 개선 참여 방법


해당 다음 검색 워크플로우는 MIT로 공개되어 있는 오픈소스입니다. 개선을 도우고 싶으신 분이 있으시면, Github alfdaumsearch 를 통하여 참여부탁드립니다.