XcodeのAssistant Editorが関係ないファイルを勝手に開いた時の対処法

Xcodeを使うときはAssistant Editorを表示させて使う派で、 メインの方に実装ファイル、アシスタント側にヘッダファイルを表示させるのがいつもの構成。

しかし、たまによくAssistant Editorが関係ないファイルを開いてくれて地味にイライラする。 ストレスが限界に達して調べてみたら、リセットすれば良かったらしい(対症療法だけど)。

[View] -> [Assistant Editor] -> [Reset Editor]
(⌘ + ⌥ + shift + z)

参考

http://stackoverflow.com/questions/29639866/xcode-6-3-shows-random-files-instead-of-counterparts-in-assistant-editor

Cocos2d-x(iOS)でRxCppを使うときにハマったメモ

v2.1.0を落としてきて、適当なパスにRxCppを置いて、Header Search Pathにそこを指定した。 その後、普通にビルドしたら通ると思ったけども次のエラーが出てダメだった。

thread-local storage is not supported for the current target

なにやら使えない機能を使おうとしているらしい。

ちょっと検索したら、RxCppのissueにそれっぽいのがあった。 https://github.com/Reactive-Extensions/RxCpp/issues/19

で、masterにはこの変更が入っているけど、releasesの最新であるv2.1.0には入っていなかったからコケていたらしい。 なので、ひとまずはmasterを使うと良さげ。

日付っぽい文字列をアレしたりepochをアレしたりするやつ

Pythonのリハビリがてら車輪の再発明をしてこんなのを書いた。 たまによく、変換するためにわざわざネットでやっていたから再発明した。

$ ./dt.py '2015-02-18 12:34:56'
1424230496
$ ./dt.py '2015-02-18'
1424185200
$ ./dt.py 1424230496
2015-02-18 12:34:56
$ echo "2015-02-18 12:34:56\n2001-07-04 16:07\nhoge\n2072-09-18" | ./dt.py
1424230496
994230420

3241350000
$ echo "1424230496\n994230422\n3241415231" | ./dt.py
2015-02-18 12:34:56
2001-07-04 16:07:02
2072-09-18 18:07:11

そーす

#!/usr/bin/env python

"""
Convert between epoch and datetime string

usage:
    dt.py
    dt.py <epoch_or_datetime>
    dt.py -h | --help

options:
    -h, --help  show this help message and exit
"""

import re
from sys import stdin
from time import localtime, mktime
from datetime import datetime
from docopt import docopt

def epoch2datetime(epoch):
    return datetime(*localtime(epoch)[:6])

def datetime2epoch(match):
    dtstr, space = match.group(0), match.group(1)
    dt = datetime.strptime(dtstr, _parse_format(dtstr, space))
    return int( mktime(dt.timetuple()) )

def _parse_format(dtstr, space):
    length = len(dtstr)
    if length < 13: return '%Y-%m-%d'
    if length < 16: return '%Y-%m-%d' + space + '%H'
    if length < 19: return '%Y-%m-%d' + space + '%H:%M'
    return '%Y-%m-%d' + space + '%H:%M:%S'

def process_line(line):
    match = re.match(r'^\d{4}-\d{2}-\d{2}(?:([T ])\d{2}(?::\d{2}(?::\d{2})?)?)?$', line)
    if match:
        print datetime2epoch(match)
    elif re.match(r'^\d+$', line):
        print epoch2datetime(int(line))
    else:
        print


if __name__ == '__main__':
    args = docopt(__doc__)
    if args['<epoch_or_datetime>']:
        process_line(args['<epoch_or_datetime>'])
    else:
        for line in stdin.readlines():
            process_line(line)

やったこと

  • docoptを使ってみた
  • 日付っぽい文字列を自分が使いそうなパターンで定義した
  • 標準入力から流せるようにした
  • 複数行に対応した
  • _parse_formatを1文で書こうと思ったけど失敗

感想

  • docopt、簡単に書けて便利
  • Pythonのdatetime周り、ちょっと使いにくい感ある
    • hoge2fugaのreturn行が苦しい
  • Pythonは比較的むちゃな書き方ができないなぁ、と再認識した
  • けっこうPython忘れていた
  • また自分用孫の手ツールを作りたい

CPANにモジュールを上げてみた

WebService::Slack::WebApiというモジュールをCPANに公開して、ついにCPAN Authorになった。

モジュールについて

アレな理由によりhubotのintegrationが使えず、(incomming webhooksもあるけど)せっかくだから生のAPIの方を弄ることに。 実態としては、APIの呼び出しをラッピングしているだけな、かなり適当なライブラリになった。

最初は各APIを1行目の感じで呼び出せるようにしようと思っていたけども、なんとなく、名前空間的な感じで分けたかったから2行目の感じにした。

my $result = $slack->chat_post_message('hoge');
my $result = $slack->chat->post_message('hoge');

最終的に、validationルールを記述するだけのモジュールが大量発生してしまい、冗長かなぁと思いつつもそのままにした。

モジュールを作る段階で学んだ点

あとで別の記事として書く予定。

  • Minillaを使ったモジュールスケルトンの作成・リリース
  • Travis CI, CoverallsをPerlで利用する方法

先週の土日に実装を、インフルにかかってからドキュメントとほぼ実態のないテストを整備した。 TravisもCoverallsも利用するのがすごく簡単なうえに、なんとも言えない楽しさを与えてくれることに気づいた。

ドキュメントに書いたのはクソみたいな拙い英語だけど、良い機会になった。 やはり書く練習をしないといつまでたってもダメだな、と思った(粉みかん)。

今後

この2つくらいはやる。

  • access tokenを取得する処理が欲しい
  • post_messageのattachmentsを良い感じにしたい

その後は、Real Time Messaging APIを扱う奴も書く予定。 Pythonで書き直してPythonリハビリもしたい…

cocos環境構築メモ

cocos自体のインストール

まずは本体を公式からダウンロード。 現時点で最新版のv3.3にした。

$ mkdir ~/lib
$ mv /path/to/cocos2d-x ~/lib/cocos2d-x
$ cd ~/lib/cocos2d-x
$ ./setup.py

こいつらは現状インストールしていないから全部スキップした。

Please enter the path of NDK_ROOT (or press Enter to skip):
Please enter the path of ANDROID_SDK_ROOT (or press Enter to skip):
Please enter the path of ANT_ROOT (or press Enter to skip):

下記の内容が(zshを使っていれば)~/.zshrcに書き込まれる。

# Add environment variable COCOS_CONSOLE_ROOT for cocos2d-x
export COCOS_CONSOLE_ROOT=/Users/mihyaeru/lib/cocos2d-x/tools/cocos2d-console/bin
export PATH=$COCOS_CONSOLE_ROOT:$PATH

# Add environment variable COCOS_X_ROOT for cocos2d-x
export COCOS_X_ROOT=/Users/mihyaeru/lib/cocos2d-x
export PATH=$COCOS_X_ROOT:$PATH

# Add environment variable COCOS_TEMPLATES_ROOT for cocos2d-x
export COCOS_TEMPLATES_ROOT=/Users/mihyaeru/lib/cocos2d-x/templates
export PATH=$COCOS_TEMPLATES_ROOT:$PATH

cocosコマンドが使えるようになる。

$ source ~/.zshrc
$ which cocos
/Users/mihyaeru/lib/cocos2d-x/tools/cocos2d-console/bin/cocos

お試しプロジェクト

新規プロジェクトを作成してみる。

$ cd ~/pj/cocos
$ cocos new FirstSample -p com.mihyaeru.first_sample -l cpp
Running command: new
> Copy template into /Users/mihyaeru/pj/cocos/FirstSample
> Copying cocos2d-x files...
> Rename project name from 'HelloCpp' to 'FirstSample'
> Replace the project name from 'HelloCpp' to 'FirstSample'
> Replace the project package name from 'org.cocos2dx.hellocpp' to 'com.mihyaeru.first_sample'
> Replace the mac bundle id from 'org.cocos2dx.hellocpp' to 'com.mihyaeru.first_sample'
> Replace the ios bundle id from 'org.cocos2dx.hellocpp' to 'com.mihyaeru.first_sample'

こんな構造(1階層目だけ)になっている。

FirstSample
├── CMakeLists.txt
├── Classes
├── Resources
├── cocos2d
├── proj.android
├── proj.ios_mac
├── proj.linux
├── proj.win32
├── proj.win8.1-universal
└── proj.wp8-xaml

このコマンドで(ビルドしつつ)起動できる。

cocos run -p ios

ここまでで、README.mdに書かれている内容の自分向けメモが終わり。

ソースを弄ってみる

Classes/HelloWorldScene.cpp内のHelloWorld::init()に次のコードを追加してみる。 ボタンを押すとHelloWorldのラベルがhogeに変わるだけのサンプル。

auto buttonItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", [label](Ref *sender) {
    label->setString("hoge");
});
buttonItem->setPosition(Vec2(200, 200));

auto buttonMenu = Menu::create(buttonItem, NULL);
buttonMenu->setPosition(Vec2::ZERO);
this->addChild(buttonMenu, 2);

とりあえず動かせたのでこの記事は終了。 Android版については今回は使用しないから割愛。

以降は...

昔のCocos2dの記憶を思い出しつつ、C++を頑張るぞい。