読者です 読者をやめる 読者になる 読者になる

tofucodes diary

にほんごのほう

Xcode8でも3rdpプラグインが使える件

oss xcode

サードパーティって長いので3rdp

tl:dr;

  1. XVim様様
  2. https://github.com/alcatraz/Alcatraz/issues/498
  3. Appleの思想に反するので責任は取れない(自己責任でお願いします)

経緯

ご存知の通りXcode8になってからサードパーティ製のプラグインが使えなくなった。

XcodeGhostというマルウェアが見つかったことが原因? http://researchcenter.paloaltonetworks.com/2015/09/more-details-on-the-xcodeghost-malware-and-affected-ios-apps/

By analysis, XcodeGhost also modified this file in Xcode to control the linker: Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/CoreBuildTasks.xcplugin/Contents/Resources/Ld.xcspec

In Xcode, this Ld.xcspec file contains configurations used by the ld linker. In the end of this file, the definition of the “DefaultValue” variable was changed by XcodeGhost by appending a string of: -force_load $(PLATFORM_DEVELOPER_SDK_DIR)/Library/Frameworks/CoreServices.framework/CoreServices

自分もAlcatrazやXVimやVVDocumenterと色々とお世話になっていたから使えなくなった途端開発効率落ちまくりで困った。(Xcode8からドキュメント機能がデフォルトで使えるようになっているの今日知った…)

けど良く考えたらXVimは公式のGithubでXcode8へのインストール方法示してるよなー。あれ?じゃあ他のプラグインもいけんのでは?と思ってやってみたらいけた。

方法

Alcatrazを例に

  1. XVimの公式Githubに記載してあるXcode8にインストールする方法の通りXcodeを自己証明書で署名し直す
  2. Alcatrazをインストールする
  3. (Xcode8.2使ってる場合は)AlcatrazのInfo.plistにXcode8.2のUUID追加する
  4. Xcodeを再起動して出てくるポップアップでLoad Bundle選択する

1. Xcodeの自己署名

MakeXcodeGr8Againというプロジェクトを利用すれば、これ1発でもいけるらしい(試してはない)。 MakeXcodeGr8Again = Make Xcode Great Again って名前が粋ですね。

$ export APP=/Applications/Xcode.app; curl -fsSL https://raw.githubusercontent.com/alanhamlett/MakeXcodeGr8Again/master/selfsign.sh | bash

参考:https://github.com/alcatraz/Alcatraz/issues/498#issuecomment-280546599

2. Alcatrazをインストールする

$ curl -fsSL https://raw.github.com/alcatraz/Alcatraz/master/Scripts/install.sh | sh

3. (Xcode8.2使ってる場合は)AlcatrazのInfo.plistにXcode8.2のUUID追加する

以下のコマンド1発で全プラグインのInfo.plistを更新できる。やってることはPlug-ins/下のInfo.plistを総なめしてXcode.app/Contents/Info.plistのDVTPlugInCompatibilityUUIDの配列を各プラグインのInfo.plistに上書きしてる。

$ find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I{} defaults write {} DVTPlugInCompatibilityUUIDs -array-add `defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID`

プラグイン側でXcode最新版のUUIDを入れてくれてればこの作業はいらないんだけど、まあプラグインはもう更新されないでしょうということで新しいプラグインをインストールする度に上記のコマンドを叩けばいいと思う。(ちなみにAlcatrazはXcode8.1までUUIDが登録されてたからXcode8.2のUUID登録のPR出しといた #511

参考:https://github.com/alcatraz/Alcatraz/issues/498#issuecomment-263507135

4. Xcodeを再度開いて出てくるポップアップでLoad Bundle選択する

以上でXcode8.2にAlcatrazが帰って来た!

とはいえ

セキュリティ的にプラグイン使うのはあまり良くなさそう。
XVimがXcode Source Editor Extensionで作り直されるの待とう。
https://github.com/XVimProject/XVim/issues/964

AWSでWordPressブログを開設しました

aws english

英語でブログ書きたいなと思ってWordPressで作りました。

markdownで書けることとコードのシンタックスハイライトが使えることあたりを判断材料にしてgithub.ioBloggerWordPressで迷ったんだけど

デザインのテーマがたくさんあって自由にできそうっていうのと、AWSを使ってみたくて、AWSでWorsPressのサイトを立ち上げる方法がウェブ上にたくさん公開されてたのが大きな決め手となった。

Amazonが公式にドキュメントまで用意してくれちゃってて至れり尽くせり。

WordPress ウェブサイトを構築する

やったこと

ドメインの購入

AWSドメイン購入するとDNSの設定まで一括でやってくれるみたいだったんだけどお名前.comのがちょっと安かったからお名前.comで購入。.netが1年間で755円だったので.netに決定。生まれて初めてのドメイン。感慨深い。

EC2のキーペアの登録(重要!)

マニュアルでは「キーペアを選択しないで起動」になってるから何も知らずに言われるがままブログ作ってったら後でsshできない罠に陥る。EC2のインスタンスを起動する前に作成してローカルに秘密鍵のダウンロードまでしておくといいと思う。

EC2インスタンスの起動

BitnamiというAMIを利用する。

DNSのネームサーバをRoute53に変更

ネームサーバはお名前.comで、WordPressをホストしてるサーバがAWSなのでこのままだとブログが見れない。tofucodes.netドメインAWSのサーバをつなぐ作業。この記事を参考にしました。

qiita.com

自分ここでけっこう躓いたので設定をチラリ。

Route53の設定https://i.gyazo.com/b02c5f98e63231ab95e322c395beaaf1.png

お名前.comの設定 https://i.gyazo.com/4f69a53232a0ec11066e65c26e80479b.png

Before

$ nslookup -type=ns tofucodes.net                                                                          [~]
;; Got recursion not available from 2404:1a8:7f01:b::3, trying next server
;; Got recursion not available from 2404:1a8:7f01:a::3, trying next server
Server:         192.168.1.1
Address:        192.168.1.1#53

Non-authoritative answer:
tofucodes.net      nameserver = dns2.onamae.com.
tofucodes.net      nameserver = dns1.onamae.com.

Authoritative answers can be found from:
dns2.onamae.com internet address = 163.44.76.150
dns1.onamae.com internet address = 163.44.76.136

After

$ nslookup -type=ns tofucodes.net                                                                          [~]
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
tofucodes.net      nameserver = ns-1431.awsdns-50.org.
tofucodes.net      nameserver = ns-2044.awsdns-63.co.uk.
tofucodes.net      nameserver = ns-476.awsdns-59.com.
tofucodes.net      nameserver = ns-722.awsdns-26.net.

Authoritative answers can be found from:

おまけ

Google Public DNS

Google Public DNSごいすー!
Macのシステム環境設定でDNSサーバに8.8.8.8設定したらnslookupですぐ見つけられた。

bitnamiのバナー消す方法

BitNamiのAMIでEC2のインスタンスを作るとWordPressのページの下の方にBitNamiのバナーが常時表示されてしまう。これ出っぱなしだとだいぶイケてないので消す方法です。

# ローカル
$ ssh -i ***.pem bitnami@ecX-XX-XX-XXX-XXX.compute-1.amazonaws.com

# EC2
$ sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1
$ sudo /opt/bitnami/ctlscript.sh restart apache

ということで

とりあえずはAWSの無料期間である1年間、英語ブログも更新していくのが目標。

追記

今の状態だとEC2インスタンス破棄した瞬間WordPressの設定もブログデータも全部ふっとぶからRDSとか使った方がいいのかな。やるなら今のうちだな…

生まれて初めて海外のエンジニアの求人に応募してみた

job english

先日stackoverflowでiOS Developerの募集をしている2件の求人に応募してみた。

1週間くらい時間をかけて英語でResume(CV)とCoverLetterを書いた。

作成にあたってはこのサイトを参考にした。

書きながら今の会社に就職してからの5年間を振り返ってみて、他の企業にとって価値のある技術を自分が提供できるのかけっこう悩んだ。

全くの未経験で新卒入社して、いろいろなプロジェクトにアサインされて、

PHP, MySQL, CoffeeScript, JavaScript, TypeScript, Objective-C, Swift, Rubyを使いいろいろな仕事をさせてもらったけど、

転職にあたってインパクトのある技術的な目玉商品みたいなものは持ってないと感じた。

プライベートでオープンソースにコントリビュートしてるわけでもないし。

つまり、アピールできる技術的トピックを5年間で何一つ手に入れられてなかったことに愕然とした。

それでもこの2年間はiOS開発に集中してきたし、iOSアプリは仕事で2つプライベートで1つリリースしたし、SDK(framework)も1から開発した経験があったから、iOS開発ではそれなりに役に立てる自負はあった。

書類選考くらいは通過できるかな?って淡い期待を抱いていた。

1週間後、応募した2件からお祈りメールが届いた。

6年ぶりに受け取ったお祈りメール。なんだか懐かしい。

コンピュータサイエンスの学士も持ってないし、オープンソースにも貢献してない、

そんな20代後半のエンジニアはどこからも必要とされない人間なんじゃないか。

絶望に打ちひしがれながら、明日からまた仕事だ。

2016年、振り返り

retrospective

2016年の目標振り返り

1つのサービスを上から下まで1人でつくる

未達成。作りたいサービスを思いついたので必要な機能を洗い出した後、MySQL workbenchでデータベース設計してる途中で終わってしまった。ぱっと思いついたアイデアEvernoteにメモしてあれやこれやと考える流れ(習慣)はできたが、実際に形にする段階でモチベーションが維持できてなかったのが問題かなと反省してる。1人でモノをつくる上で難しいところはやっぱりモチベーションなのかなと思った。。。

フィリピン留学する

達成。6月から7週間フィリピンに留学することができた。今回この目標が達成できたのは、「周りに宣言して逃げられない状況に自分を追い込む」ことが大きな要因だったと思う。

プライベートはイエスマンになる

未達成。やっぱりモチベーションが上がらない飲み会はある。

体脂肪率9.9%

未達成。2月からジムを契約して週2〜3回のペースで通ったが思ったように体型の変化は得られなかった。フィリピンから帰国時に10.8%くらいだった記憶だけどおそらくこの時がベスト。フィリピンで友達になった香港人から教えてもらったプランクが効果が高かったので、日本に帰国してからも続けたが腹筋が割れるまでには至らなかった。腹筋を割るにはまだ贅肉が多いのではと判断し、プランクを一旦辞め代謝を上げるために大きな筋肉から鍛えようと大胸筋、大腿四頭筋、広背筋を鍛えるメニューに変更した。2017年は今の筋トレを継続することに加え食事メニューも考えるようにしたい。

2017年の目標

お金の勉強をする

お金は将来エンジニアとしてでっかい金稼いでやるぜー、とか思って何にも考えずに生きてきたけど、会社で周りの人が株や不動産で資産運用をする人がけっこう多く、その人たちの話を聞いてると、お金の勉強をすることはお金自体を得ること以外にもプラスになることが多いのではないかなと思ったりするので、今年はお金の勉強を始める年にする。まずは積読してるこの本読む。

d.hatena.ne.jp

海外の企業に応募してみる

1月〜3月の間にできるだけたくさんの海外のスタートアップにエンジニアとしてアプライしてみる。アメリカ・ドイツのどちらかで働いてみたい。Facebookのエンジニアの求人も出るくらいだからstackoverflowの求人から応募してみようかなと。

stackoverflow.com

体脂肪率9.9%

朝ごはんはしっかり摂り、お昼ご飯は六本木の美味しいご飯を我慢できないので、夜ご飯を節制しながら週2~3回ジムでトレーニングをする。

2015年、振り返り

retrospective

あと6時間ほどで2015年が終わろうとしている。

ガキ使の笑ってはいけない名探偵が始まるまでの30分で2015年を振り返ってみる。(30分じゃ無理だった)

振り返り

  • 2015/01
  • 2015/03
    • 納期に間に合わせるため死ぬ思いでiOSアプリをリリースする(それでも1週間遅れた)
    • リリース翌日東京から逃れるように九州へいく
  • 2015/07
    • iOSアプリの主要機能だったEC機能がクローズになる
    • 広告の部署に異動になる
    • いろいろ鬱なことが重なり逃れるように沖縄へいく
    • 沖縄でダイビングのライセンスを取る
  • 2015/08
    • 26歳になる
  • 2015/09
    • 人生初のアメリカ上陸を果たす
    • サンフランシスコのFacebook本社のいいね!マークの前でいいねする
    • 英語を話せるようになりたいと本気で思い始める
  • 2015/10
    • 人生初のサーフィンに挑戦
    • しかし左足が変な方向に曲がり靭帯をめっさ痛める(まだリハビリ中
    • プライベートでiOSアプリをリリースする
    • 留学説明会に参加する
  • 2015/11
  • 2015/12
    • iOSアプリを担当していたサービスのクローズが決定する

所感

仕事ではiOSObjective-C, Swift)とRailsと新しい技術に触れることができた良い1年だった。 Railsはずっとやりたいと思ってて念願が叶ったものの、いざやってみるとコードを書く時間に比べて使ってるgemの理解に時間を取られてしまってあまり楽しくなかった。(作ってるサービス自体にあまり熱意が持てなかったのも問題だと思うが) 一方サーバ側の仕事はチームメンバーにほぼ任せっきりになってしまって自分の力にすることができなかったのが残念だった。来年はこのあたりの弱点を補う方向で技術力を伸ばしていきたい。

プライベートでは精神的にも身体的にもしんどい時期が多い1年だった。。 その瞬間瞬間はとても苦しいけど、今はどの決断も後悔してない。 中でも一番大きい決断だったと思うのは語学留学へ行く意思決定をしたこと。 なるべく多くの人に話して後戻りできないように自分を追い込んでるので必ずや実現させたい。 来年の年末に振り返ってみて、良かったと思える決断であったと信じてるし、そうなるように2016年突っ走りたい。

2016年やること

以下の4項目を2016年の目標として設定する。 2016年の年末に4つのうちいくつ達成できたか確認したい。

  • 1つのサービスを上から下まで1人でつくる
    • サーバ側が自分の弱みだから
  • フィリピン留学する
    • フィリピンの1on1学習で会話力を伸ばしたい
  • プライベートはイエスマンになる
    • 基本的に誘いを断らない姿勢で。自分から誘うと尚良し
  • 体脂肪率9.9%
    • そろそろ腹筋割りたい

Facebook iOS SDK でアプリ招待が動かなくてはまった話

ios swift

職場の仲間とマッチングサービスを作ってiOSアプリを担当しリリースしました。

簡単にサービスの概要を書くと、1日1回特定のエリア(恵比寿、六本木など)で開催される食事会にエントリーすることができ、同じエリアにエントリーしたユーザとマッチングさせる(ひと昔前に流行ったようなw)サービスです。

このアプリの中ではパートナーとなる友だちがいないとエントリーできない仕組みになっているため、Facebookのアプリ招待機能を実装することになりました。

iOS用のドキュメントに従い、App Link ToolでApp Linkを作成し、以下の実装で招待のダイアログを開きました。

  • Xcode: 7.2
  • FBSDK: 4.8.0
let content: FBSDKAppInviteContent = FBSDKAppInviteContent()
content.appLinkURL = "FacebookのAppLinkToolで作成したAppLink"
content.appInvitePreviewImageURL = "任意の画像URL"
FBSDKAppInviteDialog.showFromViewController(self, withContent: content, delegate: self)

ところがダイアログの中でユーザを選択して招待を送信してみたところ、被招待ユーザに肝心の招待通知が届きません。

何度もドキュメントと自分の実装を見直したり、ググって解決策を見つけようとしましたが、結局分からず諦めていました。

先日久しぶりに再度招待の実装してみるか、ということで調べ直してみたところ解決したので共有します。

上記のコメントでは以下のように言っています。

Also live App ID from iTunes Connect must be filled in in Facebook App settings

つまり、Facebookのアプリ設定でAppIDも埋まってる必要があるということです。

そこで自分のアプリを確認してみたところ、AppIDの欄はリリース以降更新しておらず空欄のままでした。

そこを埋めて実装は変えず、再度ダイアログから招待を実行してみたところ、無事被招待ユーザに招待通知が届きました。

f:id:tofucode:20151231171424j:plain

アプリの1stリリース時にFacebookログイン機能などを実装して(この時点ではまだAppIDが決まっていないため空欄になる)、リリース後にそのまま招待機能を実装しようとしたら同じような状況になる人がいるのではないかなと思います。(まさに僕がそのパターンでした。)

RubyのEnumeratorが理解できたような気がした話

ruby

仕事で先人のRubyのコードを見てたらEnumeratorというクラスが出てきました。

初見だったのでググってドキュメントを見てみたがよく分かりませんでした。

特に「遅延評価」てところがパッときませんでした。

(1..Float::INFINITY).map{ |n| n * 2 }.first(5)

=> 無限リストをループするためfirstまで実行されず処理が終わらない
(1..Float::INFINITY).first(5)

=> [1,2,3,4,5]

これが遅延評価(どん!)。

どうでしょうか?分かりましたか?

僕は上記ではよく分かりませんでしたが、Enumerator::Lazyを使って手元でコード書いてみてやっと理解できました。

まずはEnumerator::Lazyを使わない例。

[1,2,3,4,5].map do |item|
    p item
    item * 10
end.each do |num|
    p num
end

=> 1,2,3,4,5,10,20,30,40,50

次にEnumerator::Lazyを使った例。

[1,2,3,4,5].lazy.map do |item|
    p item
    item * 10
end.each do |num|
    p num
end

=> 1,10,2,20,3,30,4,40,5,50

こちらの記事を見て理解することができました。

Rubyist Magazine - 無限リストを map 可能にする Enumerable#lazy

あとから知ったんだけど、上記の記事の筆者はEnumerator#lazyの作者だそうな。