「唄入り観音経」の中の観音経

投稿日:

 ふと自分のブログを見ていたら、昨夕遅く、唄入り観音経ファンの方からコメントがついている。

 浪曲は古い話題なので、めったなことでコメントがつくことなどないが、ありがたいことである。

 さて、この方のコメントにも少し触れられているが、三門博の「唄入り観音経」、題材になっている「観音経」の一節のテキストが、ネット上では少々見つけにくいようだ。

 勿論、昔と違って、観音経のテキストそのものはネット上で簡単に見つかる時代になったが、「<ruby>~</ruby>タグ」で囲ってルビを打ったものはどうやら見つからないようだ。つまり、だから「唄入り観音経」の歌詞を耳で聞いてネットで検索しても、ヒットしにくいのである。

 そこで私が打ち込み直し、ネットに放流しておくことにした。

 経典「妙法蓮華経」は長大な経であり、おいそれとブログに載せられるような大きさではないが、良く知られ、また在家信者の勤行でも読まれることのある「観世音菩薩普門品(ふもんぼん)第二十五」、就中(なかんづく)()」という部分は、この妙法蓮華経の精華(エッセンス)を抜き出したものと言ってよく、短くまとまっている。

 私の宗旨は真言宗で、法華宗門とは異なる。しかし観音経は、実は真言宗でも勤行に用いられるのである。特に高野山真言宗から分かれた豊山(ぶざん)派総本山長谷(はせ)(でら)(私の宗旨は真言宗豊山派である)は本尊が十一面観世音菩薩であり、観音経との縁は深い。

 下に書き出したのがそれである。無論、著作権は消滅しているから、どうなとコピペ可能である。

妙法蓮華経
観世音菩薩普門品(ふもんぼん)第二十五 ()

世尊妙相具(せそんみょうそうぐ) 我今重問彼(がこんじゅうもんぴ) 佛子何因縁(ぶっしかいんねん) 名為観世音(みょういかんぜおん)
具足妙曹尊(ぐそくみょうそうそん) 偈答無盡意(げとうむじんに) 汝聴観音行(にょちょうかんのんぎょう) 善応諸方所(ぜんのうしょほうしょ)
弘誓深如海(ぐぜいじんにょかい) 歴劫不思議(りゃっこうふしぎ) 侍多千億佛(じたせんのくぶつ) 発大清浄願(ほつだいしょうじょうがん)
我為汝略説(がいにょりゃくせつ) 聞名及見身(もんみょうぎゅうけんしん) 心念不空過(しんねんふくうか) 能滅諸有苦(のうめつしょうく)
假使興害意(けしこうがいい) 推落大火坑(すいらくだいかきょう) 念彼観音力(ねんぴかんのんりき) 火坑変成池(かきょうへんじょうち)
或漂流巨海(わくひょうるこかい) 龍魚諸鬼難(りゅうぎょしょきなん) 念彼観音力(ねんぴかんのんりき) 波浪不能没(はろうふのうもつ)
或在須弥峯(わくざいしゅみぶ) 為人所推堕(いにんしょすいだ) 念彼観音力(ねんぴかんのんりき) 如日虚空住(にょにちこくうじゅう)
或被悪人逐(わくひあくにんちく) 堕落金剛山(だらくこんごうせん) 念彼観音力(ねんぴかんのんりき) 不能損一毛(ふのうそんいちもう)
或値怨賊繞(わくちおんぞくにょう) 各執刀加害(かくしゅとうかがい) 念彼観音力(ねんぴかんのんりき) 咸即起慈心(げんそくきじしん)
或遭王難苦(わくそうおうなんく) 臨刑欲寿終(りんぎょうよくじゅじゅう) 念彼観音力(ねんぴかんのんりき) 刀尋段段壊(とうじんだんだんね)
或囚禁枷鎖(わくしゅきんかさ) 手足被柱械(しゅそくひちゅかい) 念彼観音力(ねんぴかんのんりき) 釈然得解脱(しゃくねんとくげだつ)
呪詛諸毒薬(じゅそしょどくやく) 所欲害身者(しょよくがいしんじゃ) 念彼観音力(ねんぴかんのんりき) 還著於本人(げんじゃくおほんにん)
或遇悪羅刹(わくぐうあくらせつ) 毒龍諸鬼等(どくりゅうしょきとう) 念彼観音力(ねんぴかんのんりき) 時悉不敢害(じしつぷかんがい)

若悪獣圍繞(にゃくあくじゅういにょう) 利牙爪可怖(りげそうかふ) 念彼観音力(ねんぴかんのんりき) 疾走無邊方(しつそうむへんほう)
玩蛇及蝮蠍(がんじゃぎゅうふくかつ) 気毒煙火燃(けどくえんかねん) 念彼観音力(ねんぴかんのんりき) 尋聲自回去(じんしょうじえこ)
雲雷鼓掣電(うんらいくせいでん) 降雹濡大雨(ごうばくじゅだいう) 念彼観音力(ねんぴかんのんりき) 応時得消散(おうじとくしょうさん)
衆生被困厄(しゅじょうひこんにゃく) 無量苦逼身(むりょうくひっしん) 観音妙智力(かんのんみょうちりき) 能救世間苦(のうくせけんく)
具足神通力(ぐそくじんつうりき) 廣修智方便(こうしゅうちほうべん) 十方諸国土(じっぽうしょこくど) 無刹不現身(むせつふげんしん)
種種諸悪趣(しゅじゅしょあくしゅ) 地獄鬼畜生(じごくきちくしょう) 生老病死苦(しょうろうびょうしく) 以漸悉令滅(いぜんしつりょうめつ)
真観清浄観(しんかんしょうじょうかん) 廣大智慧観(こうだいちえかん) 悲観及慈観(ひかんぎゅうじかん) 浄願常譫仰(じょうがんじょうせんごう)
無垢清浄光(むくしょうじょうこう) 慧日破諸闇(えにちはしょあん) 能伏災風火(のうぶくさいふうか) 普明照世間(ふみょうしょうせけん)
悲體戒雷震(ひたいかいらいしん) 慈意妙大雲(じいみょうだいうん) 濡甘露法雨(じゅんかんろほうう) 滅除煩悩焔(めつじょぼんのうえん)
諍訟経官処(じょうしょうきょうかんじょ) 怖畏軍陣中(ふいぐんじんちゅう) 念彼観音力(ねんぴかんのんりき) 衆怨悉退散(しゅうおんしつたいさん)
妙音観世音(みょうおんかんぜおん) 梵音海潮音(ぼんのんかいちょうおん) 勝彼世間音(しょうひせけんおん) 是故須常念(ぜこしゅじょうねん)
念念勿生疑(ねんねんもつしょうぎ) 観世音浄聖(かんぜおんじょうしょう) 於苦悩死厄(おくのうしやく) 能為作依怙(のういさえこ)
具一切功徳(ぐいつさいくどく) 慈眼視衆生(じげんじしゅじょう) 福聚海無量(ふくじゅかいむりょう) 是故応頂礼(ぜこおうちょうらい)
爾時持地菩薩(にじじじぼさつ) 即従座起(そくじゅうざき) 前白佛言(ぜんびゃくぶつごん) 世尊(せそん) 若有衆生(にゃくうしゅじょう)
聞是観世音菩薩品(もんぜかんぜおんぼさつぼん) 自在之業(じざいしごう) 普門示現(ふもんじげん) 神通力者(じんつうりきしゃ)
当知是人(とうちぜにん) 功徳不少佛説是普門品時衆中(くどくふしょうぶつせつぜふもんぼんじしゅうちゅう) 八萬四千衆生(はちまんしせんしゅうじょう)
皆発無等等(かいほつむとうどう) 阿耨多羅三藐三菩提心(あのくたらさんみゃくさんぼだいしん)

 三門博の「唄入り観音経」では、このうちの何か所かが使われる。

 私の持っているCDのうち、左のテイチクのものでは、以前に書いたこともあるが、最も有名な「本題」の「唄入り観音経」がまったく入っておらず、少し違う話になっている。だが、観音経そのものはところどころに使われており、例えば有名な「外題付(げだいづけ)」の部分に続けて上の「偈」の冒頭部分が低く付け加わる。

〽 遠くちらちら(あか)りが揺れる
あれは言問(こととい) こちらを見れば
誰を待乳(まつち)舫舟(もやいぶね)
月にひと声 雁が鳴く
秋の夜更けの吾妻橋
世尊妙相具(せそんみょうそうぐ) 我今重問彼(がこんじゅうもんぴ)
佛子何因縁(ぶつしがいんねん) 名為観世音(みょういかんぜおん)
具足妙曹尊(ぐそくみょうそうそん) 偈答無盡意(げとうむじんに)
汝聴観音行(にょちょうかんのんぎょう) 善応諸方所(ぜんのうしょほうしょ)

 また、名奉行大岡越前の裁きを受けて改心し、罪を許された木鼠の吉五郎が仏門に入るシーンでは

〽 前非を悔いた吉五郎は
名も西念と改めて
頭丸めて仏門の
()弟子となりて国々を
具足妙曹尊(ぐそくみょうそうそん) 偈答無盡意(げとうむじんに)
汝聴観音行(にょちょうかんのんぎょう) 善応諸方所(ぜんのうしょほうしょ)
弘誓深如海(ぐぜいじんにょかい) 歴劫不思議(りゃっこうふしぎ)
侍多千億佛(じたせんのくぶつ) 発大清浄願(ほつだいしょうじょうがん)
我為汝略説(がいにょりゃくせつ) 聞名及見身(もんみょうぎゅうけんしん)
心念不空過(しんねんふくうか) 能滅諸有苦(のうめつしょうく)

 また別に、美空ひばりも唄った、「本題」のほうが入った戦前の本来の作品の方で、和尚に観音経を教わった百姓の甚兵衛爺さんが、婆さんと唄のように繰り返すのがこの部分である。

或遭王難苦(わくそうおうなんく) 臨刑欲寿終(りんぎょうよくじゅじゅう) 念彼観音力(ねんぴかんのんりき) 刀尋段段壊(とうじんだんだんね)

 「長くて覚えづらい、ワケがわからない」と訴える無学文盲の百姓甚兵衛に、和尚は「全部唱えずともよい、『念彼観音力(ねんぴかんのんりき) 刀尋段段壊(とうじんだんだんね)』というところだけでも仏の御利益はある」と教えるのである。

(「唄入り観音経」本題入りの音源の、後半の一部)

和尚  甚兵衛さん良く打ち明けた。法華の大師日蓮上人が由比ガ浜竜の口の御災難の時に唱えられた観音経と言うお経がある。上人はこのお経の御利益によって危うき一命が救われた。この観音経を教えてやるから恩人木鼠吉五郎様のためと唱えておやり、観音経一巻を覚えるには一心不乱に稽古しても四五年はかかるぞよ
甚兵衛 そんなに長くなくって、アッサリ教えて下さいまし
和尚  アッサリとはいかないが、有り難いところ二(くち)(くち)だけ教えてやる。今唱えるから聞き落としのないようによく聞きなされや

……と、(かたえ)にあったる鐘を引き寄せて撞木を握り威儀を正して鐘の縁を力に任せて一つ、

 ごぉ~ん

 その鐘の音色に音声(おんじょう)を乗せ

〽 或遭王難苦(わくそうおうなんく) 臨刑欲寿終(りんぎょうよくじゅじゅう) 念彼観音力(ねんぴかんのんりき) 刀尋段段壊(とうじんだんだんね)~……
和尚  どうじゃ、お判りかな
甚兵衛 初めのほうはちっとも判らねえでがす
和尚  中ほどはどうじゃ
甚兵衛 少し判りました
和尚  前の方は
甚兵衛 丸ッきし
和尚  なんだい、それじゃ皆ンな判らないんじゃないか。……お経の意味を覚えなさい。さすればお経に趣味が出てすぐに文句が覚えられる。
〽 「或遭王難苦(わくそうおうなんく)」ということは王難の苦しみに遭うということ
臨刑欲寿終(りんぎょうよくじゅじゅう)」とは刑場で命終わらんとするときをいう
念彼観音力(ねんぴかんのんりき)」とは観音様の力にお(すが)りをする
刀尋段段壊(とうじんだんだんね)」とは当たる刃物が切れ切れになるということ
和尚  一口に言えば災難のために、刑場で命終わらんとする時に、観音経を唱え奉れば御利益あらたかにましまして、自分の身体へ当たってくる刃物が途中でポッキリ折れて、身体に傷が付かずに命も助かるということを、それ観音経になぞらえて……
〽 或遭王難苦(わくそうおうなんく) 臨刑欲寿終(りんぎょうよくじゅじゅう) 念彼観音力(ねんぴかんのんりき) 刀尋段段壊(とうじんだんだんね)~……
和尚  どうじゃ、甚兵衛さんや、お経の有難味が少しは分かったか
甚兵衛 へぇ、有り難すぎて、みんな忘れちまった
和尚  困ったねえ、ではこうしなさい、前ふた(くち)抜いて、後ふた(くち)だけ覚えなさい。『念彼観音力(ねんぴかんのんりき) 刀尋段段壊(とうじんだんだんね)』……と、このくらいのことは覚えられるだろう
婆さん とっても駄目だい
甚兵衛 なに言ってるだ婆さん、俺がみんな聞いてもすぐ忘れちまうから、お前半分覚えろ。半分ずつッか()ェんなら忘れなかんべ

 幸い婆さんが来ていたから半分後を覚えてもらい、ありがとうごぜえましたと (いとま)を告げて表へ出た

〽 忘れちゃいけない婆さんよ
今教えて貰った観音経を 大恩人のためだから わしが前を半分やるで
お前が半分後から唱えておくれよと

言えば婆さんにっこり笑い

これさ 爺さんよくおきき
今は梅干婆あでも
娘の頃には村一番の声よしで
盆踊りの時などは櫓の上で若い衆と音頭取りしたこともある
さすりゃ昔の杵柄で 歳は取っても歯は抜けてても
声のほうではお前にゃ負けない これさ 爺さんしっかりおいで

甚兵衛 生意気なことをコクなこの婆あ
先に立ったる爺さんが しわがれ声を張り上げて
念彼観音力(ねんぴかんのんりき)
と唱えましたら婆さんが 鉄漿(おはぐろ)だらけの歯を()き出してなんの負けよう爺さん如きに声の方ではひけとらないぞえ
刀尋段段壊(とうじんだんだんね)
甚兵衛 来たなァ、婆あ
〽 念彼観音力(ねんぴかんのんりき) 刀尋段段壊(とうじんだんだんね)

と 唱えながらに行くのをば 村の若い衆が 耳にして

「野郎、お(めぇ)

「なんだ茂十」

(しも)の甚兵衛、婆アと掛け合いで変なこと言ってくが、アリャ何だ」

「わかったぞ、この(あいだ)、甚兵衛、村の使いで江戸さ行ってきた、その時覚えてきた、ありゃ大方、江戸の流行唄(はやりうた)だべ」

「流行唄?……へぇ~、面白ェ唄だな、半分づつ掛け合いだ、唄に囃子がネェと仕ッ方ないから、囃子ィ付けてやるべ、調子を外すと聞きづれェから、しっかり来いよ、始めるぞ」

 村帰りと見えて鍬を一丁づつ担いでいた、その鍬の柄を叩いて拍子を取って

〽 茂十が先に歌い出す
さあさ 出したぞ ヨ~イヤナ~
念彼観音力(ねんぴかんのんりき)
と唄い出したら次郎兵衛が
それに調子を合わせまして
刀尋(とうじん)~ キタコラ エ~ 段段壊(だんだんね)ッ、あァ~コ~ラショっと……

「こりゃいいやィ」

……そうして、あとはご存知、お経の一節をすっかりお囃子か唄か何かと勘違いした若者たちの口から口へ、ついには観音経が奥州一円のヒット・ナンバーとなり、子守りの女の子が赤ん坊を寝かしつける子守唄にまで「観音経アレンジ」が入ってしまう、という筋書きである。その子守歌こそ、三門博一世一代、美空ひばりの幻のナンバーでもある「唄入り観音経」である。

ルビ

投稿日:

 大島理森(ただもり)衆議院議長の名前の読みを何度確かめてもすぐ忘れてしまう。「さともり」だったっけ……?などと変な風に忘れてしまっては、ググッて「ただもり」だと思い出す。

 恥ずかしながら不肖・佐藤、人様と比べてそれほど文字や漢字に弱いわけではない。しかし、読めない。

 この原因は私にはわかっていて、それは私が「テレビを見ないから」である。人名が耳から音で入ってきていないので、文字を見てもわからないし、すぐに忘れてしまうのだ。

 戦前などは識字教育のためもあって、活字メディアには盛んに「ルビ」が振られており、人名もその対象であって、読み間違いというのは起こりにくかったそうであるが、戦後、「『ルビ』なぞというものは日本人を愚民化する」というような理屈で、あまり行われなくなってしまったそうである。また、メディアの側に「新聞や雑誌で有名人の名前にわざわざルビなんか振らなくたって、テレビで声に出して読んでるんだから、アホでもわかるでしょ?」というような意識もあるのではないかと勘繰(かんぐ)ってしまうのも、無理はなかろう。

 しかし、これからはまた事情が変わる。なぜって、「DQN(キラキラ)ネーム」全盛の時代になったからだ。新聞や雑誌は、ルビを励行しないと、人名が人名として通用しなくなってしまう恐れが多分にある。

 国会議員などの貴顕の人士にも、立候補可能な以上は20代30代という人も当然おり、私に言わせればだが、DQNネームっぽい名前の人も既に多い。新聞社や出版社は、こういう人の名には失礼のないように是非ともルビを振って貰いたい。……って、新聞買ってない私がいうのも無責任ですが。

ルビとショートコード

投稿日:

 最近、記事にルビをよく振る。何故(なぜ)かと言うと、女房子供が見ているテレビ番組の中に、芸能人が漢字の読み書きなどをするクイズ番組かゲーム番組のようなものがあるのだが、その出演者たちがごく普通の単語や漢字もほとんど読み書きできていないのを見るにつけ、「ひょっとして、世間の人が私のブログを読んでも漢字が読めない人が多いのではないか」と心配になってきたからだ。

 また、ネットの質問箱、例えば「Yahoo!知恵袋」などを見ていると、本当に普通の漢字の読み書きについて質問しているものも多く、世間がこの調子だと、多分私の書くものの漢字は、半分くらいしか()まれていないような気がするのである。

 それで、「この漢字、多分訓まれてないだろうなあ」と思うような漢字には、できるだけルビを振っている。

 しかし、それにつけてもこの「ルビ」をHTMLで振るのは面倒くさい。今、上に用いた「()み」というルビ振りをHTMLで書くには

<ruby><rb>訓</rb><rp>(</rp><rt>よ</rt><rp>)</rp></ruby>み

……と記述するのである。タグ自体は「クイックタグ」のボタンに登録し、ワン・クリックで挿入できるようにしてはいるが、それでも面倒臭いし、第一、原テキストの可読性が非常に悪くなってしまう。

 なにかいいやり方はないものかな、と思って探すと、WordPressの場合は「ショートコード」でこれを実現する方法もあるようだ。

 なかなか魅力的だ。しかし、私のように10年以上もブログを書きつないでいると、WordPressが使えなくなった後の事も心配になってしまう。これをやってしまうと、WordPressから他へ切り替えた時に、記事を移行することは無理になるだろう。いや、無理とまでは言えなくても、そこの部分の置き換えコードを書いて移行用データを出力したり、相当面倒臭くなることは確かだ。

 しかし、それはそれとして、上記サイトさんの記事はショートコードの書き方の簡単な例にもなっており、おかげでショートコードの書き方が分かった次第である。有り難い。

時事無責任寸感幾つか

投稿日:
共産党藤野政策委員長党職辞任の一件

 共産党の代議士、標記藤野何某(なにがし)。「人を殺すための予算ではなくて、人を支えて、育てる予算を優先していく」とした発言を取り上げられ、ついに党職を辞任させられた。

 左翼主義者の肩など持ちたくないが、しかし、これは少し気の毒ではなかろうか。揚げ足取りというものだ。

 私は、「防衛費は、究極、人を殺す予算だ。で?それで何が悪いの?」と思っている。人殺しと言われた程度のことで傷つくような自衛官は修行が足りない。防衛大や新隊員教育隊に入りなおして駆け足でもしてこい。

 こんなのは、ものの言い方、気分の話だ。「何を言う、人を守る予算だ」というのは微細な話で、何によって人を守るのかと言うと、敵を殺すことで人を守るのだ。

 以前、民主党(当時)の菅氏が「暴力装置」と言ってブッ叩かれたが、これも左翼が良く使う術語で、そんな目くじら立てるようなことではなかった。菅氏には天与のインテリジェンスが災いしたと言う所であった。

 むしろ、こんなことで大慌てし、藤野何某ごときを叱りつけて責任を取らせる共産党の執行部には問題がないか?これはもう、すぐ眼先に控えた参議院選挙の一票に汲々としている哀れな姿と言うより他にない。

 確かに、防衛省職員は自衛官だけでも22万を超える。これらには家族や親戚もおり、ひとり当たり5人ほども勘定すれば100万人近い一大票田である。これらの気分を損なって票を失うことが手痛いことだと言うのはわからぬでもない。

 だがしかし、これしきで(せつ)を曲げるとは。たとえ左翼と言えども、代議士たるもの、正々堂々と大声で、己の信じるところを曲げず、主張し続けてはどうか。それで選挙に落ちるなら、潔くそれを受けとめて頭からダイビングで落ちるべきなのだ。敵ながらそれでこそ男らしい態度だ。むしろ、共産主義者がこんな弱腰では、自衛隊は「無言の数の力で自由な言論を圧殺した」と言われかねず、それこそ自衛官にとって卑怯の誹りとなって逆に迷惑だろう。

 与党もこんなことで大騒ぎしてると、「揚げ足取りの応酬」を呼んじまう。ウカウカしてると誰かの失言を針小棒大に取り上げられちまうぜ。気をつけなよ。

バイデン米副大統領「一夜にして……」発言

 日米同盟の妙味。「ツー」と言えば「カー」というような絶妙な掛け合いですなあ。日本から中国にこんなこと言ったり、あるいは日本から米国に「そういうふうに中国に伝えてくれ」とは、それこそ口が裂けても言えない。平和主義が国是だ。そんな恫喝はわが政府にできるはずもないのである。

 ところが、バイデン氏にはまるでテレパシーで伝わったかのようである。よくぞ言ひたり、ってなものだ。大統領その人に言わせるわけにもいかないし、まさに「言うのに適任」の人である。

 なんというか、拈華微笑(ねんげみしょう)、というのはこういう感じか?ちょっと使うところが違うか。マアエエワ(笑)

 あと、念のために書いとくと、これ、昔からよく米国が使ってた言い方なんですよね。特に核抑止ドクトリン全盛時代には。

「ヘル朝鮮」てw

 韓国も熱い国で、しかも文明国なので、若者言葉が面白いようだ。「就職やくざ」とか、笑ってしまった。

 韓国頑張れ。……以前と違って、私は実はあまり韓国が嫌いではなくなった。同源の友邦であるという気がしている。安全保障上、常備70万、動員で150万になんなんとする兵力は無視できない。……まあ、腹の立つ厄介親戚だが。

プリンタ電源入れ忘れが原因で一億円の二重支払処理

 この件、なかなか味わい深い。

 送信確認が印字出力の有無だけでなされていたのか?まさかそんなこともあるまい。多分、「それ使うようになっていた」のだろうけれども。

 ささやかながら不肖・私こと佐藤、経済産業大臣認定「ITストラテジスト」以外に、「テクニカルエンジニア(システム管理)」の資格を持っている。(この資格、今は名称が変わり、「ITサービスマネージャ」と言う。)

 その立場からの感想だが、この一件は単純なようで、その実、システム設計から運用管理に至るさまざまなところに考察要素がある。1万円の処理ではなく、1億円の処理ともなると無視はできまい。取り急ぎ短期の対策と長期の対策の二本立ては必要だろう。この役所ではとりあえず複数職員が立ち会うことにしたようだが、これは短期対策だ。

 システムの運用管理には、この件に関係しそうなところを思いつくまま挙げれば、他にも「構成管理」「資産管理」「性能管理」「稼働管理」「変更管理」「問題管理」「障害管理」「マニュアル管理」「施設・設備管理」など、さまざまな分野がある。この一つ一つがまた、いろいろな手段からなる大分野なのである。石巻市のこの件は、こうした分野分野のどれにも、打つべき手が見出せるだろう。

Facebookは老害爺ぃ婆ぁ(失礼)の巣窟ってかw

 はははっ、笑っちまった。そりゃそうだよなあ。親とか上司とか先生にず~っと見られてるような感じになるもの。

 ……と自分のFB友達をあらためて見てみると、私のFB友達は爺ぃと美熟女のオンパレードで、一番若い人でも30代後半だわ。大人やねぇ~。そんなに友達の人数いないんですけどね。

 職場関係はそんなにフレンドにしてないんだけど、キッカリ線引きしてるわけではなく、例外も何人かいる。

プログラミングを知らない人がプログラミング教育をする危険性

 いやぁ~、仰せ御尤(ごもっと)もだが、こりゃあ、チト意地悪で、可哀想だろうぜ。

 思いもかけない有名技術者の社長にいじめられる、そのRuby On Railsのお兄ちゃんたちが哀れになって、逆に痛々しくて同情で涙が出てきた(笑)。

アルビン・トフラー死去の報

 祈冥福。

 10代の頃、「第三の波」と、もう一つ、ガルブレイスの「不確実性の時代」読んどけ、なんて上司や先生が言ったもので、あんな浩瀚(こうかん)な大著、そうそう多くの人が読破理解したとも思えず、実のところ私も読んでない。


 「第三の波」が文庫で600ページ近く、「不確実性の時代」が同じく500ページ超。なかなか、そんな、ねぇ。

ダッカ

 恐ろしい。引き続き要注目である。

最近の一般向けワンボード・コンピュータ、なかんづく「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にとどめを打ったものです。一定の年齢層の人には大変懐かしいものの一つです。

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

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

そうか、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までの入力を受け付けるので、大丈夫なのである。