ctagsでheader fileが検索されない
c++のコーディングをした際、クラスやいくつかの関数に飛べないことに気づいた。 調べてみるとどうやら*.hに書いたものだけが当てはまる模様。
$ ctags --list-map | grep c++ C++ *.c++ *.cc *.cp *.cpp *.cxx *.h++ *.hh *.hp *.hpp *.hxx
ということでc++を指定した場合、*.hは読むべきファイルとして含まれていなかった。
なので以下のオプションを実行時に足す。ちなみに.ctagsに書いても適用されなかった。
--langmap=c++:+.h
調べてる途中でUniversal-ctagsというExuberant-ctagsの後継となるツールが開発されていることを知った。
http://docs.ctags.io/en/latest/index.html
まだ試していないが、こちらではc+11の文法などにも対応しているらしい。
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'