2009年8月26日水曜日

Windowsのサービス・ウィンドウより、サービスを削除する。

Windows管理ツールのサービス・ウィンドウより、サービスを削除したい場合
ウィンドウからではサービスを削除できない。

サービスを削除する場合は、コマンドプロンプトより削除する。

> sc delete [サービス名]

サービス名は、サービス・ウィンドウの、
サービスを右クリックし、プロパティより確認できる。

2009年8月15日土曜日

FireFox における、CSS の ime-mode

FireFox でも、CSS の ime-mode が使えるようになった。
normalという設定は説明によると、ユーザスタイルシートで利用するそうだが、それ以外に利用方法は無いものだろうか...
disabled設定は「かな入力」設定の場合は半角カナになってしまい、password入力で使用することはできないと思われる。

# Firefox 3 の新機能
https://developer.mozilla.org/Ja/CSS:ime-mode

以下お試し入力
かな漢字入力: (ime-mode: active)
直接入力: (ime-mode: inactive)
IME無効: (ime-mode: disabled)
デフォルトの設定: (ime-mode: auto)
通常の状態: (ime-mode: normal)
未設定:

iTextで表を作成する方法

iTextを使用して、XMLに記述したレイアウト情報からPDFを出力してみた。

itext.dtd によると、table要素のdtd定義は、<!ELEMENT table (cell*)> となっているのだが、table要素とcell要素の間に、row要素が無いと正しく動作しないようだ。

Javaソース

import java.io.*;
import javax.xml.parsers.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import com.lowagie.text.xml.*;

中略

Document doc = new Document(PageSize.A4, 20, 20, 20, 20);
OutputStream out = new FileOutputStream("forxml.pdf");
PdfWriter pdfwriter = PdfWriter.getInstance(doc, out);

BaseFont jfont = BaseFont.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED);
SAXiTextHandler xmlHandler = new SAXiTextHandler(doc, null, jfont);
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new FileInputStream("itext.xml"), xmlHandler);


XMLファイル

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE itext SYSTEM "http://itext.sourceforge.net/itext.dtd">
<itext>
<paragraph size="10">
<phrase>iTextサンプル</phrase>
</paragraph>
<table width="100%" widths="25;25;50" columns="3" borderwidth="1.0"
left="true" right="true" top="true" bottom="true">
<row>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">id</cell>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">名前</cell>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">部署</cell>
</row>
<row>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">xxx</cell>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">なまえ</cell>
<cell borderwidth="0.5" left="true" right="true" top="true" bottom="true">xxx部</cell>
</row>
</table>
</itext>

コマンドラインから、Windowsのデータソースを登録する方法

Windowsのユーザ データソースに、コマンドラインから登録するには、odbcconf コマンドが使える。
ただし このコマンドでは、データソースを削除できない。

odbcconf CONFIGDSN "Microsoft Access Driver (*.mdb)" "DSN=テストDS名;Description=DS説明;DBQ=C:\work\testdb.mdb"

odbccp32.cpl コマンドで、ODBC データソース アドミニストレータを開いて実行結果を確認できる。
コマンドではデータソースを削除できないが、ODBCCP32.dllを使えば削除できる。
なんとか自動で削除するには、Windows APIを使ってdllを呼ぶ方法になる。


#include <windows.h>
#define ODBC_ADD_DSN 1 // Add user data source
#define ODBC_CONFIG_DSN 2 // Configure (edit) user data source
#define ODBC_REMOVE_DSN 3 // Remove user data source
#define ODBC_ADD_SYS_DSN 4 // Add system data source
#define ODBC_CONFIG_SYS_DSN 5 // Configure (edit) system data source
#define ODBC_REMOVE_SYS_DSN 6 // Remove system data source

typedef long (*_SQLConfigDataSource)(long, long, char*, char*);

int main(int argc, char* argv[]) {

char driver[] = "Microsoft Access Driver (*.MDB)";
char options[] = "DSN=テストDS名";

HINSTANCE odbcdll = LoadLibrary("ODBCCP32.dll");
FARPROC proc = GetProcAddress(odbcdll, "SQLConfigDataSource");
long result = ((_SQLConfigDataSource)proc) (NULL, ODBC_REMOVE_DSN, driver, options);
FreeLibrary(odbcdll);
return 0;
}

2009年8月14日金曜日

My father is my mother.

「私の父はわがままです。」

駄洒落じゃないか。(#゚Д゚)ノ
日本ジェネリック(株)の入社試験に出題されたらしいが、一体何を期待して出題したのだろう。。

2009年8月13日木曜日

Tomcat6をWindowsのサービスに登録する方法

Tomcatが起動中、ずっとコマンドフロンプトが開いたままだと邪魔なので
Windowsのサービスに登録して、サービスで起動停止したい。

参考資料
http://tomcat.apache.org/tomcat-6.0-doc/windows-service-howto.html#Installing%20services

サービスに登録
%CATALINA_HOME%\bin\service.bat install [service_name]

サービスから削除
%CATALINA_HOME%\bin\service.bat remove [service_name]

デフォルトのサービス名は、tomcat6になる様子


サービス起動
sc start tomcat6

サービス停止
sc stop tomcat6

2009年8月12日水曜日

iBATIS ibatorConfig.xmlのclassPathEntryを相対パスで書く

相対パスで書いても、これだとあまり意味がない気がするが。。。
Eclipseの場合、eclipse.exe から辿って、JDBCドライバのパスを記述する。

.\work\eclipse\eclipse.exe
.\work\workspace\..略..\*.jar の場合、

<classPathEntry location="../workspace/Sample1/WebContent/WEB-INF/lib/mysql-connector-java-5.1.7-bin.jar" />

2009年8月11日火曜日

jasperReports detailセクションのフォントを動的に変更

フォントを動的に変更する場合は、net.sf.jasperreports.engine.JasperReportオブジェクトのgetXxxSectionメソッド等で、任意の要素を抽出してフォントを変更すればよい。

JasperReport report = JasperCompileManager.compileReport("sample.jrxml");
report.getTitle().getElementByKey("target1").setForecolor(Color.red);

この場合のjrxmlファイル記述例

<title>
<band height="10">
<staticText>
<reportElement x="0" y="0" width="100" height="20" key="target1"/>
<textElement/>
<text><![CDATA[Hello, World!]]></text>
</staticText>
</band>
</title>

ただしdetailセクションの繰り返し項目については、この方法だと任意の項目だけフォントを変更することができない。これにはパターンの数だけフォントを定義しておき、条件により使い分けることで対応できる。

この場合のjrxmlファイル記述例

<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="20" height="20" forecolor="#000000">
<printWhenExpression><![CDATA[new Boolean($F{color}.equals("black"))]]></printWhenExpression>
</reportElement>
<textElement />
<textFieldExpression class="java.lang.String"><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="0" width="20" height="20" forecolor="#ff0000">
<printWhenExpression><![CDATA[new Boolean($F{color}.equals("red"))]]></printWhenExpression>
</reportElement>
<textElement><font fontName="Arial"/></textElement>
<textFieldExpression class="java.lang.String"><![CDATA[$F{name}]]></textFieldExpression>
</textField>
</band>
</detail>

2009年8月10日月曜日

Struts2 アノテーションによるフォーマット

アノテーションでない場合は、Struts2のドキュメントに記載あり。
http://struts.apache.org/2.0.14/docs/type-conversion.html

アノテーションの場合、Actionクラスに記述をする。

@Conversion()
public class SampleAction extends ActionSupport {
private Date tomorrow;

public Date getTomorrow() {
return tomorrow;
}
@TypeConversion(key = "tomorrow", converter = "sample.TimeConverter")
public void setTomorrow(Date tomorrow) {
this.tomorrow = tomorrow;
}
public String execute(){
return SUCCESS;
}
}

使用したConverterは、StrutsTypeConverterを継承して作成したものです。

public class TimeConverter extends StrutsTypeConverter {

@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
return new SimpleDateFormat("HH:mm").parse(arg1[0]);
}
@Override
public String convertToString(Map arg0, Object arg1) {
return new SimpleDateFormat("HH:mm").format(arg1);
}
}

2009年8月2日日曜日

MySQLに、CSEからODBC経由で接続したときに文字化け

MySQL Connector/ODBC 5.1 を使用してCSEから接続した場合、
データベースの文字コードがUTF-8ならば文字化けしてしまう。

データベース側の設定を変更できる状況でないなら、
通常なら以下の対処を行うが、5.1コネクタだと期待通り動作しない。

CSEより、エンコードの設定を確認
show variables like 'char%';

CSEから、エンコードを変更
SET character_set_client = sjis;
SET character_set_connection = sjis;
SET character_set_results = sjis;

もしくは、クライアント側でmy.cnfファイルの設定を行う。
[odbc]
default-character-set=sjis
※Read Options From my.cnf オプションを有効にする


5.1コネクタだと、上記いずれの対応でも解決しない、
MySQL Connector/ODBC 3.51を使用すれば、上記対応は全て有効だし、
そもそも3.51コネクタならば、ODBCデータソース設定画面の
接続オプションでCharacter setの変更も可能である。

2009年8月1日土曜日

Struts2 s:ifタグの条件判定文(OGNL式)がうまくいかない場合

以下の条件判定は正しく解釈されません
<s:if test="%{#session.flag == 'Y'}">


文字列の場合は、通常ダブルクォーテーションが必要ですが、
2文字以上あれば、シングルクォーテーションでも、適当に解釈して文字列にしてくれます。

ただし、1文字の場合は明確にダブルクォーテーションで囲まないと、charになってしまうので、
注意してください。

例:シングルクォーテーション(2文字以上の場合)
<s:if test="%{#session.name == 'mofu'}">

例:ダブルクォーテーション(1文字以上の場合)
<s:if test='%{#session.flag == "Y"}'>
もしくは
<s:if test="%{#session.flag == \"Y\"}">