2013年12月19日木曜日

PHPMake

PHPMake というプロジェクトを作った。
https://groups.google.com/forum/?pli=1#!forum/phpmake

今までは個人的なプロジェクトとして、 Gorilla や php-usb をやってきた。
あれをこーしたいとかこれをあーしたいとか色々考えるけれど、頭の中から外に出ることはなかった。
これからはそれらをやると口に出し、宣言し、期限を設け、実行に移す。

2013年12月18日水曜日

昨日のアドベントカレンダーネタ

はっきり言って完璧にスベっている。
しかしながら、というか、だからこそ、俺のツイットをふぁぼってくれた人やブクマしてくれた人には感謝したい。

色々反省点はある。
まず何一つ真新しい要素がないという事。 RasPi で PHP ってのはもうすでにいろんな人が試している。
そしてなによりあのエントリのクォリティが低い。もっと面白い工作の実例が示せればよかったんだが、俺にその腕はない。フレームワークの詳細な導入手順も書くべきだったのか。
まだある。順番が逆、つまり、電子工作に興味がある人は電子工作ありきなのであって、目的が達成できるなら PHP だろうが、 C だろうが mruby だろうが言語なんてのは本来どうでもいいこと。

だが俺は PHP で電子工作を続ける。

今俺が作りたいのはギターのエフェクターだ。もっといえばプログラマブルなエフェクターだ。
エフェクターによって加えられる音の変化は基本的に回路の構成によって決まる。
そんなんいやじゃん。好きに音変えたいじゃん。 PHP で。
と、こんな事ぶっちゃけたが、今の俺のジツリキでは無理。しかしやる。

2013年12月17日火曜日

Raspberry Pi と PHP で遊ぼう

このエントリはPHP Advent Calendar 2013の17日目の記事です。
前日はDQNEOさんのhello worldの内部的な挙動を追ってみたでした。

こんにちは。 @oasynnoum と申します。
このエントリでは電子工作への足がかりとして、 PHP から Raspberry Pi の GPIO へアクセスする方法をいくつか紹介したいと思います。

Raspberry Pi Type B
左上部に見えるトゲトゲが GPIO ピン


そもそも電子工作ってなに?

早速 Wikipedia の電子工作の項から引用すると、
電子工作(でんしこうさく)とは、大量生産を目的としない電子機器の設計や製作のことである。
とあります。なるほど、確かに私自身がやってることに当てはまりそうです。
電子部品には様々ありますが、私の手元にあるものから以下にその一例を紹介します。


画像中の部品は上段左から抵抗コンデンサスイッチ(タクトスイッチ)LED(発光ダイオード)トランジスタ、次いで下段左から AVR マイコン圧電スピーカーサーボモーターと並んでいます。
こういったものを用いて現実世界に物理的にアプローチするのです。

電子部品は秋月電子通商スイッチサイエンスRSコンポーネンツストロベリーリナックスといったオンラインショップで購入できます。

何ができるの?

Web を検索すればいろいろな人のいろいろな作例を見つけることができます。
電子工作歴の浅い私自身は以下のようなものを一ヶ月半ほど前に工作してみました。


これは扇風機への私の熱い情熱とトランジスタへの誤解が生み出したまさに迷作です。
本来、アドベントカレンダーのネタとしてこのしょぼい回路の説明を試みるつもりでしたが、書き進めるうちに、トランジスタの端子を誤って扱っていることに気づきました。それにも関わらず動くシロモノになっています。ちなみにリモコンの電池消耗が早いです。


Raspberry Pi のセットアップ

Raspberry Pi のセットアップはとても簡単です。
一番簡単なのは SD カードに Raspberry Pi のホームページで紹介されている Linux をコピーする方法です。ソフトウェアのインストールもディストリビューション付属のパッケージマネージャーで簡単に行えます。
今更に書くことは無いように思いますが、Raspberry Pi 環境構築メモでその雰囲気が少しは伝わるかもしれません。


PHP の GPIO へのインタフェース

今回は以下の2つのライブラリを試してみました。

WiringPi-PHP

php-gpio


WiringPi-PHP

WiringPi は GPIO に Arduino 風にアクセスするための C API です。この作者自らがいろいろな言語へのバインディングを開発しています。 WiringPi-PHP もその一つで、 PHP 拡張として C で実装されています。上の私のデモ動画では WiringPi-PHP を用いています。

WiringPi-PHP には PHP スクリプトの example が用意されていないようです。
しかし元の WiringPi には C で書かれた簡潔な example がたくさん用意されていて、 WiringPi-PHP の API もほとんど同じなので、特に困ることはないと思います。

次のコードは上の動画で用いたものです。
wiringpi-php-example.php



php-gpio

php-gpio はいろいろと WiringPi-PHP とは対照的です。
実装は PHP で行われており、オブジェクト指向な API を持っています。 example もたくさん用意されています。
また、 composer でプロジェクトに組み込めるため導入は WiringPi-PHP よりも簡単です。

次のコードは上の WiringPi-PHP の例を php-gpio の API で書きなおしたものです。
php-gpio-example.php


ややこしい点

上の2つのコードでは変数 $pin に制御対象の GPIO ピンの番号が代入されています。
それぞれ 6 と 25 となっていますが、実は物理的には同じピンを指しています。
以下に Raspberry Pi の GPIO ピンの配置とそれぞれのフレームワークでの番号付けの対応を示します。

Raspberry Pi ピンの配置


ピン配置番号(ピン機能名称) php-gpioでの番号 WiringPi-PHPでの番号
11(GPIOピン17) 17 0
12(GPIOピン18) 18 1
13(GPIOピン21) 21 2
15(GPIOピン22) 22 3
16(GPIOピン23) 23 4
18(GPIOピン24) 24 5
22(GPIOピン25) 25 6


じゃいつやるか?

以上、長々と Raspberry Pi での PHP によるスクリプティングについてご紹介させていただきました。

単純に電子工作は楽しいです。
電子工作での Hello, World である LED 点灯を初めて行ったときの感動は、初めて marquee タグで文字を、まさしく、縦横無尽に画面上をスクロールさせた時の感動に匹敵するものでした。
様々な電子部品をつないで、どのように現実世界に作用を及ぼすか試行錯誤する過程は私の場合失敗ばかりですが、やはり楽しいです。


明日は@do_akiさんですね。楽しみにしてます!



2013年12月13日金曜日

Raspberry Pi 環境構築メモ

このエントリは私が Raspberry Pi (以下RasPi)のセットアップを行った際のメモです。

このメモ、手順は、
  • Raspberry Pi Type B を用いること
  • SD カードには Raspbian がインストール済みであること
を前提としています。
ありえない事とは思いますが、ここに書いてある手順を一般公開するWebアプリのプロダクションサーバーに適用しないでください。


ネットワーク設定(有線)

基本的にLANのコネクタにLANケーブルを差し込んで起動すればネットワークは正常に動作するはずです。
ただネットワークのデフォルトの設定は DHCP でIPアドレスを取得するため、起動のたびにIPアドレスが変わる可能性があります。そのたびに一々IPアドレスを確認するのは面倒なので、設定ファイルでIPアドレスを指定し、起動のたびにIPアドレスが変わらないようにします。

デフォルトの /etc/network/interfaces


IPアドレスを指定する例


デフォルトの interfaces 4行目末尾の dhcp を static に変更し、
address にはRasPiに与えるIPアドレス、 netmask にはネットワークマスク、 gateway にはルーターのIPアドレスを指定します。
変更を保存したら以下のコマンドでネットワークを再起動することで、変更が適用されます。

sudo /etc/init.d/networking restart

設定が変更されない場合は RasPi を再起動するといいかもしれません。(私の環境ではそうでした)


SSH サーバーの設定

私は RasPi にディスプレイやキーボードをつないで作業を行うのが苦痛なので SSH サーバーを起動し、普段使いの作業マシンから RasPi にアクセスしています。

SSH サーバーを起動させるために raspi-config を実行します。

$ sudo raspi-config

すると画面が次のような表示になります。



Advanced Options -> SSH -> Enable と選択すると、 SSH サーバーが起動します。
次回以降 RasPi を起動する際に SSH サーバーは自動的に起動します。


Apache Webサーバーのインストール

次のコマンドで Apache Webサーバーをインストールします。

$ sudo apt-get install apache2

途中、 E : Unable to fetch some archives, ... というエラーメッセージと共にインストールが失敗する場合があります。これはパッケージ情報が古くてダウンロードに失敗しているので、以下のコマンドでパッケージ情報を更新し、 再度上記コマンドでインストールを行います。

$ sudo apt-get update

インストールが完了すると自動的にWebサーバーが起動されるので、ブラウザのアドレスバーに RasPi のIPアドレスを入力すると以下のような画面が確認できます。


apache2 コマンドラインツール

/etc/init.d/apache2 はWebサーバーの起動・停止・状態確認を行うためのコマンドラインツールです。

# 状態確認
$ /etc/init.d/apache2 status

# 起動
$ sudo /etc/init.d/apache2 start

# 停止
$ sudo /etc/init.d/apache2 stop

デフォルトのドキュメントルート

Apache の設定ファイルは /etc/apache2 以下にインストールされます。
デフォルトの設定は /etc/apache2/site-available/default に記述されています。
この中を覗くと DocumentRoot /var/www という記述を見つけることができます。

PHP のインストール

PHP も上記2つと同様に apt-get でインストールします。

$ sudo apt-get install php5 php5-dev

これにより PHP の Apache モジュール(mod_php5)と、 コマンドラインインタフェース(php-cli)、 PHP 拡張をビルドする際に必要なヘッダファイルやツールがインストールされます。
PHP の動作を確認するために以下のファイルを /var/www/phpinfo.php として保存します。


ブラウザのアドレスバーに http://<RasPiのIPアドレス>/phpinfo.php と入力するとインストールされた php5(mod_php5) に関する情報が表示されます。




参考

このエントリはハードウェア初心者、Linux初心者の方にとっては十分な内容ではありません。(書いている私がそうですから)
私は Raspberry Pi を安全に扱うため、また、手っ取り早くやりたいことを実現するためにRaspberry Piユーザーガイドを参考に学習と実験を行なっています。
同書は Linux の導入、 Wi-Fi の設定、 Raspberry Pi のハードウェアとしての安全な扱い方などの基本的な内容から、ストリーミングサーバーの構築手順などの応用まで幅広い内容を扱っています。
是非同書を手に取ることをお勧めします。


俺がプログラミングを始めた理由

このエントリでは誰も望んでいない俺の自分語りをしようと思う。
自分語りと呼ばれるものの多くは、「おれはな、すげぇーんだぞ。おれをみくびんなよ」とかそういう内容である。いわば酔っぱらいのオッサンである。

俺がプログラマーになろうと思ったのは23の時、那覇空港、炎天下の貨物ターミナルのDAFコンの中だった。背の低いコンテナの中で体を折り曲げて航空貨物の仕分けをしていた。死にそうになりながら。
高校卒業から22まで真のニートで、初めて得た職だった。
肉体的にかなりハードな仕事で、コンテナの中でこの仕事は何歳まで続けられるのか、20代は続けられそうだが、30はどうか、ビミョーだがぎりぎりいける、じゃあ40は、無理だ、と答えが出るまでに5分はかからなかった。早速次の職について考え始めた。
やっぱデスクワークがいいよなぁってのは思った。男ができるデスクワークってなんだ。
司法書士?行政書士?司法書士ってのは相当難しいらしいってのはなんとなく頭にあった。仮に資格をとったとしてその後開業できるのか、俺が。想像できなかったのでこの選択肢は消えた。
次に浮かんだのは、求人誌で目にしていた「プログラマー」という職種。
俺がその時プログラマーに抱いていたイメージはPCの前でひたすらカチャカチャやってるってだけのイメージ。これならいけると思った。その当時PCすら持っていなかったが、iモードでポチポチエロ画像を収集する能力を持っていた俺に死角はなかった。

それからは姉のノートPC*1を借りパクして、求人誌にあった Perl という単語を手がかりに書店で入門書を手に入れ、 CGI プログラミングを始めた。(これと同じ時期ぐらいに家にネット回線を通した。)
プログラミングはもちろんすんなりいくわけがなく、悪戦苦闘、Alt+Tabでエディタとブラウザをしょっちゅう切り替えてF5連打という風に猿のように学習していた。
ある程度 CGI というのが何かを解って次に思ったのは、当時数少ない友人と二人でハマっていた必殺バトルロワイヤルのようなゲームを作りたいという事だった*2。ゲームの構成についていろいろ考えて実装に取り掛かったけど、結局頓挫。当時の俺にとって Perl のオブジェクト指向、モジュールプログラミングが難しすぎた。

そうして、ある日、ジャスコの書店のプログラミング関係の書棚の前で本を漁って「プログラミングできる俺」アピールをしていた時に PHP という Perl みたいなプログラミング言語があることを知った。
PHP の入門書をパラパラめくってみると、 Perl で難しかった*3 HTTP セッションの導入や画像のアップロードなんかがさらっとできるみたいな事が書かれていた。 PHP の導入も XAMP ってのを入れりゃいいらしいという事がわかった。 PHP が俺に「PHPをやれ」とささやいていた。

それから PHP のポケットリファレンスと入門書を二冊ほど買った。
速効!図解プログラミングPHP + MySQL は忘れもしない。もう棄てちゃって手元にはないけれど。これで俺は PHP でのプログラミングを実践的に学ぶことができた。ちなみに、その時の俺はWebアプリのセキュリティについて全く考えていなかった。「動くじゃん、いいじゃん」である。
それから、 amazon のようなショッピングカートを作りたいと思い始めた。そのショッピングカートで、手元にあるMTGのカードを処分して一攫千金を考えていた。
ケツロンから言うとショッピングカートは実装できた。商品管理、画像登録、受注・購入確認メール、どれも一応動いた。で、カードを売ったが、そんなに儲からんかった。
このショッピングカートを使っててひらめいた。「これ、みんなで使えるんじゃねえか?」と。
そこからショッピングカートに改良を加えて、ユーザー登録をした人はネットショップを持てるようになった。このサービスはアクティブなユーザーが4,5人くらいで推移し1年半くらいで消滅した。

職業としてのプログラマーではなかったが俺は完全に天狗になっていた。「俺、隠れプログラマーですから」みたいな感じで。

地元向けのWebサービスを展開する会社が求人をかけていたので、応募した。自慢のショッピングカートを引っさげて。
面接では猛烈にアピールした。「ケータイからすべての機能にアクセスできるレンタルショッピングカートシステム」とかなんとか言ってたような気がする。それを開発部の部長が評価してくれて、職業としてのプログラマーになることができた。24歳だった。これには今でも感謝しているし、これからも忘れることはない。

ここまで書いて、自分語りは尽きないようだという事と特別すごいとこなんか無いという事がわかった。
着地点が見えないのでこのへんで終いにする。


*1 RAM 128MB、ハードディスク容量 20GB、Windows XPなやつ。
*2 このゲームが2013年12月現在、健在なのには驚いた
*3 「難しい」というのはもちろんドシロウトの俺にとっての話