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

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

2016/07

ラズベリーパイベースのラップトップ PC である PiTop を、デスクトップ環境として整備しています。さすがにメイン機として使うのは・・・ ですが、サブ機として支障なく使える程度にできないだろうか、と思っています。

ただ改めてラズパイを使ってみると、色々足りない部分も見えてきます。それら足りない部分を導入する手順を調べてみました。ちなみに PiTop で使う OS は Raspbian Jessie とします。


日本語表示

導入手順によってはインストール時にある程度設定できるので、初めから日本語表示ができる環境を手にしている人もいるかもしれませんが念のため。 以下の手順で日本語が正しく表示できるように(□みたいな文字にならないように)して、更に日本語フォントを導入します:
$ sudo raspi-config

"Innternnationalisation Options" 選択
"Change Locale" 選択
"ja_JP.UTF-8" 選択し、デフォルト言語に設定し raspi-config を終了
$ sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big
2016072501



日本語入力

日本語が正しく表示できても、入力となると別の設定が必要です。今回は IBUS を使って日本語を入力できるよう、必要なアプリを導入して日本語入力設定を行います:
$ sudo apt-get install ibus-anthy

メニューから「設定」-「IBUS の設定」を選択
「インプットメソッド」タブで「日本語 - Anthy」を設定

2016072502

これで画面右上の IBUS アイコンをクリックすることで入力言語を切り替えることができるようになります。


Eclipse

自分がこれがないと Java アプリが作れません。というほど依存している統合開発環境である Eclipse のラズパイ版を導入します。ラズパイ用の Pleiades (ちなみに Eclipse 3.8 ベース)が用意されていたとは・・・
$ sudo apt-get install pleiades

20160728



スクリーンショット

ラズパイでスクリーンショットを撮るにはいくつかの方法があります。自分はこれまでは直接スクリーンショット撮ることはなく、VNC 経由で別PCから画面ショットを撮っていました。が、今回は折角デスクトップ環境を手に入れることができたので、単体で取得できる scrot を使うことにします:
$ sudo apt-get install scrot


その他

個人的によく使う screenvim を入れておきます:
$ sudo apt-get install screen vim

screen と同じくらい使う tmux も Raspbian 上で使うことができそうです:
$ sudo apt-get install libevent-dev libncurses5-dev
$ cd /tmp
$ wget https://github.com/tmux/tmux/archive/2.2.tar.gz
$ tar xvfz 2.2.tar.gz
$ cd tmux-2.2
$ ./configure && make
$ sudo make install

とあるメインフレームコンテストに参加するために IBM 3270 環境が必要になるのでコマンドライン版を導入します:
$ cd /tmp
$ mkdir 3270
$ cd 3270
$ wget http://downloads.sourceforge.net/project/x3270/x3270/3.3.14ga11/suite3270-3.3.14ga11-src.tgz
$ tar xavf suite3270-3.3.14ga11-src.tgz
$ cd c3270-3.3
$ ./configure && make
$ sudo make install

自分はいい歳したオッサンなので、オッサンが喜ぶような X11 アプリをまとめて導入しておきます:
$ sudo apt-get install x11-apps

これで懐かしい "xeyes" などが使えるようになります:
2016073105



その他プログラミング言語やミドルウェアについては適当に。

先日、Cloudant のデータベースのバックアップ(というかダンプというか、スナップショットというか、、)を撮る方法をこちらで紹介しました:
Cloudant のデータベースダンプとリストア

この中では /_all_docs?include_docs=true に GET アクセスすることで指定データベース内の全ドキュメントを中身ごと取り出す方法でダンプを取得する方法を紹介しました。

併せて、取得したダンプファイルを /_bulk_docs に POST してリストアする、という方法も紹介しました。この方法で確かにデータそのものは指定データベースに入るのですが、JSON の構造が少し変わってしまいます。「リストア」という観点では不十分でした。

というわけで、今回は JSON の構造を変えずにリストアする方法を紹介します。といってもコマンドでどうにかするのではなく、取得したダンプファイルを読み込んで、少しフォーマットを変更した上で同じ /_bulk_docs コマンドでリストアする、という方法です。フォーマットを変更する箇所はプログラミングでツール化しました(赤字はコメント):
public class DbRestore {
  static String c_baseurl = "https://username.cloudant.com"; //. Cloudant サーバー
  static String c_username = "username"; //. ユーザー名
  static String c_password = "password"; //. パスワード
  static String c_db = "newdb"; //. リストア先データベース名(作成しておく必要があります)
  static String c_dumpfile = "olddb.dump"; //. 読み込むダンプファイル名

  public static void main(String[] args) {
    try{
      //. ダンプファイルを読み込む
      String lines = "";
      BufferedReader br = new BufferedReader( new FileReader( new File( c_dumpfile ) ) );
      String line = br.readLine();
      while( line != null ){
        lines += ( line + "\n" );
        line = br.readLine();
      }
      br.close();

      //. ダンプファイル内のドキュメントデータを1つずつ読み込み、リストア用にフォーマットを変更
      String docs2 = "{\"docs\":[\n";
      JSONParser parser = new JSONParser();
      JSONObject obj = ( JSONObject )parser.parse( lines );
      JSONArray docs = ( JSONArray )obj.get( "docs" );
      for( int i = 0; i < docs.size(); i ++ ){
        JSONObject doc0 = ( JSONObject )docs.get( i );
        JSONObject doc = ( JSONObject )doc0.get( "doc" );
        JSONObject d = ( JSONObject )doc.get( "d" );
        if( i > 0 ){ docs2 += ","; }
        docs2 += "{\"d\":" + d.toJSONString() + "}\n";
      }
      docs2 += "]}";

      //. リストア用に変更したダンプデータを /_bulk_docs にポスト
      String url = c_baseurl + "/" + c_db + "/_bulk_docs";
      HttpClient client = new HttpClient();
      byte[] b64data = Base64.encodeBase64( ( c_username + ":" + c_password ).getBytes() );
      PostMethod post = new PostMethod( url );
      post.setRequestHeader( "Authorization", "Basic " + new String( b64data ) );
      post.setRequestHeader( "Content-Type", "application/json" );
      post.setRequestBody( docs2 );
      int sc = client.executeMethod( post );
      String result = post.getResponseBodyAsString();

      //. 結果確認
      System.out.println( "Status = " + sc );
      System.out.println( "Result = " + result );
    }catch( Exception e ){
      e.printStackTrace();
    }
  }
}


このコードは JSON-SimpleApache HTTP Client ライブラリを使って /_bulk_docs にダンプデータをポストする処理を Java で実装しています。ダンプデータをそのままポストすると情報は再現できるのですが、データフォーマットが変わってしまいます。その問題を回避すべく、ポスト前に必要なフォーマット変換を行っていて、ダンプ前のデータフォーマットが変わらないように(_id 値や _rev 値は変わります)ポストしています。

このコードの c_dumpfile に前回の方法でダンプしたファイル名を指定し、Java で動かせばダンプファイルの中身をリストアできるはずです。


Cloudant のような NoSQL データベースの場合、バックアップは一般的には複製機能によって実現するケースが多いのかもしれません。要は生きたデータベースを2系統以上用意して、生きたデータベースにバックアップする、という考え方です。これだとメインDBに障害があってもすぐに切り替えて稼働ができます。

ただ、例えばデータベースの引越しが目的の場合や、あるタイミングでのスナップショットを取るような場合などでは、一旦データベースのダンプを取得して、引越先でリストアしたい、というケースもあります。このようなケースでは生きたデータベースに複製することが必ずしも正しい回答にはなりません。


そういった場合のダンプは以下のコマンドで取得することができます:
$ curl -X GET https://(username):(password)@(hostname)/(dbname)/_all_docs?include_docs=true > file.dump

上記例では file.dump というファイル名を指定してダンプ結果を取得するように指示しています。ダンプというか、データベースの _all_docs(全ドキュメント) に include_docs_true(中身ごと取得)オプションを付けて GET する、というよく考えたらごく普通のコマンドをそのまま実行しています。

取得したダンプファイル(file.dump)を使ってリストアする場合はちょっと準備が必要です。まず上記コマンドで取得したダンプファイルをテキストエディタで開き、1行目の "rows" を "docs" に書き換えて保存します:
{"total_rows":100,"offset":0,"rows":[ 
  :
  :

  ↓ "rows" を "docs" に書き換えて保存
{"total_rows":100,"offset":0,"docs":[ : :

編集後に次のコマンドを実行します:
$ curl -d @file.dump -H "Content-Type: application/json" -X POST https://(username):(password)@(hostname)/(dbname)/_bulk_docs

こちらはデータベースに対して、中身を JSON ファイルで指定して POST しているだけです。

これで手動でバックアップができるので、後はこれを cron などで自動化したり、取得したダンプファイルを外部のオブジェクトストレージとかに転送する仕組みまで作ってしまえば自動バックアップが実現できそうです。

(2016/Jul/30 追記)
上記方法でもリストアできますが、元のデータベース内と比べて JSON ドキュメントのフォーマットが変わってしまいます。フォーマットを変えずにリストアする場合の方法は別のエントリで紹介しています:
Cloudant のバックアップデータをリストアする





 

先日、日本向け PiTop を購入して取り寄せた、というところまでを紹介しました:
DSC_0032


そして一応組み立てに成功して、OS が起動するところまでは確認できる状態になりました:
DSC_0043


それからかる~く使ってみた範囲での、いわゆる第一印象をレポートしたいと思います。

まず PiTop というハードウェアの印象。一言で言えば「デカい&分厚い」!以下でも紹介しますが、キーボードの「横」にタッチパッドが装着されているわけで、横幅からして通常レベルではないことが想像できると思います。

そのキーボードはこんな感じ。見た目だけでなく打鍵感も、良くも悪くも「おもちゃ」的な感じ、ちなみに US 配列です:
DSC_0045


この右側にタッチパッドが:
DSC_0046


厚さはこんな感じ、って伝わるでしょうか? 画像に見えているのは電源プラグです:
DSC_0047


反対側からだとこんな感じ。ラズパイ本体の USB インターフェースがほぼむき出しになっています。なお4つの USB インターフェースのうち、1つは PiTop キーボードが使うので3つ余っている状態です。下の写真では更に1つ外付けマウス(黒いケーブル)を接続しています:
DSC_0048


ちなみにキーボード&タッチパネルの使いづらさは最強レベルです(苦笑)。キーボードはまだいいのですが、タッチパネルはちょっと我慢ならないレベルでした。 (^^; そんなわけで外付けマウスを使っています。

この PiTop 本体の重量は約 1.5kg。ノートパソコンとしてもかなり重い部類だと思います。これをスタバに持って行ってドヤるのは、なかなか勇気が必要そう(笑)。

ただ、このサイズの点に限っては「想定内」ではありました。ラズパイのキットなのでラズパイを内蔵するための物理空間が必要になることはわかっていたし、USB インターフェースが2段になっているラズパイを内蔵するにはそれなりの厚みが必要になるだろうなあ、と。どちらかというとサイズよりも、タッチパネルの使いにくさが想像以上でしたw


次にハードウェアではなくソフトウェア的な視点で調べてみました。PiTop OS という特殊なカスタマイズが施された OS を使っているとはいえ、元はラズパイなわけで、あまり変わらないだろうなあ、と思いつつ使ってみました。

いきなりリモートログイン(笑)。SSH が有効になっているので、あらかじめ IP アドレスを調べておけば SSH クライアントからログインできます。なお ID は pi ですが、パスワードは Raspbian OS デフォルトのものとは異なっていました(マニュアルに記載されています)。uname で調べてもちょっと違う OS が使われていることがわかります:
2016072400


ハードウェアに同梱しているマイクロ SD カードは 8GB。ここに PiTop OS が導入された状態で提供されていて、空きは約 2GB でした。

個人的な印象ですが、この PiTop OS にそれほどの大きなアドバンテージがあるとは思いません。別の SD カードに別の(素の Raspbian などの)OS を入れて使った方が使いやすいだろうなあ、と感じています。

ただし一点だけ、PiTop らしい機能がこの PiTop OS に導入されていました。ラズパイは通電状態でないと使えない(電源ケーブルを抜くと切れ、挿すとスイッチオン)のですが、PiTop はノート PC キットだけのことはあり、充電した状態からであればケーブルが接続されていなくても使えます。この充電の残り残量などを表示する簡易アプリが PiTop には含まれています。

したがって今後、PiTop を PiTop OS 以外で運用する場合、充電池を使って動かすことも可能ですが、電池の残量を確認する便利な方法がない、ということを理解しておく必要があります。

もちろん PiTop OS 以外のものに入れ替えて利用することもできます。こちらはマイクロ SD カードごとラズパイ標準の Raspbian Jessie に入れ替えて使ってみた様子です。個人的にはこちらの方に慣れているので、今後はこっちがメインになりそうな感じ・・・:
DSC_0049


改めてラップトップのラズパイを使ってみると、今までは使ったことがなかった機能が色々気になるようになってきました。「そういえばデスクトップのスクリーンショットってどう取るんだろ?」とか「その画像を加工するには GIMP 以外にあるのかな?」とか。今まではラズパイのスクリーンショットを取る必要性がなかったのですが、ラップトップだと使ったり、加工したくなったりなりますね。

次回はこれ持ってスタバでドヤってきますw
 


 

個人的にも何度かお世話になっているクラウドファンディングの IndieGoGo で生まれたプロジェクト PiTop の日本向け本体を入手したので、何度かにわけてレポートしよっかな、と思っています。

まず PiTop とはナニモノか。一言でいえば「ラズベリーパイベースの自作ノート(ラップトップ)PCキット」です。本来ラズベリーパイ(以下、ラズパイ)は名刺サイズの小型パソコンでした。基板がむき出しなので専用のケースに入れて使うことが多いです。これにキーボードやらマウスやらディスプレイやら(必要であれば)無線LANやら、使いたいものを外付けで接続してパソコンとして使う、というものでした。 このラズベリーパイをベースに、キーボード、タッチパネル、ディスプレイをキットにしてノートPC化してしまおう、というのが PiTop です。クラウドファンディングでのプロジェクトは2014年10月の発表早々に出資目標額を達成し、2015年5月予定だった出荷は遅れに遅れた末、同11月になって出資者の元に渡った、というものです。

実を言うと、個人的には当時からこの PiTop プロジェクトは知っていて、その時点で出資に参加していれば $267 で1台入手することができました(リリース後の実売価格は約 $300)。このタイミングで出資していれば 15% 程度安く入手できたわけです。が、実はあまり興味がわきませんでした。今ほど派手にラズパイを使っておらず、ラズパイそのものへの興味が薄かった上に「小さくて持ち運びやすいからこそのラズパイ」という考えが強かったせいかもしれません。 が、ラズパイを使っているうちに少しずつ自分の中での PiTop への評価が変わってきて、「買っておけばよかったかなあ・・・」という考えも生まれるようになっていました。

今回僕がアマゾンで(送料含まず 39,000 円で)入手したのは「PiTop 日本仕様」と銘打たれたものです。このクラウドファンディングでリリースされた当初のものとはちと違っています。何が違って何が変わってないのか、そのあたりも気付く範囲で紹介できればと思っています。
pi-top 日本仕様 (Raspberry Pi 3 Model B つき, 緑 Green)


まずは届いた箱はこんな感じ。都知事選に立候補している某さんのイメージカラーでもあるグリーンモデルです(確かオリジナルは黒も選択できたはず):
DSC_0032


箱を裏返しました。角のところがちょっと潰れていますが、これは購入前から記載されていてわかっていたことでした。パッケージには "DESIGNED IN LONDON. ASSENBLED BY YOU" と書かれています。「設計はロンドン、組み立てはあなた」ってことです。そう、これは完成品ではなく、あくまでキット(部品集)なので、組み立てて作るのは自分(つまり自作ノートPC)なのです。 そしてその下には後から貼り付けたことが一目瞭然の「pi-top 日本仕様 グリーン」というシールが貼られています。このあたりは日本向け仕様が垣間見られます:
DSC_0033


箱をパカッと。ラップトップが鎮座しているように見えますが・・・
DSC_0034


実はこれ上半分のディスプレイ部分だけの部品です。やはり組み立てないと使えないんですね。。:
DSC_0035


緩衝材をずらすと下に他の部品や説明書が入ってます。なお、この緩衝材にも "LOOK HERE" とグリーンのシールが貼られている箇所があり、ここも部品の一部になっているようです:
DSC_0036


日本向けの日本語説明書:
DSC_0037


その下には電源ケーブル、基板パーツ、pi-top OS 入りの SD カード、そしてラズパイの本体や工具も含まれています。ちなみにオリジナル版の PiTop では別途ラズパイ2を入手して使う前提のものでしたが、僕が入手したこのモデルにはラズパイ3が同梱されていました。ということは無線LANはそのまま使えるので入手の必要はない、ということになります:
DSC_0038


その下には本体の下半分が。これが結構重い・・・:
DSC_0039


これで終わりかなあ、と思っていると・・・:
DSC_0040


最後にキーボードが出てきました。実はこのキーボードが日本仕様になっているかどうかを楽しみにしていたのですが、実際は US 配列のままです(SHIFT+2 で @ のタイプ):
DSC_0041


中身はざっとこんな感じ。特にハンダ付けなどの要素はなさそうで、組み立てのハードルはそんなに高くなさそうでした。

で、オリジナルの PiTop と比べての差はこんな感じでしょうか:
 1. ラズパイ3同梱
 2. 日本語解説書
 3. 日本用ACアダプタ

これで1ドル105円とすると価格差は 7500 円。まあ入手方法が限られていることも加えても、そんなに悪い買い物ではなかったかな。。。


では初の自作ノートPCにチャレンジします! その様子はまたいずれ・・・


このページのトップヘ