好敵手
私の妻は、とある稲作集落の出身である。妻はその中では優秀だった。大きなディスアドバンテージを克服して、金持ちに負けずに学歴を勝ち取ったのである。しかし、その集落には妻以上に努力をし、大きな成功を収めた人がいた。 彼は東京有名私立の中では最も優秀な大学を卒業し、デロイトトーマツなどで非常に活躍されていた。コンサル界を渡り歩き、いくつも事業を成功させていた。今は少し違うのかもしれないが、当時はコンサルに入り、高い給料をもらいながら悠々自適に暮らすことが理想とされ、多くの人が転職などでコンサルを目指していた。彼はそういう連中の理想を体現した存在であった。 一方そのころ、私は普通の会社員だった。日々上司に理不尽な指摘をされ、泥臭く取引先と設計を詰めていく。自分で決めた就職先ではあったが、仕事は理想とは程遠く、開発とは名ばかりの下請け丸投げ奴隷と化していた。H○NDAを3年で退職した人が話題になっていたが、まったく同じ気持ちを持ちながら、逃げることができなかった。私は義理の家族が集落で胸を張って歩けるように、なるべく今の会社の名前を変えないように、そして転職するならコンサルのような理想的な職になれるように、今は耐えようと思っていた。 しかし、転機が訪れる。中の良かった上層部が、自分の上司に社内政治で嵌められてしまったのである。その人は精神を病んでしまい異動となった。そして、無能なのに多動な自分の上司が実権を握ったのである。私の地獄はここから始まった。ただでさえ好きでもない仕事だったのに、もっとつまらない仕事を、大量にやることを命じられた。人は補充されては離脱した。成功が約束されたプロジェクトにはいっちょ噛みし、そうでないプロジェクトからは離脱する・・そんな命令を受けながら毎日を過ごした。 残業が70-80時間くらいの月が半年続き、いよいよ私はこの組織にはついて行けないと思った。仕事を憎み、上司を憎み、その上司を昇格させた人事を憎んだ。社内政治に強いものが幸せになり、そうでないものがバカを見るこの会社が嫌いになった。 ある日、私はドクターストップをかけられた。私は勇気をもって妻に打ち明けた。「しばらく会社を休んでも良いかな?」妻はすぐに了承してくれた。休んでいる時も助けてくれた。集落に変えれば失望の白い目で見られるかもしれないのに、それよりも私自身のことを考えてくれた。ただ。それでも。私は自分の至らなさが心の底から惨めだった。私は彼のように人生を成功させるどころか、普通の社会人としてすら落第してしまったのだ。その事実と毎日向き合わざるをえなかった。 そんなあるとき、出身研究室の教授が国際学会の案内を研究室LINEに投稿した。そして、一言。「○○君もどうですか?」と。 私は社会人としては落伍者だ。でも、教授は私のことを優秀(というよりオモロイ?)学生であると思ってくださっていた。その事実は私に大きな原動力を生み出した。どこかで歯車が嚙み合う場所があるはずだ。昔はそれを見つけることができていた。もう一度、それを探しにいかなければ。 そのあと紆余曲折あり、自分が研究すると幸せを感じる人間であることに気づいた。そして、生きるために社会人を引退するしかないという思いが芽生えた。今までの私の考えでは、この論理は破綻している。生きるために嫌な仕事をしなければならない。これは当然のことだ。なのに、生きるために社会人を止めるというのは矛盾しているだろう。しかし、社会人でなければいけないとか、サラリーマンじゃなければいけないというのは今思えば幻想である。有能じゃなければいけないとか、経済発展に寄与しなければいけないとか言う人もいるが、平均以下の残り半分の人は生きる権利が無いみたいな論調に聞こえる。そんなことをしたら人口減少は止まらないよ。だから、私は自分のお金でもう一度大学に通い、博士になることにした。研究者として生きるために。 さて。私にとって、集落の彼は常に人生の成功者だった。全日本人のTOP5%に位置し、私のような人間が無駄な努力をしても決して追いつけないことを教えてくれた。そして、彼をライバル視することで私は本当の自分を見つけることができた。その結果、私なりの正解にたどり着き、世間の言う「コンサルになって悠々自適に暮らす」という理想論とはかけ離れているが、満足行く生活を送ることができるようになった。この世の中の正解は1つではないことを、身をもって知ることができた。 研究者となった後、冬のある日。妻と集落を散歩している際に彼の両親に会うことができた。あまり顔を覚えていないが、丁寧な口調の女性と、しっかり軸を持った落ち着きのある男性という組み合わせだったような気がする。噂で私のことを知っていたようで、暖かくなったら今度ゆっくり話をしましょうといってくださった。私もどんな話をするべきか、感謝を伝えたいけど私が勝手にライバル視して、勝手に神格化して、勝手に自己解決した話だしなあなどと思っていた。 ::: 帰宅をしたら妻が電話をしていた。表情は硬い。なにやら深刻な話をしているようだ。私はキッチンに向かい、鮭のムニエルを作ることにした。 しばらくして。。妻の電話が終わったようだ。妻がキッチンに来て、私に伝えてくれた。 「○○さん、電車にはねられたんだって・・」 私は狼狽した。「なんで・・?誰かに押されたとか?」「わからないって言ってた」「まさか・・」他殺だったとして、「わからない」なんてことは無いだろう。すぐにニュースも確認した。該当駅での人身事故の情報があった・・・。 ・・・ 彼がどういう気持ちだったのか、いまだに私にはわからない。しかし、彼は圧倒的な成功をおさめ、全日本人が漠然と考えている理想の人生を体現していたはずだ。彼の奥さんも良家の美人と聞いていた。本当に何故・・。 しかし、もし仮に。彼と昔の私が同じような考え方の持ち主だったとしたら、彼はどこで「理想の人生」というレールを離脱できたのであろうか?と思う。私は比較的早めに世間の理想に折り合いがつかなくなり、レールから逸れることを選んだ。でも、なまじ彼は優秀だったため、レールの上をノンストップで駆け抜けてしまった。でも、レールはずーっと続くんだ。もし、その行先が自分の求めるものじゃないとしたら。レール上を走るのと、レールから外れるののどちらが正しいのだろうか? 彼は結局、将来が見えた時、レールから外れる選択ができなかった・・だから走ること自体を止めてしまったのではないか?というのが私の予想だ。私だって、同じことが起こる可能性があった。妻と教授に支えられていなかったら、同じ結末だったはずだ。だからこそ、彼の事件は私の魂に大きく刻まれた。 昨今のSNSを見ると、自分の人生をきらびやかに他人に自慢したり、他人の人生に口出しをしたりする中で「レール」というものが形成されているように感じる。しかし、それは幻想だ。幻想に気づくことができないと死に至ってしまう。失敗しない者ほど長く囚われてしまう。少子高齢化も、景気後退も、「こうしなければいけない」とか「こうであるべきだ」というレールがあるから生まれている気がする。「年収500万無いから結婚できない」とか「世帯年収1000万無いから子供を持つ権利が無い」とか「大企業じゃなければいけない」とかそんなことばっかり流れてくるが、自分がどうやって育ったかを思い出せば幻想であることはすぐわかる。ただ、20代の若者だと何故か騙されてしまう。私もそうだったから良くわかる。 集落の彼は、多くの人が無意識のうちに嘘をついていることを身をもって教えてくれた。「こうすれば幸せに暮らせる」という幻想のレールの危険性を教えてくれた。私は幻想のレールと本物の道をしっかりと見極め、その重要性を後世に伝えることで、彼の犠牲に報いなければならないのだと思う。 最後に。私は強化学習を専門とする研究者となった。強化学習はAIの中でも変わり者で、経験から学習していくタイプのAIだ。一方で、ChatGPTに代表されるような強いAIのほとんどは、ベースが教師あり学習であり、歴史や正解データから学ぶAIだ。しかし、教師あり学習で必要となる「正解」とは何だろうか。それは人間が定義できるものだろうか?私は少なくともそうは思わない。世の中のほとんどの数式は解を複数持ち、ほとんどの絵画や楽曲は言語化できない。そんな世界において、たった一つの正解をLLMに教えてもらおうという思想は非常に危険だ。分からないからLLMに質問する・・そんなことよりも、自分の身をもって体験した方が、よっぽど正解に近づける。強化学習は私にそれを教えてくれた。もし、SNSで誰かが何かを正解だと示している時、それがあなたの体験と比較して正しいかどうか判断してほしい。正解は個体と時間によって変わる。Q値は経験によって異なるのだ。そして、判断に困るときは、未知への挑戦を忘れるな。それは人間にしかできない、数少ない才能なのだから。 私は長年のライバルと死別してしまった。結局一度も話せなかった。成功者の言を聞きたかった。でも、もっと辛いのは彼の家族だ。同じ悲劇を繰り返さないためにも、そして自分たちがこのような選択をしないためにも、自分の人生を他人に委ねず、信念と経験を持って正解を探してほしい。皆さんの人生が輝かしいものになりますように。
【PCクラスタ】【Tensorflow】Harvesterを使って研究室用AWSモドキを作る②
前準備: harvester GUIでの設定 ログイン設定 後々にVMを作った際にユーザー名とパスワードを決めておかないとログインできません。そこでCloud configuration templeteにVMの情報のテンプレートを作っておきます。また、SSHでアクセスするための設定もここに書いておきます。大体こんな感じで書けば良いです。(調整に丸一日費やした)。また、画像は割愛しますが、AdvancedのSSH keysにも同じ内容の公開鍵を登録しておきます。 VMからGPUへアクセスするための設定 AdvancedのPCI Devicesには様々なPCI接続されたデバイスがあります。このうちNvidiaで検索して引っかかったものをかたっぱしからEnabledに変更すると良いでしょう。これをやっておかないとVMを作った後に苦しみます。 ネットワークの設定 後々にSSHでアクセスするためには静的にアドレスを振っておくと都合が良いです。左側のNetworksからVirtual Machine Networksを選択してCreateを押し, Basicsを以下のようにしましょう。またRouteでは静的なアドレスとGatewayを指定します。 VM用imageファイルを取得する VMを作るには, その元となるイメージが必要です。AWSでもUbuntuだったりAmazon Linuxだったりが選べますが, 自作する場合でも同じです。ここで必要になるのはUbuntuのイメージファイルなのですが, 公式のUbuntu24.04などはVM用に最適化されておらず, 起動後に複雑な設定が必要になります。しかも, うまく動かないこともザラです。そこで, cloudに最適化されたUbuntu imageを使用します (https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64.img)。 harvesterのGUIからimage->createと進んで, URLを記入してください。これでcreateすれば, GUI側でイメージをDLして使用できるようにしてくれます。…
【アプリ開発】Node.jsとPythonを使ったアプリを作る#2
こんにちは。RockinWoolです。前回の続きということで、今回はFrontendのjavascriptとbackendのpythonを同期させて行こうと思います。それでは早速はじめていきましょう。 Flaskのインストールとサーバのセットアップ それではまず、backend環境を作るためにFlaskをインストールしていきます。自分はanaconda環境でやっているのでcondaで入れていきます。 新しいフォルダ構成でアプリを再構築する 前回のcreate-react-appでのReactアプリの構築では、最新のnodejsをビルドできないことが判明したのでビルドツールをviteに変更します。新しくmaze_gameという親フォルダを作ってその中に移動したら次のコマンドでViteプロジェクトを作ります。 ここまででViteサンプルアプリが動くようになります。 迷路側(frontend)の作成 index.html まずはindex.htmlから順番に作っていきます。Viteになったことで最初に起動させるエントリーポイントJavascriptのファイルがmain.jsxになっています。今回も慣例にしたがってmain.jsxを起動させるようにします。 main.jsx エントリーポイントです。ここではReactの初期設定を行い、アプリケーション全体をブラウザにレンダリングします。 2行目のReactDOMとはなんぞや?と思って調べてみたら、DOM(Document Object Model)という概念についてChatGPTが教えてくれました。Reactはhtmlの要素(Node)を動的に変更することで画面を変化させているということを知らなかったので、DOMによってNodeの塊として表現されているhtmlを変化させるためにReactDOMが必要なんだと理解することができました。3行目はルートコンポーネントであるApp.jsxをインポートすることを宣言しているそうですが、拡張子抜きで宣言するのに違和感があります。6行目ではレンダリング対象を宣言していますが、index.htmlで<div id=”root”></div>と宣言したroot要素を対象にすると言っています。<React.StrictMode>は開発モード機能であると宣言しているので、本番ビルドでは対象ではないと言っています。App /はAppをレンダリングするということらしいですので、次はApp.jsxについて見ていきます。 App.jsx 実態はcomponent/Maze.jsxに記述しているので、これは単純に仲介役を果たすファイルです。 最後のexport default App;でfunction App()を他のjsxから呼び出せるようにしています。 component/Maze.jsx 今回の開発で最もキモとなった部分の1つです。前回はここに迷宮情報を格納して迷路を作っていましたが、backend側に迷宮情報を持たさたほうが良いと判断して、frontend起動時にサーバから迷路情報を取得するように変更しました。そして、Enterを押したら自動で決められた動きをするように変更しています。 backend/server.py 最後にbackend側の実装を行っていきます。backend側は迷宮情報を渡すmaze関数と自動移動を行うmavoe関数を実装します。 vite.config.js Viteで起動したときに通信をどうするかを定義します。 ここまでで一通り動くものが作れました。いやーコードばっかりになってしまい申し訳無いです。次回はコードの詳しい解説と自動移動関数の強化学習を目標にしようと思います。それではまた次回!
【アプリ開発】Node.jsとPythonを使ったアプリを作る#1
こんにちはRockinWoolです。最近は頭痛も落ち着いていろいろなことに打ち込めるようになってきました。人生山あり谷ありですが、今は山なんだなあと感じています。さて、今日からはPythonを使ったブラウザアプリを作って行こうと思います。まずはアプリの構成ですが、ChatGPTに質問したら以下のような回答が帰ってきました。 なるほどなるほど。それでは今回はReact.jsを使用してフロントエンドを作って、バックエンドはFlaskという構成でやっていこうと思います。 node.jsのインストール React.jsのインストールをするためには、前提としてnodejsのインストールが必要とのことでした。なので、nodejsを入れていこうと思います。今回の環境はUbuntu20.04です。まずは以下のコマンドを実行します。 ここまで実行すればnodeコマンドやnpmコマンドが実行できるようになると別のサイトには書いてあったのですが、自分の環境では以下のエラーが出ました。 第一感では、このエラーはPATHの通っていないところにnodeがインストールされた結果発生しているのでは無いかと考えられました。なので、地道にPATHが充分か調査してみます。 このコマンドでnodeが存在していることは確定しました。次はnodeのinstallに使ったnの位置です。 こちらにもnodeがいることがわかります。ただし、こちらにある方が本物です。というのもsudo apt install nodejsでインストールできるnodeはversion10と非常に古いのでnコマンド経由で22.12.0をインストールするようにしたのが最初のコマンド群でした。ということで、こちらをPATHに追加していきます。以下のコマンドを.bashrcとターミナルの両方に打ち込んでPATHを登録します。 プロジェクトの作成 React.jsを使ったアプリの作成は以下のコマンドで実行します。 ここで–forceオプションをつけるのはreactのバージョンによってはうまく行かない依存関係が発生してしまうためです。このアプリの名前はmaze_gameとしました。迷路ゲームを作ろうと思っているので。さて、ここで`cd maze_game`してnpm startでアプリを起動!のつもりがまだ依存が解決していないとかで怒られました。私の場合は以下のコマンドで解決できました。 迷路部分の実装 ここから先はあまり詳しくはないので、いろいろ調査しながら作りました。まずnpm startを実行した際の挙動としては というステップを踏んでいます。したがってApp.jsに具体的にフロントエンドで実装したいことを書いていきます。ただし、直接App.jsに書くとsrcディレクトリの中が汚れそうだったのでsrc/componentsディレクトリを作って、その中にMaze.jsという本体を書いていくことにしました。したがってApp.jsとMaze.jsの中身はこんな感じになります。 App.js Maze.js App.jsはMaze.jsを呼び出しているだけなので、今回はそんなに重要ではないです。本題となるのはMaze.jsの方で、ここには大きく分けて3つの要素が含まれています。 迷宮の地図 キーボードを入力した際の動き 最初は1.1の座標からスタートすることを言っています。handleKeyDownはキーボード入力を拾っています。それからplayerPosを直接更新することはせずに一回tempとしてnewPosを定義しています。let newPos = の部分がそれで、playerPos=newPosとするとplayerPos=2としたときにnewPosも2になってしまう問題があるため、PlayerPosの中身(..playerPos)を配列で囲むことによって同じ配列を作っています。後は入力e.keyの種類によってx,yを更新してPlayerPosに入れています。 迷路とプレイヤーの描画…
【Atcoder日記】ABC #365,367のC問題【二分探索、辞書順】
こんにちは。RockinWoolです。久しぶりの投稿になりました。メンタルを病んでパソコンに向かえない日々が続いておりましたが、なんとか乗り切ることができました。そして先日ついに茶色コーダーになることができました。さて、今回もAtcoderの挑戦日記になります。 二分探索法の問題 #365のC問題は色々計算して閾値を求めるよりも、二分探索で無骨に求める方が速さ的にも良いという(クソ)問題でした。解けなかったのは素直に悔しい。こういう閾値を求める系の問題が出てきたら二分探索法を疑うようにしなければ。二分探索法をコードは以下に示します。 これでmidに改良の余地がある限りはmidが調整されていき、最終的に一意に求まるという関数ができます。この考え方はよーく覚えておきたい。 低い方から辞書順に並べる問題 Atcoder367のC問題は初見では解くことができませんでした。そもそも解き方を知らないと対策できない系の問題でしたね。肝心となるのは「辞書順に低い方から並べる」という部分です。こういう数列の問題が出てきたら再起関数の実装問題なんだという合図のようです。 この関数の形は基本的に使いまわししたほうが良さそうなので、今後も同様の問題が出てきたら使えるようにしておきたいですね。 まとめ 二分探索法と辞書順に並べる問題の解き方について復習しました。目指せ緑コーダー!
【医療系雑学】フケ症の改善方法
こんにちはRockinWoolです。最近は筋トレにハマっていて自分の腕が太くなるのが毎日の楽しみになっています。現在休職中で時間があるわけなのですが、そんな中長年悩んでいたフケ症を改善しようと思いたち行動してみたら一気に良くなったので記事にしてみました。同じような悩みを抱えたエンジニアの皆様にも共有し改善できたら嬉しいです。それでは始めていきましょう。 フケ症を治すのに必要だったこと さて、私のフケ症は小学校5年からずーっと長い間改善できず、毎日丁寧に頭を洗ったりすることで隠し隠し生活してきていました。この度フケ症を治せた理由、それはズバリ病院にいったことです。 え、それだけ?って思うかもしれませんが、病院に行って病名と対処法を聞き、薬を飲みながら指示通りに生活するだけで治りました。正直数十年来の悩みがこんな簡単に治るとは思っていなかったので軽くショックを受けました。 病院からのアドバイス 病院の先生から言われたことはとても単純で、「頭をかくな」だけです。風呂でシャンプーするときも優しく撫でるだけ、むしろ泡が頭皮に触れていれば指は触れてはいけないレベルで大切にする。普段も絶対に刺激を与えてはいけない。100均で売っている頭皮ケアのトゲトゲも当然使ってはいけない。こんな感じでした。 実践・努力したこと さて、病院からの指示を守るために、まず意識のあるときは頭をかかないようにしました。結構かゆいときもありますが、そういうときはYANAGIYAで我慢したりしてともかく耐える。寝ているときに無意識にかきかけたときもありましたが、そういうときも自制しました。 結果 薬の効果もあったのか、2日後には頭皮の荒れはすべて収まり、1週間も経つ頃には筋トレしても白い粉が落ちないようになりました。人生初の出来事すぎてビビリました。というか、こんな単純なことを守るだけで治るのか・・・。 考察 エンジニアの方には多いと思うのですが、コードを書いているときなどに悩むと頭や顔をかいてしまうことがありますよね。私は結構無意識でこういうことをしがちだったので、顔や頭皮が荒れやすかったのだなあと感じました。爪を切るだけでも刺激が減って荒れにくくなるので、意識的に回数を減らしながらも無意識でも対策できるようにすると良いかもです。 まとめ 数十年来の悩み、フケ症の改善方法は意外にも単純で頭をかかないことでした。それを病院に行って学びつつ、薬と合わせて実践すればあっという間に治ります。同じ悩みを抱えている方、まずは病院に行って相談してみましょう。それでは、また次回!