今年作ったものを紹介するぜ(LGTMメーカー/ライフゲーム/AmazonURL圧縮)

この記事はTech KAYAC Advent Calendar 2020の2日目の記事です


技術部2年目サーバサイドエンジニアの宮村(みやむー)です!

www.kayac.com

Podcast で以前オンライン説明会をしたので、どういうお仕事しているか気になる方はぜひ聞いてみてくださいね(他の方のお話もあります!

soundcloud.com

今年作ったいろいろ

普段はGoとかPerlでゲームサーバを書くお仕事をしています

ですが!個人的にフロントエンドも好きなので仕事の合間にちょこちょこ静的サイトを作ってました

React.jsやTypeScriptに興味あったので勉強しつついくつか面白ツール作ってみたので、この機会に紹介したいと思います!

  • LGTMメーカー
  • ライフゲーム
  • AmazonURLConverter

LGTMメーカー

React の練習に作ったサイトです。canvasをあまり使ったことがなかったのでその練習も兼ねて

巷にLGTM画像投稿サイトはいくつかありますが、例えば内輪のネタ画像などを社外サービスにアップロードするのはコンプライアンス上良くないので、それならブラウザで完結するものを自分で作ろう!と思い制作しました

デモはこちら

f:id:mk9071:20201130145157g:plain

カヤック社員がプライベートで作った色々なものを紹介しているサイト「つくってみたラボ」にも載ってるので是非こちらも! create.kayac.com

フリーなのでぜひ使ってみてください! lgtmaker.netlify.com

ライフゲーム

React + TypeScript の勉強がてら Redux や ReactRouter の使い心地を試してみるために作ってみたサイトです

TypeScript 最高ですね・・・!

ライフゲームとはセルオートマトンを用いた簡単なルールで色んなパターンを生成できるゲームです。詳しくはWikipediaを参照してください!

デモはこちら

f:id:mk9071:20201130191033g:plain

実装こぼれ話

2次元bool配列でセルの状態を保持し、それを適宜遷移させて画面に表示する設計で実装しました

ライフゲームを司るロジックを綺麗にまとめられたなーと思ってます!

const aliveCellNum = (cells: boolean[][], i: number, j: number): number => {
  const aroundCells = [
    cells[i - 1] ? cells[i - 1][j - 1] : false,
    cells[i - 1] ? cells[i - 1][j] : false,
    cells[i - 1] ? cells[i - 1][j + 1] : false,
    cells[i] ? cells[i][j - 1] : false,
    cells[i] ? cells[i][j + 1] : false,
    cells[i + 1] ? cells[i + 1][j - 1] : false,
    cells[i + 1] ? cells[i + 1][j] : false,
    cells[i + 1] ? cells[i + 1][j + 1] : false,
  ];

  return aroundCells.filter((v) => v).length;
};

const isAlive = (
  alive: boolean,
  cells: boolean[][],
  i: number,
  j: number
): boolean => {
  switch (aliveCellNum(cells, i, j)) {
    case 0:
    case 1:
      return false;
    case 2:
      return alive;
    case 3:
      return true;
    default:
      return false;
  }
};

export default {
  nextCells: (cells: boolean[][]): boolean[][] => {
    return cells.map((row, i) =>
      row.map((alive, j) => isAlive(alive, cells, i, j))
    );
  },
  rowLength: (cells: boolean[][]) => cells.length,
  colLength: (cells: boolean[][]) => (cells[0] ? cells[0].length : 0),

  // Generate cells[rowLen][colLen] (all false)
  generateCells: (rowLen: number, colLen: number): boolean[][] => {
    return Array.from(Array(rowLen), () =>
      Array.from(Array(colLen), () => false)
    );
  },
};

https://github.com/koyo-miyamura/lifegame_react/blob/master/src/lib/lifegame.ts

ちなみに他にも色々機能を加えていて、例えばURLシェア機能とか作ってみたんですがそれがすごく大変でした

特にライフゲームの盤面をうまく文字列に変換してURLのクエリパラメータに埋め込めるようにするのにだいぶ考えました!

是非遊んでみてください! lifegames.netlify.app

「つくってみたラボ」にも載ってます! create.kayac.com

Amazon URL Converter

こちらはReactのフレームワークであるGatsbyの勉強に1日で作ったAmazonURL圧縮くんです

AmazonのURLを毎回手で圧縮するのめんどいけど、既存の変換サイトにどうもいい感じのがなかったのでサクッと作ってみました!

最短で変換作業が完了できることを意識してUI作りました!

実装は正規表現で雑に変換しているだけなので、ダメなパターンあったらすみません笑

f:id:mk9071:20201129122836p:plain

こちらもご自由に使ってください! amazon-url-converter.netlify.app

まとめ

今年は興味のあったReact + TypeScript周りにしっかり取り組み修得できました!

仕事で使える日が来ることを楽しみにしています笑

一方で執筆しながら「今年は後半忙しくて業務外でものづくりできてなかったな〜」と思ったので、来年はしっかり割いていきたい!

ということで明日も Kayac Advent Calendar 2020 をお楽しみに!