【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週間も経つ頃には筋トレしても白い粉が落ちないようになりました。人生初の出来事すぎてビビリました。というか、こんな単純なことを守るだけで治るのか・・・。 考察 エンジニアの方には多いと思うのですが、コードを書いているときなどに悩むと頭や顔をかいてしまうことがありますよね。私は結構無意識でこういうことをしがちだったので、顔や頭皮が荒れやすかったのだなあと感じました。爪を切るだけでも刺激が減って荒れにくくなるので、意識的に回数を減らしながらも無意識でも対策できるようにすると良いかもです。 まとめ 数十年来の悩み、フケ症の改善方法は意外にも単純で頭をかかないことでした。それを病院に行って学びつつ、薬と合わせて実践すればあっという間に治ります。同じ悩みを抱えている方、まずは病院に行って相談してみましょう。それでは、また次回!

【渋滞学】セル・オートマトンの実装

頭痛のひどいRockinWoolです。しかし、時期的にはかなり忙しいのでプログラミングもはかどっています。最近の趣味は公園で散歩をしながら肩をほぐすことですね。さて、ちょっと前に渋滞学という本を読んだのですが、その中にあったセル・オートマトンの実装をずっとやってみたいなと思いながらやっていなかったのでやりました。今回はpybind11を使ってセル・オートマトン部分をC++で作り、作図部分やデータ整理部分をpythonに任せる形にしています。実装はGithubにこっそり上げて置きます。 プログラムの構成 まず、メインプログラムは実験を行ってデータをcsvファイルに出力するmain.pyとcsvを元に作図をするdraw.pyの2つから構成することにしました。このようにすれば、main.pyはpybind11を使って連携するがdraw.pyはピュアpythonの実装で良くなるので便利でした。ざっとフォルダ階層を書くと下のような感じです。 CA.cppはCA.hppで定義された関数をpythonから使用できるようにしていて、細かい実装はcaHistory.cppに書いてあります。余談ですが、CAはCellAutomatonの略、historyとつけているのはセル・オートマトンでどの位置にエージェントがいたかどうかを返すことを明確にしたかったからです。 main.pyの概要 まずは基本となるmain.pyの解説から。難しい処理はC++に任せてしまっているので中身は超単純です。1~100個のエージェントを召喚してセル・オートマトンをして、その情報を保存することを2回繰り返しています。1回目は1個から始めて100個まで増やして混雑具合を見ています。2回目はその逆で100個から減らしていってます。cl.caHistory()でセル・オートマトンの実験をしていますが、その時に計算される混雑の回数congestionはゲッターであるget_congestion()を実装して入手する形になっています。これはpybind11の仕様でメンバ変数を直接参照できないことと、メンバ変数は基本的にprivateにしてゲッターを使ってアクセスするというベストプラクティスに沿った実装をしていることの2点があります。 それでは、このmain.pyで使用されるcaHistory(), get_congestion(), add_agent(), remove_agent()を実装していきましょう。 CA.cppの実装 こちらも中身は単純で、pybindのincludeを行う部分と関数をpython側に共有させる部分の2つから構成されています。書き方が少し独特ですが4つの関数が公開されるのがわかります。 CA.hppの内容 先程の4つの関数のプロトタイプ宣言を行っている部分です。ちなみに前回の記事で書きましたとおり、コンストラクタも作らないといけないのでpublicには5つの関数が登録されています。またprivateにはそれらの関数が使う情報を登録しています。update()関数はセル・オートマトンの具体的動作を規定していて、前のセルにエージェントがいたら止まるなどの挙動を定義しています。これをcaHistory()ではint回呼び出してシミュレートするわけですね。 caHistory.cppの実装 記事のほとんどがこのプログラムの内容で埋まってしまっていますが、実際はかなり単純なプログラムです。ほとんどの分量はupdate()関数の条件文で埋まっているのでcaHistory(), add_agent(), remove_agent(), get_congestion()の本文は2~5行程度になっています。それぞれ与えられた役割が動作するようになっています。 draw.pyによる描画結果 draw.pyの実装は大した内容では無いので割愛します。main.pyを実行して得られたcsvファイルをベースにdraw.pyが書いた図が下記です。 まとめ 今回はpybind11を使ってセル・オートマトンを実装してみました。内容が少しヘビーになってしまったかもしれませんが、興味のある方はコードの改善点などドシドシ送ってください。それでは。