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がないはずなので、ここからJavaのSDKを落としてきてクラスパスを通す必要がある。
データストアと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 RubyとRubygemsの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
pushd/popd
色々作業した後に今のディレクトリに戻ってこれる。し、知らなかった。。
$ pwd /home/koumiya $ pushd /etc /etc /home/koumiya # 今/etcにいる # 色々作業して $ popd /home/koumiya #戻ってこれる!
WEBの表示が明らかに遅いと思ったらIPv6を試してみる
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開くと重いから注意してくれよ!