自分に合った会社を選ぶということ

去年あたりに辞めた2年間ぐらいやっていたインターンで、メンターが推していた本を思い出した。

Soft Skillsというソフトウェア開発者がどう人生を生きるかの説明書みたいな本で当時、日本語版を買っていたが就活で会社選びに大いに役に立ったものがあったので少しメモ程度に。

  • 買ったのは、3年ぐらいまえなので第1版である。

小、中、大企業にはそれぞれメリット・デメリットがある

これは、当時すごく衝撃的でいまでも良く思い出す。就職活動をするときなどにも自分に合っているのかを見極めるため大いに役に立った。

内容は要約すると以下のようになる。

メリット デメリット
小企業 柔軟、高い報酬の可能性 コードを書くだけではない、安定しない
中企業 安定 変化のペースが遅い
大企業 教育、大規模プロジェクトに関われる 官僚的

私は、ぶっちゃけると官僚的な職場はあまり行きたくない。特に日本だと年功序列*1が根強くのこっているイメージがあり、楽しく仕事ができなさそうな気がする。

また、ソフトウェア開発会社かソフトウェア開発者がいる会社かという問題もある。

自分は、ソフトウェア開発会社が好き。

*1:年功序列はメリットもあることは認識しているが、自分の性格に合わない気がする

MySQLのテーブルをGitHubリポジトリで操作する

最近、趣味アプリ用にCloudSQLでSQLのサーバを作成しました。

そこで、SQLマイグレーションを自動化するべくGitHubリポジトリで操作しようと思います。

以下の記事を参考にしました。

blog.fukkatsuso.com

作成したリポジトリは以下です。

github.com

CloudSQLに接続できるようにする

gcr.io/cloudsql-docker/gce-proxyを使用してDocker経由でCloudSQLに接続します。

公式ドキュメントにはdocker runを使用していますが、私はdocker-composeを推しているのでこちらで実行できるようにします。

version: "3"

services:
  datastore:
    image: gcr.io/cloudsql-docker/gce-proxy
    ports:
      - "127.0.0.1:3306:3306"
    volumes:
      - ./config/:/config
    command:
      [
        "/cloud_sql_proxy",
        "-instances=$CLOUDSQL_INSTANCE_CONNECTION_NAME=tcp:0.0.0.0:3306",
        "-credential_file=/config/sa_key.json"
      ]

設定として、.config/sa_key.jsonにサービスアカウントキーを置きます。 また、リポジトリのルートに.envを作成しCLOUDSQL_INSTANCE_CONNECTION_NAMEを設定します。 この値はCloudSQLの「接続名」を入れます。

これで、docker-compose up -dを実行することでMySQLに接続ができます。

マイグレーション

今回、このMySQLは複数のアプリケーションで使用することを想定しています。そのため、データベースを複数作成したいという話題があります。そのため、ディレクトリでデータベースを分けられるような設定を追加します。

db/**ディレクトリ名 = DB名とします。

#!/bin/bash

FILES="db/*"

source ./.env

for DATABASE_PATH in $FILES; do

  DATABASE=${DATABASE_PATH##*/}
  echo "------- Migration DB: ${DATABASE} -------"

  MYSQL_DSN="mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(127.0.0.1:3306)/${DATABASE}"

  migrate -path "${DATABASE_PATH}" -database "${MYSQL_DSN}" up

done

このスクリプト環境変数.envMYSQL_USERMYSQL_PASSWORDを設定します。 これで、このスクリプトを走らせることでマイグレーションができます。

マイグレーションを実行する

テーブルを作成していない場合は直接CREATE DATABASEしましょう。

migrate create -ext sql -dir ./db/[table name] [migrate operation name]

を実行してファイルを作成し、作成された.sqlファイルにマイグレーションするクエリを追加します。 上のスクリプトを実行してマイグレーションを実行します。

Github Actionsに設定する

今回の話題はこれです。 GitHub Actionsに設定し、mainブランチにpushされかつdb/**が変更された場合に走らせます。

name: Migration

on:
  push:
    branches:
      - main
    paths:
      - './db/**'
  workflow_dispatch:

jobs:
  migrate-db:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      
      - name: Setup Env
        run: |
          echo "CLOUDSQL_INSTANCE_CONNECTION_NAME=${{ secrets.CLOUDSQL_CONNECTION_NAME }}" > .env
          echo "MYSQL_USER=${{ secrets.MYSQL_USER }}" >> .env
          echo "MYSQL_PASSWORD='${{ secrets.MYSQL_PASSWORD }}'" >> .env
          echo '${{ secrets.GCP_SA_KEY }}' > ./config/sa_key.json
      - name: Start Cloud SQL Proxy
        run: |
          docker-compose up -d
      - name: Install migrate
        run: |
          curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey | sudo apt-key add -
          echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/migrate.list
          sudo apt-get update
          sudo apt-get install -y migrate
      - name: Migrate DB (up)
        run: ./scripts/migrations.sh

Githubで設定するsecretは、

  • CLOUDSQL_CONNECTION_NAME
  • MYSQL_USER
  • MYSQL_PASSWORD
  • GCP_SA_KEY

です。

まとめ

これで開発が楽しくなりそう!

ぼくがかんがえたさいきょうのプログラミング言語べんきょーほうほう

エンジニアは新しいものが好きである*1。そのため、新しいものを使うために新しい言語を習得するということは日常茶飯事である。

このブログでは私が新しくプログラミング言語を勉強する際に実施している勉強法を書く。

TL;DR

  • 公式のドキュメントを眺める
  • 他の言語と比較しその言語独自の使用などを軽くMarkdownでまとめる
  • その言語でGitHubから検索して数個ほどリポジトリをクローンする
  • クローンしたリポジトリを読み仕組みを理解する
  • なにか作る

解説

公式のドキュメントを眺める

プログラミング言語を勉強する上で一番の情報源は、本でもTwitterでもいかがでしたか系サイトでも技術記事でもなく公式ドキュメント*2である。その言語の開発者がどういう意図でそういう設計をしたのかがわかる。
また、公式ドキュメントを先に読むことで技術記事のバージョンの違いで動かない事象を事前に回避することができる。

ドキュメントを眺めるのはとくに面白みはないのでTwitterで実況するのがおすすめである。

他の言語と比較しその言語独自の使用などを軽くMarkdownでまとめる

プログラミング言語にはその言語独自の仕様を持つ場合が多い。例えば、Pythonなどはインデントでブロックを表現したりGoなどはエラーを第二戻り値にしてスローはしない。Rustはセミコロンがない文はreturnになるなど様々である。

そのような仕様は書く場合にこんがらがってしまう場合が多いので後で索引できるようにMarkdownなどにまとめる。あと、少し書くと記憶に残りやすい。残らなくてもそれをまとめたなっていうことを覚えていればあとで検索できるしね。

その言語でGitHubから検索して数個ほどリポジトリをクローンしてリポジトリを読み仕組みを理解する

これは一番大事である。これに9割時間を費やしてもいいかもしれない。

プログラミング言語は、仕様がわかって書けるようになったところでいざ〇〇を作る!とかなるとどうしていいのかわからなくなる事が多い*3。そういう問題に対応するため予めその取得したい言語で書かれたリポジトリを読み仕組みを理解するはめちゃくちゃ効率が良い。

さらに、その言語で使われるパッケージマネージャーや命名規則ディレクトリ構成も一緒に理解できるためおすすめである。

私は実際にRustの勉強をした際には、tokei*4をクローンしてコードを読んだ。このリポジトリは、ビルド時にbuild.rsが実行されlanguages.jsonの内容をテンプレートエンジンで.rsに上書きするという仕組みがありすごく面白かった。

なにか作る

ずっとインプットでは覚えない。そのため、アウトプットをする。なにか目標をたてて、実際にその言語を使用して作ってみる。

まとめ

私の好きな言語は、Go、TypeScript、Rustです!!!!

*1:要検証

*2:ソースコードという人もいる

*3:個人の感想

*4:Rust製のファイル解析ソフト。ディレクトリを再帰的に解析しどの言語が何行存在するかがわかる。

社会人になると学割サブスクが効かなくなるので月にどれくらい増えるか計算してみた

私は今学生です。ちょうど学部4年度で、来年は就職をします。

来年学生じゃなくなるのです。そうするとどんな問題が出てくるのか、

学割の終了です。

今、世の中にはいろいろなサブスクリプションサービスがあります。さらにそのサブスクも学生は申請すると無料だったり割引価格になるのもあります。 ということは、今のまま学生が終了すると月当たりのサブスクによる出費が増えます。 就職していきなり出費が大きくなったらびっくりしてしまうので今のうちにどれくらい出費が多くなるか計算していきたいと思います。

学割サブスクを洗い出す

学割で契約しているサービスを洗い出します。

意外と少なかったです。Amazonプライムにも学割はありますが、なぜか契約してません。理由は謎です。

就職しても契約するもの

  • YouTube Premium
    • 生活必需品です。
  • Adobe CC
    • 迷いましたがなんだかんだ使ってるので契約します。
  • GitHub Pro
    • GitHub大好きなので必須です。

MS Officeは大学のレポートなどはGoogleドキュメントを使用しており元々使っていないため就職したら契約はしないつもりです。

差額を計算する

サブスク名 通常 学割 差額
YouTube Premium 1180円/月 680円/月 500円/月
Adobe CC 6480円/月*1 0円 6480円/月
GitHub Pro $4/月 $0/月 523円/月*2

合計すると、7503円/月サブスク料金があがる。

まとめ

やはりAdobeCC高い。。。しかし、Amazomセールで1年ライセンスを購入するれば半額ぐらいで利用できるためそれも検討していきたい。

あとは、あと数ヶ月の学生生活を堪能したい。

*1:https://www.adobe.com/jp/creativecloud/plans.html より。2022/6/5時点

*2:$1 = 130.84 円の円安時に計算

ラブコメアニメが見れなくなってきた

タイトル通りの症状が出始めてきました。

私は、毎期ごとに見るアニメをチェックするぐらいにはアニメを見ているのですが個々最近ラブコメアニメを見続けられません。

今期見ているラブコメは、

ですが、すでに式守さんと阿波連さんを見れなくなってきて現在数話ほど溜まってしまっています。
かぐや様は原作読んでるぐらいには好きです(推しは素でボケる藤原さんです)。

実際に見ると面白いのに何故か見れなくなるのつらい。

というか、今期がSPY×FAMILYとかぐや様とパリピ孔明が面白すぎるのが原因なのでは?

*1:ラブ…コメ…?ラブ要素??

アクセスしたら気分が上がる404ページ

みんなは404ページ*1にアクセスしたことがあるだろうか。
おそらく、だれしもあると思われる。

  • お気に入りのブログをブックマークに登録していたらいつの間にか記事が消えていた
  • リンクをコピーしたつもりがミスってしまった
  • URLの仕組みを知りたくて適当に叩いた
  • 友達から裏サイトの情報を聞いたので調べてみた

などなど…
様々なケースがあるだろう。

しかし、404ページはNot Found、いわゆるそのページは見つからないよ、存在しないよというページであるためアクセスしたからといって気分が上がる訳では無い。 逆に気分が下がってしまうかもしれない*2
じゃあ、アクセスしたくなるような404ページを作ればいいじゃない!!

ということで、個人的に好きな404ページを挙げていく(作ったやつも)。

CASE 1

PCをバンバンしている絵文字の404ページ
https://hello-slide.jp/404

私が去年作ったWebサービス。変な構成にしたせいでサーバ代が目が飛び出るほど請求されるので機能停止中。ページだけはアクセスできる。

最初は404|Not Foundだけだったが寂しかったので絵文字を入れたらなんかほっこりするようになった。

CASE 2

ConoHa VPSの404ページ。0がConoHaのCになっている
https://www.conoha.jp/404/

みんな大好きこのはちゃんがいるVPSサービス、ConoHa VPSの404ページ。アニメーションで404の0がCになる。

CASE 3

Twitchの404ページ「タイムマシンがあるといいですね」と書かれている
https://www.twitch.tv/404

Amazonが運営するゲームストリーミングサービス Twitch。ぼくもタイムマシンほしいです。

CASE4

Pixivの404ページ。海みクジラとマンモス?がいる
https://www.pixiv.net/404/

Pixiveの404ページ。Every empty space is a blank canvas!!!!

CASE 5

Discordの404ページ。「道に迷われましたかな?」
https://discord.com/404

RPGゲームの道中にいるなんかすごいレア品くれるおじいちゃん構文。良い。

CASE 6

僕が作ったWebサービス。ssh-keygenで鍵を生成したときに表示されるグラフで遊べる
https://sso.cateiru.com/404

私が作ったSSOサービス。ssh-keygenなどで鍵を作る際に表示されるグラフがすごい好きだったので404ページで遊べるようにした。ついでに、生成の仕組みも勉強できた。

まとめ

UGC*3はユーザに混乱を与えないように真面目な内容なものが多い印象だった。
まじめなサイトもいいが、私としては隠しコマンドがあったりアニメーションでキャラクターが動いたりとそういうような遊び心があったほうが好き。

*1:https://ja.wikipedia.org/wiki/HTTP_404

*2:要検証

*3:ユーザ生成コンテンツのこと

備忘録: TypescriptでのRecoilとLocalStorage接続

recoiljs.org

const localStorageEffect =
  <T>(key: string): AtomEffect<T> =>
  ({setSelf, onSet}) => {
    if (process.browser) {
      const savedValue = localStorage.getItem(key);
      if (savedValue !== null) {
        setSelf(JSON.parse(savedValue));
      }

      onSet((newValue, _, isReset) => {
        isReset
          ? localStorage.removeItem(key)
          : localStorage.setItem(key, JSON.stringify(newValue));
      });
    }
  };

使用例

export const DebugModeState = atom({
  key: 'DebugModeState',
  default: false,
  effects: [localStorageEffect<boolean>('debug_mode')],
});