Dockerを味見してみた

ネット散策していたら最近の仮想化技術(コンテナ技術?)で Docker というのが流行っているらしいことがわかりました。比較的簡単に試せるみたいなので、さくらのナリッジのこちらの記事を参考にちょっと試してみます。

1.環境構築

母艦環境は普段使っている Ubuntu14.04 LTS 64bit です。
(Dockerは64bit環境のみサポートのようです)

Synapticで「docker」で検索すると「docker.io」というのがでてきます。説明を見ると「Linux container runtime」ということなので、これがDocker環境のようです。
こいつにチェックマークをつけてインストールします。

インストールが終わったら、コンソールで

$ docker

とすると、説明が出てきました。

2.Hello Worldを試してみる

まず、ちょっと試してみます。

$ docker run ubuntu /bin/echo hello world
2015/01/28 00:49:03 Post http:///var/run/docker.sock/v1.12/containers/create: dial unix /var/run/docker.sock: permission denied

となってエラーになってしまいました。

こちらをみるとどうやら基本は root で弄るもののようです。でも、一般ユーザーでも触る方法があるようなのですが、今回はrootで動かしてみます。

$ sudo docker run ubuntu /bin/echo hello world
Unable to find image 'ubuntu' locally
Pulling repository ubuntu
b39b81afc8ca: Pulling image (latest) from ubuntu, endpoint: https://registry-1.db39b81afc8ca: Download complete 
511136ea3c5a: Download complete 
53f858aaaf03: Download complete 
837339b91538: Download complete 
615c102e2290: Download complete 
hello world
$

待つこと30秒位でしょうか。イメージをダウンロードした後、表示されました。
2回目はすでにイメージがローカルにあるので、一瞬で表示されました。

3.WordPressを動かしてみる

追っかけるだけになってますが、同様にWordPressを動かしてみます。

$ sudo docker build -rm -t tomono/wordpress git://github.com/jbfink/docker-wordpress.git
Warning: '-rm' is deprecated, it will be replaced by '--rm' soon. See usage.
Sending build context to Docker daemon 112.1 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:latest
 ---> b39b81afc8ca
(途中省略)
Step 19 : CMD ["/bin/bash", "/start.sh"]
 ---> Running in 9ed82742d36f
 ---> 0dfcba1fda89
Removing intermediate container 9ed82742d36f
Successfully built 0dfcba1fda89
$

・・・として、イメージが生成されるようです。

で、実行。

$ sudo docker run --name wordpress -d -p 8080:80 -p 2022:22 tomono/wordpress
4d13e5e74ddb45787f9c0e11120d6e88ad9844895a1779a9fe33c8c191104dca
$

ブラウザで 127.0.0.1:8080 にアクセスするとWordPressが動いているのが確認できました。

$ sudo docker stop wordpress
wordpress
$ sudo docker start wordpress
wordpress
$

で停止、スタートも確認できました。

4.不要になったコンテナの削除

最後に不要になったコンテナを

$ sudo docker rm `sudo docker ps -a -q`
4d13e5e74ddb
8e8f4a436e47
29378160a9e8
$

として削除しました。イメージの方は、

$ sudo docker images 
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none> <none> eba3c3f6eca6 About an hour ago 458.2 MB
ubuntu latest b39b81afc8ca 10 days ago 188.3 MB
$ sudo docker rmi eba3
Deleted: eba3c3f6eca6595bcb2822b4c532ce47fb99d2ecd6db169c9dffe4beebca644e
(途中略)
Deleted: caa76d7258ec6b0f5d1f1c0e6a7827612fcb0c995cd8654d60d90dd8ff606562
$ sudo docker images 
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest b39b81afc8ca 10 days ago 188.3 MB
$ sudo docker rmi b39b
Untagged: ubuntu:latest
Deleted: b39b81afc8cae27d6fc7ea89584bad5e0ba792127597d02425eaee9f3aaaa462
(途中略)
Deleted: 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158
$ sudo docker images 
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

として削除しました。

まだまださくらのナリッジのこちらの記事にはたくさん説明があります。どんなことができるのか解りやすくて助かります。

フレッツ光だけど上流は100Mbps?

いま、単身赴任で静岡県に住んでいます。単身赴任先にはフレッツ光を引いているのですが、はっきりいって本来の自宅の方が速いです。自宅はマンション共用で各戸には100MbpsのEthernetが引かれているのですが、CDN(Contents Delivery Network)経由でダウンロードするものでメジャーなものは大抵の場合には上限の11か12MiB/秒くらいに張り付きます。

しかし、フレッツ光ではもちろん上流の影響なのでしょうが、なかなか10MiB/秒を超えません。それどころか数MiB/秒を超えることもなかなかありません。
今回、Windows10 Technical Previewをダウンロードしていたら、めずらしく速度が出ていたのですが・・・

Screenshot from 2015-01-27 22:31:50

結局12MiB/秒に壁があります。12MiB/秒☓8bit=96Mbit/sで、見事に100Mbpsに壁が見えてます・・・・。まあ、ルーターのせいかもしれないですが。

ぜんぜん1Gbit/sに行きそうにない光回線の話でした・・・。

ちょっと気になるかなぁ・・・

時々、Hi-netの自動処理震源マップとかを見てたりするのですが、ちょっと気になったので記事にしておきます。

下の画像は、2015年1月13日午前2時くらいに見た本州中部の過去30日の震源マップです。

TONANKAI_MAP

一方、下記の画像は気象庁のWebサイトから持ってきた東海地震の想定震源域の図です。

shindo_s

これらを重ねあわせてみました。

OVERLAY

想定震源域の赤い線の北半分の部分の少し内側に沿って地震が発生していることがわかりますか?

過去7日の震源マップも持ってきてみました。

TONANKAI_MAP7

これに想定震源域を重ねあわせると、

OVERLAY7

となります。やっぱり想定震源域の赤線の少し内側に沿って起きているように見えますよね・・・。

大きな地震の前にはその周辺域で小さな地震が増えるという話も読んだことがあるので、ちょっと心配です。

 

Ubuntu MATE 32bitをUSBメモリにインストール

Ubuntu MATE 32bitをUSBメモリにインストールしてみました。

なぜMATEかというと、通常のデスクトップ環境ではやはり重いので、なるべく軽いものにしたかったためです。

今回も32bit版をインストールしました。ダウンロードはこちらから。

いつものように、まずVMware上で一度インストーラISOイメージで仮想マシンを作って起動します。その後、一旦シャットダウンして、仮想マシンからHDDを取り除きます。一度起動するのは、仮想マシン作成直後はHDDを取り除けないからです。

次に、再度、インストーラISOイメージで仮想マシンを起動します。
起動して試すだけかインストールするかの選択画面がでたところでUSBメモリを取り付けます。今回は、新たにSanDiskのExtreme USB3.0 64GBを使ってみました。USBメモリを取り付けたら仮想マシン側に認識させ、その後でインストーラで「Ubuntuをインストール」をクリックします。

あとは普通にHDDにインストールするのと変わりませんが、データ領域を多めに取りたかったのでパーティションは手動で分けました。

インストールが終わったら、仮想マシンを終了し、PCを再起動します。この時にBIOSで内蔵SATAを禁止します。

再起動したら、過去の記事同様にいろいろ設定します。

  • SATAの禁止(内蔵HDDへのアクセス禁止)
  • /etc/fstabの設定(tmpfsの設定、マウントオプションにnoatimeを追加など)
  • 内蔵時計のUTC設定をローカルタイム設定に変更

など。

SATAを禁止したら、再起動後に内蔵HDDが見えない状態になっているのを確認します。あとは内蔵HDDのつもりで作業すれば大丈夫。

引き続き、いろいろやりますが、こちらが参考になります。

それにしてもSanDisk Extreme USB3.0 64GBは速いです。

 

Linux上でCUPSプリンタを共有する

先日購入したBrother HL-2240Dですが、Windowsから使ったりLinuxから使ったりで結構面倒なことになっています。こんなことなら、LAN内蔵モデルにしておけばよかったと後悔しています。

といっても買い換えるわけにもいかない(最悪、それもないではないですが・・・)ので、何とかしていきたいと思います。

まずは、どれかマシンを決めてUSBで接続しておくことにします。ここでは、LinuxMint17 32bitを実行しているAthlon5350マシン(ブログ記事にはしていないのですが、結局BIOSTARのCeleron847マザーは突然再起動病が収拾せず、引退させました。代わりにAthlon5350を導入しました)に接続することにします。

ドライバのインストールに先立って、IPアドレスを固定します。今回はルータでDHCPの固定割り当てをすることでIPアドレスを固定しました。

次にプリンタドライバをインストールしますが、プリンタドライバのインストールは以前の記事とまったく同じ方法でテスト印刷まで行きました。

で、共有をかけてみます。
「システム管理」→「プリンタ」でプリンタの管理ウインドウが開きます。

Screenshot-プリンター1

サーバーメニューで「設定」を開きます。

デフォルトではすべてチェックが外れていますが、

  • 共有するので「このシステムに接続されている共有プリンタを公開する」にチェック
  • IPPプロトコルを使うので「インターネットからの印刷を許可する」もチェック
  • どうせ家庭内ネットワークであり、グローバルアドレスは持ってないので「リモート管理を許可する」もチェック
  • 「ユーザーにジョブのキャンセルを許可する」もチェック

します。

Screenshot-2

プライベートアドレスを割り振った家庭内ネットワークであり、外部から直接接続される可能性のあるIPv6もルータで殺してある(IPv6ブリッジ、IPv6パススルーを禁止してある)ので、割り切った設定です。自宅内専用なのでファイアウォールも入っていません。

この状態でhttp://127.0.0.1:631/をブラウザで開くと以下のようになりました。

Screenshot-3

この状態から他のPCからは見えるのに印刷できない状態でだいぶ悩みました。サーバの設定も「リモート管理を許可する」をチェックしても反映されません。また、上記画面で「管理」を押すと設定画面になるのですが、やはりリモート管理が許可できません。(ユーザーがlpadminグループに所属していないといけないようなのですが、少なくとも見掛け上はそう見えています)

この手のパターンは、何かの設定ファイルが読み込まれていない、とかそんな感じです。そこで、一旦PCを再起動したところ・・・・「リモート管理を許可する」ができるようになりました。
この状態でネットワークでつながった別のUbuntuマシン上で「プリンター」を開いて「追加」を押すと、ネットワークプリンタの中にAthlon5350が出てきます。そして、これを選択するとネットワークプリントができるようになりました。(ただ、このPCは別途ドライバをインストールしたことがあるので、ドライバのインストール要否はわかりません)

とりあえずLinuxからはそれなりに共有できるようになったようです。

MediaTekのスマートウォッチ用SoC

これまたネットを彷徨っている際に見つけたものです。

きっかけはいつものHackaDayの記事です。

「まるでArduinoが555のようにみえる」という書き出しで始まる記事ですが、「364MHzの32bitプロセッサ、8MBのRAM、GSM、Bluetooth、LCDコントローラ、PWM、USB、その他たくさんのものが入ってZippoよりも小さくてダンボールよりも薄い。これがわずか3ドル。使わない理由がない」という記事です。

このチップ、$12で売られている”Gongkai Phone”という携帯電話・・・”Gongkai”は中国語では「公开」と書くようで、日本の漢字を当てると「公開」となります・・・のSoCとして使われているもののようです。Gongkai Phoneがどんな携帯電話かというと、こちら(GIGAZINE)に日本語の記事がありました。

調べていくと、MediaTekのMTK6260というチップが引っかかってきて、スマートウォッチなどにも使われているようです。(後の紹介ビデオの説明ではMT6260はすでに市場で$30を下回って販売されているスマートウォッチに使われているとか・・・)
あと、単体のGPSトラッカーなどにも使われているようです。

MediaTekは最新のエントリークラススマートウォッチ用のチップセットとしてMT2502というのをリリースしているようです。(Youtubeでの紹介ビデオ
このチップのTechnical Briefを見ると、

  • ARM7EJ-S(最小26MHz、最大260MHz?)
  • Bluetooth4.0
  • FMラジオ受信(データ放送も受信できるみたいです)
  • シリアルFlash I/F
  • VGAまでのCMOSカメラI/F
  • UART、USB1.1、SDIO、SDストレージなどのI/F
  • キーパッドI/F、SIMコントローラ、RTC、PWM、LCDコントローラ
  • AD/DAコンバータ
  • GSM/GPRS無線フロントエンド
  • リチウムイオン電池制御

などを含んでいるようです。(ちょっとちゃんと読まないと怪しいかも)
MCMとしてDRAM256MBを含んでいそうな感じの記事もあります。(ビデオでもメモリを統合している、という説明があります)

残念ながら日本ではGSM/GPRSは使えないので萱の外という感じもしますが、海外では旧世代のGSM/GPRSは回路コストも消費電力も抑えられるようになってきたので、IoTの接続手段としてしぶとく生き残っていくのかもしれません。

STM32F401で遊んでみる(5)

9.printf()やgetc()を使ってみる

mbedを挿入した際のログをdmesgコマンドでみてみました。

[15886.601036] usb 2-1.4.3: USB disconnect, device number 9
[15888.075962] usb 2-1.4.3: new full-speed USB device number 10 using ehci_hcd
[15888.225240] scsi7 : usb-storage 2-1.4.3:1.1
[15888.225648] cdc_acm 2-1.4.3:1.2: This device cannot do calls on its own. It is not a modem.
[15888.225670] cdc_acm 2-1.4.3:1.2: ttyACM0: USB ACM device
[15889.223047] scsi 7:0:0:0: Direct-Access     MBED     microcontroller  1.0  PQ: 0 ANSI: 2
[15889.224257] sd 7:0:0:0: Attached scsi generic sg2 type 0
[15889.226709] sd 7:0:0:0: [sdb] 1072 512-byte logical blocks: (548 kB/536 KiB)
[15889.227459] sd 7:0:0:0: [sdb] Write Protect is off
[15889.227464] sd 7:0:0:0: [sdb] Mode Sense: 03 00 00 00
[15889.227958] sd 7:0:0:0: [sdb] No Caching mode page found
[15889.227963] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[15889.230723] sd 7:0:0:0: [sdb] No Caching mode page found
[15889.230728] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[15889.235618]  sdb:
[15889.237988] sd 7:0:0:0: [sdb] No Caching mode page found
[15889.237993] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[15889.237996] sd 7:0:0:0: [sdb] Attached SCSI removable disk

よくみると、USBストレージだけではなく、ttyACM0というデバイスが追加されていることがわかります。

調べてみると、Serialクラスでprintf()やgetc()などが使えそうです。プログラムの方は、

#include "mbed.h"

Serial pc(USBTX,USBRX);
DigitalOut myled(PA_5);
DigitalIn button(USER_BUTTON);

int main() {
    int c=200;
    char k;
    pc.baud(115200);
    pc.printf("This is TEST!!\r\n");
    while(1) {
        if(pc.readable()){
            k = pc.getc();
            if((k=='a') && c<1000) c+=50;
            if((k=='z') && c>100) c-=50;
            pc.printf("Value of c: %d\r\n",c);
        }
        if(button){
            myled = 1; // LED is ON
            wait((double)c/2.0/1000);
            myled = 0; // LED is OFF
            wait((double)c/2.0/1000);
        } else {
            pc.printf("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
        }
    }
}

としてみました。内容は、

  • シリアルコンソールを115.2kbpsで開いて、メッセージを出力します。
  • 読み出せるキャラクタがあるかreadable()で確認
    (これをやらないとgetc()はキーが押されるまで動作をブロックします)
  • 読み出せる場合にはgetc()で読み出し
  • 入力文字を判別してcの値を増減
    (キーの値が読めているか確認するため)
  • ボード上のUSERスイッチが押されていない場合はcの値に応じてLEDを点滅
  • ボード上のUSERスイッチが押されている場合には文字を多数出力
    (本当に115.2kbpsでているか確認したいため)

としています。

プログラムを作成したらコンソールを一つ開いて、

$ screen /dev/ttyACM0 115200

としてシリアルコンソールを115.2kbpsで開きます。

その後、compile(と書き込み)を行って動作を確認しました。

STM32F401で遊んでみる(4)

7.ソースコードをさらに改変してみる

そのままIDEのウインドウを閉じてしまっても、IDEの左側の「Programu Workspace」の中の「My Programs」の中にツリー状に残るようです。

こんどは別のテストをしてみるため、importしなおしてみましたが、この時にプロジェクト名も変更してみました。そうすると、「My Programs」の中にもう1つツリーができました。

次の変更はボード上のボタンを使ってみます。ポート割り当ては、「USER_BUTTON」と「PC_13」のようなので、まずは「USER_BUTTON」でやってみます。

修正後のソースは

#include "mbed.h"

DigitalOut myled(PA_5);
DigitalIn button(USER_BUTTON);

int main() {
    while(1) {
        if(button){
            myled = 1; // LED is ON
            wait(0.2); // 200 ms
            myled = 0; // LED is OFF
            wait(0.2); // 200 ms
        } else {
            myled = 1; // LED is ON
            wait(0.05); // 50 ms
            myled = 0; // LED is OFF
            wait(0.05); // 50 ms
        }
    }
}

としてみました。

これでコンパイルすると・・・ボタンを押すと点滅が高速になりました。

8.ここまでのまとめ

書くと長いですが、わかってしまえば実際の作業はあっという間です。
特に何よりもありがたいのは開発環境のインストールが必要ないことです。これでどこでも開発ができてしまいます。

一方で、実際に触ってみたmbed環境はIDEこそ本格的な開発環境の雰囲気ですがライブラリ等まで考えて見てみるとArduinoを強く意識しているように見えます。
より本格的な開発環境もWeb上で完結してしまうと楽ちんでいいですね。

STM32F401で遊んでみる(3)

5.サンプルプログラムを実行してみた

IDE上の「Compile」をクリックしてみるとバイナリが生成されるようで、binファイルの保存場所を聞いてきます。
ここでは、直接USBマスストレージに見えている場所(/media/NUCLEO)を指定してみました。これで勝手にターゲットボード側にプログラムが書き込まれるようで、書き込み中はデバッガ側のLEDが赤と緑に何度かチラチラ変わるようです。

指定すると、緑LEDの点滅は止まり、赤LEDが点灯するのみになってしまいました。

6.ソースコードを修正する

ワークスペース左側のツリーの中から main.cpp をクリックすると、ソースが表示されました。ソースコードによれば、LED1が200ms点灯、1s消灯の繰り返しになりそうな感じです・・・が、実際にはそのようには動いていません。

ボードのユーザーマニュアルにある回路図を見ると、

  • ターゲットボード上の赤LED(LD3)は電源供給で点灯
  • ターゲットボード上の緑LED(LD2)はJP6を介してArduinoコネクタの10pin幅の方の6pin(D13)へ接続

となっています。一方で、端子一覧でも

  • LED1はD13と同じPA_5に割り当て

となっているので、これでLEDは点灯してもおかしくないはずです。

そこで、LED1の定義が怪しいと睨んで探してみたのですがみつかりません。そこで試しにソースコードの3行目の

DigitalOut myled(LED1);

をもっともCPU自体のポート割り当て記述に近いと思われる

DigitalOut myled(PA_5);

と書き換えてコンパイルしなおしてみたところ、無事にLチカが始まりました!

Microsoftのホワイトペーパーがよくできていると思った件

Visual Studio ExpressがなくなってVisual Studio Communityに変わる、というのを見かけてMicrosoftのWebサイトを見ているときに見かけたものです。

そのページの下の方に「IoT 時代に対応する組込み開発」というリンクがあり、その下の「Visual Studio技術情報」というリンク先を見ていたら、「Internet of Things 時代の組込みソフトウェア開発 (PDF 2.38 MB)」というホワイトペーパーがありました。

宣伝の部分はさておき、マーケットの分析と課題、組込み開発の課題と分析、現場レベルでのプロセス・生産性・開発環境・保守などにおける問題点をさまざまな視点からよく押さえてあって、鋭いところを突いているように思います。基本的には組込みソフトウェア開発を中心に記述されていますが、少し言葉を変えれば組込み開発全体に当てはまる良い内容だと思います。ソフト以外の分野の人もぜひ読むべき内容だと思います。

しかし、悲しいかな、上流工程・上位レベルになるほどこういう分析ができている人は少ないですね。こういう内容をきちんと押さえられる人が上流・上位に立つかどうかが存続の分かれ目になるような気がするのですが。