はてな記法の中のhttp記法が好きだ

はてな記法の中のhttp記法が好きです
http記法とは - はてなキーワード
1年前くらいにmarkdownで書けるリアルタイムプレビュー出来るメモ帳的なのを作ってた時に、このhttp記法をmarkdownの中に入れ混んでた
そこときは外部に公開するつもりなかったので雑な感じで作った
今回も雑な感じで作ってみた
javascript難しい…むりぽ…

動くデモ

github

henteko/hatena-httpjs · GitHub

こんなの

[url:title]とか[url:image]とか[url:barcode]って書くとなんかそれっぽいのになる
一番めんどくさかったのが自動でurlのタイトルを取ってくるところだった
ここを使わせてもらっている
タイトル取得API for JSONP | 駄文と書評

1年前は、自分でサーバー側にAPI作ってそれらしいのを作ってた
でも今回は全てjavascriptのみでやりたかったから使わせてもらった
ありがたい

さいごに

http記法、色々種類あるし追加していきたい

Travis CIからDeployGateにアップロードする

Travis CIでAndroidアプリをビルドしてDeployGateにアップロードします

使うもの

今回のサンプルプロジェクト

henteko/AssistHack · GitHub

gradle準備

普通にgradleでビルド出来るようにしたAndroidアプリのプロジェクトを用意します
そして、gradleでdeploygateに簡単に上げられるgradleプラグインがあるので詳しくはここを参照しながら準備して下さい
ここで重要なのが、deploygateを上げる際にtoken(api key)が必要なんだけど、これは公開してはいけないので、gradle.propertiesを使って外部化する(下のやつのmyToken部分)
今回はこのような形になった

travis準備

これ読んでる人なら大丈夫だと思う気がする
githubにプロジェクト上げてルートに.travis.ymlを生成する
.travis.ymlの中はここを参考にさせてもらった
最終的にこのような形になった

ここで重要なのがsecureの文字列
ここにはdeploygateのtokenを記述する
今回はgradleでmyTokenといったプロパティ変数名で読み込んでいるので、こんなコマンドでいける

$ gem install travis
$ travis encrypt ORG_GRADLE_PROJECT_myToken=<deploygateのtoken>

これで出力された文字列を.travis.ymlに書けば、travis内で以下のコマンドを実行したのと同じになる

$ export ORG_GRADLE_PROJECT_myToken=<deploygateのtoken>

ちなみに、ORG_GRADLE_PROJECT_<変数名>ってのを環境変数に加えると、自動でgradleがプロパティ変数化してくれる、便利

あとはgithubにpushするだけ

pushするだけでビルドが走って成功すれば自動でdeploygateにアップロードされます
便利

参照

Android Studio projectをTravis-CIでビルドする - Islands in the byte stream
Travis CI からHerokuへのデプロイを自動化してみた - アジャイルSEの憂鬱
Literal Ice: Gradleでプロパティなどの設定情報を外出しして切り替えて使う
Travis CI: Encryption keys DeployGate/gradle-deploygate-plugin · GitHub

選択中の文字をgoogle翻訳に投げるchrome拡張作った

作ったよ!

henteko/selectedGoogleTranslateChromeExtension · GitHub
いつも英語読めなくて辛いからgoogle翻訳を使ってるけど、いちいちgoogle検索でgoogle翻訳ってぐぐるの疲れた
ブックマークとかすればいいんだけど、なんかずっとしてなかった

要望として、文字を選択したらすぐgoogle翻訳にかけたかった
だから、選択したらgoogle翻訳に飛ばす拡張機能作ったらめっちゃ便利だった

こんなん

文字を選択する

f:id:henteko07:20140306210436p:plain

Ctr-h押す(翻訳のHだよ☆)
翻訳された

f:id:henteko07:20140306210526p:plain

さいごに

この拡張、webサイトでしか動作しない
もっと詳しく言うとbodyタグが無いと動作しない
英語論文をpdfでchromeで読んでる時にもgoogle翻訳に投げたい
どうやるのかわからない

追記

pdfでもbodyタグあった
pdfで選択中の文字が上手く取れない

iPhoneアプリをGradleでビルドしてDeployGateで自動配布する方法

iOSアプリをビルドする際に、普通だったらxcodeでボタンぽちぽちしてビルドして〜ってやると思います
このやり方だと、xcodeのUIがある日突然変わった時など、結構困りますよね(自分だけ?)
そんなとき、コマンドでビルドからその先まで出来たら簡単ってこと、あると思います!
ってことで今回はGradleでビルドからDeployGateにアップロードするまでを自動化してみたいと思います

DeployGateの準備

DeployGateがつい先日iOS対応しましたね
ただ、普通にアカウント作ってもipaファイルをアップロードすることは今の所出来ません
beta programというものに入るとアップロード出来るようになります
まだアカウント持ってない人やbeta programに入ってない方は先にやっておいて下さい
DeployGate - Beta Program

gradleの準備

まずは今回使うビルドシステムであるgradleを準備しないと始まりませんね
OSXだとhomebrewで入ります、入れましょう

$ brew install gradle

ちなみに、今だとgradle-1.10がインストールされました

build.gradleの準備

次に、ビルドしたいiOSアプリのプロジェクト直下にbuild.gradleファイルを作ります
こんな感じになりました
ちなみに、Testっていう名前のプロジェクトです

buildscript {
    repositories {
        maven {
            url('http://openbakery.org/repository/')
        }
        mavenCentral()
    }
    dependencies {
        classpath group: 'org.openbakery', name: 'xcodePlugin', version: '0.9.+'
        classpath 'com.deploygate:gradle:0.5'
    }
}
apply plugin: 'xcode'
apply plugin: 'deploygate'

xcodebuild {
    sdk = 'iphoneos'
    target = 'Test'
    scheme = 'Test'
    workspace = 'Test.xcworkspace' //cocoapodを使用している時のみ指定
    signing {
        identity = 'iPhone Distribution: NAME (...)' //キーチェーンアクセスの証明書に載っているのを書く
        mobileProvisionURI = 'file://localhost/(.mobileprovisionまでのfile path)' //プロジェクト直下にデベロッパーサイトからダウンロードしたTest.mobileprovisionを置いておくと便利
    }
}

deploygate {
    userName = 'deploygateのユーザー名'
    token = 'deploygateのapi token'

    apks {
        ios {
            sourceFile = file("ipaファイルまでのfile path")
            message = "message"
        }
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.10'
}

個別に詳しくはコメントで書いてあります

wrapperのダウンロード

用意したら、次にwrapperタスクを実行しましょう
これで他の人も同じバージョンのgradleを使用することが出来て便利ですね

$ gradle wrapper

以後は作成した./gradlewをgradleコマンドの変わりに使用します

ビルドの実行

さてビルドをしましょう!

$ ./gradlew codesign

これで問題なければipaファイルが作成されます!
そのfile pathをdeploygate内のsourceFileに書きましょう
これで以後、このように一発でDeployGateにアップロード出来ます

$ ./gradlew codesign uploadDeployGate

便利!!!!!!!!!!!!!!!!!!

おわりに

build.gradle内のコメントにも書いてありますが、テスト端末が増えて来てUDIDが増えてくると.mobileprovisionの管理が大変になってくる気がします
そんな時はプロジェクト直下に.mobileprovisionを置いておき、UDIDが増減して新しくなるたびに上書きして保存すれば常に一個で管理出来るので便利かなと思いました

あと、今回使った便利なgradleプラグインのgradle-xcodePluginにDeployGateも組込みたいですね

参考

openbakery/gradle-xcodePlugin · GitHub
DeployGate/gradle-deploygate-plugin · GitHub
Xcode - iPhoneアプリをmakeコマンド一発でビルドしてDeployGateで自動配布する方法 - Qiita
iOS - ipaファイル生成とDeployGateへのアップロードをXcode上で自動化する - Qiita

SSKeychainでNSDictionary形式で保存する方法

はじめに

OSX/iOSアプリを開発しててキーチェーンにパスワードとかを保存したいってなった
そのとき、パスワード一個だけとかならいいけどユーザー名とかも一緒に保存したかった
cocoapodsにSSKeychainっていう便利なライブラリがあったので、使ってみたけど普通に使うとパスワードはパスワード、ユーザー名はユーザー名といったように個別(serviceNameかaccountを変えて)に保存するしかないかなって感じだった
これでは、キーチェーンにアクセスする時に聞かれる承認ダイアログが個数分聞かれてしまうので不便
出来るなら一気に取り出したかった

NSDictionaryで保存出来た

どうやるのかなーってhttps://github.com/soffes/sskeychain/tree/master/Exampleとか見てみたけど実装が書いてない…みたいになった
しょうがないからテストを眺めてたら書いてあった
SSKeychainTests.mの43行目から

// set password to a dictionary
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithInteger:1], @"number",
                                @"4 8 15 16 23 42", @"string",
                                nil];
query.passwordObject = dictionary;
XCTAssertTrue([query save:&error], @"Unable to save item: %@", error);
    
// check password
query = [[SSKeychainQuery alloc] init];
query.service = kSSToolkitTestsServiceName;
query.account = kSSToolkitTestsAccountName;
query.passwordObject = nil;
XCTAssertTrue([query fetch:&error], @"Unable to fetch keychain item: %@", error);
XCTAssertEqualObjects(query.passwordObject, dictionary, @"Passwords were not equal");

保存と取り出しは上記の方法で簡単に出来た
あと削除も普通にこんな感じで行けた

[SSKeychain deletePasswordForService:kSSToolkitTestsServiceName account:kSSToolkitTestsAccountName];

すごい便利

Photo Hack Day Japanに参加したよ

参加した!

この前の土日にミクシィ社のオフィスで行ったPhoto Hack Day Japanってのに参加した!
Photo Hack Day Japan
なんか海外でやってたハッカソンらしいけど、今回日本初上陸したみたい
審査員とかに外人沢山居て英語が聴こえて来てここは本当に日本かって感じになってた
分かりやすい英語喋ってくれる人のは聴き取れたけど他の人のは何言ってるのか分からなかったしみんな笑った所でとりあえず「はっはっはっはっは」とか言ってた

うごうごってアプリを作ったよ!

うごうごってアプリを作って提出した!

f:id:henteko07:20140226214033p:plain

f:id:henteko07:20140226214121p:plain

元々Web版としてランダムウォークGifってのを作ってたんだけど、それのiOS/Androidアプリ版を作ってた
役割分担してて、iOS版は自分が作ってた
Androidは大学の先輩にあたるnuma08さんが、アイコンとかはtsuurooが、AWSの設定とかはknatzkrが担当した
結構作るの大変だったけど楽しかった
多分その内ストアに出すと思う

ミクシィ賞を貰ったよ!

作品提出したらAPI賞の中のミクシィ賞っての受賞した!
ミクシィのサービスのDeployGateってのを使っててそれで受賞出来た!
DeployGate - An incredibly easy way to deploy apps in development!
1年間Proプラン無料らしい!最高!総額にすると42000円相当だ!すごい!

おわり

ビールとか無料で飲めた
夜カラオケパセラって所に行って歌ったり開発したりしてたけど一人3000円くらい取られて高額カラオケ体験出来た

NSWindowControllerからNSViewControllerを呼ぶときにはまった

NSWindowControllerを継承した独自クラスからNSViewcontrollerを継承した独自クラスを呼び出すときに少しはまった

基本的にはこんな感じで書けばいいと思う

self.myViewController = [[MyViewController alloc] initWithNibName:@"MyView" bundle:nil];
self.myViewController.representedObject = self;
    
NSView *myView = self.myViewController.view;
myView.frame = self.mainCustomView.frame;
[myView setFrameOrigin:NSZeroPoint];
[self.mainCustomView addSubview:myView];

この時、self.myViewController.viewがnullになってしまい、window内のcustom viewにviewが表示されなかった
そんな時はインターフェースビルダーでFile's OwnerをCtrで選択して対象のviewに接続する必要があった

f:id:henteko07:20140224152155p:plain

これでviewを選択したら関連づけされた

参考

iphone - "loaded nib but the view outlet was not set" exception - Stack Overflow
Xcode:開発途中からIB(xibファイル)を追加する | www.sirochro.com