Monthly Archives: 12月 2013

MavericksでUSBシリアルを使う

Switchをシリアル経由で操作したい時に必要なUSBシリアルですが、本当にMacとの相性が悪い。もっと相性良くしてくれよとおもったら、Mavericksになったときに、FTDIの謎なドライバが入ってた。おおっ、と思ったけど、結局動かずで困ったので、その時に解決した方法を書いて行きます。基本的には、以下のページを参考にした感じです。

PL2303 Serial USB on OSX Lion

まず、このリンクから、osx-pl2303.kext.tgzをダウンロードして、これを解凍するとosx-pl2303.kext.tgzというフォルダが出来上がります。仮にこのフォルダがデスクトップにあったとして、以下のようにコマンドを打って行きます。やることはカーネルエクステンションのインストールです。

これで使えるようになる、はず。

MavericsアップデートしたらMacPortsが使えなくなってた

実はMavericsにアップデートした後にMacPorts使ってなかったみたい。そんで、久々にportの様子を見ようとしたら、Command not found。正直どこに同パスを通したかなんて覚えてないので、MacPortsの場所を探してパスに追加。もちろんそれだけ。MacPortsはここにありました。

以上。

続・Androidでサービスを作る(落ちないやつ)

前回、Androidでサービスを作る方法を書きましたが、サービスって言うやつは便利で、システムのメッセージを取得できたりします。ですが、所詮アプリケーションとして動くサービスなので、システムによって不意に落とされてしまう事もあります。今回は、【起動時に自動で起動】、【終了されても自動で復活】(強制終了された場合は再帰不能)する方法を書きます。

まず、起動時に自動で起動についてですが、AndroidにはBroadcastReceiverという便利なものがありまして、これがシステムのイベントが起こったときのメッセージを受信してくれます。BroadcastReceiverは、アプリケーションの中に入っていて、インストールさえされてれば動作します。ただ、前回の記事にも書いたように、インストールされて一度も起動されていないサービスは、システムのメッセージを受信できないので注意が必要です。

それでは、起動したいサービスをServiceSample、Android起動時のメッセージを受信するレシーバをBootReceiverとしてコードを書きます。

コードとしてはこれだけ。あとはこれを「レシーバ」として、AndroidManifest.xmlに登録すればOKです。ですが、onReceiveは起動時に限らず、全てのメッセージが発された時に呼び出されるメソッドです。従ってこれだけではどんなメッセージを受け取った際もサービスを起動するようなコードになってしまいます。そのため、AndroidManifest.xmlの中でintent filterをかけます。レシーバの登録と、intent filterの記述は以下のようにします。

これでBOOT_COMPLETEDのメッセージ以外受け付けなくなるので、Android起動時に立ち上がるサービスは出来ました。次に、終了されても自動で復活する処理ですが、これはサービスのonDestroyメソッドに以下のような処理を記述します。

onDestroyメソッドの中で非同期処理でサービスをスタートします。このとき、System.exit(0);を使用して、もとのサービスをしっかり終了してあげないと、2重にサービスが立ち上がってしまう事があるので、注意が必要です。

Androidでサービス(Service)を作る

Androidはあんまり得意じゃなくて初心者だけれども、サービスをこの間作ったのでメモメモ。

そもそもサービスって何だろうって感じだけど、画面を伴ってフォアグラウンドで動くのがActivityで、そうではなくバックグラウンドで動き続けるのがServiceかな?大体出来る事は結構同じみたい。それよりも、アプリを開発する中でサービスってどういう位置づけなのー?ってところからよくわかってなかったけど、とりあえず、サービスをAndroidのプロジェクトに登録しとけばあとは適切なタイミングで動くらしいですね。サービスの登録は、AndroidManifest.xmlに書き込みを行います。ここでは、サービスを実装するファイルを、ServiceSample.javaとしてお話をすすめます。

じゃぁ実際どうやって作るかっていうと、継承するクラスをActivityからServiceに変えるだけ。超簡単。

これだけで、このクラスはサービスとしての振る舞いを行うようになります。これでAndroidにインストールをすれば晴れてサービスのインストール完了です。

…….起動は?

Androidのサービスは簡単に作れて便利なのですが、ちょっとしたクセ(バグ?Android3.x以降)があります。それは、Androidのサービスは一度起動されるまで停止状態(STOP状態)のままになってしまっていて、システムのメッセージ(起動完了:ACTION_BOOT_COMPLETED等)を受け取れないというものです。つまり、インストールが完了しても何らかのアクションが無いと、結局サービスとして起動されないという事ですね。ということで、どこかでサービスを起動してあげましょう。MainActivity(Activityを継承したクラス)からServiceSampleを起動するには次のようにします。

この処理をサービスを起動したいタイミングで書いてあげれば、Activityからのサービスの起動が可能です。

PHPでMySQLをいじくる

こういう記事を書く度に今時の人たちはSQLなんて書かないんだろうなぁとか思いながら書いてます。

さて、PHPでMySQLをいじる場合には、PDOという物を使います。次に紹介するページを見るとより詳しく書いてあるので、詳しい話が見たい人はそこを見てください。

PDOの利用

まぁ色々書いてありますが、とりあえず色んなデータベースに対して、コネクションストリングさえ渡してあげれば同じインターフェースで扱えるDB用の機能といったところでしょうか。実際の使い方を見て行きます。

データベースの情報が無いと話が進められないので、仮にデータベース情報が以下であるとします。

  • 使用DB: mysql
  • データベース名: company
  • DBのあるホスト: localhost
  • ユーザ名: user
  • パスワード: password

これで、companyデータベースへ接続が出来ます。次に、このpdoオブジェクトを用いてSQLを発行してみましょう。ここではcompanyに存在するdeptテーブルから情報を引き出す事にします。

このようにしてSQL文を発行する事が出来ます。また、JavaのPreparedStatement的な使い方も出来るので、例えばidが1番のものを取ってきたいときはこんな感じで書く事もできます。

bindParam関数で変数をバインドします。あ、確かこの時、bindParam関数内で、バインドする値には変数以外使えないことに注意します。例えば、こういう書き方すると、できない。

はい。そしたら結果を見てみましょう。こうやって見ます。

ここでは、PDOStatementクラスのfetchメソッドを使っています。引数にデータ取得のスタイルを入れる事が出来ます。ここでは、結果セットに 返された際のカラム名で添字を付けた配列を返す、PDO::FETCH_ASSOCを使います。このように書く事で、deptListという配列の中に、結果セットが入りました。では、一応web用かなにかで利用する為に、この値をjsonで返してみましょう。

なにも難しい事はないですね。

gitの忘れそうなコマンド

gitはちょこちょこ使うけど、そんなに細かく全ての機能を使っている訳ではない。まぁでも早いSubversionくらいにしか使っていないのだけれども、結構新しくリポジトリ作るときとか、「あれ、どうやるんだっけ?」とか思ってしまう。なので備忘用。

ローカルでリポジトリ作成

手元のgitの表示の色をつける

リモートリポジトリの追加(順番よく忘れる)
git remote add [エイリアス名] [アドレス]

空のリポジトリの作成(主にサーバで管理する用)
hogehoge.gitというディレクトリを作る。その中に入って、

以上。

PHPでhttpリクエストを処理 (GET編)

最近色んなフレームワークが使われていて、結構開発を行う際に楽に行えたりしてきてると思います。けれどもその反面、一度覚えちゃえばいいのかもしれないけれども、ちょちょっとテストしたり、小規模なシステムを作るときとかに、わざわざ大きなフレームワークを入れたりするのはめんどくさい。ましてや、その動作を覚えたり、内部的に何やってんのかわからなくて詰まるのは本望じゃない。そういうときの為に簡単にhttpリクエストを処理する方法を、超簡単に書く。

今回やるのは、http://example.com/example.php?message=hogeみたいなhttpリクエストを得た場合に、受け取ったhogeを返すプログラム。プログラムと呼べない程簡単なプログラム。例えばこんな感じ。

example.php

こうすると、http://example.com/example.php?message=hogeってwebブラウザで叩くと、hogeってページが表示される。このとき、httpリクエストはPHP内では$_GETという名前の連想配列で管理される。ちなみにPOSTの場合は$_POSTという名前の連想配列で管理される。非常に簡単。でもこのままだとやっぱり困るので、せめてあるかないかチェックくらいしておく。

example.php

こうすると、メッセージにパラメータが入ってるかどうかをチェックできる。PHPの場合はisset関数でこれをチェックする。さらにモジュラーにするために、実際に処理を定義したcontroller.phpをそこから呼ぶようにしてみる。

example.php

controller.php

こうすることで、URLを管理する部分と、実際に処理をする部分を別々に管理できる。余談だけど、includeするときは、しっかりとパスストリングを確かめないと、変なエラーでハマるかも。(dirname(__FILE__)関数は、最後に”/”をつけてくれないから、自分でつける必要がある、等)。

CiscoのCatalystスイッチでDHCP Relay Agentを使う

大きなイベント会場のネットワークを設営する時に、物理的には同じ会場だけれどもブース毎にVLANが切られていて、大量のネットワークセグメントが存在している、なんてこともたまにはあると思います。そういうとき、各ブースの人たちがDHCPを利用しようとした場合、普通なら、大量のDCHPサーバが必要になる。そんなのはめんどくさいから、DHCPサーバ一つでなんとかできたら良いねっていう願いをかなえてくれるのが、DHCP Relay Agent

DHCP Relay Agentを使うと、DHCPクライアントから、CatalystスイッチまでのDHCPリクエストは、通常通りL2でDHCPリクエストを投げるが、Catalystスイッチはそれを一度受け取って、改めてL3でDHCPサーバに対してDHCPリクエストをユニキャストする。この仕組みを使うと、異なるネットワークセグメントに属するDHCPクライアントに対して、一つのDHCPサーバで対応できる。

実際の設定方法。

二つのDHCPサーバを用いる(冗長化する)場合、セカンダリDHCPサーバではフェールオーバーの設定が必要となるので注意。

vimrcでのTagListの設定

TagList.vimは非常に便利なプラグインだけれども、そのままだとやっぱり使えないので、.vimrcに多少工夫が必要。

phpについては、そのままだと、ローカルの変数まで全て表示されてしまうので、グローバルなのかなんなのかよくわからなくなってしまうため、変数の表示を切った。

使用ターミナルの変更

これくらいさすがに覚えておけよって感じですが、一応念のためメモ。ターミナルを変えたい場合は、

お粗末。