ヒマをみつけてWeb開発
その場の思い付きを、ヒマをみつけてWebサイトにしてみるブログ

プログラマにとって非常に高いWebデザインという壁

Tuesday, 28 November 2006 16:25 by sabro

HTMLエンコードツールが完成しました。

が、

デザインのあまりのショボさに絶句してしまったので、もう少しセンスアップを図ろうと考えてます。

こんなの↓

具体的にはフォトレタッチソフトで小洒落た画像の作成にチャレンジします。会社では、デザイナーから上がってきた画像のサイズを調整したり、色を変えたりとかはやってきたのですが、自分で一から作るのは今回が初めて。

ソフトは、ケチってGIMPで。デザインはWeb開発で避けては通れない部分なので気合を入れてやります。

Tags:  
Categories:   WebDesign
Actions:   Permalink | Comments (2) | Comment RSSRSS comment feed

HTMLフォームにフォーカスが当たらない

Thursday, 23 November 2006 15:27 by sabro

HTMLエンコードツールの入力用textareaにフォーカスが当たらなくて、ここ3日間くらい悩んでおりました。

普通、textarea上にカーソルを持っていくと表示が矢印から、縦棒に変わり、その状態でクリックすると入力可能になるはずなのですが、問題のtextarea上では、カーソルがずっと矢印のままでクリックにも反応しませんでした。

そして、今日やっとその原因が判明。別の大きなdivボックスがtextareaの上に重なっていただけでした・・・orz

スタイルシートでz-indexを設定し、textareaを最前面に持ってくることで解決しました。

Categories:   HTML,CSS
Actions:   Permalink | Comments (45) | Comment RSSRSS comment feed

Propertiesクラスでnative2asciiを実装

Monday, 20 November 2006 00:00 by sabro

Javaでnative2asciiを実装の件ですが、Propertiesクラスを使って実装してみることにしました。

もともとnative2asciiは、Propertyファイルに日本語文字列を格納するためのツールであり、PropertiesクラスはそのPropertyファイルを読み込んだり書き込んだりするわけで、なにかしらの変換手段を持っているはずだからです。

JavaDocを見ると、どうやらgetProperty、setPropertyメソッドを使っているだけではUnicode変換は発生しないようです。storeメソッドでStreamに書き出したり、loadメソッドで読み出したりする際に変換が発生するとのこと。

実際にstoreメソッドで「あいうえお」と保存したとき、以下のように保存されていました。=以下の部分が変換後の文字列です。うまくこの部分を取得できれば変換が出来そうです。

##Sun Nov 19 22:55:25 JST 2006=\u3042\u3044\u3046\u3048\u304A

さらに今回はメモリ内で処理を完結させたいので、StreamにはByteArrayOutputStream、ByteArrayInputStreamを使います。以下ソースです。

Properties p=new Properties();
ByteArrayOutputStream bos=new ByteArrayOutputStream();
p.setProperty("", "変換文字列");p.store(bos, "");
int index=bos.toString().indexOf("=");
return bos.toString().substring(index+1).replaceAll("\\=", "=").replaceAll("\\:",":").replaceAll("\\#", "#").replaceAll("\\!","!").replaceAll("\\\\","\\");

変換する文字列をsetPropertyで格納し、storeメソッドでその内容をByteArrayOutputStreamに保存します。そして=以下の部分をsubstringで取得します。「#、!」はコメントに使われる文字なのでエスケープされています。最後の行でこれをエスケープされてない状態に戻しています。同様にkeyとvalueの区切りに使われる「=、:」、Unicode文字の先頭に使われる「\」もアンエスケープしています。

デコードのソースは以下です。

Properties p=new Properties();
ByteArrayInputStream bis=new ByteArrayInputStream("=".concat("変換文字列").getBytes());
p.load(bis);
return p.getProperty("");

文字列の前に=を連結してByteArrayInputStreamに保存した後、空文字をkeyとしてgetPropertyで取得するとデコードされます。

これで何とかnative2asciiは実装できそうです。ついでにURLエンコードとかも出来るようにしようかと考え中です。

Tags:  
Categories:   Java
Actions:   Permalink | Comments (43) | Comment RSSRSS comment feed

Javaでnative2asciiを実装

Saturday, 18 November 2006 00:09 by sabro

HTMLエンコードツールに、native2ascii機能も追加しようと思っていろいろ調べてみました。

とりあえず検索してみたんだけどライブラリは見つかんない。直接native2ascii.exeを呼び出すのはあんまりやりたくなかったので、native2asciiタスクを持っているAntの実装をパクッて参考にしてみることにしました。

検索してsun.tools.native2ascii.Mainというクラスを使っているところを発見。しかし、なぜかインスタンスを直接生成せずリフレクションを使ってクラスを取得しています。このクラスはtools.jarに含まれているそうなので、とりあえずプロジェクトでtools.jarを参照してみました。

でも、なぜかインテリセンスに上記クラスが現れません。無理矢理宣言してもコンパイルエラーになります。どうやらこういうことらしいです。sunパッケージ以下のクラスは将来的に動作が変更される可能性があるから使わないでくださいとのこと。それで、Antでもリフレクションで呼んでたのか。っていうかAntはこの注意事項を守ってないんですね。ある意味男らしいです。

まずはリフレクションのgetDeclaredMethodsメソッドでsun.tools.native2ascii.Mainが持っているメソッドの一覧を取得してみました。publicなメソッドが3個しかありません。

public static void sun.tools.native2ascii.Main.main(java.lang.String[])
private static java.nio.charset.Charset sun.tools.native2ascii.Main.lookupCharset(java.lang.String)
private void sun.tools.native2ascii.Main.error(java.lang.String)
public synchronized boolean sun.tools.native2ascii.Main.convert(java.lang.String[])
public static boolean sun.tools.native2ascii.Main.canConvert(char)
private java.lang.String sun.tools.native2ascii.Main.formatMsg(java.lang.String,java.lang.String)
private java.io.BufferedReader sun.tools.native2ascii.Main.getA2NInput(java.lang.String) throws java.lang.Exception
private java.io.Writer sun.tools.native2ascii.Main.getA2NOutput(java.lang.String) throws java.lang.Exception
private java.lang.String sun.tools.native2ascii.Main.getMsg(java.lang.String)
private java.io.BufferedReader sun.tools.native2ascii.Main.getN2AInput(java.lang.String) throws java.lang.Exception
private java.io.BufferedWriter sun.tools.native2ascii.Main.getN2AOutput(java.lang.String) throws java.lang.Exception
private static void sun.tools.native2ascii.Main.initializeConverter() throws java.io.UnsupportedEncodingException
private void sun.tools.native2ascii.Main.usage()

convert関数の引数に、入力ファイルパスと出力ファイルパスを渡すことで一応変換は出来ました。以下動作したコードです。

Class n2aMain = Class.forName("sun.tools.native2ascii.Main");
Method convert = n2aMain.getDeclaredMethod("convert",new Class[]{String[].class});
Object o = n2aMain.newInstance();
convert.invoke(o,new Object[]{new String[]{"C:\input.txt","C:\output.txt"}});

ファイル経由以外ではダメみたいでした。しかも、エンコードは出来てもデコードができません。(なんかデコードに使われてそうなprivateメソッドはもってるのに。)

メモリ内で処理完結できて、デコードにも対応する方法がないかもう少し探してみることにします。

Tags:  
Categories:   Java
Actions:   Permalink | Comments (45) | Comment RSSRSS comment feed

開発に最も必要なもの

Tuesday, 14 November 2006 00:55 by sabro

SeasarがDoltengというEclipseプラグインを出している。私はこれを触ったわけではないので製品自体に関して詳しくは述べないのだけど、TeedaとUujiというフレームワークを使用して開発する際に、生産性を飛躍的に高める効果があるらしい。

ひがやすを氏のブログに書いてあったのだが、EJB3、JPA、JSFを単に導入しただけでは生産性がうまく上がらず、独自に開発スピードを上げるための仕組みを作る必要があり開発したそうだ。

一応、社内フレームワークを開発している立場として普段私が思っていることがある。

「フレームワークよりライブラリを。設定より規約、規約よりツールを。」

Seasarプロジェクトの考え方と似ており、私の考え方がひとりよがりのものでなかったようで少しほっとした。

フレームワークが必要な層というのは内部設計ができないレベルの人達である。そのレベルの人達に対してフレームワークはコーディングの筋道を示し、コード品質を一定に保つのに一役買う。

しかし、、プログラマがある一定レベルを超えていると、フレームワークはかえって足かせになってしまう場合がある。現場の仕様は複雑で様々な例外的処理を含んでおり、一定の筋道に沿ってコードを記述していくのが難しい場面がしばしば出てくる。

内部設計が出来るレベルのプログラマに必要なのは統制のとれたフレームワークでなく、開発生産性を上げるライブラリなのだ。私は普段フレームワークを作る際は、わざとプログラマの自由度を高く設定する。そして、再利用可能なちょっとした関数や、単純にコードの記述量を減らせるライブラリに重点を置いて開発している。

それに近い理由で開発の生産性を高めるツールの重要度は高い。Railsが世に出てから「設定より規約」の考え方が浸透してきたが、私はこれは少なくとも一定以上の規模を持つシステムでは当てはまらないと考えている。設定ファイルは記述するのが面倒だが、システムに柔軟性を与える。変更する必要の高い定数を切り出しておくことで、可搬性、可用性が大きくアップする。

面倒だから書かないではなく、面倒だからツールに書かせるなり工夫しようという考え方が重要なのだ。Seasarは、設定ファイルを書かないのではなく設定ファイルを使用しつつも考え抜かれたデフォルト値を使うことで設定なしでプログラムを動作させることが可能になっている。

時にフレームワーク作成は、開発者に対する自分の考え方の押し付けであったりする。反対に一見地味なライブラリやツールの作成に必要なのは地道な努力と謙虚な姿勢なのである。実際の現場が求めているのは、フレームワークという押し付けでなくライブラリ、ツールという援助(愛)なのではないだろうか。

Tags:  
Categories:   Architecture
Actions:   Permalink | Comments (36) | Comment RSSRSS comment feed

FireFoxのWeb DeveloperエクステンションでCSS編集

Sunday, 12 November 2006 13:49 by sabro

スタイルシートの修正をリアルタイムでブラウザで確認できるツールを探して、FireFoxのWeb Developerエクステンションを見つけました。

このエクステンション自体は以前から使っていたのですが、Divタグの可視化とかに使っていただけであまり細かいところまで見ていませんでした。「CSS → CSSを編集する」でスタイルシートをリアルタイムで修正でき、非常に便利です。

Tags:  
Categories:   HTML,CSS
Actions:   Permalink | Comments (41) | Comment RSSRSS comment feed

JavaでHTMLエンコード(4)

Wednesday, 8 November 2006 21:37 by sabro

エンコードツールはスタイルシート部分でハマってます。会社でWebサイト作ってた時は、この辺はデザイナーさんに任せきりだったんで。ブログ構築の際には少し触ったんですが、未だにブラウザ間の解釈の違いがよく分かりません。

逆にプログラム部分は割とアッサリ出来てしまったので、2バイト文字エンコード問題の修正や、機能追加とかを考えています。

Categories:   HTML,CSS
Actions:   Permalink | Comments (0) | Comment RSSRSS comment feed

JavaでHTMLエンコード(3)

Sunday, 5 November 2006 00:55 by sabro

</body>が消える問題ですが、一度何かボタンを押して再度同じ画面へ遷移すると表示されます。もしかしたら、開発環境だけで起こる問題かもしれません。とりあえずこのまま開発を続けることにします。ちなみにスタイルが崩れるのは単に自分のCSSファイルがおかしいだけでした(;´д`)

今は、JSPには記述されていない空のdivタグが、bodyの先頭にレンダリングされてしまって、FireFoxで表示が崩れてしまう問題でつまずいてます。

JSFはコントロールを貼り付けるだけで、HTMLを描画してくれるという簡易性がある反面、ハマッたときに原因の追究が難しいですね。そういうところがあるから、JSPの基本を理解している人は、StrutsからJSFへなかなか移行しないんでしょうか。

Categories:   JSF
Actions:   Permalink | Comments (57) | Comment RSSRSS comment feed

</body>が消える

Wednesday, 1 November 2006 13:49 by sabro

エンコードツールも結構出来てきたんだけど、</body>が消える現象に悩まされてます。

一応、</body>がなくてもページが見れたりもするんですが、スタイルシートのデザインが崩れてしまうので、やっぱり何とかしないとダメな感じみたい。

Sunのフォーラムも見てみたんですが、未解決のバグのようでお手上げ状態です。フォーラムの最後にチョコッと書いてある全てをブロック要素にする方法も試したけどダメでした。

http://swforum.sun.com/jive/thread.jspa?threadID=64442 http://forum.sun.com/jive/thread.jspa?forumID=123&threadID=97296

Categories:   JSF
Actions:   Permalink | Comments (48) | Comment RSSRSS comment feed