2011 年 11 月 のアーカイブ

SimpleDateFormatがメモリを食い尽くす件




















java.text.SimpleDateFormatのインスタンスを毎回作ってRFC2822の日付文字列からDate型に変換していたら、GCされずにメモリを食いつぶしてしまったので対策。

	public static Date convertRfc2822toDate(String from) {
		String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
		SimpleDateFormat format = new SimpleDateFormat(pattern);
		Date date = null;
		synchronized (format) {
			try {
				date = (Date) format.parse(from);
			} catch (ParseException e) {
				date = new Date();
			}
		}
		format = null;
		return date;
	}

上は元のコード。下は修正版。

	private static SimpleDateFormat format = null;

	public static Date convertRfc2822toDate(String from) {
		String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";

		Date date = null;
		if (format == null) {
			format = new SimpleDateFormat();
		}
		synchronized (format) {
			format.applyPattern(pattern);
			try {
				date = format.parse(from);
			} catch (ParseException e) {
				date = new Date();
			}
		}

		return date;
	}

完全なスレッドセーフにはなっていないけど、メモリリークは解消できたので良し。


PythonのPyDHCPLibを使ってDHCPパケットを読む




















PyDHCPLibはPure Pythonで書かれたDHCPパケットのリード/ライトライブラリです。

Pythonで書かれているので、LinuxでもWindowsでも動きます。(Windowsのときはちょっと対策が必要)

まずはdebian Linuxの場合。(aptでインストールできました。追記参照)

$ wget http://pydhcplib.tuxfamily.org/download/pydhcplib-0.6.2.tar.gz
$ tar xvzf pydhcplib-0.6.2.tar.gz
$ cd pydhcplib-0.6.2
$ sudo /usr/bin/python2.6 ./setup.py install

/usr/local/lib/python2.6/dist-packages/pydhcplib
に入りました。

流れてくるパケットを読み取るためにはサーバとして動かします。
examplesディレクトリの中にサーバ用のサンプルが入っているので実行します。

$ sudo /usr/bin/python2.6 ./examples/server_example.py

これでOKです。

ちなみにroot権限で実行しないと、以下のエラーが出てポートが開けられません。
pydhcplib.DhcpNetwork.BindToAddress error : [Errno 13] Permission denied

ではWindowsの場合。

Windows 7にもPython 2.7.2をインストールして使って見ました。

> cd pydhcplib-0.6.2
> C:\Python27\python.exe .\setup.py install

C:\Python27\Lib\site-packages\pydhcplibにインストールされました。

> C:\Python27\python.exe .\examples\server_example.py
Traceback (most recent call last):
  File ".\examples\server_example.py", line 21, in <module>
    from pydhcplib.dhcp_network import *
  File "C:\Python27\lib\site-packages\pydhcplib\dhcp_network.py", line 22, in <module>
    import IN
ImportError: No module named IN

インポートエラー。INモジュールというものがないとのこと。

INモジュールはdebianではPythonのplat-linux2ディレクトリ以下に入っています。中身は
# Generated by h2py from /usr/include/netinet/in.h
netinetから変換した定数の定義でした。

なので、必要なところだけコピーしてくることにします。

$ cat /usr/lib/python2.6/plat-linux2/IN.py |grep SO_BINDTODEVICE
SO_BINDTODEVICE = 25

このSO_BINDTODEVICEの定義だけを書いたIN.pyファイルをexamplesディレクトリに置けばOKです。

IN.py
SO_BINDTODEVICE = 25

これで試しにiPod touchをLANに接続して見ました。

> C:\Python27\python.exe .\examples\server_example.py
# Header fields
op : BOOTREQUEST
htype : 1
hlen : 6
hops : 0
xid : 3472825851
secs : 1
flags : 0
ciaddr : 0.0.0.0
yiaddr : 0.0.0.0
siaddr : 0.0.0.0
giaddr : 0.0.0.0
chaddr : 00:26:bb:XX:XX:XX
sname :
file :
# Options fields
client_identifier :
parameter_request_list : subnet_mask,router,domain_name_server,domain_name,domain_search,252
host_name : homma2
request_ip_address : 172.18.0.21
dhcp_message_type : DHCP_REQUEST
ip_address_lease_time : 7776000
maximum_dhcp_message_size : 1285

これでネットワークに接続された端末のリースタイム・MACアドレス・IPアドレスが取れました。

追記

debian squeezeではパッケージ登録されていました。
なので、aptで簡単にインストールできます。

$ aptitude search pydhcplib
p   python-pydhcplib                                                                                 – Python DHCP client/server library
v   python2.5-pydhcplib                                                                              –
v   python2.6-pydhcplib                                                                              –
$ sudo aptitude install python-pydhcplib

以上。


DebianからWindows7の共有フォルダにアクセスする




















実際の構成としてはVirtual PC内のdebian(squeeze)からホストOSのWindows7の共有フォルダにアクセスするという要件なのだけど、特に問題なくできたので。
ちなみにLoopback Adapter接続でした。

# apt-get install samba smbfs
# mkdir /media/videos
# mount -t cifs -o username=Windows側のユーザー名,codepage=cp932,iocharset=utf8 //Windows側のIP/Users/Public/Videos /media/videos

パスワードの入力を求められます。

Windows7だと、Publicフォルダが「パブリック」とか日本語になっていたりするので、コマンドプロンプトを使ってあらかじめ名前を確認しておきます。

SCPでVirtualPCと巨大なファイルをやり取りしようとするとなぜかやたら遅くて…
マウントしてしまえばさっくり行けます。


loadImage時にcontains a path separatorのIllegalArgumentExceptionが発生する原因




















Processing for Android 1.5.1でPApplet.loadImageを実行するときにエラー。

java.lang.IllegalArgumentException: File /mnt/sdcard/Android/data/com.sample.android.apptest/hoge.jpg contains a path separator

ファイルが存在しない場合に発生します。
エラーメッセージわかりにくいね。
loadImageメソッドは色々なソースからファイルが取得できるかを確認しに行くのでこういうことになっているのだと思います。


ProcessingをAndroidで使う(導入編)




















ひと通りProcessingを利用してAndroidアプリを作ってみたので、色々書いておこうと思います。

まずは一番簡単なProcessingのIDEを使った方法です。

Download \ Processing.org

まずはProcessingをダウンロードします。執筆時点での最新安定バージョンは1.5.1です。Android SDKはインストールしておく必要があります。

実行すると、ProcessingのIDE(統合開発環境)が開きます。

WS000025

Processingについてはあまり説明しません。とりあえずはAndroidモードに切り替えます。右上の「STANDARD」と表示されているボタンを押すと、リストが表示されます。ただのラベルじゃないので、押せます。

WS000026

WS000027

Androidを選ぶと、IDEの色が変わります。右上のモードが「ANDROID」になっていることを確認します。

WS000028

メニューのFileからExamplesを開きます。

WS000003

ここで適当にサンプルを選んで、ダブルクリックで開きます。

ソースコードを読み込んだあとに、左上の再生ボタンを押せばエミュレータで動作を試せます。

WS000004

が、残念ながら、今はAndroid SDKのバージョンが上がったことで、エラーが出て実行できなくなっています。

BUILD FAILED
C:\Users\test\AppData\Local\Temp\android397981578064449760.pde\build.xml:16:

Error. You are using an obsolete build.xml
You need to delete it and regenerate it using
    android update project

Total time: 0 seconds

このままProcessing IDEで遊びたい場合は、まだ開発中のProcessing 2.0a4などを使えば上記の問題も解決しているようです。恐らく近日中にリリース版が出るかと。

tadpolizemedia.blog | processing1.5.1 と Android エミュレータ(android-sdk_r14-windows.zip)が連動しない件

詳しくは上記サイトにありましたので参考に。2.0a4でも、再生ボタンでそのまま実行はできませんでした。先にエミュレータを起動しておけば大丈夫です。

実機に転送する場合はメニューのSketchから、Run on Deviceを実行してください。

Processing IDEで開発するのは本質ではないので、この辺で。次回はProcessing IDEで書いたコードをEclipseのプロジェクト形式にエクスポートする方法を紹介します。