関西圏セミナー/Untitled!!!!!!!!(アンタイトルド/略称:Un!)

追記

申し込みから数日で満員になっていました。ustで中継されまので告知しておきますね。
http://www.ustream.tv/channel/untitled8ex

セミナー紹介

2011年4月3日(日)に、関西のWEBクリエータが集まってチャリティーセミナーを実施します。もし近くの方で都合の良い方は足を運び下さい。
2011年03月18日時点での情報です。最新情報公ホームページで。

セミナー概要

日本中が未曾有の危機にさらされている今、関西から元気を発信しようと、Web/IT周辺で活動するクリエイターが集結、セミナーや勉強会などのイベントを主催する団体が力を合わせ、クリエイターが刺激と元気を与え合うイベントを開催します!

会場には東北地方太平洋沖大地震への募金箱を設置、集まった義援金は全額募金します。ご協力よろしくお願いします。

http://m2.cap-ut.co.jp/un/

とき

2011年4月3日(日)
10:30開場 11:00開演(16:00終演予定)

交通アクセス

大阪産業創造館 4Fイベントホール
〒541-0053 大阪市中央区本町1-4-5

詳細

下記URLで
http://m2.cap-ut.co.jp/un/

退職のご挨拶

最近、日記を書く機会がめっきり無くなって来ましたが。ご挨拶がてらのエントリーです。

2011年3月末日を持って、現職を退職することになりました。何かの縁で大阪で勤務できまして、関西近郊の素敵なエンジニアの方々とお会いさせていただくことができました。1人1人、ご挨拶にまわりたいのですが難しいので、この場を借りてご挨拶とさせていただければと思います。

退職した後は、もう一度上京しようと思っています。が…中々就職口がないですねw上京できなかったら海外に素手で殴りこみに行こうかと思います。技術の棚卸をかねて身につけてきた技術を備忘録的に書いていこうと思います。

それでは、関西の皆様、今までありがとうございました!

shogo4405

KanaXSのmavenレポジトリ

KanaXSのJava版のmaven2用のレポジトリを作成しました。公開しておきます。

設定情報など

  1. レポジトリの場所は、http://kanaxs.googlecode.com/svn/trunk/reposです。
  2. dependency情報は、groupIdは、com.googlecode.kanaxsで、artifactIdは、kanaxsです。

pom.xmlの設定(例)

<project>

 <repositories>
    <repository>
      <id>kanaxs.googlecode.com</id>
      <name>KanaXS Maven2 Repository</name>
      <url>http://kanaxs.googlecode.com/svn/trunk/repos</url>
    </repository>
  </repositories>

  <dependencies>
    <dependency>
      <groupId>com.googlecode.kanaxs</groupId>
      <artifactId>kanaxs</artifactId>
      <version>1.0.6</version>
      <type>jar</type>
    </dependency>
  </dependencies>

</project>

Flex⇔Axis2との通信でObject(AS3)を使う

Axis2Flex間で、Objectを利用するためのサンプル。Objectは、Javaのほうのjava.lang.Objectじゃなくて、Flex側のObjectデータの送受信についてのメモ。Flex側は単に引数に{foo:"foo", bar:"bar"}を渡してあげるだけ。

Flex

var webService:WebService = new WebService();
webService.wsdl = "http://localhost:8080/WebServiceProject/services/Test?wsdl";
webService.loadWSDL();
webService.echoOption({foo:"foo", bar:"bar"});

Axis2

パラメータとしてOMElementを利用するのがポイント。サンプル・コードでは、

  1. OMElementを操作して、HashMapのkey、valueに変換してあげている。
  2. さらに、fooノードを追加した、OMElementを返している。
public OMElement echoOption(OMElement option)
{
    OMFactory factory = OMAbstractFactory.getOMFactory();
    HashMap<String, String> map = new HashMap<String, String>();

    // 1
    for(Iterator<OMElement> i=option.getChildElements();i.hasNext();)
    {
        OMElement element = i.next();
        map.put(element.getLocalName(), element.getText());
    };

    // 2
    OMElement child = factory.createOMElement("foo", null);
    child.setText("aaa");
    option.addChild(child);

    System.out.println(map.toString());
    
    return option;
};

そうすると、echoOptionの返り値をFlex側で良きにはからって次のような値にマッピングしてくれる。

Axis2でセッション管理

よく忘れるのでメモ。Axis2でセッションの情報を取得/設定する方法。

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceContext;

中略

MessageContext msgContext = MessageContext.getCurrentMessageContext();
ServiceContext serviceContext = msgContext.getServiceContext();

String key = "hoge";

serviceContext.setProperty(key, 1);
serviceContext.getProperty(key);

PostgreSQLとGenerationType.IDENTITYではまる。

Seasar2.2.40、PostgreSQL8.4/PostgreSQL8.3系で次のようなエラー。

  • idは、SERIAL型。
  • Entityクラスでは、@GeneratedValue(strategy = GenerationType.IDENTITY)を利用。

で、次のようなExceptionはいて落ちる。テーブル自体は、insertされているので、try/catchすれば気にならない...か(?)

Exception in thread "main" org.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[select currval('EMPLOYEE_ID_seq')], Message=[[ESSR0072]SQLで例外(SQL=[select currval('EMPLOYEE_ID_seq')], Message=[0], ErrorCode=55000, SQLState={3})が発生しました : [SQLで例外(Message=[ERROR: currval of sequence "employee_id_seq" is not yet defined in this session], ErrorCode=0, SQLState=55000)が発生しました。], [ERROR: currval of sequence "employee_id_seq" is not yet defined in this session], ErrorCode=0, SQLState=55000)が発生しました
	at org.seasar.framework.util.PreparedStatementUtil.executeQuery(PreparedStatementUtil.java:51)
	at org.seasar.extension.jdbc.id.IdentityIdGenerator.getGeneratedId(IdentityIdGenerator.java:119)
	at org.seasar.extension.jdbc.id.IdentityIdGenerator.postInsert(IdentityIdGenerator.java:78)
	at org.seasar.extension.jdbc.query.AutoInsertImpl.postExecute(AutoInsertImpl.java:250)
	at org.seasar.extension.jdbc.query.AbstractAutoUpdate.executeInternal(AbstractAutoUpdate.java:126)
	at org.seasar.extension.jdbc.query.AbstractAutoUpdate.execute(AbstractAutoUpdate.java:90)
	at test.a.AMain.run(AMain.java:29)
	at test.a.AMain.main(AMain.java:50)
Caused by: org.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[select currval('EMPLOYEE_ID_seq')], Message=[0], ErrorCode=55000, SQLState={3})が発生しました
	at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.wrapException(PreparedStatementWrapper.java:72)
	at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.wrapException(PreparedStatementWrapper.java:67)
	at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:83)
	at org.seasar.framework.util.PreparedStatementUtil.executeQuery(PreparedStatementUtil.java:49)
	... 7 more
Caused by: org.postgresql.util.PSQLException: ERROR: currval of sequence "employee_id_seq" is not yet defined in this session
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271)
	at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:81)
	... 8 more

エラーは、currvalが設定されていないよーというエラー。仕様的(PostgreSQLの)には、currvalする前にnextvalしないといけないのでnextvalをしていないと仮定するならば、納得がいくけど…。

サンプルコード

package test.a;

import java.io.*;
import java.util.*;

import org.seasar.extension.jdbc.*;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class AMain
{
	public JdbcManager jdbcManager;
	
	public void run()
	{
		Employee emp1 = new Employee();
		emp1.name = "HelloWorld!!!";

		jdbcManager.insert(emp1).execute();
		jdbcManager.insert(emp1).execute();

	};
	
	public static void main(String args[])
	{
		SingletonS2ContainerFactory.init();
		S2Container container = SingletonS2ContainerFactory.getContainer();
		AMain amain = (AMain) container.getComponent(AMain.class);
		amain.run();
		container.destroy();
 	};
};

とりあえず、解放が見つからないのでGenerationType.SEQUENCEで試すかな...。

追記

トランザクション制御を忘れていたのが原因。

<component name="AMain" class="text.a.AMain">
     <aspect>j2ee.requiredTx</aspect>
</component>

あー。疲れた。

Kana.JSをJavaに移植してみました

全角カタカナ⇔半角カタカナや、ひらがな⇔カタカナに変換するライブラリーKana.XSをJavaに移植してみました。バグとりをした後にこっちにあげておきます。GitHub - shogo4405/KanaXS: ひらがな⇔カタカナ。全角英数字⇔半角英数字。全角カタカナ⇔半角カタカナ相互変換ライブラリーのJS、AS3、JavaScript版
Javaでこういう処理をするときは、http://www.icu-project.org/とか使うと思います。

ライセンス

修正BSDライセンス

使い方

// 1.KanaUtilクラスをインポート
import com.googlecode.kanaxs.KanaUtil;

public class Main
{
    public static void main(String[] args)
    {
        // 2.メソッドを利用する。
        System.out.println(KanaUtil.toHankakuCase("ABCDEFG")); // ABCDFEG
        System.out.println(KanaUtil.toZenkakuCase("ABCDEFG"));
        System.out.ptinrln(KanaUtil.toZenkanaCase("アイウエオ"));
        System.out.ptintln(KanaUtil.toHiraganaCase("アイウエオ"));

        // ... こんな感じ

    };
};

ToDo

  • toPaddinCaseの実装をする。

2009/10/24時点でのソース

public final class KanaUtil
{
        // 半角カタカナを全角カタカナにするマッピング
        private static final HashMap<Character, Character> H2Z = new HashMap<Character, Character>();

        // 全角カタカナを半角カタカナにするマッピング
        private static final HashMap<Character, Character> Z2H = new HashMap<Character, Character>();

        static
        {
                H2Z.put((char)0xFF67,(char)0x30A1);
                H2Z.put((char)0xFF68,(char)0x30A3);
                H2Z.put((char)0xFF69,(char)0x30A5);
                H2Z.put((char)0xFF6A,(char)0x30A7);
                H2Z.put((char)0xFF6B,(char)0x30A9);
                H2Z.put((char)0xFF70,(char)0x30FC);
                H2Z.put((char)0xFF71,(char)0x30A2);
                H2Z.put((char)0xFF72,(char)0x30A4);
                H2Z.put((char)0xFF73,(char)0x30A6);
                H2Z.put((char)0xFF74,(char)0x30A8);
                H2Z.put((char)0xFF75,(char)0x30AA);
                H2Z.put((char)0xFF76,(char)0x30AB);
                H2Z.put((char)0xFF77,(char)0x30AD);
                H2Z.put((char)0xFF78,(char)0x30AF);
                H2Z.put((char)0xFF79,(char)0x30B1);
                H2Z.put((char)0xFF7A,(char)0x30B3);
                H2Z.put((char)0xFF7B,(char)0x30B5);
                H2Z.put((char)0xFF7C,(char)0x30B7);
                H2Z.put((char)0xFF7D,(char)0x30B9);
                H2Z.put((char)0xFF7E,(char)0x30BB);
                H2Z.put((char)0xFF7F,(char)0x30BD);
                H2Z.put((char)0xFF80,(char)0x30BF);
                H2Z.put((char)0xFF81,(char)0x30C1);
                H2Z.put((char)0xFF82,(char)0x30C4);
                H2Z.put((char)0xFF83,(char)0x30C6);
                H2Z.put((char)0xFF84,(char)0x30C8);
                H2Z.put((char)0xFF85,(char)0x30CA);
                H2Z.put((char)0xFF86,(char)0x30CB);
                H2Z.put((char)0xFF87,(char)0x30CC);
                H2Z.put((char)0xFF88,(char)0x30CD);
                H2Z.put((char)0xFF89,(char)0x30CE);
                H2Z.put((char)0xFF8A,(char)0x30CF);
                H2Z.put((char)0xFF8B,(char)0x30D2);
                H2Z.put((char)0xFF8C,(char)0x30D5);
                H2Z.put((char)0xFF8D,(char)0x30D8);
                H2Z.put((char)0xFF8E,(char)0x30DB);
                H2Z.put((char)0xFF8F,(char)0x30DE);
                H2Z.put((char)0xFF90,(char)0x30DF);
                H2Z.put((char)0xFF91,(char)0x30E0);
                H2Z.put((char)0xFF92,(char)0x30E1);
                H2Z.put((char)0xFF93,(char)0x30E2);
                H2Z.put((char)0xFF94,(char)0x30E4);
                H2Z.put((char)0xFF95,(char)0x30E6);
                H2Z.put((char)0xFF95,(char)0x30E8);
                H2Z.put((char)0xFF97,(char)0x30E9);
                H2Z.put((char)0xFF98,(char)0x30EA);
                H2Z.put((char)0xFF99,(char)0x30EB);
                H2Z.put((char)0xFF9A,(char)0x30EC);
                H2Z.put((char)0xFF9B,(char)0x30ED);
                H2Z.put((char)0xFF9C,(char)0x30EF);
                H2Z.put((char)0xFF9D,(char)0x30F3);
                H2Z.put((char)0xFF9E,(char)0x309B);
                H2Z.put((char)0xFF9F,(char)0x309C);
                H2Z.put((char)0xFF66,(char)0x30F2);

                Z2H.put((char)0x30A1,(char)0xFF67);
                Z2H.put((char)0x30A3,(char)0xFF68);
                Z2H.put((char)0x30A5,(char)0xFF69);
                Z2H.put((char)0x30A7,(char)0xFF6A);
                Z2H.put((char)0x30A9,(char)0xFF6B);
                Z2H.put((char)0x30FC,(char)0xFF70);
                Z2H.put((char)0x30A2,(char)0xFF71);
                Z2H.put((char)0x30A4,(char)0xFF72);
                Z2H.put((char)0x30A6,(char)0xFF73);
                Z2H.put((char)0x30A8,(char)0xFF74);
                Z2H.put((char)0x30AA,(char)0xFF75);
                Z2H.put((char)0x30AB,(char)0xFF76);
                Z2H.put((char)0x30AD,(char)0xFF77);
                Z2H.put((char)0x30AF,(char)0xFF78);
                Z2H.put((char)0x30B1,(char)0xFF79);
                Z2H.put((char)0x30B3,(char)0xFF7A);
                Z2H.put((char)0x30B5,(char)0xFF7B);
                Z2H.put((char)0x30B7,(char)0xFF7C);
                Z2H.put((char)0x30B9,(char)0xFF7D);
                Z2H.put((char)0x30BB,(char)0xFF7E);
                Z2H.put((char)0x30BD,(char)0xFF7F);
                Z2H.put((char)0x30BF,(char)0xFF80);
                Z2H.put((char)0x30C1,(char)0xFF81);
                Z2H.put((char)0x30C4,(char)0xFF82);
                Z2H.put((char)0x30C6,(char)0xFF83);
                Z2H.put((char)0x30C8,(char)0xFF84);
                Z2H.put((char)0x30CA,(char)0xFF85);
                Z2H.put((char)0x30CB,(char)0xFF86);
                Z2H.put((char)0x30CC,(char)0xFF87);
                Z2H.put((char)0x30CD,(char)0xFF88);
                Z2H.put((char)0x30CE,(char)0xFF89);
                Z2H.put((char)0x30CF,(char)0xFF8A);
                Z2H.put((char)0x30D2,(char)0xFF8B);
                Z2H.put((char)0x30D5,(char)0xFF8C);
                Z2H.put((char)0x30D8,(char)0xFF8D);
                Z2H.put((char)0x30DB,(char)0xFF8E);
                Z2H.put((char)0x30DE,(char)0xFF8F);
                Z2H.put((char)0x30DF,(char)0xFF90);
                Z2H.put((char)0x30E0,(char)0xFF91);
                Z2H.put((char)0x30E1,(char)0xFF92);
                Z2H.put((char)0x30E2,(char)0xFF93);
                Z2H.put((char)0x30E4,(char)0xFF94);
                Z2H.put((char)0x30E6,(char)0xFF95);
                Z2H.put((char)0x30E8,(char)0xFF96);
                Z2H.put((char)0x30E9,(char)0xFF97);
                Z2H.put((char)0x30EA,(char)0xFF98);
                Z2H.put((char)0x30EB,(char)0xFF99);
                Z2H.put((char)0x30EC,(char)0xFF9A);
                Z2H.put((char)0x30ED,(char)0xFF9B);
                Z2H.put((char)0x30EF,(char)0xFF9C);
                Z2H.put((char)0x30F2,(char)0xFF66);
                Z2H.put((char)0x30F3,(char)0xFF9D);
                Z2H.put((char)0x30C3,(char)0xFF6F);
        };

        /**
         * 全角カタカナを半角カタカナに変換します。
         * @return 半角カタカナ文字列
         */
        public static String toHankanaCase(String str)
        {
                char[] chars = {0xFF9E, 0xFF9F};
                StringBuilder buffer = new StringBuilder();

                for(int i=0;i<str.length();i++)
                {
                        char c = str.charAt(i);

                        if(Z2H.containsKey(c)){
                                buffer.append(Z2H.get(c));
                        } else if(0x30AB <= c && c <= 0x30C9){
                                buffer.append(Z2H.get((char)(c - 1))).append(0xFF9E);
                        } else if(0x30CF <= c && c <= 0x30DD) {
                                buffer.append(Z2H.get((char)(c - c % 3))).append(chars[c % 3 - 1]);
                        } else {
                                buffer.append(c);
                        };
                };

                return buffer.toString();
        };

        /**
         * 半角カタカナを全角カタカナに変換します。
         * @return {String}
         */
        public static String toZenkanaCase(String str)
        {
                StringBuilder buffer = new StringBuilder(str);

                for(int i=0;i<str.length();i++)
                {
                        char c = str.charAt(i);
                        if(H2Z.containsKey(c)){
                                buffer.setCharAt(i, H2Z.get(c));
                        };
                };

                return buffer.toString();
        };

        /**
         * 全角ひらがなを全角カタカナに変換します。
         * @return 全角カタカナ
         */
        public static String toKatakanaCase(String str)
        {
                StringBuilder buffer = new StringBuilder(str);

                for(int i=0;i<str.length();i++)
                {
                        char c = str.charAt(i);
                        if(0x3041 <= c && c <= 0x3096){
                                buffer.setCharAt(i, (char)(c + 0x0060));
                        };
                };

                return buffer.toString();
        };

        /**
         * 全角カタカナを全角ひらがなに変換します。
         * @return 全角ひらがなの文字列
         */
        public static String toHiraganaCase(String str)
        {
                StringBuilder buffer = new StringBuilder(str);

                for(int i=0;i<str.length();i++)
                {
                        char c = str.charAt(i);
                        if(0x30A1 <= c && c <= 0x30F6){
                                buffer.setCharAt(i, (char)(c - 0x0060));
                        };
                };


                return buffer.toString();
        };

        /**
         * 全角英数字を半角英数字に変換します。
         * @return 半角英数字文字列
         */
        public static String toHankakuCase(String str)
        {
                StringBuilder buffer = new StringBuilder(str);
               
                for(int i=0;i<str.length();i++)
                {
                        char c = str.charAt(i);

                        // 【!】〜【〜】の範囲
                        if(0xFF01 <= c && c <= 0xFF5E)
                        {
                                buffer.setCharAt(i, (char)(c - 0xFEE0));
                                continue;
                        };
                        // 全角スペース
                        if(c == 0x3000)
                        {
                                buffer.setCharAt(i, (char)0x0020);
                                continue;
                        };
                };

                return buffer.toString();
        };

        /**
         * 半角英数字を全角英数字に変換します。
         * @return 全角英数字
         */
        public static String toZenkakuCase(String str)
        {
                StringBuilder buffer = new StringBuilder(str);

                for(int i=0;i<str.length();i++)
                {
                        char c = str.charAt(i);

                        // 【!】〜【〜】の範囲
                        if(c <= 0x007E && 0x0021 <= c)
                        {
                                buffer.setCharAt(i, (char)(c + 0xFEE0));
                                continue;
                        };

                        // 半角スペース
                        if(c == 0x0020)
                        {
                                buffer.setCharAt(i, (char)0x3000);
                                continue;
                        };
                };

                return buffer.toString();
        };
};