お知らせ

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

process.exit()のラッパーだったり、throwする関数だったりして、戻り値がneverを取る関数で、TypeScript上、後続処理がデッドロジックになるものを作る方法。

確認環境

Env Ver
TypeScript 5.4.5

やりたいこと

process.exit()を書くと次の行以降がデッドロジック扱いされるが、これをやりたい。

process.exit()を書くと次の行以降がデッドロジック扱いされる

問題点

普通に実装して型推論に任せてもうまくいかない。

例えば次の左図の関数の戻り値型はneverだが、右図ではデッドロジックとならない。

関数の戻り値型はnever
neverなのに後続がデッドロジック扱いされない

これは次のように戻り値の型にneverを直書きしても機能しない。

戻り値の型にneverを直書きしても機能しない

解決策

次の左図のように関数そのものの型を作ると解決できる。右図を見るとデッドロジックになっていることが確認できる。

関数そのものの型を作る
関数そのものの型があれば、後続もデッドロジック扱いされる

何のためにこれをやるか

別の関数から呼んだときに、呼び側の関数の戻り値型を正しくするためだ。下図はデッドロジックになっていない状態のときのものだが、処理が死なずに通り抜けてしまうのでundefinedが帰ることになっており、この関数の呼び下でundefinedだった時の処理を書く必要が出てきてしまう。

デッドロジック扱いされない状態では戻り値の状態が不正になる

しかし、デッドロジック扱いになっていれば下図のように戻り値の型が期待した通りの内容になる。この関数がundefinedを返すことはないので、この状態を実現するために行っている。

paste-image-2024-25-8_12-24-37-594.png

関連記事

投稿日:
言語::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

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

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

投稿日:
ジャンル::雑記

今回は光コンセントがある物件(フレッツ光ネクスト/クロス)の探し方のコツと、引っ越し時のトラブル対策を書いておく。

効率的な物件の探し方

世の中には膨大な物件があり、それら一つ一つに対して光配線方式の物件かどうかを調べていくのは不毛だ。何せ、光配線方式の物件というのはSUUMOをはじめとした大抵の不動産屋の検索オプションにはなく、基本的に検索できない。REINSにもそんなものはないはずなので不動産屋でも探せない。つまりまともに調べる術はない。

しかし光配線方式の物件を探すための方法はある。それは2010~2015年に建てられた物件を軸に探していく方法だ。何故これで探せるかというと、この時代がフレッツ光の最盛期で、そこから先は不動産業者と無料インターネット業者がズブズブの関係になっているからだと思われる。何せ分譲マンションですら高級マンションでないとフレッツ光なんて入ってない。

2010~2015年に建てられた物件をリストアップしたら、あとはNTTのフレッツ光のサイトから手当たり次第に対応状況を調べると比較的発見しやすい。参考までにNTT西日本では提供エリア検索から調べることができる。

勿論、新築や築浅でも対応物件はないこともないが、余程こだわりのあるデベロッパーが立てていない限り、まずないので期待しないほうがいい。参考までに神戸市ではシャーメゾンメイユールだとフレッツ光対応という結果が出た。しかもクロスだ。この物件は小規模物件だが、以前もこのような小規模物件の新築でフレッツ対応(そっちはネクスト)を見たので、小規模物件ではフレッツ光が入りやすいのかもしれない。恐らく小規模物件のデベロッパーが比較的個人に近い零細企業なので、個人の考えが映りやすいのだろう。

なお、完全な裏技としては不動産屋でフレッツ光の元営業の様な職歴を持つ人に当たると理想の物件が爆速で見つかるケースもあるが、そんな巡りあわせは滅多にないと思う。

地雷物件

光配線方式だが、内見の時に光コンセントがない物件。大家から通していいよと言われても、最近だと工事に一年以上かかることもあるので避けたほうがいい。

光コラボ利用中で引っ越しするときの注意

光コラボを利用している場合、物件の光開通状況や、未開通の場合に開通までにどれまでかかるかを聞くことができない。これは回線契約が光コラボ業者にあり、末端消費者にないためだ。NTTは直接契約している相手にしか教えてくれない。

もし現在光コラボを利用している場合で、引越を検討している場合光コラボを解約して、NTTとの直接契約にしたほうがよいだろう。

また東日本から西日本、或いはその逆の引っ越しをするときに光コラボを利用している場合で、引越先で何らかの理由で光回線を開通させることができなかった場合、光コラボが強制解約になり、ISPとの契約がややこしいことになる場合があるので気を付けたほうが良い。最悪光コラボは解約したのにISPから料金が請求されてくる可能性がある。