メモ2ブログ

メモtoウェブログ。旧ブログはこちら。 http://sakebook.blogspot.jp/

2019年を振り返って

目標とか

ジム通い

1月から通い始めていたのですが、目標週2ペースで行きたかったのですが、結果的には週1ペースでした。

体調崩したり旅行に行っていたことを考えると、継続できていたのかなと思います。

競プロ

AtCoderを取り組んでたのですが、継続できませんでした。正直数えるほどしかできてないのですが、毎回Dが解けなかったです。そこでアルゴリズムの勉強をしないと先に進めないなと思い、その段階で止まってしまいました。

OKR

個人OKRを立てて取り組めていた時期は調子が良かったです。しかし業務に忙殺されてから調子が狂い、リズムを取り戻せませんでした。

やったこと

気付ける仕組みとか会社でも使えるBotとか作った

リリースしてから一定期間が経過したら教えてくれるやつ

github.com

Slackのユーザグループから一人を選択してくれるBot

github.com

SlackからGoogle Calendarの予定をシュッと見れるBot

github.com

それぞれGitLabのPipeline schedulesで動かしたり、Cloud Functionsで動かしたり、Cloud Runで動かしたりして遊んでます。

Flutter

2019年はFlutterに触れました。

技術調査を兼ねてFlutter on the webを試してみたり、いくつかPluginを公開したりしました。

Flutterでネイティブ広告を表示するためのPlugin

pub.dev

Flutter/DartのPluginをシュッと公開するためのGitHub Actions

github.com

Contribute

大なり小なりはあるのですが、最近だとFirebase Admin Java SDK名前が乗ったのは嬉しかったです。

環境を作るのがちょっと面倒だった(Firebaseのプロジェクトが必要だったり)ので、あまりContributeされてないのかもしれません。

技術書典8

今年も参加しました。隔会で参加してます。

GoogleがFitbitを買収したのでこれから人気になるかもしれません。

sakebook.hatenablog.com

こちらからお求めになれます。

sakebook.booth.pm

正直なところ、現状Fitbitで利用している技術とGoogleのモバイル周りが全然マッチしていないのでどうするんだろうという感じです。

FitbitはJerryScriptをベースにしたFitbit OSで動かしているので、それを捨てるとなると現状作ってきたエコシステムを捨てることになるのであんまりそうはしないだろうなと思っているのですが(Versa 2を出したばっか)。なのでAndroid以外の何かを乗っけてくるのかもしれません。例えばFuchsiaとか乗っけてきたりして。

登壇

Flutter Meetup Tokyo で何回かLTをしました。

www.slideshare.net

www.slideshare.net

趣味とかその他

生活を豊かにすることにハマってきた

悪く言えば浪費なのですが、家電とか買いました。

生活が豊かになるのは楽しいです。家にいる時間が長い人ほど家に対してはお金をかけた方が良いです。

海外旅行

2週間ほどでタイとベトナムに行きました。

タイのバンコクは思った以上に栄えていました。一部は東京以上に都会で、一部は田舎以上に廃れてて差が激しかったです。昨日行った場所で爆発があったりして若干ヒヤリとした場面もありました。

f:id:sakebook:20200105184125p:plain

https://lh3.googleusercontent.com/JjRXOKsX26kfcRNXasW6QM9PI8MXiw2Zga37GZnkHyoqOqU09d-hIP0WJyXoiVVPc9h1jUVSusR7TDvk7v25xzG6sZoz6r6ktOIEBinjuNqwxB8oGUfCWXSVaM3LqgnS8XjVYNlIbd5y8OVm8MHiKW3OaPhaUMuiRauxGp9nhGOwXoTf8MtFwWG5UkhoPPMm1ocYfSHw6_UNrRQcGb1PhApEhnDPU3-Y8x8CDJzfRex8GevHiWW1DUwicBb92OF8rHW3U9nDcs54Q3UGIBmJgEJqm-fwpp5boI3HNnlzEIxwuXjrUoLk4DiCp95a6lYRlUnxpyPObQIH4q9b6kX-FyYlVIGl2pWJuJ0-gCxaLGc8mTVWktbpD37EzDO6Fhz0fpfJTZ47nBw3rV6xA4uxBmv3j2x8KAzSzY2c9xBZhWh-Pu834jsp7oScSeatG5V4JFcktyKBw1qgrdMHDB_u1AsbR7mTkpzeP2tM5NnVHEq3Jff3-GQfRbvKXqJD1qA_6Qy1exblIk8sdAlUtt6aI6eAcoqvYtP9LISamG-8e3qAi9dFReRTd4wHwgTdkLf2S5nVfrWS4khO2EV0Ef1vYYwkkHgf4OikQvnIXXBDFtgTuNmfp7TAgo0Z129mHkuDbXD8iw31-OULMXVF1EXUomQL0EnkvJPEWB0kE1j_LSwSnXRW_iB8Phoi=w1770-h1327-no

ベトナムハノイを拠点にしたのですが、バンゾックの滝(徳天瀑布)を見に行くために片道12時間の移動をしたのは良い経験でした。また、現地のツアー会社で申し込んでハロン湾のクルージングにも行きました。全部英語だったので苦戦しました。

https://lh3.googleusercontent.com/Qa7BLkB0jfKioXIu4-uSZKkzm9Jo0ugu3dV3zxeNZk3qmwd0Nx8CbIefQ07SfnRyDqHgHgr_gC5-CUnrMEdGz1nNaOhKl9T8TMpzAQ6O1StZUMwMJcZ19M7wSidcPU43wSAJ9SvkuBsU7puRs8vc6LqYdBXDObLIpuf0BB8Qi0pJvjzqELoMRtFBKAjtoLikDps5E3QsPL9QRBdnVb0rEWhZ5CcgWvpdiRAG9ek92Xph7GQgW5WP3zXLzx2YpZig-KYLYzYDg8Gh9CeAZCQWJVcSgv0wGtv1c_z7uW-Al4EzgbsFtTRZ97ahcL9PjlxtP1JuFqewF8GuYmo4SIgR_Pbg6ysJzOf_7OCF55OhKZHFZT1_jGwnPDJ0l1XiadKAiKDt0PsRPYs3uCx2QWJDm84qcJm7qZ3GKgv77d5M1Q79E2ROMgMZ9CfwttqO0Mna0xz_5VZWutdFh6xhz4WNxsVAJpMUOWBWl5_D3yw_4C5LSqUyxUvCLa00QaxX8M5HDwnQhD7yXzJNAR8OYRnJnk1gxyPSk8QGMem6eRcRQbND9uHdQTqg1UdjKgnF0LPIwMVAnTIkzIyma7f5psrnWJTq_q2CIIm8mlqd_3aXm1gOfPDB0yceyzphmyXOx8lCMRkcTlt2fQ9zOkIefsBqbrp832JlHvE8c_iWqVj6TNkn9pVU-13unOLY=w1770-h1327-no

https://lh3.googleusercontent.com/stmkSl42bMgAgtjb_DlNF3uEvHq0XG0T446imLH-X5z1hiODiG_WM1fOd0VO1781L9bzDFZ0UJyCNEV-9mz6byyWcnXk9j2UoEKqPgTOLXnDEVZyKPK_0Iqjtlq0nVOeCiY4wOr5PFXtrDagGbLVOs8auUqE34OFe22Pm06EmhO7gGPQWxVpk2kWsuBF_6BCiLm9TZZEurllIeF9UzyNBGTeZRbG_wu-7QGjp8uYU1b5lI2qTHyETCZtIa8ynAN7RRD85YPMlq579Oj9yEYus6JJYw6EBM0vtHPn-Czu4mBWZQjdB9SzVo8vxavkQ5S7DRMs6gfR6n3_vk66w8BG-GT-5lDhxs4LMQKpkfoGR8SIE5p-UWY91lEvP-6ymmrhQLj_F4f7zMYRt500xF6gVHLNE4eE8D0A2q14_iYqSRKESYacBPZOiPwqQjBJ-SxP1f8P9NIlrwBDu0dZovRmn1QqjeOb8wPO6JGZYqqjqDEVj5pyn-QtkEpMhJEeyVQ1sXAE13dlpm6HV5JPUc3sqcBpOZGkK-7V2Y2QLurBYUsE1WUL_TOC_6dxoKEkDPYgnTHsoYJe6B4jJWQrOrL1Ak8kw6dtOTmzeIu-ceIa01rv7_4NRL16VB1yQL6Uh0QARBB-vApFvSbcXkaFCG3_u-YFQyxqk139FAlofvUjaJbHa2Z7Rdg-UnbZ=w1770-h1327-no

ボドゲ

今年も色々買いました。遊びたい人いたら言ってください。

  • Welcome To
  • Welcome To拡張
  • パッチワーク
  • スコットランドヤード東京
  • 横濱紳商伝
  • カタン航海者版
  • はぁって言うゲーム
  • 遙かなる喜望峰
  • 翡翠の商人
  • BOXWALK
  • ソレニア
  • イト
  • マジックメイズ
  • ディセプション
  • デクリプト
  • アルゴ
  • 花火
  • モダンアート

そろそろ自分でも作りたい。

体調崩した

虚血性腸炎というものに2回なりました。腸は昔から強くはないのですが、今後はもっと気を使った何かをしたほうがいいかもしれません。

2020年

英語

OSSのissueのやりとりとか、英語のドキュメントを読むとか、海外旅行とかで英語の必要性が自分の中で再び高まってきました。

何かをしたいときにその障害になることが英語であるのならば、解決できる障害なので今のうちにやっつけてしまおうと決意しました。

英語やるだけだとふわっとしてるので、英語でのアウトプットが何かしら出せるとこまでいけたらなと思います。

リングフィットアドベンチャー

来月から通勤ルートからジムがなくなってしまうので、ジムに行きにくくなります。その代わりにリングフィットアドベンチャーを年末からはじめました。

今の所継続できており、適度に筋肉痛も発生しているので、ジムから乗り換えようと思ってます。

Flutter

もっとFlutterのアウトプットをしていきたいし、コミュニティにも関わっていきたいと思ってます。

自分はWebの知識が弱いのですが、そのあたりも補えるあたりFlutterには嬉しさがあります。

Flutter for WebのプロジェクトをGitHub ActionsでFirebase Hostingにデプロイする

タイトルのまんまです。

FlutterとFirebaseのバージョンは次のとおりです。

$ flutter --version
Flutter 1.10.14 • channel dev • https://github.com/flutter/flutter.git
Framework • revision 1946fc4da0 (12 days ago) • 2019-10-07 15:23:31 -0700
Engine • revision 1d62160fdb
Tools • Dart 2.6.0 (build 2.6.0-dev.1.0 d6c6d12ebf)

$ firebase --version
7.0.1

Workflow

次のワークフローで基本的には動きます。ただし、一部実装依存の部分があるので後述します。

name: CI

on:
  push:
    branches:
      - master

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Build
        uses: subosito/flutter-action@v1
        with:
          channel: 'dev'
      - run: |
          flutter config --enable-web
          flutter pub get
          cat <<EOF > assets/secret.json
          ${{ secrets.CREDENTIAL_JSON }}
          EOF
          flutter build web
      - name: Archive Production Artifact
        uses: actions/upload-artifact@master
        with:
          name: web
          path: build/web
  deploy:
    name: Deploy
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Download Artifact
        uses: actions/download-artifact@master
        with:
          name: web
          path: build/web
      - name: Deploy to Firebase
        uses: w9jds/firebase-action@master
        with:
          args: deploy --only hosting
        env:
          PROJECT_ID: ${{ secrets.PROJECT_ID }}
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

解説していきます。

Jobの流れ

BuildとDeployで分けてます。

Build

flutterコマンドを落としてきて、ビルドしたものをartifactに登録します。

GitHub Actionsでflutterを使うためのActionがいくつか用意されていたのですが、Dockerの方を使うとartifactのpathを調整する必要があったため、JavaScriptの方を選択しました。

github.com

Deploy

firebaseコマンドが使えるDockerコンテナを用意し、その中でartifactを落としてきて、Hostingにデプロイします。

こちらもActionが複数あったのですが、最もStarを集めてて使いやすそうなものを選びました。

github.com

Hosting以外のFirebaseの機能を利用している場合

今回の例にあたります。Firebase Config Objectを生成して、Firebase初期化時の引数に渡す必要があります。

この情報はpublicにしたくないものも含まれれるため、リポジトリには含めません。

今回のケースだと、 assets/secret.json というファイルに情報を詰めています。このファイル名もファイルパスも、渡し方も決まりはないので、プロジェクトごとに異なると思います。

このプロジェクトでは次のように初期化しています。

final secret = await rootBundle.loadStructuredData<Secret>("assets/secret.json",
      (jsonStr) async {
    final secret = Secret.fromJson(json.decode(jsonStr));
    return secret;
  });
initializeApp(
  apiKey: secret.apiKey,
  authDomain: secret.authDomain,
  databaseURL: secret.databaseURL,
  projectId: secret.projectId,
  storageBucket: secret.storageBucket,
);

秘匿情報の扱い方は以前まとめたものが参考になると思います。

sakebook.hatenablog.com

まとめ

Flutter for Webのプロジェクトをデプロイするだけなら簡単です。基本的にBuildのjobで必要なものは揃っているので、あとはどこにホスティングするにしても同じ感じで行けると思います。

一部実装依存になる部分が出てきたら調整が必要です。

今回作成したページはこちらです。

参考

Add Firebase to your JavaScript project  |  Firebase

Upload-artifact not working for steps running in containers · Issue #13 · actions/upload-artifact · GitHub

GitHub ActionsでFlutterのPluginをリリースできるActionをMarketplaceに公開した

FlutterでPluginを作りたいと思ったらPubに登録するのが一般的です。

もともとGitHub Actionsでリリースできるようにしていたのですが、Pluginに依らずやることは同じなのでAction化してMarketplaceに公開しました。

github.com

Marketplaceに公開までにあたりいくつかハマった点があったので共有します。

Dockerイメージのユーザはrootである必要

今回はcirrues/flutterのDockerイメージを利用していたのですが、ユーザを指定していたため、Permission deniedで怒られました。

現状GitHub ActionsはDockerのデフォルトユーザ(root)での実行を想定しています。それ以外だとGITHUB_WORKSPACE にアクセスできないため、ファイル作成などでPermission errorが出ます。

なので、今回のケースにおいてはDockerfile内でユーザをrootに指定しなおします。

  • Dockerfile
USER root

Dockerイメージをそのまま使う場合は引数で指定してあげるとうまくいきます。

container:
  image: cirrusci/flutter:stable
  options: -u root

inputsは自動的に環境変数に登録される

envで指定しなくても環境変数として渡ります。もしも明示的に引数として扱いたい場合は args に渡してあげればよいです。

inputsで渡した場合は頭に INPUT_ が付いて大文字に変換された名前で環境変数に登録されます。任意の名前で扱いたい場合は envで渡すのもよいと思います。

同一リポジトリでの確認

作成しているGitHub Actionsの確認に利用できます。.github/workflows/ に置いたyamlが、通常のGitHub Actionsと同様に実行されます。 uses: ./ と指定してあげることで、作成中のActionを指定することができます。自分が確認している範囲では、ローカル環境での動作確認はまだできないみたいです。

jobs:
  test_job:
    runs-on: ubuntu-latest
    name: Test
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Test action
        uses: ./

作成したActionのMarketplaceでのURLはnameが使われる

GitHubリポジトリ名が使われると思ってたのですがそうではなかったです。作成の際にはnameに気をつけてください。

ややこしいことに、yamlのAction名にはリポジトリ名が利用されます。揃えておいたほうが利用者にとってわかりやすいので、なるべく揃えたほうが良いと思います。

Actionを利用するときのバージョン指定は完全一致じゃないとNot foundになる

よく使う、 actions/checkout@v1 のようにメジャーバージョンだけ指定すればよしなにv1.y.zの最新のバージョンが利用されると思っていたのですがそうではありませんでした。

現状はタグ名の完全一致で見ているようです。 v1 タグがしっかり存在していました。

しかしこの仕様は見直される可能性があるみたいです。

まとめ

ドキュメントをよく読むことに尽きるのですが、構造化されてなくて現状結構情報が探しにくいと思います。すでに公開されているActionが非常に参考になるので探して動かしてみると色々わかると思います。

また、Community Forumに投稿したり検索したりするとわりと情報が見つかるので活用すると良いです。

github.community

こちらは今回公開したActionの利用例です。

github.com

参考

Virtual environments for GitHub Actions - GitHub Help

Creating a Docker container action - GitHub Help

Solved: Version numbering for Actions - GitHub Community Forum