プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

今更ながらdocker試してみました

cartoDB をサーバーにインストールして試したいと思い、いろいろと調べていたらdockerのイメージがあるらしいということがわかりました。インストール手順とか眺めても、結構面倒そうだったので、最初のお試しとしてこれを利用しない手はないでしょう。

ということで、まずは、興味ありながらも手を出せていなかったdockerを今更ながら試してみることにしました。といっても、dockerの解説記事やチュートリアルはすでにネット上にたくさんあるので、ここでは参考にさせていただいた記事『いまさら聞けないDocker入門@IT』を元に、個人的に躓いた点などをメモ的にまとめておきたいと思います。

インストール

dockerをインストールして試す手ごろな環境がないか探してみたところ、古いノートPCにLubuntu(14.04 LTS, 32bit)を入れていたので、それで試してみることにしました。インストールは、記事中にもあるように

sudo apt-get install docker.io

で問題なく完了しました。ただし、すでにシンボリックリンクは最初から貼られていました。

コンテナの実行

実は、ここが一番はまりました。記事によると

docker pull ubuntu
docker run -it --name test ubuntu /bin/bash

で最新のUbuntuのイメージをダウンロードして、それを実行するということでしたが、なぜか

mor@lenovo:~$ docker run -it --name test ubuntu /bin/bash
exec format error
FATA[0000] Error response from daemon: Cannot start container 9bd88c529a26a934e661b55a242078d0fa4f224b665a521687388b8af3cf3598: [8] System error: exec format error 
mor@lenovo:~$ 

というエラーが表示されて、実行できませんでした。

途方にくれながら、ググってみると、ホストOSが32bitの場合、コンテナのイメージも32bitである必要がありそうです。

http://d.hatena.ne.jp/rougeref/20150724 http://stackoverflow.com/questions/29072605/can-not-start-docker-on-lubuntu-cannot-start-container-exec-format-error

ということで、32bitイメージを取得して再度試してみました。

docker pull 32bit/ubuntu:14.04
docker run -it --name test1 32bit/ubuntu:14.04 /bin/bash

おぉ、問題なく動作しました。なお、イメージ取得時にタグ名をお忘れなく。

Dockerfileを試す

基本的には記事にあるとおりに作業すればよいのですが、

FROM 32bit/ubuntu:14.04
MAINTAINER mor
RUN apt-get update
RUN apt-get -y install nginx
ADD index.html /usr/share/nginx/html/

のように若干調整が必要でした。docker build を実行時にいくつかエラーが表示されていたのですが、まあ、動いていたので今回は気にしないことにしておきます。

あと、こちらのページのコラム記事に nsenter を使って、動作中のコンテナに接続する方法が紹介されています。しかし、残念ながら32bit版のLubuntuでは、こちらの記事の方法(dockerイメージによるインストール方法)は使えませんでした。さて、困ったと思っていたところ、dockerのバージョンアップに伴い、動作中のコンテナに接続してコマンドを実行する機能が追加されていました。

http://agekuno.hatenablog.com/entry/2014/10/18/010128

試してみるとこんな感じでした。

mor@lenovo:~$ docker exec --help

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

  -d, --detach=false         Detached mode: run command in the background
  --help=false               Print usage
  -i, --interactive=false    Keep STDIN open even if not attached
  -t, --tty=false            Allocate a pseudo-TTY
mor@lenovo:~$ 
mor@lenovo:~$ docker exec -it 0bfb /bin/bash
root@0bfb951cf79a:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2268   528 ?        Ss   15:38   0:00 /bin/sh -c /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
root         7  0.0  0.2  14900  3180 ?        S    15:38   0:00 nginx: master process /usr/sbin/nginx -g daemon off; -c /etc/nginx/nginx.conf
www-data     8  0.0  0.0  15044  1396 ?        S    15:38   0:00 nginx: worker process                                  
www-data     9  0.0  0.0  15044  1396 ?        S    15:38   0:00 nginx: worker process                                  
www-data    10  0.0  0.0  15044  1396 ?        S    15:38   0:00 nginx: worker process                                  
www-data    11  0.0  0.0  15044  1396 ?        S    15:38   0:00 nginx: worker process                                  
root        18  1.0  0.1   3544  1708 ?        Ss   15:39   0:00 /bin/bash
root        32  0.0  0.0   3144   976 ?        R+   15:39   0:00 ps aux
root@0bfb951cf79a:/# exit
exit
mor@lenovo:~$ 

これを使えば、パッケージのインストールなどしなくても一発でコンテナの様子を調べられます。便利!

Docker Hub の利用

解説記事の最後はDocker Hub を使ってみるということです。こちらも試してみました。

Docker Hub のアカウント登録で、GitHubのアカウントも使えるとあったのですが、今回試した際は見つけることができませんでした。なので、アカウントを新たに登録して、ログインしてみます。

docker push

でリポジトリに追加できました。なお、dockerの場合、『リポジトリ』がイメージ名に対応しているようです。

pushコマンドで追加した場合、何もしなければpublicリポジトリになるようです。これをprivateに切り替えるためには、リポジトリの詳細画面を開いて、タブメニューのSettingsを選択して、『Visibility Settings』でprivateにすればOKのようです。しかし、無料枠だとprivateリポジトリが1つだけなので、なかなか難しいところです。

なお、今回は Automated Build は試しませんでした。

Dockerをどう使うか?

触ってみた感触だと、テスト的にあれこれするには非常に便利そうに感じてます。まずはいろんな環境を手軽に作ったりするのに使う感じになりそうかな。

ネットの記事をあれこれ読むと、dockerを利用してサーバー運用とかもできそうですが、結局データをどう保存しておくのかとか、コンテナ同士のやりとりをどうするのか、といった面がまだ見えていません。

でも、Dockerfile によってサーバーの設定を記述できるなどは非常に魅力的です。ま、もっとも、Chefとかのツールを使ってもいいんじゃないか思うので、そのあたりの違いもちょっと見えていない面があります。

これを機に、少しDockerに触ってみようと思います。

cartoDB 使ってみた

2016年5月にあった OSC名古屋 併設のハッカソンイベントで知った、cartoDB が面白そうだったので、試してみました。類似の記事も多くありましたが、自分の備忘録と作業記録を兼ねてメモしておきます。

 

cartoDBとは

地図上でデータを視覚化するSaaSになるようです(Wikipedia)。でも、単なるクラウドサービスだけでなく、オープンソースでコードを公開していたり、いろいろとできることが豊富そう。使ってみないことには何もわからないので、まずは試してみることにしました。

 

アカウントの設定

cartoDB のサイトを開いてみると、いろいろと書いてあるのですが、ちょっと地図を作って試すだけでも signup が必要そうです。が、果たして本当にそれでよいのか、クレジットカード番号聞かれたらどうしようか(そんなことなかったです)、小心者なので気になって、この時点で前に進めませんでした。最近はやりの『おためしはこちら』みたいな誘導の仕方はそれなりに効果があるのだなと、今更ながら変なところに感心してしまいました。

で、signupしないと前に進めなさそうなので、あきらめて素直にsignup しました(メールアドレス、アカウント名、パスワードを入力します)。signup時点では、freeプランになっているようなので、一安心です。

 

お試し

signupした直後の画面(dashboardと呼ばれるようです)で、さて何をすればよいのか?というのがまたわかりませんでした。まあ、結論から言えば、『NEW MAP』 をクリックすると、『Add datasets』という画面が表示されるので、ここから表示したいデータ(位置情報を含むデータ)をアップロードする、という形になります。

※画像はいくつかdataset追加後なので、最初の画面は少し見た目が異なります。

 

考えてみれば当たり前で何らかの位置情報を持ったデータセットがないと何も表示できないので、最初はデータセットの定義という形になります。

自分でデータを用意できない場合は、『data library』 というタブをクリックするとこちらからもサンプルになるようなデータを選択することができるようです。

 

今回はcartoDBを紹介していたサイトでも使われていた、総務省統計局にある日本の統計から都道府県別の人口Excelファイル)を利用しました。

ファイルをアップロードする場合は、『Connect dataset』タブを選択し、『Data file』 を選択してドラッグアンドドロップしたり、URLを入力すると読み込んでくれます。

ファイルをアップロードすると、セルの結合があるExcelファイルにも関わらず読み込んでくれました!

 

で、『the_geom』というカラムが位置情報を保持しているカラムの様なのですが、この時点では何も入っていません。当然ですね、元のExcelファイルは都道府県名を日本語で書いているだけですので。なんとcartoDBはジオコーディングもできるそうです。都道府県名の入ったカラム上でクリックすると、メニューが表示されます。

ここで、『Georeference』を選択すると、下記の様な位置情報指定用の画面が表示されます。

もし、緯度経度をすでに持っているようなら、直接そのカラム名を指定すればよいようです。今回は、都道府県名ということで『City name』を選択しました。

都道府県名の入ったカラム名を指定して、Country を示すカラムがないので、直接 Japan と入力しました。画面下部の『continue』を押すと、

のような確認画面が出てくるので、ボタン(中央の画像)を押します。とりあえず、完全ではないですが、都道府県名から緯度経度に変換したものが得られました。

 

とりあえず、これで地図表示ができます。画面上部のMAP VIEWを選択すると、地図上にポイントがプロットされました。

拡大してみていくと、なにやら表示の怪しそうな部分(隠岐の島にポイントがある・・・)もありますが、一応表示できています。

 ※ジオコーディングについては、日本語で都道府県名を与えているのが問題かと思い参考サイトのようにローマ字表記にしたり、返還方法を Admin. Regions としたりしましたが、やはりうまくいかない部分もありました。DATASET上で直接データの編集もできますが、問題があるようなら、事前に別途ジオコーディングをしていたほうがよいかもしれません。

 

情報の表示

この時点では、緯度経度で示した地点をプロットしているだけなので、さほど面白くありません。せっかくなので、人口に応じた表示にしてみたいと思います。画面右側にあるバーからWizardというボタン(筆のアイコンのボタン)を押すと、下図のような表示になります。

この画面であらかじめ決められたいくつかのフォーマットを選択して表示することが可能なようです。わかりやすそうなもので、人口に応じて円をの大小で表示させたいと思います。

実はまだこの時点では、人口のカラムが文字型なので表示させることができません。

一旦、DATA VIEW に戻ります。人口のカラムのヘッダ行のところにstringとあるので、そこをクリックすると、データ型を選択できるメニューが表示されます。ここで、Numberを選択すると、string型だったデータが数値として扱われるようになります。

次に、MAP VIEW に戻り、Wizardを選択し、Bubbleを選択します。どのカラムのデータを表示させるか選択するのですが、今回の場合は数値型のカラムが一つなので選択済みになっています。デフォルトでもなんとかく、それっぽい図になりました。

 

公開

freeプランの場合、作成した地図を非公開にすることはできないようです。実はすでにこの時点で地図は公開されています(https://ユーザー名.cartodb.com/ にアクセスするとそのユーザーのMAP、datasetを見ることができます)。

画面上部のPUBLISHボタンを押すと、公開用のURLや埋め込み用のコードを取得することができます。とはいえ、PUBLISHを押さなくても、すでに公開されていますのでご注意ください。
 

その他

いろいろとオプションを触ってみると非常に簡単に地図上での表現を変更することができます。面白いですね。また、あとから知ったのですが、チュートリアルにいろいろな地図の作り方が載っているので、そちらを試すのも面白いと思います。

Twitterのデータを拾ってきて、地図上に表示することも簡単にできました。なお、Twitterからデータを取得するには、ちょっと手間ですが、cartoDBにメールを送ってリクエストを出す必要があります。また、Twitterからのデータ取得を一定間隔で自動で行うなどの場合、別途料金が必要なようです。また、データ取得回数にも制限があるみたいです。詳しくはTwitterのチュートリアルなどをご覧ください。

個人的には、一旦地図を作成すると、API経由でデータのアップデート(DATASETの更新)ができるようなので、これも試したいと思います。

にしても、いろいろと便利なものがでてきますね。

 

参考サイト

使い方の解説

http://qiita.com/PSS/items/46f94e528cd8ad645dcf

http://waigani.hatenablog.jp/entry/2015/09/23/223636

http://midoriit.com/2016/05/cartodb%e3%81%ae%e6%b4%bb%e7%94%a81.html#more-2337

 

全般的な説明

http://kaitok.github.io/cartodb/20160329/cartodb_intro/#1

http://www.orenchbase.com/archives/549

 

チュートリアル

https://docs.cartodb.com/tutorials/connect_twitter_datasource/

 

ファームウェアアップデート

以前ブレッドボード版の IchigoJam を作ったのですが、伊勢ギークフェア向けに何か作るのに使えないかと考え、手始めにファームウェのアップデートをすることにしました。

その理由なんですが、元々、作ったままのIchigoJamでは画像に結構ノイズが乗って見づらく思っていたら、クリスタルを追加すると映像が改善することがあるとの情報を見つけて、これはいいと思っていたら、クリスタルを追加すると、ファームウェアをクリスタル対応版にする必要があるとのことがわかったためです(ファームウェア1.0.2からは自動検出になるようです)。

で、ファームウェアアップデートをするときは、PCとも接続しないといけないので、それも併せて試しました。

ということで、このあたりの一連の作業を忘れないようにメモしておきます(ハードウェア系の作業なんてホント忘れてしまいそうです)。

IchigoJamをPCに接続する

必要なもの

  • USBシリアル変換
  • オス-メスのジャンパーケーブル3本

いきなりファームウェアのアップデートも怖いので、まず最初は、IchigoJam をPCに接続してみます。作業は、『イチゴジャムレシピ』にある『パソコンと接続』ページを参考に行いました。

接続するために必要なものとしては

  • USBシリアルモジュール
  • オス-メスのジャンパーケーブル3本

になります。今回は、安さにつられてamazonに出ていた海外発送の商品を購入しました(買ったときは400円!)。不良品もあるので、2個同時に注文するとかの情報も見かけましたが、そんなこと気にせず1個だけ注文しました。ちなみに、写真にジャンパーケーブルが写っていたので、買わなくていいやと思っていたら、これはメスーメスのタイプなので、ブレッドボードのIchigoJamと接続するのには使えませんでした。あとから、追加注文する羽目になりました。

機材の準備ができれば、早速IchigoJamにつなげてみます。

今回購入したやつは、モジュール上の端子がTXC、RXCとなっており、『イチゴジャムレシピ』にある『パソコンと接続』ページでクロスではなく、ストレートで結線しないといけないと注意されているタイプでした。

f:id:junichim:20160825154815j:plain

早速つなげてみます。USBシリアルモジュール側に指したジャンパーケーブルの色(緑:GND、赤:TXC、青:RXC)に対して、

f:id:junichim:20160825154810j:plain

ブレッドボード側は、赤:TXD、青:RXD、緑:GNDになります。

f:id:junichim:20160825154812j:plain

(クリスタル設置後の写真です。USBシリアルモジュールの接続の様子がわかればと思います)

結線ができたので、PCにターミナルソフトをインストールしておきます。今回は、イチゴジャムレシピのページでも紹介されているIJKBを使いました(facebokグループもあります)。

で、喜び勇んで、USBシリアルモジュールをPCにつないで見ると、モジュール上のランプが点灯してます!おぉ、これで問題ないなと思っていたら、なんかCOMポートがうまく選択できず、もちろん、接続できませんでした。

答えを先にいうと、このチップ用のドライバをインストールする必要があります。 (ドライバのことは、下記のサイトの記事を眼にして知りました。ありがたいことです。)

ドライバは、こちらの『CP210x USB - UART ブリッジ VCP ドライバ』の手順に従ってダウンロードとインストールを行ってください。PC側が、Windows7(64bit版)でしたので、それに見合ったものを入れました。

ドライバのインストールが終わってから、USBシリアルモジュールをPCにつないで見て、IJKBを起動すると、COMポートの選択肢が増えている!早速これを選んでつないで見ると、おぉ!繋がった。PC側で、

LED 1

とかコマンドを送ると、ちゃんとLEDが光りました。

ちょっとドライバ周りで手間取りましたが、これで問題なく接続できたようです。

ファームウェアのアップデート

さて、次は本番のファームウェアのアップデートです。IchigoJamの場合、クリスタルの有無で利用するファームウェアが変わるようです。

安全策をとるならば、

  1. クリスタルを設置
  2. 今のバージョン(0.9.7)のクリスタル対応版へファームウェア書き換え
  3. 最新版(1.0.1)へアップデート

とするとか、

  1. 最新版(1.0.1)へアップデート
  2. クリスタルを設置
  3. 最新版のクリスタル対応版へファームウェア書き換え

と、2回書き換えを行うことになると思います。

でも、まあ、なんとなく面倒になってきたのと、『イチゴジャムレシピのファームウェアの更新』ページの下のほうの注意書きに、クリスタル対応版のファームを入れてクリスタルがない場合はLEDが点灯する、という記述を見つけて、多分壊れることは無くあとからクリスタルをつければ動作するのだろうと思ったので、1回で済ますことにしました。

というわけで、作業手順です。まあ、こちらの『IchigoJamのファームを書き換える』を参考にそのまま作業しただけですが・・・

進め方としては、

  1. 1.0.1(クリスタル対応版)へアップデート
  2. クリスタルを接続
  3. 無事に起動

という目論見です。

まず、作業PCにFlashMagicをダウンロードして、インストールしておきます。

次に、IchigoJamのファームウェアを公式サイトからダウンロードして、解凍しておきます。今回使うのは、1.0.1のクリスタル対応版です。

IchigoJamはPCからはずし、電源を切ります。次に、IcigoJamのICのISP端子とGNDを接続します(RESETは接続しなくてよいようです)。

この状態で、IchigoJamの電源をいれると、LEDが点灯した状態になります(こんな感じです)。

f:id:junichim:20160825154804j:plain

ここで、USBシリアルモジュールをPCに接続します。

Flashmagickを起動します。

CPUとして、LPC1114/102を選択します。COMポートとして、IchigoJamのものを選択します(ここではCOM6でした)。Baud Rate は115200を選択します。

その他として、『Erase blocks used by Hex File』と『Verify after programming』にチェックを入れておきます。

f:id:junichim:20160825154803p:plain

Step3のところで、ダウンロードして解凍したIchigoJamのファームウェアを選択します。

Step5のStartボタンを押せば、ファームウェアの書き換えが行われます。問題がなければ、下側のステータスメッセージに、Finishedが表示されます。

ここで、一旦IchigoJamの電源を切り、ISPとGNDを接続していたジャンパーケーブルを抜きます。

再度IchigoJamの電源を入れると、前述のように、LEDがちゃんと光ってます。

ここから、クリスタルの設置になります。

クリスタルは、『イチゴジャムレシピの周辺機器』のページにあるように12MHzのものを用意します。毎度のごとく、amazonで購入しました。1個しか使わないのに、10個入りでしか売ってないのがつらいですね。でも、たまにしか買わないのなら、amazonの送料無料というのは魅力的なんですよね。

設置は全然難しくなく、CPU上の IchigoJam の端子と @taisukef の端子をつなぐように接続します。ブレッドボードなんで、CPUに対して斜めにして押し込んで完了です。

さて、これで作業完了(のはず)です。 電源を入れると、無事に表示されました!

f:id:junichim:20160825154808j:plain

ちょっと文字がボケてるのは、カメラの腕のせいで、IchigoJamのせいではないので、悪しからず。