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

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

2017年6月の Raspbian のアップデートに合わせて PIXEL for PC(PC / Mac 用の Raspbian、わかりやすく言うと「パソコン版のラズベリーパイ」)も新しくなりました。以前のものは専用の Live CD だけが提供されていたのですが、現在のバージョンではハードディスク(仮想ディスク)へのインストールができるようになりました。「デスクトップ Linux 環境推進派」として見逃せないこの環境を早速ためしてみました:
2017073001


まず、今回導入したマシンは以下のようなスペックの仮想マシンです。おそらく実機でも問題ない、はず:
 ハイパーバイザー: KVM on CentOS 6
 仮想CPU: 1
 仮想メモリ: 1GB
 仮想ディスク: 10GB

まず最新の PIXEL for PC をダウンロードします。僕が今回使ったのはこの 2017/06/22 版の iso イメージです(2GB ほどあります):
http://downloads.raspberrypi.org/rpd_x86/images/rpd_x86-2017-06-23/2017-06-22-rpd-x86-jessie.iso


このイメージを使って仮想マシンを作成して起動します。実機の場合は iso を DVD に焼いて、その DVD をドライブに入れて起動することだと読み替えてください。なお(後でわかることですが)PIXEL for PC は Debian 8 ベースなので、仮想マシン作成時の OS の種類とバージョンは Debian 8 に相当するものを指定しています:
2017073002


なお作成時のオプションとして、(今回は)アーキテクチャに 64bit 版を選択しました。このあたりは実際に導入する環境に合わせてください:
2017073003


そんなこんなで ISO から起動します。最初に表示されるブートメニューでは "Graphical install" を選択しました:
2017073004


GUI インストーラーが起動します(この右上に "Debian 8" って表示されてますね)。最初にキーボードの種類を選択します。ここでは日本簿キーボードである "Japanese" を選択しました。選択後、 "Continue" で次の画面へ:
2017073001


ここで ISO をイメージを探して、そこから色々ロードして、・・・と少し待ちます:
2017073002


ここからが本格的なインストールオプションの指定になります。まずはインストール先ディスクとボリュームを指定します。僕はデフォルトの "use entire disk" を選択しましたが、LVM(論理ボリュームマネージャー)や暗号化 LVM を使う場合は適宜指定します。終わったら "Continue" :
2017073003


次にインストール先ディスクの選択を行います。この例ではディスクは1台しかないので、その1台のディスクを選択して "Continue" :
2017073004


選択したディスクのパーティショニングを指定します。ここでは(ディスクが大きくもないので)デフォルトの "All files in one partition"(全ファイルを1つのパーティションにコピー)を選択しています。そして "Continue":
2017073005


スワップ領域と合わせたパーティショニングの情報が表示されます。この内容で問題がなければ "Finish partitioning and write changes to disk" を選択して "Continue":
2017073006


ディスクに変更の書込みを行う直前の確認画面です。変更を行う場合は "Yes" を選択して "Continue":
2017073007


この後はパーティションのフォーマットが行われ・・・:
2017073008


インストール(ファイルコピー)が開始されます。環境にもよりますが、しばらく(数十分程度)待ちます:
2017073009


このような(GRUB がなんたら・・)画面になればファイルコピー完了はもうすぐです:
2017073001


ファイルコピーが済んだら最後に GRUB のインストールを行います。この画面では "Yes" を選択して "Continue" :
2017073002


GRUB のインストール先ディスクを指定します。今回は1つしかないので、その1つを選択して "Continue":
2017073003


最後のインストール作業が行われ・・・:
2017073004


この画面になったら再起動前にドライブに挿入している DVD(iso)を取り外します。iso の場合は仮想ドライブから iso ファイルを切断します。そして最後の "Continue" :
2017073005


最後に後処理が行われ、自動的に再起動がかかります:
2017073006


PIXEL の再起動がかかった直後はこんな画面になります:
2017073001


その後、おなじみのラズベリーアイコンが表示され・・・:
2017073002


PIXEL のデスクトップ画面が起動します! あのラズベリーパイではなく、(仮想)PC 上で Raspbian OS が起動しました。もちろん Raspbian OS 同様に利用できます:
2017073003


PIXEL でも標準で Scatch などは導入済みですぐに使い始めることができます。一方で Node-RED などは別途導入が必要なので、全く同じ構成というわけではなさそうです:
2017073004


もともと Debian っぽく使えていた Raspbian ですが、マシンの基本スペックが高いぶんだけ PIXEL の方が快適に感じるかもしれません。日本語化も含めたインストール作業後の諸設定はまた別途。


メインフレーム大好きなオッサンの皆様、お疲れ様です&いつもお世話になっております。


メインフレームといえば 3270 エミュレータです。知らない人のために言っておくと「さんにーななまるえみゅれーた」と読みます。メインフレームと呼ばれる大型ホストコンピュータとのコミュニケーションに使われる表示端末 "IBM 3270" と、そのソフトウェアエミュレーターを指して使われます。

この 3270 エミュレータは、IBM が提供する(上記リンク先の)PCOMM(「ぴーこむ」以下省略)を始め、多くのソフトウェアが提供されました。そのいくつかはいわゆるオープンソースソフトウェアで、その代表的なものの1つが "x3270" だと思っています:
http://x3270.bgp.nu/

2017072701


x3270 はもともと Unix/Linux 向けの X Windows System 上で動作する 3270 エミュレータとして開発され、のちに CUI のターミナルや Windows/Mac OS でも動作するよう移植されました。現在でもソースコードやバイナリが提供されています。

この x3270(の CUI 向けアプリ)をラズパイのターミナル上で動くように導入するのが今回の目的です。さすがにラズパイ向けのバイナリは提供されていないので、ソースコードをダウンロードしてビルドします。といっても基本的にはターミナルを開いて以下の通りに実行するだけです:
$ cd /tmp
$ mkdir 3270
$ cd 3270
$ wget http://downloads.sourceforge.net/project/x3270/x3270/3.3.14ga11/suite3270-3.3.14ga11-src.tgz
$ tar xzvf suite3270-3.3.14ga11-src.tgz
$ cd c3270-3.3
$ ./configure && make
$ sudo make install

これで c3270 というコマンドが使えるようになったはずです:
$ c3270
c3270 v3.3.14ga11 Thu Jul 27 05:59:44 UTC 2017 pi

Copyright 1989-2013 by Paul Mattes, GTRC and others.
Type 'show copyright' for full copyright information.
Type 'help' for help information.

c3270>

"help" と入力すると全体ヘルプが、"help XXXX" で XXXX という項目のヘルプが表示されます。c3270 の終了(ターミナルに戻る)は "quit" です:
c3270> help
  help all           all commands
  help 3270          3270 commands
  help interactive   interactive (command-prompt) commands
  help      help for one 
  help options       command-line options
  help scripting     scripting commands
  help file-transfer file transfer options

c3270> quit
$

実際に接続先となるメインフレーム(ホストコンピュータ)のアカウントを所有している場合はサーバー名(IPアドレス)とポート番号(23)を指定して起動&接続します(ポート番号が 23 の場合は省略可能です):
$ c3270 192.XXX.XXX.XXX:23

接続に成功すると、以下のような z/OS 画面が表示されます:
2017072801



さて、そもそも「なんで今さら 3270 ??」と思う人もいると思いますが、実はいま学生を対象に IBM 主催のメインフレームコンテスト、その名も
 MASTER THE MAINFRAME CONTEST 2017
 IBM メインフレームコンテスト 2017

が開催されています:
https://www.ibm.com/it-infrastructure/jp-ja/masterthemainframe/

2017072802


このコンテストの参加者へはクラウド上の IBM メインフレーム(z13)環境にアクセスするアカウントが提供され、Windows や Mac、Linux といった各自の環境からメインフレームに接続して、与えられた課題をクリアしていく、というものです。(ある意味)今では貴重になったメインフレームの世界を体験しつつ、仮想化の基礎となったメインフレーム技術スキルを身に付けていくことを目的としています。

このコンテストに参加する上でのプログラミングスキルは特に必要ではありませんが、接続環境は自分で用意する必要があります。「Windows、Mac、Linux といった環境では物足りない!」というアピールをしたい変態ギークな皆様は是非ここで紹介したラズパイ環境からのアクセスに挑戦してみてください。

なお、ラズパイから(というよりも、ここで紹介した c3270 を使って)メインフレームホストにアクセスする場合の注意点があります。IBM がコンテスト用に用意したガイドでは Windows, Mac, Linux という3種類のいずれかの GUI (x3270)環境から利用することを前提としたガイドが提供されています。一方で、ここで紹介したような CUI(c3270)環境から利用する場合、一部のキーバインドが正しく動作しないことが分かっています。例えば z/OS の画面内で「1つ前に戻る」には F3 キーを押すようガイドされているのですが、c3270 では F3 が正しくバインドされていないため、期待通りの結果にはなりません。

c3270 で1つ前の画面に戻るには F3 ではなく、コマンドラインに "Exit" と入力します。これで F3 と同じコマンドが実行され、1つ前の画面に戻ることができます:
2017072804



たまにはこういうブログネタも。

Node.js でのスクレイピングに挑戦したことがなかったのでやってみました。

一般的にスクレイピングでは http でコンテンツ文字列を取得して、正規表現などを用いて取得したコンテンツ文字列から指定のパターンに合致する箇所のテキストを取得します。今回はその部分を手でガリガリ、、ではなく、この cheerio-httpcli モジュールを使ってスクレイピングに挑戦しました:
https://www.npmjs.com/package/cheerio-httpcli

2017072600


まずはこの cheerio-httpcli モジュールを npm でインストールします:
$ npm install cheerio-httpcli

Node.js のコード内で cheerio-httpcli モジュールを利用する場合は以下のような記述を行います:
var client = require( 'cheerio-httpcli' );
 :

var url = 'https://www.google.com/finance/converter?a=1&from=EUR&to=JPY';
client.fetch( url, {}, function( err, $, res ){
  $('.bld').each( function(){
    text = $(this).text;
       :
  });
});


実はこれだけでテキストのフェッチとスクレイピングの両方が実現できてしまっています。URL を指定してその HTML テキストをフェッチします。その結果は $ に入るので、フェッチの結果は jQuery の DOM のように扱うことができます。上例では取得した HTML テキスト内において bld クラスを適用した要素内のテキスト(<xxx class="bld">XXXXX</xxx> となっている箇所の XXXXX 部分)を取得して、変数 text に代入しています。

上記のサンプルで紹介している URL: https://www.google.com/finance/converter?a=1&from=EUR&to=JPY はグーグルの通貨変換ページです(このパラメータの場合、ユーロ(EUR)から日本円(JPY)への変換レートを取得します)。この URL にアクセスすると、以下のような HTML が返って来ます:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  :
  :
</div>
 
<div id=currency_converter_result>1 EUR = <span class=bld>130.0360 JPY</span>
<input type=submit value="Convert">
</div>
<input type=hidden name=meta value=ei=E1N4WYisKN6O0QS8v4OoBA>
</form>
</body>
</div>
</html>

このようにレート変換した結果は上記赤字部分になるので、ここを取得できればよいことになります。したがって上述のように bld クラスを指定した箇所のテキスト値をスクレイピングすれば(上記の場合であれば "130.0360 JPY" という文字列が)変数 text に代入できる、ということになります。

jQuery スタイルで使えるのがとっても便利!


このページのトップヘ