Piwik,Matomo になる

Piwik is now Matomo – Announcement – Analytics Platform – Matomo

 このサイトでも利用している自由ソフトウェアのアクセス解析ソフトウェア「Piwik」が,「Matomo」という名称へと変更されました。「Matomo」とは,そう,「まとも」に由来しています。
 Matomo という名称は「あらゆる言語で発音しやすい。(簡単に)覚えられる短さ。簡潔。そしてなにより… Matomo は日本語で honesty を意味し,これは私たちの重要な価値基準のひとつである透明性に通じるものです」 1とのことで,Piwik という名前が一部の言語では発音が困難であることを受けた選定であるようです。
 ただ,最大の理由は別にあるようです。「なぜ名前を Piwik のままにしないのですか?」という質問に答える形で,以下のような記述があります。「いくつか理由があり,そのうちの一つは,Piwik とは違って Matomo ではその名前を他の企業とは共有しないことを保証するためです。私たちはまた,Matomo ブランドを保護し,オープンソースコミュニティの名前としてずっと保ちたいと考えます」 2
 ここで言及されているのは「Piwik PRO」のことかと思われます。「Piwik PRO」についてはプロジェクト公式サイトの FAQ で説明されています 3。これはポーランドのある企業であり,Piwik を開発しているチーム及び InnoCraft 社とは資本的にも人的にも一切関係がないばかりか,プロジェクトへのコントリビューションも無いとのことですが,プロジェクト創設者から許諾された「Piwik PRO」という商標を所有しており,これを自らのビジネスで使用しているとのことです 4。この Piwik PRO がプロジェクト公式のものであると誤認されることを防ぐためにリブランディングの必要があったものと思われます。おそらくですが,許諾された当時は Piwik も「Piwik PRO」もずっと小さく,何年かでここまで成長するものとは思っていなかったために,現在の状況では不合理が生じていたのでしょう。
 ともかく Piwik 改め Matomo は本当におすすめのアクセス解析ソフトウェアです。日本語化もほぼ完全であり,簡単に使うことができます。この機会に是非試してみてください。

Get Matomo – Analytics Platform – Matomo

Source Han フォント(源ノ角ゴシック・源ノ明朝)のすゝめ

なぜ Source Han フォントを使うべきか

利用に制限のない自由なライセンスのフォントなので,クロスプラットフォームで統一された表示を実現できる 1
・ Adobe と Google が自分たちのビジネスで使うために開発したフォントであり,トップクラスの商用フォントベンダである Adobe とイワタによって制作されているため高品質
・ CJK+欧文に対応しているので国際化にも最適

Source Han Sans/Source Han Serif と源ノ角ゴシック/源ノ明朝の違い

 同一のフォントの英名と和名です 2 3 4。Source Han Sans の日本語名が「源ノ角ゴシック」,Source Han Serif の日本語名が「源ノ明朝」です。なお,Source Han は Google が公開する Noto フォントにも取り入れられており,Noto フォントの CJK 部分も同じものになっています 5

Source Han フォントを導入するには

Step 1. ダウンロード

Source Han Sans
Source Han Serif

 さまざまな形式が用意されていますが,「Language-specific OTFs」の日本語向けのものを選ぶとよいでしょう 6
 Sans では SourceHanSansJ.zip を,Serif では SourceHanSerifJ_EL-M.zip および SourceHanSerifJ_SB-H.zip の両方をダウンロードします。これらを解凍すると,Sans と Serif それぞれで基本となる7ウェイト(太さ)のフォントファイルが準備できます。

Step 2. インストール
各 OS のフォントインストール機能を利用してください。
Windows の場合,コントロールパネルから「デスクトップの設定>フォント」を選択し,表示されたパネルにフォントファイルをドラッグ&ドロップします
macOS の場合,「Font Book」アプリケーションを利用します
Linux の場合,~/.fonts/(ユーザのみ)または/usr/share/fonts/opentype/(システム全体)にフォントファイルをコピーします。フォントビューアー gnome-font-viewer などのフォント管理アプリケーションを利用してインストールこともできます。ユーザのみに導入する場合,このスクリプトを使うことで一括ダウンロード&インストールすることもできます。

どのウェイトを使うべきか

 Source Han フォントは Adobe によって開発されているだけあり,タイポグラフィでの利用を念頭に7種類ものウェイトが用意されています。しかし,オフィススイートなどで“普通の”フォントとして使うにはどのウェイトを使えばよいのでしょうか。Medium, Normal, Regular と似たようなものが多く迷いますが,Regular が標準的なウェイトで,既存のフォントと並べても違和感のない表示になります 7。もっとも近年は細身のフォントが文書作成の用途でも使われるようになってきていますので,お好みで Light を使うのもよいかと思います。

Source Han フォント以外のお勧めフォント

VL ゴシック
 固定幅の「VL ゴシック」と可変幅の「VL Pゴシック」からなります。M+ フォントに欠けている文字をさざなみフォントで補ったうえで調整を加えたもので,Linux 界では長らく IPA ゴシックと並んで標準ゴシック体の地位を占めているフォントです。クリーンで読みやすいフォントであり,個人的には Source Han Sans より好みです。ぜひ Linux 以外の環境でも使ってみてほしいフォントです。

IPA Mona フォント
 IPA フォントを元にしてフォント幅を「MS ゴシック」「MS Pゴシック」「MS UIゴシック」「MS 明朝」「MS P明朝」に近づける調整が加えられた「IPA Mona ゴシック」「IPA Mona Pゴシック」「IPA Mona UIゴシック」「MS 明朝」「IPA Mona P明朝」からなります。Windows 以外の環境で Windows 環境に極力近い表示結果を得たい場合に役に立つフォントです。

Notes:

  1. Source Han Sans および Source Han Serif には SIL Open Font License 1.1 が適用されており,このライセンスは自由ソフトウェアライセンスです。
  2. 源ノ明朝(Adobe typekit ウェブサイト) 2017/10/10
  3. まるで武将? Adobeのフォント「源ノ明朝」名前の由来は – ITmedia NEWS 2017/10/10
  4. Adobe、「源ノ明朝」フォントをリリース ~「源ノ角ゴシック」と対になるセリフ書体 – 窓の杜 2017/10/10
  5. Is it the same with Noto Sans CJK Fonts? · Issue #122 · adobe-fonts/source-han-sans · GitHub
  6. なお,日本語に関する部分だけを切り抜いてサブセットにした「Region-specific Subset OTFs」というものも用意されており,どれを選べばよいかわからない場合の推奨とされていますが(ファイルサイズが小さいため),アプリケーションからは元々の Source Han フォントとは別物として認識されてしまいます。
  7. 欧文フォントでは regular の語が正体という意味で使われます。

Debian + Xfce の外観を改善する設定ファイル

 デスクトップ環境として Xfce を選択して Debian をインストールしたときの外観の初期設定は本当にうんざりするほど古くさく,しかも使いにくいです。
 いやいや,Xfce の実力はこんなもんじゃあないんですってば。安定第一なんでしょうけど,この初期設定で Xfce に初めて接した人が抱く第一印象が悪くなってしまうとしたら本当にもったいないことです。
 ということで,以下の2点を特徴とする,手っ取り早く導入できて見た目をそれなりに改善できる設定ファイルを公開してみます。

  • Debian Strech インストール直後の状態にて標準で入っているパッケージだけを使用し,パッケージ追加なしで導入できる
  • GUI から再変更できる部分だけの変更で,バイナリのアートワーク等も含まない

 Debian 9.1 “Stretch”(Xfce バージョン 4.12)のインストール直後の状態で導入できるようになっています。なお当然ながら,もし既にご自身で設定を変更されている場合は,必ず事前にバックアップを取ってください。
 ディレクトリ ~/.config/xfce4 (/home/ユーザ名/.config/xfce4) を削除し,この tar ball に含まれる「xfce4」以下を代わりにコピーした上で再起動してください。
Xfce 4.12(Debian 9.1)用設定ファイル
 

 初期状態。このデッドスペースは一体……


 上記設定ファイル導入後。パネルは透過させています。数十キロバイトの割にけっこう改善されていません? メニューもより多機能で洗練された Whisker Menu に変更してあります。
 テーマは「xfce4-flat」ですが「アドワイチャ(adwaita)」もお勧めです(特に LibreOffice のようにツールバーを複数持つアプリケーションの見た目がすっきりします)。
 外観以外にも一般的に有用と思われる設定変更をいくつかしてありますが,ひょっとしたら問題の原因となるかもしれません。特に,サスペンドの動作に問題がある場合は xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml を削除してご利用ください。

Debian でも LibreOffice のアイコンセットをかっこよくする――Sifr アイコンセットの導入

 Debian で LibreOffice を使うとき,「新規作成」や「開く」といったボタンを表示するのに,標準では「Tango」アイコンセットが使われます。
 Tango も良いものなのですが,ボタンがたくさん並ぶオフィススイートではどうしても取っ散らかって古くさい印象になってしまいます。
 ところで,LibreOffice 4.2 から「Sifr」という単色のアイコンセットが導入されています。Debian では Jessie でも Stretch でもレポジトリに登録されており非常に簡単に利用できるので,今回はこのアイコンセットを導入します。

# apt-get update
# apt-get install libreoffice-style-sifr

1) LibreOffice を開いて「ツール>オプション」を選択。
2) 「LibreOffice>表示」を開く。
3)「アイコンのサイズとスタイル」で「自動(Tango)」となっているのを「Sifr」に変更。

 まだ全てのアイコンが揃っていないようでメニュー内などで一部 Tango も混じりますが,これだけでも雰囲気はかなりモダンな感じになります。
Sifr 導入後のスクリーンショット

 LibreOffice で真のオープン標準規格 ODF を使おう!

Debian with Raspberry Pi Desktop を試してみる(日本語化等の手順紹介)

 青い空,白い雲。絶好の Liunx 日和ですね。
 そこで今日は“ Debian with Raspberry Pi Desktop ”(以下 Debian with RPD)を試してみました。

Raspberry Pi Desktop – Raspberry Pi

 Debian with RPD は昨年末に「PIXEL」として公開された Debian GNU/Linux ベースのディストリビューションで,その後「Debian with Raspberry Pi Desktop」という名前に変更されたようです。このディストリビューションはRaspberry Pi の標準 OS である Raspbian 同様 Raspberry Pi Foundation の主導で開発されているものであり,Raspbian に近い見た目とバンドルアプリを備えていることが特徴です。公開時,このブログでも簡単に紹介しました。

Raspberry Pi Foundation,PC 向け GNU/Linux ディストリビューションを公開 – 怠惰の形而上学

 以前紹介した際は Live DVD としてしか利用できませんでしたが,現在では通常のデスクトップディストリビューションとして利用できるようになっています。今のところ RPD は LXDE のテーマに近い状態ですので,機能や安定性は既に実用的な水準に達しています。


 GRUB2 は Debian テーマのままながら,起動時に Raspberry Pi Desktop オリジナルのスプラッシュスクリーンが表示されます。デスクトップが開いてしまえば見た目は完全に Raspbian ですね。なお,標準ではキーボードレイアウト選択以外のローカライズは何もありません。スクリーンショットはローカライズ後のものです(あくまでも Debian なので翻訳も揃っており,簡単にローカライズできます)。


 ソフトウェアも Raspbian と同じものがプリインストールされて,設定も素の Debian ではなく Raspbian と同様になっています。


 この特徴的なアイコン等,テーマとしては「PiX」という名前が付けられているようでした。

 以下,ローカライズ(日本語化等)の方法等について解説します。シェルスクリプトになっており,そのまま実行して動くはずですが,例外処理などはしていないので適宜修正してお使いください。

Raspi.sh(root として実行)

#/bin/sh

apt-get update
apt-get upgrade

# 1. 最低限あったほうがいいパッケージの導入
apt-get install compton tlp tlp-rdw
# apt-get install aptitude vim xscreensaver
echo @compton >> /etc/xdg/lxsession/LXDE-pi/autostart
systemctl enable tlp.service
systemctl enable tlp-sleep.service
systemctl disable systemd-rfkill.service
# compton はコンパクトなコンポジットマネージャで,グラフィックが極端に古くなければ(GMA 900 とか以降なら),これを起動時に開始することで CPU 負荷を軽減し体感スペックを上げることができます。
# 万が一トラブルが発生した場合は Ctrl+Alt+F1 でシェルからログインして自動起動を削除するか(/etc/xdg/lxsession/LXDE-pi/autostart を開いて"@compton"の記述を削除), compton をアンインストール(apt-get remove compton)してください。

# 2. IM 導入
# 軽快さ重視なら Anthy がオススメ。
#   apt-get install uim uim-anthy kasumi
apt-get install uim uim-mozc mozc-utils-gui

# 3. ロケール・タイムゾーン変更
# 手動で raspi-config でもできます。というかそっちが正攻法?
sed -i -e 's/# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/g' /etc/locale.gen
update-locale LANG=ja_JP.UTF-8
locale
timedatectl set-timezone Asia/Tokyo
timedatectl

# あとはユーザに戻って sourcehan-raspi.sh を実行すればローカライズは完成。

# 以下はお好みでどうぞ
# フォント導入
# apt-get install fonts-vlgothic fonts-ipafont-gothic fonts-ipafont-mincho
# 他のディストリビューションに通常標準搭載されている日本語フォントを入れておきたい場合は導入しておきましょう。なお,Droid と Unifont が標準で入っているため,特に入れなくても(表示品質はともかく)日本語表示に問題はありません。

# 標準アプリケーションの削除(Raspberry Pi 関係なく純然たる軽量 OS として利用する場合)
#   apt-get purge bluej geany greenfoot idle idle3 scratch scratch2 sense-emu-tools sonic-pi python3-thonny  claws-mail chromium
#   apt-get autoremove
#   mv /usr/share/raspi-ui-overrides/applications/raspi_resources.desktop /usr/share/raspi-ui-overrides/applications/raspi_resources.desktop.bck
#   mv /usr/share/raspi-ui-overrides/applications/magpi.desktop /usr/share/raspi-ui-overrides/applications/magpi.desktop.bck
#   mv /usr/share/raspi-ui-overrides/applications/python-games.desktop /usr/share/raspi-ui-overrides/applications/python-games.desktop.bck
# "Raspberry Pi Resources" と "The MagPi" はブラウザを起動するショートカット,"Python Games" は ./python_games/launcher.sh を起動するショートカットです。
# geany や chromium は残しておいてもいいかも。Claws Mail は軽量 MUA です。

# 自分がよく使うアプリケーションを入れていく
#   apt-get install firefox-esr firefox-esr-l10n-ja keepassx

# 用途によっていろいろ追加
#   apt-get install thunderbird thunderbird-l10n-ja simple-scan gimp filezilla vlc radiotray brasero easytag gparted ltris freeciv-client-gtk freeciv-server

# ある程度のグラフィック性能(目安:GMA X3100 以降)があるマシンならちょっとした 3D ゲームなんかも
#   apt-get install minetest megaglest extremetuxracer

# あとは普段使っている設定ファイルを ./ にコピーするといい感じに。
# お疲れさまでした。

sourcehan-raspi.sh(一般ユーザとして実行)

#/bin/sh

# Source Han フォントファミリを導入します。
# このスクリプトに実行権限を付与するか,"sh ./sourcehan-raspi.sh" して実行してください。
# フォントはこのスクリプトを実行したユーザのみに導入されます。

cd
mkdir ./.fonts
wget -t 3 -T 60 https://github.com/adobe-fonts/source-han-serif/raw/release/OTF/SourceHanSerifJ_EL-M.zip
unzip ./SourceHanSerifJ_EL-M.zip
mv SourceHanSerifJ_EL-M/SourceHanSerif-*.otf .fonts/
wget -t 3 -T 60 https://github.com/adobe-fonts/source-han-serif/raw/release/OTF/SourceHanSerifJ_SB-H.zip
unzip ./SourceHanSerifJ_SB-H.zip
mv SourceHanSerifJ_SB-H/SourceHanSerif-*.otf .fonts/
wget -t 3 -T 60 https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SourceHanSansJ.zip
unzip ./SourceHanSansJ.zip
mv SourceHanSansJ/SourceHanSans-*.otf .fonts/
ls ./.fonts
rm -rf SourceHan* __MACOSX

# Debian with RPD 用
sed -i -e 's/Roboto Light/源ノ角ゴシック Light/g' ~/.config/openbox/lxde-pi-rc.xml
sed -i -e 's/Roboto Light 12/源ノ角ゴシック Light 12' ~/.config/lxsession/LXDE-pi/desktop.conf
sed -i -e 's/Roboto Light 12/源ノ角ゴシック Light 12' ~/.config/gtk-3.0/gtk.css

参考:
Linux におけるラップトップマシン向け電力管理スイートの紹介(Pm-utils, Laptop-mode-tools, Powertop, TLP) – 怠惰の形而上学
Debian Jessie + Xfce で UIM ツールバーのアイコンの背景色がおかしいのを直すには – 怠惰の形而上学
Debian 上の GTK デスクトップ(Xfce, Gnome 等)で Qt アプリの外観を統合したい – 怠惰の形而上学

Debian with RPD,とても気に入りました。これからも使っていきたいです。

Linux におけるラップトップマシン向け電力管理スイートの紹介(Pm-utils, Laptop-mode-tools, Powertop, TLP)

 Linux をラップトップマシンにインストールすると Windows に比べてバッテリの持ちが悪い,ということが言われることがあります。
 これは事実でしょう。最大の理由は,電力管理の設定が最適化されていないことです。Windows ではメーカが機種ごとに作成した環境のリカバリディスク,あるいはドライバやユーティリティ類がありますが,大半の Linux ディストリビューションでは,32コアのワークステーションでもポケットサイズのモバイルマシンでも同じ DVD を使ってインストールします。したがって初期設定はまずはどんな環境でもそつなく動くようにしておく必要があり,マシンの特性に合わせた最適化は施されていないのです。
 幸い,Linux ではさまざまな省電力機能がサポートされていますし,それらを一括して管理できる見通しの良いツールもあります。数十分ほどの時間をかければメーカが用意した Windows 環境並み,そして(大抵は Linux 環境の方が負荷が軽いこともあり)それを超える電力管理をも実現できます。私のメインモバイルマシンである CF-SX1 は Windows より Debian の方がファンが静かな上に快適に動きますし,バッテリの持ちも良いです。
 この記事では Linux 環境の代表的な電力管理スイートを4つ簡単に紹介します。あくまでも私の個人的な意見であることに注意してください。公式サイトに加え Arch Linux Wiki (Arch Linux ユーザでなくとも極めて役立つ必見リソースです)の該当記事へのリンクも付けましたので参考にしてください。

Pm-utilsArch Linux Wiki 記事
 他のツールと組み合わせることで電源管理にも利用できるため Laptop-mode-tools 等と並べて名前が出ることも多いですが,pm-utils 自身はあくまでもコマンドラインから電源を操作するためのツールです。
 電源管理スイートとして使うためには様々な設定・スクリプト作成が必要で,しかも利用できる機能は限定的です。そのうえ systemd 移行により機能が被ってメリットが失われ,それどころか問題の原因となりうることもあって,今ではあまり人気がないようです。既に pm-utils を利用するスクリプトを多く書いて利用しているという方はともかく,今から導入するメリットは薄いように思います。

Laptop-mode-toolsArch Linux Wiki 記事
 長らくラップトップ用電源管理スイートとしてスタンダードの地位を占めてきたツールです。名称は,カーネルに組み込まれている機能である「Laptop mode」を利用する(しやすくする)ためのツールという意味で,ラップトップマシンのための電源管理スイートの草分け的存在と言えるでしょう。私が最初に導入したツールがこれで,4年ほど前まで使用していました。
 現在でも使われていますが,いかんせん古いソフトという印象で,どうも設定が煩雑でわかりにくいです。よいソフトではあるのですが,他と比較すると,今から導入するメリットは薄いかもしれません。
 もっとも現在も開発は続いていますし,最近は github のコミットも活発になっているようです。これから大きく変わることもありえます。今後の発展に期待です。

PowertopArch Linux Wiki 記事
 Intel 謹製の電源管理スイート……というより,電源管理診断ツールといったものです。公式ウェブサイトでも「a Linux tool to diagnose issues with power consumption and power management」とされています。電源管理機能はあくまでも診断の便宜のためといったスタンスで,再起動すると設定は失われてしまいます。設定を永続化させるためには起動時に自動で powertop に命令するスクリプトを組むなどする必要がありますが,これが少々手間です。また,あくまでも診断のための機能のため,バッテリ駆動時と AC 駆動時でプロファイルを分けるといったこともできず(やるならこれも自前でスクリプトを組んでステートが変わるたびいちいち命令させる必要がある),あまり細かいことをするとデバッグの手間が出てきます。手抜きの荒業としては rc.local に(今なら systemd のサービスを)書いて /usr/sbin/powertop --auto-tune を起動時に自動実行させるというのもありますが(TLP 導入に先立って一時期そうしていました),細かい設定ができないことによる副作用があるうえ,マシンによっては大きな問題が発生することもありえます。
 一方で設定のチューニングには非常に使いやすいツールです。下記の TLP と併用している人が多いようです。概算の消費電力が表示されるのもなんだか楽しいです。

TLPArch Linux Wiki 記事
 結論です。今から入れるならコレ! 機能と手軽さの両面で他の3つを上回っています。
 公式サイトには「TLP comes with a default configuration already optimized for battery life, so you may just install and forget it」と頼もしいことが書かれています(もちろん,実際にはマシンや利用スタイルに合わせた調整もしたほうがより良いのですが)。Powertop と違いシステムの一部を構成する電源管理スイートとして設計されており,解説付きの設定ファイルを少しいじるだけで電源管理を最適化することができます。また,バッテリ駆動時と AC アダプタ利用時での別のプロファイルの利用に標準対応しています。systemd との親和性も高いです。
 現状では主として linrunner 氏という匿名の個人のみによって開発されていて開発の継続性や方向性がやや不透明なのが短所といえば短所ですが(cf. xscreensaver),既に6年以上開発が続いており,実績は充分です。
 Debian の場合,TLP はターミナルから以下を実行することで導入され,機能を開始します(詳しくは Arch Linux Wiki を参照)。

$ su
# aptitude update
# aptitude install tlp tlp-rdw
# systemctl enable tlp.service
# systemctl enable tlp-sleep.service
# systemctl disable systemd-rfkill.service
# tlp start

Raspberry Pi + L-02C でバッチリ安定する多機能 LTE ルータをつくったメモ

*注意*
 この記事は Raspbian が Jessie ベースの頃に書かれたものであり,現行の Raspbian Stretch では手順を適宜修正する必要があるかもしれません。また,筆者が回線付きの部屋へ引っ越したことに伴い,この LTE ルータは今のところ使用していません。
 もっとも,またすぐに必要になりそうなノウハウなので,リアルタイムの作業メモから結論だけを示すマニュアルへの書き直しも兼ねて,18年2月〜3月頃に Stretch で検証のうえ新しい記事を書きたいと思っています。
18年1月10日追記

 3大キャリアが横並びの料金・制度を維持している一方で,ドコモの回線網を利用する MVNO 業界はますます盛り上がりを見せています。各社とも特色あるプランを用意し,様々なニーズに応えられる便利かつわかりやすいシステムを発達させています。そしてそのどれもが3大キャリアの同等プランの数分の一の料金なのです。
 この春の契約見直しで,私は IIJmio のファミリーシェアプランを契約しました。音声通話オプションを付けて月額3520円,1ヶ月に10GBが利用でき,同一回線で SIM カードが3枚まで追加料金無しで利用できるというものです。10GBの高速通信容量の利用は回線ごとではなく SIM ごとに手軽にオン・オフすることができ,オフにすると最大200kbpsでの通信となります。スマートフォンならこんなものでも困りませんから,常時オフで使えば,スマートフォンでのデータ通信では容量が減らないことになります 1。これで,光回線と DTI の490円 SIM を置き換えることを狙いました。
 今回は,その IIJmio 回線で使う LTE ルータを Raspberry Pi + L-02C で仕立てたメモです。

全体像

  • Raspberry Pi をルータにする。回線は ドコモ LTE ネットワーク(MVNO : IIJmio)とし,L-02C で接続する。
  • RPi ルータには無線アクセスポイント機能を持たせず,市販のブロードバンドルータ(光回線で使っていたもの)を AP モードで運用,有線 LAN で RPi ルータに接続する。
  • apt-cacher-ng を導入する。
  • その他,BGM 再生機能,時報チャイム機能などを搭載する。

使ったもの

  • Raspberry Pi B 3500円 2
  • LG L-02C 2000円
  • システムトークス USB ハブ SUGOI HUB 4X AC アダプタ付き 2600円 バッファロー BSH4AE12 1600円(重要)
  • Transcend 16GB UHS-1 microSDHC カード 500円
  • テンキー 300円
  • アクティブスピーカ 500円
  • Raspberry Pi 用 USB-AC アダプタ 3 1000円
  • microUSB ケーブル 100円
  • 筐体(100均の箱・蝶番,ネジ) 600円

計:11100円
(価格は100の位までに四捨五入してあります)

 L-02C,USB ハブ,SD カードと筐体以外は実際には流用。後述しますが USB ハブの選択肢は非常に限られます。この機種を強く推奨します。

侮るなかれ熱暴走
 最初,こんな感じで使っていました。
DSCF2397
DSCF2405
 蓋を閉めて,すっきりしていいなあと満足していたのですが,なぜか止まってしまうことがあります。止まった状態でしばらく放置しても,SoC に電力は行っているようで,触ってみると熱を持っています。どうも熱暴走っぽい雰囲気です。SoC 温度のログを取ってみると,室温25度で60度近くまで行くようです。大した数字ではないようにも思いますが,初代 B で CPU が古い設計なので熱に弱いのかもしれません。熱で壊れたという話もちらほら聞くので,冷却は重要です。
 ファンをつけるというのが最も確実な対策ですが,ファンレスは男のロマンですので,なるべくファンレスの枠内でのエアフロー改善を目指しました。その結果,こんな感じになりました。
DSCF2416
DSCF2419
 はい,また100均です。前はもうちょっと精度の高いメッシュの小物入れも置いてあったのですが,近所3軒回ってなかったのでオシャレグッズコーナーにあったへなへなの小物入れで妥協しました。蝶番も100均で調達,ネジはホームセンターで購入した M3 の 8mm です。絶縁とホコリ除けのため,蓋側となる Raspberry Pi の下にはクリアフォルダから切り出したポリプロピレンのシートを敷いてあります。コンパクトさ重視のためエアフローは合理的とは言えませんが,効果はかなりあり,同条件で概ね43度以下で推移するようになりました。今のところハングアップもありません。夏場はどうなるかわかりませんが,50度を超えることはないでしょう。
 (16/5/4追記)ウワーだめだ。カーテンを開けたまま部屋のサーキュレータを止めて散歩に出かけて帰ってきたら春の陽気に誘われて意識不明の重体になっていました。室温はそれでも28度。残念ながら,部屋の隅に置く通信機器としては,来たるべき夏をファンレスで乗り切るのは難しそうです。とりあえず普段使っているBIGFAN 80Uを筐体の横に置いてみました。ファンコンスイッチを挟んで回転数を抑えてありますが冷える冷える。室温28度ですが32度で安定しています。ロマンの敗北は残念ですが,やむをえまい。次に秋葉原に行った時にでも静かそうで5V以下でも動きそうなファンを買ってきて筐体に組み付けたいと思います。

LTE 回線の仕様
 MVNO の LTE 回線には,プライベート IP アドレスが割り振られるものとグローバル IP アドレスが割り振られるものが存在しています 4。私が今回契約した IIJmio は前者です。プライベート IP アドレスはローカルエリアネットワーク内での居場所を指し示すものに過ぎず,インターネットの向こう側からこちらにアクセスすることはできません。したがって,LTE 回線を利用してサーバを公開したり,P2P ファイル交換を利用することはできません。逆に言えば,セキュリティについてはそれほど心配する必要はないでしょう。この記事はプライベート IP が割り当てられる回線を念頭に置いたものですのでご注意ください。グローバル IP が割り当てられる環境の場合,ファイアウォールやサーバ設定をより慎重に行い,ソフトウェアアップデートを欠かさず行う必要があります。

ハードウェアの仕様・問題
 Raspberry Pi は,誰もが忘れていますがあくまでも教育用のマイコンボードであり,常時稼動でバリバリ使う前提で作られているデバイスではありません。電源アダプタはノーブランド品を避け容量に余裕があるものを選択するだとか,SoC と LAN コントローラにヒートシンクをつけるだとかいった基本は抑えておきましょう。また,第一世代では USB 端子の出力電流が少なく,各ポート 100mA となっています 5。最大で 740mA 消費する 6L-02C はバスパワー駆動では全く足りないので,セルフパワーの USB ハブを用意する必要があります。B+/2B では設定の変更によって, 7,3B では,デフォルトで全ポート合計で最大 1.2A まで供給可能 8なので,一時的な使用であればバスパワーでも問題なさそうですが,後述のように安定して運用するためには USB ポートの電源を制御する機能が必須であり,B/B+/2B/3B の内蔵ハブともにその機能はないようですので,やはり SUGOI HUB を購入する必要が有ります。
 L-02C について,当初は問題が多かったようですが,最新ファームウェア V10e では安定しているようです 9。ただし,いくつか注意すべき点があります。
・初期設定では,始めに CD ドライブとして認識され,それを eject するとモデムとして改めて認識されるというわけのわからない仕様になっています。これは無効化できます(後述)。
・SIM カードの認識がシビアなようで,mini/micro/nano SIM にアダプタを噛ませた状態で挿入すると SIM を認識できません(インジケータが赤く点滅していたら,SIM を認識できていないということ) 10。これは厚みに起因するらしく,アダプタの「背」の部分を切り抜くことで解決します。

Raspberry Pi の準備
 OS として「Raspbian Jessie Lite」を使います。これは Raspbian から X 等を除いた最小版で,今回のように Raspberry Pi をデスクトップ用途でない目的に使用する場合に適しています。
 まず,Raspberry Pi Foundation 公式サイトから,Raspbian Lite のイメージをダウンロードします。
 zip ファイルを解凍のうえ,dd で SD カードに書き込みます。もし SD カードが /dev/sdc として認識されていれば,コマンドは以下のようになります。

$ sudo dd bs=1G if=Downloads/2016-03-18-raspbian-jessie.img of=/dev/sdc

 書き込み終えたら Raspberry Pi に挿入して起動し,ユーザ名 pi,パスワード raspberry でログインします。

raspi-config でもろもろの設定をする

$ sudo raspi-config

 ”Internationalization Options” および “Expand Filesystem”を実行,設定。Boot Options から Console Autologin を選択(後述するテンキーでの操作を可能とするため)。Advanced Options の SSH から SSH サーバ有効化。好みで Hostname や Memory Split 11も設定。
続きは SSH から。

ユーザ名を変更
 まあ好みの問題です。

$ sudo adduser hoge
$ sudo nano /etc/systemd/system/getty.target.wants/getty@tty1.service

 自動ログインするユーザを変更します。

ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM

となっている行の「pi」を新しく作ったユーザにします。

$ sudo gpasswd -a hoge adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi

 pi が入っているもろもろのグループに入っておきます。

$ sudo passwd

 su できたほうが便利なこともあるので,root のパスワードを設定して su できるようにします。

音が出るようにする
 Raspbian Lite では標準ではオーディオドライバが読み込まれていないので,これを読み込みます。

$ sudo modprobe snd-bcm2835
$ amixer sset PCM 100%
$ speaker-test

 音が出たら,起動時にカーネルモジュールを自動で読み込ませるようにします。

$ sudo nano /etc/modules

 末尾に以下の一行を追加。

snd-bcm2835

ルータ機能のセットアップ
L-02C のファームウェアアップデート,リセット,CD として認識される機能の無効化
 ファームウェアアップデートと端末リセットは Windows でやります。ドコモの製品ページに書いてあるとおりにやるだけです。
 次に CD として認識される機能を無効化します。AT コマンドを送ることで恒久的に 12無効化することが可能です。
 手順は以下を参照のこと。

L-02Cを最初からUSBモデムで認識させる/手動でAPN登録する – /dev/stkinosh

wvdial の設定,IP フォワーディング・IP マスカレード
 書こうと思ったのですが,こちらも既に素晴らしい記事が多くありますので紹介のみにとどめます。私が見つけた中で最も網羅的でかつわかりやすい記事は以下です 13

L-02CでLTEルータ作成 – /dev/stkinosh

ほぼ上のとおりにやりました。違うことをしたのは以下のみです。

  • usb_modeswitch は今は導入不要。
  • wvdial.conf で,
    Init3 AT+CGDCONT=1,"IP","iijmio.jp"

    を追加(フラッシュメモリに APN をあらかじめ書き込んでおいて使うのではなく,接続時に ID・パスワードと一緒に渡す)。元々の Init3 は Init4 に。

  • wvdial.conf で,/dev/ttyUSB2 ではなく /dev/serial/by-path/platform-bcm2708_usb-usb-[ここは環境によって違うはず].2-port0 を指定。こちらは(ttyUSB* と違い)物理的に同じ場所に挿される限り不変なので,L-02C を再起動した(抜いて挿し直した)場合にも Raspberry Pi の再起動が不要になる。
  • $ sudo vi /etc/network/interfaces
    iface eth0 inet manual

    となっているのを,

    auto eth0
    iface eth0 inet static
    address 192.168.1.1
    netmask 255.255.255.0

    などとし,固定 IP を指定する。

  • iptables の設定保持用に netfilter-persistent (iptables-perssstent) を導入。仕上がったら
    $ sudo netfilter-persistent save

    するだけで保存して次回起動時にも読み込んでくれる。

  • まあ念の為ということで ssh は 192.168.0.0./24 および 192.168.1.0/24,domain および bootp (dhcp) は 192.168.1.0/24 からのアクセスのみを許可するよう変更。グローバル IP が振ってくる回線の人は必須です。別の回線から当該回線の IP に nmap -Pn してみて出てこなければオーケー。このへんがわかりやすい→iptablesの設定方法|さくらインターネット公式サポートサイト
  • ディレクトリ,ログ,DNS サーバなどを自分の好みに変更。

ほか,以下のページも参考にしました。
格安SIM(MVNO)とRaspberry Pi(ラズベリーパイ)でモバイルルータを作った 〜初期設定から完成まで〜 – $yuzu->log();
Qaplaの覚書・メモ・備忘録・独言 Raspberry Pi をUSBモデムでインターネット接続
Berrbear: Raspberry piでUSBモバイルモデム
SORACOM Air が使える USB 3G/LTE モデム、WiFi ルーターのまとめ – bearmini’s blog
Raspberry PiをL-02C+IIJmioでつないでみた: EeePCの軌跡
Raspberry Pi 2で0SIMをL-02Cで使ってみた。
Raspberry Pi 2 Model BをSORACOM Airに接続してみました。 #soracom |
デジモノステーション2016年2月号付録の0SIMをRaspberry Piで試す | matoken’s meme

ルータ以外の機能のセットアップ
 ルータ以外の機能をセットアップします。apt-cacher-ng を導入する以外は以前書いた「Raspberry Pi ホームオートメーション計画(1)」とほぼ同じです 14。それぞれの機能は USB テンキーで操作できるようにします。

apt-cacher-ng
 Apt-Cacher Next Generation は,APT の deb ファイルをキャッシュしてくれるソフトウェアです。これを導入することによって,アップデートに伴うデータ通信を削減することができます。LAN 内に Debian 系で同じアーキテクチャ(i386 など)の同じディストリビューションが導入されたマシンが複数台ある場合に有用です。サーバにインストールしたうえでクライアントでプロキシの設定をするだけで利用できます。なお,場合によっては大量のデータをローカルに書き込みますので,SD カードの寿命を大きく削ることが予想されます。最初 USB メモリや USB HDD などに書き出すことも考えましたが,一度設定が完成したらオリジナルの(消えたら困る)データは蓄積されませんので 15,SD カード一本で行って壊れたら都度買い直して dd でイメージを書き戻すようにした方が手間を考えると低コストであると考え,とりあえずそれで様子を見ることにしました。

# aptitude install apt-cacher-ng

 次にポートを開けます。ローカルネットワークから,ポート3142への通信を許可します。上で紹介したページでの IP アドレスレンジ,rules の場合の例。

$ sudo iptables -I OPENNEW 4 -p tcp --dport 3142 -s 182.168.1.0/24 -j ACCEPT

 よくある凡ミスでパケットを全部 drop した後ろにルールを追加して反映されないというのがありますので気をつけてください 16。iptables は上から順番に逐次マッチングされて,最初に見つかった合致するルールだけが使われます。
 LAN 内のマシン全てに以下のファイルを作ります。

# vi /etc/apt/apt.conf.d/02proxy

中身はこんな感じで。

Acquire::http::Proxy "http://192.168.1.1:3142/";

 update のうえで何かインストールしてみて,/var/log/apt-cacher-ng/apt-cacher.log にきちんとログが残っていたらうまくいっています。http://192.168.1.1:3142/ にブラウザでアクセスすると,キャッシュのヒット率などを見てニヤニヤすることができます。
第315回 apt-cacher-ngを使ってAPT用キャッシュプロキシの構築:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

音楽再生
 次に ogg123 を導入します。この手の用途では mplayer がよく使われますが,多機能な一方 X に依存しているなどヘッドレス環境で使うにはあまり便利でないので,単機能でコンパクトなこちらのソフトを選択しました。

$ sudo aptitude install vorbis-tools

 たとえば,~/Music/Classical にある全ての ogg ファイルをシャッフルして無限ループさせる場合は以下のようにします。

$ ogg123 -r -z -q Music/Classical/*.ogg &

 mp3 ファイルを使用する場合は,mpg321 を使用します。ソフト名は mpg321 ですが,コマンドとしては mpg123 でもデフォルトでパスが通っています。逆に ogg321 はダメなので,ごっちゃにならないよう mpg123 として使うことをおすすめします。

$ sudo aptitude install mpg321
$ mpg123 -r -z -q Music/Classical/*.mp3 &

 これを後で alias に設定します。

チャイムを鳴らす
 部屋にいることが多い学生身分なので,だらだら過ごしてしまわないよう時報を鳴らすようにしています。私の設定は以下で,朝8時〜夜10時まで1時間ごとにチャイムが鳴ります。

$ crontab -e
0 8-22 * * * ogg123 -q [パス]/chime.ogg

なお,「crontab -e」しようとして「crontab -r」しちゃうというのは定番ネタですので,.bashrc に alias ‘crontab’=’crontab -i’ を加えておくのがおすすめです。
cron の設定ガイド

データ通信量を出す
 本当は「みおぽん API」を使おうと思ったのですが,この辺になるとそろそろめんどくさい短い人生の限りある時間を大切に使おうという気持ちが強まってきたので,/proc/net/dev を使って簡易的に済ませます。

$ grep eth0: /proc/net/dev | while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11; do echo $(((x2+x10) / 1024 / 1024)); done

 これで eth0 を通った上り・下りのデータ量の合算を表示できます。単位は MB です。後述のように LTE の接続が切れて ppp0 が消えてしまうことがあり,その時に累積が消えてしまうので,入口の ppp0 ではなく LAN への出口の eth0 を見ています。Raspberry Pi 自体の通信(ソフトウェアアップデートなど)は反映されませんが,このさい細かいことは気にしない。
 /proc/net/dev は再起動するとリセットされるので,電源を切るときはどこかに書きだしておく必要があります。/var/log/packetcount.log に書き出すとして,以下のようにすると合算して表示できます。

$ grep eth0: /proc/net/dev | while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11; do echo $((((x2+x10) / 1024 / 1024)+$(cat /var/log/packetcount.log))); done

 このまま実行するとファイルが存在せず何も挿入されず文法エラーになるので,/var/log/packetcount.log を作って 0 とだけ書いて保存しておいてください(雑

 これを毎月リセットするために,crontab を設定します。Raspberry Pi には RTC がなく,たとえば1日0時5分などとすると5分以内に NTP サーバとの通信がうまくいかなかった場合に実行されてしまいますので,余裕を持った時間指定にしておきます。

$ sudo crontab -e
1 10 1 * * echo '0' > /var/log/packetcount.log

ネットワークの転送量を調べる方法 – ぴょぴょぴょ? – Linuxとかプログラミングの覚え書き –

OpenJTalk で喋らせる

$ sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001

 オプションを引数で指定するのが必須だったり,wav ファイルとして出力されるのでそれを別途再生する必要があったりといろいろ煩雑なので,引数として文字列を渡せばそのまま喋ってくれるスクリプトを用意しておきます。なお,Raspbian のベースが Wheezy から Jessie に変わった関係で,OpenJTalk の使い方もやや変わっているのでお気をつけ下さい。

$ nano /usr/local/bin/ojsay
#!/bin/bash
TEMP=$HOME/ojsay.wav
echo $1 | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow $TEMP
aplay --quiet $TEMP
rm $TEMP
$ chmod +x ojsay
$ ojsay 誰かがヨーゼフ・Kを中傷したにちがいなかった。悪いこともしていないのに,ある朝,逮捕されたのだ。

 少し待たされて,読み上げられるはずです。むちゃくちゃお手軽ですね。処理に時間がかかるのと,一文が長くなると突然読み上げがやたら遅くなるというバグ?があるようなので,一度に喋らせるのは一言二言にしておくのがおすすめです。
他のコマンドの出力やウェブスクレイプイングと組み合わせれば,可能性は無限大です。

$ ojsay "$(date +"%B%d日 %I時%M分")"

 日時を読み上げ。

$ ojsay "現在のコア温度は $(echo $(($(cat /sys/class/thermal/thermal_zone0/temp)/1000)) | sed s/\.[0-9]+$//g)度 です"

 SoC の温度を読み上げ。

$ sudo aptitude install curl
$ ojsay "$(curl http://www.tenki.jp/forecast/3/16/4410/13101-daily.html 2> /dev/null | grep -e "wethreDrtalIiconText" | sed "-e s/<[^>]*>//g" "-e s/^ *\(.*\)\$/今日の天気は \1 です/" | head -n1)" | head -n1"

 天気を読み上げ。

$ ojsay "$(curl http://www.asahi.com/ 2> /dev/null | grep -A 1 "iref=comtop_6" | sed "-e s/<[^>]*>//g")"

 朝日新聞社ウェブサイトの見出し読み上げ。(流石に結構待たされる)
RaspberryPiにOpenJTalkをインストールする – 試したこととか困ったこととか
Debian Jessie に OpenJtalk を入れてテキストを読み上げてみた – 残しときます(自分用)
Linux – シェルスクリプトで天気予報取得! – mk-mode BLOG

テンキーで操作できるようにする
 入力は USB テンキーから行います。最初はプログラマブルテンキー「NT-19UH2BK」を検討したのですが,金欠なので無駄をなくし環境負荷を軽減するために棚に転がっている普通のテンキーを有効活用することにしました。入力そのものは数字だとか記号だけですので alias でそれぞれにコマンドを割り当てます。まあ,今回の用途なら特に不足はありません。

とりあえず,こんな感じで割り当てました。

* 再起動
*** 停止
7 SoC 温度読み上げ
8 ニュース見出し読み上げ
9 音声出力オン
+ データ通信量読み上げ
+++ データ通信量リセット
4 天気予報読み上げ
5 日付読み上げ
6 音声出力オフ
1 再生開始1
2 再生開始2
3 再生停止
0 ping
00 L-02C 電源リセット(詳細は後述)
000 アップデート試行
000000 とてもつらい

以下を ~/.bashrc に追加します。

alias '*'='ojsay '再起動します'; if [ "$(grep eth0: /proc/net/dev | while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11; do echo $(((x2+x10) / 1024 / 1024)); done)" != "" ]; then sudo sh -c "echo "$(grep eth0: /proc/net/dev | while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11; do echo $((((x2+x10) / 1024 / 1024)+$(cat /var/log/packetcount.log))); done)" > /var/log/packetcount.log"; fi; sudo sh -c "shutdown -r now"'
alias '***'='ojsay '停止します'; if [ "$(grep eth0: /proc/net/dev | while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11; do echo $(((x2+x10) / 1024 / 1024)); done)" != "" ]; then sudo sh -c "echo "$(grep eth0: /proc/net/dev | while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11; do echo $((((x2+x10) / 1024 / 1024)+$(cat /var/log/packetcount.log))); done)" > /var/log/packetcount.log"; fi; sudo sh -c "shutdown -h now"'
alias '7'='ojsay "現在のコア温度は $(echo $(($(cat /sys/class/thermal/thermal_zone0/temp)/1000)) | sed s/\.[0-9]+$//g)度 です"'
alias '8'='ojsay "$(curl http://www.asahi.com/ 2> /dev/null | grep -A 1 "iref=comtop_6" | sed "-e s/<[^>]*>//g")"'
alias '9'='amixer sset PCM on'
alias '+'='ojsay "今月のデータ通信量は $(grep eth0: /proc/net/dev | while read x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11; do echo $((((x2+x10) / 1024 / 1024)+$(cat /var/log/packetcount.log))); done)メガバイト です"'
alias '+++'='ojsay "データ通信量の記録をリセットします"; sudo sh -c "echo '0' > /var/log/packetcount.log"; sudo sh -c "shutdown -r now"'
alias '4'='ojsay $(curl http://www.tenki.jp/forecast/[お住まいの地域の URL] 2> /dev/null | grep -e "wethreDrtalIiconText" | sed "-e s/<[^>]*>//g" "-e s/^ *\(.*\)\$/今日の天気は \1 です/" | head -n1)'
alias '5'='ojsay "$(date +%B%d日%I時%M分)"'
alias '6'='amixer sset PCM off'
alias '1'='ogg123 -r -z -q ~/Music/Jazz/*.ogg &'
alias '2'='ogg123 -r -z -q ~/Music/Classical/*.ogg &'
alias '3'='sudo sh -c "pkill -f 'ogg123'"'
alias '0'='ojsay "$(ping=$(echo "$(ping -c1 8.8.8.8)"|grep " 0% packet loss"); if [ "$ping" = "" ]; then echo "ネット接続に問題があります"; else echo "ネット接続は正常です"; fi)"'
alias '00'='sudo sh -c "checkppp0"'
alias '000'='sudo sh -c "aptitude update; sudo aptitude upgrade -y"'
alias '000000'='ojsay "とてもつらい"'

 このままだと sudo sh がパスワード入力待ちで止まってしまいますので,これらのパスワード入力を不要にします(雑

$ sudo visudo
hoge ALL=(ALL) NOPASSWD: /bin/sh

を追加。ま,今回の場合パスワード入力は自分のフールプルーフになればいいのでこれでよしとします。
 テンキーにシールを貼るなどして割り当てた機能を書いておくとわかりやすいです。

L-02C の自動再起動を実現する
 よし完成,めでたしめでたし……と思ったら,ときどき通信が切れて,L-02C の電源を一度切るまで(ポートから一度抜いて挿しなおすまで)使えなくなることがあることに気が付きました。どうも L-02C のファームウェアの安定性に何かしら問題があるようです。数分おきに ping を飛ばすなどして自動切断の回避を試みるなどしても 17,あまり効果はないようです。他は完璧なのに,ここだけはどうやってもうまくいきません。
MR-GM2運用テスト、とりあえず失敗・・・ | めざせ東京リーマンの千葉週末田舎暮らし
MR-GM2運用テスト、その後・・・|めざせ東京リーマンの千葉週末田舎暮らし ー太陽光発電の売電収入で別荘が買えるかー
格安simをパソコンで使えるようにする曲者デバイスL-02cを紹介(オススメするとはいわない)|投げて、捨てて、シンプルライフ

 残念ながら AT コマンドでハードウェアを再起動させる方法はない模様です。しかしまあ,要するに,一度電源を切ってやればよいのです。/sys/bus/usb/drivers/unbind や /sys/bus/usb/devices/*/power/control 18 19 20から電源を切れますし……と思ったら,できない。前者は認識はしなくなるけど電源は切れない。後者は存在すらしない。なんで。
 しばらくさまよい歩くと,「hub-ctrl.c」というイカしたツールを見つけました。これを使えば,USB ポートの電源をより手軽に制御できるとのことです。――自分の環境ではできませんでしたが。なんでも,lsusb -v してみて Hub Descriptor に「Per-port power switching」とあるものでしか電源制御はできないらしい。「No power switching」や「Ganged power switching」とあるものはそもそもそのための回路が入っていないとのこと。最初に購入した U2HS-T201SBK という USB ハブは,案の定というか「Ganged power switching」でした。なんてこった。名前からはできそうな雰囲気が漂っているんですけどね…..光学マウスを付けて試してみたら,(全てのポートに一斉に反映されるのではなく)特定の1ポートのみに反映され,ランプが消えました。これは行けるか? と L-02C につなぎ替えてみたら無理でした。USB ランプ(単に電力を取ってるだけでなんの制御回路もなし)をつないでいると p=0 にしても光ったままですから,電源自体は供給されたままのようです。手元にあった U2HS-T201SBK(バスパワー)および BSH5U03(セルフパワー)の2機種で同じ挙動。また,実機が手元にないのと情報が少ないのでなんともいえませんが,今回使用した B に加え B+/2B/3B の内蔵ハブもポート個別の電源制御はできないようです。
 じゃ「Per-port power switching」なハブってどんなのがあるのというと,マザーボード内蔵のものを除き殆ど無いんだそうな。まあ確かに USB ハブのポートを個別に制御しようという需要なんてあんまりないでしょうからねえ。動作報告のある現行品で唯一の選択肢が,「SUGOI HUB 4X (USB2-HUB4X)」というものらしい。なんとなく不安になる製品ページですが,ともかく,4つあるポートの内なぜか2つだけですがちゃんと電源を制御でき,USB ランプのような電源ラインしか使っていない機器もオンオフできるらしい。ということで購入。予算オーバーつらい。
 喜び勇んで /sys/bus/usb/ 方面を漁ってみたのですが,power/control がない。ああそうだった。調べてみると,Raspbian が採用している4.1系のカーネルではこの制御方法は廃止されているようです。unbind にデバイス ID を書き込むやり方は使えて,無事にオンオフできましたが,両方のポート一斉にしかできません 21。まあそれでも困りませんが,せっかく買ったので実力を出し切りたい。幸い,先述の hub-ctrl を試してみたところ今のカーネルでもそのまま使えましたので,これを採用することにしました。

$ wget http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
$ sudo aptitude install libusb-dev
$ gcc -o hub-ctrl hub-ctrl.c -lusb
$ chmod +x ./hub-ctrl
$ mv ./hub-ctrl /usr/bin/
$ sudo hub-ctrl -b 001 -d 004 -P 2 -p 0
$ sudo hub-ctrl -b 001 -d 004 -P 2 -p 1

 おー,いけるいける。lsusb して NEC Corp. HighSpeed Hub とあるものの Bus を -b, Device を -d,ポート番号(向かって左から1,2)を -P で指定しています 22。-p 0 でオフ,-p 1 でオン。これさえあればこっちのものです。
というわけで,

$ sudo vi /usr/local/bin/checkppp0
#!/bin/sh
pppalive=$( /sbin/ifconfig | grep "ppp0" ); if [ "$pppalive" = "" ]; then /usr/bin/hub-ctrl -b 001 -d 004 -P 2 -p 0; sleep 10; /usr/bin/hub-ctrl -b 001 -d 004 -P 2 -p 1; fi

 (crontab に一行で書こうと思ったけどなんかうまくいかなくて面倒くさくなってそのまま外部のスクリプトにしたというアレ)
 
 (16/9/11追記)追記し忘れていましたが,ハブを BSH4AE12 に交換して,1)ハブしか接続していなくても Device の番号がたまに変わるようになる,2)ポートのひとつひとつを選択して入切してやらないといけないっぽい?という仕様の違いがあったので,それに対応するために checkppp0 を修正しました。BSH4AE12 対応版は以下です。たぶん大丈夫と思いますがちゃんとチェックしてないのであんまり自信ない。

#!/bin/sh
pppalive=$( /sbin/ifconfig | grep "ppp0" )
if [ "$pppalive" = "" ]
        then
        HUB=`/usr/bin/lsusb -v 2>/dev/null | grep ^Bus | grep "Genesys Logic, Inc. USB-2.0 4-Port HUB"`
        BUS=`echo $HUB | awk '{print $2}'`
        DEV=`echo $HUB | awk '{print $4}' | sed -e "s/\(.*\)\:/\1/p;d"`
        for i in 1 2 3 4
        do
                /usr/local/bin/hub-ctrl -b $BUS -d $DEV -P $i -p 0
        done
        sleep 20
        for i in 1 2 3 4
        do
                /usr/local/bin/hub-ctrl -b $BUS -d $DEV -P $i -p 1
        done
fi

 
 ここまで何日もいじっていて,圏外(ランプ黄色),接続待機でのハングアップ?(ランプ白),接続再試行中のハングアップ?(ランプ青点滅)問わず通信ができなくなった時には確実にセッションも切れて(そしてそう認識されて) ppp0 が消えるらしいということがわかったので,単に ppp0 の存在確認をしています。ping を飛ばすのと違いネットワークに負担がかかりませんし,CPU も食いませんので,毎分だって実行できます。これによって,ダウンタイムを最小化でき,自宅回線としてストレス無く利用することができるようになります。15分の load average を見ても 0.1 を超えることはない(おおむね0.05〜0.07で推移)ようなので,更にチェックの頻度を上げるのもアリでしょう。
 (16/5/1追記)と書きましたが,ダメっぽいです。時々ひっそりと死んでいることがあります。理由は特定できていませんが,ログに出てないのでハードウェア側っぽく,熱は大丈夫なので電源周りっぽい雰囲気があります。2.4A対応アダプタ+ケーブルで試してもダメなので,本体の問題の模様 23。だとしたら,B+以降やポリヒューズ改造後の個体なら大丈夫かもしれません。そのへんはまた後で検討するとして,とりあえず毎分ではなく5分おきに実行するようにしてみたところ安定しています。
 (16/11/2追記)別ハードウェアで毎分の実行を試してみて気付きましたが,wvdial の自動再接続で事が済むような“正常な”接続断にまで L-02C 再起動で対応することが増えてしまうため,却ってダウンタイムが一気に増えてしまいます。やはりチェックのインターバルは数分程度はあったほうが良いようです。
 なお,今回は Raspberry Pi 本体にハブしか挿しておらず数字が変わらないのでベタ指定してますが,他のデバイスも挿している場合は,こちらを参考に lsusb から自動取得するようにするとよいでしょう 24
 
では,最後の敵をいざ倒さん。

$ sudo crontab -e
*/5 * * * * /usr/local/bin/checkppp0

 ふー,倒した。長かった。ともあれ,これでやっと RPi ルータが完全体になりました。

 (16/8/14追記)SUGOI HUB 4X が早くも故障してしまいました。享年4ヶ月という夭折です。改めてネットを眺めてみると,比較的ニッチな製品の割に故障報告が多く目に付きます。じっさい製品の値段もそう高くありませんし,回路は奢っていてもコンポーネントの質は高くないのかもしれません。修理をしても(これがまた販売店への持ち込み不可で最初にメールであれこれしないといけないとやたら煩雑なのですが,それはまた別の話……)また壊れてしまうかもしれません。そこで代替機種を調べてみることにしました。白羽の矢が立ったのが,「節電 USB ハブ」を謳うバッファロー BSH4AE06 です。とても小さい上,手にとってみると非常に軽く,おそらく中はスカスカでしょう。しかしその分,部品点数が少なく壊れにくいことが期待できます。この機種は既にディスコンになっており,後継機種として BSH4AE12 というものが出ています。型番や能書きを見る限り,中身は miniUSB 対応から microUSB 対応に修正された以外は同じものではないかと思われます。今はまだ BSH4AE06 の方が安いですが,まもなく入れ替わることになると思います。なお,USB 3.0 ハブにも目を向けると,電源制御に対応しているという報告のあるものがいくつもあります。 25ただし,セルフパワー対応のものはまだ値段がこなれていません。
 さて BSH4AE06 ですが,結論としては「当たり」でした。Per-port power switching ではなく ganged power switching ですが,先述のような,実際には電源制御できないのに(おそらくは設計上の不備によって)情報だけはそう渡していると思われるものではなく,「本物の」 ganged power switching ですので,ポートごとの電源制御はできませんが,ハブの全ての電源を一度にオンオフすることであれば可能です。lsusb すると「Genesys Logic, Inc. USB-2.0 4-Port HUB」というのがありますので,/usr/local/bin/checkppp0 を先述の要領で書き換えます。また,/etc/wvdial.conf のモデムのパスも書き換える必要があります。
 あと,この件に関する修正を加えるにあたって,この記事がものすごく役に立ちました。当然といえば当然ですが,何かするときに記録を細かく残すのは大切ですね。

 しばらく運用してみて大丈夫そうなら,完成です! おめでとう! 忘れずにバックアップしておきましょう。shutdown -h now したあとカードを別のマシンに刺して,わかりやすいファイル名で保存しておきます。圧縮をかけると未使用領域が縮んでナイス。

$ sudo sh -c "dd if=/dev/sdc | gzip -c > RPI-LTE-ROUTER-$(date "+%y-%m-%d").gz"

(/dev/sdc の部分は環境によって異なります)
 いやあ〜よかったよかった。
モーション検出でUSBライトのON・OFF
LinuxからUSB HUBの電源のON/OFFを制御してみる – memoメモ
電源制御型USBハブでUSBチューナーの見失い状態を解消する。(PX-W3U3、S3U2ほかUSBチューナー汎用): Vladiのブログ
IoTでアボカドの発芽促進とカビを防止する – Part2: BeagleBone Blackで植物育成LEDライトを制御する – Qiita
えびめも(2011-05-30)
GitHub – codazoda/hub-ctrl.c: Control USB power on a port by port basis on some USB hubs.

感想
 3,4年周回遅れなだけあり情報が多く,基本機能については OS 導入から DHCP で IP アドレスを貰ってネットに出られるようになるまでが1時間くらいで終わりました。が,そこからが長かった。ちょっとした問題を潰すために試行錯誤したり,問題の原因を探るために勉強しなおしたりで,期間で一週間以上,丸何日かを費やしました。この記事を書くにあたっても,調べなおしたり再現するか確かめたりしてさらに1日潰れました。いちおう2週間近く実用したうえでの記事公開ですが,まだ何か起こるかもしれないとヒヤヒヤです。しかし,市販のモバイルルータも常時稼動に対応するほどには安定してはいないらしく,データ通信ドングルに対応したルータもいまいち痒いところに手が届かないようですから,LTE 回線を自宅回線として使いたいのであれば,「Raspberry Pi で DIY する」というのがいまのところ最良の選択肢でしょう。ネットワークの復習を含めなかなか勉強になるので,時間に余裕があればやってみると面白いはずです。

4ヶ月使ってみての感想
 記事公開から4ヶ月ほど経ちました。しばらく光と併用していたので正味では2ヶ月くらいですが,中間報告をば。

  • 1ヶ月10GBに収めるためには1日あたり333MBまでの通信に収める必要があります。これはけっこう厳しいですが,ストリーミング系は禁止とし,漫然とウェブブラウジングすることもやめれば,特に問題ない範囲です。この負のインセンティブにより時間を有効に使えるようになるというメリットもあります(?) ブラウザを起動しない日を週に何日か取るようにすれば完璧です。土日は古今東西の名著を手にとったり近場を散歩したりして過ごしましょう。なんて健康的なんだ。
  • 通信速度はそれなりですが,LTE なので ping が速めで,体感としては割と快適です。テキストベースのサイトであれば光回線と違いがわかりませんし,画像の多いサイトでも少し引っかかる程度です。混雑する時間帯でも体感としては ADSL の遅いとき程度です。
  • 自動再接続のおかげで「使おうと思ったら繋がらない」ということはほとんどありませんが,回線が混雑する時間帯には複数のタブを同時に開くと読み込み中のまま止まったり接続がタイムアウトしたりすることがあり,その場合にはページを再読込する必要があります。
  • Linux ディストロのインストールディスクなど大きなファイルのダウンロードは困難です。通信速度が充分でも途中で失敗してしまうことが多いです。Wget などのダウンローダを使用すると多少改善しますが,それでも失敗が多いです。Bittorrent は“無駄”な通信が多いので容量制限のある回線では避けたほうが無難ですが,IIJmio では遮断されているようでそもそも使えません。ダウンロードに失敗するとその分のデータ容量が無駄となり痛いので,大きなファイルのダウンロードはなるべく避けましょう。なお,OS のアップデート程度であれば,回線が空いている時間帯であれば特に問題なくできます。
  • 空冷にしてからとても安定していますが,帰宅したらラズパイが落ちていたことが一度だけありました。電源か熱でしょうが,再現しないのでなんともいえません。思えば今使っている初代Bはもう4年くらい前に買ったブツですので,ハードウェアの変更も視野に入れています。

更新履歴

  • 16/05/01 接続確認の頻度が高すぎて動作が不安定になることがあった件を修正
  • 16/05/04 ファンレスの夢が破れた件について追記
  • 16/08/14 SUGOI HUB 4X がすごいすぐ壊れた話と BSH4AE06 への乗り換えについて追記
  • 16/09/08 4ヶ月使ってみての感想を追記

Notes:

  1. もっとも,高速通信オフ時は3日で366MBまでという制限があります。 通信規制はありますか? | IIJmio
  2. Raspberry Pi (1) B+ の現在の価格より
  3. SUGOI HUB 付属 AC アダプタの出力は 5V2A なので数値上は USB ハブから余裕を持って取れそうなのですが,なぜか正常動作しませんでした。気になりますが,面倒なので今回は調べません。
  4. 一般的には前者が多く,OCN 系や Biglobe 等はグローバル IP らしい。Interlink のように安価に固定 IP を提供しているところもあります。
  5. USB – Raspberry Pi Documentation
  6. マニュアル p.120
  7. Raspberry Piブログ : [コラム] Raspberry Pi Model B+でUSBの最大出力を1.2Aにグレードアップしよう, なお safe_mode_gpio=4 は古いバージョンでのオプションで,互換性のために書かれているだけのため,最近のバージョンを使っている場合は max_usb_current=1 だけで大丈夫です。
  8. Raspberry Pi • View topic – RPi 3 – Very poor wifi performance, 16/4/19 Raspberry Pi Foundation エンジニアの Dom 氏曰く,”1.2A is the default and max_usb_current has no effect on Pi3.”
  9. 価格.com – 『バージョンV10eで安定化』 docomo L-02C [レッド] のクチコミ掲示板
  10. L-02C SIM(UIM)カードが認識しなくて困っていたが解決のようです|ぽちびろの日々ツイート
  11. ディスプレイに繋いでも CUI のみで VRAM はほぼ使うことはないのでがっつり減らしてよい。その分,システムに割かれるメモリ容量を増やせる。ただ,最小値は16MBらしい。 RPiconfig – eLinux.org – http://elinux.org/RPiconfig
  12. 設定がフラッシュメモリに保存されます。
  13. さすがに LTE 回線を自宅回線にしようというニーズはまだ殆どないようで,安定しそうにない構成だったり,重要な情報が抜けていたり,中には明らかに問題のあることをしている記事も散見されますので,実際に作業を始める前に検討する必要があります。
  14. なお part2 は結局まだ書けていません。音声入力はやたら手間がかかる割にうまく行っても他の入力手段より実用上快適にはならないということがわかったので pending という名の放置中です。そのうちやる気と時間がある時にでも……
  15. 犯罪に巻き込まれたような場合にログが残ってなかったら困るな,という程度
  16. またやっちまった。
  17. 定期的に ping を飛ばす手順はこちらを参照のこと。 常時接続の維持 (PING コマンド)
  18. Controlling a USB power supply (on/off) with linux – Stack Overflow
  19. kernel – Turning off power to usb port. Or turn off power to entire usb subsystem – Unix & Linux Stack Exchange
  20. Power OFF and ON USB device in linux (ubuntu) – login: root
  21. 細かく指定しようとするとエラーが出る。
  22. そこに挿しているデバイスではなく,ハブを見ることに注意してください。
  23. Minecraft Pi もできたので,Bとはいえ改良後のリビジョンのはずなのですが……
  24. ただし,手数が増える分 CPU 負荷はやや増えるはずです。
  25. 詳しくないですが,USB HDD エンクロージャも USB 3.0 のものはどれも電源連動に対応していますし,規格上対応が必須になるなどしたのではないか? という気がします。