カテゴリー別アーカイブ: 技術情報

Windows 8.1に署名のないデバイスドライバをインストールする。

ArduinoとかBeagleBone Blackとか、いろいろマイコンボードを使っていて、一番最初にぶつかる関門はデバイスドライバのインストールです。MacとかLinuxとかWindows XPとかならそう問題はないのかもしれませんが、Windows 8やWindows 8.1だとちょっと大変です。

というのも、Windows 8やWindows 8.1では、署名のないデバイスドライバをインストールすることは原則としてできなくなっているからです。これを回避するにはテストモードで起動する必要があるのですが、そのやり方がなかなかわかりにくかったりします。

最近ではWindows 8に関する情報は、少しネット検索すれば比較的簡単に見つかるようになりました。しかし、Windows 8.1の場合はなかなか見つからなかったりします。

続きを読む

JavaでトレースログのON/OFFをコンパイル時に切り替える。

JavaでAndroidのプログラミングに関わるようになってしばらく経ちますが、そろそろトレースログのON/OFFを上手く切り替える方法が欲しくなってくるものです。ベテランのAndroidプログラマーの方に聞いたところ、if文の条件式に定数(static finalで宣言したboolean型のフィールド)を指定することでON/OFFを切り替えるのが普通だといいます。

その方法は、私なりに以下のように解釈しました。

static final boolean ENABLE_LOGS = true;

if (ENABLE_LOGS) Log.v(“tag”, “message”);

見た目はともかく、これならログを無効にしたときには、実行時のコストが完全になくなりそうです。ただ、ON/OFFを切り替えるにはソースファイルをその都度修正する必要があり、これはいただけません。

続きを読む

AndroidのOpenGL ESでビットマップが真っ黒になる。

現在、AndroidでOpenGL ESを使って描画処理を書いているのですが、深刻な問題に直面していて原因がつかめずにいます。

GLSurfaceViewクラスのonDrawFrameで、Bitmapを作ってCanvasで描画し、それをテクスチャにロードしてポリゴンに貼っているのですが、しばらくするとビットマップが真っ黒になってしまい、まともに表示されなくなります。画面全体が真っ黒になるのではなく、新しく作ったビットマップが真っ黒になるようです。

最初、テクスチャの枯渇を疑ったのですが、不要になったテクスチャは都度削除していますので、高々数百程度しかテクスチャは同時に使っていません。それに、仮にテクスチャが枯渇したのであれば、地のポリゴンの色がそのまま現れるはずですが、必ず真っ黒になるのです。

ビットマップリソースの枯渇も疑いました。この現象に陥ると、自分が作ったアプリだけでなく、システムのアイコンまで真っ黒になることがあるからです。Bitmapはテクスチャをロードしたあとに都度recycleしていますが、実際にリソースが解放されるのはGCのタイミングのようなので、これが原因の可能性はある程度考えられます。

Androidのバージョンは3.1および3.2なのですが、どうもはっきり「これだ!」という原因がつかめません。一応、ビットマップの生成回数を減らすために、極力同じものを使い回すようにして対策しました。ただ、それだと問題が顕在化するまでの時間を引き延ばしただけで、状況次第では再発する危険性が残っています。

ビットマップのGCの問題であれば、時間を引き延ばすだけでも十分な効果が見込める可能性はあります。ただ、はっきりそうだとわからないのが気持ち悪いところです。

Windows 8.1にアップグレードしました。

日ごろ主に使っているPCをWindows 8からWindows 8.1にアップグレードしました。アップグレード事態はWindowsストアから簡単に行うことができます(時間はかかりますが…)。

パッと見は何が変わったのか全然分かりません。起動直後の背景が変わったぐらいでしょうか。ただ、よく見ると、チャームの項目が変わっていたりして、微妙な違いがあるようです。

よく話題に上っているスタートメニューについてはよくわかりません。というのも、私はClassic Start Menuを使っているのですが、アップグレード後もそのままClassic Start Menuが変わりなく使えていますので、何も変わっていないという印象しかないわけです。

使っているうちに違いは見えてくると思いますので、何かあればその都度レポートしていけたらと考えています。

 

PHPプログラマーが知らないPHPの用法

この話題はリニューアル前のサイトでも取り上げたことがあります。簡単にいうと、PHPを使ったソースコードの前処理を行おうということです。

「PHPプログラマーが知らない…」とは書きましたが、もちろん知っている方も少なくないとは思います。ですが、大多数のPHPプログラマーはHypertext Preprocessorの名が示すように、HTMLに埋め込んで使う用法しか知らないのではないでしょうか? おそらく、コマンドラインでPHPが使えること自体を知らない可能性さえあります。

PHPは通常、基本的にHTMLが書かれたソース中に、<?php ではじまり ?> で終わるタグを埋め込むことで使えるようになります。しかし、埋め込む相手はHTMLである必要はなく、CやJavaのソースに埋め込んでも何ら問題ありません。実際、期待通りに前処理を行ってくれます。

Javaのようにプリプロセッサがない言語の場合、PHPはかなり強力なツールになります。CやC++のような前処理ができる言語であっても、標準のプリプロセッサよりははるかに高度な機能を提供することができるのです。

具体例を挙げましょう。配列やコンテナの要素を静的に整列するといったことは、Cのプリプロセッサではごく限定的な状況をのぞいて実現することはまず無理でしょう。しかし、PHPを使えばいとも簡単に実現できてしまいます。

PHPを使えば、バイナリファイルを配列の初期化子として展開するような前処理を行うことさえできます。これは標準のCプリプロセッサでは不可能です。

ほかにも、Cのプロトタイプを解析してC#のためのDllImportを自動生成するとかいう荒技もできてしまいます(もちろん、PHPのコードはそれなりに複雑になりますので、がんばって実装する必要があります)。

このように多くのメリットを持つPHPによる前処理ですが、弱点がないわけではありません。一番大きな弱点は、インテリセンスのような入力補完機能の邪魔をするということでしょうか? EclipseでJavaを使うときなど、ツールがいろいろおせっかいを焼いてくれる環境の場合は、結構大きな制約につながるかもしれません。

PHPによる前処理を行うと、状況にもよるのですが、行番号がずれてしまい、エラーメッセージが読みにくくなるという問題もあります。

このようにPHPによる前処理は万能ではなく欠点もあります。ですので、すべてのソースファイルをPHPで前処理するのではなく、一部の本当に前処理が必要なソースだけPHPを通すというのが現実的な使い方かと思います。

BeagleBone Blackが届きました。

昨日のPaspberry Piに続き、アマゾンで注文していたBeagleBone Blackが届きました。

BeagleBone Black

写真はAdafruitのケースに入れたものです。

USBで接続するだけで(ドライバのインストールは必要ですが…)、簡単に使えるようになります。一部の領域はUSBメモリと同じように認識されますので、そこ経由であればファイルの交換も簡単に行えます。また、SSHで入ることもできますので、細かい設定はもちろん、GCCでプログラムをコンパイルすることも可能です。

Raspberry Piが届きました。

アマゾンで注文していたRaspberry Pi Type Bが届きました。

Raspberry Pi

最近話題のマイコンボードで、名刺程度のサイズですがLinuxが載っています。ビデオ出力もオーディオ出力もありますので、ディスプレイやキーボードなどをつなげれば、これだけでちょっとしたPCのような使い方をすることもできます。

適当に時間を見つけて遊んでみたいと思いますが、そんな時間が果たして取れるのかどうかが最大の問題です。明日は、同じようなマイコンボードのBeagleBone Blackが届く予定です。そつらも遊ぶ時間が取れるかどうかが疑問です。

Javaの設計思想が少し見えてきました。

Java のコードを本格的に書き始めてまだ数日ですが、少しずつ Java の設計思想が見えてきたような気がします。

以前は一貫性のないメソッドやコレクションや配列の間の変換のやりにくさに辟易していましたが、今では、「まあこういうのもありかな」ぐらいに感じています。

結局、目的に応じて配列やコレクションの類いは使い分ける必要があるわけで、場当たり的に選択するのではなく、よく考えて適切なものを選択し、自分のコードの中で一貫性を持たせていれば大きな問題はおきないようです。

Integer などの Number から派生したクラスが、内部の状態を更新できないのは参りますが、マルチスレッドのこととか考えるとこのほうがよいのかもしれませんね。

少し、Java のことを見直しました。

WordPressのタグには「C++」と書けない。

今回初めて知ったのですが、WordPressのタグには「C++」と書くことができないようです。

どうやら + の文字が使えないようで、しかたがないので全角文字を使って「C++」と書くことにしました。おそらく他の記号も使えないものがあるはずで、編集中は使えるようなそぶりを見せておいて、公開ボタンを押したあと、それが消えてしまいます。

Javaプログラマーが知らないJava言語仕様

実際のところどうなのかはわかりませんが、Java に関してタイトルのような状況があるとかないとか。以下、その内容を具体的に書いていきます。

  • ビット演算やシフト演算は C ならできるけれど Java ではできない。
  • 同じファイルの中でクラスを複数定義できない。
  • クラスに属さない列挙型は定義できない。

これらはすべて間違いなのですが、迷信的なことがまかり通っているようなのです。上記はすべて Java でできることばかりです。

少し補足すると、同じファイルの中では、public なクラスはひとつしか定義できないのであって、public ではないクラスであればいくらでも定義することができます。

列挙型は一種のクラスのようなものなのでしょうね。どのクラスにも属さない列挙型を定義できますし、結果として列挙型の定義のみを含むファイルというのもありです。