最近読んだ本たち

コロナのおかげでせっかくの有給消化なのに外出自粛になってしまった。 引き篭もってひたすら本を読んでいたので、読んだ本をまとめておこうかと思います。

データ指向アプリケーション

転職ドラフトの友達紹介キャンペーンでいただきました。 選んだ理由はプレゼントの上限5000円に一番近かったからという現金な理由です笑

別に業務で分散システムを作るわけでもないしなーということで直接的には仕事に役に立たないかも?と思いながら読み始めました。 本書ではこの点をまず否定され、現代のアプリケーションは大抵の場合、CPUの演算能力ではなくデータ処理能力がボトルネックになってきているという事実を教えてくれました。

分散処理における合意とはなんなのか?など難しい話もたくさんあり正直理解は追いついてません。 ただ、NoSQLにおけるインデックスとはなんなのか?RDBのB-treeインデックスの仕組みについてなどこれまで理解していなかった部分を丁寧に説明してくれているので大きく理解が深まりました。 時間がない方は「第I部 データシステムの基礎」だけでも読んでみるといいと思います。

レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス

こちらも同じく転職ドラフトの友達紹介キャンペーンでいただきました。

ということで転職ドラフトさん本当にありがたいです。

この本にした理由はずばり、最近業務でkintoneに触って本当につらいなーと思うことが多々あったためです。 kintone自体は悪くないんですが、無秩序に設定されたkintoneのカスタマイズ用JavaScriptが大変メンテナンス性が低い状態でした。

自分で考えてメンテナンス性が高い状態にできないか色々やってみたんですが、果たしてこれは正しい方法なのか?ということが気になりました。 また、初めから自由に作れたとして、私は先人の失敗を生かして正しく作ることができるのか?という点も不安になりました。 これらの疑問、不安を解消できるのではと考えこの本を手にとった次第です。

レガシーコードを作らないための方法論はこれまで種々の本で読んだことがある内容でしたが、単なる方法論に終始せず、その裏側にある原則まで丁寧に書かれており、表層をなぞるだけでなく腹落ちすることができました。 結果として、この本を読むことで私のやっているレガシーコードの改善の方向は間違いではなかったと言い切れるようになりました。 また、正しく作れるのか?という点でもある程度自信を持てるようになりました。 あとはひたすら実践して技術を磨いていくしかないなと思います。

ミックさんのSQL

ずーっと積読になってしまっていたのでこの機会に一気に消化しました。 たしか、ゼロからはじめるデータベース操作は前職に入るときに買ったので約3年半ほど積んでいたことになります。

なんでこんなに積んでいたかというと、シンプルに業務上必要なかったからでした。 インフラエンジニアだと、基本的にSQLに触れる機会もパフォーマンスチューニングするときくらいなもので、なかなか書く機会もありませんでした。 あと、もともとがだいぶものぐさな質なので必要に迫られないと学ぶ気にならないのです。。

転職もしたし、このままではいけないなと思い、今回、DB設計からSQLの基本文法、応用的なSQLの書き方までこの3冊でまとめて学習しました。

  1. DB設計 徹底指南書(設計)
  2. ゼロからはじめるデータベース操作(基本文法)
  3. SQL徹底指南書(応用)

の順番で読むと良いかと思います。

読み終わったあとは以下のサイトで実際にSQLを書いてみました。 パズルみたいで楽しかったです。

sqlzoo.net

社会復帰まであと3日です。 コロナも相変わらずなのでガンガン読んでくぞーー

または私は如何にして心配するのを止めてキーボードを割るようになったか

以下の分離式キーボード(BAROCCO MD770)を買ってみたので、感じたことをまとめてみます。

購入まで

転職を機にキーボードでも買ってみるかと思い立ち、いざ秋葉原へ。 事前に調べたところ、HHKBやREALFORCE静電容量無接点方式で病みつきになる人はなるらしいとのこと。

www.realforce.co.jp

ここで一つ問題が、、HHKBを試し打てる場所が少ないんです。

最新機種はそもそも店頭販売しておらず、以下の数店舗で試し打てる状況です。 でもどこもお洒落で入りづらい(五反田原価バー除く)。

www.pfu.fujitsu.com

旧機種については当然在庫がなくなれば試し打ちさせる必要もない訳で徐々に店頭展示されなくなっていきます。 今回は運良く1軒目に入ったビックカメラで触ることができましたが、それもいつまで持つかわからない状況ですので購入を考えている方はお早めにどうぞ。

ということでビックカメラでHHKBとREALFORCEを両方試せたんですが、静電容量無接点方式というのがどうも肌に合わない! ふわふわしていて押した感が弱くて自分には合いませんでした。。

カニカルキーボードなら合うのかなーと思い、何機種か引き続きパチパチ叩いてみたところ、茶軸というのがどうも相性が良さそうだなと感じてきました。 以前から軸がなんたらみたいな話は聞いたことがありましたが、実際に自分で体験することで軸の違いを体感することができました。 本当は青軸も良いなと思ったんですが、だいぶうるさいので、会社で使うかもしれないことなど考え茶で妥協しました。

軸も決めたのであとはどのキーボードにするかです。 色々触ってみましたがどれも決め手がなく判断に迷っていたところ、BAROCCO MD770を触った瞬間一目惚れしました。。 指に吸い付く触り心地や適度な反動、そして大きすぎず小さすぎないちょうど良いサイズ感など全てが気に入りました。 なかなかケチな性分なのでその場では買わず、ツクモに行きaupayで支払って買いました。ちょうどaupayの20%還元が行われていたこともあり、実質14000円弱で購入することができました!

つかってみた感想

  • スペースキーが2つ
    使い分けしたいけどできなそう
    できれば右スペースキーはエンターにしてみたいなと思ったり。

  • 打ち方が自己流すぎたのを矯正できる
    いつもBを右手で打っていましたが離れたのでできなくなりました。
    正しい打ち方を学べそうです。

  • 左スペースとコマンドキーを打ち間違える
    英かな変換をしたいときに間違えてスペース打っちゃう事故が多発。。
    慣れれば問題なさそう。

まだ2時間程度しか触ってないので感じたことはこのくらいです。追って感想は追記しようかと思います。

helmについて調べてみる

現職ではぼちぼちkubernetesに触れているが、なんとなくhelmは避けてきた。

helm.sh

以下のようなkubernetesにおけるパッケージマネージャと言われている点に不安があったからだ。 ある程度kubernetesについて理解してから使うならまだしも、あまり理解しないまま、helmを使って設定部分を隠蔽化してしまうことに不安があったのだと思う。 thinkit.co.jp

最近はkubernetesにも慣れてきて前述した不安も薄れてきたので、食わず嫌いをやめて少し調べてみる。

helmとはパッケージマネージャである、とはどういうことなのか調べてみた。 Linux OSではAPT,Yum,DNFなどパッケージマネージャを使って、ソフトウェアのインストールを行うことができる。 これらのツールは目的のソフトウェアが依存している他のソフトウェアのインストールも自動で行い、手動での依存関係の解決無しに目的のソフトウェアのインストールを簡単に行えるようにしてくれている。

この考え方をkubernetesに適用した結果できたのがhelmとのこと。 helmを使うことで、kubernetesクラスターに必要とするソフトウェアが稼働するPodおよび、Serviceなどのkubernetesリソースを作成することが簡単にできるらしい。 Linuxのパッケージマネージャと同様にレポジトリが存在し、そこからChartと呼ばれるパッケージ(前述した、ソフトウェアが稼働するPodおよび、Serviceなどのkubernetesリソースをまとめたもの)をインストールする。

https://hub.helm.sh/

Chartが依存するChartを指定でき、Linuxのパッケージマネージャと同様に依存性を解決してくれる。

helm.sh

Chart内のkubernetes設定用のyamlはGo templatesで記載できる。

helm.sh - k8s.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: deis-database
  namespace: deis
  labels:
    app.kubernetes.io/managed-by: deis
spec:
  replicas: 1
  selector:
    app.kubernetes.io/name: deis-database
  template:
    metadata:
      labels:
        app.kubernetes.io/name: deis-database
    spec:
      serviceAccount: deis-database
      containers:
        - name: deis-database
          image: {{ .Values.imageRegistry }}/postgres:{{ .Values.dockerTag }}
          imagePullPolicy: {{ .Values.pullPolicy }}
          ports:
            - containerPort: 5432
          env:
            - name: DATABASE_STORAGE
              value: {{ default "minio" .Values.storage }}

カスタマイズをhelm install実行時に変数を記載したファイルを渡すことで行える。 - values.yaml

imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"

helm install --values=values.yaml

まとめ

なんとなくわかった気がする。 確かに便利だけど、インフラに基軸を置くものとしては、やっぱり多くの設定部分が隠蔽されてしまうのがなんとも気持ち悪い感じがしてしまう。 全部管理下に置いておきたい的な意味で。 アプリケーションエンジニアがサクッと動かす用途には適していそうだと感じた。

kintnoeのレコード詳細画面にレコード内のサブテーブルを更新するボタンを作る

最近、仕事でkintoneに触れることが多い。 今日はkintoneのレコード詳細画面に、レコード内のサブテーブルを更新するボタンを作ってみたのでまとめてみる。

以下のようにすればできそうだけどこれだとダメ。

const updateRecord = () => {
  const { record } = kintone.app.record.get();
  record.SUB_TABLE.value.forEach(row => {
    row.value.example.value = "example";
  });
  kintone.app.record.set({ record });
};

kintone.events.on(["app.record.detail.show"], () => {
  if (document.getElementById("updateButton") === null) {
    const myIndexButton = document.createElement("button");
    myIndexButton.id = "updateButton";
    myIndexButton.innerText = "更新ボタン";
    myIndexButton.onclick = updateRecord;
    kintone.app.record.getHeaderMenuSpaceElement().appendChild(myIndexButton);
  }
});

ドキュメントにも以下のように書いてあったりする。 developer.cybozu.io

kintone.events.on のインベントハンドラ内で kintone.app.record.set および kintone.mobile.app.record.set を実行することはできません。 上記のイベントハンドラ内ではレコードデータの取得は引数のeventオブジェクトを、レコードデータの更新はeventオブジェクトのreturnを使用してください。

とはいえ、myIndexButton.onclickに登録した関数にeventオブジェクトを渡してeventオブジェクトをreturnしても意味はない。

const updateRecord = (event) => () => {
  const { record } = event;
  record.SUB_TABLE.value.forEach(row => {
    row.value.example.value = "example";
  });
  return event;
};

ということで、kintone JS SDKを使う。

developer.cybozu.io

これを使うとこんな感じでかける。

const kintoneConnection = new kintoneJSSDK.Connection();
const kintoneRecord = new kintoneJSSDK.Record({ connection: kintoneConnection });

const updateRecord = async () => {
  const { record } = kintone.app.record.get();
  const changedTable = record.SUB_TABLE.value.map((row) => {
    row.value.example.value = "example";
    return row;
  });

  try {
    await kintoneRecord.updateRecordByID({
      app: kintone.app.getId(),
      id: kintone.app.record.getId(),
      record: {
        SUB_TABLE: {
          value: changedTable,
        },
      },
    });
    window.location.reload();
  } catch (error) {
    console.log(error)
  }
};

kintone.events.on(["app.record.detail.show"], () => {
  if (document.getElementById("updateButton") === null) {
    const myIndexButton = document.createElement("button");
    myIndexButton.id = "updateButton";
    myIndexButton.innerText = "更新ボタン";
    myIndexButton.onclick = updateRecord;
    kintone.app.record.getHeaderMenuSpaceElement().appendChild(myIndexButton);
  }
});

サブテーブルの各レコードに設定する値を非同期な関数(以下だとasynchronousFunction())で取得している場合はこんな感じでいけます。

const updateRecord = async () => {
  const { record } = kintone.app.record.get();
  const changedTable = await Promise.all(
    record.SUB_TABLE.value.map(async (row) => {
      row.value.example.value = await asynchronousFunction();
      return row;
    }),
  );

  try {
    await kintoneRecord.updateRecordByID({
      app: kintone.app.getId(),
      id: kintone.app.record.getId(),
      record: {
        SUB_TABLE: {
          value: changedTable,
        },
      },
    });
    window.location.reload();
  } catch (error) {
    console.log(error)
  }
};

転職ドラフトを使って転職しました

こちらの記事は転職ドラフト体験談投稿キャンペーンに参加しています

job-draft.jp

 

転職ドラフト経由でインフラエンジニア(SRE)として現職+*00万(数字は内緒)での転職に成功したので利用開始から内定までの流れをまとめていきます。

参加したきっかけ

参加の動機としては軽い気持ちからでした。

もともと、他媒体や直接応募で何社か受けており、他にも良い会社がないかなーぐらいの気持ちで参加しました。

以前から転職ドラフトというサービスは知っており、上司からも1on1などの機会に「市場価値を知るためにも参加してみたら?」とは言われていましたが、インフラエンジニアって転職ドラフトの対象範囲なのかな?と疑問に思いなんとなく参加しないままでした。(実際は、このように転職できた通りちゃんと対象範囲でした。)

レジュメ記述と審査について

元々、転職活動を行なっていたので、職務経歴書をコピペして少し手直しすることで無事審査を通過することができました。

審査通過時でも具体的なアドバイスをいただけたので、ちゃんと一つずつ時間をかけて読まれているのだなと思いました。運営の方の苦労には頭が下がります。。

指名期間中

最終日に指名が集中するとのことなので、気長に待つつもりでしたが、予想に反して10日目あたりに1件指名をいただきました。

レジュメを丁寧に読まれていることがわかるメッセージだったのでとても嬉しかったです。と同時に現職に対してだいぶな年収アップだったのでこれは何かの間違いでは??とも思いました。

他の会社については予想通り最終日、最終日前日あたりに指名が集中していました。

指名内容

結果として6件の指名をいただくことができました。

提示年収の傾向としては、以下の二つがあるなと感じました。

  • 他社の提示年収に合わせていくスタイル(4社)
  • レジュメを読んで感じた通りの額を提示するスタイル(2社)

転職ドラフトとしては後者の方が理想だとは思うのですが、やっぱりレジュメだけを提示年収の指標にするのは難しいようで、他社に合わせるスタイルの会社の方が多いのかなぁと感じました。

指名時のコメントについては結構まちまちで、比較的小規模な会社ほどきちんとレジュメを読んだ上でのコメントをいただけており嬉しかったです。

大きな会社ほど、コピペで画一的に送っていそうな内容で少しテンションが下がりました。。

これは転職ドラフトの規模が参加者、入札者ともに増えている事の弊害なんだろうなと感じました。

指名受諾後

5/6件を受諾し、面接・面談に伺わせていただきました。

やはりここでも、小規模な会社ほど指名してくれた本人とお話しすることができ、有意義な時間を過ごすことができました。

大規模な会社だと指名してくれた方とは別の方にお会いすることもあり、転職ドラフト関係なく普通にカジュアル面談しているだけだなと感じる会社もありました。

まとめ

 今回、初めて参加して思ったこととしては、「意外と指名はくる!」ということです。

なかなか普通に面接しても自分の社外的な価値はわかりづらいものです。

絶対転職してやるぞ!という人より、現職に満足している人こそ、軽い気持ちで受けてみてほしいです。

市場価値と社内での評価にズレがないか、あるとしたらそれは許容できるのかなど学びも多いと思います。