Quantcast
Channel: もやし工房
Viewing all 72 articles
Browse latest View live

安価で広告無しメルマガ配信サーバ作る話

$
0
0

こちらから積極的に情報を伝えたい場合、メールは今でも便利な手段です。空メール登録/解除、不達メール対応の無料ソフトacmailerを、さくらレンタルサーバにインストールし、安価で広告無しの独自ドメインのメルマガを送る方法。他のサーバでも良く似た手順で導入可能かと思われます。

メールマガジン?

情報を取りに来て貰うのであればWebが便利ですが、きちんと読んで欲しい情報を、読んで欲しい人に届けたい場合は今でもメールが有効です。

若い世代向けにはLINE@等もありますが、アンケートや商品購入などを通じて既にメールアドレスが手元にある場合や、情報を届けたい先が普段あまりPCを使わない携帯電話(ガラケー)ユーザの場合、やはりこちらの方がしっくり来ます。

今回の対象の方

  • 配信先はさほど多くない(~数百人程度)
  • 無料で送りたいが、無料サービスの広告は嫌
  • 登録されたメールアドレスを自分で管理したい(無料サービスは登録メールアドレスが見られない場合も多い)
  • 独自ドメインでメルマガを発行したい
  • 空メール登録/解除、不達メール機能を使いたい
  • 何らかの理由で独自でシステムを構築したい
  • ある程度ITの知識がある

上記に該当しない方はインストール不要の広告付きの無料サービスか、安価な広告無しの有料サービスがオススメです。

メールマガジン配信システムの構築

メールマガジンを送るシステムのことをメールマガジン配信スタンドなどと呼ぶようです。沢山の有料/無料のオンラインサービスがありますが、今回は他所の配信スタンドを使用するのでは無く、ソフトを自分でサーバ(レンタル)へインストールし構築します。

メールマガジン配信システム(無料)

無料のオープンソースの配信システムを調べたところ、メジャーな下記2つが見つかりました。

どちらもインターネット上での情報が多かったのですが、phpListは若干規模の大きな配信システムと言う気がした&後者は日本の方が作ったプログラムのため、日本固有のガラケー対応、空メール対応で、設定も簡単そうだったため、acmailerを選びました。

ざっくりとこんな機能が付いています。

  • 空メール登録/解除、不達メール機能
  • CSV対応メールアドレス管理(一括登録など)
  • 絵文字/デコメール/HTMLメール対応
  • 予約配信
  • テスト配信
  • 絞り込み配信(特定ドメインのみ配信など)
  • 差し込み送信
  • 配信履歴とバックナンバー

などなど…
ちなみに、再販、配信システムレンタルを行う場合は要有料ライセンスとなるようです。

対応レンタルサーバー

コチラから一方的に送るだけの場合は別ですが、ユーザ側で自由に購読登録/解除をさせたい場合、配信システムを入れるサーバが必要です。

公式ページでは、エックスサーバー、さくらインターネット(含ライトプラン)、データホテル、カゴヤ(スタンダード10以上)が、サポートしているサーバとして載っていました。

他にもメール送受信機能があり、転送の設定が有る程度自由にできるようなレンタルサーバ、VPS/IaaS(クラウドもの)等、自分で構築したメールサーバにも設置可能かと思われますが、一度に大量のメールを送る場合は、何らかの制限や制約が有る場合もあると思いますので、各レンタルサーバにお問い合わせ下さい。

今回は、さくらインターネットのスタンダードプランを使用しました。

前準備(独自ドメインメールの設定)

ユーザ名@独自ドメイン名で配信する場合の設定です。ユーザ名@サブドメイン名.レンタルサーバドメイン名でメルマガを配信する場合は、この項目は読み飛ばしてください。

独自ドメインの割り当て

今回は、さくらのレンタルサーバ&さくらでドメインを取得した環境です。

メール配信に必要なDNSのMXレコードとSPFレコードの設定が必要なので、慣れない方は少々高くても、さくらで取得しておいた方が楽です。他の場所でドメインを管理している場合は、そちらで、MXとSPFレコードを設定し、サーバで独自ドメインのメールを受信できる状態にします。

2015-05-11_16h43_03

SPFレコードの設定は必須では無いが、”迷惑メール扱い”になりにくくなる

送受信のチェック

独自ドメインでメールの送受信が正常にできることを確認してから、メルマガ配信システムのインストール準備をします。この段階で普通のメールの送受信ができていないと、配信システムをインストールしても多分動きません。

acmailerのインストール

下記からインストール用スクリプトをダウンロードします。

開発版の機能は必要なかったため正式版、さくらサーバのperlのpathである #!/usr/bin/perlの方を選びました。開発版の機能が必要な場合は開発版をダウンロードします。

2015-05-11_16h19_30

サーバ内のwebからアクセスできる位置にディレクトリを作成し、ダウンロードしたinstall.cgiを設置、24時間以内に起動します。

設置~インストールまではさくら管理コンソールのファイルマネージャーツールでもできるのですが、ファイルマネージャーは安全のためwww以下しかいじれず、後述する空メール登録/解除/不達メールの設定ができないため、SCP(WinSCP)やFTP(FFFTP)クライアントソフトで接続して設定する方が良いです。

さくらの場合は、
/home/{username}/www/
以下にディレクトリを作って設置します。

ディレクトリのパーミションは777 or 755
cgiのパーミションは755

/home/{username}/www/mailmgz
等、SCPクラインとソフトを使い接続→任意のディレクトリ作成し、そのディレクトリにinstall.cgiをコピーします。

インストールファイルの設置だけなら、ここのファイルマネージャも使えます。

インストールファイルの設置だけなら、このファイルマネージャも使えます。

設置したらブラウザから、該当のアドレスを叩くと、インストーラーが起動します。

今回の場合、
http://独自ドメイン名/mailmgz/install.cgi
でした。

ちなみに、インストール時にacmailer側に、設置URL(リファラー)、IPアドレス等の情報が渡るようです。若干の抵抗はありますが、無料のソフトなので我慢しましょう。

インストールは簡単で、管理パスワードや配信アドレスなどを入力し、次へを押していくと、自動的に必要なファイルをダウンロードし、設置してくれます。インストールが終わったら、設置した時と同じ手順でサーバに接続し、install.cgiは削除します。

acmailerの配信テスト

とりあえず送信ができるかどうかだけ試しましょう。

acmailerコントロールパネル(http://独自ドメイン名/mailmgz/ )へログインし、「メールアドレス管理」で自分のメールアドレスを手動登録し、「メール配信」で配信します。問題なくメールが届けば、空メール登録/解除、不達メールの設定をします。

2015-05-18_15h15_39

空メール登録/解除、不達メール機能の設定

空メールを送ると自動的にメルマガに登録される「空メール登録」機能、購読を解除する「空メール解除」。指定したアドレスへ届かない場合、自動的にメルマガの購読解除をする「不達メール」機能を設定します。

ユーザ作成

下記4つのアドレスを用意します。アドレスは任意の文字列が使用可能です。

  1. メルマガ配信用
  2. 登録用
  3. 解除用
  4. 不達メール管理

今回は、

  1. メルマガ配信用→ mag
  2. 登録用 → reg
  3. 解除用 → del
  4. 不達メール管理 → error

としました。

さくらなら管理コンソール→「メールに関する設定」→「メールアドレスの管理」から作ります。

2015-05-18_14h31_39

配信用アドレス(mag)以外は外部から接続して受信しないので、パスワードは何でも良いです

プログラムに転送する設定

さくらレンタルサーバの場合maildropと言うソフトを使ってメール配信をしているらしく、.mailfilterファイルを使用して届いたメールをメルマガ配信システムに転送できます。

WADAX、kagoya、ファーストサーバー、Xserverに関しては公式のマニュアルに設定方法が書いてあります。他のレンタルサーバやVPS等を使っている場合は「レンタルサーバ名 メール プログラム 渡す」「MTA名(postfix,qmail,sendmail) プログラム 渡す」等で調べてみてください。

さくらの場合は上記オンラインマニュアルにあるように、メモ帳等で下記のよう書いたファイルを用意し、適当にファイル名を付けて保存します(他のサーバでは若干 記述は異なります)。

・登録用ファイル

to "| /home/{username}/www/{acmailerを設置したディレクトリ}/lib/autoreg.pl reg"

・解除用ファイル

to "| /home/{username}/www/{acmailerを設置したディレクトリ}/lib/autoreg.pl del"

・不達メール管理ファイル

to "| /home/{username}/www/{acmailerを設置したディレクトリ}/lib/errmail.pl"

次に、SCP(WinSCP)やFTP(FFFTP)クライアントソフトを使用し上記ファイルを下記のディレクトリへ転送します。さくら管理ツールのファイルマネージャは下記のディレクトリが見られないので注意してください。

さくらの場合は、
/home/{username}/MailBox/{作ったユーザ名}
へ、上記各ファイルを.mailfilterと言う名前でコピーし、パーミションを600にします。

今回の場合は、

  • 登録用ファイル→/home/{username}/MailBox/reg/.mailfilter
  • 解除用ファイル→/home/{username}/MailBox/del/.mailfilter
  • 不達メール管理→/home/{username}/MailBox/error/.mailfilter

と言った感じ。

2015-05-11_17h41_26

既にできているMailbox/regに.mailfilterを置く(登録用)

必要であれば、配信用アドレスを普段使っているメールアドレスに転送設定を行ってください。このアドレス宛に、購読ユーザが返信したメールや、登録/解除情報などが届きます。

「配信用アドレス」のみ普段使っているメールに転送しておいても良いと思います

「配信用アドレス(mag)」のみ普段使っているメールに転送しておいても良いと思います

不達メール管理設定

登録と解除の設定は必要有りませんが、不達メールはacmailer側の設定が必要です。

各種設定→不着メール設定
・不着メール管理→使用する
・メールアドレス→設定
・停止設定、保存ログ件数→適当に

各種設定→送信サーバ設定
・ローカルサーバ→sendmailパス→-f オプション→チェック

公式のマニュアル(不着メール設定方法(さくらインターネット))に入っていませんが、-fオプションの設定が無いと、さくらでは不着メールが管理できないので注意してください。

2015-05-11_17h47_01

各種設定→不着メール設定

2015-05-11_17h49_48

各種設定→送信サーバ設定。さくらでは-f (from)オプションを付ける。

登録/配信/解除/不着テスト

空メール登録テスト

上記の登録ができたら自分で使用しているメールから、登録用@ドメイン名(今回はreg@独自ドメイン名)へ空メールを送って、

  1. 登録希望のアドレスに「登録しました」のメールが来る
  2. 管理ツール→メールアドレス管理→メールアドレス一覧に該当メールアドレスが入っている

事を確認します。

配信テスト

管理ツール→メール配信で登録したアドレス宛にメールが届くかテストします。
また、メールのソースを見て、Return-Pathに不着アドレスで指定したアドレスが入っていることを確認します(重要)。

2015-05-11_17h58_21

Gmailならメッセージ選択→右上の▼→「メッセージのソースを表示」

空メール解除テスト

解除宛にメールを送り、解除されることを確認します。

  1. 解除しましたのメールが来る
  2. 管理ツール→メールアドレス管理→メールアドレス一覧に該当メールアドレスが消えている

事を確認します。

不着テスト

上記の配信テストでReturn-Pathに不着アドレスが入っていることを確認してから、
管理ツール→メールアドレス管理→メールアドレス登録で”絶対にエラーとなるメールアドレス”を登録し、再度配信テストを行います。

送信後しばらくしたら、
管理ツール→各種設定→不着メール管理→0回以上の不着データを表示
等して不着に入っていることを確認します。

2015-05-11_18h06_42

「表示」を押すと、再表示されて不着のアドレスが表示されます

他の設定

細かい設定はマニュアルに従うとして、さくらではメール送信が「15分間で250通」に制限されているらしいので、
管理ツール→各種設定→送信サーバ設定→送信モード→分割送信→250件/待ち900秒
に設定しました。

他はテンプレート変えたり、少し設定を変えたり…

セキュリティ設定(アクセス制限)

セキュリティ設定って書くほどのセキュリティは保てないのですが、漏れると怖いメールアドレス一覧がWebから見られる状態になっていることは怖かったので、設置サーバ以下のディレクトリをウェブサーバの機能を使い認証させることにしました(さくらレンタルサーバはdigest認証が使えないため、basic認証としました)。共用SSL使って接続するともっと良い気もします。

で.htpasswdファイルを作り、
/home/{username}/www/mailmgz/.htpasswd
として設置、


AddHandler cgi-script .pl

<Files ~ "^.(htaccess|htpasswd)$">
deny from all
</Files>
AuthUserFile /home/{username}/www/mailmgz/.htpasswd
AuthGroupFile /dev/null
AuthName "password ?"
AuthType Basic
require valid-user
order deny,allow

上記の.htaccessファイルを、
/home/{username}/www/mailmgz/.htaccess
へ設置しました。

ちなみにこの設定をすると、メルマガ購読者がWebで登録/解除/バックナンバーの閲覧等々の機能が使えなくなります(ちゃんと除外すれば使える気もするけど、どこでどんなファイルを使っているか分からない&面倒)ので、ご注意下さい。

また、上記の設定をした場合、無料ライセンスの場合は他の場所に著作権表示をしないとダメとのことなので、それに従うことにします。

2015-05-11_18h27_37

上記の決まりを守る

その他の作業

下記で登録用アドレスのQRコード画像を作ったりしました。

最後に

若干ややこしくも見えますが、レンタル配信ポストを使えない理由がある/使わない場合は独自で持つのもありだと思います。

ただ、共有レンタルサーバの場合は同居している人の誰かがSPAM送りまくり→送信サーバがブラックリスト入り→自分のメールも送れない(届かない)と言うこともありますので、本気の商用利用には若干心配です。システムの面倒を見るコストが高い or ちょっとハードル高いなぁと言う方は配信システムのレンタルも悪くない選択だと思います。

  • レンタル配信システムの例
    ワイメール
    (¥4,980/月)
    契約者専用個別グローバルIP/独自ドメイン/空メール登録・解除/予約配信/ステップメール/携帯・デコメール/ブラックリスト/CSVリスト管理/オプトイン/クリック測定 などなど

そら豆から自家製豆板醤を作ろう

$
0
0

そら豆、塩、唐辛子、麹だけで作るシンプルな豆板醤の作り方。市販のものとはまた違った味に仕上がります。

豆板醤(トウバンジャン)?

麻婆豆腐や辛い系炒め物には欠かせない豆板醤。四川料理の調味料です。無くても味噌と唐辛子などで代用できたりしますが、時間をかけた物とはやっぱり違う味。市販品には、にんにくや調味料が入っているため、手作りしても食べ始めは若干の物足りなさを感じたりもしますが、慣れてくるとなんとも美味しいです。

大量に使える物でもありませんが、保存も利きますし、比較的 簡単に作ることができます。

材料

  • そら豆 100g(10~15さや)
  • 種麹  10g
  • 塩   20g
  • 粉末赤唐辛子(後述) 15g
  • タカノツメ(お好みで) 3本
  • 自家製味噌(あれば) 大さじ1
  • 保存容器

器具類

  • 蒸し器 or 圧力鍋 or 鍋
  • マッシャー or 厚手のビニール or フードプロセッサー

メモ

  • そら豆は冷凍の物を使ってもできますが、やっぱりシーズンの物(4~6月)を使った方が風味よく美味しくなります。
  • 種麹は米麹作り等で余った物を。無ければ通販等(下記参照)で購入します。
  • 唐辛子はこだわりが有れば黒くて格好いい「四川唐辛子」みたいなのをネットで購入してください。今回はキムチ作りで余った韓国唐辛子(粗挽き粉)を使いましたが、風味は良いのですが辛みが少ないため、タカノツメを刻んで入れました。この辺はお好みにあわせて適当に。
  • 自家製味噌は味噌作りと同じく生きてる菌を加える的な意味がある…んですかね。参考にした作り方に入れろと書いてあったので入れていますが、無くても大丈夫です。

[楽天市場]

唐辛子粉(粗) 荒挽き唐辛子 赤唐辛子 中華調味料 四川料理に欠かせない 500g

唐辛子粉(粗)  四川料理に 500g
価格:713円(税込、送料別)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

種こうじ20グラム【単品購入のみ送料無料/メール便】
価格:500円(税込、送料無料) (2017/5/8時点)

豆板醤の作り方

流れ

  1. そら豆をサヤから外す
  2. そら豆を蒸す
  3. そら豆を潰す
  4. 塩、唐辛子、麹、味噌を加える
  5. 混ぜる
  6. 瓶詰め
  7. 半年ほど放置
  8. 完成

そら豆をサヤから外す

サヤからそら豆を取り出します。じゃじゃっと水で流しました。

シーズンのそら豆と書きつつ、お勤め品買ったら、若干茶色かった。

シーズン中のそら豆をと書きつつ、”おつとめ品”のを買ったら、若干茶色かった。

そら豆を蒸す

20分ほど蒸します(圧力鍋なら加圧5分→自然減圧)。普段茹でて食べるよりも少し柔らかめに。手でギュッとして潰れるくらいの柔らかさまで蒸してください。蒸していると、何とも言えない「そら豆臭」がします。

今回は圧力鍋で5分

今回は圧力鍋で5分

蒸し上がり。何とも言えない"そら豆臭"

蒸し上がり。何とも言えない”そら豆臭”

そら豆を潰す

包丁で少し切り込みを入れ、蒸し上がった豆の薄皮を剥きます(結構熱い)。そら豆って 子どもの時はそんなに好きじゃ無かったけど、いつの間にか 1シーズンに1度は食べたい味になっていました。

量が少なければ、厚手のビニール等に入れギュギュッと押し潰します。大量の場合は味噌作りと同様踏んでも良いような気がしますが、今回は量が少なく、手で潰すのが面倒だったのでフードプロセッサーを使いました。

熱いです

熱いです

フードプロセッサーは便利だ。

フードプロセッサーは便利

塩、唐辛子、麹、味噌を加える

潰したそら豆に塩、唐辛子、刻んだタカノツメ、種麹、自家製味噌を加えます。

味噌と違って赤色が綺麗

味噌と違って赤色が綺麗

混ぜる

材料を混ぜます。味噌作りと違うことは唐辛子が入っていること。こねた手で間違って鼻の下や目を触ると大変なことになってしまうのでビニールで手袋をして混ぜました。混ぜ具合はざっくりと全体が混じったらOK。
ちょっと固いかなぁと思ったら少量の湯冷ましを加えます(今回は加えませんでした)。

混ぜる

混ぜる

こんな感じでOK

こんな感じでOK。赤い!

瓶詰め

瓶は良く煮沸消毒します。量にもよりますが、今回は少量だったので保存瓶に詰め込みました。

最後に味噌の時と同じくカビ防止用の少量のチューブワサビをのせて、いったん完成です。この状態で写真では分かりにくいですが、若干 赤×白っぽい感じになっています。

一応味噌作りと同様、団子にしたけど意味があるのかは分かりません

一応味噌作りと同様、団子にして入れた

最後にカビ防止のワサビをのせて完成

最後に容器の上にカビ防止のワサビをのせて完成。ビンを蓋して放置します。

放置する

直射日光の当たらない、涼しい場所(常温)で半年ほど放置します。味噌と同じく天地返し等をすると良いらしいのですが、面倒なのでそのままで。

完成

半年後、出来上がったのがコチラ。途中経過はあまり見てないのですが、味噌と同じく少しづつ茶色(赤茶色)になっていきました。完成後、発酵を停めたければ冷蔵庫に入れますが、味の変化を楽しみたい場合は常温放置でもかまいません。

あとは麻婆豆腐に入れるなり、ラーメンにちょっと入れるなりで使ってください。

放置する時間は長いですが、少量であれば手間もかかりません。調味料って作るの楽しいですよー。

DSC_4082

初心者向けRaspberry Pi GPIOの美味しい食べかた(インストール編)

$
0
0

GUIで作成&黒い画面での設定なし。マウスでRaspberryPiのGPIOが使えるPi_Scratchの使い方。
Linux・プログラミング初心者でも「Lチカ」以上の、色んなセンサーを組み合わせた「もの作り」を体験できます。

GPIO ?

Raspberry Pi(ラズベリーパイ)には外部の機器(電子部品、モーターなど)をつなげるためのGPIO(汎用入出力)端子と言うのがついており、この端子につなげた機器をラズベリーパイ内のプログラムからあれこれすることが可能です。

組み合わせはあなたのアイデア次第。実用的なモノから そうでないものまで色んなモノが作れます。

例)

  • 明るくなったらエアコンの電源を付けて、スマホに通知する
  • 温度を記録し、暑くなったら水をあげる
  • 遠隔地で夜ドアが開いていたらメールする などなど

Raspberry Piって何?って方はこちら

raspberrypi gpio

この針々してるのがGPIO端子

でも、難しいんでしょ?

この楽しそうなGPIOなのですが、使うためには黒い画面であれこれ設定したり、何だか難しげな”キーボードでカタカタするプログラム”を作るのが一般的です。Linux・プログラミング初心者が ちょっとだけ「GPIOを使った もの作り」を体験したいと思っても、若干ハードルが高かったのです。

でも、今回紹介するソフト(Pi_Scratch)を使うと、黒い画面や難しげなプログラムを殆ど触ることなく、直感的な操作でGPIOを使った(各種センサーや動力を組み合わせた)もの作りができます。

サンプルプログラムや”Lチカ”をやって RasPiホコリかぶってるなぁって方も、もう一度やってみませんか?

何ができるの?

できること

  • RaspberryPi(2/A+/B+/A/B)のGPIOを直感的な操作であれこれできます
  • 操作にはScratchと呼ばれる、主にマウスで”ブロックを組み合わせてプログラムを作る”言語を使います
  • 温度・気圧・距離・湿度・加速度センサー、ADコンバータ、赤外線リモコン、etcの情報を比較的簡単に取り込めます(対応の機器のみ。後述)
  • 各種モータ類(サーボ、アーム)、小型液晶、ドットマトリクスLED、etcを比較的簡単に動かせます(対応の機器のみ。後述)
  • キーボード・マウス・モニタ・LAN無しの状態で、RaspberryPiの電源をつけただけで、作成したプログラムの実行ができます
Scratchを使ってGPIOに中継するのが今回紹介するソフト。pythonで書かれています。

Scratchを使ってGPIOに中継するのが今回紹介するソフト。pythonで書かれています。

できないこと

  • 対応していないセンサーをマニュアルでどうのこうのする(ある程度はできるようです)
  • ソフトウェアPWM(バグ。昔は動いていたらしいので、その内 修正されるかもしれません)
  • 外部コマンドの実行
    Linuxのコマンドを叩いて、メール送ったり、url叩いたり、テキスト吐き出したり、他のアプリと連携することはできません(後述)

ScratchGPIOとの違い

同種のソフトでScratchGPIOと言うソフトがありますが、大きな違いは、対応している入出力機器の種類。

Pi_Scratchは開発元(Pridopia社)がRaspberry Piに接続する各種ボードを販売しており、それをScratchからいじれるようにした(ボードを買わなくても同一のセンサーなら使える場合が多い)ものです。

こんな風に使います(画面イメージ)

プログラムは下図のようなブロックを組み合わせて作っていきます。対応しているセンサーであれば命令は少しだけ。

スイッチを付けたらLEDが光るのサンプル。ブロックを組み合わせてプログラムを作ります。

スイッチボタンを押したらLEDが光るのサンプル。ブロックを組み合わせてプログラムを作ります。(GPIO10がスイッチの入力、11がLEDの出力)

対応のセンサーであればこれだけ(温度を測る)

対応のセンサーであればこれだけ(温度を測る)

左の例をpythonで書いたらこんな感じ。こちらの方が分かりやすかったら、下記のエントリーは見なくて良いかと...

左端の例をpythonで書いたらこんな感じ。こちらの方が分かりやすかったら、下記のエントリーは見なくて良いかと…

 

対応機器(2015/6/2現在)

※リンク先の商品の動作を保証しているわけではありません(若干型番が違ったりしています)。価格は参考価格です。

下記のものであれば特別な設定無く、比較的簡単に使用できます。

入力

  • 1-Wire DS18B20 Temperature Sensor(温度センサー / ¥300 / 秋月電子
  • i2c BMP085 Barometric Pressure/Temperature/Altitude Sensor(気圧・温度センサー /¥1,250 / 秋月電子
  • Ultrasonic Distance Sensor(超音波距離センサー / ¥400 / 秋月電子
  • spi mcp3002/mcp4802 AD/DA (アナログデジタルコンバータ /¥180 / 秋月電子 / これ経由で照度センサーなど)
  • DHT22 Digital Temperature & Humidity Sensor(温度&湿度センサー / ¥300 / 秋月電子
  • IR remote control set(赤外線リモコン)
  • IR- Line Hunting sensor, IR -Flame sensor(赤外線反射センサー)
  • IR- PIR Motion sensor(焦電型赤外線(人感)センサー / ¥600 / 秋月電子
  • MPU6050 sensor 3 Axis Gyroscope(3軸加速度センサー / ¥430 / Amazon
  • RFID Reader
  • Motor Wheel Encoder (Pi GPIO)
  • i2c 23017 GPIO Motor Wheel Encoder (i2c GPIO)
  • 4hub/7hub i2c RTC & Temperature sensor, AD/DA, EEPROM
  • i2c 8,16,32,64,128 GPIO board
  • spi 16,32,64,128 GPIO board

出力

モーター系

  • GPIO relay, DC Motor, stepper Motor
  • Relay Step Motor control
  • 8 DC Motor PWM controlr
  • Maplin USB Robot ARM control
  • 6 DOF (Degrees of Freedom) Servo Robot Arm

LED系(LEDが並んだブロック)

  • 24×16 & 16×16 LED Matrix
  • i2c PWM/servo board, 16×16 ,24×16 LED matrix
  • i2c PWM LED & GPIO LED control

LCD系(小さい液晶ディスプレー)

  • GPIO 16×2 LCD ,20×4 LCD , 84×48 LCD
  • i2c 16×2 LCD, i2c 20×4 LCD(¥1,280 / 秋月電子
  • New i2c & GPIO LCD command

最新の対応状況は下記公式ページをご覧下さい。

個々のセンサーの使い方は下記公式ページのUser Manualをご覧下さい。

Pi_Scratchのインストール方法

下記はRaspberry Pi 2の場合ですが、他の機種でも良く似た感じです。

詳しくは公式ページにありますが、

  1. 各種設定済みのイメージファイルをSDカードに書き込む方法
  2. 現在のRaspbianに手動で入れる方法

の2種類があります。

今回はハマルと嫌なので「Linux初心者が黒い画面を見ずに使える」を目指したいので、新しいSDカードを使って1の方法で。

設定済みイメージと言ってもRaspbianがベースになっているので、Raspbianに入っているものは基本全部入っています。既存のRaspbianに手動でインストールしたい&黒い画面が出ても大丈夫な場合は170ページ近い下記ユーザーマニュアル(pdf)の最初の方に方法が書いてあります。

インストールの流れ

  1. イメージファイル(分割ファイル)のダウンロード(Windows等他のPC)
  2. 上記ファイルの結合(Windows等他のPC)
  3. 上記イメージファイルをSDカードへ書き込む(Windows等他のPC)
  4. Raspberry PiにSDカードを入れ起動
  5. Raspbianの設定(ディスク拡張、ロケーション等)

イメージファイルをダウンロードする

上記公式ページから、お手持ちのRaspberry Piにあったイメージファイルをダウンロードします。

Raspberry Pi 2の場合、約4GBのファイルが1GBづつ分割されているため、4つのファイルをダウンロードします。

イメージファイルの結合

7-zipと言うアプリケーションをダウンロード&起動し、1つ目のイメージファイルを選択→右クリック→結合を押します。問題なければ結合され、Pi_Scratch_XXX-Pi-X.imgができあがります。

2015-06-02_16h51_35

1つ目のファイルを選択し結合を選ぶ

SDカードへ書き込み

NOOBSには対応していないため、上記のimgファイルをWin32DiskImagerを使って直接SDカードへ書き込みます(Windowsの場合)。

Image Fileで上記で結合したimgファイルを選択、DeviceでSDカードが入ったドライブを選択し、Writeを押します。

オフィシャルでは4GBに書き込んでいますが、16GBでも問題有りません。ただし、起動すると4GB分しか領域が確保されていないため、4GB以上のSDカードを使用する場合は、後に行う「ディスク領域の拡張」を行う必要があります。

書き込みには数分かかります

書き込みには数分かかります

Raspberry Piで起動

イメージファイルを書き込んだSDカードをRaspberry Piに入れ、起動します。
問題なく書き込まれていれば、RasbianのLXDE(GUIのデスクトップ)で起動し、自動的に黒い画面とScratchが起動します。

RaspberryPiを起動すると、自動的にScratchが起動し、この画面になる

RaspberryPiを起動すると自動的にScratchが起動し、この画面になる

Raspbianの設定

初回起動直後はキーボード、言語、時間が海外になったまま&ディスク領域が4GBの為、設定を行います。設定はターミナル(あー。黒い画面をここで少し使います)を起動し、下記のコマンドを実行します。

別に少々不便でもかまわない→とりあえずまずは体験だ!と言う方は、下記の設定をしなくてもセンサーを動かす事は可能です。

sudo raspi-config
  • ディスク領域拡張(4GB以上のSDカードに書き込んでいる場合)
    1.Expand Filesystemを選択します
    基本ずっとOKを押していけば、全領域が使われます。
  • ロケール、タイムゾーン、キーボード配列の変更
    ■ロケール
    4.Internationalisation Optionsを選択します
    1 Change Locale
    ja_JP.UFT-8 UTF-8
    ■タイムゾーン
    2 Change Timezone
    Asia→Tokyo
    ■キーボード配列
    3 Change Keyboard Layout
    Generic 105-key (Intel)PC
    Japanese – Japanese (OADG 109A)
あー。黒い画面はここで使うね。本当にPi_Scratchしか使わない(時間やキーボードが若干おかしくて良い)のであれば必須ではありません。

矢印とTABキーで移動。スペースで選択、エンターで確定、ESCキーで戻ります(マウスは使えません)。

 

ここまでできたら、さっそく使ってみましょう。
プログラミング初心者でもRaspberry PiのGPIO(汎用入出力)を使う方法(使い方編)へ続きます。

 

 

初心者向けRaspberry Pi GPIOの美味しい食べかた(使い方編)

$
0
0

キーボードでの難しげなプログラム&黒い画面での設定なし。マウス操作だけでRaspberry PiのGPIOが操作できるPi_Scratchの使い方。

プログラミング初心者でもRaspberry PiのGPIO(汎用入出力)を使う方法(インストール編)からの続きです。インストールがまだ済んでない方は、上記をご参照下さい。

Pi_Scratchの使い方

Pi_Scratchは、Scratchと言う”キーボードではなく、マウスの操作でブロックを組み合わせて”プログラムを作るプログラム言語を使います。Scratchそのものの使い方はココでは省きますが、全く触ったことがなければドットインストールや書籍が便利です。

基本操作

何故か分厚い公式マニュアルに綺麗に書かれていませんが、Scratchの「制御」→「○○を送る」でGPIOに命令を送ります(GPIO番号で指定します)。

gxxout GPIOピンXXを出力にする 例) g10out
gxxin GPIOピンXXを入力にする 例) g10in
gxxon GPIOピンXXをHigh(on)にする 例) g14on
gxxoff GPIOピンXXをLow(off)にする 例) g14off
update 入力時に値を更新する
startup ファイルオープン時 自動起動する

GPIOの入力か出力かを決める

gxxout gxxin

ピンIDではなく、GPIO番号で指定します。

ちなみにGPIO2,3,14,15番はOUT、IN共に設定できません。

2015-06-03_09h17_19

GPIO出力

GPIO XX番を出力にする
gxxout
High(ON)にする
gxxon
Low(OFF)にする
gxxoff

GPIO入力

GPIO XX番を入力にする
gxxin

入力値を更新する(updateを送らないと値は更新されません)
update

まとめるとこんな感じ。GPIO XX番を入力にし、0.5秒づつupdateを送り、値を見ます。
※waitを入れないとハンドラーが落ちます(0.1秒とかでも可)

gpio_in

gXXinを送ってから、updateを送ると、「調べる」→「○センサーの値」が出てきます。

初回&更新にはupdateを送る

初回&更新にはupdateを送る

snapshot7

ちゃんと命令が送られていると、こんな画面が裏に出ています(17 set to IN / Pin: 17 -> 0の部分)

Pi_Scratchを使った作例

これ意外にも沢山の作例がマニュアルに載っていますので、是非 組み合わせて遊んでみてください。

スイッチを押すとLEDがつく

GPIO10につながったスイッチを押すと、GPIO11につながったLEDをつける

20150603_160223-001

 

回路図

ledとスイッチ2

プログラム

snapshot12

1-Wire DS18B20温度センサーの値を読む

回路図

温度センサー

プログラム

snapshot13

対応センサーだとこれだけ。TEMPB20はGPIO4につなぐ必要有り。26.6度。

MCP3002 ADコンバータ(照度センサー)

回路図等

プログラム

snapshot8

画像では0ですが、ちゃんと値は取れてました

赤外線(人感)センサーでLEDを光らせて「!!」と言う

回路図

モーションセンサー2

プログラム

snapshot14

LEDがGPIO10、人感センサーがGPIO11

その他の作例

他のセンサー、回路図など詳しくは公式マニュアル(pdf)に書かれています。

その他の設定

必須ではありませんが、便利に使う方法など(※黒い画面を使ったりします…)。

Raspberry Piの起動で自動実行させる

下記の組み合わせで、モニタ、キーボード、マウス、LANが無い状態でも予め作ったプログラムの実行が可能です。

  1. Scratch上で「startupを受け取ったとき」と言うブロックを使うと、ファイルを開いたときに自動的にそのブロックが実行されます。

    snapshot9

    Startupの場合、「緑の旗がクリックされたとき」は動きません

  2. ~/.config/autostart/Scratch-File(デフォルトでは、/root/.config/autostart/Scratch-File)を編集すると、Scratchで作った任意のプログラムを自動実行できます。
自動起動はこのファイルを編集

自動起動はこのファイルを編集

赤枠の所を変更

赤枠の所を変更

他のPCから操作する

x11vnc等のVNCサーバをインストールするとWindowsやMac等 他のPC(Raspberry Piには電源とLAN/Wifiのみ接続する)からの使用が可能です(現在のディスプレイに接続できないtightvncserverでは動作しません)。

Pi_ScratchとScratchGPIOの同居

何らかの理由でScratchGPIOを入れる場合、普通にインストールしただけではScratchGPIOが正常に動作しません。※下記設定を行っても同時に使用はできません。

上記の手順(イメージファイルからのインストール)で入れた場合、Scratchのプログラムが書き換わってしまっています。バックアップされているオリジナルのScratchを戻し、pi_scratch用のScratchをリネーム、pi_scratch起動スクリプトをリネームしたものに変更します。

root@raspberrypi:/home/pi# cd /usr/bin/
root@raspberrypi:/usr/bin# ls -la scratch*
-rwxr-xr-x 1 root root 2335 1月 30 08:07 scratch
-rwxr-xr-x 1 2625 2625 2489 12月 11 2013 scratch.old
root@raspberrypi:/usr/bin# mv scratch pi_scratch
root@raspberrypi:/usr/bin# mv scratch.old scratch
root@raspberrypi:/usr/bin# chown root.root scratch

root@raspberrypi:/usr/bin# leafpad /root/.config/autostart/Scratch-File

Exec=pi_scratch --document &quot;~以下同一~&quot;

 

また、Pi_Scratch、ScratchGPIO共にScratchでGPIOを使う為の中継サーバを起動しますが、ScratchGPIOはScratchGPIOを終了しても中継サーバ(ハンドラー)が終了されないため、再起動(or プロセスをkill)するまでPi_Scratchが動作しません。

ScratchGPIOのハンドラーだけ起動→閉じると終了するスクリプトを作成します。

ScratchGPIO7のディスクトップアイコン右クリック→設定

lxterminal –title=”ScratchGPIO7″ –command=”sudo python /scratchgpio7/scratchgpio_handler7.py 127.0.0.1 standard”

へ変更。

最後に&お願い

できることは若干制限されていますが、特に面倒な操作無くRaspberry PiのGPIOをあれこれできるのは、Raspberry Pi + GPIOを使う”とっかかり”には簡単で楽だなぁと感じました。

あとは任意のLinuxコマンドが実行ができれば、特定の値になったらmailコマンドでメールを出す、グラフ画面を外部のキャプチャソフトで取ってhttpサーバで表示、WebAPIをcurlで叩いて返値を使う など、かなりできる事の幅が広がるのになぁ… と思ってpythonのソースを見た(&ちょっとだけ挑戦してみた)のですが、私の実力では直ぐにはできませんでした。

外部シェルコマンドの実行(任意のコマンドを送って実行/返値を取得?)をやってみたよーって方いらっしゃいましたら是非方法を教えてください。僕と多くのプログラミング初心者が喜びます

はじめの一歩!無料で始めるAWS その1(登録、請求アラート、用語編)

$
0
0

Amazon Web Serviceの無料枠を使ってEC2,ELB,RDS,CloudFrontを使って色々頑張ってみる話。お勉強、1年限定お試しの為などなど、一度試してみたい方の参考になれば幸いです。日本語版コンソールでの説明です。

  1. 登録、請求アラート、用語編
  2. EC2、EBS編
  3. ELB、CloudFront編
  4. RDS、CloudWatch、退会編

に別れています。

AWS無料利用枠?

Amazonのクラウドサービス、Amazon web serviceアカウントを作成したユーザーが1年間の間、AWSリソースのある一定の使用枠を無料で利用できるプログラムです。

2015/6月現在、無料で利用できる主要なサービスはざっくりこんな感じ(月間使用量)。24×30日=720時間なので、それぞれ1つだけ起動するなら1ヶ月間はちゃんと使える計算です。

  • EC2 / 仮想サーバー / 750 時間 / t2.micro
  • RDS / リレーショナルデータベース / 750 時間 / 20 GB / db.t2.micro
  • CloudFront / CDN / 50 GB データ転送(アウト)
  • EBS / EC2につけるストレージ / 30 GB (SSD)
  • ELB / ロードバランサ / 750 時間 1 か月あたり / 15 GB
  • S3 / ストレージ / 5 GB
  • CloudWatch / 監視 / 10個の監視項目
  • DynamoDB / NoSQL DB / 25 GB
  • 他多数

無料枠で何ができるの?

現在、見ていただいているブログ(WordPress)や、それほどCPUパワーを食わないWebシステム、他 最悪遅くなっても誰も死なないLinuxベースで動く何か、外からつながる開発環境などを動かす事ができます。無料枠内でもデータベースは別サーバにできるので、思っていたよりは色んなものに使えます。

今回は、上記の無料枠の内、

  • EC2 / 仮想サーバー / 750 時間 / t2.micro
  • EBS / EC2につけるストレージ / 30 GB (SSD)
  • RDS / リレーショナルデータベース / 750 時間 / 20 GB / db.t2.micro
  • ELB / ロードバランサ / 750 時間 1 か月あたり / 15 GB
  • CloudFront / CDN / 50 GB データ転送(アウト)

を使ってみたので、使い方と注意点を書いていきます。

あらかじめ用意するもの

  • クレジットカード
    無料枠利用でもクレジットカードが必要なので、予め用意しておきましょう。ネットを見ているとデビットカード(審査無し、即引き落としカード)でも登録可能との事なので、学生やカードを持ってない方は事前に手に入れておきましょう。

サインアップ

まずは登録しないと始まりません。

へ行き、右上の「まずは無料で始める」のボタンを押し、ユーザ登録をします。日本のお買い物で使うamazon.co.jpのアカウントは使えず、amazon.comのアカウントを取得します。

名前、住所等は「半角英数」で入力し、クレジットカード番号を入力します。言語を日本語に変え、上記ヘルプページを見ながらやれば特に難しくはありません。最終ページのサポートプランは「ベーシック(無料)」を選びましょう。

2015-06-23_15h35_57

このページだけ英語

2015-06-23_15h35_25

日本語が出てきても半角アルファベットで入力

 登録が終わったら、下記URL等からログインします。

利用料金通知の設定

ログインすると何やら聞いたことのある色んなサービス一覧が並んでおり、どれどれとクリックしたくなるとは思うのですが、いったん我慢します。

AWSは「いつの間にか料金かかって怖い」みたいな話は聞いたこと無いでしょうか?今後色々試すうえでも、「無料枠と思って使ってたら、思ってもいない金額の請求来た」とかは怖いので、まずは「利用料金が$○を越えたらメールを送る」設定をしましょう。

  1. ログイン後の右上のアカウント名→請求とコスト管理をクリック。
    BillingAlarm001
  2. アラートおよび通知→初回請求アラームの設定
    BillingAlarm02
  3. 請求アラーム→アラームの作成
    BillingAlarm03
  4. 1欄にアラートを出したい金額(今回は5ドルでアラートが飛ぶように設定)
    2欄に通知したいメールアドレス
    3アラームの作成
    BillingAlarm04
  5. 2の関係でメール認証のメール?が来るのでリンクをクリックして認証。
  6. 作成した直後はデータ不足とかなっていますが、しばらくほっておくとOKに変わっています。
    BillingAlarm05
    BillingAlarm06

ただ、このアラームって6時間につきって書いてあるんですよね。6時間以内に閾値に達したときメールって来るのでしょうかね。ただまぁ「しでかした」としても6時間で気づけるというのは安心につながります。

その他(エラーメッセージについて)

設定していてエラーが出てどうにも分からないと言う場合は、検索して探したりすると思いますが、現在の所は日本語のエラーメッセージで探してもあまり情報が出てきません。最下部の言語を日本語→Englishに変更してから探すとより多くの情報が出てきます。ご参考まで。

2015-06-23_15h56_00

エラー原因を探すときは英語に切り替えて

用語解説

設定に際し 今までAWSを使ったことの無い方には聞き慣れない言葉がいくつかある(少なくとも僕は分からなかった)のでざっくりと書いておきます。Elastic IPの部分などは無料枠を無料として使いたい場合は気にしておく必要があります。

  • インスタンス
    (EC2上で実行される)仮想マシンのこと。EC2に限らず起動してくる何かはインスタンスって言ったりしてるみたい。
  • Amazonマシンイメージ(AMI)
    OSのディスクイメージ。OSがインストールされた状態のハードディスクの内容を丸ごと写しとったもの。
  • Elastic Block Store(EBS)
    EC2で使うディスク。無料枠のt2.microにはストレージが付いてないので、これを借りる必要がある。
  • Elastic IP アドレス
    EC2に割り当てるグローバル固定IPアドレス。(構成にもよるけど)EC2起動時にはグローバルIPが一つ割り当てられるけど、再起動したら変わってしまう。これで固定IPを割り当てられる。
    起動しているEC2に割り当てていると料金が発生しないが、割り当てずに固定IPだけ取っていると料金が発生するので注意(割り当て後EC2と停めていても料金が発生する)。
  • Virtual Private Cloud(VPC)
    仮想的なプライベートネットワーク空間。無料枠のt2.microはVPC内に設置する必要がある。

その他 ($25クーポンが貰えるよ)

2015/06/30までは「日本語版コンソールリリース記念 AWS クラウド無料体験キャンペーン」とやらで下記に申し込むと25ドル分のクーポンが貰えます。

無料外のちょっとした機能を体験したいとか、複数のインスタンスを起動実験をしたい時などの為に貰っておきましょう

 

と言うことで、次回はEC2を起動してみます。

 

・はじめの一歩!無料で始めるAWS

  1. 登録、請求アラート、用語編
  2. EC2、EBS編
  3. ELB、CloudFront編
  4. RDS、CloudWatch、退会編

はじめの一歩!無料で始めるAWS その2(VPC、EC2、EBS編)

$
0
0

Amazon Web Serviceの無料枠を使ってEC2,ELB,RDS,CloudFrontを使って色々頑張ってみる話の2つめ。前回、使いすぎてもメールが来る設定をして安心したところで、仮想サーバEC2の設定をしてみます。

Amazon EC2とは

仮想サーバです。VPSやリアルなサーバと違うところは、処理能力をブラウザ上で変更できたり、簡単に複製できるところ。CPUやメモリがマウスでポチポチするだけで変更できます(※ポチポチすると無料枠内を外れます)。

OSはRedHat Linux、Windows Server、Amazon Linux、SuSE Linux、Ubuntu、Fedora、Debian、Cent OS、Gentoo Linux、Oracle Linux、FreeBSDなどが選べます。Red Hat Enterprise、Windows Serverなども無料枠対象内です。

前準備(地域の変更)

右上のリージョン(地域)をアジアパシフィック(東京)に変更します。

東京で起動したEC2とカルフォルニアで起動したEC2は別物となります。ログイン後、設定したはずの○○が行方不明って時は、ここが変わっている可能性があるので、ちゃんと東京にしておきます(サービスによっては東京がない場合もあります)。

vpc01

地域を東京にしてからVPCを選ぶ

VPCの設定

今回使うEC2 t2.microはVPC(仮想的なプライベートネットワーク空間)内に設置する必要があるので、まずはこれを設定します。

とは言え、VPCはデフォルトで172.31.x.xのネットワークが作られていますので、このままで良いやと言う方は、この設定は要りません。私の場合は、172.31.x.xがどうにもしっくり来ない&折角なので勉強の為にと、デフォルトのVPCは削除し、192.168.x.xのネットワークを作りました。

デフォルトのVPCを削除すると、ユーザでは復元できません。とりあえずさっさと仮想サーバを使いたい!って方はEC2の作成まで飛ばしてください。

デフォルトVPCの削除

ネットワーキング→VPCを選択します。

左のVPCを選択→アクション→VPCの削除を選択します。警告が出るけどOKとか押して綺麗さっぱりにします。
(これを書いていて思ったのですが、別に削除する必要は無く、新たにVPCを作ってEC2はそちらに入れるでも良い気がしてきました。と言うのもデフォルトVPCを消すとEC2作成時に「No default VPC found」とか言って怒られて嫌な思いをします)

2015-06-23_16h17_05

気に入らないのでデフォルトのVPCを消す。消すと戻せないよ的なメッセージが出ます。

VPCの作成

VPCを選択→VPCの作成を押します。

ネームタグ:適当に(VPCとか)
CIDRブロック:192.168.0.0/16
テナンシー:デフォルト
テナンシーはハードウェアを専有するかどうか(右側のiを押せば詳細な説明が出てきます)

vpc02

サブネットの作成

左側のサブネット→サブネットの作成
ネームタグ:適当に(VPC01-a)
VPC:先ほど作ったVPCをマウスで選ぶ
アベイラビリティゾーン:ap-northeast-1a
CIDRブロック:192.168.1.0/24
アベイラビリティゾーンはリージョン内の区分け(右側のiを押せば詳細な説明が出てきます)

vpc03

のちに設定するRDSで2つのアベイラビリティゾーンが必要となるので、もう一つ作っておきます(RDSを使わない場合は必要有りません)。

ネームタグ:適当に(VPC01-b)
VPC:先ほど作ったVPCをマウスで選ぶ
アベイラビリティゾーン:ap-northeast-1b
CIDRブロック:192.168.2.0/24

インターネットゲートウェイの作成

今のままだとインターネットに出られないので、ゲートウェイを作成します。

左側のインターネットゲートウェイ→インターネットゲートウェイの作成
ネームタグ:適当に(VPC01-gw)→作成
選択→VPCにアタッチ→VPCを選ぶ

ルートテーブルの作成

今のままだとインターネットから内側に入って来られないので、ルートテーブルを作成する。
左側のルートテーブル→既にできてる奴を選択→ルート→編集
vpc04

送信先:0.0.0.0/0
ターゲット:マウスをのせると上で作ったゲートウェイが出てくるのでそれを選択
保存

vpc05

これでEC2を起動するネットワークの箱ができました。

参考URL

EC2の作成

前準備

リージョンが東京になっていることを確認します。

インスタンスの作成

サービス→EC2

ec2_01
インスタンスの作成→クイックスタート→お好きなOS

ec2_02

ec2_03

無料期間終了後も無料のOSはいったいどれなんだろうか…

無料利用枠対象の物は、左側のチェックボックスで絞り込みができますが、無料枠が終わった1年後どうなるかが分からなかったのでAmazon Linux AMIを選びました。詳しい方教えてください。

インスタンスタイプの選択

無料利用枠の対象であるt2.microを選びます。

ec2_05

でかでかと無料対象はこれって書いてある

VPCの選択

上のVPC作成時にデフォルトVPCを削除していると、「デフォルトのVPCが見つかりません」と、でかでかとでて怖い思いをしますが、無視して、ネットワーク、サブネットを上記で作った物に設定します。今回は、
ネットワーク:192.168.0.0/16
サブネット:192.168.1.0/24

ec2_06

この赤文字を見て嫌な汗が流れた

ストレージの追加

無料枠の少し下、25GBをSSDで割り当てました。

ec2_07

無料枠は30GBまで

インスタンスのタグ付け

名前を付けておく

ec2_08

セキュリティグループ

下図ではMYSQL、HTTP、SSHはVPC内からのみ接続可にしていますが、接続テストのために、いったんSSH、HTTP、Pingの送信元は0.0.0.0(どこからでも)や、自分が使用しているグローバルIPにしました。

タイプ ポート 送信元
HTTP 80 0.0.0.0/0
SSH 22 0.0.0.0/0
MySQL 3306 192.168.0.0/16
カスタムICMP Echo Reply 0.0.0.0/0
カスタムICMP Echo Request 0.0.0.0/0
ec2_09

図では違いますが、SSHのみ外部からつながる設定にしました

インスタンス作成の確認

内容を確認して、作成を押します。

ec2_11

SSH接続キーの作成&ダウンロード

作成したEC2へ接続するためのsshキーをダウンロードします。使い方は後述。
キーペアのダウンロードを行ったら、インスタンスの作成を押します。

ec2_12

ここで「デフォルトのVPCが見つからないのでサポートに問い合わせよ」みたいなエラーが出てきたら、いったんログオフして30分後くらいに再度EC2の作成を行います(出たときは嫌な汗出た)。

インスタンス一覧で起動していること、パブリックIPが振られていることを確認して、パブリックIPをメモします。

ec2_13

SSHで接続する

上記のパブリックIPへ接続します。

Windows + PuTTYなどで接続する場合は、ダウンロードしたpemをPuTTYgenを使用し、PuTTY用のppkに変換する必要があります。

変換した秘密鍵(ppk)を使用し、「ec2-user@パブリックIP」で接続します(ユーザ名は固定)。

黒くて見慣れた画面が出たら、sudo yum -y updateでもしておきましょう。

2015-04-28_17h07_02

見慣れた黒い画面。なんだか嬉しい。

次回用にロードバランサーを使いたいので、ヘルスチェックのためのWebサーバを入れます。


sudo yum -y install httpd
sudo service httpd start
sudo chkconfig httpd on

vi /var/www/html/check.html
hoge

curl http://パブリックIP/check.html
何か返ってくることを確認。

あとはお好みでサーバ設定を。

次はロードバランサーのELBとCDNのCloudFrontを設定します。

 

・はじめの一歩!無料で始めるAWS

  1. 登録、請求アラート、用語編
  2. EC2、EBS編
  3. ELB、CloudFront編
  4. RDS、CloudWatch、退会編

はじめの一歩!無料で始めるAWS その3(ELB、CloudFront編)

$
0
0

前回まででEC2とWebサーバ+αの設定が終わりました。
今回はロードバランサーのELB、CDNのCloudFrontを設定します。

Elastic Load Balancing(ELB)って?

ロードバランサーです。外からのトラフィックを良い感じに分配してくれたり、サーバの一台が落ちても良い感じに他にまわしてくれたりします。

サーバが2台あれば、負荷分散、冗長化などELBを使う意味もあるのですが、現在の1台構成(無料枠)でELBを使うメリットは… 凄くサーバ負荷がかかったときに無料枠内で2台のEC2を起動したり、ELBにつくパブリックDNS名は再起動しても変わらないので、EC2の再起動が怖くない(ElasticIPつければいいだけですが)… くらいなのかなぁ。勉強の為にやってみました。

ELBの設定

EC2→ネットワーク&セキュリティ→ロードバランサー→ロードバランサーの作成

elb02

ロードバランサーの定義

プロトコルは今回80しかないので、それで。
利用可能なサブネットをクリックし、192.168.1.0/24のサブネットを選択→次の手段

elb03

セキュリティグループの割り当て

新しいセキュリティグループ→名前:適当(lb-web)、プロトコル:HTTP、送信元:任意の場所
→次の手順

elb04

ヘルスチェックの設定

pingパス:/check.html
(EC2のhttpdで設定したチェック用のhtmlの場所)
→次の手順

elb06

ここでは/だけど、実際にはEC2編の最後に作ったファイルを1欄へ

EC2インスタンスの追加

どのEC2インスタンスをロードバランサーで制御するかを選択する
上記で作ったEC2を選択し、次の手段へ

elb07

タグ名の設定

キー:Name 値:任意(elb-web)

確認

設定を確認して作る

起動確認

起動直後はヘルスチェックが行われて居らずステータスがオレンジや赤色になっているが、数分ほっておくと、緑に変わる。緑に変わらなければ、ヘルスチェックが間違っていたりするので設定を見直す(中身が0バイトのファイルだとダメだった)。

緑に変わったら、DNS名を控え、ブラウザでアクセスしてみて、想定したWebページが出るかどうかを確認する。

elb08

DNS名でテストを行う

独自ドメインを割り当てる場合は、”独自ドメイン名 CNAME ELBのDNS名” みたいな感じでDNSのCNAMEの設定をします。再起動や負荷によって増減/変更するらしいELBのIPアドレスをAレコードとかで指定しちゃダメ。

左のネットワークインタフェースを見ると負荷が無くても2つのグローバルIPが割り当てられているのが分かります。

elb09

負荷にあわせてIPアドレスが自動的に増減するらしい

CloudFrontって?

CloudFrontはコンテンツデリバリネットワーク(CDN)とか言う、全世界にあるコンテンツ用キャッシュサーバみたいなもの。ELBと同じく、設定するとホスト名が付くので、ドメイン名 CNAME DNS名と設定すると使えます。

CloudFrontの設定

ストレージ & コンテンツ配信→CloudFrontを選択→Create Distributionを押します。

Web→Get Startedを選択します。

Origin Settingsで、前回設定したELBを選択。

Webサーバで名前ベースのバーチャルホストを使っている場合はHOSTヘッダーを転送させます。

2015-06-23_17h34_12

バーチャルホストを使ってる場合は、Hostヘッダを転送させる

作成後表示される、DNS名にアクセスして、ELB配下のサーバにアクセスできることを確認します(バーチャルホストを使用している場合は、DNSサーバのCNAMEでこれに割り当てます)

ただ、上記の設定だと全てキャッシュされてしまいます。本文がキャッシュされると、ちょっと間違えて変更したいときに直ぐに反映されないため、画像のみCDNを使う設定にしました。結果を先に言うと、想定している形ではできませんでした。

画像のみをCloudFrontで配信


.htaccess
# for amazon Cloud Front
RewriteCond %{HTTP_HOST} ^hoge\.example\.com$
RewriteCond %{HTTP_USER_AGENT} !^Amazon\ CloudFront$
RewriteRule ^(.*)\.(png|jpg)$ http://XXXXXXXXXXXXX.cloudfront.net/$1.$2 [NE,R=302,L]

確かにこれで、画像のリクエストが(毎回)EC2まで届いて、mod_rewriteの機能でpngとjpgは2回目以降CloudFrontで配信されました。

ただ、今回やりたかったのは若干 特殊なのですが次の形。

  • WordPressマルチサイト(apacheバーチャルホスト) + 画像のみCloudFrontで配信

WordPressのマルチサイトでは、画像も含めhostヘッダーを見て、内部的に振り分けているようなのですが、上記の形でXXXXXXXXXXXXX.cloudfront.netに飛ばしてしまうと、hostヘッダが書き換わってしまい、正常に動作しません。

「スイス製のアーミーナイフ」mod_rewriteならきっと良い方法があるような気はするのですが、やり方が分かりませんでした。こんな風にしては?等ありましたら教えてください。

 

次は最後。RDSを設定します。

 

・はじめの一歩!無料で始めるAWS

  1. 登録、請求アラート、用語編
  2. EC2、EBS編
  3. ELB、CloudFront編
  4. RDS、CloudWatch、退会編

はじめの一歩!無料で始めるAWS その4(RDS、CloudWatch、退会編)

$
0
0

前回まででEC2、ELB、CloudFrontで遊んだので、最後はデータベースのサービスRDSと、CloudWatchで見るEC2のCPUCreditの話。RDSのエンジンはMySQLを選んだ場合の設定方法です。

RDSとは

RDSはMySQL、PostgreSQLをはじめとしたRDBを、OSやRDBをインストールすることなく利用できるサービス。インストール作業はありませんが、データベースの設定ファイルはちゃんといじれます。

いつもの確認

いつもと同じく、リージョンが東京になっていることを確認し、サービス→データベース→RDSをクリックします。

rds02

前準備

DBインスタンスを作る前に、通信するためのサブネットの作成、セキュリティグループの作成、DB用設定ファイルを作っておきます。

DB用サブネットの作成

RDSとEC2を通信させるには、VPC編で作ったネットワークで通信できる必要があります。

RDSはより良い感じに使えるように、セットアップ時に2つの異なるアベイラビリティーゾーンのサブネットに入れてあげる必要があります。1つしか作っていない場合は、ネットワーキング→VPCを開き(実際には使わないけど)サブネットの作成→アベイラビリティーゾーンの異なるサブネットを追加します。

rds03

こちら側で接続するEC2が無いけどインストールに必要

DBサブネットグループの作成

RDSダッシュボード→サブネットグループ→DBサブネットグループの作成

名前:適当(db)
説明:適当(db)
VPC ID:VPCで作ったIDを選択
アベイラビリティーゾーン:ap-northeast-1x(VPCで作ったサブネットの1つ)
サブネットID:VPCで作ったサブネットの1つを選択
追加
アベイラビリティーゾーン:ap-northeast-1x(VPCで作ったサブネットの1つ)
サブネットID:VPCで作ったサブネットの1つを選択
追加
作成
します

rds04

VPCのセキュリティグループの設定

RDSに適用するセキュリティグループを設定します。

ダッシュボードからネットワーキング→VPC→セキュリティグループの作成
ネームタグ:適当に(db)
グループ名:適当に(db)
説明:適当に(db)
VPC:作ったVPCを選択

2015-05-19_11h32_06

インバウンドルールの設定

インバウンドルール→編集
タイプ:MySQL(3306)
送信元:VPCの範囲内(今回は192.168.0.0/16)

2015-05-19_11h28_56

MySQLの設定ファイルの作成(パラメータグループ)

デフォルトのMySQLの設定を使うと日本語関係があんまりよろしくなかったりするので、その辺りの設定ファイルを作っておきます。

パラメータグループ→パラメータグループの作成

rds08

Parameter Group Family:使うmysqlのバージョンを選択
Group Name:適当に(Wordpress_jp)
Description:適当に(Wordpress日本語用)

rds09

選択→パラメータの編集

rds10

フィルタ→変えたいパラメータを入力
値の編集→変更
変更の保存

今回は下記のように設定しました。

character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_results utf8
character_set_server utf8
slow-query-log = 1
long_query_time = 2

rds11

フィルタ機能を使うと楽です

RDSの作成

ようやく作成です。

インスタンス→DBインスタンスの起動

rds05

エンジンの選択

今回はMySQLを選択しました

rds06

本番稼働用?

無料枠なので「いいえ」を選択します。

rds07

DB詳細の設定

DBエンジンのバージョン:設定ファイルと同一のバージョン
DBインスタンスのクラス:db.t2.micro(無料枠)
マルチAZ配置:いいえ
ストレージ:10GB

インスタンスの識別子:適当に
マスターユーザの名前:適当に(管理ユーザid)

rds12

ちなみに、無料枠以外の設定を選択するとちゃんと教えてくれるので安心です。

rds13

無料にならない組み合わせを選ぶとちゃんと教えてくれる

詳細設定

VPC:作ったVPC
サブネットグループ:EC2と同じサブネットグループ
パブリックアクセス可能:外部から接続しないので いいえ
アベイラビリティーゾーン:選択
VPCセキュリティグループ:このページ上部で作ったDB用のセキュリティグループ

データベースの名前:初期で作るDB(wordpressとか)
DBパラメータグループ:このページ上部で作ったパラメータ

rds14

DBパラメータグループを上記で作った物に変更する

バックアップは7日としました。

rds15

DBインスタンスの起動

ステータスが利用可能になるまでは結構時間かかりました(5分程度?)ので、ちょっと休憩でもしておきましょう。

rds16

接続確認

ステータスが利用可能に変わったら、EC2内から接続してみます。
RDSダッシュボード→インスタンス→起動してるdbの▼→「エンドポイント」をメモします。

2015-05-19_12h18_13

EC2にログインし↓等を参考にMysql 5.6 クライアントをインストールします。


vi /etc/my.cnf
[client]
default-character-set = utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

mysql -u 設定したマスターユーザ -p -h dbのエンドポイント

とかして、接続、show databases;とかして、上記の設定で作ったDBが存在していることを確認します。

ちなみに設定では、スロークエリログを出す設定にしました。ログの確認方法は↓。

CPUCreditについて(CloudWatch)

t2系のインスタンスは、CPUを使わないときにエネルギー(クレジット)を貯めておいて、使うときになったらエネルギーを使って普段以上の性能を使える(バースト)って機能が付いています。それがCPUクレジット。1クレジットで1分間バースト可能。なんだかゲームっぽい。

無料利用枠のt2.microは、

ベースライン性能 1時間あたりに貯まるCPUクレジット 最大チャージ料
t2.micro 10%  6 144

で、ベースラインを越えたときにクレジットが消費され、越えてないときに貯まります*1。クレジットが無くなったら、強制的に10%の性能しか使えなくなるみたい。

どれくらいのクレジットが消費され、現在貯まっているかはCloudWatch→EC2から見ることができます。

で、しばらく人を入れて運用して見てみたところ…

CPUクレジットは徐々に右下がりで少なくなって、全然回復してくれていません。もう少しCPUを使わないように工夫しないとt2.microでは厳しい&このままほっておくとガツンとCPUを使って裁けたとしても、回復できずいつかは使い物にならないときが来ると言うことでしょうか。詳しい方教えて下さい。

2015-05-19_15h08_30

人を入れて使うと、最大値の144には回復しそうもないの図

*1
クレジットは整数で減っていくのかと思っていたのですが、CPUCreditUsageを見る限り、0.0Xとかの単位で減ってます。CPU Utilizationを見る限りは10%を越えているようには見えません。CPUを使ったら減るもの=CPUCreditなのかもしれません。

2015-05-19_15h10_50

これを見る限り10%は越えてない気がするけど、クレジットは消費されて行っている。

参考

その他の資料

性格にもよると思うのですが、一通り触った後に読むと理解もしやすくなります。
Amazon公式でいくつか初心者向けの資料が出ています。

  • AWS 初心者向けWebinar 利用者が実施するAWS上でのセキュリティ対策
    http://www.slideshare.net/AmazonWebServicesJapan/aws-webinar-47323216
    ・セキュリティに関する不安
    ・AWSに関する簡単なおさらい
    ・ネットワークセキュリティ
    ・論理アクセス管理
    ・データの保護
    ・監視・ログ

最初に読んでおけば色々捗りそうだけど、手を動かさないと眠くなっちゃうんですよね。

一年後どうするか

無料期間が終わった後どうするか… 自分がどんな設定をしたか覚えてない場合は、いっその事 解約しちゃうのが早いかもしれません。他の所へ引っ越すのであれば、初めからDockerとかで作るのも良いのかもしれませんね。

解約する

アカウントの最下部の「アカウントの解約」を押します。

2015-06-24_09h40_04

RDS等を使わず小さくする

本番運用しながらだとなかなか厳しい部分もあるかもしれませんが、EC2インスタンスのコピーを取り、そちらで作業して良い感じに切り替えとかはクラウドっぽくて良いかもしれません。

他社へ引っ越しする

再度、一から構築すると言うのは面倒ですよね。クラウドモノは競争も激しく値段も競い合っていますので、初めからOSをCoreOS等にして、Dockerで環境を組み、Dockerコンテナのみ他のクラウドに移すと言うのも楽しい気がします。

最後に

他のクラウドものも触っていますが、AWSはホント色んな事ができますね。ただ、できることが多い分、(料金も含め)分かりにくい。他社がシンプルな物をと言うのを売りにしている気持ちがよく分かります。

あー。でも面白かった。

 

・はじめの一歩!無料で始めるAWS

  1. 登録、請求アラート、用語編
  2. EC2、EBS編
  3. ELB、CloudFront編
  4. RDS、CloudWatch、退会編

辛め×ジャンクな食べるラー油の作り方

$
0
0

カリカリのニンニクたっぷり、味付けはウェイパーと塩、しっかり辛い「食べるラー油」の作り方。

“辛い”食べるラー油が食いたい

食べるラー油。2010年前後に流行し 一時は沢山の種類が出て、スーパーでは元祖(=桃屋)を買うことが出来ず オークション等でも高値が付いていました。確かにそれまで出ていた「赤いだけの辛い液体」とは異なりシャリシャリとした具が美味しかったです。

ただ、桃屋のは「辛そうで辛くない」のです。シャリシャリ食感はそのままで、もう少し しっかり辛い食べるラー油を食べるには自分で作るしか無いと思い検索するも、当時ネットで出てくるレシピは桃屋に近いタマネギの甘さを感じる「辛そうで辛くない」ものばかり。

今回はあのブーム以降何度か作っている、ニンニクたっぷりジャンクな味わい&ちゃんと辛い(激辛では無い)食べるラー油のレシピを紹介します。

材料

できあがり量700g(大瓶1)

  • サラダ油 250cc(ごま油との割合は変更可能。後述)
  • ごま油 250cc
  • 青ネギ 1本(風味付け。味に差は出ますが無くても可)
  • タカノツメ 15本
  • 韓国唐辛子粉 100g(風味付け。味に差は出ますが無くても可)
  • 白ごま 大さじ1
  • ガーリックスライス(乾燥) 100g
  • ウェイパー 小さじ1.5
  • 塩 大さじ1.5
  • 醤油 小さじ1

作る分量は、少しでも多くても手間は一緒なのでがっつり作っていますが、1人なら半量で良いと思います。ごま油を使うとコクのある味となりますが、全てサラダ油でもサラサラとした感じで美味しいです。
生ニンニクスライスからカリカリのフライドガーリックを大量に作るのは手間がかかり難しいのでオススメできません。失敗すると焦げる or 油の中で粘土状に固まり やる気が削がれます。

業務スーパーのが安いけど、使い切れない

業務スーパーのガーリックが安いけれど、使い切れない

作り方

  1. 青ネギを適当なサイズに切る。
  2. タカノツメを小さく切る(輪切り or みじん切り)。辛いのが好きであれば種も入れる。今回は3本だけ種を入れました。

    今回はこんな感じで

    今回はこんな感じで

  3. ガーリックスライスを袋にいれ 砕く。

    適当な大きさになるまで砕く

    適当な大きさになるまで砕く

  4. ウェイパー、塩、醤油を軽く混ぜる。
  5. サラダ油とごま油を混ぜあわせ、鍋に入れる。
  6. 極弱火で5の油を温める。
  7. 青ネギを投入、良い香りがして緑~薄茶色くなるまでほっておく。

    フツフツ青ネギ良い香り

    青ネギの香味油は良い香り。弱火でじっくり放置する。

  8. 青ネギを取り出す→捨てる。
  9. 弱火にしてガーリックスライスを投入、じっくり揚げる。

    写真では何だか分からないけどきつね色になるまで温める

    写真ではわかりにくいですが きつね色になるまで揚げる

  10. ガーリックがこんがりきつね色になってきたら15秒ほど中火に。カリッとさせる。焦げないように注意する。
  11. 中火のままタカノツメと白ごまを投入→かき混ぜる
  12. 韓国唐辛子粉を入れ”火を止める”→かき混ぜる
    10~12は15~30秒くらい。唐辛子は直ぐに焦げるので注意してください。

    一気に赤くなる。焦げないように気をつける。

    唐辛子が焦げないように気をつける。

  13. ある程度 油の温度が下がったら、4の調味料へ少量の油を入れよく溶かす

    平和になった

    平和になったラー油の図。油が赤い。

  14. 油が触れられる位の暖かさになったらを13を少しづつ回し入れ溶かす

    ぐるぐる混ぜる

    調味料をぐるぐる混ぜる

  15. 瓶等に移し1日放置。調味料は沈澱しがちなので瓶を分けるときは良い感じにしてください。
    1日以上放置すると味がなじみます
  16. 召し上がれ

    完成

    完成。全てがラー油味になるけど何にかけても美味い。

簡単で美味しいですよ。

 

[SEO] 定期的に検索順位を計測する話(サーバで実行&無料)

$
0
0

サーバで定期実行し、google、bing、+αの検索順位を定期的に計測→グラフ化する無料ツールSerposcopeのインストール方法と使い方。

2016/02/19追記——————————

Serposcope 2からjavaベースのソフトウェアになりました。機能は大きく変わりません(bing、その他の検索順位が出せません)が、全く異なるソフトになったため下記の手順ではセットアップできません。また、バージョン1はサポートが終わってしまい、検索順位が正常に取得できなくなりました。バージョン2をサーバ実行はその内記事を書きたいと思います。

————————————————–

コレなに?

  • 定期的(自動的)にサーバで動いてgoogle、+αの検索順位を測定してグラフを書いてくれます
  • オープンソースで無料のソフト。中~長期的な検索順位の計測が可能です
こんな感じで、定期的に設定したキーワードの順位グラフをかいてくれます

こんな感じで、定期的に設定したキーワードの順位グラフをかいてくれます

検索順位の計測?

SEO施策チェックの1つとして有効なのが(ライバル企業の状況も含め)定期的な検索順位推移の計測ではないでしょうか。狙っているキーワードの順位がちゃんと上がっているか、下がっているのは一時的なのか/実際下がりだしているのか等など… 有料の良いものはいくつか有るのかもしませんが、無料で定期的にチェックしてくれるツールはさほど多くありません。

従来からある有名なGRC等のツールはPCのディスクトップツールで、毎日忘れず実行する(or PCつけっぱなし)のがちょっと面倒… ほったらかしで1週間に1度程度結果を見たい時などには辛いです。

最近はWordpress等を使い、PHP+MySQL+Cronが使えるサーバも多くなってきました。その隙間的な所に入れておけるのがこのツール(Serposcope)です。

  • 検索順位を計測する無料のWindowsディスクトップツール
    GRC – Google/Yahoo/Bing 検索順位チェックツール
    http://seopro.jp/
  • 現時点のSEO状況、検索順位、キーワード出現頻度などをチェックしてくれる無料のWebサービス
    SEOチェキ!
    http://seocheki.net/

Serposcopeの機能

  • 登録キーワード件数、サイト数無制限で計測
  • ランキング推移のグラフを書いてくれる(日付の範囲指定可)
  • 前回と比べて順位が落ちた/上がったもの一覧表を出してくれる
  • カスタムサーチエンジン機能(標準はgoogleのみ、コードを書けば他のサーチエンジンを増やすことが可能)
  • Googleは海外のGoogleドメインも個別に設定可能
  • Googleのローカルサーチ対応
  • GUIで設定
  • オープンソース
  • カレンダーメモ機能
  • プロキシー対応(1つのIPから多数のキーワード検索ができないため)
  • キャプチャ対応(1つのIPから多数のキーワード検索ができないため)
前回と比べての順位とかも一覧で出る

前回と比べての順位とかも一覧で出る

インストール方法

使用できる環境

  • Webサーバ (Apache/Nginx等)
  • PHP 5.3.8以上
  • MySQL or MariaDB
  • PHP mysql extension
  • PHP Curl extension
  • cronが使える

おそらく、Wordpressが入るレンタルサーバーなんかだと条件を満たしている所が多いと思います。

ダウンロードと配置

もちろんクライアントPCで解凍してから、ftpクライアントで転送しても良いです。

wget https://github.com/serphacker/serposcope/archive/1.0.7.zip
unzip 1.0.7.zip
sudo mv -a ./serposcope-1.0.7 /var/www/html/serposcope(環境にあわせて)
chown -R apache.apache /var/www/html/serposcope(環境にあわせて)
cd /var/www/html/serposcope
chmod o+w ./serposcope/inc

データベースの作成

レンタルサーバーなんかだと管理パネルなどからデータベース&ユーザの追加ができると思いますので、それで作ります。

mysql -uroot -p create database serposcope;
grant all privileges on serposcope.* to serposcope@localhost identified by 'XXXXXXXXXXXXXX';(パスワードは適当につける)
flush privileges;
quit

他の設定(php.ini)

キーワードが多いと検索順位を調べるのは凄く時間がかかる為(後述)、ドキュメントにはphp.iniのmax_execution_timeを0にしろと書いてあるのですが、Wordpress等 他のphpソフトと相乗りしている場合はWordpress側にどんな影響があるかわかりません。怖いのでphp経由ではなくcronで動かすことにしました(php.iniの設定変更は要りません)。

パスワード認証

このソフトには認証機能はついていませんので、WebサーバのDigest認証機能(レンタルサーバーでは.htaccessを使って設定)などで認証する設定にしましょう。

設定方法

Webセットアップ

インストールしたURL/install/へブラウザでアクセスします。

  • http://example.com/serposcope/install/
バージョンチェックなど

バージョンチェックなど。max_execution_timeは変更しなくて良いと思います(後述)

Next押すだけ

DB関連のセットアップ。Next押すだけ

おしまい

おしまい

上記でインストールは終わったので、インストールしたURL(http://example.com/serposcope/)を開きます。

Googleのデフォルト検索場所を日本へ変更(Global設定)

デフォルトではgoogle.comで調べてしまうのでgoogle.co.jpで調べるように変更します(グループ設定時に個別で海外へ変更も可能です)。

上部のOptionsを選び、google→tld→co.jpへ。

Serposcope05

Bingの追加

標準では検索エンジンはgoogleのみです。
他の検索エンジン モジュールは違うところから出す予定らしく、pull requestしても断られていますが、st-a-chさんがpull requestしたBingのモジュールがGitHubに上がっているのでそれをインストールしました。

追加するとこんな風にBingも選べる

追加するとこんな風にBingも選べる

サイト(グループ)&キーワード登録

  1. 上部のNew Groupを押します
  2. グループ名にサイト名等を入力
  3. キーワードにターゲットとしているキーワードを入力
    複数の場合は改行で区切ります
  4. Domainに計測したいサイトのドメインを入力します
  5. 上記でデフォルトを日本にしていればtldはco.jpになっていると思います
    他の国の結果で調べたいときは変更します(com / com.au等)
  6. Saveで保存

基本、これをやりたいサイト分繰り返し行ないますが、キーワードが少ないうちに一度テストをしてみても良い気がします。

Serposcope06

ローカルサーチ機能(位置情報を変えて検索)

現在、googleでは現在位置によって検索順位が異なります(ベニスアップデート)。

その辺りを良い感じに対応して出してくれるのが上記のlocalだと思うのですが、自分が試した限りでは上手く動きませんでした。

ソースコードを見ると、
http://www.google.co.jp/uul?muul=4_18&luul=ロケーション&usg=キーワード&hl=en
を送っているので、手で

http://www.google.co.jp/uul?muul=4_18&luul=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%9D%89%E4%B8%A6%E5%8C%BA&usg=%E3%82%AB%E3%83%95%E3%82%A7&hl=ja

と打ってみたのですが、

“場所を認識できません。 指定範囲を広げるか、周辺の場所を指定してみてください。”

と出て検索できません。

“google luul muul”等で検索してみても、これはと言うドキュメントも出てきませんでした。

と言うことでこの欄は空欄で設定しました。残念。

リクエストURLで現在位置を変更する方法をご存知のかたいらっしゃいましたら、教えて下さい。

注意(押してはいけないボタン)

押したい位置に実行ボタンが有りますが、この2つは押してはいけません(後述)

Serposcope07

このボタンは押さないほうが良い

定期実行

サイトの追加ができたらテストと定期実行の設定をします。

手動実行(テスト)

cd /var/www/html/serposcope && /usr/bin/php /var/www/html/serposcope/cron.php

結果が返るのは思っているよりも遅いです(proxyを設定しない場合)。

上記の設定(デフォルト)だと1リクエスト/30秒。内部的には10件づつ検索するので該当キーワードが90番目にあった場合は、1キーワードでも270秒かかります。参考までに現在私が計測している70キーワードで3時間ほどかかっています(なぜこうなっているのかはフォーラムに書かれています)。※遅いからと言ってCtrl+Cで止めてはいけません(後述)

定期実行の設定

上記がうまく行けば、

crontab -e
00 1 * * * cd /var/www/html/serposcope && /usr/bin/php /var/www/html/serposcope/cron.php 1>/dev/null 2>&1

など、cronに登録します(例では毎日1:00に実行)。レンタルサーバではコントロールパネル等にcronを設定できる場所があると思います。

トラブルシューティング

まだβ版ということもあり、若干作りは甘いです。何度か体験したのは定期的にチェックしてくれないこと。ほとんどは下記が原因でした(バージョンが上がれば修正されるのかもしれません)。

  • Webから「Force run」等を使って実行→途中で止めた/エラー等で止まった
  • 手動で実行したが遅いのでCtrl+C等で止めた
    →データベースにゴミデータが残っているので次回から動きません

直し方

  1. serposcopeが動いてないことを確認
  2. phpmyAdmin等でserposcope用に作成したデータベースの?????run(?????は最初に設定したprefix)テーブルを見る
  3. dateSTOPカラムがNullになっている場合→そのレコードを消す

他の検索エンジンの追加

検索エンジンはモジュールと呼ばれるモノを書けば追加できるようになっています。

楽天、amazon、るるぶ、じゃらん等、うまく書けば順位が出るんじゃないかなぁと思います(と書きつつ、実はちょっとだけ楽天を挑戦してみたのですが、proxyまわりがややこしくて上手く動きませんでした…)。yahoo japanだけでも時間作って作っておきたいですね。

さいごに

半年以上使用していますが、定期チェックで落ちかけているキーワードに早めに気づけたり、なかなか上がらないので違う施策を練ったりなど助けられています。チェックそのものには時間かかりますが、夜中にかけておけばそんなに気にもなりません。便利ですよ。

古い筆まめの住所録データを無料で変換する方法(fwa→csv)

$
0
0

もうすぐ年末。

年末といえば年賀状印刷… って事でそろそろ準備をしだす方も多いのではないかと思います。裏側はまぁ写真やらなんやら色々頑張るとして、宛名に関してはパソコンで印刷したほうがミスも無く楽ですよね。

で、年賀状ソフトの登場ですが、今年 Windows10やMacに変え、新しいPCに入ってた宛名書きソフトは「筆まめ形式も読み込めます」とか書いてあるけど、よくよく見ると対応外。住所録のファイルだけはしっかり保存済みだけど、もちろん古いPCは捨ててる。そんな方への内容です。

■こんな方向け

  • 筆まめ ver 20以前を使っていた(Windows7以上では動かない)。→筆まめWindows対応表
  • 他社 宛名書きソフトの「筆まめ形式も読めます」にだまされた。
  • 宛名印刷だけなので、新しい筆まめを買う気は無い。
  • 住所録ファイル(fwa)は残してある。
  • 住所録ファイルは何とかして使いたい。
  • 古いPC(WindowsXP)はもう無い。

■ちょっとその前に

古いPCが動き、筆まめが動くのであれば、筆まめ起動→下の方法でcsvに変換可能です。

■変換方法

ざっくり言えば、最新の体験版を落として、csvにコンバートするだけです。コンバート機能は体験版でも問題なく動きます。

  1. 筆まめ ver27の体験版(2016年末最新バージョン)をダウンロード→インストール
    https://fudemame.net/products/hagaki/fudemame/free/

    おすすめツールはチェックを外させてもらう

    最後のおすすめツールはチェックを外させてもらう

  2. 以前作った住所録ファイル(fwaファイル)を開く
    2015-11-27_16h43_39
  3. ファイル→他の住所録形式で保存

    画面はver.22ですが27でも全く同じ

  4. csv形式を選択
  5. 基本「次へ」を押し、最後に「すべてのカード」を選択し開始
  6. おしまい
    あとは表計算ソフトなどで開いて、お好みの形式に並び替え、新しいソフトで開きます。新しいソフトでは微妙に並びが違ったり(姓名を別けないとダメとか)します。表計算ソフトだけではどうしようも無ければ、テキストエディタを使い正規表現でよろしくしましょう。体験版は十分に体験したので、まぁアレな感じにしておきましょう。

■最後に

あーでも表計算ソフトやらなんやら色々めんどくさいって方は、最新版を下からポチッと。¥2,000を切る価格(安いselect版は年末~年始のみの販売) で面倒な手間が省けるのであれば悪くない選択だと思います。

ダウンロード版なら今すぐ使えて、お値段お安め。時間を金で買う。それもまた良い方法だと思います!

筆まめSelect2017 [ダウンロード] 筆まめSelect2017 [ダウンロード] 筆まめVer.27 アップグレード・乗り換え専用 筆まめVer.27 アップグレード・乗り換え専用 筆まめSelect2017 年賀編 [ダウンロード] 筆まめSelect2017 年賀編 [ダウンロード]

NAS×Dockerでお手軽にLinux環境を作った話

$
0
0

NASのDocker機能を使ってお手軽にLinux環境を作った話。NASで小規模なLinux環境を作りたい方の参考になれば幸いです。最近のものであれば他メーカーのNASでもよく似た感じなのだと思います(QNAP ContainerStation)。

今のNASはホント色々できる

かつての家庭SOHO用NASは、”WindowsとMacからファイル共有ができる”だけでしたが、今時のNASはホント色々できてファイル共有はもちろん、専用スマートフォンアプリによる外部からのファイル・写真・動画の共有/閲覧、DropboxやGoogleDriveとの連携、DLNAやDBなどの各種サーバ機能などなど、ちょっと良い奴になるとモニターがつながってhdmiから映像が出たり、VMの中でWindowsを動かすこともできたりして、もうPCサーバと一緒と言った感じになってます。

今時はNASなんか買わなくてもインターネットのストレージサービスの値段も下がって良い感じになっていますが、光回線が来てない田舎に住んでいるので上りの速度が遅すぎて、オンラインサービスでは まだまだ大きなファイルを気軽には扱えません。

管理画面もブラウザで動いているとは思えないリッチな感じに

管理画面もブラウザで動いているとは思えないリッチな感じに

それって小型のPCじゃダメなの?

サーバものに精通していて時間と予算さえあればPCでも良いと思います。

当初は小さいMini-ITXなどで作ろうかなぁとも思ったのですが、ディスクを数本入れられるマザーボード&ケースや、静音性、耐久の事を考えて色々選ぶと結構なお値段&大きくなる&何より面倒くさい… と言うことでNASを探しました。

安定して早く動くNASが欲しい

価格.comや2chなんかを見ていると、いろんな製品があることがわかり 今回の予算帯(3万前後)では下記の製品で迷いました。

で、結局選んだのは、下記の製品。

ちょっとその前に(セキュリティ)

QNAPは普通に設定すると勝手に「NASのファイルを外から取れるようにしておきましたよ。便利でしょ!」機能をONにしてしまうので、QNAPにログイン→myQNAPcloud→自動ルータ構成→UPnPポート転送を有効化のチェックを外しましょう。最近のアプリてんこ盛りNASは初期状態で色んなサービスが上がってるのが怖いです。

2016-10-11_13h08_42

なぜDocker?

上記のNASはどれもLinuxベースなので、SSHでNASへログインし、あれこれすると(場合によってはマウスでポチポチするだけで)そのまま良い感じのLinuxマシンになります。ただ、用意されてない事をちょっとでもしようとすると、よく使うコマンドすら入れるのに苦労したり、再起動したら設定が消えたりと、「制限の回避」に時間と労力を使うのでちょっと面倒。

Dockerなら速度も早く、NASのOSとは分離された仮想環境ができるので上記のような制限も受けないため、従来通りの環境をストレス無く作ることができます。作った環境を丸々引っ越せるのも便利です。

QNAP ContainerStationのインストール

Docker環境を作るのはマウスでポチッとすれば良いだけでした(ver 1.2.19.593)。

このボタンを押すだけ

このボタンを押すだけ

ただ、今回の場合はポチッとしただけでは1時間位待ってもブラウザが白くなり先に進まなかったので、sshでnasへ接続し、インストール時に決めたDockerのデータが入る場所の権限の変更とnasの再起動をしたら使えるようになりました(権限の変更が必要だったのかは不明)。まぁ使えているのでこのままにしておきます。


chown -R admin.administrators ./container-station-data

ContainerStationを使うと、docker serverの設定変更、コンテナイメージのダウンロードやコンテナ生成、コンテナの起動/停止、ログの確認などをブラウザから行えます。黒い画面は一切無し!

2015-12-22_09h49_05

すっきりして見やすい画面

コンテナイメージのダウンロード

左側の「コンテナの作成」を選ぶとQNAP推奨イメージが幾つかでてきて、右上の「イメージ検索」に入力するとDockerHubのイメージを探してくれます(レジストリは手動でも追加可能)。

ただ、注意したいのは今回の機種(TS-231+)のCPUはARM系。数多あるDockerHubのイメージの殆どはIntel系なので、ほとんど使えません。買う前から主要ディストリビューションのARM版があることは確認していたのでまぁいいやと思っていましたが、いざ作る段階になると(人が作ったイメージを使う方が楽なので)やっぱり若干面倒でした。

初回はダウンロードと下記コンテナ作成と同時におこないます。直ぐにローカルディレクトリをマウントしたい場合などはこの時点で設定(下記 コンテナの作成を参照)をおこないます。

イメージのダウンロードは結構時間がかかり、ブラウザに何も出てこないので若干心配になりますが、ほっといたらダウンロード完了→コンテナが起動します(今回はHTML5ベースブラウザでVNCが使えるubuntu-noVNCでテストしました)。

推奨"画像"は今のところarm系だと6つだけ

推奨”画像”は今のところarm系だと6つだけ

ARM系CPUの場合イメージ検索時は「armhf」を

ARM系CPUの場合イメージ検索時は「armv7」や「armhf」をつける

コンテナの作成

ここで、Dockerfileに記述するような内容を設定します。設定項目はこんな感じ。

  • コンテナ名
  • コマンド
  • エントリーポイント
  • CPUリミット、メモリー制限
  • NAS起動時の自動起動設定 !
  • 環境変数
  • ネットワークのポートフォワーディング
  • ローカルディレクトリをマウント/他のコンテナの接続

ローカルディレクトリのマウント場所をNAS内の共有ディレクトリ(/share/??????/hoge)などにしておくとDocker内で生成されたファイルがそのまま外部から閲覧/編集できて幸せです。

コンテナ名や自動起動の設定。ボリュームの変更などは詳細設定を押す

コンテナ名や自動起動の設定。ボリュームの変更などはコンテナ生成前に左下 詳細設定を押す。

ポートフォワードの設定(生成されたコンテナはグレーアウトで変更できません)

ポートフォワードの設定(生成されたコンテナはグレーアウトで変更できません)

ローカルディスクにマッピング。

ローカルディスクにマッピング。1がNAS、2がDocker内の場所。

色々設定変更→コンテナのコミット

ベースイメージでは色々と過不足があったので作ったコンテナに接続し、ソフトを入れたり消したりしました(ちなみに今回のイメージのsudoパスワードはubuntuだった)。

一旦この状態をイメージ化したかったのですが、(今のところ)Web上にはコミットするようなボタンはありません。sshでnasに接続し、dockerコマンドでコミットしました(今回は同一イメージに上書き)。この辺りは今後のバージョンアップで良い感じになっていきそうな気がします。


docker commit ubuntu-novnc-armhf-1 colinhuang/ubuntu-novnc-armhf
(docker commit コンテナ名 イメージ名)

コンテナの再作成

ContainerStationから上記コンテナを削除し、先ほどコミットしたローカルイメージからコンテナを生成→設定内容が正しいことを確かめます。ちゃんと動いてる。楽ちん。

Dockerfileからのビルド

これを書いている時点ではGUIからDockerfileをペーストしてビルドみたいな機能はありません。SSHでログインし、docker buildは可能です。

最後に

NASでDockerなんて、もうちょっと不安定なものかなぁとも思っていましたが、管理ツールのデキも良く、なかなかよい感じでした。

おまけ機能を越えている多機能NAS。数年経つとNASって言葉の定義も変わってそうだなぁと思いました。いやー便利な世の中になったものです。

【2016/10追記】数ヶ月使ってみたのですが結果としては、動きはするのですがこの機種ではメモリが少なく(最大1GB/後付できない)、メモリ不足がNASの性能にも影響出ている気がしたので運用をやめました。Dockerをもう少しましに使いたいなら、もう1ランク上のIntel CPUがのっていて、メモリも後付で最大8GBまでつめるTS-251+が良さそうな気がします。

QNAP(キューナップ) TS-251+ 専用OS QTS搭載 intelクアッドコア2.0GHz CPU 2GBメモリ 2ベイ ホーム/SOHO向け プライベートクラウド機能対応 NAS 2年保証 QNAP(キューナップ) TS-251+ 専用OS QTS搭載 intelクアッドコア2.0GHz CPU 2GBメモリ 2ベイ ホーム/SOHO向け プライベートクラウド機能対応 NAS 2年保証

ルートディレクトリが非WordPress環境でマルチサイトを作る方法

$
0
0

ルートディレクトリ(/)は非Wordpressの環境で、サブディレクトリ型マルチサイト(/test1,/test2)を作る方法。

なにこれ?

http://www.example.com/は静的なページや他のシステム等が入っておりWordpressは入れられない状態で、http://www.example.com/test1, http://www.example.com/test2, http://www.example.com/test3等をwordpressのマルチサイト機能で作る方法。

なんとなく簡単にできそうなのですがWordPressのマルチサイトはindex.phpが受けてから良い感じにしているので、できそうでできないのです。

multisite

こういう構成で作りたいけど….

結論

現在のところWordpressの標準機能ではできません。

  • http://www.example.com/multisite/
  • http://www.example.com/multisite/test1
  • http://www.example.com/multisite/test2
  • http://www.example.com/multisite/test3

をマルチサイト機能で作ってからwebサーバの機能で、

  • http://www.example.com/test1 → http://www.example.com/multisite/test1
  • http://www.example.com/test2 → http://www.example.com/multisite/test2
  • http://www.example.com/test3 → http://www.example.com/multisite/test3

な感じでリライトします。

※WordPress 4.4.1ではパーマリンク設定も含め正常に動いていますが、将来的にどうなるかは分かりません。設定変更は自己責任で。

他の方法

一番何も考えないで良い方法は、/test1,/test2それぞれにWordPressを入れDBのprefixを違うものにし構築する方法。安全です。ただし設定、プラグインのインストール、アップデート等を含め、手間がサイト分必要となりますので、2、3サイトくらいなら頑張れますが、それより多いと運用の手間が大変です。

マルチサイト機能を使えばそのへんは一括して運用が可能なので管理が楽です。

構築手順

  1. サブディレクトリ型マルチサイトを構築する→正常に動かす。
  2. ユーザからアクセスさせたい位置にディレクトリを作りリライトの.htaccessを設置。
  3. DBの設定変更、クッキー関連の設定変更。

サブディレクトリ型マルチサイトを構築する

一旦目的としている”ディレクトリ外”にサブディレクトリ型マルチサイトを構築します。(若干の手間はかかりますが)WordPress標準の機能なので、新規で作成する場合はさほどハードルは高くないと思われます。

下記の「メイン」にもサイト(ブログ)を作ることができますが、後述の設定の関係でメインは触らずサブのみを使ってサイトを作ったほうが良いです。

  • http://www.example.com/multisite/(メイン)
  • http://www.example.com/multisite/test1(サブ)
  • http://www.example.com/multisite/test2(サブ)
  • http://www.example.com/multisite/test3(サブ)

既にサイトを構築済み/運営中の方は若干面倒ですが、なんとかしてサブディレクトリ型マルチサイトの状態まで持って行きます。DBの書き換え等で上手く行けばラッキーですが、最悪記事をエクスポート→新しい環境へインポートすれば引っ越しは可能かと思われます。

※各マルチサイトで管理ツール等に正常にログインでき、投稿等が上手く動くことを確認します。

アクセスさせたい位置にディレクトリを作りリライト

http://www.example.com/は既に他の静的なページやシステムが動いていると仮定します。

下記URLで静的なファイルがアクセスできるようにディレクトリを作成し、念のためhtmlファイル等を置き問題なくアクセスできることを確認します。ルートディレクトリ(/)のリライト等の設定の影響でtest1,test2,test3に正常にアクセス出来ない場合は下記ディレクトリは除外するような設定を行います。

  • http://www.example.com/test1
  • http://www.example.com/test2
  • http://www.example.com/test3

test1,test2,test3に下記.htaccessを置きます(apacheの場合。nginx等は同じ意味合いの設定をします)。


RewriteEngine On RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(index\.php)$ /multisite/$1
RewriteRule ^(.*)$ /multisite/$1

DBの設定変更

現在の状態ではhttp://www.example.com/test1へアクセスしてもデータベース内で/multisite/test1の情報が残っているため正常に表示されません。

  1. http://www.example.com/multisite/wp-adminでログインし、参加サイト→サイトネットワーク管理者→サイト→全てのサイト→http://www.example.com/multisite/test1の編集を選択。
    2016-02-02_14h38_492016-02-02_14h40_19
  2. サイト URL、設定→Siteurl,Homeをhttp://www.example.com/test1へ書き換え保存。
    既に運用中のサイトの場合はデータベースをエクスポートして/multisite/test1となっている部分を/test1に書き換え、インポートする必要があります。
    2016-02-02_14h41_282016-02-02_14h42_03
  3. http://www.example.com/test1が正常に表示されることを確認します(test2,test3も同様に変更します)。

ただ、現在の状態では、http://www.example.com/test1/wp-adminでユーザ名、パスワードを入れてもログインできません。

クッキー関連の設定変更

そのサイト宛のcookieを削除した後、下記をwp-config.phpに記述します。


define('ADMIN_COOKIE_PATH', '/');
define('COOKIE_DOMAIN', 'www.example.com');
define('COOKIEPATH', '/');
define('SITECOOKIEPATH', '/');

http://www.example.com/test1/wp-admin、http://www.example.com/multisite/wp-admin等で管理ツールにログインできることを確認します。

該当サイトのcookieの削除

該当サイトのcookieの削除。chromeならデベロッパーツールのResources内

参考にしたサイト

結論

運用中のサイトの場合は色々と面倒です。せめてCodexに書かれるくらいな状態なら安心して使えるのですが、どこかに罠があるのかもしれません… このcookieの設定まずいのでは?等ありましたら教えて下さい。

一眼レフデジカメ用の外部電源を自作した話

$
0
0

諸事情で一眼レフカメラの電源を24時間×365日つける必要が出たので、外部電源(ACアダプター)を自作した話。恐らくニコンであれば同じように動くのではなかろうかと思います。

※私の場合はこれで数週間問題なく動いていますが、全ては自己責任で!

純正のACアダプター高い

今回使用したカメラはNikon D70なのですが、メーカー純正ACアダプター EH-5bの定価は強気の12,960円。Amazonで買っても9,000円近くし、EH-5はかなりの機種で使えるにもかかわらず、バッテリーでよくある互換のものはamazon/楽天では見当たりません。

Nikon ACアダプター EH-5b Nikon ACアダプター EH-5b

仕事に使うとか、使用頻度が高いとか、お金をかけても良い用途に使うのであればともかく、今回の用途でこの価格はちょっと厳しい。仕方ないので自作することにしました。

困ったときのgoogleさん頼みで直ぐに出てくるのかなと思ったのですが、天体写真を撮るための大容量外部バッテリー化+バッテリーケースの改造されてる方の情報は多く出てきたのですが、ACアダプターの自作記事はあまりでてきませんでした。一番近いのが下記の記事。

これと、純正のEH-5の仕様を見た感じではACアダプターだけでなんとかなる気がするので、ネットで部品を購入。作ってみることにしました。

純正ACアダプターEH-5の仕様

純正ACアダプターEH-5の仕様

必要なもの

D70には外部電源コネクタと言うのが付いているのですが これが曲者で、特殊な形をしているため これにあうコネクターは市販されていません。上記ページによると、4つのコネクターの内 2本しか使っていない&ブレッドボード等で使用するジャンパーコードがささるとのことなので、それを使いました。

ACアダプターは新品を買いましたが、もっと安く作りたい場合はハードオフ等のジャンクACアダプターコーナーを漁れば数百円で買えると思います。今回は9V/2.5AのACアダプターですが、純正は9.0V/4.5A。フラッシュを使ったりする場合は同等品を買ったほうが良いのかもしれません(不明)。

買ったもの

買ったもの

作り方

作り方って書くほどのことは無いくらい簡単で変換コネクターを作るだけです。

ジャンパーコードが外部電源口にささることを確認(※後述注参照)後、ジャンパーコードの反対側を切り、AC用コネクターにひっつけます。ACアダプターの説明を見て、どちらがプラスかは分かるようにしておきましょう。

あとは、外部電源口(※下図参照)にさし、ACの電源をいれるだけ。普通に使えました。

こんな感じでひっつける。プラスマイナス位置はACアダプターの説明をよく見る。

こんな感じでひっつける。プラスマイナス位置はACアダプターの説明をよく見る。

ジャンパーコードを外部電源口にさす時の注意点

使うコネクターによるのかもしれませんが、ジャンパーの方向によって刺さりませんでした。刺さらない場合は90度回転させると、すんなりささりました&ちょうど良い具合で抜けません。

20160301_194143

刺さらない(硬い)場合はコネクタを90度まわす

外部電源口のどこにさすか

こんな感じで右上(+)と左下(-)にさします。違う場所にしないように注意!

肝心な所が小さいのですが、レンズを左側に、右上がプラス、左下がマイナス

肝心な所が小さいのですが、レンズを左側に、右上がプラス、左下がマイナス

最後に

互換製でも良いのでもう少し安ければ、そっち買うのですがね…

EH-5b , EH-5a , EH-5 を使用するデジカメはこれで全部動くような気がしないでも無いのですが、動いたよーとか動かなかったよーとかデジカメ壊れたよーとかありましたら、コメント欄に入れておいていただけると、他の方が助かると思いますのでよろしくお願いします。

しつこいですが、つなげる場合は全ては自己責任で!

一眼レフカメラをRaspberryPiからリモート制御する話

$
0
0

デジタルカメラをUSB経由でRaspberryPiと接続し、コマンドラインから写真を撮ったりあれこれできるgphoto2を使ってみた話。

パソコンからデジタルカメラのシャッターを切る

デジタルカメラをPCから操る技術は、室内で写真を扱うスタジオ/業界では当たり前の機能(Adobe Lightroomなどを使ったテザー撮影)で、PCでホワイトバランス、絞り、露光量など、各種設定を調節しPCでシャッターを切り、確認は大きなPCの画面…といった感じで使われているようです。

とは言え、そんな機能を自宅PCで使う予定は無いのですが、この機能をLinux(Raspberry Pi)から使えたら、

  • RaspberryPiにつけた各種センサーと組み合わせてシャッターを切る
    人感、傾き、光・音、温度センサーなどと組み合わせる
  • 離れた場所のスマートフォンなどからWeb経由でシャッターを切る
  • cronなどで定期的にシャッターを切って(カメラ内蔵のインターバル設定より長い1日単位とか)RaspberryPiでタイムラプス動画にする
  • 時刻や曜日、周囲の状況など、カメラ本体についていない機能でカメラの設定(iso、シャッタースピード、絞りなど)を自動変更しシャッターを切る
  • 何らかのプログラムと組み合わせてシャッターを切り、画像をどこかに転送したり自動加工する

とかができて、なんだか面白そう。

上記のことはUSB Webカメラを使えばお手軽にできますが、今回は「もう少し画質+ちゃんとしたズーム」が欲しかった+家に古いデジタル一眼レフカメラが転がっていたので、googleさんに聞いた所、gphoto2と言うソフトを教えてもらいました。

Raspberry Pi 3 Model B (本体) Raspberry Pi 3 Model B (本体)

gphoto2の機能

コマンドライン(黒い画面)、ライブラリ(libgphoto2)で下記のようなことができます。

  • カメラのシャッターをきる(写真)
  • 動画を取り込む(対応機種のみ)
  • カメラの設定情報(ISO、絞り、ホワイトバランス、シャッタースピード、クオリティ、フラッシュ、バッテリー情報、などなど)を読み取る
  • カメラの設定情報(カメラのメニューから変更できる部分)を変更する
  • ズームイン・アウト(コンデジなど)
  • カメラ内のデータをコンピュータ側にダウンロード
  • カメラ内のデータを削除
  • などなど
  • 対応OS
    Linux、Mac OSX
黒い画面でシャッターを切る事ができます

ココを見てる人は大好きであろう黒い画面で、シャッターを切る事ができます

対応機種

機種によりできない機能もありますが、キヤノンとニコンのデジタル一眼レフで新しすぎないもの以外はたいてい対応しているように思います。

オークション等でかなり安価に取引されているちょっと古めのコンデジや、最近の高めのコンデジも対応しているので、その辺りでも遊べます。

RaspberryPiへのインストール

新しいバージョンのgphotoを普通に入れようとすると結構面倒らしいのですが、RaspberryPi用(Ubuntuでも動くようです)のインストールスクリプトを作ってくださってる方が居ますので、それを使います。

今回はOSMCに入れましたが、普通のRaspbianでも同じだと思います。上記のページに書いてあるように、

$ wget https://raw.githubusercontent.com/gonzalo/gphoto2-updater/master/gphoto2-updater.sh && chmod +x gphoto2-updater.sh && sudo ./gphoto2-updater.sh

すると、結構時間はかかります(20分くらい)が、無事最新のgphotoが使えるようになりました。

カメラのUSBモード変更(準備)

最近のカメラは多分そのままでも大丈夫ですが、今回使ったNikon D70はカメラのメニューからUSBの転送モードをPTPにする必要がありました。下記のページを見る感じだと古いカメラは設定変更が要る感じです。

接続/動作確認

カメラとRaspberryPiを接続し、カメラの電源を入れると/var/log/messagesに下記のようなメッセージが流れると思います。

Feb 27 07:12:16 osmc kernel: [1082322.281536] usb 1-1.2.4.2: new full-speed USB device number 12 using dwc_otg
Feb 27 07:12:16 osmc kernel: [1082322.386160] usb 1-1.2.4.2: New USB device found, idVendor=04b0, idProduct=0406
Feb 27 07:12:16 osmc kernel: [1082322.386195] usb 1-1.2.4.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Feb 27 07:12:16 osmc kernel: [1082322.386214] usb 1-1.2.4.2: Product: NIKON DSC D70
Feb 27 07:12:16 osmc kernel: [1082322.386231] usb 1-1.2.4.2: Manufacturer: NIKON

動作確認は基本、公式マニュアルのチュートリアルにしたがいますが、一点気をつけるのはRaspberryPiではsudoで実行すること。

$ sudo gphoto2 --list-ports
検出したデバイス数: 4
パス名 説明
--------------------------------------------------------------
ptpip: PTP/IP Connection
usb:001,012 Universal Serial Bus
usb:001,006 Universal Serial Bus
usb:001,003 Universal Serial Bus

$ sudo gphoto2 --auto-detect
型式 ポート
----------------------------------------------------------
Nikon DSC D70 (PTP mode) usb:001,012

$ sudo gphoto2 --summary

現在の設定状態、対応コマンド、設定可能な数値などがダラダラと出る。

ISOに関することだとこんな感じ

$ sudo gphoto2 --summary | grep ISO

露出のインデックス (フィルム速度 ISO)(0x500f):(readwrite) (type=0x4) Enumeration [200,250,320,400,500,640,800,1000,1250,1600] value: ISO 400 (400)
自動 ISO(0xd054):(readwrite) (type=0x2) Range [0 - 1, step 1] value: Off (0)
Auto ISO P/A/DVP Setting(0xd164):(readwrite) (type=0x2) Range [0 - 12, step 1] value: 1/30 (2)

シャッターをきる

撮影&カメラ内蔵メモリに保存

$ sudo gphoto2 --capture-image

撮影&RaspberryPiに保存

$ sudo gphoto2 --capture-image-and-download

撮影&ファイル名をhoge.jpgにしてRaspberryPiの/tmpに保存

$ sudo gphoto2 --capture-image-and-download --filename /tmp/hoge.jpg

カメラ設定の確認/変更

設定可能なリスト一覧

$ sudo gphoto2 --list-config

設定情報の確認/設定可能な値の表示

例)isoの場合

$ sudo gphoto2 --list-config | grep iso
/main/imgsettings/iso
/main/imgsettings/autoiso
$ sudo gphoto2 --get-config iso
Label: ISO スピード
Type: RADIO
Current: 400
Choice: 0 200
Choice: 1 250
Choice: 2 320
Choice: 3 400
Choice: 4 500
Choice: 5 640
Choice: 6 800
Choice: 7 1000
Choice: 8 1250
Choice: 9 1600

設定情報の変更

例)isoを500へ変更する

$ sudo gphoto2 --set-config iso=500
$ sudo gphoto2 --get-config iso | grep Current
Current: 500

例えばこんな感じで

 #!/bin/bash
 DATE=`date +"%Y%m%d-%H%M%S"`
 sudo /usr/local/bin/gphoto2 --set-config autofocusdrive=1 --capture-image-and-download --filename /home/osmc/Pictures/$DATE.jpg
 sudo chown osmc.osmc /home/osmc/Pictures/$DATE.jpg

シェルスクリプトを実行するとOSMCのPicturesに日付.jpgで保存され、(OSMCの機能で)テレビに映したり、DLNA経由でスマートフォンから見たりできます。

参考

 

バッテリーで運用するのは厳しい

撮影する内容にもよると思うのですが、長時間カメラの電源をつけっぱなしで何かしたい場合は内蔵バッテリーでは厳しいのです。純正品も売っていますが結構高いので、安価にAC電源化しました。

一眼レフデジカメ用の外部電源を自作した話

最後に

単なるインターバル撮影などであればカメラの機能を使えば良いだけですが、RaspberryPiにつなげた各種センサーを使い「一眼レフでないと撮れない写真」を撮ったり、何らかのプログラムと組み合わせたりと、RaspberryPiを使うことで医療や農業など色んな分野で楽しいものがよりお手軽に作れるんじゃないかなぁと思いました。

我が家でのこれの利用法は… また別の記事を書きますね(24時間つけっぱなしで2週間ほど使っていますが、良い感じに撮れています)

2017/7追記

我が家では1年半ほど電源つけっぱなしで毎朝記念撮影→Slackへ通知に使っていますが問題ない感じです。詳細は↓。

子どもがいる家庭で使うRaspberryPi&Slack

子どもがいる家庭で使うRaspberryPi&Slack


子どもがいる家庭で使うRaspberryPi&Slack

$
0
0

皆さんRaspberry Pi使ってますか?買ったけど使いみちが無くてほったからかしと言う方も多いのでは無いでしょうか。今回は、幼稚園~小学生くらいのお子様がいる家庭のリビングで使うRaspberry Pi(+ちょっとだけSlack)と言う内容です。電子工作はありません。

この記事は、家庭を支える技術 Advent Calendar 2016 – Adventar の13日目の記事として書きました。

色んな問題点

  1. 最近、子供が成長し写真や家族写真を撮らなくなった
  2. RasPi内の音楽再生をスマホで操作するのが面倒くさい
  3. 学校に出る時間など子どものルーチン的な事に関して毎日言うのが面倒
  4. 子どもに直接注意するのはエネルギー使う(宿題やったの?とか、自分の物くらい片付けて欲しいとか)
  5. 今日の予定や何ゴミかなど、スケジュールをいちいちスマホで見るのが面倒

と言うことで…

家ではこんな感じで使ってます(音が出ます)。

毎日の記念撮影

最近 家族の写真って撮ってますか?

子供が小学校に入る前までは本当に良く写真を撮りましたが、小学校くらいからはイベント時(誕生日、運動会、発表会、旅行)でしか撮らなくなりました。これはちょっと寂しいなぁと思い、毎朝記念撮影をすることにしました。

手で撮っていたら3日でやらなくなってしまうので、自動で。若干の望遠が欲しく、手持ちのWebカメラの画質ではいまいちなので、使い古しの一眼レフを利用しました(高性能のWebカメラや一眼以外の使わなくなったデジカメでも良いと思います)。

一眼レフカメラをAC電源化し、USB経由で撮れるようにします(ちなみにISO・シャッタースピード・露光等々もリモートで変えられます)。

あとは後述のJtalk+cronで毎朝「写真を撮りますねー」と言わせて撮影。ImageMagicで縮小した写真をSlackの#photo部屋へ、オリジナルはNASに転送しています。

t_2016-10-14_17h11_18

毎日同じ時間、同じ場所から自動で撮っている写真

自動的にslackにも届く

現在10ヶ月くらい毎朝撮っていますが、子どもたちも飽きること無く、撮るときだけはたいてい笑顔になって(時には姉弟で喧嘩して泣いて)ポーズをとってくれるのでなんだか良い感じです。1年分溜まったらffmpegで連結して短めの動画にしようと思っています(google Photosでもできそう)。

端の方に常に電源入れっぱなしのカメラ

本棚の端に設置した古い一眼レフカメラ。gphoto2を使うとUSB経由でシャッターが切れる。

音楽再生をスマホで操作するのが面倒1(Kodi/OSMC)

リビングに音楽があると何だかちょっと明るい雰囲気になりますよね。子どもが聞きたい曲とか流すにもわるくない。

うちでは SDカードに書き込むだけで すぐに動画・音楽・写真が良い感じに見られるOSMC(Kodi)と言うディストリビューションをRaspberry Piに入れて使っていますが、これの操作がスマホアプリ or テレビリモコン(HDMI) or 赤外線リモコンからしかできなくて、”ちょっと朝に音楽聞きたいなぁ”と思っても、

  1. スマホを探す
  2. スマホの電源をつける
  3. スマホのロックを解除する
  4. リモコンアプリを探して起動
  5. ジャンル選択
  6. 音楽再生

と非常に面倒。

「スマホから動く家電」はガジェット好きには”そそる”キーワードで、便利そうに思うかもしれませんが、恐らく同じ問題(手間と時間がかかる。アプリを探すのもめんどくさい)を抱えている気がします。屋外からの遠隔操作ならともかく、屋内で毎日のちょっとした色々をスマホから操作するのは非常に面倒!

便利そうで便利ではないスマホからの遠隔操作

KodiにはJSON-APIが付いているので、このWebAPIを叩いてcronで朝昼晩の決まった時間に流したり、後述する音声認識で再生するようにしました。決まった時間に(ジャンルはランダムで)音楽が流れると、久々に聞く曲が聞けたりと妻にも好評です。

ちなみにRaspberry Piは下記のアンプにつながっています。そのままUSB接続で音がなりますし、ワットチェッカーで調べたところ月に80円程度の電気代&音楽聞くのにアンプの電源入れるのは面倒なので常に電源入れっぱなしになっています。

省電力で力持ち。USBで直接つながるTOPPING TP30

省電力で力持ち。USBで直接つながるTOPPING TP30

Kodiよりも見た目がオシャレなOSMC

Kodiよりも見た目がオシャレなOSMC

後継機種はこれなのかな。
TOPPING デジタルアンプ TP30-MK2 TP30の後続機種 TOPPING デジタルアンプ TP30-MK2 TP30の後続機種

音楽再生をスマホで操作するのが面倒2(音声認識)

上記の方法で決まった時間に音楽を流す/止めることはできるのですが、任意のタイミングで適当に音楽つけたい/消したいときにスマホの電源をつけるのもやっぱり面倒。ここはjuliusという音声認識システムをインストールして使うことにしました。

天井にあるマイクに「ロボ 音楽つけて」「ロボ 静かにして」と言うと、音楽を付けたり消したりしてくれます。これは手ぶら(物理的なスイッチやスマホ)&手順(何かをしてから)などなしで、何かを探す必要もなく、どんな体勢・状況(歩きながら、寝ながら、本を読みながら)でもON/OFFができるので非常に便利です。近い未来、色んなスイッチは絶対こうなるなぁと実感しています。

Amazon Echo(Alexa)みたいに、呼びかけ→ハイ(少し間がある)→音楽つくのようなラグが無く、何より日本語が通じるのが嬉しいです。

ただ、今のjuliusの精度では子供の声には反応してくれません。また、若干過剰に反応(間違った言葉でも音楽をつけてしまう)します。Siriやgoogle音声認識くらいの精度が出てくれるといいのですが…。

音声認識用のWebAPI等もありますが、全ての声を全部Webに投げるわけには行きません。この例で言うと「ロボ」の部分をローカルで(高い精度で)認識したら、後ろの言葉はAPIに投げる…とかできたらもっと便利になりそうですが、いい感じの方法をご存じの方いらっしゃったら教えてください。

仕組みはpythonを使ったソケット通信でJuliusに接続し、Juliusが認識し出してくれたテキスト文字列を拾ってシェルスクリプトを実行する的な内容です。

ルーチン的な事に関して子どもに言うのが面倒くさい(喋らせる)

皆さんのお家のお子さんは、朝 自分で時計を見ながら学校の用意したり、部屋の片付けとかしてくれますか?

してくれるのであれば良いのですが、うちは残念ながらご飯を食べ終わったらギリギリまで本や漫画を読んでいます。「そろそろ学校なので片付けて用意しようよ」と毎日コチラが時計を見て言うのが面倒&言うと面倒くさいオーラが発言者の方に向かうのでストレス。

と言うことでRaspberry Piに話してもらうことにしました。

お話させるのはOpen JTalkと言う日本語もちゃんと喋れるテキスト→音声合成システムを使います。インストールして、コマンドラインで


jsay こんにちは

とするとスピーカから喋ります(こんにちはの部分は任意のテキストが可。漢字も使えます)。

と言うことで喋って欲しい言葉をcronで登録します。スクリプトは休日・日本の祝日チェックAPIを使い、土曜&休みの日には喋らないようにしてあります。学校のチャイムや目覚まし時計の音声版みたいな感じです。


#
# 朝
#
15 06 * * * /usr/local/bin/jsay_one 家族の時間だよ。家族の時間だよ。おうちのことをする時間だよ。
30 07 * * 1,2,3,4,5 /usr/local/bin/jsay_one XXちゃん。そろそろ学校へ行く時間だよ。XXちゃん。そろそろ学校へ行く時間だよ。気を付けて行ってきてね。
50 07 * * 1,2,3,4,5 /usr/local/bin/jsay_one XXくん。そろそろ保育園の時間だよ。XXくん。そろそろ保育園の時間だよ。今日も元気にいってらっしゃい。
#
# 夜
#
15 17 * * * /usr/local/bin/jsay_one 家族の時間だよ。家族の時間だよ。おうちのことをする時間だよ。

ちなみに上記の「家族の時間だよ」は、家族の為に何かお手伝いできることを探してやってみよう(自分の物くらい片付けて欲しい)の時間だったのですが、現在は完全に無視され、実質機能していません(学校の時間は役立ってます)。

結局、誰に言われても面倒なことは自らはやらない&自分に役にたつものみ機能するってことなのでしょう。

子どもに直接注意するのはエネルギー使う(Slackから喋らせる→ほめる育児?)

「宿題やったの?」とか、散らかしたおもちゃを片付けて欲しいなぁなど日々のちょっとした注意をしたいと思ったときに直接声をかけると、その不機嫌さは親に向けられ、言ってる本人も何だかイライラしてきたりします。

これに関してはSlack経由で任意の文字を喋らせ「親は言っていない。ロボが言っているのだ。」と不機嫌の対象を親に向けないようにしています。

こうすることによって、”うまく行くとき”は「注意する・攻撃対象になるのはロボ」→「出来たことを褒めるのは親」の流れができます。子どもを褒めるのは(子どもが喜んでくれて)親も気持ちよい!

robo_talk部屋に投げたテキストは音声でお話するように

robo_talk部屋に投げたテキストは音声でお話ししてくれる

恐らくコレが効くのは低学年までだとは思うのですが、うちの場合は親が喋らせているとは気づいていないっぽい(ロボという”何か”が本当に居る)ので(うまく行くときは)「親なら聞かないけど、ロボなら聞いてくれる」ことがあります(時にはしつこく喋らせます)*1

*1—
導入当初は(物珍しさで)高確率で聞いてくれましたが、多用するとやっぱり駄目なので、たまに使う程度にしています。ロボは疲れないし精神的ダメージも受けないので、繰り返し喋れるようにプログラムを変えたら良い気もしてきた。

仕組みはSlack内のbot(node.jsで起動してるHubot)が特定のroomで常駐、そこで書き込まれたテキストは自動的に上記の喋らせるシェルスクリプトを起動して喋らせています。外出先からSlackへ「そろそろ、おとうちゃんが帰ります」って書けばちゃんとリビングで喋ってくれます。IFTTTと組み合わせても楽しいかもしれませんね。

今回の「子ども×RasPi」の趣旨からは外れるので詳細は書きませんが、我が家でのSlackの使い方は(このAdvent Calendarを毎年ご覧の方には目新しいことはありませんが)↓の感じで使っています。用途によってroomを分けられメモ帳代わりに使えるのがLINEよりも便利だと妻には言われています。

スケジュールをいちいちスマホで見るのが面倒

妻/私の予定/家庭でのイベント/今日のゴミ収集品目などは、googleカレンダー(ジョルテ経由)で共有しています。

これだけでも便利なのですが、たまにスケジュールを忘れていたりする&ゴミに関しては月に1,2回しか回収しないものは覚えていないので、毎朝喋らせています。

googleカレンダーから情報を取ってくるのは公式のライブラリが出てるので、付いているサンプルをちょっとだけ変えました。

また、スケジュールの追加、修正、削除通知に関してはSlackのGoogle Calendar連携(公式)を使っています。

多人数だと通知が邪魔そうですが、夫婦2人位だとちょうどよい感じで「あっこれこの日に入ったんだ。キャンセルになったんだ」が分かって便利です。

夫婦の予定の追加やキャンセルがSlackに流れるのは便利

各自の予定の追加やキャンセルがSlackに流れるのは便利

負荷的な話

音楽再生も含め、この辺りを全部一台のRaspberry Pi(Raspberry Pi 2 model B)で動かしているため、若干負荷が高いです(特にKodiとjulius)。将来的にはRaspberry Piにしかできないことだけをこれにさせて、Hubotとjuliusは別の場所に引っ越すのが良いのだろうなぁとは思っていますが、より高性能の安価な機械も出そうです。

2016-10-14_16h56_37

Kodiは動いておらず、常時話し声がある状態の負荷。ちょっと高い。

ここまでの機能の作り方(技術的な話し)

上記で紹介した一部部分だけでも作ってみたいなぁと思われた方へ。

設定ファイルと技術的な情報を残しておきます。よろしければ参考にしてください。

最後に

声で反応するオーディオすごく便利&子供には音が有効。記念撮影も毎朝のちょっとしたアクセントとして楽しいです。

もちろん上記にあげたことは使い古しのPCでもできますが、Raspberry Piを使うと省スペース&電気代は月60円程度。個人的には作った環境を簡単にイメージ化して保存できる事も嬉しいです。SDカードや本体が壊れたときもう一度同じ環境作るのは想像しただけでも心折れる。

Raspberry Piが転がってるようであれば、この冬休みにでも挑戦してみてはいかがでしょうか?新しいRasPiを使えばもっと余裕をもって動くと思いますよ。

Raspberry Pi 3 MODEL B Raspberry Pi 3 MODEL B

 

子どもがいる家庭で使うRaspberryPi&Slack(技術編)

$
0
0

電子工作なし。幼稚園~小学生くらいの子供がいる家庭のリビングで使うRaspberry Pi(+ちょっとだけSlack)の後編。具体的にどうやって作るかの技術編です。黒い画面にアレルギーがない方が対象です。

今回はRaspberryPi2(OSはOSMCですが、Raspbianでも一緒だと思います)を使用していますが、Linux系であればどれでも良く似た感じだと思います。

実際の動きや概要は前編に。あわせて御覧ください。

ソースコード/GitHUB

説明ほとんど無いけど、使ってるスクリプトを下記に置きました。

毎日の記念撮影

デジタルカメラをUSB経由でRaspberryPiと接続し、コマンドラインから写真を撮ったりあれこれできるgphoto2を使って、cronで撮影します。撮影し終わったファイルは縮小して下記のslackerを使ってslackの#photoに投げています。詳細は下記の、1.一眼レフカメラをRaspberryPiからリモート制御する話 で。

  1. 一眼レフカメラをRaspberryPiからリモート制御する話 / もやし工房
    https://www.moyashi-koubou.com/blog/dslr_camera_raspberrypi/
  2. コマンドラインからSlackにメッセージや任意のファイルを送れるプログラム
    https://github.com/os/slacker
  3. 実際のスクリプト
    https://github.com/koike-moyashi/kaitei_raspi/tree/master/take_photo

音楽再生をスマホで操作するのが面倒1(Kodi/OSMC)

Kodiの設定で外部からのコントロールを許可してから、下記のWebAPIをpythonスクリプトでたたきます。pip install xbmc-jsonしてから作ったスクリプトでよろしくしました。xbmc-jsonライブラリはhttp request時のタイムアウト設定が無かったので、3秒程度でタイムアウトする設定を加えました。

  1. APIドキュメント – JSON-RPC API/v6
    http://kodi.wiki/view/JSON-RPC_API/v6
  2. python用ライブラリ
    https://pypi.python.org/pypi/xbmc-json/
  3. 実際のスクリプト
    https://github.com/koike-moyashi/kaitei_raspi/tree/master/xbmc-json-script

音楽再生をスマホで操作するのが面倒2(音声認識/Julius)

インストール自体は(時間がかかりますが)色んな方がされているので問題なく済むと思います。全ての語句を認識させたいわけではないので辞書は小さく。若干ハマったのはマイクの音量と過剰マッチ。

音量はalsamixerを起動して、録音→該当マイクの音量?を最大値近くまであげました。過剰マッチに関しては、下記3の方を参考に、ダミーデータ&近い語句を沢山入れることによって少しマシになりました。2の方を参考に、ソケット通信で見に行く&任意のテキストが来た場合にシェルスクリプトを実行&Julius自体の自動起動しました。

  1. Julius
    http://julius.osdn.jp/
  2. Raspberry Pi でライザップミクを作る@karaage
    http://karaage.hatenadiary.jp/entry/2015/09/04/073000
  3. ルールベースの juliusと精度@お前の血は何色だ!! 4
    http://d.hatena.ne.jp/rti7743/20120314/1331695203
  4. 実際のスクリプト
    https://github.com/koike-moyashi/kaitei_raspi/tree/master/julius

ルーチン的な事に関して子どもに言うのが面倒くさい(喋らせる)

前準備(wavを適切なカードで鳴らす&同時に音を鳴らす)

最終的には できたwavを再生させるのでまずは音が鳴る環境を作ります(スピーカーから音がなるか確認します)。今回の場合はUSB外部オーディオに再生させたいのですが、ドライバー類は標準で認識していました。

またサウンドカードが複数つながっている関係で、そのままwavを再生しようとしても違うカードで鳴ってしまうため、カード番号XXで再生を設定しました。

aplay -l

とすると認識しているオーディオ機器を表示できるので、鳴らしたいカード番号とデバイスIDを確認します。


osmc@moyashi-osmc:~$ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
サブデバイス: 8/8
サブデバイス #0: subdevice #0
サブデバイス #1: subdevice #1
サブデバイス #2: subdevice #2
サブデバイス #3: subdevice #3
サブデバイス #4: subdevice #4
サブデバイス #5: subdevice #5
サブデバイス #6: subdevice #6
サブデバイス #7: subdevice #7
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 1: Device [C-Media USB Audio Device], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カード 2: DAC [USB Audio DAC], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0

今回は [USB Audio DAC]で鳴らしたいので、カード2、デバイス0(数字は環境によって異なります)。

適当なwavファイルを転送し、

aplay -D hw:2,0 hoge.wav

で音が鳴ればOK。

Kodi側ではalsaの音量を100%にしたいのですが、音声再生時はこのままだとうるさいので喋らせている間はカード番号XXの音量を絞る設定を入れました。


amixer -q -c 2 set PCM 60%
aplay --quiet ${TMPFILE}
amixer -q -c 2 set PCM 100%

あと、そのままだとLinux(alsa?)の制限でKodiで音楽が流れている&停止直後だと、aplayでwavを再生しても「audio open error: Device or resource busy」と言うエラーで再生できなかったので、alsaでミキサーとやらを作成し、複数の音源が同時になってもエラーとならないようにしました。

~/.asoundrc
pcm.!default {
 type plug
 slave.pcm "dmixer"
}

pcm.dmixer {
 type dmix
 ipc_key 1024
 slave {
  pcm "hw:2,0"
  period_time 0
  period_size 1024
  buffer_size 4096
  channels 2
  #rate 44100
 }
 bindings {
  0 0
  1 1
 }
}

環境によって”hw:2,0″の部分をaplay -l等でhw番号を調べ、鳴らしたいカードにする必要があります。

お話させる(OpenJtalkのインストール)

OpenJtalkと言うオープンソース・ソフトウェアを使うと、テキスト文字(漢字可)から辞書等を使いつつ良い感じに音声wavファイルを作ってくれます。

基本は下記ページを参考にしましたが、ページ中のスクリプトはバージョン変わってるので異なります。

  1. Raspberry Piに喋らせる / 橋本商会
    http://shokai.org/blog/archives/6893
  2. Open JTalk
    http://open-jtalk.sourceforge.net/

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

確認


$ echo "こんにちは" | 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 ~/test.wav
$ aplay -D hw:2,0 ~/test.wav

うーん。喋るけどロボロボしい声。

声データ(音響モデル)の変更

今回は上記ページにあるメイさんを使用しましたが、「htsvoice」や「音響モデル」で検索すると、色んなモデルデータがダウンロード/使用可能です。音響モデルの指定は先程の”-m”で指定しているだけなので、内容によって声を変えても楽しそうです。


wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip
unzip MMDAgent_Example-1.6.zip
sudo cp -R MMDAgent_Example-1.6/Voice/* /usr/share/hts-voice/

確認


$ echo "こんにちは" | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/mei/mei_normal.htsvoice -ow ~/test.wav
$ aplay -D hw:2,0 ~/test.wav

うん。可愛くなった。

簡単なコマンドでお話できるようスクリプトを作っておく

上記のブログを参考に簡単にお喋りできるようにスクリプトを作りました。RaspberryPiではメディアプレーヤーKodiを動かして音楽聞いている関係で、喋らせるときはamixerでボリュームを一時的に絞っています。


osmc@moyashi-osmc:~$ jsay こんにちは
オハナシシタヨ
cron用(/usr/local/bin/jsay_cron)
喋る前にピン・ポーン・パン・ポーン音を入れる+平日のみ動く。

チャイム音は下記の素材を使わせてもらいました。

決まった時間にお話させる

cronへ登録します。


#
# 朝
#
15 06 * * * /usr/local/bin/jsay_cron 家族の時間だよ。家族の時間だよ。おうちのことをする時間だよ。
30 07 * * 1,2,3,4,5 /usr/local/bin/jsay_cron XXちゃん。そろそろ学校へ行く時間だよ。XXちゃん。そろそろ学校へ行く時間だよ。気を付けて行ってきてね。
20 08 * * 1,2,3,4,5 /usr/local/bin/jsay_cron XXくん。そろそろ保育園の時間だよ。XXくん。そろそろ保育園の時間だよ。今日も元気にいってらっしゃい。
#
# 夜
#
15 17 * * * /usr/local/bin/jsay_cron 家族の時間だよ。家族の時間だよ。おうちのことをする時間だよ。

子どもに直接注意するのはエネルギー使う(Slackから喋らせる)

Slackの特定のroomに文字列を投げると、常駐しているボットがテキストをひろって、上記の喋らせるスクリプトに内容をなげ、スピーカーから声がでるみたいな流れ。

Hubotのインストール

Slackと連携させる為にHubotと言うNode.jsで動くボット用フレームワークを入れます。

基本下記のページを参考にしてましたが、調べているとnode.jsやhubotのバージョン等によって入れ方が色々あるっぽいので最新の情報を調べてみることをおすすめします。ちなみに名前はroboにしました。

Slackのメッセージで喋らせる

Slackに投稿すると先ほど入れたOpenJtalkでおしゃべりさせます。

Hubotを利用したスクリプトでローカルの任意をシェルを実行できるのでそれを利用します。

と言っても結構簡単で、hubotを作成したscriptsディレクトリに下記のファイルを入れて(部屋と実行したいスクリプトを指定して)node.jsを再起動するだけ。

hubotを入れたディレクトリに移動し、bin/hubotを起動して、単体(slack経由では無い)で動くかを確認したのち、Slack経由で動くかを確認します。下記のSLACK_TOKENはSlackでHubotの連携をするともらえます。


#!/bin/sh
export HUBOT_SLACK_TOKEN=XXXX-XXXXXX-XXXXXXXX
bin/hubot --adapter slack

カワイイ。

ボットの常駐化

上記のスクリプトを常駐化させるためにforeverと言うのを入れます。

hubotを入れたディレクトリでこんな感じで起動。


#!/bin/sh
export HUBOT_SLACK_TOKEN=xxxx-XXXXXXX-XXXXXXXX
forever start -l /var/log/nodejs/logfile.log -a -c coffee node_modules/.bin/hubot -a slack

スケジュールをいちいちスマホで見るのが面倒

GoogleAPIでカレンダーAPIを登録してから、公式のClient Libraryを利用して今日の予定だけテキストで吐くスクリプトを作りました(下記1に詳細が書いてあります)。

出てきたテキストを、上記の喋らせるスクリプト(jsay)に投げるとしゃべります。

  1. Google Calendar API / PHP Client Library
    https://developers.google.com/google-apps/calendar/quickstart/php
  2. Google Calendar / Slack App Directory
    https://slack.com/apps/A0F8149ED-google-calendar
  3. 実際のスクリプト
    https://github.com/koike-moyashi/kaitei_raspi/tree/master/get_calender

最後に

ある程度上手く動くことが確認できたら、miniSDの中身をイメージ化してファイルにし、何処かに保存しておくことがおすすめです。上記環境をもう一度作るのはどう考えても辛い。

サーバサイドCUIでDOM単位のWebページキャプチャができるpageresの話

$
0
0

CUIでWebページのキャプチャ画像(スクリーンショット)が欲しいなぁと思うことは無いでしょうか。Slack等のbot通知でテキストのついでに画像も欲しいなぁとか、自動テストの目視確認用にページ画像もみたいなぁとか。

最近のテストツールにはそういう機能も入っているようですが、もうちょっと気軽にキャプチャしたい。欲を言えばサーバサイドでページ全体では無く、一部分(DOM指定)で。そんな事ができるツール pageresの紹介です。

こんな方に向いてます

  • 黒い画面に抵抗がない
  • ページ全体ではなく一部分のスクリーンショットが欲しい
  • 大量のURLのキャプチャーが欲しい
  • レスポシンブルなサイトで色んなスクリーンサイズのキャプチャーが欲しい
  • ブラウザが入っていないサーバサイドでCUIでキャプチャーが取りたい
  • cronとかで定期実行してよろしくしたい

何ができるの?

ページ全体のキャプチャー画像(スクリーンショット)をとる

こんな風に使うと、ページ全体のキャプチャ画像が出来あがります。


$ pageres weather.yahoo.co.jp/weather/jp/24/5310/24201.html --filename='tsu'

結果

こう言うのはブラウザの拡張機能とかでもできますが、大量のURLを自動的に取りたい時や、定期的に自動実行したい場合などはこっちのほうが簡単です。

ちなみに、ページ全体のキャプチャーだけで良ければpythonで動く、webkit2pngの方が導入が簡単でした。

ページ一部分のキャプチャー画像をとる

こんな風に使うと、DOM指定で一部分だけがキャプチャできます。


$ pageres weather.yahoo.co.jp/weather/jp/24/5310/24201.html --filename='tsu_tommorow' --selector='#yjw_pinpoint_tomorrow'

他にも独自のCSSを使ったり、ある要素だけ隠すこともできます。

すごーい。

pageresのインストール

Node.jsとPhantomJSが必要です。

下記の例はUbuntuですが、node.jsとPhantomJSが入れば他のOS(Windows/OS X)でも一緒なのではなかろうかと思います。

Ubuntu 14.04LTSの場合

Node.js

新しいのを入れたいので公式ページの方法で。


curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
npm --version
 3.10.10
node --version
 v6.10.2

PhantomJS


sudo npm install --global phantomjs
sudo ln -sf /usr/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs /usr/local/bin/
phantomjs --version
 2.1.1

pageres-cli


sudo npm install --global pageres-cli
pageres --version
 4.0.0

使い方

基本は下記の公式ページを見れば分かる感じです。

  • 1サイトを1024×768と1366×768でキャプチャ
    pageres www.example.com 1024×768 1366×768
    →2画像が出来上がります
  • 2サイトを1024×768でキャプチャ
    pageres www.example.com www2.example.com 1024×768
    →2画像が出来上がります
  • ある要素だけをキャプチャ
    pageres www.example.com –selector=’.page-header’
    →.page-headerの部分だけの画像
  • ある要素を隠してキャプチャ(複数指定可)
    pageres www.example.com –hide=’.page-header’
    →.page-headerを除いた画像

他にもローカルのCSSを適用、クッキーを適用、ヘッダーの変更、basic認証、上部で切り取り、png/jpg、ユーザーエージェント変更、ローカルのhtmlファイルからなんかができます。

ちなみに、大量のURLを取りたい時は、url.txtにずらーーっとURLを書いて、↓のようなスクリプトを実行すれば良い感じにとれるのではないかと思います。


#!/bin/sh

cat url.txt | while read line
do
   pageres $line
done

最後に

いやー 便利。作成者の方ありがとうございます。

ScratchとPythonをつなげて顔認識やメール・Slackを送ったりする話

$
0
0

子どもでも使えるプログラミング言語ScratchとPythonをつなげてScratchの値を送受信。ScratchではできないメールやSlackの送信、画像認識やWeb連携、データをテキスト出力、OSコマンドの実行などをする話。

何ができるの?

  • Pythonで動く何か(結果)をScratchで使いたい
  • Scratchから任意のOSコマンドを実行したい(メールやSlackへ送信、Webからファイルを取得、テキストで出力など)
  • USBカメラによる顔認識や色認識結果をScratchで使いたい
  • 遠隔/ローカルのScratchへPythonの値を送りたい
  • 遠隔/ローカルのScratchからPythonで値を受け取りたい
  • 遠隔/ローカルのPython/ScratchへPython/Scratch/Pyonkeeの値を中継したい
    などなど

工夫次第でいろんな事ができるようになるのでは無いかと思います。

対象の方

  • 親子でプログラミングを楽しみたい(お父ちゃんが凄いのをPythonで作って、Scratchでつながせ凄さを見せつける)
  • Scratchはだいたい分かる。Pythonに挑戦しようと思うが、作りたいものが思いつかない
  • 黒い画面はさほど怖くない
  • google先生に聞いて何となく進められる

対象じゃない方

  • Pythonで何でもできる

環境の準備

Pythonが動く環境が必要です(Scratchと同一PCで無くても良いです)。

Pythonのインストール

今回はRaspberryPiのPython2.7を使いました。

RaspberryPiやMacの場合はPythonが初めから使えるのでそのままで。Windows10ならBash on windowsを有効にしてみると良いのではないかと思います。それ以外の方は… google先生に聞きながらPythonのインストールを頑張ってみて下さい。

python --version
Python 2.7.3

pipのインストール

Pythonのパッケージを良い感じに管理(インストール)してくれるpipを入れます。

raspberry Piやbash on windowsなら、

sudo apt-update
sudo apt-get install python-pip

Macなら、

easy_install pip

pip –versionと打ってエラーが出なければOKです。

$ pip --version
pip 1.1 from /usr/lib/python2.7/dist-packages (python 2.7)

scratchpyのインストール

PythonでScratchの遠隔センサープロトコルを簡単に使うためのライブラリscratchpyをインストールします。

sudo pip install scratchpy

動作テスト

pythonを実行して、import scratch と打ってエラーが出なければOK(Ctrl+Dで終了)。

$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import scratch
>>> Ctrl+D

 

import scratchでエラーが出なければOK

エラーが出るようであれば、
https://raw.githubusercontent.com/pilliq/scratchpy/master/scratch/scratch.py
をダウンロードして、実行したい場所/ファイルと同じディレクトリに置いて試してみて下さい。

Scratchの遠隔センサーとファイアーウォールの設定

Scratch1.4の遠隔センサー接続を有効にします(2.0では使えません)。「調べる→スライダーセンサーの値→右クリック→遠隔センサー接続を有効にする」を押します。

調べる→スライダーセンサーの値→右クリック→遠隔センサー接続を有効にする

他のPCからScratchが実行されているPCへ値を送りたい場合は、Scratchが入っているPCのファイアーウォールの設定を変更する必要があります。TCPポート42001のみを開ける、Scratchの通信は全て許可すれば良いのですが、一時的に体験/テストするだけであればファイアーウォールを一時的に無効にしても良いかと思います。

ESETの場合。Scratchが入っている側のPCのファイアーウォールを一時的に無効にする。

scratchpyの使い方(基本)

詳しくは上記の公式ページに書いてありますが、これを使うとPythonからScratchへ「センサーの値」と「ブロードキャスト(○○を送る)」を送受信できます。

Python→Scratchへ値を送る

同一若しくは別PCのScratchへPythonの値を送ることができます。下記にセンサーと書いてありますが単に値を送ると思って下さい。数字だけでなく、文字列を送ることも可能です。

下記のコードを編集するには RaspberryPiとMacであればGUIエディタでも大丈夫ですが、Bash on windowsの場合はnanoとかを使ってみて下さい(2017/4現在Bash on Windowsでは日本語は怪しいので打たない感じで)。

# -*- coding: utf-8 -*-

import scratch, time

#192.168.11.20のScratchへ送る場合
s = scratch.Scratch(host='192.168.11.20')
#同一PCのScratchへ送る場合
#s = scratch.Scratch(host='localhost')

s.connect()

a = 0

while True:
    try:
        a = a + 1
        # センサーの値を送る
        s.sensorupdate({'a' : a})
        time.sleep(0.5)
    except KeyboardInterrupt:
        print "Scratch: Disconnected from Scratch"
        break

s.disconnect()

上記を下記のように実行します(終了はCtrl+C)。

python send_sensor.py

これでScrachのaセンサーの値が1づつ増えていきます。

上記を実行するとこんな感じで増えていく

Python→Scratchへブロードキャストを送る

※2017/4月現在、bash on windowsでは何故か動きませんでした。

# -*- coding: utf-8 -*-

import scratch

#192.168.11.20のScratchへ送る場合
s = scratch.Scratch(host='192.168.11.20')
s.connect()

# Hello, Scratch!を送る
s.broadcast('Hello, Scratch!')

# 切断
s.disconnect()

下記で実行。

python send_broadcast.py

このブロック下が動かせる

Scratch→Pythonへ値を受け取る

Scratchのグローバル変数の値が変化したらPythonで値を受け取ることができます。
Scratch側は例えばこんなプログラム。

グローバル変数の値が変わったらPythonに送られる

# -*- coding: utf-8 -*-

import scratch

#192.168.11.20のScratchから受け取る場合
s = scratch.Scratch(host='192.168.11.20')
s.connect()

while True:
    try:
        msg = s.receive()
        print "Scratch: receive:",msg
        # Scratchでの変数名send_msgの値があれば表示
        if 'send_msg' in msg[1]:
            val = msg[1]['send_msg']
            print val
    except KeyboardInterrupt:
        print "Scratch: Disconnected from Scratch"
        break

s.disconnect()

Scratch→Pythonへブロードキャストを受け取る

# -*- coding: utf-8 -*-

import scratch

#192.168.11.20のScratchから受け取る場合
s = scratch.Scratch(host='192.168.11.20')

s.connect()

while True:
    try:
        msg = s.receive()
        print "Scratch: receive:",msg
        if msg[0] == 'broadcast':
            print msg[1]
    except KeyboardInterrupt:
        print "Scratch: Disconnected from Scratch"
        break

s.disconnect()

○○を送るをPythonで受け取れます

Scratch→Pythonへ値かブロードキャストを受け取る

上記のサンプルは一度に複数の値が変化した場合1つしか受け取れませんが、下記なら複数受け取れます。

# -*- coding: utf-8 -*-

import scratch

s = scratch.Scratch(host='192.168.11.20')
s.connect()

def listen():
    while True:
        try:
            yield s.receive()
        except scratch.ScratchError:
            s.disconnect()
            raise StopIteration
        except KeyboardInterrupt:
            print "Scratch: Disconnected from Scratch"
            s.disconnect()
            break

for msg in listen():
    if msg[0] == 'broadcast':
        # ブロードキャストを受け取った時の処理をこの下に書く
        print msg
    elif msg[0] == 'sensor-update':
        # センサーを受け取った時の処理をこの下に書く
        if 'send_msg' in msg[1]:
            val = msg[1]['send_msg']
            print 'send_msg:' + str(val)

値を中継する

Scratch1 – PC(Python) – Scratch2など、Scratchから他のScratchへ値を中継します。上記の例をひっつけただけです。ただ、これはScratch 1.4であれば標準でもMESHの仕組みを使えば可能で、MESHのほうが簡単です。

特定のセンサーやブロードキャストだけを転送したい。受け取った値をPythonで加工してから転送したい時などに使えるのでは無いかと思います。

Meshが有効なScratchの場合 Shift+共有でこの画面が出る。ネットワークに繋がった複数のScratch同士で値の共有が可能。

下記は、scratch1のsend_msgをscratch2のfrom_srcatch1へ転送するサンプル。

# -*- coding: utf-8 -*-

import scratch

# scratch1のIPアドレス
s = scratch.Scratch(host='192.168.11.20')
s.connect()

# scratch2のIPアドレス
s2 = scratch.Scratch(host='localhost')
s2.connect()

def listen():
    while True:
        try:
            yield s.receive()
        except scratch.ScratchError:
            s.disconnect()
            s2.disconnect()
            raise StopIteration
        except KeyboardInterrupt:
            print "Scratch: Disconnected from Scratch"
            s.disconnect()
            s2.disconnect()
            break

for msg in listen():
    if msg[0] == 'broadcast':
        # デバッグ用
        print msg
    elif msg[0] == 'sensor-update':
        if 'send_msg' in msg[1]:
            val = msg[1]['send_msg']
            # デバッグ用
            print 'send_msg:' + str(val)
            # Scratch1から受け取ったsend_msg値を、Scratch2へ送る
            s2.sensorupdate({'from_scratch1' : val})

単なる中継であれば標準機能のMESHを使ったほうが楽ですが…

scratchpyの使い方(応用)

楽しいのはココからです。上記の基本を踏まえ、色々作っていきます。

任意のOSコマンドを実行する

既存のプログラム(バイナリ、Python、他の言語)を使って色々遊びたい場合、OSコマンドを実行できると便利ですよね。実行したいコマンドを受け取って、Pythonのsubprocessで、shell実行をすればOSコマンドを実行できます。

※コマンド次第ではファイルの書き換えや削除など、何でもできてしまうので色々気をつけて下さい。

# -*- coding: utf-8 -*-

import scratch
import subprocess

# ScratchのIPアドレス
s = scratch.Scratch(host='192.168.11.20')
s.connect()

def listen():
    while True:
        try:
            yield s.receive()
        except scratch.ScratchError:
            s.disconnect()
            raise StopIteration
        except KeyboardInterrupt:
            print "Scratch: Disconnected from Scratch"
            s.disconnect()
            break

for msg in listen():
    if msg[0] == 'broadcast':
        # デバッグ用
        print msg
    elif msg[0] == 'sensor-update':
        if 'shell' in msg[1]:
            val = msg[1]['shell']
            cmd = str(val)

            # デバッグ用
            print 'shell:' + str(val)

            # shellコマンドの実行
            p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            stdout_data, stderr_data = p.communicate()
            # 標準、エラー出力をScratchに送り返す
            s.sensorupdate({'shell_stdout' : stdout_data.replace('\r\n',' ')})
            s.sensorupdate({'shell_stderr' : stderr_data.replace('\r\n',' ')})

            # デバッグ用
            print 'stdout:' + str(stdout_data) + 'stderr:' + str(stderr_data)

上記を実行し、グローバル変数shellを変化させるとOSコマンドが実行されます。

pwdコマンド(現在のディレクトリ)を送って、返り値がstdoutに入ったの図

現時刻を取得

気をつけなければならないのは、先にも書きましたが変数に変化が無いとsensor-updateを送らないこと。2回目を送る場合は少し何かを変えるなど工夫が必要です。

連続して同じ値は送れない(値に変更が合った場合のみ送信される仕組み)

export LANG=C;time=`date +'%Y-%m-%d %H:%M:%S'`;echo $time

Scratch 1.4では取得できない現在時刻の例

テキストログを保存

上を少しだけ応用して、現時刻の入ったログを保存。Pi_scratch等を使用してIoT的な何かを作ってログやCSVを残したいという時に使えるのではないかと。

export LANG=C;time=`date +'%Y-%m-%d %H:%M:%S'`;echo $time 1 >> test.log
root@raspberrypi:~/Python# cat test.log
2017-04-18 14:14:23 1
2017-04-18 14:14:23 2
2017-04-18 14:14:23 3
2017-04-18 14:14:23 4
2017-04-18 14:14:23 5
2017-04-18 14:14:23 6
2017-04-18 14:14:23 7
2017-04-18 14:14:23 8
2017-04-18 14:14:23 9
2017-04-18 14:14:23 10

こんな感じにすると時刻付きのログテキストが残せる

Scratchからメールを送信

ワンライナーで書ければコマンドで動く物はだいたい動きます。改行したい場合はPythonスクリプトで\rとかを改行に置換すると良さそうですがやってません。Scratch→Pythonは日本語も大丈夫でした。

echo 'Scratchからのメール送信テストです。' | mail -s 'test' root

Scratchからメールを送るの図。例は固定ですが、本来は先の○と○をつなげるで良い感じに。

RaspberryPiで予めメールサーバ(postfix)の設定がしてあります

ScratchからSlackへメッセージを送信

コマンドが打てると言うことは、アイデア次第でかなり色々な事ができます。curlの戻り値はstdoutに入るので、他のWebAPI(天気や本など)にもアクセス可能です。

curl -XPOST -d "token=トークンをココへ" -d "channel=#general" -d "text=test from scratch" -d "username=Scratch" "https://slack.com/api/chat.postMessage"

ある程度、長いのでも大丈夫っぽい

Slackにもメッセージが送れる

他にも下記のように、OpenJTalkで喋らせたり、一眼レフカメラに写真を取らせたり、音声認識の結果を知らせたりもできるのでは無いかと思います(宣伝)。

USBカメラで顔認識したらScratchに知らせる

Pythonで書かれたサンプルコードに先程のsensorupdateかbroadcastをはさんであげます。

今回の例だけでなく、Pythonで書かれた何かに下記の数行を入れてあげるだけでScratchから使えるかもしれません。Pythonだけで作られた何かの場合はコードが複雑で、挟む個所も分かりにくいですが、今回のようにメイン(OpenCV)があり、それを利用するようなプログラムの場合、コードも短く、見やすい場合が多い気がします。

顔認識にはopen cvを使います。RaspberryPi以外でのOpenCVの入れ方は… 調べてみて下さい。PythonからOpenCVを使えるようにセットアップする必要があります。

RaspberryPi(debian系)なら↓だけ。あら簡単。

apt-get update
apt-get install libopencv-dev
apt-get install python-opencv

このあたりを見てテストして、顔認識ができるところまでやります。

あとは、顔が見つかった部分で先程のsensorupdateを挟めば良いので↓の感じで。特定色の色認識などもOpenCVを使って同様にできると思います。

#!/usr/bin/python
"""
This program is demonstration for face and object detection using haar-like features.
The program finds faces in a camera image or video stream and displays a red box around them.

Original C implementation by: ?
Python implementation by: Roman Stanchak, James Bowman
"""
import sys
import cv2.cv as cv
from optparse import OptionParser
import scratch
s = scratch.Scratch(host='localhost')
s.connect()

# Parameters for haar detection
# From the API:
        if faces:
            for ((x, y, w, h), n) in faces:
                # the input to cv.HaarDetectObjects was resized, so scale the
                # bounding box of each face and convert it to two CvPoints
                pt1 = (int(x * image_scale), int(y * image_scale))
                pt2 = (int((x + w) * image_scale), int((y + h) * image_scale))
                cv.Rectangle(img, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0)
                print "face!!"
                s.sensorupdate({'face' : 1})
        else:
                s.sensorupdate({'face' : 0})

    cv.ShowImage("result", img)

顔認識されるとScratchへ情報を送る(赤枠はサンプルコード)。pythonで書かれている場合はサンプルコードとかで良い感じにできる場合も多いかと。

ソースコード

ここに上げました。Python慣れていないので、この書き方はイマイチでは?などありましたら、pull requestいただけると幸いです。

git clone https://github.com/koike-moyashi/scratch_python_sample.git

とかすると良いのではなかろうかと。

最後に

これならPythonで全部やっちゃえば… と言う気持ちは分からないでも無いのですが、画面描画するゲームやインタラクティブ作品と組み合わせたり、Pythonやってみたけどhello world以上何を作れば良いのかなぁと思ってる方なんかは徐々にPython触れられる気がしました。

また、ScratchをGUIフロントとして使い、タッチパネルでスイッチ的な何かに使い、裏側ではPythonで動くみたいなのも作れそう。

既存のバイナリプログラムやpythonプログラム、RaspberryPi+Scratchで各種センサーやモータがあれこれできるpi_scratchなどと組み合わせると、楽しい作品を作ることができるのではないかなぁと思いました。

こんなの作ったよとかありましたら、是非コメント欄で教えてください。

行列イベントに使える「スマホで現在の順番が分かるさん」を作った話

$
0
0

行列ができるイベント等で「番号が書いてる整理券」等を配布し、「現在の順番」がスマホで分かったら、お客さんはずっと並んでなくても良いので便利ですよね。とあるイベントで実際に作ったものを使ってみたので、その話。

何をしてくれるの?

  1. 表示用のURLをスマートフォンのブラウザで閲覧すると現在の順番を表示してくれます(ブラウザのリロードは要りません)。
  2. 管理用のURLから現在の番号を変更できます。
  3. 同時接続でかなりの数が表示できる(はず)

コントローラ(左)を操作すると、表示側(例では別ブラウザ×2)が自動的に変わります(中・右)

 

どう言う風に使ったか

紙に閲覧用URLのQRコードを印刷して配布。私たちはスマートフォンでコントローラ側URLを開き、受け付けにも閲覧用のタブレットを置きました。

整理券に閲覧用URLのQRコードをはった

ちなみに(オペレーションも面倒くさい)ユーザ別の待ち時間(あと何分くらい)や、来なくて飛ばした番号等は表示できません(しません)。シンプルに現在の順番のみを表示します。

受付前に置いた、現在の番号を表示&ちゃんと動いているか確認するタブレット

実際使ってどうだったか

延べ3,000人くらいが参加し、私達のブースには整理券を配布し計80人くらいが来るイベントで使用しました。

コントローラ側の動きが若干怪しい時があった(一度に複数ページがめくれてしまう)のですが、コントローラ側を再読込すれば直りました。それ以外のシステムは順調に動いていたように思います。

ただ、お客さんが(現在の順番が分かるため)ギリギリにならないと来てくれないのは誤算でした。また、私達のイベントのみ順番待ちが少なく、並んでいないように見えるため飛び込みで来られる方が多く、スタッフでの対応(並んでないが利用できない旨の説明)が必要となり、時間をとられました。お客さんによっては、他のイベントで並び中に自分の順番になってしまい、焦って来てもらう方もいらっしゃいました。

私達のブースのみ明らかに待ち人数が少ないため、システムは上手く機能はしているようなのですが、結果としてこちらの空き(誰も並んでいない)ができたり、お客さんを慌てさせてしまった(これはこちらの説明不足)りして、運用にちょっと改善点がありそう。

仕組み

昔、node.js+socket.ioを使ったプレゼンテーションを複数のブラウザで表示し、登壇者側で自動的に次のスライドにするデモを見たことがあって、プレゼンテーション部分を数字に変えるだけで結構な人数をさばけるシステムを簡単に作れそうだなぁと思い出しました。

スライド部分も、できれば手間をかけずに作りたいので調べていると、reveal.jsと言うのが楽そう。

ブラウザで見られるカッコイイプレゼンが作れるreveal.js

きっと、これを良い感じにsocket.ioつかってあれこれするのは誰かが作ってくれているだろうと色々試してみたのですが、残念ながら思っていたより簡単に見つからない。

ちなみに、こんなのを探していました。

  1. コントロール用と表示用のURLが別れている
  2. ユーザ側では表示順序を手動で変えられない(閲覧のみ)
  3. スライド途中から閲覧しても、最初からでは無く表示させたいページから始まる
  4. (私にも)分かりやすいコードで書かれている
  5. スマートフォン(レスポンシブ)対応
  6. コントローラ側で現在の表示しているページがわかる

作らないと駄目なのかなぁ時間かかるなぁと心配していた所、最終的には、下記のソフトが6を満たしていないものの、他を満たしていたので使ってみることに。

使い方はコントローラ側のURLを開くと下記のような画面が出るので、矢印をタップすると、閲覧側のスライドが自動的に切り替わります。

ただ、オリジナルは若干使いにくかったので、forkされて設定関係がスッキリしている

を使用して、上記の2を満たすために設定変更したり、80番ポートで待たせたり、systemdで常駐させたりしました(後述)。システムを「作った」と書いてますが、このプログラムを利用させてもらっただけです。公開ありがとうございます。

技術的な話(構築方法)

イベントで使ってみたいなぁという方がいらっしゃるかもしれないので情報を残しておきます。ホントはforkして設定変更した状態のものをgithubに上げたかったのですが、元ソフトのライセンス表記がなかった為、公開はするのはやめました。

サーバは今回のイベント中のみ動けばよかったので、Microsoft Azureの2コア、7GBメモリ上(¥18.57/時間)で動かしました。こういう時は時間単位で借りられるクラウドサービスって凄く良いですね。

インストール

Ubuntu 16.04.2 LTS

sudo apt-get install nodejs
sudo apt-get install npm
sudo npm install -g coffee-script
sudo npm install -g express
sudo npm install -g socket.io
sudo npm install -g forever
sudo ln -s /usr/bin/nodejs /usr/bin/node
cd ~
git clone https://github.com/hakimel/reveal.js/
git clone https://github.com/garbast/remote-presentation-controller
cd remote-presentation-controller
npm install
ln -s public/reveal.js ../../reveal.js/js/reveal.js

設定箇所

config/index.js

var config = {
	port: 80,
	hostname: 'order.example.com',
	uid: 'user_xxx',
	gid: 'group_xxx',

	// store default list of presentations
	presentations: {
		'slide1': { // powerpoint presentation
			id: 'slide1',
			theme: 'simple',
			title: 'M祭(午前の部)',
			indexh: 0,  // initial slide horizontal index
			indexv: 0  // initial slide vertical index
		},
		'slide2': { // powerpoint presentation
			id: 'slide2',
			title: 'M祭(午後の部)',
			theme: 'simple',
			indexh: 0,  // initial slide horizontal index
			indexv: 0  // initial slide vertical index
		}
	}
};

exports.config = config;

app.js

app.listen(config.port, function() {
  process.setuid(config.uid);
});

presentations/slide1.ejs

<div class="reveal">
 <div class="slides">
   <section>
     Little Coder Mie
   </section>
   <section>
     <h1>申し訳ありませんが、フューチャーフォンには対応しておりません</h1>
   </section>
   <% for (var i = 0; i < 50; i++) { %>
   <section>
     <h3>午前の部</h3>
     <h2>現在</h2>
     <h1><%= i+1 %>番</h1>
   </section>
   <% } %>
   <section>
     <h3>午前の部</h3>
     <h2>現在いつでも大丈夫です</h2>
   </section>
 </div>
</div>

public/js/presentation.js

Reveal.initialize({
	controls: false,
	progress: false,
	history: false,
	center: false,
	slideNumber: false,
	keyboard: false,
	overview: false,
	center: true,
	touch: false,
	loop: false,
	showNotes: false,
	mouseWheel: false,
	hideAddressBar: true,
	previewLinks: false,

自動起動

サーバが起動したら、80番ポートで勝手に動いてくれるように。

sudo vi /etc/systemd/system/nodejs.service

 [Unit]
 Description=nodejs server
 After=syslog.target network.target

[Service]
 Type=simple
 ExecStart=/usr/bin/node /home/user/remote-slide/app.js
 WorkingDirectory=/home/user/remote-slide/
 KillMode=process
 Restart=always
 User=root
 Group=root

[Install]
 WantedBy=multi-user.target
 
sudo systemctl start nodejs
sudo systemctl stop nodejs
sudo systemctl enable nodejs

最後に

極端に行列が短くなったときや人が居なくなったときどうするかや、過ぎてしまった番号の扱いなどの運用面だけちゃんと決めておけば、単発イベントでお客さんがスマートフォンを持ってる層が多く、長い順番待ちを発生させちゃうような場合には結構使えるんじゃないかなぁと感じました。

googleさんに聞いた所、同様のWebサービスは見当たらない(病院関係の番号通知システムはたくさん出てくる)ので、閲覧側に広告貼って「調整さん」並に楽に使えるようにできたら(懐的に)いい感じに使ってもらえそうな気もするのですが、私の技術力では時間がかかりそうので、この情報を貼って 誰かに作ってもらうことにします。

Viewing all 72 articles
Browse latest View live