2019年の振り返り的な何か
今年もざっくり振り返ろうと思う。2018年の記事はこちら。
2019年にできたこと
AWS SAを取る
2月に取った。
GoをJava/PHPと同じくらい書けるようになる
シェルスクリプトではやりきれないやつをGoでサクっとかけた。ただ使ってないと文法忘れるので意識的に書かないと忘れそう。
Firebase + iOS or Android or JSで何か作る
仕事がモバイルアプリ開発になったので、Flutterでサンプルアプリを作ったりできた。
GCPをAWSくらいできるようになる
GCPのquicklabのキャンペーンを全部埋めてk8sTシャツもらった。
PHP以外のフロントエンド開発(html/css/jsとかブラウザとか通信とか)の設計がわかるようになる
モバイルアプリの設計めっちゃやってる(できるとは言ってない)。フロントエンドの状態管理の設計めっちゃ難しい。けどできるようになりたい。
外部イベントの運営・ボランティアスタッフをやる
DevOps Days Tokyo 2019のボランティアスタッフとXP祭りの運営をお手伝いした。運営サイドから見える景色もいいものですね。
JAWS-UGのアーキ支部でCI/CDに関して議論できたのもよかった。
ブログを最低月一回投稿する
9月はすべりこみだったけど、なんとか月1ペースで投稿できた。
競技プログラミングを再開する
再開できた。
8月まではコンスタントにコンテスト参加できてたけど、9月以降は多忙 & レート下がり恐れからサボり気味になった。ちなみにPASTは初級でした。しょぼい。精進したい。
2019年にできなかったこと
Spring Bootでアーキテクチャ設計できるようになる
SprintBootを1.xから2.xにするのをちょろっとやって以来、一切触らなかった。忘れてそうなのでどっかでリハビリしたい。
英語学習を復活して少なくともTOEICスコア(785)を更新する
765だった。勉強しないとスコアは上がらないらしい。
半分できて、半分できなかった。
3年後、5年後の自分の仕事・人生の具体的なイメージを持つ
今年の主な仕事がモバイルアプリ開発だったので、これでネイティブアプリ・Webフロント・サーバサイド・AWSと一通り触ったことになったので良かった。あとやってないのはコンテナ・k8sくらいかな。
今年は一人称でCI/CDおじさん業をやってのけたので、この領域にはだいぶ力がついたなぁという気持ちにもなった。
ただ一通りやってみて、開発のコアになるシステムやアプリをどういう作りにするといいのかという設計に関して、周りをリードできる力がないと痛感したので、設計の領域でもっと精進したいと思った。
あとチーム開発をどううまく回すか的なエンジニアリングマネージャー業にもスクラムのプラクティスの延長で興味関心があるので、うまく業務の中で試行錯誤できたらいいなと思った。
その一方でできてないと思う点は、会社の枠を越えて自身の人生においてどう生きていくか、考えたけど結局行動に移せなかったから。
いろいろ見たけど、うーんという気持ちで結局コンフォートゾーンから抜け出さなかった。
この辺はもうちょっと言語化と情報収集を継続して頑張りたい。
主なアウトプット
GitLabとFlutterがメインだった。
- GitLab
- GitLab Meetup Tokyo 16 でLT発表しました #gitlabjp - つばくろぐ @takamii228
- GitLab CI RunnerをMac上に構築する - Qiita
- GitLab CEでMerge Request時のCIを事前にマージしてから実行する - つばくろぐ @takamii228
- GitLabでtagとtagの間に含まれるMRリストを取得する - つばくろぐ @takamii228
- GitLab APIを使ってtag名とtagのタイムスタンプをcsv形式で出力する - つばくろぐ @takamii228
- flutterのバージョンをGitLab CI Runner上で動的に切り替える - つばくろぐ @takamii228
- Flutter
- ブランチ戦略
GitLab CI使ってFlutterのCI/CDパイプラインを作った話をどっかでアウトプットしたいお気持ちなので年始頑張ろうと思う。
GitHub
特に何か公開しているわけではないけど。
takami228 (Masanori Takami) · GitHub
振り返り
↑も合わせて、2019年を振り返ってみた。
良かったこと・できたこと
- 未経験・新しい技術に対して学ぶ姿勢が継続できていること
- 月1ブログ投稿が継続できていること
- コミュニティ活動の運営側に関われたこと
- 競プロが再開できたこと
- ISUCONに初参加できたこと
- Jira Cloud / Confluence Cloudで情報管理できていること
やっぱり目標があると前にすすめるのでよい。前に立てた目標の半分くらいは達成できた。
ISUCONは初見殺し感はあってボロボロだったけど楽しかった。来年も出たいなぁ。
あとAtlassianのツールが無料で使えるようになったのは大きい。ちょっとしたメモをConfluenceに集約できるし、読書や目標管理にJiraが使える。
良くなかったこと・できなかったこと
- 積読やWIPの本が残ってるのに新しい本を買ってしまったこと
- 1回しか外部発表できなかったこと
- 働きすぎたこと
- 働きすぎて?体調を崩しそうになったこと
- 3年後、5年後の自分の仕事・人生の具体的なイメージを持つことを先送りにしたこと
本を買いすぎて、家のスペースを圧迫しだした。ちゃんと読んで手元に置くものとそうでないものを種別したい。
夏あたりからちょっと働きすぎてしまった。ちょっとハイになっていたところもあったかもしれない。最近突発的に目眩が起きて辛い思いをした。
やはり健康第一なので、食事・運動・睡眠には注意したい。
2020年の抱負的な何か
いくつできるかわからんけど、今年もとりあえず書いてみる。
- AWS SA Pro or DevOps Proを取る
- GCP Professional Cloud Architectを取る
- TOEICスコア(785)を更新する
- AtCoderで緑キープ & レート1000になる
- PASTで中級になる
- ISUCONに出る(開催されれば)
- フロントエンドの設計を理解する
- いわゆるアーキテクト業を自信を持って遂行でき、自分の色を出せるようになる
- いわゆるエンジニアリングマネージャー業を自信を持って遂行でき、自分の色を出せるようになる
- CI/CD関連できちんと言語化してなんかアウトプットする
- 3年後、5年後の自分の仕事・人生の具体的なイメージを持つ
- 健康を維持・推進する
2020年はいくつできるかな、頑張ろう。
最後に、去年はこんなことを書いていた。
社会人歴5年目だけどまだまだ自分がこれから進みたい方向性はぶれてるので、いろいろつまみ食いしながらレベル上げしたいと思ってる。 けどいろんなところに顔つっこみ過ぎている感もあるし時間は有限なので、かけるべき時間と期限を決めてうまくやっていこうと思う。
今年は社会人6年目で、いろいろ区切りがいいなーと思ってた。小学校6年、中学・高校6年、大学・大学院6年。 年齢はアラサー。何か環境を変えるようなことをしようかなと思ったけど、行動には移さなかった。このままズルズルいくのもアレなので、人生のマイルストーンを真剣に考えねば。
でもまだまだ霧の中を歩いているような気分なので、2020年もいろいろつまみ食いしながらレベルアップしていこうと思う。
flutterのバージョンをGitLab CI Runner上で動的に切り替える
この記事はFlutter Advent Calendar 2019 (#2)の記事です。
※12/21 8時時点で18日分に空きがあったので埋めさせていただきました(参考)
はじめに
GitLab CIを使ってFlutterのCI/CDをやっているのですが、CI環境において複数のFlutterのバージョンを管理する必要があり、少し悩んだので以下にまとめます。
GitLab CI Runnerは以下のような感じで、shellモードでMac mini上で動かしています。
今回、Flutterのバージョンアップの検証が必要になったのですが、すでに配信中のアプリで利用しているFlutterのバージョンに対してはバージョンアップが完了するまでの間に緊急パッチを宛てる可能性があります。そのため、緊急パッチのビルド時につかうFlutterのバージョンと、バージョンアップ検証で使うFlutterのバージョンをそれぞれのビルドで使い分ける必要があります。
検討した解決策
CI環境上で複数のflutterのバージョンを動作させる方法として、以下の2つ案を考えました。
- 配信版と追加開発をブランチを分けて、ブランチごとに固定のGitLab CI Runnerを割り当てる
- GitLab CIの実行時に使うバージョンを動的に切り替えられるようにする
メリット・デメリットは以下の通りです。
案1 |
|
|
案2 |
|
|
GitLab CIではCI Runnerにタグをつけることができ、tag
、only
、except
等を記述することで特定のブランチのジョブを特定のCI Runnerで実行させる、という設定ができます。
https://docs.gitlab.com/ce/ci/yaml/
しかしデメリットで書いた通り、普段の開発においてはfetuareブランチやhotfixブランチを切ったりリリースタグを切ったりとブランチの命名規則を複数考慮してgitlab-ci.yml
を設定するのはなかなか骨が折れます。
今回は設定が煩雑になることに加え、バージョンアップ版のリリースまでの移行期間のみ並行運用が走ること、また都度実行で増える実行時間が2-3分程度で待てるレベルであることを踏まえて2を選択することにしました。
実装
各ビルドで使うflutterのバージョンはpubspec.yamlに記載できるため、それを使ってflutterのバージョンを切り替えてからCIを実行するように.gitlab-ci.yml
を設定します。
... environment: sdk: ">=2.1.0 <3.0.0" flutter: 1.9.1+hotfix.6 ...
yamlから特定のキーの値を取得するのにはyq
が使えます。
pubspec.yamlに記載されたバージョンでflutterのversionを切り替えるシェルは以下のように記載できます。
#!/bin/sh set -x set -e # get tagert flutter version TARGET_FLUTTER_VERSION=`cat pubspec.yaml | yq -r .environment.flutter` TARGET_FLUTTER_VERSION_TAG_NAME=v${TARGET_FLUTTER_VERSION} CURRENT_DIR=`pwd` FLUTTER_DIR=${HOME}/development/flutter cd ${FLUTTER_DIR} # current version flutter --version # flutter checkout git checkout -f master git pull git checkout -f ${TARGET_FLUTTER_VERSION_TAG_NAME} flutter precache flutter doctor # updated version flutter --version cd ${CURRENT_DIR}
ポイントとしてはflutterのバージョンはpubspec.yamlにはvなしで記載されているのに対し、flutterのタグではv
がついているためgit checkoutするときに付与する必要があります。
flutterのバージョンの切り替えはflutter version
コマンドを使うこともできますが、これを実行するには対象のバージョンがあるchannelをflutter channel
で事前に指定し、かつupgradeを実行して最新化しておく必要があります。
最新化がされていなかったり、切り替えたいバージョンのchannelが異なっている場合はflutter versionコマンドは失敗してしまいます。
$ flutter version -f v1.13.3 There is no version: 1.13.3 Unable to checkout version branch for version 1.13.3.
なので、今回はflutterコマンドがインストールされている場所~/development/flutter
に移動し、master上でpullして都度タグをcheckoutする方式を取るようにしました。
チェックアウトした後はflutter precache
することで依存するライブラリが落ちてきます。
最後に↑のシェルを.gitlab-ci.yml
のbefore_script
の中で実行するように設定すれば完成です。
... before_script: - ./set-flutter-version.sh ...
似たような感じでxcode-select
すればXCodeのバージョンも指定できそうですね。
gradle wrapperやmaven wrapperでのバージョン指定、Docker buildなどと同様にビルドさせる環境のツールのバージョンはgitレポジトリに定義含めてしまって、CIの実行の度に動的に変えられるようにしておくと管理が便利になりますね。
あとはflutterのバージョン切り替えもDocker Buildみたいにキャッシュできたらいいのになー。
FlutterでID/Password入力画面を作ってみる
FlutterでID/Pass入力画面を作るときに設定するのパラメータをちょっと調べたのてまとめてみます。(※入力のバリデーションやオートフォーカス等のアクションは含みません)
よくあるID/Pass入力画面の要件
よくあるID/Passの入力画面の要件といえばこんな感じでしょうか。
ID入力
- 半角英数が入力できる
Password
- 半角英数が入力できる
- 入力内容はマスクしたい
- 入力内容を確認したいので、マスクの表示非表示を切り替えられるようにしたい
- 予測変換はさせたくないしヒストリーに記録なんてさせたくない
- 入力欄のコピペはブロックしたい
入力フォームはTextInputFiled
を使えば実現できます。中でTextFieldをラップしているようです。
TextFormField class - material library - Dart API
TextField constructor - TextField class - material library - Dart API
上記の要件に絡みそうなパラメータは以下の通りです。
- obscureText
- 入力内容のマスク表示の切り替え
- autocorrect
- オートコレクト・予測変換の有効・無効化
- enableInteractiveSelection
- 入力エリアのセレクトアクション(コピペ、選択、削除など)の有効・無効化
- TextInputType
- 立ち上げるキーボードタイプ。以下の種類がある。
- TextInputType class - services library - Dart API
- datetime
- emailAddress
- multiline
- number
- phone
- text
- url
- visiblePassword
今回の要件では、以下のような設定にするのがよさそうです。
ID入力欄
パラメータ | 値 | 理由 |
---|---|---|
obscureText | false | IDは常に見せておくため |
autocrrect | false/true | どちらでもよさそう。メールアドレスとかだとサジェストがあると嬉しいかもしれない。 |
enableInteractiveSelection | true | コピペしたいケースがありそうなので。 |
TextInputType | emailAddress | IDがメールアドレスのケースも多く、とりあえず半角英数で立ち上がってほしいので。 |
Password入力欄
パラメータ | 値 | 理由 |
---|---|---|
obscureText | true/false | 右端に目のアイコンを用意し、クリックで切り替えられるようにする。 |
autocrrect | false | パスワードは守りたいので。 |
enableInteractiveSelection | false | コピペはブロックしたいので。 |
TextInputType | visiblePassword | パスワードを見せる専用のキーボードタイプ。v1.9.1+hotfix-6から使える模様。 |
Widgetに上記の設定をしてiOS/Androidそれぞれエミュレータで動かしてみます。
今回試したコードサンプルはこちら。
なおPassword入力画面のパーツについては本家のflutter garallyにもあり、今回の実装の参考にしました。
実行環境は以下の通りです。
$ flutter doctor Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel unknown, v1.9.1+hotfix.6, on Mac OS X 10.14.6 18G87, locale en-JP) [✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3) [✓] Xcode - develop for iOS and macOS (Xcode 11.3) [✓] Android Studio (version 3.5) [!] IntelliJ IDEA Ultimate Edition (version 2019.3) ✗ Flutter plugin not installed; this adds Flutter specific functionality. ✗ Dart plugin not installed; this adds Dart specific functionality. [!] VS Code (version 1.41.0) ✗ Flutter extension not installed; install from https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter [✓] Connected device (2 available) ! Doctor found issues in 2 categories. $ flutter devices 2 connected devices: AOSP on IA Emulator • emulator-5554 • android-x86 • Android 9 (API 28) (emulator) iPhone 11 Pro Max • 424952E6-D634-4B19-AA9A-8552B62DE670 • ios •com.apple.CoreSimulator.SimRuntime.iOS-13-3 (simulator)
挙動確認
iOS
想定通り動いてそうです。
Android
Androidも大丈夫そうです。
余談:TextInputTypeがvisiblePasswordじゃないとAndroidでautocorrectが効かないらしい。
そもそもFlutterにはautocorrectのバグがあったようです。
このバグの対処のために、最新のstableであるv1.12.13+hotfix.5
ではenableSuggestions
というパラメータが追加されたようです。
このパラメータ追加で予測変換を一律制御できるのかな〜と思ったのですがそもそもAndroidのみとのこと。またIssueのコメントにあるようにTextInputType.text
だと予測変換の無効化は効かない模様。まじかー。
入力のI/O周りはAndroidとiOSの両OSのモジュールをうまくラップして制御するのが難しいのでしょうかね。そういえばWebやDesktopもあるんだった・・・。
あと今回他のサービスはどうなってるのかな〜と思っていろいろ調べたのですが、ほとんどがWebViewでの入力画面が立ち上がるパターンでした。。。