curlコマンドで日本語を扱う

2010/11/11

LINUXサーバ上でcurlコマンドを使用する際の話。

下記のような日本語(マルチバイト文字)を含んだリエクストを送りたい場合、
  • curl http://www.hoge.jp/test/?query=テスト

--data(クエリをPOSTで送信する)オプションを使うことで解決できる。
  • curl --data query=テスト http://www.hoge.jp/test/

プロジェクトの引継ぎ方法まとめ

2010/09/16

問題

一般的なプロジェクトには画面仕様書、詳細設計書、ソースコードなど、たくさん資料の資料があるが、
引き継がれる側は何が大事な情報なのか、どの資料を見ればいいのかが、資料が多すぎるために分からず、
曖昧な状態のまま引き継いでしまい後で困るケースが多いような気がする。

解決

開発用資料の他に、引継ぎ用資料を仕様を一番理解している人物が作成し、
誰に引き継いでも大丈夫なように引き継ぎのフローを整理する。

引継ぎフロー

  1. 仕様を一番理解している人に引き継ぐにあたって必要なことを一覧資料にしてもらう
     ⇒なるべく詳細にすると引継ぎ漏れが少なくなる。
  2. 資料をもらってから引継ぎ開始(あらかじめ期間を設定)
     ⇒作成してもらった資料を用いてサイト把握している期間にMTGを開き、サイトを見ながら実際の画面と照らし合わせて、 各機能の動作や関連ベンダとの連携等を説明してもらう。
  3. 引継ぎ完了、対応開始
     ⇒一覧資料にあるもの、そこから考えられるであろうものは対応、それ以外のものは別途相談させてもらいます。

メリット

[引き継ぐ側] 
  •  ・しっかり引き継ぐことで、後でつまらないことを何度も相談されるのを防ぐ。 
  •  ・2人目以降の引継ぎをする人は、引継ぎ作業がかなり楽になる。 

[引き継がれる側]
  •  ・どの情報が大事なのかが一目で分かるので、仕様調査・把握しやすい。
  •  ・何を引き継がれたことをハッキリさせることで、 それ以外の例外な仕事がふってきても相談しやすい。自分の身を守る!

デメリット

[引き継ぐ側] 
  •  ・はじめの引き継ぎ用資料を作るのが大変。

[引き継がれる側]
  •  ・優秀な上司でなければ、嫌な顔をされそう(笑) 
  •  ・資料の更新が若干めんどくさい 

Subversion導入

2010/09/06

Subversionインストール

    yum -y install subversion mod_dav_svn

SVN用リポジトリ作成

    mkdir -p /usr/local/svn/repos/xxxxx
    svnadmin create /usr/local/svn/repos/xxxxx
    svn mkdir file://localhost/usr/local/svn/repos/xxxxx/trunk -m "create"
    svn mkdir file://localhost/usr/local/svn/repos/xxxxx/branches -m "create"
    svn mkdir file://localhost/usr/local/svn/repos/xxxxx/tags -m "create"
    chown -R apache:apache /usr/local/svn/repos

Apache用SVNの設定ファイル編集

    vi /etc/httpd/conf.d/subversion.conf
    <Location /repos>
       DAV svn
       SVNParentPath /usr/local/svn/repos
       SVNAutoversioning on
       Order deny,allow
       Deny from all
       Allow from 127.0.0.1
       Allow from xxxxx

       # Require SSL connection for password protection.
       # SSLRequireSSL

       AuthType Basic      
       AuthName "Authorization Realm"      
       AuthUserFile /usr/local/svn/repos/.htpasswd      
       Require valid-user      
       AuthzSVNAccessFile /usr/local/svn/repos/.svnaccess

    </Location>

Apache用SVNにユーザ認証追加

     htpasswd -c /usr/local/svn/repos/.htpasswd 【ユーザ名】

Apache用SVNにユーザ権限設定

     vi /usr/local/svn/repos/.svnaccess
[xxxxx:/]
【ユーザ名】 = rw

Apache設定再読込

    /etc/rc.d/init.d/httpd reload
ブラウザでhttp://サーバのIP/repos/xxxxx/にアクセス





サーバ構築~導入編~

2010/09/02


システムの更新

yum -y update

apacheインストール

yum -y install httpd
sudo /etc/init.d/httpd start
cd /etc/httpd/conf
vi httpd.conf 

apache動作確認

cd /var/www/html/
vi index.html
ブラウザで"http://localhost/"にアクセス

javaインストール

cd /usr/
wget http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdk-6u21-linux-i586-rpm.bin?BundledLineItemUUID=DQWJ_hCw41sAAAEqm4JXq9H9&OrderID=SIiJ_hCwlToAAAEqf4JXq9H9&ProductID=LxaJ_hCy4mIAAAEpXLwzBGsB&FileName=/jdk-6u21-linux-i586-rpm.bin
mv jdk-6u21-linux-i586-rpm.bin\?AuthParam\=1283423415_c1918db3414d4a954796606ab22aa14b\&TicketId\=nod3BFkSR3V6leEhnU+ZUZeRcQ\=\=\&GroupName\=CDS\&FilePath\=%2FESD6%2FJSCDL%2Fjdk%2F6u21-b06%2Fjdk-6u21-linux-i586-rpm.bin\&File\=jdk-6u21-linux-i586-rpm.bin jdk6-rpm.bin
mkdir java
mv jdk6-rpm.bin java/
cd java/
chmod a+x jdk6-rpm.bin
./jdk6-rpm.bin

java -version

tomcatインストール

wget http://ftp.riken.jp/net/apache/tomcat/tomcat-6/v6.0.29/bin/apache-tomcat-6.0.29.tar.gz
tar zxvf apache-tomcat-6.0.29.tar.gz
rm -rf apache-tomcat-6.0.29.tar.gz
mv apache-tomcat-6.0.29/ /usr/local/tomcat

tomcat設定

vi /etc/profile.d/tomcat.sh

    export JAVA_HOME=/usr/java/default
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
    export TOMCAT_HOME=/usr/local/tomcat
    export CATALINA_HOME=/usr/local/tomcat
    export CLASSPATH=$CLASSPATH:$CATALINA_HOME/common/lib

vi /etc/rc.d/init.d/tomcat
    #!/bin/bash
    # Startup script for the tomcat
    # chkconfig: 345 80 15
    # description: Tomcat is a Servlet+JSP Engine.
    # Source function library.
    . /etc/rc.d/init.d/functions
    source /etc/profile.d/tomcat.sh
    start(){
        if [ -z $(/sbin/pidof java) ]; then
            echo "Starting tomcat"
            /usr/local/tomcat/bin/startup.sh
            touch /var/lock/subsys/tomcat
        else
            echo "tomcat allready running"
        fi
    }
    stop(){
        if [ ! -z $(/sbin/pidof java) ]; then
            echo "Shutting down tomcat"
            /usr/local/tomcat/bin/shutdown.sh
            until [ -z $(/sbin/pidof java) ]; do :; done
            rm -f /var/lock/subsys/tomcat
        else
            echo "tomcat not running"
        fi
    }
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart)
            stop
            start
            ;;
        status)
            /usr/local/tomcat/bin/catalina.sh version
            ;;
        *)
            echo "Usage: $0 {start|stop|restart|status}"
    esac
    exit 0

chmod +x /etc/rc.d/init.d/tomcat 
/etc/rc.d/init.d/tomcat start

apache・tomcat連携

vi /etc/httpd/conf.d/proxy_ajp.conf 
    ProxyPass /tomcat/ ajp://localhost:8009/
    ProxyPass /examples/ ajp://localhost:8009/examples/jsp/
/etc/rc.d/init.d/httpd reload

mysqlインストール

yum -y install mysql-server
vi /etc/my.cnf
default-character-set = utf8

[mysql]
default-character-set = utf8
/etc/rc.d/init.d/mysqld start
mysql -uroot -p

solrで日本語検索

2010/07/27


前回の記事で日本語の形態素解析ができるようになったけど、
今のままでは肝心の日本語検索ができない!!ファック!!
ということで、日本語でも検索できるように設定してやる必要があります。

server.xmlの編集

server.xmlを以下のように修正する。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
↓↓↓
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
    redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="UTF-8"/>

文字コードフィルタの設定

リクエストの文字コードはUTF-8にしてやる必要があるようです。
web.xmlのフィルタで設定してやればリクエストを一括でエンコードしてくれるのでそれでやっちゃいましょう。
※以下の例はSeasarを利用してる場合です。
    <filter>
        <filter-name>encodingfilter</filter-name>
        <filter-class>org.seasar.extension.filter.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
・・・
    <filter-mapping>
        <filter-name>encodingfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 
注意として、 上記のフィルタはSolrRequestFilterより上に書くこと。 SeasarとかStrutsを使ってない人は、自分でフィルタのクラスを作って設定してあげてください。

solrに形態素解析senの導入


Solrには日本語の形態素解析器が含まれてないので、
仕方がないからその導入手順を書いちゃうハメになってます。
そもそも形態素解析が何?って人は調べてください。

Senのダウンロード

https://sen.dev.java.net/servlets/ProjectDocumentList?folderID=755&expandFolder=755&folderID=0
からsen-1.2.2.1をダウンロードして任意の場所(以後$SENとする)に解凍する。

Antのインストール

Senを解凍してもそのままじゃ使えない?くて辞書をビルドする必要があるようです。
ビルドするにはAntがいるので、下記からダウンロードして任意の場所(以後$ANTとする)に解凍する。
http://ant.apache.org/

次にAntを実行するために$ANT/binにパスを通す。
ここら辺はJAVAとかで色々やったと思うので省略。

ちゃんとパスが通ったかどうかはコマンドプロンプトから、
ant -versionと打てば確認できる。

Senの辞書をビルド

以上の設定が終わったら辞書ディレクトリに移動してビルドを行う。

cd $SEN/dic
ant

"BUILD SUCCESSFUL"と表示されたら正常にビルドができたことになる。
けど、"BUILD FAILED"になった場合はperlのパスを確認する。

$PERL/binがパスに設定されていない場合は、パスを通すか、
antの実行時にオプションとして、

ant -Dperl.bin=$PERL\bin/perl

としてやればいい。

Jarの追加

ビルドした$SENディレクトリをプロジェクト直下に移動。
また、$SEN内にあるlucene-ja.jarとsen.jarをプロジェクトのWEB-INF/libないに移動し、 Eclipseのビルドパスの構成からクラスパスに追加してやる。
※エクスプローラ上でjarを移動した際はF5でプロジェクトの更新が必要。

schema.xmlの定義

これまでで形態素解析が利用できる環境が整ったので、
schema.xmlに以下のように定義してやる。


<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.2">
<types>
    <fieldType name="text_sen" class="solr.TextField">
        <analyzer class="org.apache.lucene.analysis.ja.JapaneseAnalyzer" />
    </fieldType>
</types>
<fields>
    ・・・
</fields>
</schema>

tomcatの起動オプション設定

あとはtomcatの起動オプションに$SENホームを追加する。
WTPを利用しているなら、サーバビューからサーバの設定ファイルを開く。
「起動構成を開く」の先の引数タブ内のVM引数欄に以下の記述を書く。


-Dsen.home=$SEN

あとはtomcatを起動するだけ!
疲れた!

Senの動作確認

最後に!! ここまでくれば後は動作確認するだけ。
tomcatを起動し、http://localhost:8080/プロジェクト名/admin/analysis.jspにアクセスし、
↓画像のようになればOK!!




スレッドセーフ?

2010/07/23

スレッドセーフとは


http://e-words.jp/w/E382B9E383ACE38383E38389E382BBE383BCE38395.html

スレッドセーフができていないというのは


同じインスタンスにある同じ変数を
複数のスレッドが参照・更新できる場合や、
共有ファイルを複数人で参照・更新できる場合
のこと。

例えば


下記コードがあった場合、

private int num;

public int getNum(){
  return num;
}

public void setNum(int なむ){
  num = なむ;
}

public void update(){
  System.out.println(num); //-----(1)
  int i;
  for(i=0; i < num; i++); //-----(2)
  System.out.println(i);
}



  • 正常
  1. スレッドA が Hoge.setNum(10000);実行
  2. スレッドA が Hoge.update();実行
     コンソールに表示される結果は下記となる。
      10000
      10000

  • 異常
  1. スレッドA が Hoge.setNum(10000);実行
  2. スレッドA が Hoge.update();実行
  3. 「2.」実行中にスレッドBがHoge.setNum(500);実行
     コンソールに表示される結果はだれにも予想できないが、
     おそらく下記のような結果となる。

     (1)の直前で「3.」が実行された場合の結果は
      500
      500

     (2)の直前で「3.」が実行された場合の結果は
      10000
      500

     (2)を実行中に「3.」が実行された場合の結果は
      10000
      "500~10000のいずれか"

対処方法


各メソッドにsynchonized装飾子をつけてあげればとりあえずは防げる。


詳しくは下記


http://d.hatena.ne.jp/amachang/20100324/1269425706
http://www.ibm.com/developerworks/jp/java/library/j-threadsafe/