投稿

ラベル(プログラミング)が付いた投稿を表示しています

Raspberry Pi で温度ロガーの続き(一応完結編)

イメージ
引き続き、Raspberry Pi で温度ロガーの続きなのだが、今回で一応完結。参考にしたサイトで紹介されていた方法が一通り動き、どうさないようもだいたい理解した。 出来上がったのが下のようなプロット。元々15分毎にログするところを、1分毎に改造した。右端でグラフが8度くらいから20度くらいまで急に上昇しているのは、エアコン暖房をつけたから。23.5度の設定で動かしたから、数分で目標温度まで温まっているのがわかる。 ちなみに、日時はUTCである。日本時刻で表示したかったのだが、ちょっと面倒だったので、また次回。 今回、ウェブでログを表示する段階で、「cron でスケジュールした温度計測がうまく動かず、温度が記録できない」という問題にぶち当たり、解決に少しばかり時間がかかった。その解決方法を記録しておく。 まず、cron の設定としては、 % sudo crontab -u www-data -e を実行して、 */1 * * * * /usr/lib/cgi-bin/monitor.py を追加する。これで、1分毎に温度が測定されてログされるはずなのに、全く記録されないのでデータがプロットされない。 monitor.py は実行権限があり、owner.group は www-data.www-data にしてある。念のためにこのスクリプトをシェルから実行すると、きちんとデータベースに書き込まれる。 何はともあれ、cron のログを取ってみる。これは、/etc/rsyslog.conf を開いて、コメントアウトされている cron.* の行のコメント解除し、sudo /etc/init.d/rsyslog restart を実行。 早速ログ (/var/log/cron.log) を見てみると、次のような記載が定期的に残っているので、スクリプトは起動されているみたい。 Jan 29 07:00:01 raspberrypi /USR/SBIN/CRON[21704]: (www-data) CMD (/usr/lib/cgi- bin/monitor.py) これだけではわからないので、crontab を少し書き換えて、エラーメッセージを別のファイルに記録するようにした。次のような感じ。 */1 * * ...

Raspberry Pi で温度ロガーの続き

前回は、Ruby のコードで SPI 経由で ADC (MCP3002) のサンプル値を読むことができた。そこで、これをデータベースに取り込み、Webから読めるようにしようと思い、ネットで調べてみたら、Pythonで書いているのが多かったので、それにならってみたのだが、どうも SPI の Python ドライバ(というかラッパーAPI?)py-spidev がうまく動かず、温度を読み取れない。 MCP3002 のデータシートも読みながら、xfer2 関数を呼び出してみるのだが、読み込まれるのは 0 とか、たまに、書き込んだ値がループバックのように返ってくるだけ。SPIかADCがおかしくなったのかと思いきや、Ruby のプログラムからは値が読めている。 調べていくと、 SPI のループバックテストをするコード spidev_test.c があったので、これを試したところ、SPIは問題なく動作している。 で、もういちどRPiを再起動したりして、いろいろやってみたところ、うまくいく方法が見つかった。 r = spi.xfer2([1, (2< とするとうまく行くようだ。もともと Ruby のコードや ADC のデータシートを参考にして、引数のリストを [0x68, 0x0] としていたけど、これだとうまくいかない。それどころか、SPIが中途半端な状態になってしまうのか、Ruby のプログラムで読んだ値までおかしくなってしまう。 実際にどんな波形が出ているのか気になるところだけど、とりあえず動いたのでよしとする。 今回参考にしているのは以下のサイト。 http://raspberrywebserver.com/cgiscripting/rpi-temperature-logger/

TV録画閲覧サイトに検索機能を追加

イメージ
TV録画(録画じゃなくてもいいのだが。。)閲覧用のサイトに検索機能を追加してみた。タイトルのみで(疑似)フリーワード検索。データベースは使用せず、PHPの単純なパターンマッチングで引っ掛けてくる検索アルゴリズム。例えば、「ショーン」で検索すると、「ひつじのショーン」のみが表示される。 ところが、検索がキーワードのOR条件になっていたことが判明した。例えば、「女子のフィギュアスケート」を検索しようと、「女子 フィギュア」で検索すると、女子も男子も関係なく、フィギュアスケートに引っかかった録画が表示されてしまう。 アルゴリズムを改良せねば。。パターンマッチングを少し工夫して点数化してソートかな。

TV録画閲覧サイト試作

イメージ
というわけで、TV録画閲覧サイトを試作してみた。ほとんど初めて本格的に(?)PHPを触ったので、少々時間がかかってしまい、結局昨夜はほとんど徹夜だった。でも、一番時間がかかったのはスマホやタブレットに対応したサイトにするところと、スタイルシートの設定のところだったりするのだが。。。 当初はTiny Web Gallery をいじるつもりだったが、なかなか大掛かりなシステムになっていたので、結局少しずつ自分でスクラッチから作ることにした。まずはファイルリストを表示するところから初め、少しずつインクリメンタルに強化していった。 そして出来たのが、以下のページ。ひとまず、録画開始日時で降順にリスト表示するようにした。録画が、サムネイルとともに、リスト表示される。このリンクをクリックすると、HTML5のvideoタグで埋め込まれた動画が表示されるようになっている。動画表示ページもPHPになっていて、query stringsでファイルを渡すようになっている。(まあ、大したことないが。。)あれ、今見ると、タイトル表示が変(日付の情報が入っている。。)修正しないと。。。 今後は、曜日やフリーキーワードで検索できるようにしようと思う。あとは、外でもアクセスできるように、アクセスコントロールも追加したい。少しずつ改造していこう。

MySQL Server のバグ

Windows XP 上で,MySQL 5.1 を,"MySQL Server Instance Config Wizard" から起動させようとしたのが,エラーが発生して困っていた.実は,これはバグのようだ.以下のサイトの指示にしたがって操作をすると,うまく動いた. http://bugs.mysql.com/bug.php?id=18555 ちなみに,今回は MySQL を動かそうとしているのは, Sonar というソースコード診断ツール を動かすため.これで,うまく動いてくれるだろうか.. いろいろと苦労した末に,ようやくSonarが動いた.立ち上げ方法をこちら( https://docs.google.com/View?id=dchnn85v_47c35c4x86 )へまとめておく.

トーストマスターズ スピーチ用のタイマー作成

トーストマスターズ スピーチ用のタイマーをJavaScriptで作成してみた.少し前にJavaScript勉強したのだけど,しばらく触っていなかったらすっかり忘れていた.思い出しながら作成して,なんとか,それなりに使えるものができた. 作品は, ここ(無料ウェブ・ホスティング) にアップしてあるので,自由に使って良し. 実のところ,世の中には同様のものがいっぱい転がっている.いわゆる「車輪」を開発してしまったのだろうが,JavaScriptのリハビリとして,ちょうど良かったのでOK. ついでに,ブログのデザインも一新してしまった.新しいBloggerのデザインエディタを使用した.

ソースコードレビューのやり方

ソフトウェア開発やハードウェア開発の現場では,よくコードレビューが行われるようになってきた.その目的は,まだ完全でない状態のコードを読むことによって,なるべく早い段階で問題点を取り除くことだ. そのようなコードレビューについて調べていると,森崎修司氏がとても有益な情報を発信されていることを知ったので,いくつかここにリストアップしておく. @IT連載「ソフトウェアレビュー入門」 IBM技術文書「コードレビューの道具、使っていますか?

Javaの列挙型に関する疑問

JavaではSE5以降、enumの実装が変わり、「制約つきのクラス」という感じの扱いになったのだが、それを使っているコードを眺めていて、コードクローンが量産されているケースに出会った。以下がその例である。 新しいenumでは、メンバを持てるようになったのだが、同じようなenumを定義したいときには、同じコードがそれぞれのenumで実装されることになる。これが100個とかになると、コードクローンが量産されてしまうのだ。 どなたか、これをリファクタリングしてコードクローンを取り除いていただけないだろうか。ひょっとすると、これはenumの使い方を間違っているのだろうか。 enum Enum1 { A("01"), B("02"), C("03"); public final String code; private Enum1(String code) { this.code = code; } } enum Enum2 { T01("001"), T02("002"); public final String code; private Enum2(String code) { this.code = code; } } public class Main { public static void main(String[] args) { Enum1 e1 = Enum1.A; Enum1 e2 = Enum1.B; System.out.println(e1.code); switch (e2) { case A: case B: case C: } } } 以下、私が短い時間で試行錯誤した結果をメモにしておく。 まず思いつく改善策は、「基底クラスを抽出して、そこに共通要素をまとめればいい」...

OAuthについて少しお勉強

Twitter Bot をGAE上に作ったときに,Twitter4Jというライブラリを使用したが,この中で, OAuth という認証プロトコルが実装されている.その仕組みをよく知らないまま使っていたので,少しばかり勉強してみた. OAuth のスペック には,次のように書かれている. The OAuth protocol enables websites or applications (Consumers) to access Protected Resources from a web service (Service Provider) via an API, without requiring Users to disclose their Service Provider credentials to the Consumers. More generally, OAuth creates a freely-implementable and generic methodology for API authentication. ウェブアプリケーションがある別サービスのAPIにアクセスするときに用いることのできる,安全な認証方式という感じ. 例によって,@ITに詳しい説明がある(「 APIアクセス権を委譲するプロトコル、OAuthを知る 」).とりあえず,入門としてこれに目を通したので,次は,スペックをきちんと読んでみる. このプロトコルでは,電子署名のための秘密鍵を扱う場面がある.この手の技術は,なんとなくわかった気になって使うと非常に危険なので,きちんとスペックを読んで,詳細を理解しておかないとまずいことになるのだ. というわけで,またまた読み物が積まれていく...

ツイッターAPIでつぶやいてみた

ツイッターAPIを使ってつぶやいてみた.言語はJavaを使った.便利なライブラリ Twitter4J というのがあるので,それを利用した. まずは,サンプルコードをコピペで実行.OAuthをほとんど理解していなかったので,初めは何をやっているのかなかなか理解できなかったが,なんとなくわかってきた. でも,何をやるかもまとまっていないので,とりあず,Google App Engine 上にボットをこしらえることにした.今は定期的に時刻と「こんにちは」とつぶやくだけだが,今後拡張していこうと思う.

Visual Studio でメモリリークの検出

今日は,Visual Studio 上で,C++コードのメモリリークの調査に明け暮れていた.CやC++のメモリリークは実に厄介.アプリケーションが終了するまで検出されないのだから,原因がどこにあるのか特定するのは困難を極める. しかし,長年の蓄積の結果,その苦労を軽減してくれるツールが揃っている.今回は,Visual Studio に備わっている機能を使ってみた.基本的な仕組みを説明すると,メモリ確保のmalloc や new と,解放する free や delete を,リーク検出の機能をほどこしたもので置き換えてしまう,というもの. 具体的な方法については, マイクロソフトのサイト が詳しい.簡単に書いておくと,まず,リークを検出したいソース(.cpp)ファイルの先頭に,次の3行を追加する. #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> そして,最初に実行される関数本体の中に,次のステートメントを追加すればおしまい. _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); ビルドしてデバッグ実行をすると,メモリリークが検出されたときに,デバッグメッセージに表示される. 試してみたい人は,次のようなコードを書いてみるといいだろう. #include "stdafx.h" #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> int _tmain(int argc, _TCHAR* argv[]) { _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); int *p = new int; // this memory will leak return 0; } これをデバッグ実行すると,次のようなメモリリーク検出メッセージが表示される.MFCを使っていると,ファイル名と行番号まで特定されるのだが...Visual C++ 2008 Expre...

PowerShellによるExcel/PowerPointの操作

PowerShellを使って,ExcelとPowerPointを操作してみた.これ自体は,RubyやVBなどでも実現できるのだが,PowerShellだと,シェルで実現できるのでとても自然に実現できるのが良い. ExcelでCSVファイルを読み込んでXLSファイルで保存する 次のスクリプトを実行すると,"test.csv"ファイルの内容をExcelワークブック形式のファイル"test.xls"として書き出す. $xl = New-Object -ComObject Excel.Application $wb = $xl.Workbooks.Open(".\test.csv") $wb.SaveAs(".\test.xls", [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookNormal) $wb.Quit() PowerPointの全シートをPNG画像として保存する 次のスクリプトを実行すると,"test.ppt"を読み込んで,そのすべてのスライドをPNG形式の画像ファイルとして"test"ディレクトリに生成する.ただし,なぜか,最後にウィンドウが閉じないのが未解決の課題。 $ppt = New-Object -ComObject PowerPoint.Application $ppt.Visible = [Microsoft.Office.Core.MsoTriState]::msoTrue $pres = $ppt.Presentations.Open(".\test.ppt") $pres.SaveAs(".\test", [Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType]::PpSaveAsPNG) $pres.Close() $ppt.Quit() 参考 Excelオブジェクト・モデル・リファレンス PowerPointオブジェクト・モデル・リファレンス

PowerShellでTwitter APIをたたいてみた

今日は,PowerShell でTwitter APIをたたいてみた.PowerShellは,.NET frameworkがそのまま使えるので,とても強力なシェル/スクリプティング環境である. 例によって,フォローしている人のリストと,フォロワーのリストを表示するスクリプトを書いてみた.まだまだ初心者なので,コードは汚いが,それでもかなりすっきり書けるのではないかと思う. function GetURLContent($url) { $webReq = [Net.HttpWebRequest]::Create($url) $webReq.Method = "GET" $webRes = $webReq.GetResponse() $sr = New-Object IO.StreamReader($webRes.GetResponseStream(), $webRes.ContentEncoding) $content = $sr.ReadToEnd() $sr.Close() $webRes.Close() $content } function PrintSummary($content) { $doc = [xml] $content $userList = $doc.GetElementsByTagName("user") $numUsers = $userList.Count for ($i = 0; $i -lt $numUsers; $i++) { $node = $userList.Item($i) $id = $node.SelectNodes("id").Item(0).FirstChild.Value $screenName = $node.SelectNodes("screen_name").Item(0).FirstChild.Value "" + $id + ":" + $screenName } } "[Friends]" PrintSummary(GetURLContent("...

PowerShellのスクリプト実行が拒否される問題を解決

PowerShell でスクリプトを実行しようとしたら,実行できず,次のようなメッセージが表示された. PS C:\Users\tetsuo> .\hello.ps1 ファイル C:\Users\tetsuo\hello.ps1 を読み込めません。ファイル C:\Users\tetsuo\hello.ps1 はデジタル署名されていません。 このスクリプトはシステムで実行されません。詳細については、「get-help about_signing」と入力してヘルプを参照してください 。。 発生場所 行:1 文字:12 + .\hello.ps1 <<<< + CategoryInfo : NotSpecified: (:) []、PSSecurityException + FullyQualifiedErrorId : RuntimeException で,調べたら,Set-ExecutionPolicy を使って,実行制約を緩めてやらないといけないらしい.しかし,また失敗. PS C:\Users\tetsuo> Set-ExecutionPolicy RemoteSigned 実行ポリシーの変更 実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピックで説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか? [Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): y Set-ExecutionPolicy : レジストリ キー 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell ' へのアクセスが拒否されました。 発生場所 行:1 文字:20 + Set-ExecutionPolicy <<<< RemoteSigned + CategoryInfo : NotSpecified: (:) [Set-Ex...

RubyでTwitter APIをたたいてみた

今日は Ruby を使ってみた.Rubyを使って, Twitter API をたたいてみた.今回は DOM を使わずに,ストリーム読み込み(SAX的)な方法で読み込んだ.XMLを全解析しない分,こちらのほうが読み込みが速い. 例によって,初めてのルビーなので書き方は見よう見まね.一応クラスを使っているのでオブジェクト指向っぽさを醸し出している. PHP と比較して,Ruby はコードがすっきり簡潔になるような気がする.'$'記号が無いからかな. ところで,Windows のスクリプティングには, PowerShell が一番.Windows 使いは,なによりこいつを習得すべきだ. 下が,フォローしている人の一覧を表示する Ruby コード. require 'rexml/parsers/streamparser' require 'rexml/parsers/baseparser' require 'rexml/streamlistener' require 'open-uri' class MyListener include REXML::StreamListener def initialize() @tagStack = [] @id = nil @screenName = nil @userList = Hash.new() @nextCursor = 0 end def userList() return @userList end def nextCursor() return @nextCursor end def tag_start(name, attrs) @tagStack.push(name) end def text(value) if @tagStack[-2] == "user" if @tagStack[-1] == "id" @id = value elsif @tagStack[-1] == "scr...

Twitter API と PHP でフォロワーリスト作成してみたぞ

今晩は TwitterAPI をたたいて遊んでみた.言語はJavaかC#にしようかと思っていたけど,勉強を兼ねて, PHP を選んだ.まあ,XMLのパーザがあれば何でもいいんだけど. 課題は,とりあえず,フォローしている人とフォロワーのリストを作成すること.と言ってもほとんどやることはない. http://twitter.com/statuses/friends/haoka.xml のURLをGETすれば,僕がフォローしている人のリストがXMLで送られてくる.あとはそれを好きなように加工すればいい.フォロワーの場合なら,URLの"friends"を"followers"に置き換えればよい. 今回は,"id"と"screen_name"だけをリストにして表示するPHPコードを書いてみた.正直,汚いコードだけど,今日始めてPHPを書いたにしてはいいほうかなぁと思う. パフォーマンスは測定していないけれど,フォロワーが百万人もいる人が使ったら,かなり時間がかかりそう... <?php // select the first child node with node name equal to $tagName function selectChildNode($tagName, $node) { for ($i = 0; $i childNodes->length; $i++) { $childNode = $node->childNodes->item($i); if ($childNode->nodeName == $tagName) { return $childNode; } } return 0; } // generate user list function getUserList($url) { $users = array(); $xml = new DOMDocument(); $nextCursor = -1; do { $xml->load($url."?cursor=".$nextCursor); ...

Ajaxの勉強:Google Map API で遊んでみる

最近、Ajaxの勉強を始めた。すると世の中にはいろんなWebサービスがあることがわかる。これらを融合させることが「マッシュアップ」なのだとようやくわかってきた。 ということで、ちょっと Google Map API をいじってみたい。ブログに挿入できるのかどうかという練習も兼ねて。。。 おお、できた!(表示されていない人はすみません。ブラウザーや設定によっては表示できないかもしれません)。 我孫子は私の地元。オレンジのマーカーをクリックすると、"Hello!"とメッセージが表示される。ただそれだけのものだけど、JavaScriptをちょこちょこっと書けばこんなことができてしまうのは素晴らしいと思う。ほかの(たとえばツィッターなどの)サービスと組み合わせると、地図上にツィートを表示することもできそうだ。 当分は、Ajaxでいろいろ遊んでみたい。

Spring Recipes を読んで

イメージ
Velocity Template Engine というものが開発中らしい。下のサイトのHello Worldサンプルコードを見てみると、非常に軽いDIのようなものなのかなぁとも思えるが、単にビューとロジックを分離する軽いフレームワークのようなものなのだろうか。面倒な設定ファイルが無いところがよさそう。 http://www.javaworld.com/javaworld/jw-12-2001/jw-1228-velocity.html?page=1 ところで、1週間ほど掛けて、ようやく、"Spring Recipes" (Gary Mak) を読んだ。"Advanced"トピックの部分は斜め読みだったが、一応、一通り目を通した。 この本は、Springフレームワークの全体像が俯瞰できるので、とても良い本だと思う。Springに限らず、Java系のWebアプリケーション・フレームワークの仕組みが良く理解できる。一回読んでおく価値はあると思う。 読み進める中で、フレームワークにとって一番重要なポイントは、実は、テストフレームワークの良し悪しなのではないかと思った。どんなに便利なフレームワークでも、テストフレームワークが貧弱だと、テストが不完全なものとなって、結局品質を確保できなくなるのではないかと思う。その点、Springには強力なテストフレームワークが用意されており、単体テストから結合テストまでカバーしているので、安心して使える。 次は実際にアプリケーションを組んでみることにする。

プログラミングのメモ

保守性の悪いコードの典型例: スパゲッティ・コード クローン・コード 英語でも、spaghetti code, clone codeと言うようだが、次のような表現もあるらしい。 code tangling code scattering ある人が言っていた。『SEにもっとも重要な資質は「審美眼」である』と。プロはシンプルな表現を追及する。

Spring Recipes

今勉強中の"Spring Recipes"という本から、メモ書き。 IoC(Inversion of Control)とDI(Dependency Injection)というものは、依存関係をソースコードから分離するための仕組みである。これによって、ソースコードに手を加えることなく、設定ファイルによって、依存関係を書き換えることが可能になるため、コードの再利用性が大きく高まる。 依存関係を注入する主体となるもののことを、コンテナという。コンテナが設定ファイルを読み込み、その支持にしたがって、オブジェクトを生成、設定する。