cocos2dxでの子要素の位置

例えばlabelの先頭にiconをつけたい場合、 labelの子要素としてimageをおいてpositionを調整しておけば、label側の文字数が変わろうともその先頭にiconをつけることができる。

私はこの挙動を最初理解できなかったのだが、以下のブログを見て間違っている点を把握できた。
http://site.oukasei.com/?p=1157

cocos2dxで親子関係にある要素を描画する際、子要素のpositionは親要素のpositonからの相対位置で指定される。
ではその相対位置の基準となるのはどこなのか?
答えは↑のブログにあるとおり原点(0,0)である。

私はanchor pointが使われていると思っていたため混乱したのだった。ahchor pointが(0.5, 0.5)で指定されていれば、labelの文字数が変わろうともiconの位置も変わらないはずではと。

子要素のpositionは親要素の原点を基準に決まるが正しい。

csvからsqliteのtable schemaを抽出する

以下のようなデータからsqliteのcreate table時に必要なカラム名と型名のリストを抽出したい
data.csvとしておく

columnA,columnB,columnC,...
INT,INT,INT,...
1,2,3,...
11,22,33,...
...

抽出したいのはこれ

columnA INT, columnB INT, columnC INT, ...

まず必要なheader部分を取り出して、転置して、それを一行にすればよさそう
今回はmac上で動けばよいので転置にはrsコマンドを利用

$ cat data.csv | head -n2 | tr , ' ' | rs -T | paste -s -d, -

しかしこれだとカラム数がとても多いデータの場合にうまくいかないことがわかった
試しに確認用のデータをrsで変換してみる

$ seq -s' ' 1 300 | rs -T
1 284
2 285
...
282
283

こんな結果になった。想定どおりなら300まで一行ずつになるはずが、283の後は2列目に表示された。
数を1000とかに大きくすると、283の行のところでまたさらに次の列に表示されるようになる。
調べてみるとどうやら283の3がちょうど1023文字目になっていることがわかった。おそらく210以上の文字を横に並べては処理できないようになっていると考えられる。なのでちょっと方法を変えることにした。

$ cat data.csv | head -n2 | tr , '\n' | rs -t 0 2 | paste -s -d, -

一度縦にすべてを並べてからそれをrsで2列に並べるよう指定した。これなら数を大きくしてみても欲しかった結果が得られた。
最初のdata.csvを変換してみると以下のような結果になる

columnA  INT,columnB  INT,columnC  INT

間の空白が気になる場合はpasteの後にsedで調整

sed -e 's/[[:space:]][[:space:]]*/ /g'

phpのexecでwrite error: Broken pipe

exec('ls | head -n1")

phpでこのようにしたら以下のエラーが出た

write error: Broken pipe

ただし処理自体は正しくできているようで、エラーが出るだけのよう

bashで同じように実行しても特にエラーは出ない ググってみるとこんなのがヒット https://stackoverflow.com/questions/11296809/how-to-avoid-ls-write-error-broken-pipe-with-php-exec どうやらpopenで開いたlsの出力を読み取らずに閉じることで同じエラーが出るとのこと

また、こんなページも http://qiita.com/kkdd/items/f9829af2fbb9c3c980da phpやlsに関係なく出力が長い場合にBloken pipeのエラーは出るよう

lsの出力を読み取りきらずにheadの処理が終わってしまった場合に、lsの出力先がなくなってこのようなエラーが出るものと推測される。私の環境だとbashでは出ないが、それはシグナルの処理をうまくやってくれているとかなのか。phpだとそのあたりの処理を途中で拾って何かやってるためにエラーになってしまうとか。

とりあえず2>/dev/nullをls側につけることでエラーは握りつぶせるかつ処理は正常に行われているのでよしとする。