最近の一般向けワンボード・コンピュータ、なかんづく「Arduino」「Raspberry Pi」の状況

投稿日:

平成28年2月
JISTA ML リレーコラム 第1回
会員 関東支部 jista1197 佐藤俊夫

1 はじめに

 このところ、若い方やDIYなどを楽しむ一般の方向けに、ワンボード・コンピュータが売られています。しかも、相当な売れ行きであると仄聞(そくぶん)します。

 「Arduino」や「Raspberry Pi」、「IchigoJam」「Intel Edison」「mbed」と言った製品名を聞いたことがある方も多いでしょう。秋葉原を歩くと、店の表にこれらのカラフルな箱が山積みになっています。また、イタリア人マッシモ・バンジ氏の「TED」スピーチを見たことがある方もたくさんおられると思います。

 数年前から、普及価格帯の3Dプリンタが出現してきたことにより、一般人でも小規模の製品を作り、それを世に問うようなことが可能になってきました。そこから、「Makers Movement」と言われる流行が盛り上がりはじめました。これはオープンソース・イノベーションの自然な興隆ということに加えて、出版と連携した一種のマーケティングの成功であるとも言われているようです。ちなみに、この「Makers Movement」について著書を出し、流行に火をつけたのはクリス・アンダーソンと言う人ですが、この人の名を覚えている方もJISTA会員の皆さんには多いことでしょう。そう、かの「ロング・テール」の著者その人です。

 古くから言われる「DIY」と、最新流行の「Makers Movement」との違いは、そこに「ネット」が介在するか否かだ、と言ってもよいと思います。物を作る上での発想やハウ・トゥ、設計図、使用感などは、インターネットを通じて迅速に共有され、改良が加えられ、更に共有されます。

 こうしたことを背景に、3Dプリンタを使用してものを作り、作ったものへデジタルやITのパワーを盛り込むことが広く行われるようになりました。ものへデジタルやITのパワーを盛り込むのには、廉価なワンボード・コンピュータがうってつけだというわけです。

 実際、巷間ではArduinoがこれまでに100万台、Raspberry Piが700万台売れたと言われていますから、これらのワンボード・コンピュータは、ITのプラットフォームとして無視できない勢力になっていると言えます。また、これらは安価に数を得られることから、「IoT」流行の趨勢とも関連する雰囲気が濃厚に感じられます。

 私は仕事の上ではこれらと関わっておりません。しかし、その一方で、ITストラテジの道というものは、ITワールドを形作るもののうちの何が将来の影響要素としてつながってくるかわかりません。そうしたことから、これらワンボード・コンピュータを体験しておくことが何かの足しになることもあろうと思い、ArduinoとRaspberry Piを少しばかりいじってみておりましたところ、ちょうど今般リレーコラム執筆の機会を頂きました。

 そこで、この機会をお借りして、ArduinoとRaspberry Piについて、その状況などを簡単に紹介させていただきたいと思います。

2 Arduinoについて

 「Arduino」はイタリア人のマッシモ・バンジ氏を中心に、平成17年(2005)から開発が始められたワンボード・コンピュータです。バージョンアップや派生を含め、既に数十種類の製品があります。現在店頭で入手可能な製品には、代表的な「Arduino UNO」があり、これは本日(平成28年2月7日)現在、税込み2,940円で手に入ります。

 その特徴に、次のようなことを挙げることができます。

○ ハードウェアが「オープンソース」であること。

 仕様も設計もオープンで、一般人がネットから基盤のパターンなどをダウンロードしてそっくり同じものを製作することも可能です。また、そのため、世界中にArduinoのクローンを作っている企業やグループがあり、それら自由なクローンの種類を数え上げることはもはや不可能と言う状況にあります。

○ 開発環境が無料で配布されていること。

 開発環境は統合環境(IDE)になっており、これも無料です。様々なライブラリが日々提供され続けており、一般に入手可能なほとんどのハードウェアやIC、電子素子などを扱うためのライブラリがGitHubなどですぐに手に入ります。

○ アナログ入出力、デジタル入出力が簡単に可能であること。

 「Arduino UNO」の場合、基板上にはデジタルI/Oが14本、アナログINが6本、アナログOUTが6本あります。これにさまざまな電子部品をつないで制御することができます。

○ C++で簡単にプログラミングできること。

 従来の「マイコン」はアセンブラ一辺倒でしたが、ArduinoはC++でプログラミングでき、しかも、ややこしいハードウェア・アクセスはC++のクラスの中にすべてカプセル化され、手軽に扱うことが可能になっています。ユーザはオブジェクトを生成し、入出力ピンを開いて読み、書くだけでさまざまなことができます。

 こうした特徴があるため、Arduinoを使用すると、一般人がデジタル・プロダクトを簡単に製作することができます。

 かく言う私も次のようなことを試しました。

「スマート・ファン」

 安物の扇風機にArduinoとEtehrnetインターフェース、温度センサをとりつけ、Webサーバをこの扇風機に実装してブラウザから制御できるようにし、温度によって風量を変え、1/fゆらぎ送風ができるなど、ものすごく無駄にリッチ化した扇風機です。

 1980円の安物扇風機をめっちゃ高機能化(笑)して、結構遊べました。

ウェブ扇風機

「メールサーバ監視ランプ」

 メール来着状況を監視し、ランプの色で教えてくれるもの。昔はISDN用のルータにこうした機能があり、パソコンのスイッチを入れていなくてもメールチェックのタイミングを教えてくれて便利だったのですが、今はこういうものがなくなってしまったので、意を決して自作したわけです。実は、今はスマホでこれは出来てしまうのですが、LEDの輝度のパルス幅変調などを試して遊ぶのに格好の題材でしたので、あえて試してみました。

メールサーバお知らせランプ

「多機能リモコン」

 赤外線リモコンのある電化製品を、Webで制御するようにしたものです。パソコンからでも、スマホからでも操作できます。赤外線LEDは秋葉原などで100円ほどで手に入りますので、これを試す人は非常に多いようです。

いよいよ多機能リモコン

「モーターで動くおもちゃの類をデジタル・パワードにする」

 おもちゃにArduinoを積み込むと、男の子などは大変喜びます。ここでは、モーターで動く自動車に超音波センサをとりつけ、自律制御させるとともに、その自動車にデジカメを乗せて動画を撮影しています。

虫瞰(ちゅうかん)カメラ

 私には男の子供はありませんが、私自身が男の子じみた中年(笑)ですので、みずからこういうことを試して遊びました。

 このように、Arduinoを使うと、手軽にさまざまな機器を制御したり、デジタルパワーを盛り込んだものを作ることが可能です。

 伝統的にArduinoにはAtmel社のマイコン「AVR」シリーズが使われていましたが、最新の製品「Arduino 101」にはIntelのCurieが採用され、Bluetoothや6軸の加速度ジャイロセンサーが搭載されるなど、大変高機能化しています。

 さて、目が離せないArduinoですが、昨年ごろから、長年Arduinoを牽引してきた5人の人たちが仲違いし、分裂騒動を起こしてまだ決着がつかず、もめているようです。Arduinoコミュニティは既に大きなものになっているので、この騒動は残念なことであり、かつ、目が離せないところです。

3 Raspberry Piについて

 「Raspberry Pi」はイギリス人のイブン・アプトン氏を中心に、Raspberry Pi財団というところが開発しているワンボード・コンピュータです。SONYなども深くかかわっていると聞き及びます。

 平成24年(2012)に最初のモデルが発売され、バージョンアップ等で数種類の製品があります。現在店頭で入手可能な製品の代表的なものに「Raspberry Pi 2 Model B+」があり、これは本日(平成28年2月7日)現在で税込み5,000円です。

 次のような特徴があります。

○ れっきとした「PC」であること。

 前述のArduinoは「マイコンボード」であり、OS等は載っておりません。しかし、Raspberry PiはSoCを利用するれっきとした「パソコン」で、OSを載せて作動します。主としてRaspberry Pi用に最適化されたLinux(「Raspbian」というディストリビューション)が作動するほか、マイクロソフトからは「Windows 10 IoT core」というWindows製品が、なんと無料でコントリビュートされています。余談、最近のマイクロソフト社の変革ぶり、オープンソースやフリーへのコミットぶりには驚くばかりです。それだけ、IoTにからむ製品に注目しているということでしょう。

 また、HDMI端子やUSB、Ethernetの端子を基板上に標準で備えているので、キーボードやマウス、ディスプレイをつないでPCとして利用することができます。

○ あらゆる開発環境が利用可能なこと。

 「Linuxマシン」なので、Linuxで利用できる開発ツール類は全て利用できると言って過言ではありません。Raspberry Piになじみの良いのはPythonで、入門本などにはPythonの作例が多く載っております。他にRaspberry Pi向けに最適化されたビジュアル言語の「Scratch」などもあります。しかし、別にこれらにこだわる必要はなく、GCCが走りますから、C/C++も使えますし、他にシェル、PerlやPHP、Ruby、Javaも扱えます。極端な話、g77をインストールして「FORTRAN」でハードウェア制御を行うことも可能でしょう(聞いたことはありませんが……)。私などは、RubyやPythonに暗いので、CやPHPでRaspberry Piのプログラムを書きました。

 エディタやIDEも、自分が使い慣れた好きなものが使えます。私はviが好きなので、Raspberry Pi上でももっぱらviを使っています。

○ 簡単にデジタル入出力が可能なこと。

 「GPIO」と呼ばれるデジタル入出力端子を豊富に備えていますが、これらは、ユーザからはUNIXで言う所の「ファイルシステム上にあるスペシャル・ファイル」に見えます。ですので、このファイルをオープンし、読み、あるいは書くだけで外部に入出力ができ、ハードウェアの制御が可能です。

○ あらゆるミドルウェア等が利用可能なこと。

 Linuxであるがゆえ、Linuxで使えるミドルウェアなどはほとんどのものが利用可能です。例えば、MySQLやPostgreSQLなどのRDBも扱えます。また、ApacheなどのWebサーバ、sendmail、DovecotなどのPOP/IMAPサーバなども走ります。

 こうした特徴があるため、既存のオープンソース・ソフトウェアを用いて、相当複雑なことも可能です。

 Arduinoと違って、Raspberry Piは単体ではアナログ入力ができません。そこで、私はRaspberry PiにADC(アナログ・デジタル変換)のICを接続し、これにサーミスタを取り付け、Apache+PHP+C言語を使用して「ウェブ温度計の製作」などを試してみました。

Raspberry Piで温度を測ろう

 また、PHPでハードウェア制御もできます。私はこんなふうに、PHPを使用して、Webインターフェイスにより家電製品のスイッチをオン・オフすることなどを試しました。

そうか、PHPでもモノにつながるな

 Arduinoに比べてRaspberry Piの歴史は浅いのですが、その出荷台数などから見ても新進気鋭の勢いを持っており、躍進中であると言えます。

 もともと5,000円ほどの値段で、高価ではないRaspberry Piですが、昨年(平成27年(2015))11月に流れたニュースでは、なんと650円(5ドル)という驚くべき価格の製品「Raspberry Pi Zero」もラインナップに投入されました。

Raspberry Pi Zero

 この値段と大きさでLinuxが走るのですから、驚きです。さすがにEthernetはついていませんが、USBの無線LANドングルを接続すればネットにつながります。

 「Raspberry Pi Zero」は、この値段と大きさのゆえに数量を稼ぐことができますから、IoTにからむ何らかのブレイク・スルーをもたらす可能性も相当にあると言えるでしょう。

4 むすび

 私などが若い頃には、ワンボード・コンピュータというとNECのTK-80にとどめを打ったものです。一定の年齢層の人には大変懐かしいものの一つです。

 他方、ここまで触れましたように、現在のワンボード・コンピュータは長足の進歩を遂げており、ますます興味の尽きないものに変貌しております。

 今回紹介したものは一般向けのものなので、エンタープライズでの応用については、別途考察と検討、研究が必要であると思われますが、既に一般向けには広く普及していることから、早晩業務用途にも応用が広がることが想像されます。

ブログのフォントなどが気に入らないので

投稿日:

 このブログのフォントにプロポーショナルフォントが使われたり、一部に英文フォントなどが使われてしまったりするのが気に入らず、カスタムCSSを使っていた。だいたいうまくいっていたものの、細部においてどうも思ったように行かない。

 私は段落の行頭を1文字空けるのに、どうしても全角スペース1文字を使いたいし、また、字詰めが等幅フォントでないと嫌なのだ。これを言うと、スタイルシート原理主義の人は「文章のセマンティクスに関係のないレイアウト情報はスタイルシートに切り分けるべきだ!」などと言って怒鳴りだすので、どうにも辟易する。

 以前、Wikipediaに書いたある項目で、段落の行頭を全角一文字空けていたら全部削除され、なにかの間違いかなと思ってもう一度空け直したら今度は激しく叱られた。「そういうことがやりたいんだったら自分のユーザスタイルシートに書けやオッサン、コラ、ああ?!」と言うのである。

 それに関するこういう議論の主流の主張を読んでいると、もう、狂信的と言うか、アタマおかしいんじゃないだろうかとすら思えてくるのだ。

 いや、わかります。わかりますよ、言いたいことは。私も技術者の端くれですんでね。言う事はわかりますがね。……そうはいうものの、ですね……。プログラムのソースコードじゃねえんだし、ましてや裁判記録や法律の案文じゃないんだし、そんなにキリキリカリカリすることないでしょうが、と思う。

 そんなこともこれあり、このブログについては、意を決して「子テーマ」というのを書いてみた。WordPress特有のカスタマイズ機能だ。

 WordPressの子テーマは、テーマのサブディレクトリ並びに適当なディレクトリを掘り、そこに「style.css」「テンプレート・ファイル」「function.php」の3つを、それぞれある一定のルールに従って記述・配置すればよい。

 私は和・欧文ともに等幅の明朝体が使いたいので、「style.css」の「font-family」の記述を全部書き直して、一丁上がりである。

WordPress+Jetpackパブリサイズ共有のカスタマイズ

投稿日:

 WordPressとFacebookを併用するとき、有名プラグイン「Jetpack」の「バブリサイズ共有」機能を使うのは、常道中の常道である。

 私も愛用している。

 しかし、FBにクロスポストする際、記事の全文が引用されてしまうなど、いろいろと問題も多いことは指摘している人も多い。

 この「全文引用問題」については、「全文引用させないコツ」などを発表している方も多く、ネットに情報はたくさんある。

 ところが、私の場合、「別に全文引用されてもかまわない」のである。ただ、不満点は、「改行をサニタイズしないでほしい」ということなのだ。これをやられると、ホンット、FBのウォールが鬱陶しいものになってしまう。どうせ全文引用するなら、段落などもちゃんと引用してほしいのだ。

 そこで、プラグインのソースコードを覗き見る。

 「jetpack/modules/publicize.php」というのがパブリサイズ共有の機能部分で、その中に次のような個所がある。

public static function sanitize_message( $message ) {
	$message = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $message );
	$message = wp_kses( $message, array() );
	$message = preg_replace('/[\r\n\t ]+/', ' ', $message);
	$message = trim( $message );
	$message = htmlspecialchars_decode( $message, ENT_QUOTES );
	return $message;
}

 赤字の部分で空白とタブ、改行をサニタイズしているようだ。そこでこれをコメントアウトしてみた。

public static function sanitize_message( $message ) {
	$message = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $message );
	$message = wp_kses( $message, array() );
//	$message = preg_replace('/[\r\n\t ]+/', ' ', $message);
	$message = trim( $message );
	$message = htmlspecialchars_decode( $message, ENT_QUOTES );
	return $message;
}

 ところが、試してみてもやっぱり改行がサニタイズされてしまう。

 それに、こうやって対応することには問題がある。ソースコードをフォークしてしまうと、バージョンアップのたびに同じ個所をカスタマイズしなおすことになるのだ。だが、まあ、バージョンアップなんてそんなに頻繁にないし、こんなくらい、「まあいいや」で済んでしまうということもある。

 いずれにしても、これは引き続き要調査、である。

JetpackのOGPイメージがブランクなのが気に入らないので

投稿日:

 ブログからFacebookやTwitterへのクロスポストをするのに、jetpackというプラグインをありがたく使わせていただいているが、エントリに画像を特に載せなかった場合、Facebookなどへ送られるイメージがブランクになるのが気に入らない。

 FacebookやTwitterは、「OGP」と言われる仕組みを使ってアイキャッチ画像を載せる。htmlヘッダのmetaタグに「property」という属性を置いて、これに「og:image……」などと記載し、content属性に画像のURLを書いておけば、それがFacebookやTwitterなどに読み取られ、使われるのである。例えば、FacebookやTwitterにリンクを張った際に「http://k.yimg.jp/images/top/sp2/event/newyear/2016/omikuji2016_logo.png」という画像を載せたければ、ヘッダに書くタグは次のとおりである。

<meta property="og:image" content=http://k.yimg.jp/images/top/sp2/event/newyear/2016/omikuji2016_logo.png" />

(ヤフーさんに迷惑がかかるので、よいこの皆さんはこういう悪ふざけをしてはいけません。)(笑)

 なので、これを適当に書いてやれば、特に画像を使用していないブログのエントリでも、適当な画像がSNSにバナーのようにポストされる。

 前に、自分のプロフィールイメージが載るようにここを書き換えてみていたのだが、毎回毎回自分のむさくるしいイメージ(コレ(笑))が載るのも鬱陶しい。さりとて、いちいちアイキャッチ画像を毎回載せるのも面倒なので、適当な画像素材を1000個くらい見えるところにアップロードし、乱数で適当なものを選ぶようにしてみた。

 プラグインファイルの編集機能を使い、「jetpack/functions.opengraph.php」というファイルを次のように書き換えるのである。

(該当箇所抜粋)

	if ( empty( $image ) ) {
		/**
		 * Filter the default Open Graph Image tag, used when no Image can be found in a post.
		 *
		 * @since 3.0.0
		 *
		 * @param string $str Default Image URL.
		 */
		//$image['src'] = apply_filters( 'jetpack_open_graph_image_default', 'https://s0.wp.com/i/blank.jpg' );
		$randimage = "https://satotoshio.net/blog/wp-content/uploads/2015/12/PHM14_" . sprintf("%04d", rand(1, 1000)) . ".jpg";
		$image['src'] = apply_filters( 'jetpack_open_graph_image_default', $randimage);
	}

 この方法を使うと、jetpackがアップデートされるたびにこの部分を書き換えなければならなくなるが、まあ、いいや、そんなに頻繁にアップデートはないし。

Raspberry Piで温度を測ろう

投稿日:

 以前、Arduinoのアナログ入力にサーミスタをつなぎ、温度計にして遊んだ最近はLCDディスプレイに温度を表示してみたり、なかなか面白い。

 一方、Raspberry PiはWebによくなじむ。ApacheもPHPも走る。

IMG_3317 それで、先週宮城大学小島研究室のサイトで公開しておられるADCアクセスのためのソースコードを拝借して遊んだが、これを使ってWeb温度計にしてみた。

 まず、ブレッドボードにAD変換ICのMCP3208と、サーミスタ、分圧用の抵抗1kΩを置き、適切に配線する。これには、以前Arduinoで遊ぶために買った「Seeedstudio Arduino Sidekick Basic Kit」に入っていたMF11-503Kというサーミスタをそのまま使う。

 それから、C++でこんなプログラムを書く。先週も書いたが、宮城大学小島研究室のサイトで公開しておられるコードは、Raspberry Pi 1では何の支障もなく動くが、Raspberry Pi 2 Model Bではそのままでは動かない。一部の型キャストなどを変更する必要がある。それについては先週のエントリで記してある。

//
//    tempMesure.cpp
//      佐藤俊夫
//      Sun Sep  6 13:57:53 JST 2015
//      サーミスタMF11-503Kと1kΩ抵抗を直列につなぎ、3.3Vを印加して、
//      その間から分圧をとって温度を測る。
//      宮城大学小島研究室でウェブ公開しておられるソースコードを拝借した。
//      コンパイル
//        cc -lm tempMesure.cpp raspSPI.o raspADC.o -o tempMesure
//
#include <stdio.h>
#include <math.h>
#include "raspADC.h"

#define ADC_CHIP  ADC_3208
float tempMesure(int srcVal);

int main() {
  ADC adc;

  adc.init("/dev/spidev0.1", ADC_CHIP);
  printf("%2.2f\n", tempMesure(adc.get(0)));
}

float tempMesure(int srcVal){
  const float B = 4350.0, Ta = 25.0, Rt0 = 50000.0;  //  MF11-503Kスペックシート記載
  const float K = 273.15;  //  熱力学温度の定数
  const float v0 = 3.3, r0 = 1000.0;  //  Arduino +5Vと電流調整抵抗1kΩ
  const int resolution = 4096;  //  アナログ入力の分解能
  float vt = 0.0, rt = 0.0;

  vt = srcVal * (v0 / (resolution - 1));
  rt = (v0 * r0 - vt * r0) / vt;
  return(1.0 / (log(rt / Rt0) / B + 1.0 / (Ta + K)) - K);
}

 これは単に、サーミスタで計った現在の温度を標準出力に書くだけだ。

 これを「popen();」で開けば、PHPで読める。簡単である。

<html>
 <head>
  <meta name="Editor" content="vim">
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <link rel="icon" href="favicon.ico" type="image/x-icon" />
  <link rel="Shortcut Icon" type="image/x-icon" href="favicon.ico" />
  <title>PHPで温度計</title>
  <meta http-equiv="Keyword" content="佐藤俊夫, 佐藤, 俊夫, SATOTOSHIO, SatoToshio, sato, toshio, Raspberry Pi, Raspberry Pi 2 Model B">
 </head>
 <body bgcolor="#888888">
<body>
  <center>
  <h1><img src="raspberry_pi.png" width="50px" align="middle"/>Raspberry Pi + PHPで温度計</h1>
  <hr>
  </center>
<?
ini_set( 'display_errors', 1 );
$process = popen("sudo /home/toshio/SPI_ADC/tempMesure", "r");
$temp = fgets($process);
?>
<center>
<table border=1 width="120px">
<tr> <th>0</th><th>10</th> <th>20</th> <th>30</th> <th>40</th> <th>50</th> <th>60</th></tr>
<tr><td colspan = 7>
<table>
<tr>
<td bgcolor="red" width="<?print $temp * 2?>px"><?print $temp?>℃</td&t;</tr></table>
</tr>
</table>
</td></tr></tr></table>
</center>
</body>
</html>

raspberry_tempMesure
 テーブルの幅を温度計のアルコール柱に見立てて、赤い帯で表すようにしてみた。


 Arduinoでも同じようなことはできるが、Arduinoで難しいのは、こういうふうに、無駄に画像を配置したり、少し分量の多いHTMLを書いたりすることだ。だが、こんなことはRaspberry Piには造作もなくできてしまう。

 反面、Arduinoはアナログ入力が直接可能だが、Raspberry Piで同じことをしようとすると、アナログ入力にAD変換ICを準備し、これとの通信にもいろいろと研究の上で取り組む必要がある。簡単で刺激的な目的のために少しプロトタイピングをしてみようと考えている多くのクリエイターがなしうるところではない。

 入門書籍「Raspberry Piをはじめよう」にもそうしたことが少し書かれてある。

そうか、PHPでもモノにつながるな

投稿日:

raspi_index Raspberry Piは要するにLinuxマシンなので、ウェブサーバも選り取り見取りだ。単にウェブインターフェイスを備えたモノのプロトをするならArduinoのほうが手っ取り早いが、いかんせん、リッチなウェブ・コンテンツをArduino+ETHERNET SHIELD 2でサービスするのは難しく、不可能ではないにもせよ、ウェブ・コンテンツに写真を置くなどというのはほとんど無理であった。

 Raspberry Piはコンピュータ・パワーが大きいから、大きなウェブ・コンテンツも本体内に飲み込んでしまえる。

 そこで、である。Raspberry Piで遊ぶのに、なにも世間の教科書通りにPythonやRubyの作例を打ち込むだけが能ではない。CだってC++だって、PerlだってPHPだって動くはずである。SMTPもPOPもNTPも、なんだって動く。多分MySQLだのPostgreSQLだのも動くだろう。

 Apacheをインストールして動かしてみよう。それから、PHPでGPIOを突っついてみよう。これは、PHPでハードウェアを動かすことにつながる。無駄に贅沢なWebインターフェイスでLチカ、というのも面白い。

Apacheのインストールに先立ち、今動いているサービスを確かめよう

 まず、今起動しているモノを確認してみよう。RedHat系のLinux、Fedoraなどはこういう時に「chkconfig –list」などとするが、Raspberry Piに入っているのは「Raspbian」だ。RaspbianはDebian系のディストリビューションなので、chkconfigはない。

 私はUNIX育ちのオッサンで、SVR4.2の管理人を長年やっきた。Linuxに関してはフリー時代のRedHat(4~9ぐらいまで)、それ以降はずっとFedora Coreを使ってきたので、Debianは良く知らないのである。ま、これも機会だから、ちょっと体験してみようではないの。

 ネット情報によると「insserv」「update-rc.d」「sysv-rc-conf」「rcconf」「upstart」などがあるという。

# insserv -s
K:01:0 1 6:triggerhappy
K:07:0 6:umountfs
K:04:0 6:umountnfs.sh
K:02:0 6:sendsigs
K:01:0 6:plymouth
K:03:0 1 6:rsyslog
K:06:0 6 S:hwclock.sh
K:01:0 1 6:alsa-utils
K:06:0 6:networking
K:05:0 1 2 3 4 5 6 S:rpcbind
K:05:0 1 2 3 4 5 6 S:nfs-common
K:01:0 6:urandom
K:01:0 1 6:avahi-daemon
K:01:0 1 6:dhcpcd
K:01:0 1 6:cgroup-bin
K:08:0 6:umountroot
K:09:0:halt
K:09:6:reboot
K:01:0 1 6:fake-hwclock
K:01:0 1 2 6:lightdm
K:01:0 1 6:ifplugd
S:02:S:udev
S:03:S:keyboard-setup
S:15:S:console-setup
S:01:2 3 4 5:triggerhappy
S:08:S:mountall.sh
S:09:S:mountall-bootclean.sh
S:12:S:mountnfs.sh
S:13:S:mountnfs-bootclean.sh
S:04:2 3 4 5:plymouth
S:01:2 3 4 5:rsyslog
S:16:S:alsa-utils
S:11:S:networking
S:10:S:urandom
S:04:S:mountdevsubfs.sh
S:05:S:checkroot.sh
S:03:2 3 4 5:avahi-daemon
S:02:2 3 4 5:dbus
S:01:2 3 4 5:dhcpcd
S:01:2 3 4 5:cgroup-bin
S:01:S:mountkernfs.sh
S:01:S:fake-hwclock
S:03:3 4 5:lightdm
S:16:S:x11-common
S:14:S:kbd
S:01:2 3 4 5:ifplugd
S:02:1:single
S:01:1:killprocs
S:01:1 2 3 4 5:bootlogs
S:01:S:hostname.sh
S:01:1 2 3 4 5:motd
S:02:2 3 4 5:dphys-swapfile
S:04:2 3 4 5:rc.local
S:04:2 3 4 5:rmnologin
S:02:2 3 4 5:cron
S:02:2 3 4 5:rsync
S:02:2 3 4 5:ssh
S:02:2 3 4 5:ntp
S:01:2 3 4 5:sudo
S:16:S:raspi-config
S:10:S:udev-mtab
S:06:S:checkroot-bootclean.sh
S:16:S:bootmisc.sh
S:06:S:kmod
S:16:S:plymouth-log
S:07:S:checkfs.sh
S:06:S:mtab.sh
S:10:S:procps

 ほほー、なるほど、コレは多分、左から現状(StartかKillか)、起動順、起動すべきRun-Levelのリスト、サービス名、だろうなあ。はて、S、Kじゃないほうの、Run-Levelの「S」は、なんだろ、と調べると、「起動順で一番はじめ、かつ、どのRun-Levelでも共通で起動」ということのようである。

 で、

# insserv -s | egrep '(pache)|(ttp)'
#

 なんてことをやっても、全然何も出ないから、デフォルトのRaspbianではhttpらしきものやApacheらしきものは何も動いていない。

Apacheをインストール

 それでは、というわけで、

# apt-get -s install apache2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
提案パッケージ:
  apache2-doc apache2-suexec apache2-suexec-custom openssl-blacklist
以下のパッケージが新たにインストールされます:
  apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1
  libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
アップグレード: 0 個、新規インストール: 10 個、削除: 0 個、保留: 0 個。
Inst libapr1 (1.4.6-3+deb7u1 Raspbian:7.0/oldstable [armhf])
Inst libaprutil1 (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Inst libaprutil1-dbd-sqlite3 (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Inst libaprutil1-ldap (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Inst apache2.2-bin (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst apache2-utils (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst apache2.2-common (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst apache2-mpm-worker (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst apache2 (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst ssl-cert (1.0.32 Raspbian:7.0/oldstable [all])
Conf libapr1 (1.4.6-3+deb7u1 Raspbian:7.0/oldstable [armhf])
Conf libaprutil1 (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Conf libaprutil1-dbd-sqlite3 (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Conf libaprutil1-ldap (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Conf apache2.2-bin (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2-utils (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2.2-common (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2-mpm-worker (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2 (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf ssl-cert (1.0.32 Raspbian:7.0/oldstable [all])
#

 特に問題なさそうだな、というわけで……

# apt-get install apache2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
提案パッケージ:
  apache2-doc apache2-suexec apache2-suexec-custom openssl-blacklist
以下のパッケージが新たにインストールされます:
  apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1
  libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
アップグレード: 0 個、新規インストール: 10 個、削除: 0 個、保留: 0 個。
1,356 kB のアーカイブを取得する必要があります。
この操作後に追加で 4,585 kB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libapr1 armhf 1.4.6-3+deb7u1 [90.9 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libaprutil1 armhf 1.4.1-3 [77.1 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libaprutil1-dbd-sqlite3 armhf 1.4.1-3 [17.2 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libaprutil1-ldap armhf 1.4.1-3 [16.0 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2.2-bin armhf 2.2.22-13+deb7u6 [676 kB]
取得:6 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2-utils armhf 2.2.22-13+deb7u6 [163 kB]
取得:7 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2.2-common armhf 2.2.22-13+deb7u6 [292 kB]
取得:8 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2-mpm-worker armhf 2.2.22-13+deb7u6 [2,238 B]
取得:9 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2 armhf 2.2.22-13+deb7u6 [1,440 B]
取得:10 http://mirrordirector.raspbian.org/raspbian/ wheezy/main ssl-cert all 1.0.32 [19.5 kB]
1,356 kB を 4秒 で取得しました (281 kB/s)
パッケージを事前設定しています ...
以前に未選択のパッケージ libapr1 を選択しています。
(データベースを読み込んでいます ... 現在 78616 個のファイルとディレクトリがインストールされています。)
(.../libapr1_1.4.6-3+deb7u1_armhf.deb から) libapr1 を展開しています...
以前に未選択のパッケージ libaprutil1 を選択しています。
(.../libaprutil1_1.4.1-3_armhf.deb から) libaprutil1 を展開しています...
以前に未選択のパッケージ libaprutil1-dbd-sqlite3 を選択しています。
(.../libaprutil1-dbd-sqlite3_1.4.1-3_armhf.deb から) libaprutil1-dbd-sqlite3 を展開しています...
以前に未選択のパッケージ libaprutil1-ldap を選択しています。
(.../libaprutil1-ldap_1.4.1-3_armhf.deb から) libaprutil1-ldap を展開しています...
以前に未選択のパッケージ apache2.2-bin を選択しています。
(.../apache2.2-bin_2.2.22-13+deb7u6_armhf.deb から) apache2.2-bin を展開しています...
以前に未選択のパッケージ apache2-utils を選択しています。
(.../apache2-utils_2.2.22-13+deb7u6_armhf.deb から) apache2-utils を展開しています...
以前に未選択のパッケージ apache2.2-common を選択しています。
(.../apache2.2-common_2.2.22-13+deb7u6_armhf.deb から) apache2.2-common を展開しています...
以前に未選択のパッケージ apache2-mpm-worker を選択しています。
(.../apache2-mpm-worker_2.2.22-13+deb7u6_armhf.deb から) apache2-mpm-worker を展開していま す...
以前に未選択のパッケージ apache2 を選択しています。
(.../apache2_2.2.22-13+deb7u6_armhf.deb から) apache2 を展開しています...
以前に未選択のパッケージ ssl-cert を選択しています。
(.../ssl-cert_1.0.32_all.deb から) ssl-cert を展開しています...
man-db のトリガを処理しています ...
libapr1 (1.4.6-3+deb7u1) を設定しています ...
libaprutil1 (1.4.1-3) を設定しています ...
libaprutil1-dbd-sqlite3 (1.4.1-3) を設定しています ...
libaprutil1-ldap (1.4.1-3) を設定しています ...
apache2.2-bin (2.2.22-13+deb7u6) を設定しています ...
apache2-utils (2.2.22-13+deb7u6) を設定しています ...
apache2.2-common (2.2.22-13+deb7u6) を設定しています ...
Enabling site default.
Enabling module alias.
Enabling module autoindex.
Enabling module dir.
Enabling module env.
Enabling module mime.
Enabling module negotiation.
Enabling module setenvif.
Enabling module status.
Enabling module auth_basic.
Enabling module deflate.
Enabling module authz_default.
Enabling module authz_user.
Enabling module authz_groupfile.
Enabling module authn_file.
Enabling module authz_host.
Enabling module reqtimeout.
apache2-mpm-worker (2.2.22-13+deb7u6) を設定しています ...
[....] Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
. ok
apache2 (2.2.22-13+deb7u6) を設定しています ...
ssl-cert (1.0.32) を設定しています ...
#

 なんてことなく終わる。

Apacheの起動状況を確かめる

 次に、

# insserv -s | egrep '(pache)|(ttp)'
K:01:0 1 6:apache2
S:02:2 3 4 5:apache2
#

……ぬぅ、StartなのかKillなのか、どっちやねん、というわけで、ブラウザにアドレスを入れてみると、

raspi-apache2start

……と、普通にApacheは動いている。KとS両方出るのは、起動順が01、02となっていることから、Run-Level 0、1、6ではどうあろうと強制終了し、改めて2、3、4、5では起動、ということであろうか。

 えーっと、自動起動のほうはこれでいいから、サービスの起動停止のテストは……、と。

# /etc/init.d/apache2 stop
[....] Stopping web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
[ ok waiting ..
root@satoraspi:~# /etc/init.d/apache2 start
[....] Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
. ok
#

 ふむ、だいだい動いとる。

ドキュメントルートのindex.htmlを作る

 とりあえず、indexだけ、かっこよくしておこう。えーっと、ドキュメントルートはどこかいな、と。

# ls -Fla /etc/ | egrep '(http)|(apache)'
drwxr-xr-x   7 root root    4096  8月 30 09:01 apache2/
root@satoraspi:~# ls /etc/apache2
apache2.conf  envvars  mods-available  ports.conf       sites-enabled
conf.d        magic    mods-enabled    sites-available
# cd /etc/apache2
# grep 'DocumentRoot' */*
sites-available/default:        DocumentRoot /var/www
sites-available/default-ssl:    DocumentRoot /var/www
sites-enabled/000-default:      DocumentRoot /var/www

 ……と、いうわけで普通に「/var/www」の下じゃのう。普通のユーザに戻って、

toshio@satoraspi:~$ cd /var/www
toshio@satoraspi:/var/www$ ls -Fla
合計 12
drwxr-xr-x  2 root root 4096  8月 30 09:01 ./
drwxr-xr-x 12 root root 4096  8月 30 09:01 ../
-rw-r--r--  1 root root  177  8月 30 09:01 index.html
toshio@satoraspi:/var/www$ cat index.html
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>toshio@satoraspi:/var/www$

 はあ、さっきブラウザに出てたヤツでんな、と。

 一応残しておいて……

toshio@satoraspi:/var/www$ sudo cp index.html .index.html.ORG
[sudo] password for toshio:
toshio@satoraspi:/var/www$ sudo chown toshio:pi index.html
toshio@satoraspi:/var/www$ ls -Fla
合計 16
drwxr-xr-x  2 root   root 4096  8月 30 09:37 ./
drwxr-xr-x 12 root   root 4096  8月 30 09:01 ../
-rw-r--r--  1 root   root  177  8月 30 09:37 .index.html.ORG
-rw-r--r--  1 toshio pi    177  8月 30 09:01 index.html
toshio@satoraspi:/var/www$cd ..
toshio@satoraspi:/var$sudo chown toshio:pi www
toshio@satoraspi:/var$cd www
toshio@satoraspi:/var/www$vi index.html

 んで、ばーっ、って、書くですよ。

<html>
 <head>
  <meta name="Editor" content="vim">
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <link rel="icon" href="favicon.ico" type="image/x-icon" />
  <link rel="Shortcut Icon" type="image/x-icon" href="favicon.ico" />
  <title>おっさん用Raspberry Pi 2 Model B</title>
  <meta http-equiv="Keyword" content="佐藤俊夫, 佐藤, 俊夫, SATOTOSHIO, SatoToshio, sato, toshio, Raspberry Pi, Raspberry Pi 2 Model B">
 </head>
 <body bgcolor="#888888">
  <basefont size=4">
  <center>
  <table>
  <tr>
  <td>
    <h1>おっさん用Raspberry Pi 2 Model B</h1>
    <hr>
    <center><img src="raspberry_pi.png"></center>
  </td>
  </tr>
  <tr>
  <td>
    とりあえずまだ何もない。
  </td>
  </tr>
 </table>
 </center>
 </body>
</html>

 んで、画像なんかをSCPでコピーして、まずはこんなindex.htmlですな。

raspi_index

 それにしても、こんな、5千円かそこらのシングルボードでapache2のウェブサービスができるなんて、隔世の感があるな。

同じようにして、PHPをインストール

 さておき、続いてPHPを入れよう。

toshio@satoraspi:/var/www$ cd
toshio@satoraspi:~$ su -
パスワード:
root@satoraspi:~# apt-cache search php5
dwoo - PHP5 template engine
libapache2-mod-php5 - server-side, HTML-embedded scripting language (Apache 2 module)
libapache2-mod-php5filter - server-side, HTML-embedded scripting language (apache 2 filter module)
libexpect-php5 - expect module for PHP 5
libgv-php5 - PHP5 bindings for graphviz
libkohana2-modules-php - lightweight PHP5 MVC framework (extension modules)
libkohana2-php - lightweight PHP5 MVC framework
libkohana3.1-core-php - PHP5 framework core classes
libkohana3.1-php - PHP5 framework metapackage
libkohana3.2-core-php - PHP5 framework core classes
libkohana3.2-php - PHP5 framework metapackage
libow-php5 - Dallas 1-wire support: PHP5 bindings
libphp-jpgraph - Object oriented graph library for php5
libphp-jpgraph-examples - Object oriented graph library for php5 (examples)
libphp5-embed - HTML-embedded scripting language (Embedded SAPI library)
php-doc - Documentation for PHP5
php-imlib - PHP Imlib2 Extension
php5 - server-side, HTML-embedded scripting language (metapackage)
php5-adodb - Extension optimising the ADOdb database abstraction library
php5-cgi - server-side, HTML-embedded scripting language (CGI binary)
php5-cli - command-line interpreter for the php5 scripting language
php5-common - Common files for packages built from the php5 source
php5-curl - CURL module for php5
php5-dbg - Debug symbols for PHP5
php5-dev - Files for PHP5 module development
php5-enchant - Enchant module for php5
php5-exactimage - fast image manipulation library (PHP bindings)
php5-ffmpeg - audio and video support via ffmpeg for php5
php5-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php5-gd - GD module for php5
php5-gdcm - Grassroots DICOM PHP5 bindings
php5-geoip - GeoIP module for php5
php5-gmp - GMP module for php5
php5-imagick - ImageMagick module for php5
php5-imap - IMAP module for php5
php5-interbase - interbase/firebird module for php5
php5-intl - internationalisation module for php5
php5-lasso - Library for Liberty Alliance and SAML protocols - PHP 5 bindings
php5-ldap - LDAP module for php5
php5-librdf - PHP5 language bindings for the Redland RDF library
php5-mapscript - php5-cgi module for MapServer
php5-mcrypt - MCrypt module for php5
php5-memcache - memcache extension module for PHP5
php5-memcached - memcached extension module for PHP5, uses libmemcached
php5-midgard2 - Midgard2 Content Repository - PHP5 language bindings and module
php5-ming - Ming module for php5
php5-mysql - MySQL module for php5
php5-mysqlnd - MySQL module for php5 (Native Driver)
php5-odbc - ODBC module for php5
php5-pgsql - PostgreSQL module for php5
php5-ps - ps module for PHP 5
php5-pspell - pspell module for php5
php5-radius - PECL radius module for PHP 5
php5-recode - recode module for php5
php5-remctl - PECL module for Kerberos-authenticated command execution
php5-rrd - rrd module for PHP 5
php5-sasl - Cyrus SASL extension for PHP 5
php5-snmp - SNMP module for php5
php5-sqlite - SQLite module for php5
php5-svn - PHP Bindings for the Subversion Revision control system
php5-sybase - Sybase / MS SQL Server module for php5
php5-tidy - tidy module for php5
php5-tokyo-tyrant - PHP interface to Tokyo Cabinet's network interface, Tokyo Tyrant
php5-vtkgdcm - Grassroots DICOM VTK PHP bindings
php5-xcache - Fast, stable PHP opcode cacher
php5-xdebug - Xdebug Module for PHP 5
php5-xmlrpc - XML-RPC module for php5
php5-xsl - XSL module for php5
phpunit - Unit testing suite for PHP5
root@satoraspi:~#

 はあ、いっぱい出たけど、要するにPHP5があるんだよな。うん、うん。

root@satoraspi:~# apt-get -s install php5
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  apache2-mpm-prefork libapache2-mod-php5 libonig2 libqdbm14 lsof php5-cli php5-common
提案パッケージ:
  php-pear
以下のパッケージは「削除」されます:
  apache2-mpm-worker
以下のパッケージが新たにインストールされます:
  apache2-mpm-prefork libapache2-mod-php5 libonig2 libqdbm14 lsof php5 php5-cli
  php5-common
アップグレード: 0 個、新規インストール: 8 個、削除: 1 個、保留: 0 個。
Remv apache2-mpm-worker [2.2.22-13+deb7u6] [apache2:armhf ]
Inst apache2-mpm-prefork (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2-mpm-prefork (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst lsof (4.86+dfsg-1 Raspbian:7.0/oldstable [armhf])
Inst php5-common (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Inst libonig2 (5.9.1-1 Raspbian:7.0/oldstable [armhf])
Inst libqdbm14 (1.8.78-2 Raspbian:7.0/oldstable [armhf])
Inst libapache2-mod-php5 (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Inst php5 (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [all])
Inst php5-cli (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Conf lsof (4.86+dfsg-1 Raspbian:7.0/oldstable [armhf])
Conf php5-common (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Conf libonig2 (5.9.1-1 Raspbian:7.0/oldstable [armhf])
Conf libqdbm14 (1.8.78-2 Raspbian:7.0/oldstable [armhf])
Conf libapache2-mod-php5 (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Conf php5 (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [all])
Conf php5-cli (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
root@satoraspi:~#

 入れても大丈夫みたいだ。

root@satoraspi:~# apt-get  install php5
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  apache2-mpm-prefork libapache2-mod-php5 libonig2 libqdbm14 lsof php5-cli php5-common
提案パッケージ:
  php-pear
以下のパッケージは「削除」されます:
  apache2-mpm-worker
以下のパッケージが新たにインストールされます:
  apache2-mpm-prefork libapache2-mod-php5 libonig2 libqdbm14 lsof php5 php5-cli
  php5-common
アップグレード: 0 個、新規インストール: 8 個、削除: 1 個、保留: 0 個。
6,142 kB のアーカイブを取得する必要があります。
この操作後に追加で 17.3 MB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2-mpm-prefork armhf 2.2.22-13+deb7u6 [2,342 B]
取得:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main lsof armhf 4.86+dfsg-1 [321 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian/ wheezy/main php5-common armhf 5.4.44-0+deb7u1 [621 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libonig2 armhf 5.9.1-1 [130 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libqdbm14 armhf 1.8.78-2 [119 kB]
取得:6 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libapache2-mod-php5 armhf 5.4.44-0+deb7u1 [2,479 kB]
取得:7 http://mirrordirector.raspbian.org/raspbian/ wheezy/main php5 all 5.4.44-0+deb7u1 [1,024 B]
取得:8 http://mirrordirector.raspbian.org/raspbian/ wheezy/main php5-cli armhf 5.4.44-0+deb7u1 [2,469 kB]
6,142 kB を 6秒 で取得しました (1,016 kB/s)
dpkg: apache2-mpm-worker: 依存関係に問題があります。しかし要求に従い削除しています:
 apache2 は以下に依存 (depends) します: apache2-mpm-worker (= 2.2.22-13+deb7u6) | apache2-mpm-prefork (= 2.2.22-13+deb7u6) | apache2-mpm-event (= 2.2.22-13+deb7u6) | apache2-mpm-itk (= 2.2.22-13+deb7u6) ...しかし:
  パッケージ apache2-mpm-worker は削除されようとしています。
  パッケージ apache2-mpm-prefork はまだインストールされていません。
  パッケージ apache2-mpm-event はまだインストールされていません。
  パッケージ apache2-mpm-itk はまだインストールされていません。

(データベースを読み込んでいます ... 現在 79208 個のファイルとディレクトリがインストールされています。)
apache2-mpm-worker を削除しています ...
[....] Stopping web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
[ ok waiting ..
以前に未選択のパッケージ apache2-mpm-prefork を選択しています。
(データベースを読み込んでいます ... 現在 79203 個のファイルとディレクトリがインストールされています。)
(.../apache2-mpm-prefork_2.2.22-13+deb7u6_armhf.deb から) apache2-mpm-prefork を展開してい ます...
apache2-mpm-prefork (2.2.22-13+deb7u6) を設定しています ...
[....] Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
. ok
以前に未選択のパッケージ lsof を選択しています。
(データベースを読み込んでいます ... 現在 79208 個のファイルとディレクトリがインストールされています。)
(.../lsof_4.86+dfsg-1_armhf.deb から) lsof を展開しています...
以前に未選択のパッケージ php5-common を選択しています。
(.../php5-common_5.4.44-0+deb7u1_armhf.deb から) php5-common を展開しています...
以前に未選択のパッケージ libonig2 を選択しています。
(.../libonig2_5.9.1-1_armhf.deb から) libonig2 を展開しています...
以前に未選択のパッケージ libqdbm14 を選択しています。
(.../libqdbm14_1.8.78-2_armhf.deb から) libqdbm14 を展開しています...
以前に未選択のパッケージ libapache2-mod-php5 を選択しています。
(.../libapache2-mod-php5_5.4.44-0+deb7u1_armhf.deb から) libapache2-mod-php5 を展開しています...
以前に未選択のパッケージ php5 を選択しています。
(.../php5_5.4.44-0+deb7u1_all.deb から) php5 を展開しています...
以前に未選択のパッケージ php5-cli を選択しています。
(.../php5-cli_5.4.44-0+deb7u1_armhf.deb から) php5-cli を展開しています...
man-db のトリガを処理しています ...
lsof (4.86+dfsg-1) を設定しています ...
php5-common (5.4.44-0+deb7u1) を設定しています ...

Creating config file /etc/php5/mods-available/pdo.ini with new version
libonig2 (5.9.1-1) を設定しています ...
libqdbm14 (1.8.78-2) を設定しています ...
libapache2-mod-php5 (5.4.44-0+deb7u1) を設定しています ...

Creating config file /etc/php5/apache2/php.ini with new version
[....] Restarting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
. ok
php5 (5.4.44-0+deb7u1) を設定しています ...
php5-cli (5.4.44-0+deb7u1) を設定しています ...

Creating config file /etc/php5/cli/php.ini with new version
update-alternatives: /usr/bin/php (php) を提供するために 自動モード で /usr/bin/php5 を使います
root@satoraspi:~#

……と、いうわけで、サクッと入る。

PHPの作動を確かめる

 それでは早速……。

root@satoraspi:/var/www# ログアウト
toshio@satoraspi:~$ cd /var/www
toshio@satoraspi:/var/www$ vi infotest.php

 で、中身はこじんまりとこう書いて……

<html>
<head></head>
<body>
<?phpinfo();?>
</body>
</html>

 早速ブラウザで見ると……

raspi-phpinfo

うん。動いちょる動いちょる。

さっそくPHPでLチカ

 さて、次に、phpからGPIOだな。マンネリだけどやっぱり「Lチカ」か。

「web2LED.php」

<html>
 <head>
  <meta name="Editor" content="vim">
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <link rel="icon" href="favicon.ico" type="image/x-icon" />
  <link rel="Shortcut Icon" type="image/x-icon" href="favicon.ico" />
  <title>PHPでLチカ</title>
  <meta http-equiv="Keyword" content="佐藤俊夫, 佐藤, 俊夫, SATOTOSHIO, SatoToshio, sato, toshio, Raspberry Pi, Raspberry Pi 2 Model B">
 </head>
 <body bgcolor="#888888">
<body>
  <center>
  <h1>PHPでLチカ</h1>
  <hr>
  <form method="POST">
  <input type="submit" name="on"  value="LED on"><br>
  <input type="submit" name="off" value="LED off">
  </form>
  </center>
<?
ini_set( 'display_errors', 1 );
file_put_contents('/sys/class/gpio/export', 17);
file_put_contents('/sys/class/gpio/gpio17/direction', 'out');
if(isset($_POST['on'])){
  file_put_contents('/sys/class/gpio/gpio17/value', 1);
  print("LED ON.");
}elseif(isset($_POST['off'])){
  file_put_contents('/sys/class/gpio/gpio17/value', 0);
  print("LED OFF.");
}
file_put_contents('/sys/class/gpio/unexport', 17);
?>
</body>
</html>

 ブレッドボードにLEDと330Ωの抵抗を直列につけて、17番ピンとアースにつなぐ。

IMG_3313

 で、こういうフォームになるのだが……

web2LED_permission_deny

 いや、そりゃまあ、動くわけないわな、GPIOはrootでなきゃ読み書きできんのだから。

GPIOのパーミションの調整

 えーっと、どうやったらいいかな、ということで、

  • 「sudoする」
  • 「GPIOのアクセス権をヌルくする」
  • 「PHPの実行ユーザを強くする」
  • 「何かをSUID」

……などと、いろいろあるが、どうも、どれもいまいち、ピンと来ないな……。

 まあ、GPIOのアクセスをヌルくする、これかなあ……。

toshio@satoraspi:~$ cd /sys/class
toshio@satoraspi:/sys/class$ su
パスワード:
root@satoraspi:/sys/class# chmod -R 777 gpio
root@satoraspi:/sys/class# ls -Flad gpio
drwxrwxrwx 2 root gpio 0  8月 30 13:20 gpio/
root@satoraspi:/sys/class#

 なんっか、もう、力いっぱい777丸出しですけどね(笑)。多分、700とか760でも大丈夫じゃないかなあ。試してないけど。

 で、まあ、これで、フォームをクリックするとLEDが点いたり消えたりする。

Raspberry Pi + Apache + PHP + SSRでAC100Vの家電製品を制御

 これをそのまま、いつぞやArduinoでやったSSR(ソリッド・ステート・リレー)につなぐと、家電製品のオン・オフなどができるわけだ。

SSRモジュール
IMG_3047

 では、やってみよう。

Raspberry Pi 2で扇風機のオン・オフ

 真ん中の黒い箱がSSRだ。Arduinoは5V、Raspberry Pi 2は3.3Vで電圧が違うが、このSSRは3Vから8Vまでの入力を受け付けるので、大丈夫なのである。

Perlとかphpなどの

投稿日:

 PerlとかPHPなどの、ダラダラと随筆風にプログラミングできるWeb向き言語に慣れると、ArduinoにETHERNET SHIELD 2を取り付けた時のCGI引数の処理にしんどさを覚えるのは確かだ。特に正規表現でいろいろやりたい、という場合が苦しい。

ピアノとハゲとデブとダイエットと目標とEVMと血

投稿日:

 ピアノの腕前の上達は、今の歳の、しかも40過ぎてからはじめた私のような者にとっては、まことに遅々として(はかど)らぬものだ。

 ものごと、何につけても目標を持ってやるように子供たちを指導していきましょう、とは、昨日長女の高校の入学式で、校長先生も担任の先生も言われていたことだ。これはこれで立派なことであり、若者をそのように指導することは、有益なことである。

 だが、私は、ことピアノに関する限り、目標を持たないことにしてきた。「今の『練習』を楽しむ」ようにしている。

 そうしないと、目標と自分の腕前の懸隔に絶望し、続けることができなくなる。幼稚園の頃からほんの数年レッスンしただけの、自分の次女のような小娘にすらかなわないということが情けなくなり、稽古がバカバカしくなってしまうのだ。

 つまり、突然山の麓に立たされて、山頂を見上げてウンザリする感じ、だろうか。

 地面と、ごく周囲の景色だけを見ながら漫歩していて、ふっ、と顔を上げたら、相当高いところまで登ってしまっていた。……そんな行路だって、あっていい。

 だから、私のピアノの稽古は、まことに進歩が遅く、薄紙を一枚一枚、貼り重ねていくような緩慢さである。

 このようなやり方で物事に処していくには、ただひとつ、「時間」を味方にすることだ、と今のところ思っている。

 これは、ダイエットなどにも言えると思う。逆に、肥満の状態も、「時間」が敵だったはずだ。

 どういうことか。

 ダイエットに悩む人は、何も最初から、醜い姿だったわけでも、醜い姿になりたかったわけでも、ないはずだ。

 一日に、ほんのごくわずか、薄紙を貼り重ねるように肥満していったのである。また、一日に、ほんのごくわずか、薄紙を貼り重ねるように「余分なひとくち……」を食っていったのである。

 これは、「ハゲ隠しに珍妙な髪形をしている人」も同じだ。亡くなった軍事評論家のエバケンこと、江畑謙介氏の極端な例を見てみたい。

 何も、エバケンさんだって、若い頃、最初っからこんな珍妙な髪型を目標にしていたわけでは決してあるまい。今日少しハゲたぶんを、ごくわずか櫛で隠しただけであったはずだ。その次の日もそのあくる日も、少し櫛を使っただけだ。そして、1ヶ月、1年、10年。こういう時間の経過が、あのエバケンスタイルを作り上げていったのである。

 思うに、ダイエットも「無闇ヤタラな目標」など、持たないようにしては如何か。今日、ちょっぴり「食わない」。その効果なんか、はっきり言って1日やそこらでは出るはずなんかない。

 私はこの30年ほど、毎日、少しづつ肉体の練成に励んでいる。しかし、スポーツ選手のように強靭ではないし、ボディービルダーのようなマッチョでもない。今日腕立て伏せをしたからといって、明日マッチョになるわけではないのだ。才能や体質もある。

 そこに見出したいのは、エバケンさんの「逆」だ。

 ピアノの稽古にしても、私は、エバケンさんの「逆」をつかみたいのだ。

 社会で仕事をしていると、日々、EVMだの指標だの株価だのケイツネだの本日FP実績だの、そんなものに溺れそうに(まみ)れて生きることに慣れてしまい、また、上下左右の周囲からも必ずどれだけできたかを問われる。だから社会人は、ついついそんな論理を家庭生活などにも持ち込みがちだ。しかし、そんなことは仕事だけにしておくのがいいと思う。

 去年、職場の健康管理指導がずいぶんとうるさいものだから、

「じゃあ、普段実績だの効果だのなんだのガタガタ言ってるんだから、毎日、減量のEVMでもやったらどうですか(笑)」

……みたいなちょっとした皮肉もこめてプログラムを書いた。それは「ダイエットのEVM」をやる「鬼痩~Devil Diet~」という、フザケたアプリだ。

 これを盆休暇にPHPで書き、職場に持ち込んでやった。中身は、国立健康・栄養研究所の「EX~METs」の指標を使い、日々のダイエットをEVMにしてくれるというものだ。エクセルでもできるが、ふざけてPHPで書いたのだ。毎日、「今日は駆け足なら何キロ、歩くんなら何時間、水泳なら何キロやれ。そうすりゃ何グラム痩せる。目標の何月何日までに何キロの体重に痩せたけりゃ、今日絶対に何キロ走れ」という計画表が出てくる理屈である。それがEVMグラフとなって出る。PVのガイドには、リニアと対数、それから自然な計画ができるように、レイリー分布を積分した、S字計画などを選べるようにした。

 自分でこれを検証した。

 国立健康・栄養研究所の理論はまことによくできていて、その表の通りに痩せる。もっとも、私はあまり「切りしろ」のない体をしているので、自分でこれを試すのは非常に苦痛であった。

 だが、EVMで痩せることはできる。

 公表したところ、私の皮肉もあって、「こ、これは本当に、『鬼』じゃあ!!」という評判になった。

 実際のところ、人間は金属とか棒、石などではないのだ。「今日何カロリー摂って、何キロ走り、何グラム痩せろ」なんてことを、レイリー分布に沿って言われたって、そんなことができる位なら、肥満なんかしないのだ。私の作ったアプリのEVMのとおりに運動して痩せようとすると、人によっては、「3ヶ月後まで、毎日休まず、一日4時間全力で走れ」などというムチャクチャな命令が出力されるのである。普段数字にうるさい人ほど、無茶な計画を浴びせられるような塩梅(あんばい)式になった。

 本当に、人間は木とか石ではない。切れば赤い血の流れる、矛盾と怠惰と勤勉と精神とウンコを一緒くたに内包した血袋なのだ。

 だから、そんなガンガンガンガン、目標だ実績だと言われたって、そこまでできるもんか。

 毎日「なんのために」という目標もなくピアノの稽古をしたって、いいじゃないですか、楽しいんだから。

 だから、毎日「誰のために」という目標もなく、ダイエットしたっていいと思う、痩身が美しいと思うのなら。

 目標なんかない、勉強が好きだから勉強している、という勉強も、場合によってはいいんじゃないですかね。

 ENIACを建造したエッカートとモークリが、何も、今の高度情報化社会を目標にして毎日図面を引いたわけじゃなかったとも思いますしね。

 ただ、そうはいうものの、間違いのないように、ひとつ申し添えたい。「目標なんかいらん」とまで、私は言ってない。それは、目的と場合によるのだ、ということが言いたいのだ。

CTB-701「フルマーケット化」一件

投稿日:

 Androidのタブレットが大変安くなっており、ひとつ欲しいなあ、と思っていた。

 近くのPC DEPOTで、中国製のものが1万円以下で売られている。そのうちの手ごろなものに「Flead Tab CTB-701」というのがあり、9970円だ。Android 4搭載で、カメラなども付いている。そう悪くない。だが箱を見てみると「Google Playには対応しておりません」などと書かれていて、残念である。

 だがしかし、これを回避する要領がネットに出回っており、簡単に修正できることを知った。このようなことをマニア達は「フルマーケット化」と呼んでるようで、中国製の安価なものなどを入手しては、このようにして快適に使っていると言う。

 さっそく買ってきて、試してみると非常に快適なので、以下にその要領を記しておきたい。

 SDを挿し、ネットワークの設定などまでを説明書を見つつ行う。

 次URLの記事を見て、ファームを変える。


○ http://bbs.kakaku.com/bbs/K0000398539/Page=2/SortRule=1/ResView=all/

多分ですが、、下記のURL(DROPBOX)にPlaystore対応版ファームが公開されているようです。
http://forum.xda-developers.com/showthread.php?p=29687480#post29687480
あっ、でもメーカーサポート受けられなくなるかもしれないのでご注意!


○ http://forum.xda-developers.com/showthread.php?p=29687480#post29687480

[CTB-701 Unlocked]

I was successfully unlocked the CTB-701 and combined Google play/map. Now I am publishing the new image for everyone who are interesting in.

(我成功unlock了CTB-701,並導入了Google Play和Google MAP。現在公開給大家,如果有興趣的話,歡迎下載試試看。)

http://dl.dropbox.com/u/95580430/update.zip


○ http://fleadroid.blog.fc2.com/blog-entry-27.html

ファームウエアの更新方法
1. 新しいファームウェアをサイトからダウンロードする。
そのファイル名称は必ずupdate.zipである必要があります。

2. MicroSDカードにコピーして、CTB-701に挿入する。
ファイルはルートディレクトリに置く必要があります。

3. 設定> タブレット情報> SystemUpdateを選択する。
画面に従ってアップデートが開始されます。必ず電源アダプタを挿入して行うようにしてください。


 画面にしたがってアップデートを始める。一度再立ち上げがかかる。ドロイド君の「アップデート中」の絵が出て、更にもう一度再立ち上げがかかる。

 アプリメニューを見ると、「Playストア」のアイコンが現れて、使えるようになっている。

 Playストアのアイコンをクリックするとアカウントの登録手順が始まる。Googleアカウントを登録して進めると、Playストアの名前が「Google Play」に替わる。

 アプリをダウンロードして使うことができるようになる。

Twitter API を OAuth認証で使う場合の勘所

投稿日:

 このテのエントリを書くのは、私には大変めずらしいことだが、備忘録がわりに書く。

 ツイッターAPIとOAuthをphpで使うのは、結局のところ、例えば「記事を書く場合」なら、

<?
$oauth =
  new OAuth("コンシューマキー", "コンシューマシークレット",
            OAUTH_SIG_METHOD_HMACSHA1,
            OAUTH_AUTH_TYPE_URI);
$oauth -> setToken("アクセストークン", "アクセストークンシークレット");
$oauth -> fetch("http://twitter.com/statuses/update.xml",

  array("status" => "ほげほげ"),
  OAUTH_HTTP_METHOD_POST);
?>

 ……というコードを実行させる、ということである。これで、ツイッターに「ほげほげ」と書き込まれる。

 それだけだ。それ以外に何もない。

 ただ、そこまでにいろいろとやることがある。

 まず、phpで「OAuth」オブジェクトが使えるようになっていなければならない。それを楽にセットするためにはpeclが動いていなければならない。今日現在はphpのOAuthはまだbetaであることにも注意が必要だ。

 そこで、

# yum install php-pear
  (途中出力及び対話略)
# yum install php-devel
  (途中出力及び対話略)
# yum install curl-devel
  (途中出力及び対話略)
# pecl install oauth-beta
  (途中出力及び対話略)
# echo ‘
extension=oauth.so
‘ >>/etc/php.ini
# /etc/rc.d/init.d/httpd restart
  (出力略)

 などとする。私の環境の場合だが、まあ、多分、どんな環境でも考え方は同じだろう。

 それから、ツイッターのコンシューマキーとコンシューマシークレットを取る。これには、ツイッターのフォームから申込む。

 この申し込みでは、「Application Type」に「Browser」を選び、「Callback URL」に公開サーバに置いたプログラムのURLを正しく入力する必要がある。他の欄は適当で良い。「Application Name」は日本語も大丈夫だから、オリジナリティあふれる、気に入った名前にするといいだろう。

 うまく申し込めば、画面が遷移し、コンシューマキーConsumer key、コンシューマシークレットConsumer secret、またその他の必要なAPIのURLが表示されるので、これをコピーして保存する。

 次にやることは、アクセストークンとアクセストークンシークレットを取ることだ。

 phpのマニュアルの中の「ウェブサービス」の項目の中に「OAuth」の項目があるから、それを見る。その中に、OAuthを使う一例がある。

これをコピーして、少しカスタマイズする。このカスタマイズの目的は、アクセストークンとアクセストークンシークレットをツイッターから貰い、それを表示させることにある。プログラムのファイル名は、あらかじめ「Callback URL」で申込んだものにする。私は次のようにカスタマイズした。

<?
//
//  oauth.php
//
$CONSUMER_KEY      = "取得したコンシューマキー";
$CONSUMER_SECRET   = "取得したコンシューマシークレット";
$REQUEST_TOKEN_URL = "http://twitter.com/oauth/request_token
";
$ACCESS_TOKEN_URL  = "http://twitter.com/oauth/access_token
";
$AUTHORIZE_URL     = "http://twitter.com/oauth/authorize
";
$TIMELINE_URL      = "http://twitter.com/statuses/home_timeline.xml";
//

session_start();
if(!isset($_GET[‘oauth_token’]) && $_SESSION[‘state’] == 1){
  $_SESSION[‘state’] = 0;
}
try {
  $oauth
    = new OAuth($CONSUMER_KEY, $CONSUMER_SECRET,
                OAUTH_SIG_METHOD_HMACSHA1,
                OAUTH_AUTH_TYPE_URI);
  $oauth->enableDebug();
  if(!isset($_GET[‘oauth_token’]) && !$_SESSION[‘state’]) {
    $request_token_info = $oauth -> getRequestToken($REQUEST_TOKEN_URL);
    $_SESSION[‘secret’] = $request_token_info[‘oauth_token_secret’];
    $_SESSION[‘state’] = 1;
    header(‘Location: ‘.$AUTHORIZE_URL.
      ‘?oauth_token=’.$request_token_info[‘oauth_token’]);
    exit;
  } else if($_SESSION[‘state’] == 1) {
    $oauth -> setToken($_GET[‘oauth_token’],$_SESSION[‘secret’]);
    $access_token_info = $oauth -> getAccessToken($ACCESS_TOKEN_URL);
    $_SESSION[‘state’] = 2;
    $_SESSION[‘token’] = $access_token_info[‘oauth_token’];
    $_SESSION[‘secret’] = $access_token_info[‘oauth_token_secret’];
  }
  echo "<p>ACCESS_TOKEN=".$_SESSION[‘token’]."\n";
  echo "<p>ACCESS_TOKEN_SECRET=".$_SESSION[‘secret’]."\n";
  echo "<p>\n";
  $oauth -> setToken($_SESSION[‘token’],$_SESSION[‘secret’]);
  $oauth->fetch($TIMELINE_URL);
  $xml = $oauth -> getLastResponse();
  print_r($xml);
} catch(OAuthException $E) {
  print_r($E);
}
?>

 これを「Callback URL」で申し込んでおいた公開サーバに正しく置く。

 次にこのファイルにブラウザでアクセスする。この時に、起動しているブラウザが先にあるなら、一旦全部終了させ、新しく起動したブラウザでアクセスすることをおすすめする。そうしないと、最初はいいが、2度目・3度目に失敗する。

 画面は一度ツイッターのサイトに遷移し、ユーザ名とパスワードを要求される。入力して「許可」のボタンをクリックすると、画面がまた遷移し、もとのスクリプトに帰ってくる。万事がうまくいっていれば、その時に「ACCESS_TOKEN=なになに・・・」「ACCESS_TOKEN_SECRET=なになに・・・」と表示され、その下にタイムラインが表示される。生XMLで表示されるかも知れないし、文字列がつながって表示されるかも知れない。それは環境による。うまく行かないときは、どこかが間違っている。

 この「ACCESS_TOKEN」と「ACCESS_TOKEN_SECRET」をコピーしてとっておく。

 本来ならば、「ACCESS_TOKEN」と「ACCESS_TOKEN_SECRET」は一定の期間で捨てられるので、このことはその都度その都度行わなければならないのだが、ツイッターは期限がないらしく、「ACCESS_TOKEN」と「ACCESS_TOKEN_SECRET」がずっと使える。

 これで、「コンシューマキー」「コンシューマシークレット」「アクセストークン」「アクセストークンシークレット」の4つが揃った。

 そこで、冒頭のコードとなる。冒頭のコードに得られた4つのパラメータをペーストして作動させれば、ツイッターに「ほげほげ」と書き込まれたことだろう。

 こうすることにより、自分のアプリケーション名をタイムラインに表示するなどできるようになる。