AWSでWordPressブログを開設しました
英語でブログ書きたいなと思ってWordPressで作りました。
markdownで書けることとコードのシンタックスハイライトが使えることあたりを判断材料にしてgithub.ioかBloggerかWordPressで迷ったんだけど
デザインのテーマがたくさんあって自由にできそうっていうのと、AWSを使ってみたくて、AWSでWorsPressのサイトを立ち上げる方法がウェブ上にたくさん公開されてたのが大きな決め手となった。
Amazonが公式にドキュメントまで用意してくれちゃってて至れり尽くせり。
やったこと
ドメインの購入
AWSでドメイン購入するとDNSの設定まで一括でやってくれるみたいだったんだけどお名前.comのがちょっと安かったからお名前.comで購入。.netが1年間で755円だったので.netに決定。生まれて初めてのドメイン。感慨深い。
EC2のキーペアの登録(重要!)
マニュアルでは「キーペアを選択しないで起動」になってるから何も知らずに言われるがままブログ作ってったら後でsshできない罠に陥る。EC2のインスタンスを起動する前に作成してローカルに秘密鍵のダウンロードまでしておくといいと思う。
EC2インスタンスの起動
BitnamiというAMIを利用する。
DNSのネームサーバをRoute53に変更
ネームサーバはお名前.comで、WordPressをホストしてるサーバがAWSなのでこのままだとブログが見れない。tofucodes.net
のドメインとAWSのサーバをつなぐ作業。この記事を参考にしました。
自分ここでけっこう躓いたので設定をチラリ。
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とか使った方がいいのかな。やるなら今のうちだな…
生まれて初めて海外のエンジニアの求人に応募してみた
先日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年、振り返り
2016年の目標振り返り
1つのサービスを上から下まで1人でつくる
未達成。作りたいサービスを思いついたので必要な機能を洗い出した後、MySQL workbenchでデータベース設計してる途中で終わってしまった。ぱっと思いついたアイデアをEvernoteにメモしてあれやこれやと考える流れ(習慣)はできたが、実際に形にする段階でモチベーションが維持できてなかったのが問題かなと反省してる。1人でモノをつくる上で難しいところはやっぱりモチベーションなのかなと思った。。。
フィリピン留学する
達成。6月から7週間フィリピンに留学することができた。今回この目標が達成できたのは、「周りに宣言して逃げられない状況に自分を追い込む」ことが大きな要因だったと思う。
プライベートはイエスマンになる
未達成。やっぱりモチベーションが上がらない飲み会はある。
体脂肪率9.9%
未達成。2月からジムを契約して週2〜3回のペースで通ったが思ったように体型の変化は得られなかった。フィリピンから帰国時に10.8%くらいだった記憶だけどおそらくこの時がベスト。フィリピンで友達になった香港人から教えてもらったプランクが効果が高かったので、日本に帰国してからも続けたが腹筋が割れるまでには至らなかった。腹筋を割るにはまだ贅肉が多いのではと判断し、プランクを一旦辞め代謝を上げるために大きな筋肉から鍛えようと大胸筋、大腿四頭筋、広背筋を鍛えるメニューに変更した。2017年は今の筋トレを継続することに加え食事メニューも考えるようにしたい。
2017年の目標
お金の勉強をする
お金は将来エンジニアとしてでっかい金稼いでやるぜー、とか思って何にも考えずに生きてきたけど、会社で周りの人が株や不動産で資産運用をする人がけっこう多く、その人たちの話を聞いてると、お金の勉強をすることはお金自体を得ること以外にもプラスになることが多いのではないかなと思ったりするので、今年はお金の勉強を始める年にする。まずは積読してるこの本読む。
海外の企業に応募してみる
1月〜3月の間にできるだけたくさんの海外のスタートアップにエンジニアとしてアプライしてみる。アメリカ・ドイツのどちらかで働いてみたい。Facebookのエンジニアの求人も出るくらいだからstackoverflowの求人から応募してみようかなと。
体脂肪率9.9%
朝ごはんはしっかり摂り、お昼ご飯は六本木の美味しいご飯を我慢できないので、夜ご飯を節制しながら週2~3回ジムでトレーニングをする。
2015年、振り返り
あと6時間ほどで2015年が終わろうとしている。
ガキ使の笑ってはいけない名探偵が始まるまでの30分で2015年を振り返ってみる。(30分じゃ無理だった)
振り返り
- 2015/01
- 仕事で初めてObjective-Cを使いiOSアプリを開発する
- 2015/03
- 納期に間に合わせるため死ぬ思いでiOSアプリをリリースする(それでも1週間遅れた)
- リリース翌日東京から逃れるように九州へいく
- 2015/07
- iOSアプリの主要機能だったEC機能がクローズになる
- 広告の部署に異動になる
- いろいろ鬱なことが重なり逃れるように沖縄へいく
- 沖縄でダイビングのライセンスを取る
- 2015/08
- 26歳になる
- 2015/09
- 人生初のアメリカ上陸を果たす
- サンフランシスコのFacebook本社のいいね!マークの前でいいねする
- 英語を話せるようになりたいと本気で思い始める
- 2015/10
- 2015/11
- 節約のため、お弁当男子になる
- 英語の学習のために観た「塔の上のラプンツェル」に感動する
- 2015/12
- iOSアプリを担当していたサービスのクローズが決定する
所感
仕事ではiOS(Objective-C, Swift)とRailsと新しい技術に触れることができた良い1年だった。 Railsはずっとやりたいと思ってて念願が叶ったものの、いざやってみるとコードを書く時間に比べて使ってるgemの理解に時間を取られてしまってあまり楽しくなかった。(作ってるサービス自体にあまり熱意が持てなかったのも問題だと思うが) 一方サーバ側の仕事はチームメンバーにほぼ任せっきりになってしまって自分の力にすることができなかったのが残念だった。来年はこのあたりの弱点を補う方向で技術力を伸ばしていきたい。
プライベートでは精神的にも身体的にもしんどい時期が多い1年だった。。 その瞬間瞬間はとても苦しいけど、今はどの決断も後悔してない。 中でも一番大きい決断だったと思うのは語学留学へ行く意思決定をしたこと。 なるべく多くの人に話して後戻りできないように自分を追い込んでるので必ずや実現させたい。 来年の年末に振り返ってみて、良かったと思える決断であったと信じてるし、そうなるように2016年突っ走りたい。
2016年やること
以下の4項目を2016年の目標として設定する。 2016年の年末に4つのうちいくつ達成できたか確認したい。
Facebook iOS SDK でアプリ招待が動かなくてはまった話
職場の仲間とマッチングサービスを作って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の欄はリリース以降更新しておらず空欄のままでした。
そこを埋めて実装は変えず、再度ダイアログから招待を実行してみたところ、無事被招待ユーザに招待通知が届きました。
アプリの1stリリース時にFacebookログイン機能などを実装して(この時点ではまだAppIDが決まっていないため空欄になる)、リリース後にそのまま招待機能を実装しようとしたら同じような状況になる人がいるのではないかなと思います。(まさに僕がそのパターンでした。)
RubyのEnumeratorが理解できたような気がした話
仕事で先人の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の作者だそうな。
CloudWatchでSNSのメトリクス取得につまずいた話
SNSの通知の成功数・失敗数を集計したかったんです。
前任者のコードを見てみたら
// SNSは通知の成功数・失敗数が分からないため0を入れておく
とコメントがあったんだけどそんなことはなくw
CloudWatchでSNSのメトリクスを見ればちゃんと確認できました。
SNSはPush通知で使っているため、iOSとAndroidそれぞれの通知成功数・失敗数が取得したかったのですが
ディメンションでPlatformを指定してもどうにも取得できない。
Amazon Simple Notification Service は以下のディメンションを CloudWatch に送信します。
上記リンクにもこう書いてあるのに…。
でなぜ取得できなかったのか結論から言うと、SNSのTopicを使ってPush通知を送っていたから、でした。
以下は取得できるメトリクスをAWS-CLIで確認した結果です。
TopicNameの方は取れてますが、Platformの方は取れてませんね。
$ aws cloudwatch list-metrics --namespace 'AWS/SNS' --dimensions "Name=TopicName,Value=トピック名" { "Metrics": [ { "Namespace": "AWS/SNS", "Dimensions": [ { "Name": "TopicName", "Value": "トピック名" } ], "MetricName": "DwellTime" }, (省略) ] }
$ aws cloudwatch list-metrics --namespace 'AWS/SNS' --dimensions "Name=Platform,Value=APNS" { "Metrics": [] }
試しにTopicではなくSNSのApplicationに対して通知をしてみたところ、Topicメトリクス以外のフィルタについても確認することができました。
AWSコンソールの表示も以下のように変わりました。
before
after