2013年11月13日水曜日

WebGL Globeを利用した可視化実験

WebGL Globeはgoogleが作ったオープンソースの地理情報可視化プラットフォーム

本気で頑張るとこんなものも作れるらしい

とりあえず練習がてら、USGSのGeoJSONを可視化してみる。

ベースはwebgl globeのindex.html。
if(!Detector.webgl){Detector.addGetWebGLMessage();else {var container = document.getElementById('container');var globe = DAT.Globe(document.getElementById(‘container'), function(label) {return new THREE.Color([0x87e7b0,0x87e7b0,0x87e7b0,0x87e7b0,0xcbf299,0xfcd1d1,0xff2800,0x9a0079][label]);});var script = document.createElement('script');
script.src = 'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojsonp';document.getElementsByTagName('head')[0].appendChild(script);var eqfeed_callback = function(results){        var data = new Array();for (var i = 0; i < results.features.length; i++) {data.push(results.features[i].geometry['coordinates'][0]);data.push(results.features[i].geometry['coordinates'][1]);data.push(results.features[i].properties['mag']/30.0);data.push(Math.floor(results.features[i].properties['mag']));}globe.addData(data, {format: 'legend', name: 'earthquakes', animated: false});
globe.createPoints();globe.animate();document.body.style.backgroundImage = 'none'; // remove loading };}
こんな感じ。


いろいろと試してみよう!

2013年11月10日日曜日

RでSPARQL、結果はKML

RでSPARQLが使えないかと検索してみたら、あった。

パッケージ名はそのままのSPARQL。

さっそく、dbpedia.orgのEndpointを使ってテストしてみた。

クエリは以前に使った日本の都道府県の人口を検索するもの。

せっかくなので、検索結果はKMLで出力する。

Google Earthで表示してみると、こんな感じ。


ちょっとデータのウェブを使っている感じがある。

昨今のオープンデータをSPARQLで探してこれるようにすると、面白いかもしれない。(read.csv等で読みこめばいいのだけど、ファイル自体を探してこないといけない)

むかしExcelをRDFに変換して、SPARQLで検索、グラフで表示ということをやっていたけど、あの苦労が嘘のよう。

以下はRのソース。

library(SPARQL)
library("sp")
library("rgdal")
url<-"http://dbpedia.org/sparql"
query<-"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX yago: <http://dbpedia.org/class/yago/>
SELECT DISTINCT ?title ?lat ?lon ?populationTotal where{
?s rdf:type yago:PrefecturesOfJapan .
?s rdfs:label ?title .
? S dbpedia-owl: populationTotal ?populationTotal .
?s wgs84_pos:lat ?lat .
?s wgs84_pos:long ?lon .
filter langMatches(lang(?title),\"en\") .
}"
res<-SPARQL(url,query)
d<-res$result
coordinates(d)<-c('lon','lat')
proj4string(d)<-CRS("+init=epsg:2451")
writeOGR(d, dsn="hoge.kml", layer="sample", driver="KML")

2013年9月29日日曜日

ESXiでゲストOSのスナップショットを利用する

VMWare ESXではゲストOSのスナップショットを作成したり、復帰させたりが簡単にできる。

大きなシステム変更をする場合は、スナップショットを作成しておくと、安心して作業することができる。

以下、スナップショットの利用方法。

バージョンは以下のとおり。
~ # esxcli system version get
   Product: VMware ESXi
   Version: 5.1.0
   Build: Releasebuild-799733
   Update: 0

まずは、ゲストOSのvmidを確認する。
~ # vim-cmd vmsvc/getallvmsVmid     Name                    File                    Guest OS      Version   Annotation
16     ssh        [datastore1] ssh/ssh.vmx             rhel6Guest      vmx-07            
32     www        [datastore1] www/www.vmx             rhel6_64Guest   vmx-07            
48     db         [datastore1] db/db.vmx               rhel6_64Guest   vmx-07            
64     rdfstore   [datastore1] rdfstore/rdfstore.vmx   rhel6_64Guest   vmx-07            
80     ubuntu     [datastore1] ubuntu/ubuntu.vmx       ubuntuGuest     vmx-07            
81     db2        [datastore1] db2/db2.vmx             centos64Guest   vmx-09 
ゲストOSのスナップショットを作成するコマンド。

vim-cmd vmsvc/snapshot.create

~ # vim-cmd vmsvc/snapshot.create
Insufficient arguments.
Usage: snapshot.create vmid [snapshotName] [snapshotDescription] [includeMemory] [quiesced]
Creates a snapshot for the vm.

コマンドではsnapshotNameはオプションだけど省略すると失敗する。
~ # vim-cmd vmsvc/snapshot.create 16
Create Snapshot:
Create snapshot failed
なのでsnapshotNameを付けてスナップショットを作成する。

~ # vim-cmd vmsvc/snapshot.create 16 "ssh"
Create Snapshot:
作成したスナップショットを確認する。
~ # vim-cmd vmsvc/snapshot.get 16
Get Snapshot:
|-ROOT
--Snapshot Name        : ssh
--Snapshot Id        : 1
--Snapshot Desciption  :
--Snapshot Created On  : 9/25/2013 5:4:59
--Snapshot State       : powered off
スナップショットで復元する場合は以下のコマンドを使う。
~ # vim-cmd vmsvc/snapshot.revert
Insufficient arguments.
Usage: snapshot.revert vmid snapshotId suppressPowerOff
Revert to a snapshot on the vm.
スナップショットは差分だけとはいえディスク容量は食う。不要になったスナップショットは削除していったほうがいい。
~ # vim-cmd vmsvc/snapshot.remove
Insufficient arguments.
Usage: snapshot.remove vmid snapshotId [removeChildren]
Remove a snapshot on the vm.
スナップショットは階層状に管理される。ツリーにできるかどうかはまだ未確認。
~ # vim-cmd vmsvc/snapshot.create 16 "ssh"
Create Snapshot:
~ # vim-cmd vmsvc/snapshot.get 16
Get Snapshot:
|-ROOT
--Snapshot Name        : ssh
--Snapshot Id        : 1
--Snapshot Desciption  :
--Snapshot Created On  : 9/25/2013 5:4:59
--Snapshot State       : powered off
--|-CHILD
----Snapshot Name        : ssh
----Snapshot Id        : 2
----Snapshot Desciption  :
----Snapshot Created On  : 9/27/2013 23:22:10
----Snapshot State       : powered off
とりあえず便利な機能なので使ったほうがいい(反省も込めて)。

2013年8月29日木曜日

【Eclipse】XMLスキーマを利用したXMLデータの作成

EclipseのWeb Tools Platformに付いているXML編集機能を使うと、XMLスキーマを利用したXMLファイルの作成が相当楽になる。

まずは、ワークスペースに適当なXMLスキーマを読み込んでおく。今回はLIDO XML Schema(http://www.lido-schema.org/schema/v1.0/lido-v1.0.xsd)を利用した。

次に新規XMLファイルの作成を始める。

メニューからNew>Other...を選択して、


XMLXML Fileを選択し、Next>をクリックする。


 作成するXMLファイルの名前を決めてNext>をクリック

ここではXMLファイルの作成方法Create XML file from an XML schema fileを選択し、Next>をクリック
 ここではワークスペースからXML schema fileを選択し、Next>をクリックする。
 ルート要素を選択し(LIDOの場合はlidoWrap)、Finishをクリック。
するとrequiredな要素を含んだXMLファイルが作られる。あとは必要な箇所を追記・変更していくようにすればよい。

超簡単。

なお、読み込んだxml schemaを利用した入力補完も可能だ。
このようにEclipse+WTPを使えば簡単にXMLデータを作ることができる。

2013年6月22日土曜日

Rでアニメーション

Rのanimationライブラリを使ってみた.

plotで出力した画像をくつけてアニメーションにする.

こんな感じ,

library(animation)
f<-4
wave<-function(n){w<-0;t<-seq(0,1,0.01);for(k in 1:n){w<-w+sin((2*k-1)*2*pi*f*t)/(2*k-1)};w<-4/pi*w}
wave2<-function(x){for(n in 1:x){plot(x=seq(0,1,0.01),y=wave(n),type="l",main=paste("Square wave(n=",n,")"),xlab="Time(sec)",ylab="Amplitude")}}
saveMovie(wave2(30),interval=0.5,moviename="wave",movietype="gif",outdir=getwd(),width=640,height=480)

で,できたアニメーションはこちら.

グラフの変化をみせるにはいいツールだね.

2013年5月31日金曜日

RでKMLファイルを出力する

RとGoogle Earthを連携させることができるらしい.

検索してみると,縫村氏の「RとGoogle Earth を使った空間情報の可視化」と題したスライド資料を発見.

スライド資料ではRを使ってアメリカ地質調査所(USGS)の地震動データ(CSV)からKMLファイルを作成するやり方が紹介されていた.

こりゃ面白そうということで早速トライ.

DataFrameをSpatialPointsDataFrameに変換するところでハマったけど,proj4string(qk)<-CRS("+init=epsg:4326")とすることで解決.

無事,作成したKMLファイルをGoogle Earthに読み込ませることができました.

ちょっと見にくいけど,地震の発生箇所に目印が表示されています.


うーん.こんなことが簡単にできてしまうなんてよい世の中になったものです.

Google Earthの使い方がわかってきました.こりゃ迫力あるわー.

Rのコンソール出力は以下のとおり.

> library(sp)
> library(rgdal)
> qk<-read.csv("http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.csv")
> head(qk)
                      time latitude longitude  depth mag magType nst  gap
1 2013-05-31T13:40:41.000Z  60.6428 -147.5946   3.60 3.4      Ml  NA   NA
2 2013-05-31T13:40:28.000Z  61.5455 -148.6714  28.50 2.9      Ml  NA   NA
3 2013-05-31T13:25:55.190Z -28.2755 -178.6027 262.93 5.2      mb  46 66.0
4 2013-05-31T13:24:51.800Z  33.6878 -119.1308   0.40 3.1      Ml  24 75.6
5 2013-05-31T13:06:50.150Z -20.3071  169.0243  34.03 5.1      mb  57 53.0
6 2013-05-31T11:32:41.100Z  40.1692 -121.1097   0.00 3.1      Md  NA 46.8
       dmin  rms net         id                  updated
1        NA 1.02  ak ak10727802 2013-05-31T13:49:58.971Z
2        NA 1.12  ak ak10727799 2013-05-31T13:48:21.339Z
3 1.1300000 0.94  us usb000hacp 2013-05-31T13:50:51.623Z
4 0.2245788 0.23  ci ci15352009 2013-05-31T13:32:07.619Z
5 2.7200000 1.25  us usb000hacc 2013-05-31T13:42:49.516Z
6 0.2155957 0.38  nc nc72003416 2013-05-31T13:15:16.232Z
> coordinates(qk)<-c("latitude","longitude")
> class(qk)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"
> summary(qk)
Object of class SpatialPointsDataFrame
Coordinates:
                min      max
longitude -178.6027 169.0243
latitude   -28.2755  66.2616
Is projected: NA 
proj4string : [NA]
Number of points: 33
Data attributes:
                       time        depth             mag       
 2013-05-30T14:09:44.000Z: 1   Min.   :  0.00   Min.   :2.500  
 2013-05-30T14:38:25.650Z: 1   1st Qu.: 10.00   1st Qu.:3.000  
 2013-05-30T14:54:01.000Z: 1   Median : 28.50   Median :3.300  
 2013-05-30T17:46:40.000Z: 1   Mean   : 46.29   Mean   :3.739  
 2013-05-30T18:37:00.620Z: 1   3rd Qu.: 67.70   3rd Qu.:4.600  
 2013-05-30T20:41:29.000Z: 1   Max.   :262.93   Max.   :5.300  
 (Other)                 :27                                   
  magType        nst              gap             dmin         
 mb   :13   Min.   :  5.00   Min.   : 33.0   Min.   : 0.01797  
 mb_Lg: 1   1st Qu.: 16.00   1st Qu.: 75.6   1st Qu.: 0.73033  
 Md   : 6   Median : 28.00   Median :109.0   Median : 1.21000  
 Ml   :12   Mean   : 36.15   Mean   :136.1   Mean   : 3.43408  
 Mw   : 1   3rd Qu.: 46.50   3rd Qu.:174.1   3rd Qu.: 2.47250  
            Max.   :109.00   Max.   :324.0   Max.   :32.25000  
            NA's   :13       NA's   :9       NA's   :9         
      rms         net              id                         updated  
 Min.   :0.1200   ak: 9   ak10726951: 1   2013-05-30T14:22:58.908Z: 1  
 1st Qu.:0.3100   ci: 1   ak10727009: 1   2013-05-30T16:41:03.895Z: 1  
 Median :0.8200   hv: 1   ak10727095: 1   2013-05-30T16:56:39.447Z: 1  
 Mean   :0.7391   nc: 3   ak10727182: 1   2013-05-30T18:00:03.809Z: 1  
 3rd Qu.:1.0200   pr: 5   ak10727211: 1   2013-05-30T20:39:31.117Z: 1  
 Max.   :1.2900   us:14   ak10727538: 1   2013-05-30T22:47:39.888Z: 1  
                          (Other)   :27   (Other)                 :27  
> proj4string(qk)<-CRS("+init=epsg:4326")
> summary(qk)
Object of class SpatialPointsDataFrame
Coordinates:
                min      max
longitude -178.6027 169.0243
latitude   -28.2755  66.2616
Is projected: FALSE 
proj4string :
[+init=epsg:4326 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84
+towgs84=0,0,0]
Number of points: 33
Data attributes:
                       time        depth             mag       
 2013-05-30T14:09:44.000Z: 1   Min.   :  0.00   Min.   :2.500  
 2013-05-30T14:38:25.650Z: 1   1st Qu.: 10.00   1st Qu.:3.000  
 2013-05-30T14:54:01.000Z: 1   Median : 28.50   Median :3.300  
 2013-05-30T17:46:40.000Z: 1   Mean   : 46.29   Mean   :3.739  
 2013-05-30T18:37:00.620Z: 1   3rd Qu.: 67.70   3rd Qu.:4.600  
 2013-05-30T20:41:29.000Z: 1   Max.   :262.93   Max.   :5.300  
 (Other)                 :27                                   
  magType        nst              gap             dmin         
 mb   :13   Min.   :  5.00   Min.   : 33.0   Min.   : 0.01797  
 mb_Lg: 1   1st Qu.: 16.00   1st Qu.: 75.6   1st Qu.: 0.73033  
 Md   : 6   Median : 28.00   Median :109.0   Median : 1.21000  
 Ml   :12   Mean   : 36.15   Mean   :136.1   Mean   : 3.43408  
 Mw   : 1   3rd Qu.: 46.50   3rd Qu.:174.1   3rd Qu.: 2.47250  
            Max.   :109.00   Max.   :324.0   Max.   :32.25000  
            NA's   :13       NA's   :9       NA's   :9         
      rms         net              id                         updated  
 Min.   :0.1200   ak: 9   ak10726951: 1   2013-05-30T14:22:58.908Z: 1  
 1st Qu.:0.3100   ci: 1   ak10727009: 1   2013-05-30T16:41:03.895Z: 1  
 Median :0.8200   hv: 1   ak10727095: 1   2013-05-30T16:56:39.447Z: 1  
 Mean   :0.7391   nc: 3   ak10727182: 1   2013-05-30T18:00:03.809Z: 1  
 3rd Qu.:1.0200   pr: 5   ak10727211: 1   2013-05-30T20:39:31.117Z: 1  
 Max.   :1.2900   us:14   ak10727538: 1   2013-05-30T22:47:39.888Z: 1  
                          (Other)   :27   (Other)                 :27  
> writeOGR(qk, dsn="qk.kml", layer="sample", driver="KML")

2013年5月3日金曜日

Javaアプリを.Appとする

JavaアプリをMac OS Xの.appにする方法が解ったのでメモ.

結論から書くと,附属ツールの「Jar Bundler.app」を使えばよい.

ツールのインストール場所は以下のとおり.

$ open /usr/share/java/Tools/Jar\ Bundler.app

[Build Information]タブ

main classを選択する.アイコンの変更もここ.
 [Classpath and Files]タブ

Classpathの設定を行う.アプリ起動に必要なライブラリはここで追加する.

なお,jarファイル内のMETA-INF/MANIFEST.MFにあるClass-pathは参照しないようなのでライブラリバンドルなjarは展開して,ここのClasspathに追加する.
 [Properties]タブ

Heap memoryやvmオプションの指定はここ.
最後に[Create Application...]ボタンをクリックして,.appファイルを生成する.

以上でJavaアプリを.appとすることができる.

Launchpadにも登録できるはずだ.

最近javaの雲行きが怪しいことが気になるけど.


2013年4月29日月曜日

Processing + OpenCV

Mac OS XのProcessingでOpenCVを使おうとしてちょっと手間取ったのでメモ.

以下,インストール方法.

インストール方法


OSのバージョンは以下のとおり.
$ uname -a
Darwin macserver.local 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64



opencvはportでインストール.バージョンは2.4.5.
$ sudo port install opencv
$ sudo port list | grep opencv
Password:
opencv                         @2.4.5          graphics/opencv


processingにjavacvproライブラリをインストールする.

ダウンロードは下記URLから


最新バージョンは0.5.

インストールはシンプル.
展開したファイルをprocessingのlibrariesディレクトリにコピーする.

$ wget  http://www.mon-club-elec.fr/mes_downloads/javacvPro-0.5.zip
$ unzip javacvPro-0.5.zip
$ mv javacvPro ~/Document/Processing/libraries/
$ cd ~/Documents/Processing/libraries/


ライブラリのインストールはこれで完了だが,このままではopencvのバージョン違いによりエラーとなるので,javacvを入れ替える.

javacvライブラリ(https://code.google.com/p/javacv/)をコンパイルする.

$ wget --no-check-certificate https://javacv.googlecode.com/files/javacv-0.5-src.zip
$ unzip javacv-0.5-src.zip
$ cd javacv
$ sudo mvn -X instal


javacvproのライブラリと入れ替える.

$ cd ~/.m2/repository/com/googlecode/javacv/javacv/0.5
$ cp javacv-0.5-macosx-x86_64.jar ~/Documents/Processing/libraries/javacvPro/library/javacv-macosx-x86_64.jar 
$ cp javacv-0.5.jar ~/Documents/Processing/libraries/javacvPro/library/javacv.jar 


javacppも入れ替える.
$ cd ~/.m2/repository/com/googlecode/javacpp/javacpp/0.5
$ cp javacpp-0.5.jar ~/Documents/Processing/libraries/javacvPro/library/javacpp.jar 


これでjavacvProが動くようになる.


試しにサンプルを動かしてみる.

processingを起動し,[File]>[Examples]の順にメニューを開く.

[Contributed Librarires]の項目に[javacvPro]の項目が表示されるので,適当なものをダブルクリックし,スケッチを実行する.

ちなみに顔認識用学習データは「/opt/local/share/OpenCV」になるので,顔認識系のサンプルでは学習データのパスを書き換える.




トラブルシューティング

今回,遭遇したエラー.

まずは,processingを64bit modeにしなかった場合のエラー.opencvは64bitライブラリとしてコンパイルされるのでprocessingを32bitモードから64bitモードへと変更しておくこと.

Exception in thread "Animation Thread" java.lang.UnsatisfiedLinkError: no jniopencv_core in  java.library.path
 at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1758)
 at java.lang.Runtime.loadLibrary0(Runtime.java:823)
 at java.lang.System.loadLibrary(System.java:1045)
 at com.googlecode.javacpp.Loader.load(Loader.java:358)
 at com.googlecode.javacpp.Loader.load(Loader.java:285)
 at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:129)
 at monclubelec.javacvPro.OpenCV.<clinit>(Unknown Source)
 at javacvpro_exemple_cascade_detect.setup(javacvpro_exemple_cascade_detect.java:45)
 at processing.core.PApplet.handleDraw(PApplet.java:2241)
 at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
 at processing.core.PApplet.run(PApplet.java:2140)
 at java.lang.Thread.run(Thread.java:680)


つぎはjavacvライブラリを入れ替えない場合のエラー.「libopencv_core.2.3.dylib」が見つからないといっている.シンボリックリンクを用意するだけでもエラーは回避できたが,今回はライブラリをコンパイルし直した.

Exception in thread "Animation Thread" java.lang.UnsatisfiedLinkError:  /private/var/folders/yv/dgfgdbv51slf_rmgt8w497gm0000gn/T/libjniopencv_core395287537304450378.dylib:  Library not loaded: /opt/local/lib/libopencv_core.2.3.dylib   Referenced from:  /private/var/folders/yv/dgfgdbv51slf_rmgt8w497gm0000gn/T/libjniopencv_core395287537304450378.dylib   Reason: image not found
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1827)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1703)
at java.lang.Runtime.load0(Runtime.java:770)
at java.lang.System.load(System.java:1020)
at com.googlecode.javacpp.Loader.load(Loader.java:352)
at com.googlecode.javacpp.Loader.load(Loader.java:285)
at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:129)
at monclubelec.javacvPro.OpenCV.<clinit>(Unknown Source)
at sketch_130428a.setup(sketch_130428a.java:25)
at processing.core.PApplet.handleDraw(PApplet.java:2117)
at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:193)
at processing.core.PApplet.run(PApplet.java:2020)
at java.lang.Thread.run(Thread.java:680)


2013年3月23日土曜日

Zabbix導入

サーバ監視ソフトのZabbix(http://www.zabbix.com/jp/)を導入してみた.


エージェントやSNMP等を使って色々と監視できる.

監視項目はテンプレートを使って色々とカスタマイズできるもよう.


参考にしたのは2009年の@ITの記事(http://www.atmarkit.co.jp/ait/articles/0908/13/news062.html).
もう4年前・・・・.まあ気にしない.

インストールはPHPのオプション周りで少し手間取ったくらい(--with-jpeg-dir&--with-freetype-dirを--with-gdの前に書く件)で順調に完了.


マップ機能を使うとちゃんと監視してる感がでてきていい感じ.


使いこなせるようになるのはまだ先だけど協力なツールとなりそう.

2013年3月15日金曜日

MySQLの文字コードセット「utf8」と「utf8mb4」

 MySQLの文字コードセット「utf8」は3バイトまでのサポートで4バイトをサポートするのはMySQLバージョン5.5以降からサポートしている文字コードセット「utf8mb4」であるとのことを今更ながら知りました.

MySQL 5.0 Reference Manual > 10.1.10. Unicode Support
http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html
MySQL 5.5 Reference Manual > 10.1.10. Unicode Support
http://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html

簡単なコード(PHP)で動作検証してみました.

$conn=mysql_connect('192.168.0.5:3306','admin','password');

if($conn){
    if(mysql_select_db('test2',$conn)){
        $res=mysql_query('SET NAMES utf8',$conn);        
        if(!$res){
            print(mysql_error()."\n");
        }
        $res = mysql_query("DELETE FROM test");
        if(!$res){
            print(mysql_error()."\n");
        }
        $str="𪀚";
        printf("%s %d bytes\n",$str,strlen($str));
        var_dump(bin2hex($str));
        $res = mysql_query("INSERT INTO test (title) values ('".$str."') ",$conn);
        if(!$res){
            print(mysql_error()."\n");
        }
        $str2="田";
        printf("%s %d bytes\n",$str2,strlen($str2));
        var_dump(bin2hex($str2));
        $res = mysql_query("INSERT INTO test (title) values ('".$str2."') ",$conn);
        if(!$res){
            print(mysql_error()."\n");
        }
        $res=mysql_query('SELECT * FROM test',$conn);
        if($res){
            while($row = mysql_fetch_assoc($res)){
                printf("%s\n",$row['title']);
            }
            mysql_free_result($res);
        }else{
            print(mysql_error()."\n");
        }
    }
    mysql_close($conn);
}

コードでは2つの漢字「𪀚」(鳥+戎)と「田」をデータベースに登録し,検索表示しています.

MySQL 5.0.87の場合,
4バイトの文字があってもエラーは表示されません.
無視されるだけです.

$ php test.php
𪀚 4 bytes
string(8) "f0aa809a"
田 3 bytes
string(6) "e794b0"

また,当然「utf8mb4」はサポートしていませんので,使用しようとするとエラーとなります.

$ php mysql.php
Unknown character set: 'utf8mb4'
𪀚 4 bytes
string(8) "f0aa809a"
田 3 bytes
string(6) "e794b0"

MySQL 5.6.10の場合は4バイトの文字「𪀚」をutf8で登録しようとするとエラーとなります.
$ php test.php
𪀚 4 bytes
string(8) "f0aa809a"
Incorrect string value: '\xF0\xAA\x80\x9A' for column 'title' at row 1
田 3 bytes
string(6) "e794b0"
「utf8mb4」を使うと4バイトの文字をちゃんと登録することができます.
$ php test.php
𪀚 4 bytes
string(8) "f0aa809a"
田 3 bytes
string(6) "e794b0"
𪀚
この投稿では文字化けしてるけど.

4バイト文字を「utf8mb4」で登録できる事はわかったけど,5.0から5.5に移行するにはSQLの変更も必要そう.インデックスサイズも変更となるし.

取りあえず,そういう問題があることだけは把握しておこう.