2017年5月28日日曜日

予定の場所までの移動経路をボタン一つで


外出中に、スケジュールに登録されている次の予定の場所までの移動経路を調べること、しょっちゅうありますよね。カレンダーアプリを起動して、予定の場所の住所をコピーして、地図アプリや乗り換え案内アプリを起動して、住所をペーストして、、、なんてやるのは意外に面倒です。信号待ちの間に始めたのに信号が変わるまでに終わらず、ついつい歩きスマホしてしまう原因にもなります。

Codyl Connectでシナリオを動かしておけば、ボタン一つで解決です。


用意するもの

  • スマートフォン
    • iOS 9.3以降のiPhone

作業1 Connectアプリをインストール

スマートフォンにCodyl Connectアプリがインストールされていなければ、インストールします。AppStoreでcodylで検索するか、下記のリンクから開いてください。


Connectのアカウント登録がまだであれば、Connectアプリからアカウント登録が可能です。アカウント登録を済ませて、ログインしましょう。

作業2 シナリオ作成

ブラウザからCodyl Connectにログインしてシナリオを作成します。テンプレートが用意されているので、簡単です。
  • (1)シナリオタブから「テンプレートから作成」をクリック
  • (2)0048で絞り込むと、「0048:スマートフォンのボタンで次の予定の場所までの経路を通知」のテンプレートが見つけやすくなります。
  • (3)「このテンプレートを使用する」をクリック
  • (4)テンプレートが表示されます。コネクターを順次割り当てていきましょう。コネクター割り当てに表示される順番は異なる場合があります。どの順番に設定してもかまいません。


  • (5)ボタンコネクターを新規作成します。スマートフォンアプリ上の4つの色のボタンの中から好きなものを選びます。私は赤ボタンに割り当てました。



  • (6)Googleカレンダーコネクターを新規作成します。「アカウントに接続」ボタンをクリックします。
  • (7)画面の指示に従って、Googleアカウントを選択します。認可画面が表示されますので、「許可」をクリックします。



  • (8)メソッドバスケットコネクター、位置情報コネクター、プッシュ通知コネクターも同様に割り当てていきます。
  • (9)全てのコネクター割り当てが完了したら、「シナリオ作成」をクリックします。
  • (10)スケジュール設定を有効にします。
これでシナリオの作成は完了です。スマートフォンのConnectアプリのボタンが活性化することを確認しましょう。

カレンダーで予定を登録

Googleカレンダーで予定を作りましょう。場所を設定します。駅名などを入力すると、Googleが住所を補完してくれます。


使ってみよう

スマートフォンのConnectアプリでボタンをタップします。


すぐにプッシュ通知が届きます。通知をタップします。

プッシュ通知メッセージが表示されます。リンクアイコンをタップします。
Google Mapsがインストールされていれば、Google Mapsが起動され、現在位置から次の予定までの経路が表示されます(初回はGoogle Mapsを起動するかどうか聞かれます)。Google Mapsがインストールされていなければ、ブラウザ上で経路が表示されます。



とっても快適です。


2017年5月16日火曜日

自宅のPCを外出先からボタン一つで起動

クラウド全盛の世の中ですが、自宅のPCでないとできないこと、たくさんありますよね。外出先から使いたくなることもたまにあります。

外出先から使えるように、ダイナミックDNSとポート開放を設定してあっても、肝心の電源が入っていなければ使えません。とはいえ、たまにしかないことのために、電源入れっぱなしは電気代がもったいないし、セキュリティも気になります。

そこで、自宅でRaspberry Piを常時起動しておいて、Raspberry Pi経由でPCをWake-on-LANで必要なときだけ起動するように設定しましょう。外出先からの起動の起点には、スマートフォンアプリのボタンを使います。



全体像は下記の通りです。

(スマートフォン)→(Codyl Connect)→(自宅Raspberry Pi)→(自宅PC)

前提知識

この記事では、下記の説明は省略します。
  • 自宅ネットワークの固定グローバルIPまたはダイナミックDNS設定手順
  • 自宅ネットワークのポート開放手順

用意するもの

  • PC
    • OSはWindowsまたはLinux
    • 有線LAN
    • マザーボードや有線LANのネットワークアダプターがWake-on-LANをサポートしていること
  • Raspberry Pi
    • SDカードにraspbianインストール済み
    • 有線LANまたは無線LAN
  • ネットワーク環境
    • インターネットに常時接続
    • グローバルアドレスで接続されていること
    • 固定グローバルIPまたはダイナミックDNSが使えること
  • スマートフォン
    • iOS 9.3以降のiPhone

作業1 PCのWake-on-LAN設定

PCがマジックパケットでWake-on-LANできるように設定します。マザーボードやOSにより設定方法が違うので、ポイントだけ紹介します。マザーボードの設定とOSの設定を両方行わないといけないケースが多いと思います。
  • マザーボードの設定
    • PCのBIOS画面からWake-on-LANを有効にする
  • OSの設定
    • Windowsの場合
      • デバイスマネージャー → ネットワークアダプター → (有線LANのアダプター) → プロパティ
      • ネットワークアダプターのドライバーによって異なるが、「詳細設定」や「電力の管理」にWake-on-LANの設定があることが多い。Magic PacketでのWake-on-LANをオンにする。
    • Linuxの場合
      • 下記コマンドが起動時に実行されるようにする。
        • ethtool -s eth0 wol g
MACアドレスを後で参照するので、確認してメモしておきます。

  • Windowsの場合
    • コマンドプロンプトからipconfig /all
  • Linuxの場合
    • シェルからifconfig -a

作業2 Raspberry Piにetherwakeをセットアップ

etherwakeをインストールして、一般ユーザーからもWake-on-LANのマジックパケットを送信できるようにします。
  • sudo apt-get install -y etherwake
  • sudo chmod +s /usr/sbin/etherwake
PCをシャットダウンさせた状態で、テストしてみましょう。下記のeth0はRasbperry Piが有線LANに接続されている場合の例です。無線LANの場合はwlan0に変更してください。また、XX:XX:XX:XX:XX:XXはPCのMACアドレスに書き換えてください。
  • etherwake -i eth0 -b -D XX:XX:XX:XX:XX:XX
コマンド実行してPCが起動すればOKです。

作業3 Raspberry Piでwebhookを作成

外出先からetherwakeを起動するために、Raspberry Piでwebhookサービスを起動しましょう。nodejsを使えば簡単なプログラムで実装できます。まずは最新の安定版nodejsをセットアップしましょう。
  • sudo apt-get install -y nodejs npm
  • sudo npm cache clean
  • sudo npm install n -g
  • sudo n stable
  • node --version
このブログ執筆時点では7.10.0がインストールされました。続いて、webhookのプログラムです。
  • sudo apt-get install -y uuid-runtime
  • mkdir webhook_etherwake
  • cd webhook_etherwake/
  • npm install express
  • npm install body-parser
下記の内容をwebhook_etherwake.jsというファイル名で保存します。


プログラムの先頭のTOKENとMACADDRとPORTは書き換えます。TOKENはuuidgenコマンドで生成したランダムなUUIDを使うのが良いでしょう。これが漏洩すると、誰でもあなたのPCを起動できるようになります(大した実害はないかもしれませんが)。MACADDRはPCのMACアドレスに書き換えます。PORTはポート開放に使用するポート番号です、すでに9003を他のポート開放で使っていなければそのままで良いでしょう。

以下、XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXは、セットしたTOKENに置き換えてください。

準備ができたら早速起動してみましょう。下記のコマンドで起動したらListening on port 9003と表示されます。
  • chmod +x webhook_etherwake.js
  • ./webhook_etherwake.js
別のシェルから下記のコマンドを実行して動作確認します。
  • curl -X POST -H "Content-type:application/json" -d '{"token":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"}' http://localhost:9003/wake
OKと表示されて、PCが起動することを確認しましょう。

続いてこのプログラムをRaspberry Piで自動的に起動するように設定します。
  • crontab -e
    • @reboot /usr/local/bin/node $HOME/webhook_etherwake/webhook_etherwake.js > /dev/null 2>&1 &

リブート後、先ほどのcurlコマンドをもう一度実行して、正しく動作することを確認します。

作業4 ポート開放

Raspberry Piのポート9003をインターネットからアクセスできるようにポート開放します。

作業5 Connectアプリをインストール

スマートフォンにCodyl Connectアプリがインストールされていなければ、インストールします。AppStoreでcodylで検索するか、下記のリンクから開いてください。


Connectのアカウント登録がまだであれば、Connectアプリからアカウント登録が可能です。アカウント登録を済ませて、ログインしましょう。

作業6 シナリオ作成

ブラウザからCodyl Connectにログインしてシナリオを作成します。
  • (1)シナリオタブから「新規シナリオ作成」をクリック
  • (2)わかりやすいシナリオ名に変更
  • (3)説明を書く
  • (4)再実行頻度を0分に変更
  • (5)「イベントウォーク新規作成」をクリック

  • (6)mainの箱の下のプラス記号をクリックしてステートを追加
  • (7)追加されたステート(state2)をクリック
  • (8)「ステートにコネクターを追加」をクリック
  • (9)新しいコネクターを作成を選んで、「ボタン」を選択
  • (10)4つのボタンのうち好きなものを選択
  • (11)「作成」をクリック


  • (12)メソッドに「TRIGGER: when pushed」を選択
  • (13)textの値に「PC起動」と記述。この文字列がスマートフォンのボタンに表示されます。一番下の「閉じる」をクリック。
  • (14)state2の下のプラス記号をクリックしてステートを追加、追加されたステート(state5)をクリック。
  • (15)「ステートにコネクターを追加」をクリック
  • (16)新しいコネクターを作成を選んで、「WebHook」を選択
  • (17)わかりやすい名前を入力(例:「WebHook(PC起動)」)
  • (18)外部サービスのURLに、「http://自宅のアドレス:9003/wake」と入力。自宅のアドレスには固定IPの場合はIPアドレス、ダイナミックDNSの場合はDNSホスト名を入れます。
  • (19)「作成」をクリック
  • (20)メソッドに「ACTION: post message」を選択
  • (21)tokenの値にRaspberry Piで設定したTOKENを入力。一番下の「閉じる」をクリック。
  • (22)上部のリストからシナリオ名をクリックしてシナリオプロパティ画面に戻る
  • (23)スケジュール設定を有効にする
これでシナリオの設定は完了です。

完成

シナリオの動作中は、スマートフォンのConnectアプリ上で、「PC起動」ボタンがアクティブになります。このボタンを押したら自宅のPCが起動します。




2017年5月5日金曜日

キーボード、ディスプレイ、有線LANを接続せずにRaspberry Piをセットアップ

Raspberry Pi 使ってますか?

Raspbianのインストールのときだけ、キーボードやディスプレイや有線LANのケーブルを用意するのは面倒ですよね。sshと無線LANが使えるようになったら用無しになるのに。

そこで、別のLinuxマシンでsshと無線LANの設定までを行なったSDカードを用意する方法を紹介します。私はCentOS 6.8を使いましたが、どれを使っても大差無いと思います。

用意するもの

  • Linuxマシン
    • インターネットに接続されていること
    • SDカードリーダーが接続できること
    • wpa_supplicantパッケージがインストールされていること
    • tcpdumpパッケージがインストールされていること
  • SDカード (8GB)
  • SDカードリーダー
  • Raspberry Pi
  • 無線LANアダプタ

Linuxマシンでの作業1 RaspbianのSDカード作成

  1. Raspbianをダウンロード
    • → ~/Downloads/2017-04-10-raspbian-jessie-lite.zip
  2. 展開
    • cd ~/Downloads
    • unzip 2017-04-10-raspbian-jessie-lite.zip 
  3. SDカードを接続、デバイス名を確認
    • dmesg
      • → 私の場合は/dev/sdhでした。以下/dev/sdhを読み替えてください。
  4. 以下rootで作業
  5. SDカードのパーティションがマウントされていればアンマウント
    • umount /dev/sdh1
    • umount /dev/sdh2
  6. 書き込み(デバイス名間違いに注意!!)
    • dd if=2017-04-10-raspbian-jessie-lite.img of=/dev/sdh bs=1M
    • sync; sync

Linuxマシンでの作業2 sshと無線LANの設定

  1. SDカードを一旦抜いて再接続
    • df
      • →sdカードのパーティション2つが自動マウントされていることを確認します。私の場合は/media/bootと/media/ f2100b2f-ed84-4647-b5ae-089280112716でした。
      • 自動マウントされていなければマウント
  2. sshの有効化
    • touch /media/boot/ssh
  3. 無線LANの設定ファイルをLinux上で作成
    • wpa_passphrase SSID passphrase > /tmp/wpa.txt
  4. 必要に応じて/tmp/wpa.txtを編集
    • 私の場合はSSIDをブロードキャストしていないので、scan_ssid=1を追加しました。
    • 生のパスフレーズがコメントとして残っているので削除した方がよいでしょう。
  5. SDカード上の無線LAN設定ファイルに追記
    • cat /tmp/wpa.txt >> /media/f2100b2f-ed84-4647-b5ae-089280112716/etc/wpa_supplicant/wpa_supplicant.conf
  6. SDカードをumount
    • umount /dev/sdh1
    • umount /dev/sdh2

Raspberry Pi起動

  1. SDカードをRasbperry Piに挿入
  2. LinuxマシンでDHCPパケットを確認しておく
    • tcpdump port 67 or port 68 -e -n -vvv
  3. Raspberry Pi電源投入
    • 赤いLEDが光る
    • 緑のLEDが点滅
  4. tcpdumpの出力からIPアドレスを確認
11:04:03.835154 00:01:8e:2e:7a:b4 > Broadcast, ethertype IPv4 (0x0800), length 590: (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 576)
192.168.20.1.bootps > 255.255.255.255.bootpc: [udp sum ok] BOOTP/DHCP, Reply, length 548, xid 0xc27a435c, Flags [none] (0x0000)
Your-IP 192.168.20.17
Client-Ethernet-Address cc:e1:d5:17:e9:6d
(略)


これで、Linuxマシンからsshで接続できます。

  • ssh pi@192.168.20.17

ラズパイでLet's Encryptの証明書更新に失敗

ラズパイを自宅用の各種サーバー(DNS、メール、ウェブ他)として使っています。httpsのサーバー証明書の発行・更新にはLet's Encriptを使っています。今日たまたま証明書を更新しようとすると下記のエラーに陥りました。何度やっても失敗します。 ma...