まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

2016年08月

PiTop を購入して依頼、ラズベリーパイ(以下「ラズパイ」)をデスクトップ環境として使うことが多くなりました:

2016080702


さて PiTop に限りませんが、ラズパイをデスクトップ環境として使う場合の問題点はアプリケーションの充実度と、ストレージの少なさです。前者は少しずつ充実しつつあるのですが、そもそもマイクロ SD カードを挿して、そこに OS を導入して使うという手法を取る以上は、このマイクロ SD カードの容量が全空間なわけです。これはどうにもならない。。

・・・と諦めかけていた中で思いつきました。そもそも IoT 機器として使うことも多いラズパイは常に給電状態であることも多く、ネットワークもONの前提で使うことができます。であればクラウドなどの外部ストレージをネットワークマウントしてしまえば、この容量の問題を解決できるのではないか!? と。

実際に試したみた時の様子を以下に記載します。今回はいわゆる S3 互換(Swift互換)のオブジェクトストレージをラズパイにマウントする、という方法に挑戦してみました。具体的には IBM Bluemix のオブジェクトストレージサービスを使って実現してみました:

Swift のオブジェクトストレージをマウントするために CloudFuse を使うことにします。CloudFuse に関しては(前提環境が異なりますが)以前にもこのブログで何度か紹介したことがあります。興味のある方、特に CentOS でマウントさせることに興味ある方はこちらも参考にしてみてください:
SoftLayer の Object Storage をサーバーインスタンスにマウントする


話を戻して、まずはラズパイに CloudFuse を導入しましょう。まずは root になって apt-get のリポジトリを更新します(これをしないとエラーになったので):
$ sudo su
# apt-get update
# apt-get upgrade

次に CloudFuse の実行やビルドに必要なライブラリをまとめて導入しておきます:
# apt-get install build-essential libcurl4-openssl-dev libxml2-dev libssl-dev libfuse-dev libjson-c-dev

ここまで準備できれば CloudFuse のビルドが可能になります。GitHub からソースコードをダウンロードして、展開して、ビルドして、インストールします:
# cd /usr/local/src
# git clone https://github.com/redbo/cloudfuse
# cd cloudfuse
# ./configure
# make
# make install

これで CloudFuse の準備ができました。後はオブジェクトストレージの環境に合わせた設定をしてマウントするだけです。既にオブジェクトストレージ環境をお持ちの方はその環境に合わせた情報を使ってください。

以下はまだオブジェクトストレージ環境をお持ちでない場合の方向けに、IBM Bluemix のオブジェクトストレージ環境を入手する方法から紹介します。IBM Bluemix のオブジェクトストレージのインスタンスを利用するにはこちらの手順を参照ください(無料で 5GB まで使えるオブジェクトストレージ環境が入手できます):


上記手順の、オブジェクトストレージサービスの接続情報を取得するところまでができていればOKです。以下、ここで取得したオブジェクトストレージのファイルシステムをラズパイにマウントしてみます。
2016080701


この Bluemix 環境のオブジェクトストレージを利用する場合は、上記画面の環境変数内の auth_url, userId, password の3つの値(下記の赤字部分)が必要になります。この3つの値をメモしておきましょう:

{
  "credentials": {
    "auth_url": "https://identity.open.softlayer.com",
    "project": "object_storage_**************************",
    "projectId": "******************************",
    "region": "******",
    "userId": "(userId)",
    "username": "Admin_*************************************",
    "password": "(password)",
    "domainId": "**********************************************",
    "domainName": "******"
  }
}


改めてラズパイ環境に戻ります。ラズパイに導入した CloudFuse を使って、このオブジェクトストレージ環境をマウントするにはホームディレクトリ以下に .cloudfuse というテキストファイルを以下の3行の内容で作成します:
username=(userId)
api_key=(password)
authurl=https://identity.open.softlayer.com/v3/

最初の username の値は環境変数内のuserId の値、api_key の値は同 password の値、そして authurl の値には同 auth_url の値に "/v3/" をつけたものを指定します。Bluemix のオブジェクトストレージ以外の環境を使っている場合はその環境に合った相当する値を取り出して指定してください。

これで準備完了です。最後にマウントポイント(この例では /mnt)を指定して CloudFuse を実行します:
# cloudfuse /mnt

このコマンドが成功すると、オブジェクトストレージの内容を /mnt 以下にマウントすることができます:
# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         30G  4.6G   24G   17% /
devtmpfs         459M     0  459M    0% /dev
tmpfs            463M     0  463M    0% /dev/shm
tmpfs            463M  6.4M  457M    2% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            463M     0  463M    0% /sys/fs/cgroup
/dev/mmcblk0p1    60M   20M   41M   34% /boot
tmpfs             93M  8.0K   93M    1% /run/user/1000
cloudfuse        8.0T  7.5M  8.0T    1% /mnt
  ↑最大 8TB までのストレージがラズパイ上で使えるようになりました!


ちなみに、マウントしたオブジェクトストレージを解除するには umount コマンドでアンマウントするだけです:
# umount /mnt


Perl ベースのウェブフレームワークである Mojolicious というものが出ていることを知りました。昔は CGI といえば Perl だったよなあ・・・と懐かしい想いにふけりつつ、 CentOS (6) 環境に Perl と Mojolicious を導入して、使ってみます。
2016080501



Mojolicious は Perl のパッケージマネージャーである CPANM を使って導入します。その CPANM や Perl の比較的新しいバージョンを使おうとすると perlbrew 経由で導入するのが楽なので、まずは perlbrew を導入します:
# curl -L http://install.perlbrew.pl | bash
# echo "source ~/perl5/perlbrew/etc/bashrc" >> ~/.bash_profile

シェルを起動しなおした後に、導入した perlbrew を使って Perl (以下の例では 5.20.2)をインストールします:
# perlbrew install perl-5.20.2

導入した Perl( 5.20.2 ) を有効にして、バージョンを確認します:
# perlbrew switch perl-5.20.2
# perl -v

This is perl 5, version 20, subversion 2 (v5.20.2) built for x86_64-linux
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2015, Larry Wall
  :
  :

目的の Perl がインストールできたことが確認できました。次に perlbrew を使って CPANM をインストールします:
# perlbrew install-cpanm

導入した CPANM を使って Mojolicious をインストールして、バージョン(と動作)を確認します:
# cpanm Mojolicious
# mojo version
CORE
  Perl        (v5.20.2, linux)
  Mojolicious (7.01, Doughnut)

OPTIONAL
  EV 4.0+                 (n/a)
  IO::Socket::Socks 0.64+ (n/a)
  IO::Socket::SSL 1.94+   (n/a)
  Net::DNS::Native 0.15+  (n/a)

This version is up to date, have fun!

ここまでの作業で Mojolicious がインストールできました。では以下の内容で Perl のウェブアプリを作ります(webapp.pl という名前で保存します):
use Mojolicious::Lite;

get '/' => sub {
  my $self = shift;

  $self->render(text => 'ハローワールド!');
};

app->start;

以下のコマンドで作成したアプリを起動します:
# morbo webapp.pl
Server available at http://127.0.0.1:3000

3000 番ポートで HTTP サーバーが起動している、というメッセージが表示されます。ウェブブラウザでこのサーバーの 3000 番ポートにアクセスして「ハローワールド!」が表示されることを確認します:

2016080502


動作も確認できました。


IBM Bluemix のイベント駆動型ランタイムである OpenWhisk 環境をコマンドラインから利用する際に必要な wsk をラズベリーパイに導入してみました。なお最初に SSL でログインするか、ターミナルを開くなどして、ラズベリーパイのコマンドライン操作ができる状態にしておく必要があります。


まずは Python のパッケージ管理ツールである pip を導入します:
$ sudo curl -kL https://bootstrap.pypa.io/get-pip.py | python

そして pip を使って wsk コマンドを導入します:
$ sudo pip install --upgrade https://new-console.ng.bluemix.net/openwhisk/cli/download

wsk コマンドの設定を行います。ここで実行するコマンドは OpenWhisk 画面の②で表示されているコマンドをコピー&ペーストする形で実行してください:

2016080401

$ wsk property set --apihost openwhisk.ng.bluemix.net --auth ********* --namespace "dotnsf@jp.ibm.com_dev"

導入した wsk コマンドが正しく動くことを確認します。以下のコマンドを入力して、青字のような結果が返ってくることを確認してください:
$ wsk action invoke /whisk.system/samples/echo -p message hello --blocking --result
{
    "message": "hello"
}

導入できました!これでまたラズパイ環境が捗ります。

nslookup コマンドは DNS の名前解決に使ったり、逆引きしてホスト名を調べたり、エリアスを調べたりする時に便利なコマンドです:
$ nslookup manholemap.juge.me
Server:         192.168.0.1
Address:        192.168.0.1#53

Non-authoritative answer:
manholemap.juge.me      canonical name = www.dot123.net.
Name:   www.dot123.net
Address: 27.84.196.37

↑このような感じで、普通に実行すると IPv4 での IP アドレスやエリアスといった情報を調べることができます。

では IPv6 での情報を調べるにはどうすればいいでしょうか? 実はこれも nslookup コマンドで調べることができます。

IPv6 での情報を調べるには、起動後に nslookup のオプションで type=AAAA を設定する必要があります:
$ nslookup
> set type=AAAA
> 


その後にホスト名を指定して検索すると、IPv6 での IP アドレス等の情報が(存在していれば、ですが)取得できます(青字はコメント):
$ nslookup
> set type=AAAA

> manholemap.juge.me
Server:         192.168.0.1
Address:        192.168.0.1#53

Non-authoritative answer:
manholemap.juge.me      canonical name = www.dot123.net.(IPv6 ではアドレスは見つからなかった)
  :
  :

> www.ocn.ne.jp
Server:         192.168.0.1
Address:        192.168.0.1#53

Non-authoritative answer:
www.ocn.ne.jp   has AAAA address 2001:c80:a105:4902::1:1(IPv6 での IP アドレス)
  :
  :

↑の例では "manholemap.juge.me" の IP アドレスを IPv6 で調べると見つかりませんでした。 一方、"www.ocn.ne.jp" の IP アドレスは IPv6 でも見つかりました。

さすが OCN 、、、 うちの安いプロバイダのとは違う(苦笑)。

 

IBM では大学生の皆さんを対象に、メインフレームを使ったプログラミングコンテストを開催中です:
IBM メインフレームコンテスト 2016

2016073101


このコンテストは「メインフレーム」や「汎用機」と呼ばれている IBM zSystems の最新版である z13 環境にリモートログインしてプログラミングを行う、という内容のコンテストです。コンテストといっても最初は与えられた課題をクリアしながらメインフレームの使い方を学び、最終的にはメインフレーム用のアプリケーションを開発して世界中の大学生とその出来を競う、というものです。ちなみにリモートログインする先のシステムはメインフレームのネイティブOSである z/OS に加え、メインフレーム版の Linux(zLinux)も含まれています。旧来型から最新環境までメインフレームを学ぶ面白い機会であると思っています。


で、これだけだとただのコンテスト宣伝になってしまうので、1つ自分なりに挑戦してみました。同コンテストに参加する上で、参加者の個人 PC は Windows/Mac OS/Ubuntu のいずれかであることを前提として解説されています:
2016073102


現実的にほとんどの学生参加者の皆さんが所有している PC はこのいずれかの環境であると思いますが、僕は人気の教育向けシングルボードコンピュータで、比較的最近は IoT デバイスとしても注目されているラズペリーパイ(以下「ラズパイ」)で挑戦してみました。結論から言うと「ラズパイでもできそうです(少なくとも課題のパート1はできます)!」。

準備段階として、z/OS システムにログインして操作するための 3270 エミュレータアプリケーションの導入が必要です:
2016073100
 ↑オッサン感涙のこんなアプリ


ラズベリーパイ向けの 3270 エミュレータの導入はこちらのページの「IBM 3270 環境」を準備している箇所の説明を参考に導入してください:
PiTop で日本語デスクトップ環境構築


ここで紹介している方法では X11 版(x3270)ではなくコマンドライン版(c3270)の導入を紹介しているので、X Window 環境からだけでなくターミナル環境からでも利用できる方法です:
pi_zos_zlinux
 ↑ラズパイのデスクトップ上で z/OS と zLinux に同時にログインしている様子


ただし、この方法で z/OS 環境を用意した場合には2つ注意点があります。1点目は起動方法です。ウィンドウのメニューから実行するのではなく、ターミナルを開いてコマンドラインから以下のように指定して z/OS に接続する必要があります(IPアドレスとポート番号に関しては参加者向けのガイドを参照してください):
$ c3270 (接続先IPアドレス):(接続先ポート番号)

もう1点。IBM からのガイドでは上記3つの GUI 環境から利用することを想定していますが、このラズベリーパイからコマンドライン版 3270 アプリを使う場合はウィンドウ環境を前提としていないため、一部のキーバインドが正しく動きません。例えば z/OS の画面において「1つ前に戻る」という場合は F3 キーを押すようガイドされていますが、c3270 では F3 が正しくバインドされていないので期待通りの結果になりません:
2016073103


c3270 で1つ前の画面に戻るには、F3 ではなく "Exit" と明示的にコマンド入力する必要があります:
2016073104


この辺りはちょっと不便ではありますが、操作そのものには影響はなさそうでした。なお zLinux 環境に関しては普通の Linux と同じ(実体は RedHat Linux Enterprise 7)なので、普段から Linux を使っている方であれば違和感なく使えると思っています。


 

このページのトップヘ