おうちハックのために Raspberry Pi 3 を買った話

自分のおうちをIoTやらICTやらで隅から隅まで効率化したい!
という思いで活動を始めたわけですが、こういうの おうちハック とも言うらしいですね。つい最近知りました。
私が目指すものを指す用語としては、スマートハウス化とかよりも、なんとなく的確な気がします。

おうちハックに興味を抱いたきっかけ

私がおうちハックに興味を抱いたのは、実は Raspberry Pi を買うことが先に前提としてあって、これを家で活用するにはどんな事例があるのかを調べたのがきっかけでした。

Raspberry Pi - Wikipedia

うちの会社では、通常業務だけではなかなか取り組む機会がないような分野への取り組みを、部署ごとにテーマを決めて、業務時間を少し割いて進めていくという仕組みがあります。
この仕組みのなかで、うちの部署では Raspberry Pi を弄る機会がありました。これにより Raspberry Pi への興味が高まり、自分でも買って何か遊んでみようと思ったのでした。

Raspberry Pi の家での活用事例を調べてみると、いろんなものがありましたが、そのなかで一番興味をそそられたのが Homebridge による iOS および Siri との連携でした。
多くの先人たちの記事に刺激されましたが、特に senyoltw さんの以下の記事が私にとって強烈なインパクトがありました。

senyoltw.hatenablog.jp

senyoltw.hatenablog.jp

まず買ったものたち

そんなわけで、妻に上記ブログも見せつつ説明して、快諾をいただいたうえで、先日のブログ記事で触れた IRKit を含め、最低限必要なものをAmazonでポチポチしていきました。
(妻や家族からの理解を得るのが一番難しいハックみたいなご意見もちらほら目にしたので、すぐ快諾いただけた当方は幸せだと思います)

↑このセットを買いました。Raspberry Pi 3 は電源が結構シビアという話を聞いていたので、めんどくさくないように2.5Aの電源がセットのものを選びました。
楽だしお得感があってよかったのですが、残念ながら入荷予定がなくなってしまった様子。

↑microSDカードは、こんなに容量なくてもよかったのですが、手頃な16GBがたまたま在庫がなかったので、今回は32GBにしました。
ただ、Raspberry Pi 3 はmicroSDカードとの相性がそこそこ厳しいような噂も聞いていました。
そこで、まずは以下のサイトで Raspberry Pi と各種SDカードとの相性を確認することにしました。

RPi SD cards - eLinux.org

結果、NG報告がなく値段も手頃だった東芝製microSDカードを選びました。

↑ノートPCしか持っておらず、USBキーボードを持っていなかったので、ワイヤレスかつマウスとセットで安かったこれも買いました。
初期設定で SSH を有効にすれば、以後はリモート接続できるようになるので、キーボードはほぼ不要になることは知っていました。でも、少なくとも初期設定を済ませるためにはキーボードが必要だと思うので。。

↑もちろん IRKit も買いました。

ラズパイ開封の儀

f:id:soappp:20170119232029j:plain f:id:soappp:20170119232040j:plain f:id:soappp:20170119232041j:plain

このあとは、Raspberry Pi を設定していくことになります。

IRKit を導入して、インターネット経由でリモコン操作を可能に

今年は、自分のおうちをIoTやらICTやらで隅から隅まで効率化したい!
そんな思いを持って、まずは何から始めようかと色々と検討したときに、最初に至ったのが IRKit の導入でした。

IRKit - Open Source WiFi Connected Infrared Remote Controller

f:id:soappp:20170113000021p:plain:w350

f:id:soappp:20170113230057j:plain:w400

IRKit は、hackable というか、エンジニアからの目線では非常に活用範囲が広い、学習リモコンのようなデバイスです。
ほとんどのリモコンの信号を読み取ることができ、その信号を再現することができます。 それでいて、エンジニアでなければ使えないような小難しいデバイスではまったくありません。デザインもいい感じ。
App Store で公開されている直感的なアプリを使うだけで、誰しもが家庭内や外出先からあらゆるリモコン制御のデバイスを操作することができるようになるという、画期的なデバイスといえます。

エンジニアの方であれば、LAN内にある機器を制御するのと、インターネット越しに機器を制御するのとでは、かなり大きな壁があることが理解できると思います。
インターネット越しに何かしようとすると、ルーターの設定(NAT)やセキュリティの問題がつきまとうのが常でしょう。IRKit は、独自の公開サーバーをpollingで監視し、当該公開サーバーでAPIを公開することで、これらの問題をすべて回避しています。それも、利用者によるユーザー登録のような固有の設定作業は不要な作りになっており、IRKit が Wi-Fi に繋ぐための設定だけさえすれば、インターネット経由で操作可能な設定が裏側で勝手に整います。
当然ながら、セキュリティには気を遣った設計になっており、所有者以外から勝手に操作される可能性はほぼありません。
また、LAN内では、公開サーバーを経由せずとも、直接 IRKit と HTTP で通信することで、任意の赤外線の信号を送受信することができます。
さらに、同一LAN内に複数の IRKit を配置することもできるように設計されています。
エンジニアの方であればもちろんですが、エンジニアでない方であっても、公式アプリを使うだけで家中のリモコン制御の機器をどこからでも制御できてしまいます。

例えば私は、テレビやエアコンのリモコン信号を公式アプリで保存しています。
職場にいながらもリモコン操作で特定のテレビ番組の録画を始めたり、退社して家に向かい始めたらリモコン操作でエアコンを動かし始めたりといったことが可能です。

家に近づいたら自動的に照明やエアコンを付けたり、家から離れたら自動的に消したりするような仕組みも、一人暮らし前提であれば、iPhone で「Geo IR」というアプリを使えば簡単に実現できます(私は一人暮らしではないのでシンプルな仕組みだと不都合があり使っていませんが)。

Geo IRを App Store で

エンジニアの方であれば、色々なものと連携させることで、面白いことがいろいろできるでしょう。楽しみがいがあるデバイスです。

非常にお勧めです。

2017年の目標:スマートハウス化

f:id:soappp:20170108221535j:plain:w350

今年は、我が家をもっと住みよいものにしたいという思いと、エンジニアとしての知識を家庭でも何か活かしたいという思いとが合わさって、スマートハウス化を目指すことにしました。

スマートハウスという響きは大げさですが(賃貸だし)、例えば Siri に話しかけてテレビのオンオフができたり、誰もいない家に帰宅する場合は家から近くなったらエアコンが自動でオンになったりと、そんなやつです。
妻からも快諾いただいたので、ある程度は予算もとれそうです。
そのへんの取り組みの過程を、今後メモがてら残していきたいなあと思っています。

現在の進捗は、iOS10 の標準アプリ「ホーム」や Siri から、いくつかの機器の操作や気温等の確認ができるようになったところです。 Homebridge なるものを使っています。

やりたいことはまだまだたくさん。。

はてなブログに移行してみた

ひっさびさに自分のはてなダイアリーを開いたら、はてなブログへの移行を勧めるリンクが目に入ったので、乗っかってみた。
はてなダイアリーでも全然更新していなかったけど、今年は決意を新たにして、少し頑張っていきたい思い。

ついでに、私がとても好きな言葉を紹介しておきます。

人間が変わる方法は3つしかない。
1つは時間配分を変える。
2番目は住む場所を変える。
3番目はつきあう人を変える。
この3つの要素でしか人間は変わらない。
最も無意味なのは「決意を新たにする」ことだ。

大前研一『時間とムダの科学』 http://www.meigennavi.net/word/078/078053.htm

Macの「メール」アプリが起動後に異常終了する問題の対処

しばらく前から、Macの「メール」アプリを起動すると、起動してから15秒後くらいに必ず異常終了するという事象に遭遇していました。
まあ正直Gmailで事足りるので、調査もせずそのまま放置していたのですが、重い腰を上げて調べたらすぐ解決方法が見つかったのでメモ。

異常終了時のエラーログ

Process: Mail [57039]
Path: /Applications/Mail.app/Contents/MacOS/Mail
Identifier: com.apple.mail
Version: 9.0 (3094)
Build Info: Mail-3094000000000000~1
Code Type: X86-64 (Native)
Parent Process: ??? [1]
Responsible: Mail [57039]
User ID: 501

Date/Time: 2016-03-15 23:34:48.275 +0900
OS Version: Mac OS X 10.11 (15A284)
Report Version: 11
Anonymous UUID: (なんとなく伏せておく)

Sleep/Wake UUID: (なんとなく伏せておく)

Time Awake Since Boot: 1000000 seconds
Time Since Wake: 55000 seconds

System Integrity Protection: enabled

Crashed Thread: 7 -[AttachmentManager _synchronouslyPurgeAttachments] Dispatch queue: NSOperationQueue 0x7fb020766050 :: NSOperation 0x7fb022a480d0 (QOS: UTILITY)

Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY

Application Specific Information:
*** Terminating app due to exception while holding database lock 'NSInternalInconsistencyException', reason: 'Cannot set MFGmailLabelStore as data source for message.'
abort() called

原因

よくわかりませんが、何らかの要因で「メール」アプリが使っているデータベースに不整合でも起きたのではないかと思います。

対処方法

  1. [システム環境設定...]-[インターネット アカウント] を開く。
  2. メールを使用しているアカウントを選択し、[メール] のチェックを外す。
  3. 「メール」アプリを起動する。→異常終了しない。
  4. 「メール」アプリを終了し、先ほど外した [メール] のチェックを再度入れる。
  5. 「メール」アプリを起動する。→設定としては元どおりだが、異常終了しない。

元ネタ

こちらの投稿を参考に対処しました。

Mail crashes shortly after launch | Apple Support Communities
https://discussions.apple.com/thread/7251951?start=0&tstart=0

ALMiniumをいい感じにバージョンアップする方法

本記事では、ALMinium (https://github.com/alminium/alminium) を適切にバージョンアップする手順について解説します。

はじめに

ALMinium(およびそれを構成する各種アプリケーション)は、日々進化を続けています。よって、一度構築したALMiniumをしばらく運用すると、培ったデータはそのままで、最新のALMiniumにバージョンアップしたいという状況がしばしば発生します。
ALMiniumのバージョンアップについては、正しい手順(というと語弊がありますが、何もエラーを発生させずにすんなりバージョンアップする手順)を解説しているサイトが見つからなかったので、私が実際に使用しているバージョンアップ手順を紹介したいと思います。

免責

本記事は、2013年8月末時点において有効な手順であることを確認しています。それ以降のバージョンでは、必ずしも本記事のとおりの手順ではうまくいかない可能性があることをご承知おきください。
また、ALMiniumと同時にJenkinsをインストールすることは想定していません(Jenkinsのデータ引継ぎに関しては本記事では一切触れていません)。

大まかな流れ

バージョンアップ手順は、大まかには以下の流れで実施します。

  1. 旧ALMiniumで培った全データのバックアップ
  2. 新しいマシンに最新のALMiniumをインストール
  3. データベースの復旧とマイグレーション(取り込んだデータを最新のALMiniumに適合する形式に変換)
  4. その他のデータの復旧

1. 旧ALMiniumで培った全データのバックアップ

バックアップが必要なのは、以下のデータです。

  • データベース: MySQLのデータ
  • リポジトリ: /var/opt/alminium 配下
  • Redmineにアップロードされたファイル: /opt/alminium/files 配下

以下は、バックアップのコマンド例です。

# mysqldump -u alminium -palminium alminium > /path/to/backup/alm_db_dump.sql
# cd /var/opt/alminium
# tar czvf /path/to/backup/alm_scm.tar.gz ./ > /dev/null
# cd /opt/alminium/files
# tar czvf /path/to/backup/alm_files.tar.gz ./ > /dev/null

上記コマンド例では、MySQLダンプを alm_db_dump.sql、全リポジトリを alm_scm.tar.gz、Redmineにアップロードされた全ファイルを alm_files.tar.gz として保存します。
私の場合、上記コマンド例をベースとしたバックアップ用スクリプトを作成して、cronで定期実行するようにしています。バックアップの保存先はファイルサーバーにしています。

2. 新しいマシンに最新のALMiniumをインストール

おそらく、大半の方がALMiniumの構築では仮想マシンを使用しているかと思います。それは正しい選択です。バージョンアップの度に新しいマシンが必要になりますので。

新しいマシンを用意して、最新のALMiniumを新規インストールします。インストール後は、あとの作業のため、Apacheを停止させておきましょう。

# service httpd stop

なお、ALMiniumと同時にJenkinsをインストールすることもできますが、ALMiniumのバージョンアップ作業が煩雑になりそうな印象があるので、私はインストールしないことにしています。Jenkinsが必要であれば、別マシンで構築して、HudsonプラグインRedmineと連携させるのがスマートではないでしょうか。

3. データベースの復旧とマイグレーション(取り込んだデータを最新のALMiniumに適合する形式に変換)

先ほどバックアップしたデータのうち、MySQLのデータベースを、新しいマシンに取り込みます。取り込む前に、ALMiniumインストール時に作られているデータベースを空にしておく必要がありますので気をつけてください。

以下は、データ取り込みのコマンド例です。

# mysql -u alminium -palminium -e "drop database alminium; create database alminium;"
# mysql -u alminium -palminium alminium < /path/to/backup/alm_db_dump.sql

取り込み完了後は、マイグレーションを実行して、取り込んだデータを最新のALMiniumに適合する形式に変換します。
以下は、マイグレーションのコマンド例です。

# cd /opt/alminium
# rake db:migrate RAILS_ENV=production
# rake redmine:plugins:migrate RAILS_ENV=production

特にエラーは発生しないはずです。

これで、データベースの復旧が完了しました。

4. その他のデータの復旧

最後に、リポジトリや、Redmineにアップロードされたファイルの復旧を行います。
以下は、データ復旧のコマンド例です。

# rm -rf /var/opt/alminium
# mkdir /var/opt/alminium
# cd /var/opt/alminium
# tar xvf /path/to/backup/alm_scm.tar.gz ./ > /dev/null

# rm -rf /opt/alminium/files
# mkdir /opt/alminium/files
# cd /opt/alminium/files
# tar xvf /path/to/backup/alm_files.tar.gz ./ > /dev/null

これでデータの復旧が完了しました。Apacheを起動して、ALMiniumにアクセスしてみましょう。

# service httpd start

これまでに経験したトラブル事例

Backlogsプラグインマイグレーションがうまくいかない

MySQLのバックアップを取り込む前には、ALMiniumインストール直後のデータベースを一旦削除&再作成して、空にしておく必要があるようです。これを怠ると、何もBacklogsプラグインに限ったことではないと思いますが、正常にマイグレーションできません。要は、新しい形式のデータと古い形式のデータは混ぜてはいけないということです。

チケット一覧におけるチケットの色がおかしくなった

チケットの色に関する仕様が、Redmine 2.1から変更されています。よって、Redmine 2.0以前のALMiniumからバージョンアップすると、チケットの色が正しく表示されなくなることがあります。
Redmine 2.2からは、2.0以前と2.1以降とでチケットの色を統一できるように、テーマの仕様が拡張されました。しかし、2013年8月末時点のALMiniumでは、同梱されているデフォルトのテーマ(Gitmike)が古いものから更新されておらず、拡張仕様に対応されていません。

対処としては、自分で最新のGitmikeに差し替えることで、チケットの色を正しく表示できるようになります。
最新のGitmikeテーマは以下からダウンロードできます。
https://github.com/makotokw/redmine-theme-gitmike

差し替え対象は以下の場所です。

/opt/alminium/public/themes/gitmike

以上、皆様のALMiniumライフのご参考になれば幸いです。

VS2005で最近ビルドしたC++のアプリが他環境だとサイドバイサイド云々で起動できない件

現象

Visual Studio 2005 にてC++で開発しているプロダクトがあります。最近、ある日を境に、開発環境で作成したビルドが、ターゲット環境で動作しなくなるという事象が発生しました。
具体的には、ある時期以降に作成したビルドを、ターゲット環境で実行しようとすると、下記のエラーが発生するようになりました。

このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを開始できませんでした。詳細については、アプリケーションのイベント ログを参照してください。

The application has failed to start because its side-by-side configuration is in
correct. Please see the application event log for more detail.

イベントログを確認すると、以下の記述があります。

"" のアクティブ化コンテキストの生成に失敗しました。 従属アセンブリ Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195" が見つかりませんでした。 詳細な診断を行うには sxstrace.exe を実行してください。

Activation context generation failed for "". Dependent Assembly Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195" could not be found. Please use sxstrace.exe for detailed diagnosis.

原因

どうやらビルド環境における Microsoft.VC80.CRT とやらのバージョンが上がってしまったことにより、それと同等のバージョンがインストールされていない環境では、サイドバイサイド(開発環境と同じバージョンのDLLを使用させる仕組み)により実行不能になってしまったようです。
ビルド環境における Microsoft.VC80.CRT とやらのバージョンが上がってしまった原因を調べたところ、下記のアップデートが原因のようでした。これは、Windows Updateにて勝手に導入されたものと思われます。

Microsoft Visual Studio 2005 Professional Edition - 日本語 用の Security Update (KB2538218)
この Security Update は Microsoft Visual Studio 2005 Professional Edition - 日本語 用です。
後で最新版の Service Pack をインストールした場合、この Security Update は自動的にアンインストールされます。
詳細については、http://support.microsoft.com/kb/2538218 を参照してください。

対処

1. 開発環境から当該アップデートをアンインストールする

KB2538218 を開発環境からアンインストールしてしまえば、以後のビルドからは今回の事象が発生しなくなります。

2. スタティックリンクする

今回の事象が発生するそもそもの要因は、Microsoft.VC80.CRT とやらのDLLのバージョンが開発環境と実行環境とで異なってしまうことです。
これをスタティックリンクするようにしてしまえば、バージョンの不一致などは発生しなくなります。
具体的には、プロジェクトのプロパティで、[C/C++]-[コード生成]-[ランタイムライブラリ]で、[マルチスレッド DLL (/MD)] の代わりに [マルチスレッド (/MT)] を選べばよいです。

ただし、共通言語ランタイムサポートを使うプロジェクトだと、上記設定をするとビルド不可能になってしまいます。

コマンド ライン error D8016 : コマンド ライン オプション '/MT' と '/clr' は同時に指定できません

この場合、本当に共通言語ランタイムサポートを使用しているプロジェクトであれば、回避は困難となるかもしれません。
ただ、もし共通言語ランタイムサポートを実際には使用していないプロジェクトの場合、プロジェクトのプロパティで、[構成プロパティ]-[全般]-[共通言語ランタイム サポート] を [共通言語ランタイム サポート (/clr)] から [共通言語ランタイム サポートを使用しない] に変更することで、ビルドが可能になります。