2020年の OSS 活動ふりかえり

年末なので

issue

https://github.com/issues?q=is%3Aissue+author%3Aodanado+archived%3Afalse+-user%3Aodanado+-user%3Aodan-sandbox を眺める

Can't lint .ts files when use vue-eslint-parser · Issue #864 · microsoft/vscode-eslint

  • vscode-eslint の v2 がリリースされた次の日に発生した不具合を報告した issue
  • vue-eslint-parser を使っていると .ts ファイルが lint されなくて困っていた
    • 英語がまずかったのか問題の意図を伝えるのが大変だった...

/static/bootstrap/css/bootstrap.min.css が 404 · Issue #13 · perl-users-jp/perl-users-jp.github.io

  • 会社で perl-users-jp の改修やってるって話を聞いてコントリビュートしたやつ

https なサイトでプルリクの内容をプレビューしたい · Issue #24 · perl-users-jp/perl-users-jp.github.io

VTI Error: Cannot find module · Issue #1732 · vuejs/vetur

  • VTI は VSCode の Vue.js 向けの拡張機能である vetur の CLI ツールのこと
  • リリースされて、これは!ってなって即試したらなんかエラーが出たので issue を立てたやつ

Using an index type generates an object type · Issue #646 · nestjs/swagger

  • nestjs/swagger は会社で使っていて、その中であれ?って思う挙動があったので issue を立ててみたやつ
  • 実際は仕様で close された

A type of web3-eth is incorrect · Issue #3483 · ethereum/web3.js

  • JS だと default export されているクラスが、TS だと named export されていて立てた issue
  • 明らかにバグだけど影響範囲とかあるので、このままらしい
  • TS で web3.js を使うとたびたびつらい思いをする

TravisCI is failing · Issue #387 · GoogleChrome/rendertron

  • prerendering を試してみたくて rendertron の素振りをしていたんだけど、どうやらずっと CI が落ちているみたいで立てた issue
    • この後 CI をグリーンにするプルリクも投げた
  • CI が red なまま開発する OSS もあるんだなあってちょっとびっくりした
  • テストで GCP にあるプロジェクトの DB を参照していて、なるほどなとなった
  • 今見たら GitHub Actions になってた

Add an option to disable repos.createCommitComment · Issue #126 · nwtgck/actions-netlify

  • actions-netlify は GitHub Actions から Netlify にデプロイするやつ
  • デプロイするたびにコメントがついてメールが来ていたので、無効化するオプションがほしいと思って issue を立てた

account.hashMessage is incorrect with non-ASCII characters · Issue #3523 · ethereum/web3.js

  • ASCII に含まれない文字を関数に渡すと正しく処理されないバグ
  • "🤗".length は 2 だが、Buffer.from("🤗", "utf8").length は 4 なことに起因するバグだった
  • 文字コード難しいね

エラー発生時にユーザーにエラーが発生したことを伝える · Issue #20 · mak4026/splathon_ladder_web

  • スプラトゥーンのコミュニティの Web アプリで、エラーが発生していることがユーザーに届かない仕組みだったので issue 立てた
  • このあとプルリクも投げた

createAt/updateAt is of different types for CSR and SSR · Issue #114 · nuxt/content

  • nuxt/content がリリースされて、すぐ試したらバグを踏んで issue 立てたやつ
  • Date オブジェクトが JSON に変換されるときに文字列になるんだけど、その時の方式がブラウザと node.js で異なるのが原因だった気がする

generate sitemap.xml · Issue #386 · nuxt/content

commit lock file for PetAdoptions/cdk/pet_stack · Issue #28 · aws-samples/one-observability-demo

  • Observability に興味があって、AWS の workshop を試していたんだけど、サンプルコードに lock file がなくて動作せず、lock file を push してくれという issue を立てたやつ
  • 反応ないし、似た問題を抱えている人もいないのでみんな困ってないのかな

The Japanese translation of creating-a-composite-run-steps-action.md is wrong · Issue #751 · github/docs

  • GitHub のドキュメントの日本語ページの code block とかがすごい壊れていたので issue を立てたやつ
  • 手動で直してプルリクを投げようかなって思ったけど、どうやら自動翻訳らしく issue 立てるだけで良かった
  • 今見ても日本語ページ壊れてるしいつ直るのかな...

truffle-v5: Some properties of Truffle.ContractInstance are missing · Issue #315 · ethereum-ts/TypeChain

  • TypeChain が生成する型のプロパティが不足していたので立てた issue
  • そのうちプルリクも投げる予定

プルリク

https://github.com/issues?q=is%3Apr+author%3Aodanado+archived%3Afalse+-user%3Aodanado+-user%3Aodan-sandbox を眺める (飽きてきたのでピックアップするだけ...)

DefinitelyTyped 系

  • 今年初めて DefinitelyTyped にプルリク投げたし、@types/keccak は初の Author な型定義になった
  • 今見たら週間 3000 Downloads ぐらいあるらしく嬉しい

ethereum/web3.js: Ethereum JavaScript API

  • web3.js の provider は構造的部分型を考えると send メソッドを持っていればいいんだけど、型定義がそうじゃなかったのでプルリク投げた

feat(markdownit): add types of $md by odanado · Pull Request #376 · nuxt-community/community-modules

  • 型定義がなかったので投げたやつ
  • 先に issue 立ててお伺いを立ててからのほうが良かったかな

docs: add comma by odanado · Pull Request #2533 · vuejs/vetur

  • Vetur の新しいバージョンがドキュメントと共にリリースされたんだけど、ドキュメント中のコードが文法的に invalid だったので修正のプルリクを投げたやつ

まとめ

  • 新しいツールとか新しいバージョンの OSS は結構狙い目
    • 仕事とかで普段使っている OSSwatch しておくと、新しいバージョンに気付けるので良い
  • 来年も仕事で使っている OSS に不具合を見つけたら issue 立てたりプルリク投げたりしたい

第二期 大王戦のふりかえり

この記事は Splathon vol.1 Advent Calendar 2020 の11日目の記事です。

f:id:odan3240:20201213163831j:plain

大王戦 とは

Splathon 内で開催されているウデマエ別の大会です。この大会は大王/王子王女/将軍の3つの Tier に分かれていて、自分が参加した大王 Tier は XP24 後半から XP27 後半までのメンバーが参加していました。開催期間は約3ヶ月間とちょっと長めの大会です。

この大会は、予選ではナワバリ含む全てのルールと指定8ステージで、各チームが総当りで4先の対抗戦を行い、決勝では予選リーグ1位と2位がフェスステージを含む5先の対抗戦を行い、優勝チームを決めます。

チームはウデマエが均等になるように組まれて、自分は弱陰性というチームで参加していました。

チームメンバーの紹介

わたこさん

  • L3 を使う弱陰性の前衛
  • 気付いたら前線キルを重ねたり、スフィアでヘイトを稼いでいることが多かった
  • 大王戦途中からジェッパを克服したらしくステージに合わせて L3D を持てていてすごい

としおさん

  • スシべ/ZAPを使う弱陰性の中衛
  • サポートが光るいぶし銀
  • イノシシになりがちな自分を「スペシャル溜まるからちょっとまって」という掛け声で引き止めてくれていた

ちゃおまるさん

  • お風呂を使う弱陰性の中衛
  • モズクの網上のスピナーにお風呂で撃ち勝つ謎性能
  • チームが慌てていても落ち着かせてくれる精神的支柱

はやぶさコーチ

  • 弱陰性のコーチ
  • ナワバリ勢で、主にナワバリの勝ち方について教えてもらった
  • チーム練習の俯瞰視点やフィードバックをいただきました
  • 居酒屋配信によって大王戦自体を盛り上げてくれた

odan

  • プライムを使う弱陰性の前衛
  • ボトムと呼ばれるチームで一番 XP が低い人
  • 時折イノシシモードになって簡単にデスする

チームの特徴の紹介

編成

弱陰性は L3 + プライム + スシべ or ZAP + お風呂を基本編成としていて、ほとんどのステージ、ルールでこの形でした。この編成に行き着いたのはチーム結成から1週間と他のチームと比べて早く、チームとしての練度を高めることが出来ました。この編成で行こうと強く推してくれたのははやぶさコーチだったので、その点でも感謝です。

勝ちパターン

勝ちパターンとしては、スシべとお風呂が基本的に偉い動きをしながら盤面を維持しつつ、L3 かプライムのどちらかが上振れて大きくカウントを進めることが多かったです。L3 かプライムのどちらか一方がうまく動けていなくても勝ちに繋げられていたのが、勝ちを重ねることが出来た要因じゃないかと考えています。

勝負強さ

自分で言うのはあれですが、弱陰性は勝負強いチームだったと思います。ほとんどの予選と決勝で流れを掴むために絶対に勝たなきゃいけない試合を、ルルステの運や個人の上振れなどによって取り切れていたと思っています。

予選と決勝でのふりかえりでは、この勝負強さを中心に見ていきます。

ふりかえり

やってない時もありましたが頻繁にふりかえりするチームでした。

  • 練習後に俯瞰視点を Watch2Gether を使ってみんなで見る
  • 「スプラノート」と呼ばれる Google Docs に練習後に非同期で練習の各試合の気になるポイントなどをお互いに書き込む

このふりかえりによって、各ステージで誰がどのタイミングでどこのポジションに入るかの共通認識が構築できて、勝ちにつながったと思っています。

予選

vs 濁点

初戦で緊張していましたが勢いで勝ちきることができた試合でした。特にナワバリで L3 の抜けから流れを掴むことができて、その後の試合もその調子良く進めることができたと思います。

vs もちココア

予選で唯一負けた試合でした。バケとホクサイの対面の圧が強くてどの試合も苦しい展開でした。

初戦のアサリと5戦目のエリアを落としたのがかなりきつかったです。初戦のアサリは最後の最後で相手にワンちゃん掴まれる動きを許してしまったのと、5戦目のエリアは長射程がいない編成えで運悪くモズクを引いてしまったのが敗因です。どっちかでも勝っていればまだワンちゃんあったのかなと思います。

vs 上振れ

初戦は落としたもののその後4本取ることができて、4-1 で勝つことができた試合でした。

ターニングポイントとなった試合は、2試合目のアジフライナワバリだと思っています。プライムで謎に裏抜けしてしまったり最後ナイス玉を抱えたりで戦犯ムーブを重ねてしまっていましたが、0.8 % 差でギリギリ勝つことができて流れに乗れました。

vs 麦わら

上振れ戦と同様に初戦のガチアサリを落としたものの、その後4本取ることができて、4-1 で勝つことができました。

3戦目のガチヤグラでモズク農園を引けたのがかなり大きかったです。もし仮にガチエリアやナワバリでモズク農園を引いていたらスプスピが暴れていただろうし、他のステージでヤグラを引いていたらバケが出てきていた可能性があり、もしその場合負けていた可能性はあったと思います。ここで、ルルステの運もあって勝つことができて、流れに乗れたと思います。

vs 母性

結果的に 4-0 とストレートで勝つことができましたが、編成的にエクキャンが可能な相手で、緊張から試合当日は会社を早退するレベルでビビってました。

4-0 で勝ち切ることができた要因はナワバリでコンブを引けたことだと思っています。試合までの1週間はバトロボさんにお願いして対キャンプの練習を繰り返していて、その中で特にコンブナワバリは重点的に練習していました。そのコンブナワバリを本番で引けたのはとても運に恵まれていたと思います。自分が L3 ベッチューを使って左通路のキャンプを抑え込めていたのはこの練習のおかげでした。

vs 7つの滞在

勝てば決勝への進出が確定する試合で、この日も緊張から会社を早退していました。結果は 4-1 で勝つことができて決勝行きを決めることができました。

この試合は、コンブナワバリとアジフライヤグラで勝ちを掴めたのが大きかったです。コンブナワバリは前日から「明日の試合でコンブナワバリを引いたら、L3 ベッチューじゃ相手のななさんの L3 に対面で勝てないだろうからプライムを持ってみよう」と考えていました。当日運良くコンブナワバリを引くことができて、狙いのプライムを持って勝つことができました。

アジフライヤグラでは延長戦で危うく逆転負けしそうになりましたが、運良く最後にヤグラに乗ることができて勝つことができました。

これらの試合のどちらかでも落としていたら危なかったと思っています。

決勝 vs もちココア

決勝の相手は予選で唯一負けていたもちココアで、予選のリベンジとなる試合でした。

勝ちの流れを掴めたのは4戦目のモズクホコでした。このモズクホコは1戦目は取れたものの、2戦目と3戦目を落として悪い流れの中の試合でした。

試合の中でも先に致命傷レベルのカウント27まで取られてしまい絶体絶命でした。しかしわたこさんの偉い動きもあって紙一重で逆転勝ちすることができました。この試合を落としていたら流れで負けもあったので、かなり大きい1勝でした。

終わりに

第二期大王戦を優勝することができました。個人的には前期の第一期大王戦は惜しくも決勝で破れていたのでそのリベンジを達成できて良かったです。 プライムとかいう塗りが弱く味方負担になりがちな武器を持たせてくれたチームメンバーに感謝です。

前回まで同様とても楽しめた大会だったので次もあれば参加したいです。

今年 Amazon で購入して良かったもの

この記事は、 大阪工業大学 Advent Calendar 2020の4日目の記事です。


こんにちは、id:odan3240 です。OIT には 2014-2018 の間在籍していました。Twitter やってます→@odan3240

クイズ

突然ですが、↓の表の2014年から2020年までの件数は何の数字でしょう

2014年 2015年 2016年 2017年 2018年 2019年 2020年
5件 22件 12件 22件 62件 81件 147件

正解はその年ごとの Amazon の注文件数の数でした。

社会人になった2018年と、2020年の注文件数が前年に比べてかなり増えていることがわかります。今年はコロナの影響で家にいることが増えたせいで、平常時だとスーパーで買い物していたものを Amazon で購入するようになったため、かなり件数が増えてました。

この記事ではそんな2020年で Amazon で購入して良かったものを紹介しようと思います。

購入して良かったもの

無洗米

これは2018年頃から購入し続けています。スーパーでもお米は買えるわけなんですが、何しろ重いので Amazon で買うと楽です。まあその代わりに重たい荷物を運んでくださっている方がいるわけですが...。

牛めし

牛丼チェーンの中だと松屋牛めしが一番好きで、会社に通勤していた頃はオフィス前の松屋によく通っていました。実はこの松屋牛めしは冷凍のものが Amazon で販売されています。味もお店で食べるのと違いがなくて気に入っています。あと1食あたりの体積が小さく冷凍庫のスペースを奪わないのもポイントが高いです。

カルピスソーダ

1.5L * 8本を Amazon で頼んでおくと1ヶ月ぐらい持つのでおすすめです。これもお米と同じくスーパーで買うと重たくて大変なんですが、Amazon だと楽だというやつです。個人的にカルピスソーダが一番美味しい炭酸飲料だと思って買い続けているんですが、好きな炭酸飲料でいいと思います。

カルピスソーダ 1.5L×8本

カルピスソーダ 1.5L×8本

  • 発売日: 2014/03/17
  • メディア: 食品&飲料

洗濯物を干すやつ(でかい)

洗濯物を干すやつは前から持っていたんですが、今年倍ぐらいサイズが大きいものに買い替えました。干すやつが大きいと一度に干せる洗濯物の量が増えるので、洗濯が1週間に1度ぐらいのペースに減って楽になりました。ただ本当はドラム式洗濯機で乾燥まで全自動化するのが正しいので、来年こそは買いたいです。

Bluetooth イヤホン

洗い物とか洗濯をしながら YouTube を見れるのが神

フライパン

食材がくっつかないのが神。フライパンを洗うのも楽になりました。

終わりに

というわけで今年 Amazon で購入して良かったものの紹介でした。

来年はここにドラム式洗濯機とか食洗機とかルンバを並べて家事の自動化をしていきたいです。

カバレッジの変化をプルリクエストに通知する GitHub Actions を作った

動機

ある日ふとこんなことを思いつきました。

テストのカバレッジを集計する SaaS として CoverallsCodecov があります。これらの SaaS は詳しいカバレッジの変化や、GitHub Status としてカバレッジ閾値を設定できたり様々機能があります。しかし、GitHub Actions がある今なら一分機能を外部に依存することなく実現できるのではと考えました。

先人が似たものを開発していないか、GitHub Marketplace で 「coverage 」をキーワードに検索してみましたが見つかりませんでした。 https://github.com/marketplace?query=coverage

そこで今回自作したのが「Coverage History Action」という GitHub Actions です。

github.com

使い方

以下のような workflow を用意します。

name: CI


on:
  push:
    branches:
      - "master"
  pull_request:
    types: [opened, synchronize]


jobs:
  report:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js 12.x
      uses: actions/setup-node@v1
      with:
        node-version: 12.x
    - name: yarn install
      run: |
        yarn install --frozen-lockfile
      env:
        CI: true
    - name: Run test
      run: |
        yarn test
      env:
        CI: true
    - name: Coverage History Action
      uses: odanado/coverage-history-action@v0
      with:
        github-token: ${{ secrets.GITHUB_TOKEN }}

この workflow が発火するタイミングは 「master ブランチへの push したとき」と「プルリクエストの登録と更新したとき」です。
前者のタイミングで、master ブランチのカバレッジGitHub Actions の cache に保存されます。後者のタイミングで、プルリクエストのコメントに2つのブランチでのカバレッジの様子が通知されます。

通知の様子

f:id:odan3240:20200531001148p:plain

Perl でちょっと CPAN モジュールを試すのに Google Colaboratory が便利

モチベーション

NodeJS である npm パッケージを試したいとなった場合 RunKit is Node prototyping がとても便利です。任意の npm パッケージをインストールができ、なおかつ他人のその結果を共有できます。例えば、これは誰かと一緒にある npm パッケージの使い方の相談をするときによく使います(e.g. lodash の groupby の使い方を示したり)。

Perl でも同様に任意の CPAN モジュールをインストールして、他人に結果を共有できるサービスがあると便利なのですが、一般公開されているものを見つけることはできませんでした。

そんな気持ちを持ちつつ、ある日突然 Google Colaboratory を使えば目的を達成できるのではと気付いたので、これを紹介します。

やり方

perl.ipynb · GitHub にアクセスします。

画像の Open in Colab をクリックすると notebook が開きます。

f:id:odan3240:20200313014752p:plain

ランタイム > 全てのセルを実行 を選ぶと Perl と cpanm とよく使いそうな CPAN モジュールがインストールされます。 f:id:odan3240:20200313014911p:plain

任意のモジュールをインストールする場合は !cpanm --notest --quiet SQL::Maker などと実行すればよいです。

f:id:odan3240:20200313015210p:plain

まとめ

かなり便利では??

2019年 ふりかえり

2019年あっという間だった

ふりかえり

GitHub

一覧

issue と pull request が合計で16件でした。ethereum/web3.js や terser/terser にコントリビュートできたのが印象的でした。

issue のバグを再現したり、英語考えたりするのは大変だけど継続したい。

個人開発

合計5件でした。

年の真ん中の時期はサービス系の開発は何もしてない...。

Web サービス系

odan3240.hatenablog.com

odan3240.hatenablog.com

npm

github.com

github.com

github.com

登壇

合計5件でした。

Presentations by odanado - Speaker Deck

Docker + NodeJS の開発環境のモヤモヤを話したら予想以上の人に見てもらえたのが嬉しかった。
PyCon JP で登壇したけど、うまく内容をまとめられなくてとてもつらい気持ちになった...。

ブログ

はてなブログ6件、Qiita 2件、会社のブログ2件でした。
全然書けてないという印象です。

記事一覧 - odan’s diary odanado - Qiita

来年は

  • バグを見つけたらもっと積極的に issue とか pull request を立てていきたい
  • 今年と同じ数ぐらい登壇したい
    • 大きめなカンファレンスでも話したい
  • 個人開発も継続したい
  • ブログをもっと書いていきたい
    • 特に会社のブログ
      • 会社のブログが活発な会社で働いていたいという気持ちがあるので、自分からやっていきたい

数字

  • GitHub: 50 ぐらい
  • 登壇: 6件
  • 個人開発: 3つぐらい?
  • ブログ
    • 個人のやつ: 6つ
    • 会社のやつ: 6つ

Android ユーザーでも Splatool.net で対戦分析したい

これは Splathon Advent Calendar 2019 の 12 日目の記事です。

昨日はつぼさんの スプラトゥーンの X パワー向上のきっかけになったこと でした。

Splatool.net とは

Splatool.net とはスプラトゥーンに関する様々なツールが公開されているサイトです。

いくつかあるツールの中でも対戦分析ツールが個人的にお気に入りです。以下の URL はサンプルデータを表示している様子です。
各プレイヤーの勝率やキルレなどが集計されており、プラベ後のふりかえりに重宝します。

https://splatool.net/analytics/chk.php?c=15347260365591&m=p

対戦分析ツールの使用方法にもある通り、json 形式で出力した イカウィジェット2 のバックアップデータをアップロードすることで、対戦の分析結果を閲覧できます。

Android ユーザーの悲しみ

イカウィジェット2はありがたいことに、iOS 版だけでなく Android 版 も提供されています。

iOS 版と Android 版の間に機能や UI の差はほぼありません。しかし、バックアップデータの形式は iOS 版と Android 版で差があります。具体的には Android 版はバックアップを実行すると .ikax という謎の拡張子を持つファイルが生成されます。 f:id:odan3240:20191212223814p:plain

Splatool.net の対戦分析ツールは、この ikax ファイルには対応していません。実際にサイトにも (もしAndroid版でも出力可能でしたら、ご指摘下さい) という注書きがあります。

Web アプリを作った

どうしても対戦の分析をしたかったので、先月中旬頃から謎の ikax ファイルを json ファイルに変換する Web アプリを開発していました。それがこちらです。

splatool-converter.firebaseapp.com

使い方

ikax ファイルを選択する

中央のアップロードできるところ (伝われ) をクリックしてローカルにある ikax ファイルを選択します。一般に ikax ファイルのサイズは数十 MB と大きめなことが多いので注意してください。あと Google Drive などクラウドストレージにある ikax ファイルのアップロードはエラーが発生して失敗するので、一度ローカルにダウンロードすることをオススメします。

f:id:odan3240:20191212225845p:plain

ikax ファイルをアップロードする

アップロードボタンを押下すると ikax ファイルのアップロードが始まります。30秒ぐらい時間がかかります。待ってください

f:id:odan3240:20191212230113p:plain

json ファイルをダウンロードする

アップロードが終わると直近100戦の対戦データが一覧で表示されます。json ファイルとしてダウンロードしたい試合についてチェックボックスを選択してダウンロードボタンを押下すると json ファイルがダウンロードされます。Android だと同時に10個までしかファイルをダウンロード出来ないようなので気を付けてください。

f:id:odan3240:20191212230601p:plain

仕組み

時間がないので箇条書きで済ませます。そのうちどっかで清書したいです。あとコードも公開したい...。

  • ikax ファイルは実は zip ファイル
    • file コマンドを実行するとわかる
  • zip ファイルの中には Realm 形式のファイルが入っている
  • ikax ファイル → json ファイルへの変換は Cloud Functions で行っている
    • Realm の JavaScript SDK はネイティブモジュールに依存しているのでブラウザで動かない
      • wasm に変換できればわんちゃんあるかも...?
  • ikax ファイルは Cloud Functions に直接 POST せず Cloud Storage にアップロードしている
    • Cloud Functions は1リクエストあたり 10 MB の制限がある
    • Cloud Storage へのアップロードをトリガーに Cloud Functions を実行している
  • Realm => json への変換はルールベース

終わりに

Splatool.net の対戦分析ツールは Android 版未対応だったので、これを何とかする Web アプリを作った話 & 紹介をしました。 11月中旬から開発を開始していたので、12月12日のアドベントカレンダーには余裕で間に合うやろwと思っていたのですが、基本的な機能の開発だけでギリギリになってしまいました。

今後も開発を継続する予定ではあるので、もしよろしければ使ってみてください!

明日は tellusium さんの「Middle League まとめを書こう書こうと思ってかけていないので Deadline Driven Development を実行する」です。tellusium さんと同じチームで Middle League に参加していたので個人的に楽しみな記事です。