我が名はなんとか菜である!

主に技術系の記事を書きますが、ポエムも混入します。

macOSが嫌い

Appleのイベントがあったタイミングでこんなことを言うと狙っているのかと思われそうだけど、僕は生粋のAppleアンチで、macOSアンチだ。

ハードウェアとしてのiPadProは好きだし普段から使っているが、Appleの展開するサービスはどうしても肌に合わない。

まあそれはぶっちゃけ好みなのでひとまず置いておこう。

僕が言いたいのは、Appleが嫌いな以上に macOSが生理的に受け付けないということだ。

マルチディスプレイへの対応がゴミ

うちでは、会社貸与のMacBookProをクラムシェルモードで、2画面に外部出力して使っている。

自分はプログラムを書くときは最低でも2台のディスプレイが必要だと考えているため、そのような構成になっている。

どちらもWQHDだ。

接続方法だが、1台はUSB Type-Cで直接繋ぎ、もう1台はType-CからHDMIに変換も出来るドックHubを使っている。

で、実はこのType-Cで繋いでいるほうのディスプレイは 本来であればデイジーチェーンに対応している。

デイジーチェーンとはなんぞという人のために説明すると、簡単にいえば「ディスプレイを数珠繋ぎのように接続出来る仕様」のことである。

これを使えば、デイジーチェーン対応モニタに付いているOUT端子から別のモニタを繋ぐと、そのあとはType-Cを一本繋げばそれだけでマルチモニタ環境が出来上がるという非常に便利な物である。

しかしあろうことか macOS はなんと デイジーチェーンに非対応 なのである。

ちなみに今使っているMBPはIntel版なので、M1がどうとか一切関係ない。

Apple自体が「デイジーチェーンなんて対応してもうちの製品ラインナップにそんなもんないしw」という姿勢で、端から対応する気がないようなのである。

この事実を知った時は思わずクソデカため息を付いてしまった。Appleとは本当にどこまで行っても傲慢なメーカーである。

そんなわけで仕方なく、 デイジーチェーンに対応しているモニターを持っているのにもかかわらず、デイジーチェーンを使わずに2本のケーブルをMBPから伸ばして使っている。

閉じた状態のMBPから伸びる2本のケーブルのなんと美しいことやら(棒)

さらに問題は、MacBookProをこれらディスプレイへ接続したときの挙動である。

普段は作業終了時にスリープにして作業開始時にスリープを解除するという運用方法を取っているが、スリープを解除した際に まず一発で映ることはない。

75%ぐらいの確率で、ケーブルを一度外して再接続しないと映りすらしない。

何がムカつくって、25%の確率で映るところである。

一切映らないのであれば、一度接続を解除して繋ぎ直すのを取り敢えず一連のワークフローとして組み込むことで、ある意味妥協することも可能であろう。

しかし、こいつの最大の問題点は 再接続を繰り返していると一瞬だけファンが全開になってOSがハングアップすることがあること である。

映らないからといって再接続を繰り返していると「ヒュン!」などとため息を吐いてmacOSが死ぬのである。 ため息をつきたいのはこっちじゃボケ

これは、MBPに搭載されているディスプレイドライバーがゴミであることの査証である。

本当にAppleにやる気がないのか、それともRadeonのドライバが悪いのか、いずれにせよWindowsではそんなことは滅多に起こらないので、これらに関わっている人間がMBPの外部モニタ対応にやる気がないことは明白である。

マウス対応がゴミ

まあわざわざこんなアンチ記事をここまで読んでいる人は知っていると思うが、悪名高い「加速度設定」のことだ。

macOSでは、Windowsでいう「マウスの精度を上げる」設定がデフォルトでONになっている。

これはどういう設定かというと、「マウスの動き始めはゆっくり動き、しばらく動かしていると徐々にカーソルの速度が上がる」というやつである。

慣れればいいのではという話もあるが、ハッキリ言って このチューニング具合が気持ち悪くて慣れられたもんじゃない

しかも、その設定をOFFにするには zshを開いて以下のコマンドを入力して再起動 する必要がある。

$ defaults write .GlobalPreferences com.apple.mouse.scaling -1

しかも 一度でもまたマウス感度の設定をいじると加速度設定が復活する という嫌がらせのような仕様になっている。

これを考えたやつはリンゴの葉巻でも吸いすぎたんだろうか?

ユーザーの自由な設定を妨げ自ら推奨する設定を押し付ける。僕に言わせれば Microsoftと同じがそれ以上のevil である。

また、マウスホイール回転時のスクロール方向の設定が何故か トラックパッドの2本指スワイプと同期している せいで、マウスホイールを普段使い慣れている方向に設定すると、今度はトラックパッドジェスチャーで操作したときに逆になってしまう。

いや普通そこはどう考えても設定として分離するだろ。

Appleの遥か下に位置する日本のパソコンメーカーでさえその設定は個別に可能だったと思うんだが。

やはり遥か高みにいると下々の声は届かなくなるのだろうか。

マウスカーソルがゴミ

macOSは裏で重たいアプリが動いていると マウスカーソルの操作が非常に重たくなる

コンパイル中にマウスを動かすと、カーソルにガムでも張り付いてんのかってぐらい動き始めでめっちゃ引っかかる。

おまけに動かねえ〜〜〜!!!って言いながらマウスを素早く動かすと 僕はここです!と言わんばかりにデカくなりやがる。 てめえがそこにいるのは知ってるわボケ、さっさと動きやがれ

まあ、この設定は macOSにしては珍しく 切ることが出来るので、速攻で切ってやったが。

Windowsの場合、マウスカーソルの移動には高い優先度をつけて処理を行なっているという話もあるので、まあそこはWindowsの「利点」と言って然るべきなのだろう。 つまりmacOSが劣っているのは仕方がないのだ

何かに付けていちいちクソトロい視覚効果が挟まる

例えばウインドウを最小化・最大化したとき。

なにあの ぬるぅ〜〜〜〜ん っていう動き、誰に求められてあんな動きをすんの?

これについてはmacOSを操作するとき全般に渡って味合わされるので、 macOSを触っている間中ずっと不快である

幸い、この設定を切れるようにするアプリを見つけたので、そいつで視覚効果周りの設定を全て切ってやったところ、だいぶ動作が軽快になり快適になった。

そう、 軽快になった のである。

この設定を切ったところ、明らかにアプリ全体のレスポンスが良くなった。

つまり、 マシンスペックに見合わないなんの役にも立たない視覚効果にマシンリソースが割かれ動作が遅くなっていた のである。

Celeronでメモリ1GBなマシンにVistaを乗っけていた Appleの遥か下にいる日本のPCメーカーと同じことをしている ということだ。

このAppleとかいうメーカーはもうOS作るのやめて筐体だけ作ってて欲しい。

まとめ

今後お仕事を始めるにあたって、パソコンを選ぶ余地があるのであれば 全力でmacOSは避けたい と思います。

【Redux】ActionType, ActionCreator, Actions を書くときの個人的ベストプラクティス

TypeScriptでの話です。 不要論者はさっさと帰れ
バージョンは 2021/02/20 現在最新の 4.1.5 の話ではあるけど、 ReturnType とか as const が使える 3.4 以降が推奨。
ちなみにこの書き方は Redux には一切依存していないので、 useReducer を使うときに書く Action 周りでも使えるため、 useReducer 使ってたけどやっぱり Redux 使いたくなったときも移行が楽です。

ActionType

export const COUNT_UP = "COUNT_UP" as const;

ポイント

  • as const とすることで ActionType の型が string に推論されてしまうのを防ぐ
    • と思ってたんですが、 TypeScript 4.1.5 現在だと as const しなくてもリテラル型に推論されるっぽいのでなくてもいいかも
  • きちんと定数として定義する
    • Reducer の switch-case で使うときに文字列ではなくこの定数名がエディタによって補完されるようになるので変更に強い。(VSCodeならF2の変数名リファクタリング機能で該当箇所を自動で変えてくれる)

ActionCreator

export const CountUp = (increases: number) => ({
  type: COUNT_UP,
  payload: {
    increases
  }
});

ポイント

  • ActionType の定義の真下に書く
    • 無駄に場所を離すと修正するときにダルいので近いところに定義する
  • function は書くのがダルいのでアロー関数で書く
  • 関数名は Upper Camel のほうが見やすいのですき
    • dispatch(countUp(1)) より dispatch(CountUp(1)) のほうがメリハリ付いて読みやすくない?程度なのでプロジェクトと好みに合わせて
  • payload には変数名をキーにしてくれる構文(名前知らない)を使って簡潔に書く

Actions

export type Actions = ReturnType<
  | typeof CountUp
  | typeof OtherAction
>;

ポイント

  • ReturnType は1回、 typeof は毎回
  • なんか ActionCreator をオブジェクトで定義して Mapped Type で一気に生成する書き方も見つけたけど、Utiliy Typeを自分で書かずに組み込み型だけで行けるこれが一番シンプルだと思う
    • 結局 reducer の switch-case で推論ができれば何でも良い

おまけ: Reducer の書き方

export function reducer(state: State, action: Actions): State {
  switch(action.type) {
    case COUNT_UP: {
      return {
        ...state,
        count: state.count + action.payload.increases
      };
    }
  }
  return state;
}

ポイント

  • 戻り値の型をきちんと書く
    • うっかり色々書き忘れて return する state の型が不完全になるのを防ぐため
  • case節内は {} で囲う
    • 好みのレベルだけど、ここで変数を定義したくなったときに eslint の no-shadow に引っかかることがあるのでやっといて損はない。 {} まみれになって嫌なら書かないし、気にならないなら書く、ぐらいでよいと思う
  • default節は書かない
    • default節を書いてしまうと、caseで拾い損ねている Action があってもエラーにならなくなるため

まとめ

そろそろみんなで書き方統一しない??って思ったので書きました。
なにか意見あればブコメでもTwitterでもここのコメント欄でも積極的に書いていってください。

初めて一人暮らしを始めたり就活したり色々やった2020年の振り返り

2020年も残すところあと3日になりました。

お世話になった皆様、ありがとうございました。

3日というと、もうあと2回寝たら終わりです、やばいな?

さて、2020年は世間的に色々と大変な年になってしまいましたが、それとはあまり関係ないところで自分も結構色々あった1年でした。

というわけで、この記事では今年の活動(書いた記事、作ったアプリ、試したライブラリ、その他生活について)を時系列順に振り返っていこうと思います。

続きを読む

言語化の難易度を下げたい

書き散らします。

最近アウトプットの速度が露骨に落ちていて少し焦っている。

こういう作業ってなんというかリズムと言うか勢いというか、如何に習慣とするかが肝なので、一度この感覚が崩れてしまうと元に戻すのにめちゃくちゃ時間が掛かる気がする。

ちょっと前は原稿用紙10枚分ぐらいの文章を1時間ぐらいで書き上げるのなんて余裕だったはず(※体感ベース)なんだが、引っ越しやらなんやらで9月ぐらいにすべての生活習慣が変わったのと同時にその能力が失われてしまった。

正確にいうと、環境が変わったことでそこで新しいペースを作っている間に以前はどうやって生活リズムを作っていたのかが分からなくなった。まあそれだけ実家にいたころは家事周りを親に依存していたということだろう。

それでもなんとか最近は実家にいた頃にやっていた「一日中家でごろごろする」というのを実現するためにやるべきことが徐々に分かってきたので、頑張って続けてればそのうちパフォーマンスも元に戻っていくといいな。

まあ、頑張りたくはないんだけど。

閑話休題

人に与えられた時間は誰でも平等に1日24時間である。なので、アウトプットの量がすごい人というのは必ずなにかを犠牲にしているはずなのだが、そういうハイスペな人ほど気がついたら配偶者がいたりつよつよIT企業で成果をバンバン挙げていたりする。

そういう人ほど、周囲の嫉妬を買いやすいのはよくある話だ。

人は悲しい生き物で、想像が付かない領域に対して驚くほど無頓着である。

要するに「わからないことがわからない」という状態に陥ると、なんとかそこの整合性を保とうとして、突然正気を失い出したりする。

他人への無理解の原因はそこにあると思うのだが、自分でも何が言いたいのかがよくわからない。読んでる人もよくわからないと思う。

一つ確実言えるとすれば、自分はいつも自分より年齢や経験値が上の人と比べられがちだったので、以前はそれを真に受けて「自分は他より劣っている」という考えになりがちだったのだが、そのへんのメンタルコントロールのやり方が何となく分かってきた気がする。

自分の能力を絶対的に測るのは不可能だし無意味だ。

自分の客観的な評価が欲しければ、色んな人の自分への評価を総合した評価を「絶対評価」として扱うしかない。

そのためには色んな場所で経験やらなんやらを積む必要があるのだが、自分は今「経験を得るためには経験が必要である」と世間から言われているような気がしていて、それでモヤモヤしてこんな文章を書いている。

で、何が言いたいかというと、どんなに今成果を挙げている人だって、周囲から認めらなかった時期というのがあったはずなのだ。

はっきりいえば、そういう今現在業界の中心になっている人と自分が、絶対的に自分のほうが劣っているとは思っていない。

自分だってその人と同じ場数を踏めば肩を並べられる自信はまだ持っている。

ただ、このまま「認めて」もらう機会が得られないと、絶対に追いつくことは不可能だろうなという焦りも若干ある。

これを書いている時点で、最終面接まで行ったが落ちた企業が5社、返事待ちのままなかなか返ってこない企業が2社、N次面接のスケジュール調整中の企業が1社、面接が確定している企業が3社と言ったところ。

数字はちょっと適当かもしれない。まあつまり色々受けて色々話をしたということだ。

自分はめちゃくちゃ優秀というわけではないが、平均以下ということもないはずだ。それだけに、病み上がり後の就活にこれ以上ないほど苦戦を強いられていることに少し悔しさを感じる。

一体自分はどうしていれば道を外さずに済んだのだろう。

いつ、また元の、自分の思い描いていた道に戻れるのだろう。

たった一度の事故で道が閉ざされてしまうのは嫌だなぁと思いながら、今日も適当にYoutubeで宇宙ヤバいChとかのばまんゲームスの動画を見て寝ようと思います。

元鬱病患者が就活に落ち続けている話と、企業は応募者を落とすぐらいならスカウトを最初から送ってくるな

愚痴らせろ

エンジニア転職サイトから飛んでくるスカウトは健常者を前提としたものである

実際のところはどうか知らんけど、大体合ってるんじゃないのかな

返信したスカウトはどこも、自分は以前の職場でうつ病になって辞めてるという事実を話した段階で落とされているからだ

とにかくこの1ヶ月受けてきた5社ほどに関して、不誠実だと言わざるを得ないと感じた

※逆に言うと、ここからの内容は5社しか受けてない時点での感想なので、「あ、はい」と思ったのなら回れ右をしろ

それとも各社に27歳にしては不十分なスキルしか持ち合わせていないと思われているのだろうか。
驕るわけではないが、自分は同年代の人間と比較したときに特別劣っているというわけではないと思うよ、だってスカウト自体はバンバン来るわけだし

とにかく、こっちは後がない手札を消費しながら必死で受けている面接を企業は平気で返事まで1週間ぐらい掛けた後お祈りしてくるってのがこう何度も続くと流石に参ってくるんだよね、っていう、今日はそんな感じの記事なのでぶっちゃけ読まなくていいよ、Twitterに書くとクソ長いからこっちに書いてるだけと思ってもらえればいいんで

実際「病歴」ってどれぐらいディスアドバンテージなの?

人より大体10年ぐらい先行してコンピューターサイエンスやらプログラミングやらをやってきて、社会人になってからも少なくない成果を出してきたのに、たった一回「鬱病になった」というだけで、
そのアドバンテージを全て無視されているということにクソ腹が立っているわけだが、じゃあ実際のところどれぐらい信用を失うものなんだろうか

以前、鬱病に罹ったことがあると二度と生命保険には入れないと聞いたことがある
まあ、それ自体もおかしな話だと思うけど……

つまり、鬱病になると末期癌になったレベルで信頼が損なわれるわけだ でも脳がおかしくなる病気とはいえ、体自体は脳が元気になってくればまた以前のように動かせるようになるし、それらが同率で扱われるというのはやっぱり違和感がある

実際、今の自分は元気だった頃と比べてもまあそれなりに活動できていると思うし

再開したらどうなるか分からないとでも思われてるのかなぁ、でもさあ、それって別に鬱病に限らないわけじゃん?
運動選手だって一度足を怪我してもリハビリ期間を経てその後は現役に復帰できるわけでしょ

なんでプログラマーにはそういう道がないんだろうな?

自分にプログラマーが向いてないとは思わないし、そんなことを他人に言われたとしても全力で反対すると思う

僕はコードを書くのが好きだし、それによって誰かが助かるのを見るのも好きだし、何より作ったものが思った通りの働きをしているのを見るとすごく幸せな気分になる、というのは、自分のアイデンティティを構成する要素の一つである

難しい処理をアイデアで単純化したり、それが出来なくとも泥臭いコードを書いて何度も試行したりする地道な作業も好きな方だし、なんだったら自分はスマートでなくともクソ長いコードを書いてしまいがちなので、ここ数年はそれを直そうと意識しながら書いているぐらいだ

話が逸れたけど、書類選考の段階で落としてきた2社に関しては、こういう自分の中にある気持ちを軽々しく捉えられていると感じてしまった
だって書類選考の段階で落として来てるんだからね。お前の話は聞くまでもないってことでしょ?しかもただ「鬱病歴がある」というだけでさ、マジでクソ萎えるわ

プログラマー界隈は、一度失敗した人間は再挑戦の意思があってもその機会を与えられることがない

まあ結局こういうことなんでしょうね、その失敗の原因が自分だろうが他人だろうが、重視されるのは履歴書と職務経歴書に空白がないかとか、そういう書面上の綺麗さだけ

どいつもこいつも、口では「人手が足りない」なんて言いながら本音はこっちなんですわ
数年置いてみて成果が出るかどうかを一度見てみるみたいな余裕すらない企業ばかり。逆に自分にとってはフィルターになってるのかもしれないけど。

まああと、自分は昔から個人でのアウトプットのほうを重視する人間なんで、書類上ある程度不利になるリスクはあるよなぁとは一度ぼんやり考えたことはある(一つの分野を長くやるよりも色々気になったものにぱっぱと手につける方が好きな点とか)
とはいえこんな早くにリタイアするとは思ってなかったけども

愚痴は終わりだ、さっさと解散しろ

どうせこの記事を公開したあとにどっかで「こんな記事を公開しちゃう時点で人間性で落とされたんでしょ」ってしたり顔で言われるんだろうな

後出しって言われるのも癪だから先に書いておくわ

まあ、こんな乱文誰にも読まれずにネットの海に埋もれるほうが世界のためだと思うけどな

ちなみにここまで読んでくれた物好きに教えると、使った転職サイトは例の偏差値出すところだよ
今来てるスカウト全部返信し終わったら二度と使わないでおこうと思う、インスタントに人間を漁りに来ている企業しか登録していない感じがすごく薄寒いと思ったので

Surface Pro X に 20H1アップデートが当たらないまま3ヶ月が経過し、その間に 20H2 が来ちゃったのでキレた話

何度試しても 20H1(May 2020 Update)への更新に失敗する

7月ぐらいにMacBookAirを売り払ってSurfaceProXを買ったんですが、そいつに 20H1 が当たらないまま3ヶ月がすぎていい加減キレてます。

なぜ 20H1 が当たらないと困るかというと、WSL2が使えないからです。
一応1909でもWSL2が使えるようになるというアップデートは来てはいますが、残念ながらこれはx64専用。

forest.watch.impress.co.jp

なにが原因なのかすら分からず、とりあえず巷に書いてあった方法を片っ端から試しましたがどれもダメだったので列挙していこうと思います。

続きを読む