<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>ハタさんのブログ</title>
<link>http://blog.xole.net/index.php</link>
<pubDate>Fri, 30 Jan 2009 01:28:53 </pubDate>
<description>
ハタさんのブログ - RSS 2.0 (Really Simple Syndication).
</description>
<item>
<title>僕の本がでました(少しフライング)</title>
<link>http://blog.xole.net/article.php?id=725</link>
<pubDate>Fri, 30 Jan 2009 01:28:53 +09:00</pubDate>
<description>僕の書いた本が発売になりました！例によって（？）PHPの入門書です。
これは、北海道にいたころにお世話になったPostgreSQL関係の方の紹介で、一冊の本を書くことができました。多謝









PHP1 はじめてのPHPプロ...</description>
<content:encoded>
<![CDATA[<p>僕の書いた本が発売になりました！例によって（？）PHPの入門書です。<br />
これは、北海道にいたころにお世話になったPostgreSQL関係の方の紹介で、一冊の本を書くことができました。多謝</p>

<div class="amazon-item-box" style="display: block; padding: 0; border: 1px solid  #999; margin: 8px;  -moz-border-radius: 10px;">
<div class="amazon-item-image" style="display: block; padding: 10px; float: left;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798118028/lilydaselfish-22/ref=nosim" target="_blank">
<img src="http://ecx.images-amazon.com/images/I/51Sfrs5fJ-L.jpg" alt="PHP1 はじめてのPHPプログラミング (CD-ROM付)" title="PHP1 はじめてのPHPプログラミング (CD-ROM付)" style="border: none; display: inline; vertical-align: bottom;" />
</a>
</div>
<dl class="amazon-item-info" style="display: block; margin-left: 10px; padding: 0 8px 0 10px; font-size: 10pt; line-height: 110%;">
<dt class="amazon-item-name" style="display: block; margin-bottom: 5px; line-height: 120%;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798118028/lilydaselfish-22/ref=nosim" target="_blank" title="PHP1 はじめてのPHPプログラミング (CD-ROM付)">PHP1 はじめてのPHPプログラミング (CD-ROM付)</a>
</dt>
<dd>
<ul class="amazon-item-info-list" style="list-style-type: none; padding-left: 0px; line-height: 120%;">
<li>発売元: 翔泳社</li>
<li>価格: ￥ 1,974</li>
<li>発売日: 2009/01/30</li>
</ul>
</dd>
</dl>
<p class="amazon-item-footer" style="clear: left; text-align: right; font-size: x-small; padding: 4px 10px 4px 10px; line-height: 100%; background-color: #f0f0f0;">posted with <a href="http://socialtunes.net">Socialtunes</a> at 2009/01/30<br />
</p>
</div>

<p>この本は僕の知っている知識で、精一杯、初心者（プログラミングを学ぼうとする人）に向けて分かりやすく書いたつもりですので、ぜひ手にとって読んでください。<br />
また、この続きも近刊となっていますので、もうしばらくお待ちください。</p>

<p>ちなみに、読みづらいかもしれませんが。僕の名字のハタは、漢字の漢で「ハタ」と読みます。豆知識ですね。</p>

<p>この他にもプログラミング学習シリーズで、rubyとjavascriptが同時発売ですので、こちらも合わせて読みたい</p>

<div class="amazon-item-box" style="display: block; padding: 0; border: 1px solid  #999; margin: 8px;  -moz-border-radius: 10px;">
<div class="amazon-item-image" style="display: block; padding: 10px; float: left;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798117994/lilydaselfish-22/ref=nosim" target="_blank">
<img src="http://ecx.images-amazon.com/images/I/51jDhDgqNpL._SL160_.jpg" alt="Ruby1 はじめてのプログラミング (CD-ROM付)" title="Ruby1 はじめてのプログラミング (CD-ROM付)" style="border: none; display: inline; vertical-align: bottom;" />
</a>
</div>
<dl class="amazon-item-info" style="display: block; margin-left: 10px; padding: 0 8px 0 10px; font-size: 10pt; line-height: 110%;">
<dt class="amazon-item-name" style="display: block; margin-bottom: 5px; line-height: 120%;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798117994/lilydaselfish-22/ref=nosim" target="_blank" title="Ruby1 はじめてのプログラミング (CD-ROM付)">Ruby1 はじめてのプログラミング (CD-ROM付)</a>
</dt>
<dd>
<ul class="amazon-item-info-list" style="list-style-type: none; padding-left: 0px; line-height: 120%;">
<li>発売元: 翔泳社</li>
<li>価格: ￥ 1,974</li>
<li>発売日: 2009/01/30</li>
</ul>
</dd>
</dl>
<p class="amazon-item-footer" style="clear: left; text-align: right; font-size: x-small; padding: 4px 10px 4px 10px; line-height: 100%; background-color: #f0f0f0;">posted with <a href="http://socialtunes.net">Socialtunes</a> at 2009/01/30<br />
</p>
</div>
<div class="amazon-item-box" style="display: block; padding: 0; border: 1px solid  #999; margin: 8px;  -moz-border-radius: 10px;">
<div class="amazon-item-image" style="display: block; padding: 10px; float: left;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798118044/lilydaselfish-22/ref=nosim" target="_blank">
<img src="http://ecx.images-amazon.com/images/I/51Oe6dd2pmL._SL160_.jpg" alt="JavaScript1 はじめてのプログラミングとJavaScriptの基礎 (CD-ROM付)" title="JavaScript1 はじめてのプログラミングとJavaScriptの基礎 (CD-ROM付)" style="border: none; display: inline; vertical-align: bottom;" />
</a>
</div>
<dl class="amazon-item-info" style="display: block; margin-left: 10px; padding: 0 8px 0 10px; font-size: 10pt; line-height: 110%;">
<dt class="amazon-item-name" style="display: block; margin-bottom: 5px; line-height: 120%;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798118044/lilydaselfish-22/ref=nosim" target="_blank" title="JavaScript1 はじめてのプログラミングとJavaScriptの基礎 (CD-ROM付)">JavaScript1 はじめてのプログラミングとJavaScriptの基礎 (CD-ROM付)</a>
</dt>
<dd>
<ul class="amazon-item-info-list" style="list-style-type: none; padding-left: 0px; line-height: 120%;">
<li>発売元: 翔泳社</li>
<li>価格: ￥ 1,974</li>
<li>発売日: 2009/01/30</li>
</ul>
</dd>
</dl>
<p class="amazon-item-footer" style="clear: left; text-align: right; font-size: x-small; padding: 4px 10px 4px 10px; line-height: 100%; background-color: #f0f0f0;">posted with <a href="http://socialtunes.net">Socialtunes</a> at 2009/01/30<br />
</p>
</div>]]>
</content:encoded>
</item><item>
<title>Mecabをscalaで</title>
<link>http://blog.xole.net/article.php?id=724</link>
<pubDate>Sun, 04 Jan 2009 01:48:52 +09:00</pubDate>
<description>ということで、cmecabはインストール出来なかったので、mecab-javaバインディングを使う。
下記のページに書かれている通りにやるとうまく良くと思う
via - [mecab][java] MeCabをLeopard (Mac)...</description>
<content:encoded>
<![CDATA[<p>ということで、cmecabはインストール出来なかったので、mecab-javaバインディングを使う。<br />
下記のページに書かれている通りにやるとうまく良くと思う</p>
via - <a href="http://d.hatena.ne.jp/shohu33/20081029/1225272235">[mecab][java] MeCabをLeopard (Mac) にインストールしJavaバインディングつかってみる - With skill and creativeness</a>
</p>

<p>んで、Mecabをjavaから呼ぶのはできたので、せっかくなのでscalaから呼べるようにする</p>
<p>こんなコードを用意</p>
<pre class="java">
<span class="keyword" >import</span> org.chasen.mecab.{MeCab, Tagger, Node}

object Test {
    def main(args: Array[String]){
        System.loadLibrary(<span class="string" >"MeCab"</span>);

        var tagger = <span class="keyword" >new</span> Tagger;
        println (tagger.parse (<span class="string" >"すもももももももものうち"</span>));

        var node:Node = tagger.parseToNode(<span class="string" >"隣の客はよく柿食う客だ"</span>);
        <span class="keyword" >while</span>(node != <span class="keyword" >null</span>){
            println(node.getSurface() + <span class="string" >"\t"</span> + node.getFeature());
            node = node.getNext();
        }
    }
}
</pre>

<p>んで、scalac -cp で Mecab.jar と -Dava.library.path に libMeCab.dylib を通してあげればコンパイルできる。<br />
でも、毎回コンパイルするたびにこのオプションを指定するのは面倒なので、antに設定しておく</p>

<pre class="java">&lt;?xml version=<span class="string" >"1.0"</span> encoding=<span class="string" >"utf-8"</span> ?&gt;
&lt;project name=<span class="string" >"mecab.scala"</span> <span class="keyword" >default</span>=<span class="string" >"run.demo"</span> basedir=<span class="string" >"."</span>&gt;
    
    &lt;property name=<span class="string" >"lib"</span> location=<span class="string" >"lib"</span>/&gt;
    &lt;property name=<span class="string" >"jni"</span> location=<span class="string" >"jni"</span>/&gt;

    &lt;property environment=<span class="string" >"env"</span> /&gt;
    &lt;property name=<span class="string" >"scala.home"</span> value=<span class="string" >"${basedir}"</span> /&gt;

    &lt;path id=<span class="string" >"scala.classpath"</span>&gt;
        &lt;pathelement path=<span class="string" >"${basedir}"</span>/&gt;
        &lt;fileset dir=<span class="string" >"${lib}"</span>&gt;
            &lt;include name=<span class="string" >"*.jar"</span> /&gt;
        &lt;/fileset&gt;
        &lt;pathelement path=<span class="string" >"${java.class.path}"</span>/&gt;
    &lt;/path&gt;

    &lt;taskdef name=<span class="string" >"scalac"</span> classname=<span class="string" >"scala.tools.ant.Scalac"</span>&gt;
        &lt;classpath&gt;
            &lt;path refid=<span class="string" >"scala.classpath"</span> /&gt;
        &lt;/classpath&gt;
    &lt;/taskdef&gt;

    &lt;taskdef name=<span class="string" >"scaladoc"</span> classname=<span class="string" >"scala.tools.ant.Scaladoc"</span>&gt;
        &lt;classpath&gt;
            &lt;path refid=<span class="string" >"scala.classpath"</span> /&gt;
        &lt;/classpath&gt;
    &lt;/taskdef&gt;

    &lt;macrodef name=<span class="string" >"scala"</span>&gt;
        &lt;attribute name=<span class="string" >"args"</span>/&gt;
        &lt;sequential&gt;
            &lt;java classname=<span class="string" >"scala.tools.nsc.MainGenericRunner"</span> fork=<span class="string" >"true"</span> dir=<span class="string" >"."</span>&gt;
                &lt;classpath&gt;
                    &lt;path refid=<span class="string" >"scala.classpath"</span> /&gt;
                &lt;/classpath&gt;
                &lt;jvmarg value=<span class="string" >"-Xbootclasspath/a:${scala.home}/scala-library.jar}"</span> /&gt;
                &lt;jvmarg value=<span class="string" >"-Xmx512M"</span> /&gt;
                &lt;jvmarg value=<span class="string" >"-Xms64M"</span> /&gt;
                &lt;jvmarg value=<span class="string" >"-Dscala.home=${scala.home}"</span> /&gt;
                &lt;jvmarg value=<span class="string" >"-Djava.library.path=${jni}/osx_x64"</span> /&gt;
                &lt;arg line=<span class="string" >"-Djava.library.path=${jni}/osx_x64/libMeCab.dylib @{args}"</span> /&gt;
            &lt;/java&gt;
        &lt;/sequential&gt;
    &lt;/macrodef&gt;

   &lt;target name=<span class="string" >"doc"</span>&gt;
        &lt;mkdir dir=<span class="string" >"${doc.dir}"</span>/&gt;
        &lt;scaladoc
            srcdir=<span class="string" >"${src.dir}"</span>
            destdir=<span class="string" >"${doc.dir}"</span>
            deprecation=<span class="string" >"yes"</span>
            unchecked=<span class="string" >"yes"</span>
            windowtitle=<span class="string" >"${doc.windowtitle}"</span>
            doctitle=<span class="string" >"${doc.title}"</span>
            classpathref=<span class="string" >"scala.classpath"</span>&gt;
            &lt;include name=<span class="string" >"**/*.scala"</span>/&gt;
        &lt;/scaladoc&gt;
    &lt;/target&gt;

    &lt;target name=<span class="string" >"run.demo"</span>&gt;
        &lt;scalac srcdir=<span class="string" >"${basedir}"</span> destdir=<span class="string" >"${basedir}"</span> classpathref=<span class="string" >"scala.classpath"</span> target=<span class="string" >"jvm-1.5"</span> force=<span class="string" >"changed"</span> /&gt;
        &lt;scala args=<span class="string" >"Test"</span> /&gt;
    &lt;/target&gt;
&lt;/project&gt;
</pre>

<p>このbuild.xmlは<a href="http://code.google.com/p/scala-squib/">scala-squib - Google Code</a>をパクってきた。<br />
ここはいろいろと参考になるので好き</p>

<p>また、ディレクトリ構成としてはこんな感じ</p>
<pre class="java">|- Hoge.scala
|- Test$.<span class="keyword" >class</span>
|- Test.<span class="keyword" >class</span>
|- Test.scala
|- build.xml
|- build.xml.mf
|- lib   
   |- libMeCab.dylib  
   |- MeCab.jar
   |- scala-compiler.jar
   |- scala-dbc.jar
   |- scala-decoder.jar
   |- scala-library.jar
</pre>


<p>ちなみに、コンパイルされた scala コードは java から呼び出せるので、</p>
<pre>
java -cp .:lib/scala-decoder.jar scala.tools.nsc.MainGenericRunner Hoge
</pre>

<p>とかにしておけば、javaから呼び出せれる(もしかしたらscala-library.jarもいるかも)けど、問題はclasspathに指定したファイルのパスもちゃんと含めてあげないといけない(今回は ./ 大抵の場合は ./src )（当たり前と言えば当たり前だけど、ハマった。。。）</p>

<p>さてさて、肝心の実行結果はというと、こんな感じ</p>

<pre class="java">Buildfile: build.xml

run.demo:
     [java] すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
     [java] も	助詞,係助詞,*,*,*,*,も,モ,モ
     [java] もも	名詞,一般,*,*,*,*,もも,モモ,モモ
     [java] も	助詞,係助詞,*,*,*,*,も,モ,モ
     [java] もも	名詞,一般,*,*,*,*,もも,モモ,モモ
     [java] の	助詞,連体化,*,*,*,*,の,ノ,ノ
     [java] うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
     [java] EOS
     [java] 
     [java] 	BOS/EOS,*,*,*,*,*,*,*,*
     [java] 隣	名詞,一般,*,*,*,*,隣,トナリ,トナリ
     [java] の	助詞,連体化,*,*,*,*,の,ノ,ノ
     [java] 客	名詞,一般,*,*,*,*,客,キャク,キャク
     [java] は	助詞,係助詞,*,*,*,*,は,ハ,ワ
     [java] よく	副詞,一般,*,*,*,*,よく,ヨク,ヨク
     [java] 柿	名詞,一般,*,*,*,*,柿,カキ,カキ
     [java] 食う	動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
     [java] 客	名詞,一般,*,*,*,*,客,キャク,キャク
     [java] だ	助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
     [java] 	BOS/EOS,*,*,*,*,*,*,*,*

BUILD SUCCESSFUL
Total time: <span class="number" >0</span> seconds</pre>

<p>後は、scala のコードがもう少し綺麗にできれば、良さそう</p>]]>
</content:encoded>
</item><item>
<title>cmecab-java を OSX で...</title>
<link>http://blog.xole.net/article.php?id=723</link>
<pubDate>Sun, 04 Jan 2009 00:49:29 +09:00</pubDate>
<description>
cmecab-java - Google CodeをOSXで使ってみるテスト

cmecab-java-1.0.tar.gzを展開して、jniディレクトリに含まれるMakeFile.unixを次のようにする
nowel@macboo...</description>
<content:encoded>
<![CDATA[<p>
<a href="http://code.google.com/p/cmecab-java/">cmecab-java - Google Code</a>をOSXで使ってみるテスト</p>

<p>cmecab-java-1.0.tar.gzを展開して、jniディレクトリに含まれるMakeFile.unixを次のようにする</p>
<pre class="javascript">nowel@macbook: ~/tmp/cmecab-java&gt; cat jni/Makefile.osx 
CMECAB_INCLUDE=-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/
CMECAB_SRC=mecab.cpp
CMECAB_TARGET=libCMeCab.jnilib

CXX=g++
CXXFLAGS=-Wall -g -O2 -fPIC $(CMECAB_INCLUDE)
LDFLAGS=-dynamiclib -lmecab

all:
	$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(CMECAB_TARGET) $(CMECAB_SRC)

install:
	cp $(CMECAB_TARGET) /usr/local/lib

javah:
	javah -classpath ../bin/classes \
	  net.moraleboost.mecab.Tagger \
	  net.moraleboost.mecab.Node

clean:
	rm -f $(CMECAB_TARGET)

</pre>

<p>もし、以下のようにでてしまっている場合は、コンパイルオプションが<code>-shared</code>となっている場合があるので、<code>-dynamiclib</code>とする</p>

<pre class="javascript">g++ -Wall -g -O2 -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/ -shared -lmecab -o libCMeCab.jnilib mecab.cpp
Undefined symbols:
  <span class="string" >"_main"</span>, referenced from:
      start <span class="keyword" >in</span> crt1.10.5.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [all] Error 1
</pre>

<p>んで、make -f Makefile.osx</p>
<pre class="javascript">nowel@macbook: ~/tmp/cmecab-java/jni&gt; make -f Makefile.osx 
g++ -Wall -g -O2 -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/ -dynamiclib -lmecab -o libCMeCab.jnilib mecab.cpp</pre>

<p>ビルドするが、うまくコンパイルできない...</p>
<pre class="javascript">nowel@macbook: ~/tmp/cmecab-java&gt; java -version
java version <span class="string" >"1.5.0_16"</span>
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)
Java HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)
nowel@macbook: ~/tmp/cmecab-java&gt; ant
Buildfile: build.xml

init:
    [mkdir] Created dir: /Users/nowel/tmp/cmecab-java/bin/classes

compile:
    [javac] Compiling 15 source files to /Users/nowel/tmp/cmecab-java/bin/classes
    [javac] /Users/nowel/tmp/cmecab-java/src/net/moraleboost/mecab/MeCabException.java:35: シンボルを見つけられません。
    [javac] シンボル: コンストラクタ IOException(java.lang.Throwable)
    [javac] 場所    : java.io.IOException の クラス
    [javac]         <span class="keyword" >super</span>(e);
    [javac]         ^
    [javac] /Users/nowel/tmp/cmecab-java/src/net/moraleboost/mecab/MeCabException.java:40: シンボルを見つけられません。
    [javac] シンボル: コンストラクタ IOException(java.lang.String,java.lang.Throwable)
    [javac] 場所    : java.io.IOException の クラス
    [javac]         <span class="keyword" >super</span>(msg, e);
    [javac]         ^
    [javac] /Users/nowel/tmp/cmecab-java/src/net/moraleboost/solr/FeatureRegexFilterFactory.java:64: シンボルを見つけられません。
    [javac] シンボル: メソッド isEmpty()
    [javac] 場所    : java.lang.String の クラス
    [javac]                 <span class="keyword" >if</span> (!regex.isEmpty()) {
    [javac]                           ^
    [javac] 注:/Users/nowel/tmp/cmecab-java/src/net/moraleboost/solr/FeatureRegexFilterFactoryTest.java は推奨されない API を使用またはオーバーライドしています。
    [javac] 注:詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてください。
    [javac] エラー 3 個

BUILD FAILED
/Users/nowel/tmp/cmecab-java/build.xml:43: Compile failed; see the compiler error output <span class="keyword" >for</span> details.

Total time: 4 seconds
</pre>

<p>見てみると、IOException関係のは、J2SE1.6系統からっぽい。<br />
ref - <a href="http://java.sun.com/javase/6/docs/api/java/io/IOException.html">http://java.sun.com/javase/6/docs/api/java/io/IOException.html</a>
</p>

<p>OSXのjavaを1.6にする。<br />
Java Preferences.app が /Applications/Utilities/Java/Java Preferences.app にあるので、実行</p>
<a href="http://blog.xole.net/resources/java_preferences.png">
<img src="http://blog.xole.net/resources/java_preferences.png" width="400" height="300" />
</a>
<br />
概要から、JavaSE6を一番上にする<br />
<a href="http://blog.xole.net/resources/java_preferences_1.png">
<img src="http://blog.xole.net/resources/java_preferences_1.png"  width="400" height="300" />
</a>
</p>

<p>が、まだ、ビルドはできないので、JAVA_HOMEを1.6にする</p>

<pre>export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/</pre>
<p>これで、ビルドはできるようになった</p>
<pre class="javascript">nowel@macbook: ~/tmp/cmecab-java&gt; ant
Buildfile: build.xml

init:

compile:
    [javac] Compiling 8 source files to /Users/nowel/tmp/cmecab-java/bin/classes
    [javac] ??:/Users/nowel/tmp/cmecab-java/src/net/moraleboost/solr/FeatureRegexFilterFactoryTest.java ??????????? API ???g?p?????I?[?o?[???C?h???Ă?????B
    [javac] ??:????????A-Xlint:deprecation ?I?v?V???????w???čăR???p?C?????Ă????????B

dist:
      [jar] Building jar: /Users/nowel/tmp/cmecab-java/bin/cmecab-1.0.jar

BUILD SUCCESSFUL
Total time: 1 second
</pre>

<p>文字化けしてる...</p>

<p>とりあえず、jniをパスにコピーしておく</p>
<pre class="javascript">nowel@macbook: ~/tmp/cmecab-java&gt; sudo cp jni/libCMeCab.jnilib /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Libraries/</pre>

<p>実行してみると</p>
<pre class="javascript">nowel@macbook: ~/tmp/cmecab-java&gt; java -cp bin/cmecab-1.0.jar net.moraleboost.mecab.Tagger UTF-8 すもももももももものうち
Exception <span class="keyword" >in</span> thread <span class="string" >"main"</span> java.lang.UnsatisfiedLinkError: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Libraries/libCMeCab.jnilib: 
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1822)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1723)
	at java.lang.Runtime.loadLibrary0(Runtime.java:823)
	at java.lang.System.loadLibrary(System.java:1030)
	at net.moraleboost.mecab.Tagger.&lt;clinit&gt;(Unknown Source)
</pre>

<p>うーん。もう一度jniをコンパイルしてみても。だめ</p>
<p>結局Makefileはこんな感じに。</p>

<pre class="javascript">CMECAB_INCLUDE=-I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers \
			   -I/opt/local/include
CMECAB_SRC=mecab.cpp
CMECAB_TARGET=libCMeCab.jnilib
CMECAB_LIBS=-L/opt/local/lib -lmecab -lstdc++

CXX=g++
CXXFLAGS=-Wall -c -O3 -fPIC -dynamic $(CMECAB_INCLUDE)
LDFLAGS=-lmecab -framework JavaVM

all:
	$(CXX) $(CXXFLAGS) $(CMECAB_SRC)
	$(CXX) -dynamiclib mecab.o -o $(CMECAB_TARGET) $(CMECAB_LIBS)

install:
	cp $(CMECAB_TARGET) /usr/local/lib

javah:
	javah -classpath ../bin/classes \
	  net.moraleboost.mecab.Tagger \
	  net.moraleboost.mecab.Node

clean:
	rm -f $(CMECAB_TARGET)

</pre>

<p>このMakefileだと、dSYMみたいなファイルができずに、jnilib作れるけど、結局読み込まれないみたいなのでダメっぽい。もう少し調べてみる。</p>]]>
</content:encoded>
</item><item>
<title>PHP で float と int に触れる</title>
<link>http://blog.xole.net/article.php?id=722</link>
<pubDate>Sun, 14 Dec 2008 03:31:07 +09:00</pubDate>
<description>PHPでは数値をどうやって持っているのか。気になったので試してみる

「-1」はどうやっているのか。ということで、decbinで2進数表記にしてみた

$a = decbin(-1);
var_dump($a);
==&amp;gt; s...</description>
<content:encoded>
<![CDATA[<p>PHPでは数値をどうやって持っているのか。気になったので試してみる</p>

<p>「-1」はどうやっているのか。ということで、decbinで2進数表記にしてみた</p>
<pre class="php">
<span class="vars" >$a</span> = <span class="func" >decbin</span>(-1);
var_dump(<span class="vars" >$a</span>);
==&gt; string(32) <span class="string" >"11111111111111111111111111111111"</span>
</pre>

<p>32ビットで扱っているみたいだ。<br />
逆にこの値を数値に戻してみる。</p>

<pre class="php">
<span class="vars" >$b</span> = <span class="func" >bindec</span>(<span class="string" >'11111111111111111111111111111111'</span>);                          
var_dump(<span class="vars" >$b</span>);
==&gt; float(4294967295)
</pre>

<p>なるほど、int の最大値（？） を越えて float になった上で、それを整数値で持つのね。<br />
ということは、これを int にすると、「-1」の値になる。と</p>
<pre class="php">
<span class="vars" >$c</span> = (float) 4294967295;
var_dump((int) <span class="vars" >$c</span>);
==&gt; int(-1)
</pre>

<p>ふむふむ。じゃあ、intな「-1」をfloatにすると「4294967295」になる...</p>
<pre class="php">
<span class="vars" >$d</span> = -1;    
<span class="vars" >$e</span> = (float) <span class="vars" >$d</span>;
var_dump(<span class="vars" >$e</span>);
==&gt; float(-1)
</pre>

<p>だよね。PHPだとこうなるよね。つまり、「-1」なfloatの「4294967295」はintで作ったものからは作り出せそうに無い。と。<br />
このあたりはソースを追ってみる必要がありそう。</p>

<p>んじゃ、調子に乗って浮動小数は...</p>
<pre class="php">var_dump(<span class="func" >decbin</span>(0.1));
==&gt; string(1) <span class="string" >"0"</span>
</pre>

<p>ここはまたの機会に調べる。浮動小数と負の浮動小数とか。</p>

<p>ちなみに、すごく手抜きだけど、ビットでの試行錯誤はbindecを使って試した。こんな感じ</p>
<pre class="php">
<span class="vars" >$a</span> = <span class="func" >bindec</span>(join(<span class="func" >explode</span>(<span class="string" >' '</span>, <span class="string" >'1111 1111 1111 1111 1111 1111 1111 1110'</span>)));
var_dump(<span class="vars" >$a</span>);
var_dump((int) <span class="vars" >$a</span>);</pre>

<p>ビット周辺は面白い。</p>]]>
</content:encoded>
</item><item>
<title>PHP でバイナリから文字列を作る</title>
<link>http://blog.xole.net/article.php?id=721</link>
<pubDate>Sun, 14 Dec 2008 02:53:11 +09:00</pubDate>
<description>よく「PHPはバイナリで文字列を持っている」とか言われているので、やってみた。
参考にしたのは、文字コードについて より、 Unicode対応 文字コード表


試しに、上記の表から「あ」の文字列をUTF-8なバイナリから作成してみる...</description>
<content:encoded>
<![CDATA[<p>よく「PHPはバイナリで文字列を持っている」とか言われているので、やってみた。<br />
参考にしたのは、<a href="http://ash.jp/code/index.htm">文字コードについて</a> より、 <a href="http://ash.jp/code/unitbl21.htm">Unicode対応 文字コード表</a>
</p>

<p>試しに、上記の表から「あ」の文字列をUTF-8なバイナリから作成してみる</p>
<pre class="php">
<span class="comment" >// utf8 E38182</span>
<span class="func" >echo</span> pack(<span class="string" >'C*'</span>, 0xE3, 0x81, 0x82), PHP_EOL;
==&gt; あ</pre>

<p>これは、コンソールで使っている端末もUTF-8なので、そのまま出力できた。EUCな端末なら、こんな感じ</p>
<pre class="php">
<span class="comment" >// utf8 E38182</span>
<span class="func" >echo</span> mb_convert_encoding(pack(<span class="string" >'C*'</span>, 0xE3, 0x81, 0x82), <span class="string" >'EUC-JP'</span>, <span class="string" >'UTF-8'</span>), PHP_EOL;
==&gt; あ
</pre>

<p>ということで、他の文字エンコードでのバイナリをいくつか作ってみた。(やっていることは、文字列バイナリをmb_convert_encodingで端末の文字エンコードであるUTF-8に変換して表示しているだけ)</p>
<pre class="php">
<span class="comment" >// sjis 82A0</span>
<span class="func" >echo</span> mb_convert_encoding(pack(<span class="string" >'C*'</span>, 0x82, 0xA0), <span class="string" >'UTF-8'</span>, <span class="string" >'Shift_JIS'</span>), PHP_EOL;
==&gt; あ
<span class="comment" >// utf8 E38182</span>
<span class="func" >echo</span> mb_convert_encoding(pack(<span class="string" >'C*'</span>, 0xE3, 0x81, 0x82), <span class="string" >'UTF-8'</span>), PHP_EOL;
==&gt; あ
<span class="comment" >// eucjp A4A2</span>
<span class="func" >echo</span> mb_convert_encoding(pack(<span class="string" >'C*'</span>, 0xA4, 0xA2), <span class="string" >'UTF-8'</span>, <span class="string" >'EUC-JP'</span>), PHP_EOL;
==&gt; あ
<span class="comment" >// utf16 3042</span>
<span class="func" >echo</span> mb_convert_encoding(pack(<span class="string" >'C*'</span>, 0x30, 0x42), <span class="string" >'UTF-8'</span>, <span class="string" >'UTF-16'</span>), PHP_EOL;
==&gt; あ</pre>

<p>ということで、packを使えばバイナリから文字列を作れそう。ということはやっぱりバイナリで文字列を持っているというわけで。さらには、そのバイナリはmb_convert_encodingで他の値にもシフトできそう。と。<br />
勉強になります。</p>]]>
</content:encoded>
</item><item>
<title>フラワーロック 2.0 と CruiseControl を連携させてみた の作成編を更新</title>
<link>http://blog.xole.net/article.php?id=720</link>
<pubDate>Mon, 08 Dec 2008 00:18:41 +09:00</pubDate>
<description>





と言うわけで(?)、書きかけだったあいつを更新
ref - フラワーロック 2.0 と CruiseControl を連携させてみた


俺、これでフラワーロックの売上が上がったら、もっと別の、プロジェクト以外のフラワ...</description>
<content:encoded>
<![CDATA[<p>
<a href="http://blog.xole.net/resources/DCF_0003_3.jpg">
<img src="http://blog.xole.net/resources/flowerrock.jpg" width="400" height="500" />
</a>
</p>

<p>と言うわけで(?)、書きかけだったあいつを更新<br />
ref - <a href="http://blog.xole.net/article.php?id=717">フラワーロック 2.0 と CruiseControl を連携させてみた</a>
</p>

<p>俺、これでフラワーロックの売上が上がったら、もっと別の、プロジェクト以外のフラワーロックの利用方法考えるんだ...<br />
（流石にフラワーロックが踊る「ビルド失敗の舞」は使い道が違うような気がする...）</p>]]>
</content:encoded>
</item><item>
<title>Q4MをPHP(PDO)で</title>
<link>http://blog.xole.net/article.php?id=719</link>
<pubDate>Sun, 07 Dec 2008 17:57:37 +09:00</pubDate>
<description>Q4Mが無事インストールできたので、PHPから触ってみる。詳細なことは今度書く。とりあえず触りだけでも

テーブル定義

drop table if exists hoge_queue;
create table hoge_que...</description>
<content:encoded>
<![CDATA[<p>Q4Mが無事インストールできたので、PHPから触ってみる。詳細なことは今度書く。とりあえず触りだけでも</p>

<h3>テーブル定義</h3>

<pre class="ruby">drop table <span class="keyword" >if</span> exists hoge_queue;
create table hoge_queue(
    id int <span class="keyword" >not</span> null,
    name varchar(25) <span class="keyword" >not</span> null
) engine=queue;
</pre>

<h3>こんなスクリプトをガンガン回して、監視</h3>

<pre class="php">
<span class="vars" >$conn</span> = <span class="keyword" >new</span> PDO(<span class="string" >'mysql:host=localhost; dbname=hogetest'</span>, <span class="string" >'user'</span>, <span class="string" >'password'</span>);
<span class="vars" >$wait</span> = <span class="vars" >$conn</span>-&gt;prepare(<span class="string" >'SELECT queue_wait("hoge_queue", 10)'</span>);
<span class="vars" >$abort</span> = <span class="vars" >$conn</span>-&gt;prepare(<span class="string" >'SELECT queue_abort()'</span>);
<span class="vars" >$e</span> = <span class="vars" >$conn</span>-&gt;prepare(<span class="string" >'SELECT queue_end()'</span>);
<span class="vars" >$select</span> = <span class="vars" >$conn</span>-&gt;prepare(<span class="string" >'SELECT * FROM hoge_queue'</span>);

<span class="keyword" >while</span>(true){
    <span class="vars" >$start</span> = time(); <span class="comment" >// for epch tstmp</span>

    <span class="comment" >// wait call query</span>
    <span class="vars" >$wait</span>-&gt;execute();

    <span class="vars" >$end</span> = time();
    <span class="func" >echo</span> <span class="string" >'wait for: '</span>, <span class="vars" >$end</span> - <span class="vars" >$start</span>, <span class="string" >' sec.'</span>, PHP_EOL;
    <span class="func" >echo</span> <span class="string" >'is_queue: '</span>, <span class="vars" >$wait</span>-&gt;fetch(PDO::FETCH_COLUMN), PHP_EOL;

    <span class="vars" >$select</span>-&gt;execute();
    <span class="keyword" >while</span>(<span class="vars" >$row</span> = <span class="vars" >$select</span>-&gt;fetch(PDO::FETCH_OBJ)){
        var_dump(<span class="vars" >$row</span>);
        <span class="comment" >//</span>
        <span class="comment" >// delete しなくとも queue_end で消える</span>
        <span class="comment" >//</span>
        <span class="vars" >$e</span>-&gt;execute();
        <span class="keyword" >continue</span> 2;
    }

    <span class="comment" >// abort call</span>
    <span class="vars" >$abort</span>-&gt;execute();
    <span class="func" >echo</span> <span class="string" >'next...'</span>, PHP_EOL, PHP_EOL;
}</pre>

<h3>別の端末からmysqlの動いてるサーバに対して、insert</h3>

<pre>insert into hoge_queue values(1, 'hello world');</pre>

<h3>こんな感じになるよ</h3>

<pre class="php">int(10)
<span class="keyword" >array</span>(1) {
  [<span class="string" >"queue_wait("</span>hoge_queue<span class="string" >", 10)"</span>]=&gt;
  string(1) <span class="string" >"0"</span> 
}
next...

int(10)
<span class="keyword" >array</span>(1) {
  [<span class="string" >"queue_wait("</span>hoge_queue<span class="string" >", 10)"</span>]=&gt;
  string(1) <span class="string" >"0"</span> 
}
next...

int(10)
<span class="keyword" >array</span>(1) {
  [<span class="string" >"queue_wait("</span>hoge_queue<span class="string" >", 10)"</span>]=&gt;
  string(1) <span class="string" >"0"</span> 
}
next...

int(2)
<span class="keyword" >array</span>(1) {
  [<span class="string" >"queue_wait("</span>hoge_queue<span class="string" >", 10)"</span>]=&gt;
  string(1) <span class="string" >"1"</span> 
}
object(stdClass)#6 (2) {
  [<span class="string" >"id"</span>]=&gt;
  string(2) <span class="string" >"1"</span> 
  [<span class="string" >"name"</span>]=&gt;
  string(11) <span class="string" >"hello world"</span> 
}
next...

int(10)
<span class="keyword" >array</span>(1) {
  [<span class="string" >"queue_wait("</span>hoge_queue<span class="string" >", 10)"</span>]=&gt;
  string(1) <span class="string" >"0"</span> 
}
next...

int(10)
<span class="keyword" >array</span>(1) {
  [<span class="string" >"queue_wait("</span>hoge_queue<span class="string" >", 10)"</span>]=&gt;
  string(1) <span class="string" >"0"</span> 
}
next...
</pre>

<h2>Q4Mの動きで、特徴的なの</h2>

<ul>
<li>queue_wait で取れたレコードは、queue_end で消える。</li>
<li>queue_wait で止まる時間を指定しても、queueが入ってきたときは、即レコードが取れる</li>
<li>queue_wait を連発すると一行前のレコードが消える(?要確認だけど)</li>
<li>queue_wait で取れたレコードは他のクライアントから queue_wait しても取れない</li>
<li>queue_wait で取得したレコードは、他のクライアントからだとテーブル上に見えなくなってる</li>
<li>queue_wait で、レコードが見つからない場合は、0 で、見つかったら 1 が帰ってくる</li>
<li>queue_wait で取ったレコードは「ちゃんと処理をする」queue_abort すると消えるよ</li>
</ul>


<h2>Q4Mの動きですこしハマるやつ。その1</h2>
<h3>全レコード分 wait</h3>
<pre class="javascript">mysql&gt; select * from hoge_queue;
+----+------+
| id | name |
+----+------+
|  4 | foo4 | 
|  5 | foo5 | 
|  6 | foo6 | 
|  7 | foo7 | 
|  8 | foo8 | 
|  9 | foo9 | 
+----+------+
6 rows <span class="keyword" >in</span> set (0.00 sec)

mysql&gt; select queue_wait(<span class="string" >'hoge_queue'</span>, 1);
+-----------------------------+
| queue_wait(<span class="string" >'hoge_queue'</span>, 1) |
+-----------------------------+
|                           1 | 
+-----------------------------+
1 row <span class="keyword" >in</span> set (0.00 sec)

mysql&gt; select queue_wait(<span class="string" >'hoge_queue'</span>, 1);
+-----------------------------+
| queue_wait(<span class="string" >'hoge_queue'</span>, 1) |
+-----------------------------+
|                           1 | 
+-----------------------------+
1 row <span class="keyword" >in</span> set (0.06 sec)

mysql&gt; select queue_wait(<span class="string" >'hoge_queue'</span>, 1);
+-----------------------------+
| queue_wait(<span class="string" >'hoge_queue'</span>, 1) |
+-----------------------------+
|                           1 | 
+-----------------------------+
1 row <span class="keyword" >in</span> set (0.06 sec)

mysql&gt; select queue_wait(<span class="string" >'hoge_queue'</span>, 1);
+-----------------------------+
| queue_wait(<span class="string" >'hoge_queue'</span>, 1) |
+-----------------------------+
|                           1 | 
+-----------------------------+
1 row <span class="keyword" >in</span> set (0.05 sec)

mysql&gt; select queue_wait(<span class="string" >'hoge_queue'</span>, 1);
+-----------------------------+
| queue_wait(<span class="string" >'hoge_queue'</span>, 1) |
+-----------------------------+
|                           1 | 
+-----------------------------+
1 row <span class="keyword" >in</span> set (0.05 sec)

mysql&gt; select queue_wait(<span class="string" >'hoge_queue'</span>, 1);
+-----------------------------+
| queue_wait(<span class="string" >'hoge_queue'</span>, 1) |
+-----------------------------+
|                           1 | 
+-----------------------------+
1 row <span class="keyword" >in</span> set (0.05 sec)

mysql&gt; select queue_wait(<span class="string" >'hoge_queue'</span>, 1);
+-----------------------------+
| queue_wait(<span class="string" >'hoge_queue'</span>, 1) |
+-----------------------------+
|                           0 | 
+-----------------------------+
1 row <span class="keyword" >in</span> set (1.05 sec)
</pre>

<p>最後は、waitで 1sec 止まって、結果は0に</p>

<h3>selectすると</h3>

<pre class="javascript">mysql&gt; select * from hoge_queue;             
Empty set (0.00 sec)
</pre>

<h3>abort すると...?</h3>
<pre class="javascript">mysql&gt; select queue_abort();
+---------------+
| queue_abort() |
+---------------+
|             1 | 
+---------------+
1 row <span class="keyword" >in</span> set (0.00 sec)</pre>

<h3>その後、select すると...</h3>

<pre class="javascript">mysql&gt; select * from hoge_queue;
Empty set (0.00 sec)
</pre>

<p>全部消えてる...</p>

<p>wait して取り出せたレコードは、レスキューできないのか。残念。</p>


<h2>Q4Mの動きですこしハマるやつ。その他</h2>

<p>Q4Mは面白いので、別の機会にまとめて書く</p>]]>
</content:encoded>
</item><item>
<title>Q4Mのビルド(CentOS 5.2 と OSX)</title>
<link>http://blog.xole.net/article.php?id=718</link>
<pubDate>Sun, 07 Dec 2008 17:39:07 +09:00</pubDate>
<description>Q4Mのアイディアがとても面白そうなので、使ってみることにしました。
が、ビルドに色々つまづいたので、メモ。かれこれ2週間くらい前のログなので、微妙にバージョンが違ってたら申し訳ないです。

CentOS 5.2 に入れる

Ce...</description>
<content:encoded>
<![CDATA[<p>Q4Mのアイディアがとても面白そうなので、使ってみることにしました。<br />
が、ビルドに色々つまづいたので、メモ。かれこれ2週間くらい前のログなので、微妙にバージョンが違ってたら申し訳ないです。</p>

<h2>CentOS 5.2 に入れる</h2>

<p>CentOS を使っているので、これに入れるログ</p>

<h3>既にインストール済みのMySQLをアンインストール</h3>

<p>とりあえず、キレイにしておきました。</p>

<pre class="javascript">hata@local ~/local/rpms/mysql5&gt; sudo yum remove mysql
Resolving Dependencies
--&gt; Running transaction check
---&gt; Package mysql.x86_64 0:5.0.45-7.el5 set to be erased
--&gt; Processing Dependency: libmysqlclient.so.15()(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: mysql-devel
--&gt; Processing Dependency: libmysqlclient.so.15()(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: libdbi-dbd-mysql
--&gt; Processing Dependency: libmysqlclient.so.15()(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: mysql-server
--&gt; Processing Dependency: libmysqlclient.so.15()(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: perl-DBD-MySQL
--&gt; Processing Dependency: libmysqlclient.so.15(libmysqlclient_15)(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: libdbi-dbd-mysql
--&gt; Processing Dependency: libmysqlclient.so.15(libmysqlclient_15)(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: mysql-server
--&gt; Processing Dependency: libmysqlclient.so.15(libmysqlclient_15)(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: perl-DBD-MySQL
--&gt; Processing Dependency: libmysqlclient_r.so.15()(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: mysql-devel
--&gt; Processing Dependency: libmysqlclient_r.so.15()(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: mysql-server
--&gt; Processing Dependency: libmysqlclient_r.so.15(libmysqlclient_15)(64bit) <span class="keyword" >for</span> <span class="keyword" >package</span>: mysql-server
--&gt; Processing Dependency: mysql = 5.0.45-7.el5 <span class="keyword" >for</span> <span class="keyword" >package</span>: mysql-devel
--&gt; Processing Dependency: mysql = 5.0.45-7.el5 <span class="keyword" >for</span> <span class="keyword" >package</span>: mysql-server
--&gt; Processing Dependency: mysql <span class="keyword" >for</span> <span class="keyword" >package</span>: libdbi-dbd-mysql
--&gt; Running transaction check
---&gt; Package mysql-devel.x86_64 0:5.0.45-7.el5 set to be erased
---&gt; Package mysql-server.x86_64 0:5.0.45-7.el5 set to be erased
---&gt; Package libdbi-dbd-mysql.x86_64 0:0.8.1a-1.2.2 set to be erased
---&gt; Package perl-DBD-MySQL.x86_64 0:3.0007-1.fc6 set to be erased
--&gt; Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size 
=============================================================================
Removing:
 mysql                   x86_64     5.0.45-7.el5     installed         7.5 M
Removing <span class="keyword" >for</span> dependencies:
 libdbi-dbd-mysql        x86_64     0.8.1a-1.2.2     installed          54 k
 mysql-devel             x86_64     5.0.45-7.el5     installed         6.3 M
 mysql-server            x86_64     5.0.45-7.el5     installed          22 M
 perl-DBD-MySQL          x86_64     3.0007-1.fc6     installed         328 k

Transaction Summary
=============================================================================
Install      0 Package(s)         
Update       0 Package(s)         
Remove       5 Package(s)         

Is <span class="keyword" >this</span> ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Erasing   : mysql-devel                  ######################### [1/5] 
  Erasing   : mysql                        ######################### [2/5] 
  Erasing   : mysql-server                 ######################### [3/5] 
warning: /<span class="keyword" >var</span>/log/mysqld.log saved as /<span class="keyword" >var</span>/log/mysqld.log.rpmsave
  Erasing   : libdbi-dbd-mysql             ######################### [4/5] 
  Erasing   : perl-DBD-MySQL               ######################### [5/5] 

Removed: mysql.x86_64 0:5.0.45-7.el5
Dependency Removed: libdbi-dbd-mysql.x86_64 0:0.8.1a-1.2.2 mysql-devel.x86_64 0:5.0.45-7.el5 mysql-server.x86_64 0:5.0.45-7.el5 perl-DBD-MySQL.x86_64 0:3.0007-1.fc6
Complete!
</pre>

<h3>MySQL ABのバイナリをインストールする</h3>
<p>
<a href="http://dev.mysql.com/downloads/mysql/5.1.html">MySQL ABはここから</a>落としてきて、とりあえず rpm を使いました。</p>

<pre class="python">hata@local: ~/local/rpms/mysql5&gt; sudo rpm -ivh MySQL-*.rpm
準備中...                <span class="comment" >########################################### [100%]</span>
   1:MySQL-shared-compat    <span class="comment" >########################################### [ 20%]</span>
   2:MySQL-client-community <span class="comment" >########################################### [ 40%]</span>
   3:MySQL-devel-community  <span class="comment" >########################################### [ 60%]</span>
   4:MySQL-server-community <span class="comment" >########################################### [ 80%]</span>
ERROR: 1136  Column <span class="builtins" >count</span> doesn't match value <span class="builtins" >count</span> at row 1
081121 10:59:56 [ERROR] Aborting

081121 10:59:56 [Note] /usr/sbin/mysqld: Shutdown complete

Installation of system tables failed!  Examine the logs <span class="keyword" >in</span>
/var/lib/mysql <span class="keyword" >for</span> more information.

You can <span class="keyword" >try</span> to start the mysqld daemon with:

    shell&gt; /usr/sbin/mysqld --skip-grant &amp;

<span class="keyword" >and</span> use the command line tool /usr/bin/mysql
to connect to the mysql database <span class="keyword" >and</span> look at the grant tables:

    shell&gt; /usr/bin/mysql -u root mysql
    mysql&gt; show tables

Try 'mysqld --help' <span class="keyword" >if</span> you have problems with paths.  Using --log
gives you a log <span class="keyword" >in</span> /var/lib/mysql that may be helpful.

The latest information about MySQL <span class="keyword" >is</span> available on the web at
http://www.mysql.com/.  Please consult the MySQL manual section
'Problems running mysql_install_db', <span class="keyword" >and</span> the manual section that
describes problems on your OS.  Another information source are the
MySQL <span class="commonlibs" >email</span> archives available at http://lists.mysql.com/.

Please check all of the above before mailing us!  And remember, <span class="keyword" >if</span>
you do mail us, you MUST use the /usr/bin/mysqlbug script!

Starting MySQL.[  OK  ]
Giving mysqld 2 seconds to start
   5:MySQL-shared-community <span class="comment" >########################################### [100%]</span>
</pre>



<h3>Q4M-0.8.3を落としてきて make</h3>

<p>
<a href="http://q4m.31tools.com/dist/">q4m.31tools.com</a>から無印の q4m-{version}.tar.gz だと、なぜかエラーが沢山（下記）でたので、mysql-{version}-*q4m-{version}.tar.gz を使った。</p>

<pre class="python">gcc/x86_64-redhat-linux/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -lstdc++ -lm -lgcc_s -lc -lgcc_s /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crtn.o  -Wl,--<span class="builtins" >hash</span>-style=both -o .libs/libqueue_engine.so.0.0.0
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o:(.init+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o:(.fini+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o:(.data.rel.ro+0x0): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o:(.data.rel.ro+0x0): first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtendS.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtendS.o:(.dtors+0x0): first defined here
collect2: ld returned 1 exit status
make[2]: *** [libqueue_engine.la] Error 1
make[2]: Leaving directory `/home/vmdev/local/src/q4m-0.8.3/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/vmdev/local/src/q4m-0.8.3/src'
make: *** [all-recursive] Error 1
</pre>

<p>かなりハマった...。</p>

<p>んで、他の人も書いてるけど、configure オプションを注意しつつ、make</p>
<p>僕は、CXXFLAGS に /usr/include/mysql として、AB の rpm が入れたヘッダを指定するようにしました。</p>

<pre>--with-mysql=/home/hata/local/src/mysql-5.1.29-rc CXXFLAGS="-I/usr/include/mysql</pre>

<pre class="python">hata@local: ~/local/src&gt; wget http://q4m.31tools.com/dist/mysql-5.1.28-rc-linux-x86_64-glibc23-with-fast-mutexes-q4m-0.8.3.tar.gz
hata@local: ~/local/src&gt; tar xzvf mysql-5.1.28-rc-linux-x86_64-glibc23-with-fast-mutexes-q4m-0.8.3.tar.gz 
q4m-0.8.3-linux-x86_64/
q4m-0.8.3-linux-x86_64/ChangeLog
q4m-0.8.3-linux-x86_64/config/
q4m-0.8.3-linux-x86_64/config/config.sub
q4m-0.8.3-linux-x86_64/config/depcomp
q4m-0.8.3-linux-x86_64/config/missing
q4m-0.8.3-linux-x86_64/config/<span class="builtins" >compile</span>
q4m-0.8.3-linux-x86_64/config/install-sh
q4m-0.8.3-linux-x86_64/config/config.guess
q4m-0.8.3-linux-x86_64/config/ac_mysql.m4
q4m-0.8.3-linux-x86_64/config/ltmain.sh
q4m-0.8.3-linux-x86_64/examples/
q4m-0.8.3-linux-x86_64/examples/crawler/
q4m-0.8.3-linux-x86_64/examples/crawler/crawler.pl
q4m-0.8.3-linux-x86_64/examples/crawler/initdb.sql
q4m-0.8.3-linux-x86_64/examples/crawler/README
q4m-0.8.3-linux-x86_64/Makefile.<span class="keyword" >in</span>
q4m-0.8.3-linux-x86_64/Makefile.am
q4m-0.8.3-linux-x86_64/t/
q4m-0.8.3-linux-x86_64/t/02-queue.t
q4m-0.8.3-linux-x86_64/t/05-multireader-<span class="builtins" >read</span>.c
q4m-0.8.3-linux-x86_64/t/05-multiwait-core.c
q4m-0.8.3-linux-x86_64/t/Makefile.<span class="keyword" >in</span>
q4m-0.8.3-linux-x86_64/t/04-blob-cond.t
q4m-0.8.3-linux-x86_64/t/Makefile.am
q4m-0.8.3-linux-x86_64/t/08-forward.t
q4m-0.8.3-linux-x86_64/t/02-queue-cond.t
q4m-0.8.3-linux-x86_64/t/05-multireader.t
q4m-0.8.3-linux-x86_64/t/09-pqueue-single-table.t
q4m-0.8.3-linux-x86_64/t/07-trans.t
q4m-0.8.3-linux-x86_64/t/02-queue-owned-delete.t
q4m-0.8.3-linux-x86_64/t/05-multiwait.t
q4m-0.8.3-linux-x86_64/t/06-multi.t
q4m-0.8.3-linux-x86_64/t/03-queue-error-wait.t
q4m-0.8.3-linux-x86_64/t/04-blob.t
q4m-0.8.3-linux-x86_64/t/01-base-rnd_pos.t
q4m-0.8.3-linux-x86_64/t/09-pqueue-single-table-wake-listener.t
q4m-0.8.3-linux-x86_64/t/05-multirw-core.c
q4m-0.8.3-linux-x86_64/t/05-multirw.t
q4m-0.8.3-linux-x86_64/t/01-base.t
q4m-0.8.3-linux-x86_64/t/03-queue-error.t
q4m-0.8.3-linux-x86_64/run_tests.pl
q4m-0.8.3-linux-x86_64/libqueue_engine.so
q4m-0.8.3-linux-x86_64/configure.<span class="keyword" >in</span>
q4m-0.8.3-linux-x86_64/aclocal.m4
q4m-0.8.3-linux-x86_64/configure
q4m-0.8.3-linux-x86_64/INSTALL
q4m-0.8.3-linux-x86_64/COPYING
q4m-0.8.3-linux-x86_64/src/
q4m-0.8.3-linux-x86_64/src/dllist.h
q4m-0.8.3-linux-x86_64/src/Makefile.<span class="keyword" >in</span>
q4m-0.8.3-linux-x86_64/src/Makefile.am
q4m-0.8.3-linux-x86_64/src/queue_cond.h
q4m-0.8.3-linux-x86_64/src/queue_config.h.<span class="keyword" >in</span>
q4m-0.8.3-linux-x86_64/src/ha_queue.h
q4m-0.8.3-linux-x86_64/src/queue_cond.cc
q4m-0.8.3-linux-x86_64/src/adler32.c
q4m-0.8.3-linux-x86_64/src/ha_queue.cc
q4m-0.8.3-linux-x86_64/TODO
q4m-0.8.3-linux-x86_64/AUTHORS
q4m-0.8.3-linux-x86_64/doc/
q4m-0.8.3-linux-x86_64/doc/style.css
q4m-0.8.3-linux-x86_64/doc/top.jpg
q4m-0.8.3-linux-x86_64/doc/install.html
q4m-0.8.3-linux-x86_64/doc/<span class="builtins" >index</span>.html
q4m-0.8.3-linux-x86_64/doc/q4m-modes.gif
q4m-0.8.3-linux-x86_64/doc/tutorial.html
q4m-0.8.3-linux-x86_64/README
q4m-0.8.3-linux-x86_64/support-files/
q4m-0.8.3-linux-x86_64/support-files/install.sql
q4m-0.8.3-linux-x86_64/support-files/install-<span class="keyword" >exec</span>-hook.txt
q4m-0.8.3-linux-x86_64/support-files/q4m-forward
q4m-0.8.3-linux-x86_64/NEWS</pre>

<pre class="python">hata@local: ~/local/src&gt; cd q4m-0.8.3-linux-x86_64/
hata@local: ~/local/src/q4m-0.8.3-linux-x86_64&gt; ./configure --prefix=/usr --with-mysql=/home/hata/local/src/mysql-5.1.29-rc CXXFLAGS="-I/usr/include/mysql" 
:
:
:
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating t/Makefile
config.status: creating src/queue_config.h
config.status: executing depfiles <span class="commonlibs" >commands</span>

hata@local: ~/local/src/q4m-0.8.3-linux-x86_64&gt; make
hata@local: ~/local/src/q4m-0.8.3-linux-x86_64&gt; make install
</pre>

<h3>プラグインのインストール</h3>

<p>sudo make install後</p>

<p>/usr/lib64/mysql の下に、libqueue_engine.* がおかれているので、プラグインディレクトリにコピーする</p>

<p>もしくは、configure オプションの libdir を指定してみる</p>

<pre>./configure --with-mysql=/home/vmdev/local/src/mysql-5.1.29-rc CXXFLAGS="-I/usr/include/mysql" --libdir=/usr/lib64/mysql/plugin</pre>

<p>これでやると、なぜか mysql/plugin にコピーされる(libdirの動きとしていいのか...?)</p>


<h2>OSX(10.5.5)に入れる</h2>

<h3>port から MySQL5.1.29を入れる</h3>

<p>MySQL AB のものだとハマったので、今回は port を使う</p>

<pre>hata@mac.local &gt; sudo port install mysql5-devel</pre>

<h3>Q4M のインストール</h3>

<p>linux と同じように無印は使わず、mysql-5.1.28-rc-osx10.4-i686-without-fast-mutexes-q4m-0.8.3.tar.gzを使う</p>

<pre class="python">hata@mac.local ~/local/src/q4m&gt; ./configure --prefix=/opt/local --with-mysql=/Users/yusukehata/tmp/mysql-5.1.29-rc CFLAGS="-I/opt/local/include/mysql5/mysql -I/opt/local/include" CPPFLAGS="-I/opt/local/include/mysql5/mysql -I/opt/local/include"</pre>

<p>また、以下のようにシンボリックリンク貼っておく必要がある</p>

<pre>&gt; sudo ln -s /opt/local/include/mysql5/mysql/ /opt/local/include/mysql
&gt; sudo ln -s /opt/local/lib/mysql5/mysql/ /opt/local/lib/mysql</pre>

<h4>MySQL AB のバイナリで、ビルド時に発生するエラーとか</h4>

<p>もしかしたら、portのでも出たかも</p>

<pre class="python">source='05-multireader-<span class="builtins" >read</span>.c' <span class="keyword" >object</span>='05_multireader_read-05-multireader-<span class="builtins" >read</span>.o' libtool=no \
    depfile='.deps/05_multireader_read-05-multireader-<span class="builtins" >read</span>.Po' tmpdepfile='.deps/05_multireader_read-05-multireader-<span class="builtins" >read</span>.TPo' \
    depmode=gcc3 /bin/sh ../config/depcomp \
    gcc -DHAVE_CONFIG_H -I. -I. -I../src -I/Users/yusukehata/tmp/mysql-5.1.29-rc/sql -I/Users/yusukehata/tmp/mysql-5.1.29-rc/include -I/Users/yusukehata/tmp/mysql-5.1.29-rc/regex -I/Users/yusukehata/tmp/mysql-5.1.29-rc  -I/opt/local/include/mysql5/mysql -I/opt/local/include  -I/opt/local/include/mysql5/mysql -I/opt/local/include -Wall -c -o 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o `test -f '05-multireader-<span class="builtins" >read</span>.c' || echo './'`05-multireader-<span class="builtins" >read</span>.c
/bin/sh ../libtool --preserve-dup-deps --<span class="builtins" >mode</span>=link gcc  -I/opt/local/include/mysql5/mysql -I/opt/local/include -Wall -L/usr/local/mysql/lib  -o 05-multireader-<span class="builtins" >read</span>  05_multireader_read-05-multireader-<span class="builtins" >read</span>.o -lmysqlclient 
mkdir .libs
gcc -I/opt/local/include/mysql5/mysql -I/opt/local/include -Wall -o 05-multireader-<span class="builtins" >read</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o  -L/usr/local/mysql/lib /usr/local/mysql/lib/libmysqlclient.dylib -lm
ld: warning <span class="keyword" >in</span> /usr/local/mysql/lib/libmysqlclient.dylib, <span class="builtins" >file</span> <span class="keyword" >is</span> <span class="keyword" >not</span> of required architecture
Undefined symbols:
  "_mysql_real_connect", referenced <span class="keyword" >from</span>:
      _main <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
  "_mysql_store_result", referenced <span class="keyword" >from</span>:
      _do_select <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
  "_mysql_init", referenced <span class="keyword" >from</span>:
      _main <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
  "_mysql_free_result", referenced <span class="keyword" >from</span>:
      _main <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
      _main <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
  "_mysql_query", referenced <span class="keyword" >from</span>:
      _do_select <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
  "_mysql_close", referenced <span class="keyword" >from</span>:
      _main <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
  "_mysql_fetch_row", referenced <span class="keyword" >from</span>:
      _main <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
      _main <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
  "_mysql_num_rows", referenced <span class="keyword" >from</span>:
      _main <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
      _main <span class="keyword" >in</span> 05_multireader_read-05-multireader-<span class="builtins" >read</span>.o
ld: <span class="commonlibs" >symbol</span>(s) <span class="keyword" >not</span> found
collect2: ld returned 1 exit status
make[1]: *** [05-multireader-<span class="builtins" >read</span>] Error 1
make: *** [all-recursive] Error 1
</pre>

<p>この状態だと、PHPとかビルドするときにエラーになる...</p>

<pre class="python">ld: warning <span class="keyword" >in</span> /usr/local/mysql/lib/libmysqlclient.dylib, <span class="builtins" >file</span> <span class="keyword" >is</span> <span class="keyword" >not</span> of required architecture
ld: warning <span class="keyword" >in</span> /usr/local/mysql/lib/libmygcc.a, <span class="builtins" >file</span> <span class="keyword" >is</span> <span class="keyword" >not</span> of required architecture
Undefined symbols:
  "_mysql_get_server_info", referenced <span class="keyword" >from</span>:
      _pdo_mysql_get_attribute <span class="keyword" >in</span> mysql_driver.o
  "_mysql_stmt_close", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_dtor <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_cursor_closer <span class="keyword" >in</span> mysql_statement.o
  "_mysql_stmt_fetch", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_fetch <span class="keyword" >in</span> mysql_statement.o
  "_mysql_next_result", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_dtor <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_next_rowset <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_cursor_closer <span class="keyword" >in</span> mysql_statement.o
  "_mysql_stmt_errno", referenced <span class="keyword" >from</span>:
      __pdo_mysql_error <span class="keyword" >in</span> mysql_driver.o
  "_mysql_stmt_store_result", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
  "_mysql_real_escape_string", referenced <span class="keyword" >from</span>:
      _mysql_handle_quoter <span class="keyword" >in</span> mysql_driver.o
  "_mysql_stmt_init", referenced <span class="keyword" >from</span>:
      _mysql_handle_preparer <span class="keyword" >in</span> mysql_driver.o
  "_mysql_affected_rows", referenced <span class="keyword" >from</span>:
      _mysql_handle_doer <span class="keyword" >in</span> mysql_driver.o
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_next_rowset <span class="keyword" >in</span> mysql_statement.o
  "_mysql_stmt_prepare", referenced <span class="keyword" >from</span>:
      _mysql_handle_preparer <span class="keyword" >in</span> mysql_driver.o
  "_mysql_stmt_sqlstate", referenced <span class="keyword" >from</span>:
      __pdo_mysql_error <span class="keyword" >in</span> mysql_driver.o
  "_mysql_fetch_fields", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_next_rowset <span class="keyword" >in</span> mysql_statement.o
  "_mysql_get_host_info", referenced <span class="keyword" >from</span>:
      _pdo_mysql_get_attribute <span class="keyword" >in</span> mysql_driver.o
  "_mysql_get_server_version", referenced <span class="keyword" >from</span>:
      _mysql_handle_preparer <span class="keyword" >in</span> mysql_driver.o
  "_mysql_free_result", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_dtor <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_dtor <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_next_rowset <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_cursor_closer <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_cursor_closer <span class="keyword" >in</span> mysql_statement.o
  "_mysql_options", referenced <span class="keyword" >from</span>:
      _pdo_mysql_handle_factory <span class="keyword" >in</span> mysql_driver.o
      _pdo_mysql_handle_factory <span class="keyword" >in</span> mysql_driver.o
      _pdo_mysql_handle_factory <span class="keyword" >in</span> mysql_driver.o
      _pdo_mysql_handle_factory <span class="keyword" >in</span> mysql_driver.o
      _pdo_mysql_handle_factory <span class="keyword" >in</span> mysql_driver.o
      _pdo_mysql_handle_factory <span class="keyword" >in</span> mysql_driver.o
  "_mysql_close", referenced <span class="keyword" >from</span>:
      _mysql_handle_closer <span class="keyword" >in</span> mysql_driver.o
  "_mysql_stmt_affected_rows", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
  "_mysql_fetch_row", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_fetch <span class="keyword" >in</span> mysql_statement.o
  "_mysql_num_fields", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_next_rowset <span class="keyword" >in</span> mysql_statement.o
  "_mysql_store_result", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_dtor <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_next_rowset <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_cursor_closer <span class="keyword" >in</span> mysql_statement.o
  "_mysql_get_client_info", referenced <span class="keyword" >from</span>:
      _zm_info_pdo_mysql <span class="keyword" >in</span> pdo_mysql.o
      _pdo_mysql_get_attribute <span class="keyword" >in</span> mysql_driver.o
  "_mysql_real_query", referenced <span class="keyword" >from</span>:
      _mysql_handle_doer <span class="keyword" >in</span> mysql_driver.o
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
  "_mysql_errno", referenced <span class="keyword" >from</span>:
      __pdo_mysql_error <span class="keyword" >in</span> mysql_driver.o
      _mysql_handle_preparer <span class="keyword" >in</span> mysql_driver.o
      _pdo_mysql_stmt_fetch <span class="keyword" >in</span> mysql_statement.o
  "_mysql_error", referenced <span class="keyword" >from</span>:
      __pdo_mysql_error <span class="keyword" >in</span> mysql_driver.o
      __pdo_mysql_error <span class="keyword" >in</span> mysql_driver.o
  "_mysql_stmt_bind_result", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
  "_mysql_sqlstate", referenced <span class="keyword" >from</span>:
      __pdo_mysql_error <span class="keyword" >in</span> mysql_driver.o
  "_mysql_stmt_result_metadata", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
  "_mysql_insert_id", referenced <span class="keyword" >from</span>:
      _pdo_mysql_last_insert_id <span class="keyword" >in</span> mysql_driver.o
  "_mysql_use_result", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_next_rowset <span class="keyword" >in</span> mysql_statement.o
  "_mysql_stmt_bind_param", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
  "_mysql_stmt_attr_set", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
  "_mysql_num_rows", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
  "_mysql_init", referenced <span class="keyword" >from</span>:
      _pdo_mysql_handle_factory <span class="keyword" >in</span> mysql_driver.o
  "_mysql_real_connect", referenced <span class="keyword" >from</span>:
      _pdo_mysql_handle_factory <span class="keyword" >in</span> mysql_driver.o
  "_mysql_more_results", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_dtor <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_dtor <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_cursor_closer <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_cursor_closer <span class="keyword" >in</span> mysql_statement.o
  "_mysql_stmt_execute", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_execute <span class="keyword" >in</span> mysql_statement.o
  "_mysql_ping", referenced <span class="keyword" >from</span>:
      _pdo_mysql_check_liveness <span class="keyword" >in</span> mysql_driver.o
  "_mysql_stmt_param_count", referenced <span class="keyword" >from</span>:
      _mysql_handle_preparer <span class="keyword" >in</span> mysql_driver.o
  "_mysql_stmt_free_result", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_next_rowset <span class="keyword" >in</span> mysql_statement.o
      _pdo_mysql_stmt_cursor_closer <span class="keyword" >in</span> mysql_statement.o
  "_mysql_stat", referenced <span class="keyword" >from</span>:
      _pdo_mysql_get_attribute <span class="keyword" >in</span> mysql_driver.o
  "_mysql_fetch_lengths", referenced <span class="keyword" >from</span>:
      _pdo_mysql_stmt_fetch <span class="keyword" >in</span> mysql_statement.o
ld: <span class="commonlibs" >symbol</span>(s) <span class="keyword" >not</span> found
collect2: ld returned 1 exit status
make: *** [libs/libphp5.bundle] Error 1
</pre>

<p>なぞ</p>

<h4>ちなみに、MySQL AB は</h4>

<p>Mach-O 64-bit で x86_64 となってるのだが</p>

<pre class="python">&gt; <span class="builtins" >file</span> /usr/local/mysql/lib/libmysqlclient.16.0.0.dylib
/usr/local/mysql/lib/libmysqlclient.16.0.0.dylib: Mach-O 64-bit dynamically linked shared library x86_64
&gt; <span class="builtins" >file</span> /usr/local/mysql/lib/libmysqlclient.dylib
/usr/local/mysql/lib/libmysqlclient.dylib: Mach-O 64-bit dynamically linked shared library x86_64
</pre>

<pre class="python">/usr/local/mysql/bin/mysqlbug
&gt;&gt; CFLAGS='-g -Os -arch x86_64 -fno-common'  CXX='gcc -static-libgcc'  CXXFLAGS='-g -Os -arch x86_64 -felide-constructors -fno-common'

/usr/local/mysql/bin/mysql_config 
Usage: /usr/local/mysql/bin/mysql_config [OPTIONS]
Options:
        --cflags         [-I/usr/local/mysql/include  -g -Os -arch x86_64 -fno-common   -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT  -DDONT_DECLARE_CXA_PURE_VIRTUAL]
        --include        [-I/usr/local/mysql/include]
        --libs           [-L/usr/local/mysql/lib -lmysqlclient -lz -lm     -lmygcc]
        --libs_r         [-L/usr/local/mysql/lib -lmysqlclient_r -lz -lm     -lmygcc]
        --plugindir      [/usr/local/mysql/lib/plugin]
        --<span class="commonlibs" >socket</span>         [/tmp/mysql.sock]
        --port           [0]
        --version        [5.1.29-rc]
        --libmysqld-libs [-L/usr/local/mysql/lib -lmysqld -lz -lm       -lmygcc]
</pre>

<h2>まとめ</h2>

<p>無事、試行錯誤しながら何とかインストール出来た。もしかしたら wassr でその時の苦悩の様子がライブ中継してるかもしれないけど、何度、試行錯誤したことか...。<br />
環境が違ったときにインストール方法とか微妙に違うのが面倒だねぇ</p>

<p>ま、インストールにハマると長引くので危険。誰かがやってた環境と同じのに合わせるのが一番早いのかもね</p>]]>
</content:encoded>
</item><item>
<title>フラワーロック 2.0 と CruiseControl を連携させてみた</title>
<link>http://blog.xole.net/article.php?id=717</link>
<pubDate>Fri, 05 Dec 2008 02:36:13 +09:00</pubDate>
<description>






CruiseControlとLEDの組み合わせが海外でも流行っている(?)みたいですが、日本ならフラワーロック2.0だろ！ってことでやってみた。

CruiseControl を使ったもう一つのソリューション


...</description>
<content:encoded>
<![CDATA[<p>
<a href="http://blog.xole.net/resources/flowerrock_top.jpg">
<img src="http://blog.xole.net/resources/flowerrock_top.jpg" />
</a>
</p>

<p>
<a href="http://cruisecontrol.sourceforge.net/">CruiseControl</a>とLEDの組み合わせが<a href="http://www.analysisuk.com/blog/archives/39-Build-Indicators-revisited.html">海外でも流行って</a>いる(?)<a href="http://www.codeplex.com/ccnetSerialOutput">みたいです</a>が、日本なら<a href="http://www.takaratomy.co.jp/products/flower-rock/">フラワーロック2.0</a>だろ！ってことでやってみた。
<br />
CruiseControl を使ったもう一つのソリューション</p>

<p>
<a href="http://blog.xole.net/resources/DCF_0003_3.jpg">
<img src="http://blog.xole.net/resources/flowerrock.jpg" width="400" height="500" />
</a>
<br />
↑アップから。かわいいヤツです。</p>

<p>
<object width="425" height="344">
<param name="movie" value="http://www.youtube.com/v/Kb1RfLqYugA&hl=ja&fs=1">
</param>
<param name="allowFullScreen" value="true">
</param>
<param name="allowscriptaccess" value="always">
</param>
<embed src="http://www.youtube.com/v/Kb1RfLqYugA&hl=ja&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344">
</embed>
</object>
<br />
↑ビルドに失敗して FAILED のときの様子。エラーになってると踊って光っちゃいます。</p>


<h2>作り方</h2>

<h3>まずは、フラワーロックを買ってくる</h3>

<p>これが無いと始まりません。<br />
近所のおもちゃ屋さん、電気店、アマゾンなどで購入しましょう</p>

<p>
<a href="http://blog.xole.net/resources/flowerrock_box.jpg">
<img src="http://blog.xole.net/resources/flowerrock_box.jpg" />
</a>

<h3>フラワーロックの仕様を確認する</h3>

<p>フラワーロック 2.0 の主な仕様を確認します。</p>

<div class="amazon-item-box" style="display: block; padding: 0; border: 1px solid  #999; margin: 8px;  -moz-border-radius: 10px;">
<div class="amazon-item-image" style="display: block; padding: 10px; float: left;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001B1Q3OO/lilydaselfish-22/ref=nosim" target="_blank">
<img src="http://ecx.images-amazon.com/images/I/317%2BhV-gc3L._SL160_.jpg" alt="フラワーロック 2.0 (コスモスtype)" title="フラワーロック 2.0 (コスモスtype)" style="border: none; display: inline; vertical-align: bottom;" />
</a>
</div>
<dl class="amazon-item-info" style="display: block; margin-left: 10px; padding: 0 8px 0 10px; font-size: 10pt; line-height: 110%;">
<dt class="amazon-item-name" style="display: block; margin-bottom: 5px; line-height: 120%;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001B1Q3OO/lilydaselfish-22/ref=nosim" target="_blank" title="フラワーロック 2.0 (コスモスtype)">フラワーロック 2.0 (コスモスtype)</a>
</dt>
<dd>
<ul class="amazon-item-info-list" style="list-style-type: none; padding-left: 0px; line-height: 120%;">
<li>発売元: タカラトミー</li>
<li>レーベル: タカラトミー</li>
<li>スタジオ: タカラトミー</li>
<li>メーカー: タカラトミー</li>
<li>価格: ￥ 3,999 (34% OFF)</li>
<li>発売日: 2008/10/31</li>
<li>売上ランキング： 548</li>
</ul>
</dd>
</dl>
<p class="amazon-item-footer" style="clear: left; text-align: right; font-size: x-small; padding: 4px 10px 4px 10px; line-height: 100%; background-color: #f0f0f0;">posted with <a href="http://socialtunes.net">Socialtunes</a> at 2008/12/07<br />
</p>
</div>

<p>
<a href="http://blog.xole.net/resources/flowerrock_interface.jpg">
<img src="http://blog.xole.net/resources/flowerrock_interface.jpg" />
</a>
</p>

<ul>
<li>インプットは電源の On/Off と、モードボタン、入力切り替え(Line/マイク)と音声入力のラインしかない</li>
<li>その内、フラワーロックを操作できるのは、音声入力の LINE しかない(音に反応するため)</li>
<li>フラワーロックは、何も入力が無いと 5分後(5分間経過後) スリープする</li>
<li>スリープしたフラワーロックを起こすには、電源の On/Off ボタンを押すしかない</li>
<li>フラワーロックのLEDを任意の色で発色させることはできない</li>
<li>フラワーロックの踊りを任意のインプットで踊らせることができない</li>
</ul>

<p>ちなみに、フラワーロックは単3電池 4本、もしくは AC の専用電源が必要です。長時間使うなら電池よりも AC を買うことをおすすめします。</p>

<h3>CruiseControl で動かす方法を検討する</h3>

<p>CruiseControl(以下、CC) に組み込む方法として、今回は音声入力を主として動かすため、以下のようにしました。</p>

<ul>
<li>CruiseControl でビルドログを、jabber でメッセージを飛ばす</p>
<li>jabber クライアントがメッセージの内容を読み取り、ビルドに失敗(BUILD FAILED)となっていた場合は、エラーミュージックを流す。</li>
<li>jabber クライアントがメッセージの内容を読み取り、ビルドに成功(Build passed)となっていた場合は、何もしない</li>
<li>5分でフラワーロックは眠ってしまうので、定期的(5分毎)に keepalive (というかwakeon) を ping する。（実際には「ポーン」とか「ピンポン」みたいな音を流す）</li>
</ul>


<h3>CC に組み込む</h3>

<p>
<a href="http://cruisecontrol.sourceforge.net/main/configxml.html#jabber">CC のプラグインjabber</a> があるので、それを使ってみます。</p>

<pre class="javascript">  &lt;project&gt;
    &lt;publishers&gt;
      :
      :
      &lt;jabber
          host=<span class="string" >"talk.google.com"</span>
          port=<span class="string" >"5223"</span>
          username=<span class="string" >"&lt;flower.sender@gmail.com&gt;"</span>
          password=<span class="string" >"&lt;flower.sender.password&gt;"</span>
          recipient=<span class="string" >"&lt;flower.receiver@gmail.com&gt;"</span>
          ssl=<span class="string" >"true"</span>
          buildresultsurl=<span class="string" >"true"</span>
      /&gt;
      :
      :
    &lt;/publishers&gt;
    :
    :
  &lt;/project&gt;</pre>

<p>ここで、注意しなければならないのは、&lt;onsuccess&gt;や&lt;onfailure&gt;で囲ってしまうと、送信されたメッセージをクライアント側で振り分けることができなくなってしまうので、とにかく全部のメッセージをクライアントに送ってしまうようにします。</p>

<h3>jabber メッセージを読み込んで音を流す</h3>

<p>僕は、ここの部分は手抜きしています。なぜなら最近のメッセンジャー的なものには、メッセージをフィルタリングしておくことが可能で、フィルタリングしたメッセージに応じてアクションを書くことも簡単にできるため。</p>

<p>ということで、<a href="http://kopete.kde.org/">Kopete</a>を使ってみるサンプルを置いておきます。</p>

<p>Kopete の「設定」から「プラグインの設定」へ<br />
その後「強調」より、フィルタリングすぐ文字列を設定（今回は「FAILED」）して、「サウンドの再生」よりBuild Failed な音楽を指定します。</p>

<p>
<a href="http://blog.xole.net/resources/kopete_settings_plugin.jpg">
<img src="http://blog.xole.net/resources/kopete_settings_plugin.jpg" />
</a>
<br />
ブラグインの設定へ 行き</p>

<p>
<a href="http://blog.xole.net/resources/kopete_blink_setup.jpg">
<img src="http://blog.xole.net/resources/kopete_blink_setup.jpg" />
</a>
<br />
failed になったときのサウンドを設定しておく</p>

<p>これで後は、CC が勝手にエラーになったらメッセージを流してくれます。failed になっている間はずっと音楽を流して、「エラーの舞」をフラワーロックに踊らせちゃいましょう。</p>

<h3>それ以外の方法</h3>
<p>実は、上のCCでメッセージを送信して、Kopete などで受信するという方法は、フラワーロックと少し相性が悪いです。<br />
なぜなら、フラワーロックは「5分間何もしないと、スリープする」という省電力設計。しかも復帰するには、On/Off ボタンを押さなければ復帰できない（音を流すだけでは復帰できない）ので、定期的に「起こして」あげる必要があります。</p>

<p>上記方法だと、ビルドにすごく時間がかかってしまって、CCが300秒に一回メッセージを流していたとしても、失敗してしまうことがあります。<br />
なので、今回は ruby スクリプトで、定期的にフラワーロックを起こしてあげる keepalived なスクリプトを投げやりに書きました。</p>

<p>メッセージを送信するヤツ</p>

<pre class="ruby">
<span class="comment" >#!/usr/bin/env ruby</span>

require <span class="string" >'rubygems'</span>
require <span class="string" >'xmpp4r'</span>
require <span class="string" >'kconv'</span>

<span class="keyword" >class</span> Message
    <span class="keyword" >def</span> initialize(user, password)
        <span class="variable" >@user</span> = user
        <span class="variable" >@password</span> = password
        <span class="variable" >@client</span> = <span class="keyword" >nil</span>
    <span class="keyword" >end</span>

    <span class="keyword" >def</span> connect(server, port)
        <span class="variable" >@client</span> = Jabber::Client.<span class="keyword" >new</span>(Jabber::JID.<span class="keyword" >new</span>(<span class="variable" >@user</span>))
        <span class="variable" >@client</span>.connect(server, port)
        <span class="variable" >@client</span>.auth(<span class="variable" >@password</span>)
    <span class="keyword" >end</span>

    <span class="keyword" >def</span> send(to, body)
        <span class="variable" >@client</span>.send(Jabber::Message.<span class="keyword" >new</span>(to, body))
        puts body._to_s + <span class="builtins" >Time</span>.now.to_s
    <span class="keyword" >end</span>

    attr_accessor <span class="symbol" >:user</span>, <span class="symbol" >:password</span>
<span class="keyword" >end</span>
</pre>


<p>yaml に色々設定を書いておく</p>
<pre class="ruby">
<span class="comment" >#</span>
<span class="comment" ># config.yml</span>
<span class="comment" >#</span>
<span class="comment" ># flowerrock:</span>
<span class="comment" >#   jabber:</span>
<span class="comment" >#     user: &lt;flower.sender@gmail.com&gt;</span>
<span class="comment" >#     password: &lt;flower.sender.password&gt;</span>
<span class="comment" >#     server: talk.google.com</span>
<span class="comment" >#     port: 5222</span>
<span class="comment" >#   post:</span>
<span class="comment" >#     members:</span>
<span class="comment" >#       - &lt;flower.receiver@gmail.com&gt;</span>
<span class="comment" >#       - &lt;hoge.foo.bar@gmail.com&gt;</span>
<span class="comment" >#   feed:</span>
<span class="comment" >#     urls:</span>
<span class="comment" >#       - http://hoge.foo.bar/rss</span>
<span class="comment" >#       - http://qwerty/rss</span>
<span class="comment" >#     interval: 250</span>
<span class="comment" >#</span>

config = YAML.load_file(<span class="builtins" >File</span>.dirname(<span class="builtins" >File</span>.expand_path(__FILE__)) + <span class="string" >'/config.yml'</span>)
settings = config[<span class="string" >'flowerrock'</span>]
jabber = settings[<span class="string" >'jabber'</span>]
post = settings[<span class="string" >'post'</span>]
feed = settings[<span class="string" >'feed'</span>]

user = jabber[<span class="string" >'user'</span>]
pass = jabber[<span class="string" >'password'</span>]
server = jabber[<span class="string" >'server'</span>]
port = jabber[<span class="string" >'port'</span>]

to_users = post[<span class="string" >'members'</span>]

feed_urls = feed[<span class="string" >'urls'</span>]
interval = feed[<span class="string" >'interval'</span>]</pre>


<p>RSS(cruisecontrol/rss)を読み込んで、メッセージを飛ばすヤツ</p>
<pre class="ruby">
<span class="comment" >#!/usr/bin/env ruby</span>

require <span class="string" >'rubygems'</span>
require <span class="string" >'yaml'</span>
require <span class="string" >'open-uri'</span>
require <span class="string" >'rexml/document'</span>

message = Message.new(user, pass)
message.connect(server, port)

loop do
    to_users.each{<span class="variable" >|user</span>|
        message.send(user, <span class="string" >'initialize...'</span>)
    }

    feed_urls.each{<span class="variable" >|feed</span>|
        page = open(feed)
        doc = REXML::Document.new(page)
        REXML::XPath.each(doc, <span class="string" >'//item'</span>) {<span class="variable" >|item</span>|
            REXML::XPath.each(item, <span class="string" >'description'</span>) {<span class="variable" >|desc</span>|
                if desc.text =? /FAILED/i
                    REXML::XPath.each(item, <span class="string" >'title'</span>) {<span class="variable" >|title</span>|
                        to_users.each{<span class="variable" >|user</span>|
                            message.send(user, title.text)
                        }
                    }
                end
            }
        }
    }
    to_users.<span class="keyword" >each</span>{<span class="variable" >|user</span>|
        message.send(user, <span class="string" >'end...'</span>)
    }
    sleep interval
<span class="keyword" >end</span>
</pre>

<p>ruby スクリプトは汚い。でも動いているうちは良しとする。</p>

<h3>CC と フラワーロック 2.0 を連携させる</h3>
<p>後は、PC のライン出力にコードをぶっ刺して、フラワーロックにつなぐだけ！<br />
ビルドに失敗しているときに、正しく「ビルド失敗の舞」をフラワーロックが踊ってくれれば OK</p>

<p>ちなみに、フラワーロックが持っている省電力機構のおかげで、夜中はCCを動かさない。とか、音を出さないようにするだけで、夜な夜なフラワーが踊ると言うことはないので、警備員さんにも安心設計！</p>

<p>ぜひ、あなたのプロジェクトの継続的インテグレーションの一貫として、フラワーロックを組み込んでみませんか？<br />
花が増えて、プロジェクトの和ませ役にピッタリの一台です！</p>

<h3>その他雑感</h3>
<p>ここ最近、海外のCC連携ガジェットを何個もみてきたけど、やっぱあっちのはwifiがついていたり、LEDがもう少し簡単に操作できたりと、面白いのが多い。<br />
フラワーロックはそれに比べると、ライン入力だけと言うシンプルなもの。もう少し弄れるようにすると、海外の市場でも売れるんじゃないかなぁ。ガジェット市場では特に。<br />
だって、変なウサギ（あえてリンクは張らないけど）が売れて、インターネットランプなんてものが売り出されるなら、フラワーロックはもっとイケるハズ！インタフェースがもう少し多ければ。だけど。</p>

<p>近いうちに <a href="http://www.arduino.cc/">Arduino</a> とかにも挑戦して見ようと思う。年末か年明けにでも。。</p>]]>
</content:encoded>
</item><item>
<title>PHP の self と parent に気をつけろ</title>
<link>http://blog.xole.net/article.php?id=716</link>
<pubDate>Sun, 16 Nov 2008 21:05:49 +09:00</pubDate>
<description>これまた、どうでもいいことシリーズ

php の self と parent は予約語ではないため、以下のようなことが行えます。

define('self', 123); 
var_dump(self); // int(123)...</description>
<content:encoded>
<![CDATA[<p>これまた、どうでもいいことシリーズ</p>

<p>php の <a href="http://jp2.php.net/reserved">self と parent は予約語ではない</a>ため、以下のようなことが行えます。</p>

<pre class="php">define(<span class="string" >'self'</span>, 123); 
var_dump(self); // int(123)

define(<span class="string" >'parent'</span>, 456);
var_dump(parent); <span class="comment" >// int(456)</span>
</pre>

<p>しかしながら、class 内でこれら <code>self</code>
<code>parent</code>を使っても問題なく利用できます。</p>

<pre class="php">define(<span class="string" >'self'</span>, <span class="string" >'Foo'</span>); 
                       
<span class="keyword" >class</span> Hoge {           
    <span class="keyword" >const</span> A = 123;     
    <span class="keyword" >static</span> <span class="keyword" >function</span> getA(){
        <span class="keyword" >return</span> self::A;
    }                  
}                      
                       
<span class="keyword" >class</span> Foo {            
    <span class="keyword" >const</span> A = 456;     
}                      
                       
var_dump(Hoge::getA()); //123</pre>

<p>ってか、これ正しく動いてるのだろうか...</p>

<pre class="php">
<span class="keyword" >class</span> Hoge {
    <span class="keyword" >static</span> <span class="keyword" >function</span> foo(){
        <span class="keyword" >return</span> <span class="keyword" >new</span> self;
    }
}

<span class="keyword" >class</span> Foo <span class="keyword" >extends</span> Hoge {
    <span class="keyword" >static</span> <span class="keyword" >function</span> bar(){
        <span class="keyword" >return</span> <span class="keyword" >new</span> parent;
    }
}

define(<span class="string" >'self'</span>, <span class="string" >'Foo'</span>);
define(<span class="string" >'parent'</span>, <span class="string" >'Foo'</span>);

<span class="vars" >$a</span> = spl_object_hash(Hoge::foo());
<span class="vars" >$b</span> = spl_object_hash(Foo::bar());
var_dump(<span class="vars" >$a</span>, <span class="vars" >$b</span>);

<span class="vars" >$a</span> = Hoge::foo();
<span class="vars" >$b</span> = Foo::bar();
var_dump(<span class="vars" >$a</span>, <span class="vars" >$b</span>);
var_dump(spl_object_hash(<span class="vars" >$a</span>), spl_object_hash(<span class="vars" >$b</span>));
</pre>

<p>結果としては</p>
<pre class="php">string(32) <span class="string" >"af5c83e899a2154cfdf3e4ff093419e7"</span>
string(32) <span class="string" >"af5c83e899a2154cfdf3e4ff093419e7"</span>
object(Hoge)#1 (0) {
}
object(Hoge)#2 (0) {
}
string(32) <span class="string" >"af5c83e899a2154cfdf3e4ff093419e7"</span>
string(32) <span class="string" >"2c04186690093c93e846c3dee1064aca"</span>
</pre>

<p>うーん。。。</p>

<ins>
<p>追記</p>

<p>ってか、最後のは<code>self</code>とかそういうの関係なかった。objectのhashを取るには一度ちゃんと変数に入れる必要があるんだね。</p>

<pre class="php">
<span class="keyword" >class</span> Hoge {                                    
    <span class="keyword" >static</span> <span class="keyword" >function</span> foo(){                      
        <span class="keyword" >return</span> <span class="keyword" >new</span> self;                        
    }                                           
}                                               
                                                
var_dump(spl_object_hash(Hoge::foo()), spl_object_hash(Hoge::foo()));
                                                
<span class="vars" >$a</span> = Hoge::foo();                               
<span class="vars" >$b</span> = Hoge::foo();                               
var_dump(spl_object_hash(<span class="vars" >$a</span>), spl_object_hash(<span class="vars" >$b</span>)); </pre>

<pre class="php">string(32) <span class="string" >"af5c83e899a2154cfdf3e4ff093419e7"</span>
string(32) <span class="string" >"af5c83e899a2154cfdf3e4ff093419e7"</span>
string(32) <span class="string" >"af5c83e899a2154cfdf3e4ff093419e7"</span>
string(32) <span class="string" >"2c04186690093c93e846c3dee1064aca"</span>
</pre>

<p>勉強になった。</p>
</ins>]]>
</content:encoded>
</item>
</channel>
</rss>