2013年12月10日火曜日

Javaによる画像入出力プログラム

ちょっとWindowsの画面をキャプチャする機能が欲しくなったんで、調べてみたんですが、、、、いろんな関数があって大変(;゜ロ゜)
手動でやれば簡単なんですが、枚数があるもんですからプログラムと思ったんですけどね。しばし考えて、「Javaにも同じような機能あるんじゃない?」調べたらありました。しかも非常に簡単です。

キャプチャ自体は以下の関数になります。

// 指定領域をキャプチャしてスクリーンショットのBufferedImageを返す createScreenCapture(Rectangle screenRect);

それで簡単に画面の一部(左上の512x512)をファイルに保存するものを作ってみました。

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class test {

 /**
  * @param args
  */
 public static void main(String[] args) {

  // スクリーンキャプチャのテスト
  Robot r =null;
  try {
   r = new Robot();
  } catch (Exception e){
   System.out.println("can't get Robot");
  }

  BufferedImage dd = r.createScreenCapture(new Rectangle(0, 0, 512, 512));

  // jpgで保存
  try {
   File savedImage = new File("sss.jpg");
   ImageIO.write(dd, "jpg", savedImage);
  } catch (Exception e) {
   System.out.println("can't write file");
  }

 }

}

このプログラムはファイルを作成するだけですが、読み込むときは以下の通りになります。

BufferedImage img = ImageIO.read(File);

後は、BufferedImageで適当に調べればpixel単位の操作も簡単にできます。


PS:
あ、念のためいっときますが、これはローカルでjavaを動かして自分のPCの画面をキャプチャしたい目的で調べました。(ですからローカルに画像ファイルを保存しちゃってますし)リモートでこれ実行したらどうなるんでしょうねえ?セキュリティにひっかかるかな。(それにBufferedImageデータをどうやって返信するんだという問題がありますが。取得したイメージデータを返信する方法がなければゲームなんかで使えるテクニックなんですが。)

Nexus7 KitKat更新

少し前にNexus7のOSが4.4(KitKat)に更新されました。最初は、動きがいい、電池の持ちがよくなったと喜んでいたんですが、どうも動作におかしなところが目立つようになってきました。


  1. 画面の回転が遅い。センサへの問い合わせをアプリごとにするんじゃなくOS側でまとめてやるようにして、電力消費を減らしたとはききましたが、アプリによっては中々回転したのを反応してくれないものがでてきました。
  2. WiFiがなかなかつながらない。これは家が1階、2階と別々の親機を設置しているせいもあるかもしれませんが、電源On直後などなかなかWiFiを認識してくれないことがあります。
  3. WiFiの接続キーを忘れる。これが一番困ります。WPSで簡単に接続設定はできますが、何らかの関係でWiFiのAPリストから消えると、接続キーも忘れてしまうようです。数回設定しなおしました。

昨夜、VerUpの連絡が来ていました。(4.4.2へ更新です)セキュリティ強化が主眼のようですが、使いがってはどうでしょう。

2013年12月2日月曜日

3Dモデルの表示がしたい:WebGL編

少し前までAndroidでのOpenGLプログラムやら、Blenderからのモデル出力を調べていました。目的は3Dモデルを表示するのに楽な方法は現状だとなんだろうと試行錯誤していたわけです。
昔はc++なんかでガリガリViewerプログラムをInventorなんかつかったりして作っていたんです。Inventor自体は好きなんですが、肝心のSGIがどうもダメダメ(今ではGraphicsは完全に撤退して、スーパーコンピューティングの会社になってしまってます。唯一Graphicsの部門をNECに売却して日本SGIとして細々とやっているくらいですか。。。)で、Inventorを使い続けるのに不安をずっと感じていたんです。仕事でやるならもう自分でViewerは作りません、できあいの製品かってきます。その方が安心です。

ただそれでもどうしても特注のカスタマイズしたViewerが欲しい場合どうしたらいいか?と考えて、様子を見てたんですが、どうも結局OpenGLでガリガリ書くのが時流のような気がします。それでまあ、特注で必要になるとすると今時のタブレット用アプリくらいかとAndroidを見てたんですが、やはりOpenGLをガリガリするのは疲れます。何より、モデルデータの読み込みを自分で用意しないといけないのがしんどいです。そこでモデルデータ作成にBlenderを調べて、今度はモデルデータのエクスポートから表示方法を考えていました。
実は前から気になっていた技術に「WebGL」があります。JavaにもOpenGLの実装がありますが、それをブラウザのJavaScriptでやってしまおうというものです。可能性を非常に感じていたんですがいかんせん「重い!」に当時はつきました。ブラウザを使うPC性能(正確にはGraphicsボードの性能になります)に依存しますし、それでも素でアプリから動かすより数倍重く感じました。(昔々、SGIが同じような考えでVRMLというのを考えてましたが、結局今じゃ聞かなくなってしまいましたね)その後、セキュリティ上の問題がJavaScriptおよびWebGLの両方に見つかり、一時停滞したようですが、また最近記事がでるようになり、JavaScript用のライブラリもScene.jsとかThree.jsとかさかんにでてくるようになりました。ところで現状WebGLが使えるのは、以下のブラウザだけとのことです。

  • Chrome
  • FireFox
  • Safari
  • Opera(機能限定らしい)
  • IE11(やっとMSも実装したらしいけど、どの程度の実力かは不明)


そんなところで、ChromeとFireFoxを使いながらThree.jsで様子を見てみることにしました。(理由は、BlenderからモデルデータをThree.jsが読み込める形式にする方法があるから)ところがこれが非常に難航しました。まずWebの記事のようにThree.jsが動かない。(表示がおかしい)これの原因究明にかなり時間がかかりましたが、大体わかってきたのでメモしておきます。(利用したブラウザはChromeとFireFoxです)

1.簡単なサンプルしか表示されない
簡単な立方体を表示するJavaScriptのプログラムは問題なく動きました。

ところが、これにjpegのテクスチャを張ろうとすると、、、
何コレ?っていう感じですが、本当は以下の様に表示される(予定)ものです。
(これはその後、試行錯誤の結果表示できるようになったものです)
球体に、地球表面のjpegを用意してそれをテクスチャとして貼り付けているはず、なんですがうまくいきません。

2.ChromeとFireFoxで挙動が違う
上記の地球のサンプルですが、実はFireFoxだとうまく表示できるんです。Chromeはだめ。ブラウザの開発コンソールを見ても特にエラーは返してこないし、なんでだ!?と悩みましたが、確かJavaScriptのセキュリティ問題で、ローカルなファイルはJavaScriptでは読めないようにしたのを思い出しました。(IEは、今更そんな制限つけれるかという感じのようですが)FireFoxも緩いようですが、テクスチャとしての読み込みだけは許可してくれたようです。(注:WebGLはさらにメモリリークの問題も発生していたため、Chromeではテクスチャデータだろうがローカルからの読み込みを禁止しているんでしょうね)

Three.jsのサンプルにテクスチャを貼ったものがありますが、Chromeだと全滅ですね。FireFoxじゃないとローカルな環境ではまともに表示してくれません。

3.Blenderのモデルデータを読み込んでくれない
さあここまでくれば問題はあきらかです。肝心のBlenderのモデルデータファイルを読みこもうとするとChromeやらの開発コンソールに明確に、ローカルファイルは読み込めませんといってきます。(正確にはローカルなファイルを指定するfile://というURLでは不正と判断され、http経由じゃなきゃだめ、みたいな感じ)
これにはまいりました。Webで見つかった記事には一言もそんなこと書いていてくれません。あきらめてLinuxマシンにapache2をインストールしましたよ。(設定はデフォルトのまま。特に外部のPCから見たいわけではないんで。URLはhttp:://localhostで参照できれば十分です。)そうしたら無事表示されました。(基本、ローカルでしか使いません。ローカルなファイル見るのにapache経由というのも変な感じがしますが、そうしないとセキュリティをクリアできない!)
何表示してるの?って感じですが、まずBlenderでモデル作成したとき、XYZ軸の+方向がどう表示されるのか確認しないといけなかったので、Blenderで四角すいを3つ、XYZ軸(RGB)方向に作成した(ついでに各四角すいはそれぞれの軸の色にしてあります)モデルデータを表示してみたものです。(下図のモデルを出力したものです)

WebGLには軸表示としてHelperを使っています。なんかX軸(R)で90度回転してますね・・・
ところで、Three.jsのGitHubにあるエクスポートスクリプト(python)はBlender2.66用です。自分は現状最新の2.69を使っており、これが表示されない原因かとも一時思いました。しかし、結果的にはBlender2.66だろうが、2.69だろうがエクスポートされるファイル(JSON形式です)は同じものでした。Blenderを両方インストールして確認してみました。モデルがもっと複雑になると違ってくるかもしれませんが。

3.5 Blenderモデルのエクスポートオプション
上述の結果は、Blenderにてthree.js用にモデルデータをエクスポートするさい、デフォルト設定で行ったものです。改めてオプションを見てみたら、座標軸を変換するオプションがありました。
下部の「Flip YZ」がデフォルトではオンになっていますが、これをオフにして出力してみると、以下のようになりました。
XYZ(RGB)軸がきちんと同じ方向に表示されるようになりました。しかし、なんでこんなオプションがあるんだか…


色々試行錯誤して、「Blnederで作成したモデルデータをWebGLで表示する」という目的は達成できました。ついでにかなりまだクセが強いのも理解できましたが。(最後のモデルが回転してしまう、というのはよくある話なんで、理解できてればそんなに苦にはなりません。)

結局、Three.jsに多数格納されているexampleですが、テクスチャ関係使っているものはFireFoxでないとローカル環境だけでは見れません。apache動かして、http経由で見ればChromeでも見ることができます。(逆にいうと、これ気づかないと大多数の人が「Three.jsってこんな表現しかできないのか」と勘違いしてしまいそうです。

2013年11月22日金曜日

Windows, Mac, Linux共通のエディタが欲しい:Windowsのsublime text2その後

結局、色々やってるうちに知らないうちに画面表示までくずれていることに気づき、あきらめて再インストールすることにしました。


  1. sublime text2のアンストール
  2. python 3.xのアンインストール
python 3.xを入れていたのは、Blender2.69がpython 3.xを推奨していたからですが、同時にインストールしていたLinuxの方はpython 2.xなんですが特にBlenderの動作に問題は見られないし、Blenderのサイトをよく読むと、推奨はするけどまだpython 3.xでは動かないplug-inがあるよ、と必須ではないようです。(特にpython入ってなくても、手動操作でBlender動かすだけならそんなに問題ないようす)
次に再度インストールです。


  1. python 2.xのインストール(2.7.6にしました)
  2. sublime text2のインストール
さあこれで再度パッケージとか入れなおしていけばいいだろうと思いきや、画面が変です。例によってwindowの最下段に情報表示がされていないし、Tabのファイル名表示もおかしい。おまけになぜかまだパッケージのインストールをしていないのに、日本語のインライン入力までできちゃう???

あきらからにどこかに設定ファイルを残しています。大体予想はつきますが、以下のところに見つけました。

個人設定の「AppData」以下のRoamingというところにありました。sublime text2をインストールしたばかりですが、終了してこのフォルダを削除してしまいます。(中身はpythonがそのまま入っているかとおもったら、わけわからないXMLでした)ここでsublime text2を起動すると、おそらくProgram Dataのところからでしょうがデフォルトのデータをまたここに作ります。
今度はPackage Installすらないまっさらな状態なので、再度環境構築です。結果として日本語入力しても画面表示の乱れない状態で動くようになりました。


最下段の情報ラインが表示されますし、日本語のインライン入力もできます。さらにTabの表示もよくなりました。

python 3.x系がリリースされたのは2008年12月ですからもう5年たっています。このとき後方互換性が犠牲にされたため、いまだにpython 2.xからpython 3.xへの移行は進んでいないようです。言語としての「美しさ」を求めるのはわかるけど、なんらかの移行手段を考えてくれないと困ったことになるといういい見本ですな。(話変わりますが、そういえばc++の第4版、夏ごろ決まった聞きましたがかなり揉めたようですね。新しい機能が欲しい、でもStrupがダメだ!と議論がもめたと聞いています。互換性の問題を保ちつつ、言語はシンプルかつ高機能にすることのせめぎあいですね。)

2013年11月16日土曜日

Windows, Mac, Linux共通のエディタが欲しい

これまでWindowsでテキスト編集するときはSakuraを愛用していました。なんてったって起動が速い!ただこのところLinux, Mac同時並行で操作することが増えて、共通のエディタに何かいいものはないかと考えていました。
Linux, Macでテキスト編集するなら端末開いてemacsでやるのが速いんですが、相互の文字コードの違いの問題もあり面倒くさくなってきました。

最初に見つけたのがKomodo editorです。かなり高機能で、html, python, javaScriptなどのプログラム作成時の支援機能までついています。Windows, Linux, Mac共通のUIで使えるとのことで試しに触ってみました。

なかなかいい感じですが、機能が豊富なためか起動が遅い!ちょっとこれには閉口してしまい、さらに探すと、sublime Textがなんか評判よさそうです。




順にWindows、Linux、Macそれぞれにインストールしてpythonのプログラムを表示してみました。komodoと同じようにプログラム作成時の支援機能もついてますし、右端にファイル全体を表示するミニウィンドウがあるところまで同じです。ただ明らかにKomodoより起動は速いです。(さすがにWindowsのSakuraほどではないですが)なんかPythonでできてるんですかね?様々なPluginがあり、簡単に追加できます。

これはシェアウェアなので、しばらく使ってみてよさげなら登録しましょうかね。

PS:
重大な問題が発生!! Macは問題ないんですが、WindowsとLinuxで日本語入力がまともにできません!!
プログラム書くのには問題ないんですが、コメントに日本語書けないのは致命的です。お金払うなら日本語入力(マルチバイト文字対応)できるようにならないと困ります。(特にwindows64bitだとタイトルも乱れて、どのwindow編集中かもわからないし、windowの文字も乱れる。。。 せっかくマルチOS環境で使えるエディタが手に入ったと思ったんだけど、これでは使えません)

PSその2:
その後、なんとかWindowsとLinuxで日本語入力できる方法を見つけました。Windowsはインライン入力できますが、Linuxは別windowでの入力(;;) ちょっとこれでは常用にはできません;;
ところでKomodo Editorですが、こちらはwindows/Linux/Macどれでも問題なく日本語のインライン入力ができました。見た目のシンプルさはsublime Textが好みなんだが、、、もう少し様子見です。

PSその3:
上記3画面ですが、あらためて見るとWindowsが変わっちゃってます。おそらくなぜか日本語のインライン入力ができるようになったころからでしょうか。。。

・複数Tabは表示できるが、Tabの切れ目がうまく表示されていない。
・最下段に編集中ファイルの言語等を表示するラインがありますが、それが表示されない。
・上記でも少し述べましたが、Tabのタイトル表示が最初乱れる。(Windowを一度小さくして再描画させれば直りますが、、、)

ちょっと気になっているのが、今使ってみているsublime Text2はpython2.x系なんだそうですが、たまたまWindowsだけはpython3.x系を別の事情でインストールした状態でした。そのせいかとも思い、python2.x系を入れなおしたんですが、状態変わりません。もう少し頑張らないとだめなようです。(これだから日本語はつらい)

2013年11月12日火曜日

Ubuntu起動直後のDisk IO

Ubuntuを使っていると、大抵は非常に起動が速いくて助かります。ureadahead(起動時にいつも読み込むファイルを先読みしてファイルキャッシュしてしまう)のおかげなんでしょうが、時々起動後もDisk IOが煩雑に動いていることがあります。ureadaheadのせいではないかもしれませんが、何が動いているのか気になります。(SSは画面上に表示しているシステム負荷の表示です。起動直後のものですが、Disk IOで真っ赤です。)

しばらくするとおさまりますし、何時もこうなるわけではないんですがそのうち調べてみないと。

2013年11月9日土曜日

Raspberry Pi カメラモジュール設定

さてせっかくなんで、簡単な監視装置にしてみます。最初は自動起動にしてしまえばいいと思ったんですが、せっかくなのであまっていたUSB WLANのモジュール(バッファロー:WLI-UC-GNHP 11gが可能です)を使えるようにし、キーボードとかはつけずにリモートログインでコマンド実行するようにしてみました。装置の外観は以下の様な感じです。
カメラからのハーネスは、ケースのLANソケットの隙間から表にだし、USB WLANのアンテナ部分に借り止めでつけてあります。下の黒いのがUSBパワーを供給するバッテリーで、これで好きなところ(ただし、WLANが届くところ)に設置できます。

WLANの設定ですが、以下のようになります。

1.WLANを有効にする
以下の設定ファイルを2か所修正します。

$ sudo vi /etc/network/interfaces

iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
         ↓
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

2.無線LANの接続設定
次に親機と接続できるよう、SSIDやキーを設定してやる必要があります。ファイルは、/etc/wpa_supplicant/wpa_supplicant.confです。rootになって以下のコマンドをじっこうします。

# wpa_passphrase SSID pass >> wpa_supplicant.conf

SSID:親機のID
pass:使用しているセキュリティに応じたキー

こうすると以下のような感じになります。

pi@raspberrypi /etc/wpa_supplicant $ sudo cat wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="***335786826CE295923343F371E9100"
        #proto=wpa2
        #key_mgmt=WPA-PSK
        #pairwise=TKIP CCMP
        #group=TKIP CCMP
        psk="****ba48855fb70911eb244034920f6a4440d314b341b604891569796a565"
        #psk=****d233afa24051e209237e4ec79b8659d32f7a650e4bb1a0d08720f4d759e
}

SSIDやキーは一部かくしてあります。#のコメント行は基本的に後から自分が追加したものです。もしかしたら必要かもと調べたサイトにあったんですが、自分の場合は必要ありませんでした。それでも最初なかなか接続ができず、なんでだろうと親機のログをみてみるとDHCPのアドレス発行まではいっているようです。どうもキーの設定が悪く、うまく接続できないようです。実は、psk行が2ラインありますが、最初は1行目(赤字部分)がコメントになっていて、2行目が有効になっていました。しかし親機の設定をみるとコメントにしてあるほうが設定してあるキーです。理由がわかりませんが、そちらを有効にしたらつながるようになりました。

これで準備万端です。さっそくベランダに置いてみて、外の風景を撮影してみました。快適に動きます。