iOS アプリのバージョンをインクリメントするためのスクリプト

iOS アプリをストアにリリースする時にはバージョン番号を上げる作業が必ず発生する。その際に Info.plist を手作業で更新するのは手間だしミスが発生する余地があるので、 Pythonスクリプトを使って自動化している。以下のスクリプトを アプリのプロジェクト直下に配置し、実行する。 Python 2.7 でも 3 系でも動作する。

This script bumps iOS app version numbers. (Python ...

調べていたら Fastlane にも increment_version_number というコマンドがあったので、CI に導入する場合はこちらを使うのも良いかもしれない。バージョンのインクリメントに限らずアプリ開発で面倒な作業はなるべく自動化していきたい。

アメリカで契約したAT&TのSIMを解約するために国際電話をかけた話

tl;dr

アメリカで契約した AT&T の SIM を解約するために、AT&Tのカスタマーサポートに国際電話をかけた。自身のアカウントを認証するために、氏名、電話番号、 SIM カードの No. が必要だった。

顚末

昨年 WWDC で渡米した際に現地で AT&T の SIM を契約した。しかし解除したと思われていた自動引き落としがキャンセルされておらず、毎月 4,500 円程度の引き落としが半年間かかっていた・・・。完全に自業自得で気づかないのもどうかしているが、そんなわけで慌ててキャンセル方法を調べた。Web で AT&T のアカウントを管理する仕組みがあるのだが、店舗で行った初回パスワードの設定に失敗しており、ログインすることができない。パスワードリセットの仕組みはあるものの、その方法は SIM に紐づく電話番号にショートメッセージで新しいパスワードを送信するというもの。つまりアメリカ国内でないとショートメッセージを受け取れない。詰んだ。困り果ててどうにか解約する方法を調べていたが、チャットを使ったオンラインサポートがあること、カスタマーサポートに電話をすれば解約できるはずということを Quora で教えてもらい、それぞれ試してみることにした。

チャット

国際電話を掛けるのはお金がかかるし英語でのやり取りがしんどそうだったので最初はチャットで問い合わせをすることにした。日本とアメリカの時差を調べて出勤前の時間にチャレンジした。ウインドウを開くとすぐに会話が始まり、氏名と電話番号からこちらのアカウントをチェックしてくれた。先に質問文を作っておいたこともあり、やりとりはスムーズだった。

こういうやつ http://i.imgur.com/FLkFD7v.png

しかし、プリペイドSIMについてはチャットサポートの対象ではないと言われてしまい、案内してもらった電話で直接話をすることになった。

カスタマーサービスとの電話

教えてもらった番号に電話をかけるとすぐに繋がった。日本の銀行などの窓口とほとんど変わらない。2, 3 分無機質な宣伝メッセージを聞いた後にオペレータと電話が繋がった。チャットの時と同じ質問を投げかけて自分の状況を伝えることはできたが、当該番号が自身のアカウントだと証明するのに四苦八苦した。対応は親切でこちらの拙い英語に根気強く付き合ってくれた。最終的に "successfully caceled" という言葉を聞いた時には安堵した。

終わりに

今回初めて電話越しに英語で会話したが、自分は電話口の英語が全然理解できないということが分かった。相手の表情や身振り手振りがないこと、相手がこちらが理解できているかを分からないので要件を繰り返し述べることしかできないことが原因なのかなと思う。こちらが言ったことが相手にちゃんと伝わっているのかどうかも分かりづらかった。 これを機に時間を作って英会話の練習もしたいと感じた。だいぶ高い授業料を払ったが良い経験になった。

iOS で opencv_contrib のモジュールを使う

iOSopencv_contrib のモジュールを使う方法を調べた。 OpenCV 本体を使いたければ Cocoapods でビルドするだけだが、opencv_contrib に含まれている拡張モジュールを使う場合、opencv2.framework をゼロからビルドして、それをプロジェクトに追加する必要があった。

環境

手順

ソースコードのダウンロード

以下のURLからソースコードをダウンロードして、任意の作業ディレクトリに解凍する

ディレクトリ構成は以下のようになる

my_working_directory
├── opencv-3.4.5
│   ├── 3rdparty
│   ├── CMakeLists.txt
│   ├── CONTRIBUTING.md
│   ├── LICENSE
│   ├── README.md
│   ├── apps
│   ├── cmake
│   ├── data
│   ├── doc
│   ├── include
│   ├── modules
│   ├── platforms
│   └── samples
├── opencv-3.4.5.zip
├── opencv_contrib-3.4.5
│   ├── CONTRIBUTING.md
│   ├── LICENSE
│   ├── README.md
│   ├── doc
│   ├── modules
│   └── samples
└── opencv_contrib-3.4.5.zip

ビルド

作業ディレクトリで以下のコマンドを実行

$ python ./opencv-3.4.5/platforms/ios/build_framework.py ios --contrib ./opencv_contrib-3.4.5

Python のバージョンに注意

Mac にプリインストールされている Python 2.7 を使っていれば特に問題ないが、もし Python 3 を使用している場合ビルドが失敗する。pyenv を使うなどして python コマンドが Python 2.7 を参照するように設定する。

CMake のバージョンに注意

Python 2.7 で再ビルドしたら以下のエラーが出てビルドが失敗した。

error: Build input file cannot be found: '/Users/foo/Documents/my_working_directory/ios/build/build-armv7-iphoneos/modules/world/opencl_kernels_video.cpp'

ググってみると CMake のバージョンが古いことに起因するビルドエラーの issue が立っていた。

Unable to build framework for iOS · Issue #12646 · opencv/opencv

以下のコマンドで CMake のバージョンを確認できる。

$ cmake --version
cmake version 3.11.3

これが原因のようなので Homebrew で CMake のをアップデートする。

$ brew upgrade cmake
$ cmake --version
cmake version 3.13.2

ビルド成功

再ビルドを行う。

各デバイスのCPUアーキテクチャ向けにそれぞれバイナリをビルドするので、それなりの時間がかかる。

ビルドが成功すると作業ディレクトリ直下に ios/opencv2.framework が出来る。

opencv2.framework/Headers を参照すると、 opencv_contrib のモジュールも含まれていることが分かる。あとはビルドした opencv2.framework をプロジェクトにコピーすれば、C++ のファイルから opencv_contrib のモジュールを参照できる。

framework を iOS のプロジェクトに追加する方法と C++ のコードを Swift のプロジェクトから参照する方法は他に沢山の記事があるので割愛する。

所感

Python 3 が大多数となった現在でも OpenCV のビルドツールは Python 2.7 のままだった。 以前触れた Swift コンパイラのビルドツールも Python 2.7 だった。普段使いの Python が 3 系でも、歴史あるツールを Python でビルドする機会がある場合は pyenv や virtualenv でクリーンな作業環境を維持すると良さそう。

2018年のふりかえり

年が明けてそろそろ一週間経とうとしているが年末書けなかったのでざっとふりかえる。

アウトプット

ブログ

大小合わせて 15 個記事を書いた。考えたことを文章にすることで抽象化する練習やアウトプットへの心理的な障壁を下げたい気持ちがあり、少しは目的を果たせた。 Qiita にも申し訳程度に投稿した。

OSS

try! Swift San Jose で Swift コンパイラにコントリビュート出来たのは嬉しかった。今年前半は言語処理系を勉強していて GNU 開発ツール を読んだり、Go言語でつくるインタプリタ を写経したり、言語処理系と以前より仲良くなれた1年だった。

WWDC

今年初めて参加した。とても良かった。沢山刺激を受けたし、現地で多くのエンジニアと交流できたのも良かった。WWDC をきっかけにあらためて英語の必要性を感じて、今年後半は TOEIC の勉強をした。

仕事

iOS エンジニアとしてアプリ全般を広く見ていた。CI/CD, ユニットテスト周りは得意分野と認識していて、ザクザクと環境を整えた。ただ事業貢献という意味で価値創出できているのかと悩むこともあり、来年は iOS に閉じずに新しい機会を作りたいと思っている。

自作キーボード

夏に一目惚れして購入した Mint60 を年末に組み立てた。出来上がったものを使うのも楽しいが、組み立てる工程自体がとても楽しく、これは新しい趣味になるのではないかという予感すらしている。来年は Iris Keyboard を作りたいと密かに思っている。

とりとめなくなったがこんなかんじで。

iOS エンジニアが TOEIC 895点 取るためにやったこと

この記事は Classi Advent Calendar 2018 の 4日目の記事です。

今年の6月に WWDC18 に参加するために渡米したのをきっかけに、英語の勉強を始めた。 しばらくして10月に受けた TOEIC で895点取ることができたので、どんなことをしてきたかを振り返る。

自分の英語力

  • 留学、海外就労の経験なし
  • 大学時代に最後に受けた TOEIC が700点台

WWDC から帰国後、十数年ぶりに受けた7月の TOEIC が785点だった。それからどんなことをしたか、というのがここからの話です。

tl;dr

3行でまとめると、こんなかんじだと思う。

  • TOEIC の点を取りたいから TOEIC の勉強をする
  • 自分が理解できるレベルの英語に触れる
  • 楽しく続けられることを毎日やる

TOEIC 対策について

当たり前と言われそうだが、TOEIC で点を取りたいなら TOEIC のための勉強をするのが手っ取り早かった。TOEIC の問題には決まったパターンと解き方があり出題される単語が決まっている。7月の受験時にリーディング、特に語彙力が足りないことが分かったので、2ヶ月くらいその対策をやった。 TOEIC の学習は英語自体の勉強になるし良い動機付けになったと思う。

f:id:enmtknt:20181122143452p:plain
7月の結果より

TOEIC 向けの学習として取り組んだこと

この単語帳は多分 TOEIC 対策の定番なのだけど、良いところが1つあって、 abceed という無料のアプリと連携している。これを使うと音声を聴きながら勉強することができる。通勤時間や、風呂の中でシャドーイングをして単語に慣れていった。 学生時代から暗記モノが本当に苦手でうまくいった試しがなかったので、このアプリで勉強してよかった。

TOEIC対策アプリ abceed

TOEIC対策アプリ abceed

  • Globee.Inc
  • 教育
  • 無料

TOEIC(R)テスト 新形式精選模試 リーディング

TOEIC(R)テスト 新形式精選模試 リーディング

TOEIC の リーディングパートの問題集。本番よりも難しめ。TOEIC のリーディングは結構頑張らないと最後まで解けずに時間が足りなくなるので、この辺を繰り返し練習して慣れておいてよかった。それでも本番は時間が足りなかったんだけど。

公式 TOEIC Listening & Reading 問題集 4

公式 TOEIC Listening & Reading 問題集 4

試験1ヶ月前に公式問題集を買って一周。リーディングの解けなかった問題を何回か解き直した。

一度受けてみて、苦手部分を特定してから重点的に練習するのが効率的だと思う。

ここからは TOEIC に限らない英語学習の話。

自分の理解できるレベルの英語に触れる

普段は自分が理解できるレベルの英語になるべく触れるようにしている。 後述する英語学習者向けの Podcast や易しめの英語の小説がこれに該当する。

理解出来ない英語に触れ続けても英語力は上がらないし、意味が分からないと嫌になってやる気がなくなる。

楽しく続ける

前に書いた話にも通じることだけど、無理しないで続けられることをやる。とにかく手を替え品を替えモチベーションがなくならないように工夫している。

多読多聴で沢山の英語に触れるようにする。頻出表現が馴染んでくると音のつながりが聴き取れるようになって、穴埋めなら次に来る単語がなんとなく分かったり、類推が効くようになる。

実際にやっていること

Podcast

通勤時間に英語の Podcast を聴いている。

iOS ユーザーなら、オススメしている人が多い Overcast というアプリを使うのがオススメ。 スロー再生にも対応していて、Twitter とも連携しておすすめの Podcastをサジェストしてくれる。

Overcast

Overcast

  • Overcast Radio, LLC
  • ニュース
  • 無料

聴いている Podcast

English as a Second Language (ESL) Podcast - Learn English Online

English as a Second Language (ESL) Podcast - Learn English Online

  • Center for Educational Development
  • 言語コース
  • ¥0

6 Minute English

このあたりは比較的聴きとりやすくて内容も面白いのでよく聴いている。ESL Pod は有料のサブスクライブを試していた時期があって、 それだと全てのエピソードを聴くことが出来る。

All Ears English Podcast

All Ears English Podcast

  • Lindsay McMahon and Michelle Kaplan
  • 言語コース
  • ¥0

少し速いと感じることもあるが最近よく聴いている。毎回特定のテーマについて話しながら、アメリカの文化や英語の慣用表現や単語の微妙なニュアンスを説明してくれる。

Swift by Sundell

Swift by Sundell

  • John Sundell
  • ソフトウェア ハウツー
  • ¥0

SwiftCoders: Interviews with Swift Developers

SwiftCoders: Interviews with Swift Developers

  • Garric Nahapetian
  • ソフトウェア ハウツー
  • ¥0

自分は普段仕事で iOS アプリを作っているので、iOS アプリ開発に関する Podcast も聴いている。

Netflix

Netflix

Netflix

  • Netflix, Inc.
  • エンターテインメント
  • 無料

Netflix の良いところは英語字幕を表示できること。 時間がある時に洋画やドラマを見ている。特に Stranger Things ハマってしまい睡眠時間を削って一気に見た。 日本語字幕で見たことのある映画を英語字幕で見直すというのも理解しやすくて良いと思う。 最初の1ヶ月は無料で試せる。

小説とマンガ

Kindle でネイティブの小学生とかが読むような、易しい英語で書かれている小説やマンガを読んだりしている。iPhone, iPad, Kindle Paper White を同期させておいて、スキマ時間に開いて読んでいる。 僕は Wonder という児童向けの小説とその続編を洋書で読んだ。Kindle は Word Wise という機能があって、英単語のヒントを表示することができる。(iOSアプリでは未実装とのこと。。。)

f:id:enmtknt:20181201113302j:plain:w300
Kindle Paper White の Word Wise
ちなみに今なら Kindle Unlimited は 12/11まで 2ヶ月99円のセール中。英語学習に使えそうな洋書やマンガが色々ラインナップされている。

Wonder (English Edition)

Wonder (English Edition)

Amazing Spider-Man (2018-) #1 (English Edition)

Amazing Spider-Man (2018-) #1 (English Edition)

英語の技術書

Kindle Unlimited で無料の技術書を少しかじったりもしている。技術書に出てくる英語は、実は硬めのニュースサイトとかよりよっぽど平易で読みやすいので、興味のある分野から入ってみるのはいいかもしれない。

技術ブログ Medium, Quora

Medium

Medium

  • A Medium Corporation
  • ニュース
  • 無料

普段使っている技術について英語で調べる。Medium は iOS 関連の記事が充実している。あとは Quora で英語の Q&A を見ている。Quora は内容が面白くて1つ1つの Q&A が短いのでシュッと見れて良い。

洋楽

趣味で洋楽を日常的に聴いている。洋楽を聴いても英語が上手くはならないが、慣用表現とか英単語をバンド名と紐づけて覚えたり、Apple Music では曲によっては歌詞が読めるのでそれを眺める。

英語のインタビュー記事や三文記事

どうにもやる気が出ないなあ、というときは 好きなバンドのインタビュー記事 とか Stranger Things の続編に関する噂の記事を読むようにしている。

HelloTalk

HelloTalk ハロートーク 英会話

HelloTalk ハロートーク 英会話

  • HELLOTALK FOREIGN LANGUAGE EXCHANGE LEARNING TALK CHAT APP
  • 教育
  • 無料

国語学習者のための SNS

英作文も練習したいと思っているので、気が向いたときはちょっとした英文を書く。ネイティブの人が英文を添削したり質問に答えたりしてくれる。

ディクテーション

たまーにやる気があって仕方がないという日があるので、そういう日はディクテーションをやってみている。ディクテーションをやると単語同士のリンキングがけっこう分かるようになる。ディクテーションの教材には ESL Pod とか、Netflix のフレンズを使っている。

つまらない教材は見切りをつけてどんどん次にいく。やりきることより続けることが大事という気持ちでやっている。ストイックにやるより、毎日英語に触れる時間を持つことが良いのかなと思っている。

日記について

Evernoteでごく個人的な日記をつけている。日記を書くことで生活に良いリズムが生まれる気がしている。

きっかけ

「3ヶ月間、個人的な日誌を書くために毎日5分間使う」というのがワインバーグの「スーパーエンジニアへの道」で気づきを得る方法として紹介されていた。これを実践し、気づいたら毎日の習慣になっていた。

なぜつけるのか

書くことの効用

  • 自分の中でモヤモヤしていることをまとめる
  • とにかく言語化して、自分の状態を理解する
  • 心理的安全性のある環境で好きなことを書ける

後で見返すため

  • 記録を残すことで体調不良の原因や、微妙な変化に気づく
  • 些細な成長を実感する
  • 読み返すと楽しい
  • 以前勉強したことや考えていたことを思い出す
  • 意外な気づきがある時もある

書き方

一日の終わりに以下のテンプレートを埋める形で書いている。 とにかく書くことの心理的なハードルを下げたいので、内容は簡単でいい。書けない日があれば、翌朝書いたり、別の日にまとめて書いたり。

テンプレート

日記と同じノートブックに雛形を用意している。今はこれだけど、項目を変えたり微調整をしている。

# あったこと

その日の出来事を書く

# 学んだこと

簡単なことでいいので、新しく学んだことを1つ書く

# 所感

1日の間で印象的なことや思ったことがあれば書く

スーパーエンジニアへの道―技術リーダーシップの人間学

スーパーエンジニアへの道―技術リーダーシップの人間学

UserDefaults に struct のリストを保存する

環境

Xcode 9.4.1, Swift 4.1

UserDefaults に struct を保存する

UserDefaults に sturct を保存する方法として、Dictionary にマッピングする方法がよく紹介されているが、 Swift 4 からは Codable が使える ので、それらを使えばエンコード、デコードすることができる。
また今回はリストを扱いたいため、map を使ってリストの各要素をエンコード、デコードする。

コード

save array of struct to UserDefaults