See the Elephant

1992生まれのプログラマが書くエンジニアブログ

Github ActionsでCI testを回す

Github ActionsでCI testを回す

このブログでやること

- github actionsでCI testを回す
- docker の nodeコンテナを使う
- CI testを行う

今回はすでに動いているリポジトリにci testを追加します。

nodeのバージョンを揃えるため、dockerコンテナを利用する方法を採用しました。

別の言語やruntimeを使っている人は適宜読み替えてください。

github actions がきた!

github actions きましたね。 github上で起こるアクション(push, prなど)に応じて特定のタスクを実行することができるタスクランナですね

f:id:namu_r21:20191117105905p:plain
github actions navi bar

リポジトリの 「actions」からいけます。 めちゃくちゃ設定が簡単で、30分ほどで設定できました。

GitHub Actionsについて - GitHub ヘルプ

詳しくはこちら

www.kaizenprogrammer.com

こちらの記事がusageについて詳しいです。

workflowが登録できる

「new workflow」をクリック

f:id:namu_r21:20191117110620p:plain
build workflow

ここで「set up a workflow」 します。
yamlファイルでworkflowを定義します。

yamlの項目はこちらに詳細に書いてあります。

GitHub Actionsのワークフロー構文 - GitHub ヘルプ

初期状態はこちら。

name: CI

on: [push] # pushで実行

jobs: # ジョブ一覧
  build: # ジョブ

    runs-on: ubuntu-latest  # ジョブを動かす環境を選ぶ(複数指定可能)

    steps:
    - uses: actions/checkout@v1  # github のリソースにアクセスするアクション
    - name: Run a one-line script  # workflow name
      run: echo Hello, world! # CLIで実行されるshell command
    - name: Run a multi-line script
      run: |
        echo Add other actions to build,
        echo test, and deploy your project.

nodeでtestを回す準備

この節は適宜読み飛ばしたり、読みかえてください。

CIの前に依存パッケージインストール, ビルド, テストの準備を行います。

ここに関しては元々用意してあったため使いまわしました。

僕は開発にMakefileを利用しています。

プログラムのビルド作業を自動化するツールですね。

よく使うコマンドをMakefileに記述することで開発速度を早めることができるためです。

特にCIなど予め定められた特定の処理を行う場合には非常に優秀なツールです。

qiita.com

今回はnpmで依存パッケージのインストールと、gulpによるビルド、テスティングライブラリavaによるtestを行います。

Makefile


.PHONY: install gulp

npm=$(shell which npm)
npx=$(shell which npx)

install:
    $(npm) install # package.jsonの依存lib install

gulp:
    $(npx) gulp # gulpでビルド

test:
    $(npm) test # package.jsonのtestを叩きます

package.json (一部抜粋)

{
  ...,
  "devDependencies": {
    ... ,
    "ava": "^1.3.1",
    "gulp": "^4.0.0",
    "gulp-cli": "^2.0.1",
    ... ,
  },
  "ava": {
    "compileEnhancements": false,
    "extensions": [
      "ts"
    ],
    "require": [
      "ts-node/register"
    ]
  },
  "scripts": {
    "test": "tsc && ava"
  },
  ...
}

Github ActionsでCI testを回す

さて、準備が整いました。yamlを書いていきます。

今回は docker の nodeコンテナを利用します。

github.com

setup-node が利用可能です。

name: CI

on: [push, pull_request] # prが出た時, pushした時にciをトリガする

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v1 # これがnode コンテナ
        with:
          node-version: '10.x' # withでバージョン指定
      - run: make install # makefileで指定したタスクをrun!
      - run: make gulp
      - run: make test

job はデフォルトで並列実行されます。

このため、 このjobでは install -> build -> test を1つの jobで行っています。

個々の役割を job に切り分けることも可能です。
その場合は jobs.<job_id>.needs で依存jobを指定できます。

一度試してみましたが、needsを書くだけではうまく動きませんでした。 jobごとにインスタンスが生成されるのでその辺を解消しないといけません。

今回はそこまでやらなくてもいいのでここまで。

3ヶ月の振り返り 2019/7-10月

時系列

捨てて入れる

  • 2019/07

    • エンジニア復職
      • とはいえコードは書いてない
    • cybozu kintoneの引き継ぎ
      • 7月入社の人にレクチャー
  • 2019/08

    • 新卒エージェントチームのスプレッドシート運用をkintoneに置き換え
    • オンライン面談商材のスキーム定義と実装
    • cybozu kintoneの引き継ぎ
      • kintoneの構成を変える仕様設計
    • この辺からちょこちょこプロダクトコードのコードレビュー
  • 2019/09

    • コード書きたいのにかけなくてめっちゃストレスだった記憶ある

    • cybozu kintoneの引き継ぎ

      • kintoneの構成を変える仕様設計と実現
      • ほっとんど毎日クエリ書いてた記憶
      • 新しく入ってきた同僚への指導がメイン
    • この辺からscala, react触り始める

    • ガーデニングを初めてやった

      • 毎週scalajavascriptの周辺ライブラリをupdateする作業
      • これは今もあんまりよくわかってない
    • 友達の結婚式でお金のLTやってた

    • isucon初参戦

      • 頑張ったけども全然貢献できなかった
  • 2019/10

    • エンジニアとしてサポのメインプロダクトの開発開始

      • 半年エンジニアリング離れるとマジでコマンドや知識が出てこなくなってた
        • mysqlshow create table がパッと出てこない
        • リリースの影響範囲の確認作業とか
    • 企業情報扱うあたりの仕事をやってた

      • apiサーバ, クライアント(react)両方触る
      • コード書くのたのちぃ
    • 引き続き, 企業情報触る系のお仕事

    • shell scriptでcurl叩くような一括入稿系のスクリプト書いた

image

直近の目標/前回のやっていき、それらのざっくり進捗

  • scalaとreactの習得が目下の課題
  • 自分がいたチーム以外のドメイン知識入れるのが大変
  • なんだかやっとプロダクトの思想がわかってきたくらいのフェーズ

やったこと、学んだこと

もっと上手くやれたなと思うこと

  • ドッグフーディングとコードリードはあまりすすんでない
  • コードもっと書きたいなー
  • scalaへの苦手意識がまだ強い
    • 型パズル
    • Either[Throwable, Option[Seq[string]]] みたいなのをunwrapしていく時に 今どこ?ってなる
      • それはTypeScriptもそうか

次回振り返りまでのやっていき (Try)

  • げきつよエンジニアになりたい
  • 昇級すること
  • 英語圏で働いてみたいので色んな話聞いてみてる
    • ウガンダのキオスクappを開発する話を今度聞いてくる
  • 確定申告めんどい

最近読んでおもろかった本

image 思考は実現化する

image ブレインプログラミング

2018/8月 - 2019/8月 1年振り返りやってみる

ポエム書く。

お金周りについてとても正直に書くのであまり拡散しないでほしい。

(お金について話しすぎると人が離れていくことがわかったので。)

ちょうど副業的なことを初めて1年が経過したので振り返りをやってみよう。

大まかな1年の流れ

広告エンジニアで「人の役に立っている感覚 & 成果」が得られず鬱になる

-> 社内異動で人材総合職になる
-> 総合職的な働き方に向いてないことを悟る
-> ブログで生活できるほどの収益が出るようになる
-> 環境変化とブログ収益により鬱改善
-> 再度エンジニアとしてやり直していくことに

こんな感じの1年だった。

枝切りの年

今思えば「枝切り」の1年だったのかなと思う。

自分の得手不得手を実際に試してみて、枝切りしていくような感覚の1年だった。

  • エンジニアリング △
  • 人付き合い ×
  • 標数値達成 ×
  • セールスライト ○
  • アフィリエイト
  • 一人で作業 ○
  • みんなでわいわい △
  • イベント運営 ○
  • 朝起きる & 締め切り ×
  • 物をうる技術 ○

自分で自分を評価してみるとこんな感じ。

自分で自分の得手不得手を知るのはなかなか客観的にはできない。

なので社内で試行錯誤させてもらった感じの1年間だったかなと。

時間や数字に追われ人付き合いする仕事はマジで向いてない。

一人で黙々とやりたまに仲間と楽しくやる、みたいな働き方が向いてそう。

エンジニアキャリアについて

その辺歩いてる女の子や営業さんよりはエンジニアリング得意だなーと思えたのが大きかった。

もう一回エンジニアやって見ようと思えたし、「ダメだったら他の方法で稼げる」という楽観的な視点を得られたのも良かった。

今は、サーバサイドとDBの知識をつけていきたいなーと思っている

ソフトウェアアーキテクチャとDBA的な立場で仕事がしていけると楽しそう。

心のメンターはそーだいさんとt_wadaさんと弊社の前田さん。
あと、心の兄さんは、にしごーりさん。

この辺読みたいので仲間募集中

楽観視と鬱改善

過去の自分は「理系修士でエンジニアとしてうまくやっていけなかったら取り得なくて死ぬ」みたいな極端な考え方だった。

ブログだったり、コミュニティのイベント運営だったり総合職を試してみて「まぁなんとかなんじゃないかな実際やめても」と人生を楽観視できるようになったのはとてもいい点だった。

この認知の変化が鬱の改善に繋がったのかなーと思う。

僕の場合、幸い「人に物をお勧めして買ってもらう能力」がとても高いのでそこで自信がついた。

そして実際に成果として出ている。

「やってみたいこと」「得意なこと」「日常で自然にやってしまうこと」を発信してお金に変えてみる、臆することなくお金を受け取ってみるのはとても大事なことだなーと思った。

キャリアについて

すごく正直に言うと、すでに仕事をしなくても生活できるほどのお金が得られるようになった。

だからといって、仕事をやめるつもりはないなぁ。

  • 経済的安定性
  • キャリア
  • 好きなこと

この軸で考えると「エンジニアとしてやっていきたい」と思えた。

  • 経済的安定性:

    • ブログはgoogle次第。エンジニアは自分の能力次第。
  • キャリア:

    • エンジニア向こう10年はなんとかなる。おもろい。市場価値高い。
    • ブログで長期的に稼ぐのはむずい。おもろいけど辛い。ずっとはモチベーション持たない。
  • 好きなこと:

    • エンジニアリングは結構好きだなーと。ここは続けていきたい。
    • 本業の他に「好きなことをお金に変える」のは有効だなと
    • 趣味がお金に変わるので「趣味 => 投資」に変わる
    • このパラダイムを知れたのはここ1年における収穫

好きなことがお金になる

「好きなことでお金を稼ぐ」っていうのは多分本業でも副業でも同じ。

そして 「できるだけ苦手、嫌いなこと」を減らしていくことが大事

そうすると、生きることそのものが好きになるし、それが仕事になっていく。

そう言う感じで「枝切り」していくと自然に流れができて成長できるんだろうなーと思った。

お金の使い方 消費

自分はマーケティングとものづくりが結構好きなのでそう言う面で将来的にお金が得られるようになれば嬉しい。

5つ星ホテル泊まったりひとり旅行行ったり、ホテルのラウンジ行ったりしたけど「別にそんなに楽しくねぇ」と言うことがわかった。

お金は自分の能力や好きなこと、周りの好きな人に回してなんぼのもの。

お金は自己実現に使っていきたい。

お金の使い方 好きなことに投資する

ヘッドホン好きだし、マーケティング好きだし、発信も好きだし、webプログラマーなので

向こう一年はwebプログラミングの勉強しながら

ブログで稼ぐ
-> 稼ぎのほとんどをヘッドホン発信 / webプログラミング / マーケティング勉強に繋げる
-> youtubeで発信する
-> webサイト運営に回す
-> これの繰り返し

VRも面白そう。今後VRは確実に流行り来る世界。 つまり「空間方向性を持った個人音響デバイス(e.g. 7.1chヘッドホン)」にお金が流れる世界がくる。

それまでに「ヘッドホンといえばしゅーぞー」という認知を作っておきたい。 だからYoutubeやってみようかなーと。動画編集も好きだしね。

人に物売るの楽しいし、実際に人々は僕から物を買ってくれるので多分天職の一つだと思う。

1年後までに月100万くらい作りたいなーと思っている。

できたら嬉しいなぁ。多分俺ならできる。頭の中ではもう割とできてる。
webエンジニアとして、webマーケターとしてやっていこう。

ポエム終わり。

年表詳細は以下


2018

  • 8月 鬱の診断を受ける(おそらくこの時期)
    • 同時に投薬を始める
  • 8/31 副業ブログを始める
  • 9月-10月
    • 帰ったらひたすらブログ書く
    • 仕事はあまり手につかなかったし、実際仕事の記憶が曖昧
  • 11月
    • この辺がもっとも体調が悪かった記憶
    • この辺でエンジニアとして働くのを1度やめるか考え始めていた
    • ちょっとずつブログのPVが増えてきた。楽しいので続行
  • 12月
    • 中旬のある日、「もうやめる!」と頭の中で何かが切れて総合職としての異動を依頼する
    • 2週で異動が確定し異動前のお仕事を片付けていた
    • 一番症状がひどかった
    • 副業ブログにamazonアフィリエイトを差し込んだ

2019

1-2月
- 本業は異動に向けて仕事の片付け
- ブログで3000円ほど収益が出る

2月
- 総合職として働き始めるもの以下の理由で絶望的に向いてないと悟る
- 人に関心が持てない
- 数字達成に関心が持てない
- 朝が起きれない
- 電話が嫌い
- 同じことの繰り返しが嫌い
- 「これじゃないかもな...?」と1ヶ月目に悟る
- ブログで月1万程度収益が出るようになってくる
- 異動したことでかなり精神的に改善され元気に

3-6月
- 上記の総合職的な働き方が向いてないと判断され、チーム内の技術的サポート役になる
- 業務のほとんどの時間が技術的な内容だったため異動先のエンジニアチームへの異動を打診する
- ブログで月10万ほどの収益が出る

7-8月
- エンジニアに転身。テックチームに配属
- scalaとtypescriptを学ぶ
- 主治医から断薬と経過観察と言われる。鬱の症状はかなり改善した
- ブログでなんとか生活できるほどの収益が出るようになる(月間50万PV超えた)

【React】 useMemoとuseCallback何が嬉しいの?

qiita.com

useMemoとuseCallbackはdeps(計算が依存しているプロパティ)の同一性チェックが毎度入るのか

useMemo

つまり同一性チェックの計算より重い計算であればuseMemoで変数に処理をキャッシュしておいた方がいい

useCallback

https://qiita.com/teradonburi/items/5b8f79d26e1b319ac44f#%E3%82%A2%E3%83%AD%E3%83%BC%E9%96%A2%E6%95%B0%E3%82%92props%E3%81%AB%E5%8D%B3%E6%99%82%E9%96%A2%E6%95%B0%E3%81%A7%E6%B8%A1%E3%81%99

アロー関数をpropsに即時関数で渡す

これはコンポーネントのrenderのたびに関数インスタンスが生成される。

useCallback を使うとインスタンス生成を抑制でき、再描画のコストを下げれるらしい。

どっちも計算量を下げるための一手なんだねぇ

mysqlで検索結果のカラム値を変数にキャッシュする

> SELECT @min_user_id := `id` FROM users ORDER BY id DESC LIMIT 1000;

これで @min_user_id に検索結果がキャッシュされる。

select 
 @cache1 = case when ...end, -- int
 @cache2 =  case when ...end, -- int
 @cache1 * @cache2 as calc
from hoge

キャッシュした値でもって計算したいときに便利っぽい。 これがないとサブクエリで倒さないといけなかったのでちょっとだけ便利かも。

以下みたいな冗長なクエリじゃなくなる。

select 
 cache1 * cache2 as calc
from (select 
 case when ...end as cache1, -- int
 case when ...end as cache2, -- int
from hoge) as tmp

scalaのforはflatMapやmap相当らしい

blog.shibayu36.org

val map = Map("a" -> 1, "b" -> 2)

map.get("a").flatMap(a =>
  map.get("b").map(b => {
    a + b
  })
)
map.get("a").flatMap(a =>
  map.get("c").map(c => {
    a + c
  })
)
map.get("c").flatMap(c =>
  map.get("b").map(b => {
    b + c
  })
)

上記のコードは以下のコードと等価らしい。

val map = Map("a" -> 1, "b" -> 2)

for {
  a <- map.get("a")
  b <- map.get("b")
} yield a + b

for {
  a <- map.get("a")
  c <- map.get("c")
} yield a + c

for {
  c <- map.get("c")
  b <- map.get("b")
} yield c + b

上の例では、一番最初だけ Some(3) を返しあとは None を返す。

これは便利だなぁ

【東南アジア1人旅】8/7 0日目 動機

深夜特急を読み、憧れた東南アジアへの旅行。

初めての1人海外旅行。

今、日本からタイに向かう空を飛びながらこれを書く。

ある一言の動機

元はといえば。

新卒1年目24歳のとき、社長にオススメの本を聞いたことが始まりだ。

僕「オススメの本は何ですか?」 社長「深夜特急だね。あの本はいいよ。僕もあの本を読んでから色んな国に行くようになった」

その言葉を聞いてすぐにkindleで購入した。

その時は冒頭を少し読んだだけで読むのを辞めてしまっていた。

なんだか気分が乗らず頭に文字が入ってこなかった。

新宿ミロードの木曜占い師

それから2年経って今年7月、なんだか仕事のやる気が出ず平日木曜に休みをもらい新宿を歩いていた。

新宿ミロードに立ち寄り、昼ごはんを食べようとしたときエレベーターから暇そうにした年配女性の占い師がちらっと見えた。

当時、占いに妙なハマり方をした僕は彼女に占ってもらった。

占いは信じるかどうかは別として、人生を盛り上げられるエンターテイメントとしてとても面白いのでオススメだ。

トンデモでスピリチュアルだけど、乗っかってみると自分だけでは出せないパワーが出せたりする。

その占い師は、何でも木曜しかいないそう。

彼女の言うことは、具体的でかなり僕の思考に近い的を得ていたので、なんとなくその言葉を信じてみることにした。

結果は、「今年は海外の運気が強い。だから色々と旅へ行ったほうがいい。」とのこと。

その一言で何故か急に深夜特急を思い出した。

26歳の渡航

深夜特急は著者の沢木が香港からロンドンまでバックパック1つで旅をしたノンフィクション小説。

約20年以上前、僕が生まれた頃の物語だ。

彼は仕事を辞め、26歳の時に香港に渡航した。

「お、僕と同じ歳だ」

なんて思いながら読んでいた。

たんなる偶然だけど、ちょっと嬉しくなった。

彼は香港に渡航後、マレー半島に渡る。

タイ バンコク〜マレーシア ペナン〜シンガポールを順に鉄道で南下していく。

特にペナン島はとても魅力的に描写されており、心を惹きつける。

娼婦とヒモが住む安ホテルが主な舞台となる。

彼は若き娼婦とそれをタカる陽気なヒモと仲良くなり、同じ屋根の下、溶け込むかのようにまるで青春のような時間を過ごす。

その節を読み、とても東南アジアに行ってみたくなった。

何故、東南アジアなのか

その理由は僕にもよくわからない。

OJTの故郷だったり、好きなYoutuberの居住地だったり、大学の友人の故郷だったり。

色々とこじつけはできるのだけど…

ただなんとなく数多ある国の中で1番惹かれたのがマレーシアだった。

「なんか良さそうだから行こう」

この「なんか」という感覚がひどく直感的だったので、それに素直に従ってみることにした。

住んでみたい国でもあるし、実際に見に行こうと思った。

何故1人旅なのか

深夜特急に憧れた、というと多分それもある。

が、どちらかというと

「誰も知り合いのいない異国( アウェイ)に行ったとき、僕はどこまで1人で耐えれるんだろう」

という負荷テスト的な一面がある。

1人でどこまで行けるのか試してみよう

toeic 400程度で英語力もなく言葉の殆ど通じない異国でひとりで歩くのは不安だ。

騙されるかもしれないし、病気になるかもしれない。

だけど、リスクをとって1人で出ていけるようになった時、もっと自分のことを信じられるような気がする。

死なない程度の失敗は糧になる。

金も荷物も盗られていい。

最低限、5体満足で健康で帰って来れれば良い。

それくらいの気持ちで1人旅に出てきてみた。

長くなってきた。続きはタイで書こう。