お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
投稿日:
言語::TypeScriptNode.js::ESLintNode.js::Jest

依存ライブラリの関係でESLint v9への移行はできていないが、取り合えずFlat configに移行した。ESLintは7.9.0から8.57.0に更新している。

確認環境

Flat configになってからeslint:recommendedは@eslint/jsに移った模様。

Env Ver
@eslint/js 9.2.0
@lycolia/eslint-config 0.9.1
@swc/jest 0.2.31
@types/jest 29.5.11
@types/node 20.11.5
eslint 8.57.0
eslint-plugin-jest 28.5.0
jest 29.7.0
prettier 3.2.5
typescript 5.4.5
typescript-eslint 7.8.0

元の設定

{
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:jest/style",
    "plugin:jest/recommended",
    "@lycolia/eslint-config",
    "prettier"
  ],
  "plugins": [
    "@typescript-eslint"
  ],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "project": "./tsconfig.json"
  }
}

やったこと

ESLintなど必要ライブラリのアップデート

npm i -D eslint @eslint/js eslint-plugin-jest jest prettier typescript typescript-eslint @lycolia/eslint-config

新設定の作成

eslint.config.jsを作成

extendsの設定

今までextendsに書いていたものはrequireでモジュールを参照してmodule.exports = []の配列の中に書いた。typescript-eslintとeslint-plugin-jestの対応が何とも言えない。なお、この状態だとtypescript-eslintが正常に動かない。

const eslint = require("@eslint/js");
const eslintTypeScript = require("typescript-eslint");
const eslintJest = require("eslint-plugin-jest");
const eslintLycolia = require("@lycolia/eslint-config");

module.exports = [
  eslint.configs.recommended,
  eslintTypeScript.configs.recommended[0],
  eslintJest.configs["flat/style"],
  eslintJest.configs["flat/recommended"],
  eslintLycolia,
];

設定が競合して都合が悪かったので、この時にPrettierの設定を削除しているが、Flat config化とは特に関係ないので無視してよい。

@lycolia/eslint-configは私が作っているカスタム設定だが、これは特に何もせずとも使えた。

.eslintignore対応

extendsしたオブジェクトの次にオブジェクトを記述し、そこにignores: []を追加し、その中に同じことを書いた。恐らく根っこの配列はESLintの設定オブジェクトの羅列で、最終的に後勝ちでマージされる様に出来ているのだろう。

const eslint = require("@eslint/js");
const eslintTypeScript = require("typescript-eslint");
const eslintJest = require("eslint-plugin-jest");
const eslintLycolia = require("@lycolia/eslint-config");

module.exports = [
  eslint.configs.recommended,
  eslintTypeScript.configs.recommended[0],
  eslintJest.configs["flat/style"],
  eslintJest.configs["flat/recommended"],
  eslintLycolia,
  {
    ignores: [
      'dist/*',
      'coverage/*',
      '**/*.d.ts',
      '/src/public/',
      '/src/type',
      '*.config.js'
    ],
  }
];

TypeScript対応

eslintTypeScript.config()でESLintの設定配列全体を引数としてラップし、languageOptionsの中身を移植した。旧設定にあったplugins公式のドキュメントを見る限り不要になっている模様

const eslint = require('@eslint/js');
const eslintTypeScript = require('typescript-eslint');
const eslintJest = require('eslint-plugin-jest');
const eslintLycolia = require('@lycolia/eslint-config');

module.exports = eslintTypeScript.config(
  eslint.configs.recommended,
  ...eslintTypeScript.configs.recommended,
  eslintJest.configs['flat/style'],
  eslintJest.configs['flat/recommended'],
  eslintLycolia,
  {
    ignores: [
      'dist/*',
      'coverage/*',
      '**/*.d.ts',
      '/src/public/',
      '/src/type',
      '*.config.js'
    ],
    languageOptions: {
      parser: eslintTypeScript.parser,
      parserOptions: {
        project: './tsconfig.json'
      }
    }
  }
);

旧設定の削除

.eslintrc.eslintignoreを消した。

ESLint v9対応

typescript-eslintが対応していないため、現時点ではできなかった。

変更差分まとめ

-{
-  "extends": [
-    "eslint:recommended",
-    "plugin:@typescript-eslint/recommended",
-    "plugin:jest/style",
-    "plugin:jest/recommended",
-    "@lycolia/eslint-config",
-    "prettier"
-  ],
-  "plugins": [
-    "@typescript-eslint"
-  ],
-  "parser": "@typescript-eslint/parser",
-  "parserOptions": {
-    "project": "./tsconfig.json"
+const eslint = require('@eslint/js');
+const eslintTypeScript = require('typescript-eslint');
+const eslintJest = require('eslint-plugin-jest');
+const eslintLycolia = require('@lycolia/eslint-config');
+
+module.exports = eslintTypeScript.config(
+  eslint.configs.recommended,
+  ...eslintTypeScript.configs.recommended,
+  eslintJest.configs['flat/style'],
+  eslintJest.configs['flat/recommended'],
+  eslintLycolia,
+  {
+    ignores: [
+      'dist/*',
+      'coverage/*',
+      '**/*.d.ts',
+      '/src/public/',
+      '/src/type',
+      '*.config.js'
+    ],
+    rules: {
+      semi: ['error', 'always']
+    },
+    languageOptions: {
+      parser: eslintTypeScript.parser,
+      parserOptions: {
+        project: './tsconfig.json'
+      }
+    }
   }
-}
+);
投稿日:
言語::TypeScriptジャンル::思考

ここ5年間くらいTypeScriptを書くことが多いが、何故TypeScriptで書いているかについてメリデメを大まかに整理してみる。

メリットに感じている部分

  1. 静的型付けがある
    • IDEで入力保管が出るのは便利だし、型ミスによるバグも見つけやすい
  2. マルチプラットフォーム
    • OSの差を意識せず開発しやすい
  3. VSCodeで書きやすい
    • IntelliJ使いたくないので…
  4. テストコードを書くのが楽
    • Jestは扱いやすい
  5. 大抵のことができる
    • CLIアプリからWebサーバー、Webフロントエンドまでこれ一本でできるのは嬉しい

デメリットに感じている部分

  1. 依存地獄
    • node_modules配下が地獄になりがち
  2. Node.jsの頻繁なバージョンアップ
    • TypeScriptはNode.jsに依存しているため、どうしてもこの部分に引っ張られがち(DenoとかBunとかそういうのは関知しない)
      • fsを中心に破壊的変更がよくあり、割合壊れる
  3. デバッグがめんどくさい
    • C#だとデバッガを上げるのは楽だがNode.jsはめんどくさい
    • たまに素直にブレークポイントにはまってくれないこともあり辛い
  4. 言語エンジンが重い
    • 入力補完や型情報の照会などはコードが肥大化するにつれ重くなる
    • そのためにキャッシュ機能があるようだが、ブランチを切り替えるとキャッシュされた型情報を見てくるせいでうまく動かないなど面倒
投稿日:
ジャンル::雑記

内容的には16タイプあるとのことで、恒例の16 PersonalitiesやMTBI的な奴だと思う。

コマンダーという結果が出た。卓越した統率力で勝利を掴む指揮者とのこと。全体の7%らしい。多いのか少ないのかはイマイチパッとしないが、7*16=112であるため、少なくはなさそうではある。

1.png

他にも「データや理論に裏打ちされた信念をもとに先陣を切り、チームを導きます。勝利を目指し、メンバーが協力・切磋琢磨するチームを作ろうとします。卓越した統率力で勝利を掴む」などと書かれている。

正直仕事ではそこまで能動的ではないが、ネトゲをしていたころは常にリーダーをしていたし、データ収集や理論調査もよくしていて、それらの結果を基にして戦略を立て多数のチームを導いたりしていたとは思う。ROでは臨時PTや、ギルドなど内輪のパーティーを主催したり、ECOでも大規模PTを率いていた。軸となる戦略は基本的に私が立案し、細かい部分は各人がやりやすいように空白にしておくことが多かった。他の人のプレーや自らの経験、データサイトの情報などを突き合わせ分析し、必要に応じていくつかの方針を出すこともよくあった。これは方針Aがダメでも、方針B→Cなどと転換させるためのバックアップ案だ。攻略するためには失敗を厭わず何度も挑戦したり、チャンスが一回しかない背水の陣においては何が何でも攻略を成功させるために仲間を鼓舞するなど、目標達成のためにとれる手段はとるほうだったと思う。

大まかな傾向としては、キッパリと両極端に寄っているようだ。意思決定は自分で行い、その根拠はデータを重視。人間関係は関係より成果を、リーダーシップはリーダーよりフォロワーにあるらしい。

2.png

まぁこれも私がネトゲの世界で生きてきたところによる部分が大きいだろう。私がやってきたネトゲの世界、つまりMMORPGというのはいわゆるSAOのような世界だ。実力が全てで人間関係というのは実力があって初めて成り立つ。とはいえ、人間関係がゼロというわけではない。例えばいくら強くても素行があまりにも悪い人物だと迎え入れるのは難しくなる。逆にいくら素行がよくとも実力がなければそれは難しい。そういう世界だった。勿論、その相手に芽があれば多少実力がなくとも育てるということはしていた。人材はそう都合よく現れないからだ。

FF14では固定パーティーに入っていたことがあったが、そこでは毎回遅刻してくる上に、都度「予習が面倒くさい」「勝つのがしんどい」などネガティブな発言をしながら、毎回スキル回しを間違えるヒーラーがいたことがあったが、結局私はこのパーティーを一ヶ月程度で抜けた。理由は単純で、攻略失敗の半分くらいがこのヒーラーのミスによるものだったからだ。しかも高頻度で無断遅刻してくるのでまともに練習時間も取れない。多少実力があるのであれば許容できるが、何の実力もないどころか、自分の弱さを据え置くような人間の相手はできない。そういうわけで私はパーティーを抜けた。

次に項目別に詳細な結果が出ていた。

まずはコミュニケーション傾向だ。端的に言うと「ぼっち、自己中心的、合理的、仕切り屋」というところがよく出ていると思う。しかし最後の問題解決スタイルについては団結に寄っており、孤立していないのが特徴的だ。

3a.png

仕事の問題解決においては自分で考えるより有識者に聞いたほうが早いのと、「有識者に聞いた」というエビデンスがあると人からの信頼獲得が容易になりやすいという経験則からやっている。これは個人の考えより有識者の考えのほうが大抵の場合有益だからだろう。

次に働き方の傾向だ。この傾向では強い傾きが見られるものの、そこまで極端に振っていないのが興味深い。

3b.png

チームへの姿勢では「競争・独力」に全振りだが、プロジェクトへの姿勢では品質に寄りつつも効率性も勘案している。因みに私は計画性があることをそれなりに好むが、基本的には無計画な人間である。人生は行き当たりばったり、作った計画は投げっぱなしというのはよくあることだ。「もっともよい解決策が見つかるまで検討を繰り返す」とあるが、これはよくやる。試行錯誤をすることで生まれたパターンは重要な財産である。引き出しが多ければ多いほど臨機応変に対応しやすいからだ。

問題解決は既存の理論や仕組みを活用することが多く、基本的には古臭いほうだとは思う。知る人ぞ知る人物による電撃的な新理論みたいなのは基本すぐさまには飛びつかない。また基本的には中長期的な視野で物事を見ることが多い。無計画な人間である部分からすると、この部分には矛盾があるが、そう考えるようにしている。実は私はかつてはミーハーな方で、新しいものにすぐ飛びつき、それの真贋を判断しないまま突き進むような人間だった。結果何が起きたかというと、様々な罠にハマることになったり、或いは罠にハマる人を観測してきた。勿論そんなのは経験則であり、他の事例には適用できない可能性はある。しかし私は人生経験上、他の人より遥かに多くの経験を積んできている。例えばネトゲでは膨大な数の臨時・野良PTに参加し、実社会でもSESを通してかなり多くの案件や現場に参画した経験がある。根本の仕事もそれなりにしており、バイト経験も豊富だ。プログラミング言語やフレームワークも経験数は多いほうだと思うし、世の中の各種サービスもかなり使い込むほうだ。つまり他の人より多く物事に触れることによりある程度確定的な視野を持っており、その結果、短期的ではなく中長期的に物事を俯瞰したほうがより良いと考えている。

衝突への向き合い方は基本的に自分の意見を主張することが多い。ただ主張しても受け入れられないことは自明なので、まずは相手の意見を優先し、徐々に自分の意見を染み込ませていくという手法をとることが多い。これは多くの場合、長期戦になるので粘り強く行う必要があるし、それをしても価値があることにしかできないので、基本的には折れる回数のほうが多いかもしれない。

次はストレスの傾向だが、楽観的のことだ。

3c.png

実際私は楽観的で、楽観的過ぎるために目標を忘れることさえよくある。目標を達成するために圧力をかけると自滅するので、私の目標は達成できない場合が少なくない。ネトゲでは仲間と一緒に目標を立てていたが、私生活では割とズタボロである。仕事では目標を立てることがあんまりないので何とも言えない。

また、根はネガティブで暗いのだが、基本的に物事はポジティブに考えることにしている。大抵のことはポジティブに考えられるし、そこから新しい発想が生まれることもあるからだ。またストレスが継続する場合は元凶を辿り、そこの根を断つようにすることが多い。その過程でいろいろ発見があり楽しいからだろう。

最後に理想の働き方については、これまでの総集編といった感じだ。

3d.png

良くも悪くも昭和の価値観という感じで、統率性を望むのだろう。全員が全員別のことを話しているとチームがまとまらない。個人で仕事をしているのなら好き勝手言えばいいと思う。

意思決定についてはデータ志向だが、そのデータが捻じ曲げられている状況は好ましくない。例えば子育て支援をすることで子供が増えるみたいな、どこに根拠があるのかよくわからない言説とかだ。そういうデータではなく、まともな信頼できるデータなら信用する感じだ。