Reflectionを使ってProxyクラスのひな型を書き出す

class TargetClass {
    String id, name;
    ...setter, getter...
}

みたいなBeanへのProxyクラスとして

class Proxy extends TargetClass {
    TargetClass target;

    public void setId(String id) { target.setId(id); }
    public String getId() { return target.getId(); }
    ...
}

を定義したい場合に、Setter Getterの作成が大変!!
↓をコピペすれば幸せになれるかも!

for (Field f : TargetClass.class.getDeclaredFields()) {
	String code = 
	("\t@Override\n" +
	"\tpublic void set${method}(${type} ${field}) {\n" +
	"\t\ttarget.set${method}(${field});\n" +
	"\t}\n\n" +
	"\t@Override\n" +
	"\tpublic ${type} get${method}() {\n" +
	"\t\treturn target.get${method}();\n" +
	"\t}\n").replaceAll("\\$\\{method\\}", StringUtils.capitalize(f.getName()))
			.replaceAll("\\$\\{field\\}", f.getName())
			.replaceAll("\\$\\{type\\}", f.getType().getName());
	System.out.println(code);
}

…幸せになるやついんのか。。

GAE/Jでデータストアの単体テスト

GAEはじめました。とりあえず、BigTableを試してみるべくJDOを使った単体テストに挑戦!
ローカル サービスの実装でのユニットのテストの通りに進めればデータを保存できる模様。


EclipseのGAEプラグインからプロジェクトを作成した場合はappengine-api-stubs.jar および appengine-local-runtime.jarがないはずなので、ここからJavaSDKを落としてきてクラスパスを通す必要がある。

データストアとJDOの使用にあるGreetingをテストしてみる。

public class GreetingTest {

	PersistenceManager pm;
	
	@Before
	public void setUp() throws Exception {
		ApiProxy.setEnvironmentForCurrentThread(new TestEnvironment());
		ApiProxy.setDelegate(new ApiProxyLocalImpl(new File(".")){});
		((ApiProxyLocalImpl)ApiProxy.getDelegate()).setProperty(LocalDatastoreService.NO_STORAGE_PROPERTY, Boolean.TRUE.toString());
		pm = JDOHelper.getPersistenceManagerFactory("transactions-optional").getPersistenceManager();
	}
	
	@Test
	public void test() throws Exception {
                Greeting g = new Greeting("a", new Date());
		pm.makePersistent(g);
		System.out.println(pm.getObjectById(Greeting.class, g.getId()));
	}

	@After
	public void tearDown() throws Exception {
		if(pm != null)
			pm.close();
		ApiProxy.setEnvironmentForCurrentThread(null);
		ApiProxy.setDelegate(null);
	}
}

ぬるぽ。orz

java.lang.NullPointerException
	at com.google.appengine.api.NamespaceManager.get(NamespaceManager.java:71)
	at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:81)
	at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:73)
	at com.google.appengine.api.datastore.Key.<init>(Key.java:100)
	at com.google.appengine.api.datastore.Key.<init>(Key.java:85)
	at com.google.appengine.api.datastore.Key.<init>(Key.java:81)
	at com.google.appengine.api.datastore.Entity.<init>(Entity.java:103)
	at com.google.appengine.api.datastore.Entity.<init>(Entity.java:84)
	at org.datanucleus.store.appengine.DatastoreFieldManager.<init>

とりあえずの回避方法

NamespaceManagerのとこでエラーになってたので、TestEnvironmentを以下のようにすることで回避。

public class TestEnvironment implements ApiProxy.Environment {
    public String getAppId() {
        return "Unit Tests";
    }

    public String getVersionId() {
        return "1.0";
    }
    
    public Map<String, Object> getAttributes() {
        Map<String, Object> ret = new HashMap<String, Object>();
        ret.put(NamespaceManager.class.getName() + ".default_api_namespace_key", "test");
        return ret;
    }
    ...
}

グリーンきた!!

CentOS 5.3にRuby1.8.7+Rails2.3.2環境構築

CentOSは5.3をserverパッケージでインストールしたもの。

※ 2010/6/27 RubyRubygemsのsource取得元を最新版に更新。

必要なライブラリのインストール

sudo yum install gcc zlib-devel openssl-devel readline-devel sqlite-devel nkf

Ruby 1.8.7のインストール

wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p299.tar.gz
tar zxf ruby-1.8.7-p299.tar.gz
cd ruby-1.8.7-p299
./configure
make && sudo make install

Ruby追加ライブラリのインストール

cd ext
for lib in openssl readline nkf zlib
do
cd $lib
ruby extconf.rb
make && sudo make install
cd ..
done

RubyGemsのインストール

wget http://rubyforge.org/frs/download.php/70696/rubygems-1.3.7.tgz
tar zxf rubygems-1.3.7.tgz
cd rubygems-1.3.7
sudo ruby setup.rb

GemでRailsといろいろインストール

sudo gem install rails rake sqlite3-ruby mongrel passenger

Passengerのインストール

プロトタイプ公開用のサーバーにしたかったので追加。

sudo gem install passenger
sudo yum install gcc-c++ httpd-devel apr-devel
sudo passenger-install-apache2-module

/etc/httpd/conf/httpd.confに以下を追記

   LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/apache2/mod_passenger.so
   PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2
   PassengerRuby /usr/local/bin/ruby

WEBの表示が明らかに遅いと思ったらIPv6を試してみる

やっとやっと念願のネットが繋がったのにMac Bookから無線ルーター経由で接続するとWEBの表示がもの凄く遅い。以下のような症状が出ていて、その解決メモ。

症状

  • WEBブラウザでの表示がやたら遅い、1分くらい待たされる。
  • ドメインの名前解決で待たされているようだ。Firefoxのステータスバーにaaa.comに接続していますと表示されっぱなし。

そんなときはIPv6を疑ってみよう!

Macならシステム環境設定→ネットワーク→ルーターい接続しているデバイスを選択→詳細→TCP/IPタブから
IPv6の構成を「切」にする。

今回は、これでかなり改善したスピードテストも0.5Mbpsから15.4Mbpsに改善した。
そういえば、前に似たようなことをVistaでやったっけ

イマイチ理由が分かってないのが悔しいところだが、なんとなくIPv6に対応してないDNSサーバーが途中にいるせいなんじゃないかとは思っている。

position:absoluteな要素はvertical-alignが効かない?

プログラム大好きです!という自己PRをブックマークレットで表現しようと奮闘しているkoumiyaです。
で、タイトルの件、FF3でダメぽだったので忘れないようにメモ。

効かない

<div style="position:absolute;vertical-align:middle;display:table-cell;width:100;height:100;background-color:black;color:white;">aaa<br />bbb</div>

これだと効く

<div style="vertical-align:middle;display:table-cell;width:100;height:100;background-color:black;color:white;">aaa<br />bbb</div>

要素が絶対位置でも相対位置でも中身は関係ない気がするけどなぜ!?

RMagickで画像をHTMLに変換する

訳あってRMagickを試してみた。
手始めに、前にどっかで見た画像をHTMLに変換するのをやってみる。

で、こんな感じになった。

require "rubygems"
require "activesupport"
require "RMagick"

exit unless file = ARGV.shift

def hex_color(px)
  format("#%x%x%x", px.red >> 8, px.blue >> 8, px.green >> 8)
end

img = Magick::ImageList.new(file)
puts "<html><body><div style='width:#{img.columns}px'>"
img.get_pixels(0,0,img.columns, img.rows).each_slice(img.columns) do |ps|
  ps.each {|p| puts "<div style='background:#{hex_color(p)}; width:1px; height:1px; float:left;'></div>"}
end
puts "</div></body></html>"

1pxのdivに背景色を指定して元画像の横幅分並べている。
このソースをconvert.rbという名前で保存して

ruby convert.rb image_file > test.html

すると、test.htmlに画像をわざわざHTMLに変換して
書き出すという寸法さ!html開くと重いから注意してくれよ!