2013年4月25日木曜日

Javaにおける例外とエラーの扱いについて


例外・エラーの種類

大まかに二種類

チェックされる例外と、されない例外・エラー
・チェックされる例外は、実装時にコンパイラがチェックするので、catchしていないとEclipse上で赤くなります///
・チェックされない例外・エラーは、コンパイラはチェックしません(文字通りですが...)。なので、catchを書く必要はありません。

分類表

typeチェックされる?意味
Exceptionされるシステムの設計の範囲内の異常なイベント
Errorされないシステムの設計の範囲外の異常なイベント
RuntimeExceptionされないバグ、プログラムの誤り

クラス階層

Throwable ← Error
  ↑
  └ Exception ← RuntimeException
こんな感じ。

チェックされない例外・エラーについて

チェックされない例外・エラー(RuntimeError/Error)は、メソッド定義の「throws」で明示的に示す必要がありません。
たとえthrowsで指定していたとしても呼び出し側でcatchする必要はありません。
つまり、 「チェックされない例外」はどのメソッド呼び出しからでも投げられる可能性があるし、どの種類の例外が投げられるかもわかりません。
メソッド側にthrowsがついていればそれを見てはじめてわかりますが、 それ以外が投げられる場合もある でしょう。

例外・エラーの使い方

上記を踏まえて...
一般的には、
・外部の環境によって生ずるもの:チェックされる例外
・正常なプログラムでは発生しないもの:チェックされない例外
という指針が使われるようです。

例外を投げる

例外をメソッドが上位で対応する必要がある場合(そのメソッドをふつうに使用するうえで、起こりうるエラーの状態)は、「チェックされる例外」を投げます。
チェックされる例外は、状況に応じて複数の種類を用意するとよいでしょう。
上位で対応する必要がない場合(インスタンスやクラスの初期化漏れ、範囲外の引数など、明らかに上位側の過失)は、「チェックされない例外」を投げます。

例外を受ける

「チェックされる例外」のみをcatchします。
外部ライブラリなどのメソッドで、「想定内のエラー処理」でも「チェックされない例外」が発生するときは、
その例外もcatchするか、「チェックする例外」で投げなおすようなラッパーを用意します。
「チェックされない例外・エラー」が発生している時点で異常な状況で、発生すると基本的に処理を続行出来ません。
RuntimeExceptionが出るならメソッド呼び出し側の実装を、Errorなら内容に応じてJVMの設定等を見直します。

禁則事項

複数種の例外・エラーを、ExceptionやThrowableで受けて一緒くたに処理する/もみ消すというのは、
何が起こっているか把握していないことに対応している、という意味で悪い書き方です。
なるべく避けて、個別の例外に対して処理を書きましょう。
例外を分岐・制御構造の代わりに使ってはいけません。ループを抜けたりとかifとして使うとかアリエナス

2013年4月22日月曜日

XubuntuでKiCadをビルドしてみた

XubuntuのSoftware Centerから入るKiCadが相当古かったので、KiCadをソースからビルドしてみたときのメモ。ちなみに64bit版のXubuntu 12.10 desktopです。

必要なパッケージのインストール

それぞれ、入ってなければ入れる感じで。パッケージ別に分けてますが、パッケージ名のところを列挙すれば一括でインストール出来ます。
  1. sudo apt-get install bzr
  2. sudo apt-get install cmake
  3. sudo apt-get install libglu1-mesa-dev freeglut3-dev mesa-common-dev
  4. sudo apt-get install libwxgtk2.8
  5. sudo apt-get install doxygen
  6. sudo apt-get install g++

KiCadのソースコード入手とコンパイル

太字の部分がターミナルで入力するコマンドです。4/21夜時点のコードでは、いくつかコンパイルエラーがあったので修正が必要でした。
  1. bzr branch lp:kicad/stable を実行すると、ソースコードをダウンロードします。
  2. cd stable を実行して、cmake . -DKICAD_STABLE_VERSION=ON とすると、ビルド設定を出力します。
  3. pcb_calculator/transline/transline.cpp の 「bool isinf(double)」というインライン関数を「int isinf(double)」に変更します。
  4. pcb_calculator/dialogs/pcb_calculator_frame_base.cpp の regul_3pins.xpmのある行を検索して、「#include "../bitmaps/regul_3pins.xpm"」と変更します。
  5. make して(スペックによりますが)2時間ほど待つとコンパイルが通っているはずです。(以降のコードの修正によって、ビルドが通らなくなっている可能性もありますが…。)
  6. sudo make install して、インストール完了です。
  7. 新しいターミナルを開いて kicad とやれば、起動します。

2013年4月5日金曜日

仮想化環境で動くAndroid「AndroVM」を使ってみた

過去記事「仮想マシン上のAndroidでUSBホストを使う」で載せてたAndroid-x86なVMイメージが「AndroVM」として公開されていたので使ってみました。

仮想ディスクイメージのダウンロード

上記の「ダウンロード」のページから「vbox86tp version with gapps & houdini & flash」などといったファイルをダウンロードします。
「vbox86tp」「vbox86t」「vbox86p」の三種類がありますが、「t」がTablet、「p」がPhoneを指すようです。Google Playからアプリをダウンロードしたい場合は「with gapps & 〜〜」のバージョンをダウンロードします。

VirtualBoxにインポートして、設定を変更

VirtualBoxを開きファイル→仮想アプライアンスのインポート」から、ダウンロードした「ova」形式のファイルを指定してインポートします。
VirtualBox Managerから、仮想マシン「androVM……」の設定を開き、下記のように設定を変更します。
  • ディスプレイ→ビデオメモリ を 適量 (64MBに変更しました)
  • ディスプレイ→3Dアクセラレーションを有効化 をオン (効くかどうかはわかりませんが…)
  • ネットワーク→アダプター1にホストオンリーアダプターを指定。無い場合はVirtualBoxの設定から作成できます。アダプター2はそのままにします(Wi-Fi用として認識されるようです)
あとは普通にVMを実行すれば起動します。

IPアドレスは「androVM Configuration」というアプリで確認できます。
上記画像の場合、コマンドラインから adb connect 192.168.56.101 とやると、デバッグ接続ができます。(もちろん、デバッグ機能を有効にする必要があります)。

ざっくり使ってみた感想

  • OSのバージョンは4.1.1
  • 起動まで10秒くらい。速い。
  • 動作も普通にサクサクしてる。
  • メモリは1GBとけっこう消費します。
  • rootが使えたり、busyboxがインストールされていたり。アレなファイルを探したりするのが楽です。
  • USBデバイスもつながります。
  • センサーとかNFCとかのデバイス系が絡まないアプリであれば、けっこう快適に開発できる環境だと思います。

2012年12月26日水曜日

[Android Advent Calendar] 自作のUSBデバイスを、Androidで動かす

Android Advent Calendar 2012/12/26(表) 向けの記事です。裏は@l_b__さんです。

今年の後半にかけてAndroidのUSBホスト周りに少し詳しくなってきた、@kshojiです。Android USB MIDI Driverなどというものを作って公開しております。

USBデバイスを自分で作って、Android側でドライバを書いたら、好きなデバイスを作ってAndroidで自由に動かせて、楽しいんじゃないかなー。ということで、今回この記事を書いてみます。
TwitterのTLで尋ねてみると、USB HIDなデバイスが今時の流行っぽいので、それに乗ってみることにします。USBデバイスの自作と、そのデバイスに対応するアプリ作成の参考になれば嬉しいです。

AndroidがUSBホストに対応

Android OS 3.1からUSBホスト機能に対応して、アプリで、JavaのAPIを使ってUSBデバイスのドライバが書けるようになりました。LinuxのデバイスドライバといえばC(libusb)で書く、もしくはカーネル側をいじるという印象があるので、これはすごく画期的なことだと思います。なんといっても、Javaはとっつきやすいですから。

Android SDKにもUSBミサイルランチャを操作するサンプルが付いています。USBミサイルランチャは色々な環境でサンプルとして使われているようです。

注:必ずしもUSBデバイスであればなんでも認識する、というわけではないようです。HTC J ButterflyではUSB HIDなデバイスは認識しましたが、USB MIDIなデバイスは認識しませんでした。

AndroidでのUSBホストの使いかた

Android の USBホストの公式ドキュメントはこちらからどうぞ。

githubのリポジトリにこの記事用のコード一式を置いてみました。
いちおう、見通しがよくなるようにしているつもりです。
…と言っても、AbstractDeviceActivityクラスあたりから見ていくと、なんとなくわかるかな、程度ですが。WTFPLにしてあるので、煮るなり焼くなりお好きにどうぞ。

2012年12月23日日曜日

[変態Advent Calendar] 実機TAS-codingコントローラを作る

ファミコン用実機TASコントローラとかも作っているkshojiです。
変態Advent Calendarへは初参戦となります。やらしくお願いします。

TASとは?

→ 詳しくはニコニコ大百科のTASの項目あたりがオススメです。

大雑把に言えば「最速でゲームをクリアする」ために必要な再現用データを作る、という競技です。
RAM書き換えなどのズルをしていないので「実機で再現できる」というのがポイントです。
実機で再現できるので、つまり、実際に実機で再生させるプロジェクトというのもいくつか存在します。

実機TASコントローラを作ろう

以前、ファミコン実機でTASるコントローラを作ったこともあり、その連想でなにか出来ないか模索してみました。

今回はエンジニア向けっぽい変態ネタということで、Tool Assisted Speed-codingのコントローラを作ってみます。codingでもあり、typingでもありますが。
「自動キー入力するUSBキーボード」を自作する感じになります。

ちなみに今回のTASのルールとしては、プログラムのソースコードを入力し終わるまで、としています。

まずは、完成したものがこちらにあるので、動画を観てみましょう。
ご覧の通り、エディタの表示が追いつかないほどの変態高速入力となっております。

2012年12月21日金曜日

In-App Billing version 3を使ってみた


先日、既存の有料アプリを無料化→アプリ内課金を追加しよう、という流れで実装をしてみました。
たまたま新しいバージョンのライブラリが出たタイミングだったようで、折角だからこのライブラリを使って実装してみたときのメモです。

In-App Billing version3との遭遇

いつも通りに、「In-App Billingのサンプルが載っているブログ・サイトを探して、それを参考にしながら実装を進めていこう!」 と思っていたところ、IInAppBillingService.aidlを使ったサンプルがさっぱり見つからず、見つかるのはIMarketBillingService.aidlを使うものばかり…。
記事がないとか、そんなバカな…とか思っていたら、Android Developer Blogの記事を見つけました。つい最近バージョンアップしてたんですね。

先の記事によると、向上した点はこんな感じのようです。

  • 設計を改善して、アプリが完結に書けてデバッグ・メンテナンスしやすくなった。以前だと数100行書かないといけなかったコードが、50行くらいでできるように。
  • 堅牢なアーキテクチャにより、決済のロストが少なくなった。
  • ローカルへのキャッシュによって、API 呼び出しが高速になった。
  • 待望されていた、「一度だけ購入できるアイテム」の購入や、アイテム情報の問合せができるようになった。

SDKのサンプルを試そう

というわけで、SDKのサンプルを見ていくことにしました。まずは、SDK Managerから「Google Play Billing Library」をインストールします。
サンプルプロジェクトはSDKをインストールしたディレクトリ内の「extras/google/play_billing/in-app-billing-v03」にあります。Eclipseに取り込んでビルドします。

2012年11月2日金曜日

複数PCの楽器アプリ同士を繋ぐUSB MIDIケーブルを作ってみた

AndroidタブレットとMacを接続して演奏してみたかったので、USB MIDIクライアントを2つ結合したものを作ってみました。
近い将来、これを使ってAndroidタブレット用のPCDJコントローラでも作れたらいいな、という感じです。

方針

今回は、AVRのV-USBを使って、USB MIDIを扱います。ソースコードはMICO-MOCOを参考にしました。

MICO-MOCOではUSB MIDI→レガシーMIDIに変換する必要があったので、送受信を含めるとATtiny2313のメモリには収まらなかったのですが、今回のものは「USB MIDIのプロトコルをそのままブリッジする」という作りになっているため、プロトコル変換処理をばっさり省略できています。
MIDIを介さない利点として「31250baudでシリアル通信する必要がない」という点が挙げられます。クロックが最速20MHzのものを選択できるので、取りこぼしが少なくなることが期待できます(今回の試作では、16MHz/125000baudで通信しています)。送受信用のバッファは短かいですし、USB MIDIのプロトコルそのままなので、MIDIのパケット長はレガシーMIDIよりも長くなっていますが…。