2013年12月19日木曜日

全角英数は半角英数に、半角カナは全角カナに変換する

九州のパートナー会で作成しているQAアプリで必要になったので調査しました。

要件としては「入力された半角・全角をどちらかに統一したい」ということ。

英数は半角で、カナは全角で統一するのがすっきしますよね。

ということで調べてみました。

ICU4JというJavaライブラリがあるんですね。これを使えば簡単そうです。

この例の他にも、変換の方法が色いろあるようです。ちょっと調べてみよう。

 

準備

  1. ICUのサイトからICU4Jをダウンロードする。http://site.icu-project.org/download
  2. ZIPファイルを展開し、icu4j-52_1.jar を取り出す。
  3. Designerのパッケージエクスプローラの「WebContent > WEB-INF > lib」に「icu4j-52_1.jar」をコピーする。

使い方

全角英数は半角英数に、半角カナは全角カナに変換するには、下記のStaticメソッドを呼ぶ

com.ibm.icu.text.Normalizer.normalize("変換する文字", com.ibm.icu.text.Normalizer.NFKC);

 

例: XPagesを作って下記をコピペしたら動きます。

 

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <p>
        <xp:inputText id="input" style="width: 30em"
            defaultValue="#{'ABCDEFG12345アイウエオABC123アイウエオガギグゲゴ'}">
        </xp:inputText>
        <xp:button id="change" value="変換">
            <xp:eventHandler event="onclick" submit="true"
                refreshMode="partial" refreshId="trans">
                <xp:this.action><![CDATA[#{javascript:var input:com.ibm.xsp.component.xp.XspInputText = getComponent("input");
var sourceString = input.getValueAsString();
var transString = com.ibm.icu.text.Normalizer.normalize(sourceString,
com.ibm.icu.text.Normalizer.NFKC);
var trans:com.ibm.xsp.component.xp.XspOutputText = getComponent("trans");
trans.setValue(transString);
}]]></xp:this.action>
            </xp:eventHandler></xp:button>
    </p>
    <p>
        <xp:text id="trans"></xp:text>
    </p>
</xp:view>

2013年12月11日水曜日

連載:ちょっとディープなXPages 第2-9回~JavaScriptをもっと知ろう

みなさん!XPages開発していますか!?
今回から数回に分けてオブジェクトの継承について話したいと思います。
前回、prototypeの説明をしましたが、それも1つの継承です。しかし、JavaScriptではオブジェクトのすべてを、コンストラクタ関数を使用して作成することは多くありません。
もっと手軽に継承する方法が幾つかあります。

ミックスイン

ミックスインとは2つ以上のオブジェクトのすべてのメンバーを持つ1つのオブジェクトに統合することです。多重継承に近い概念でしょうか。
JavaScriptでの用途としては、ある関数の引数にオブジェクトを渡すこととして、そのオブジェクには設定しなくてもよいメンバーがあるとします。
設定されなかったメンバーは関数内でのデフォルト値が設定されることつぃます。
下記の例では、ユーザー登録関数に姓名と年齢、性別を持つオブジェクトを渡すことを想定しています。年齢と性別は渡さなくても良いですが、その場合は、デフォルト値として"-1"と"N"が設定されるようにします。
ミックスインを使用しない場合は、ifで個々を判断する必要があります。
    //ミックスインを使用しない場合
    var addUser = function(obj){
        //本来であれば姓名の必須チェックが必要
        if(!!obj.age){
            obj.age = -1;
        }
        if(!!obj.gender){
            obj.gender = 'N';
        }
    }
    //利用側
    addUser({name: 'Kenji Ebihara'});
    
この例では2つのプロパティだけなので、それほど大変ではありませんが、メンバーの数が増えてくると大変なのは想像できると思います。
そこで、ミックスインを使用します。
    //ミックスインを使用する場合
    //引数のデフォルトのメンバーを作成
    var addUserDefaultArg = {
        age : -1,
        gender : 'N'
    }
    var addUser = function(obj){
        //本来であれば姓名の必須チェックが必要
        var arg = mixin(addUserDefaultArg, obj);
        print(arg.age);
        print(arg.gender);
    }
    //ミックスイン関数
    var mixin = function(base, child){
        var newObj = {}, member;
        //デフォルトのオブジェクトのメンバーをコピー
        for(member in base){
            newObj[member] = base[member];
        }
        //継承するオブジェクトからメンバーをコピー
        //デフォルトと同じメンバーがあったら上書きされる
        for(member in child){
            if(!!child[member]){ // nullやundefindの場合は引き継がない
                newObj[member] = child[member];
            }
        }
        return newObj;
    }
    //利用側
    addUser({name: 'Kenji Ebihara'}); // -1, 'N'が出力される
    
mixin関数は、for-inを利用してオブジェクトのメンバーをすべてコピーし、そのあとで継承するオブジェクトのメンバーをコピーすることで、継承するオブジェクトに含まれないかnull,undefindのものは継承元のオブジェクトのものが採用されます。

次回は

継承とは少し違いますが、他のオブジェクトのメソッドを利用する、「メソッド拝借」について解説します。
海老原 賢次(EBIHARA Kenji)
リコーITソリューションズ株式会社(RICOH IT SOLUTIONS CO.,LTD.)
鹿児島ソリューション部(Kagoshima Department)