絞り込み

最新の投稿

プログラミング Polygon
プログラミング

スタートメニューからWSLを終了させてRAM使用率を表示

作るものwsl --shutdown をGUIで叩く。GUIの方がめんどいわという人はこの記事の対象ではない。 例えばDocker DesktopやIDEを終了しても、WSLがわりとメモリを食っていたとする。 ポチッとな! パソコンルームでブラクラを作っていた頃を彷彿とさせるプロンプトが出る。 はいを押すと立ち上がってるディストロが全部落ちる。ついでにRAM使用率も表示する。数字丸めるの忘れた。 そもそも作業中はコマンドを普通に叩くだろうから、なにか作業中にポチッとなすることは想定していない。これからゲームする時とかに使え。 VSCode設定変更PowerShell拡張機能を入れる。   "terminal.integrated.env.windows": {     "PSExecutionPolicyPreference": "RemoteSigned"   }settings.json に上記を追記し、自作スクリプトを実行可能にする。 Add-Type -Assembly System.Windows.Forms $result = [System.Windows.Forms.MessageBox]::Show("WSL全部終了する?","確認","YesNo","Question","Button2") If($result -eq "Yes"){     wsl.exe --shutdown     # https://shellgeek.com/powershell-get-memory-usage/     $CompObject = Get-WmiObject -Class WIN32_OperatingSystem     $Memory = ((($CompObject.TotalVisibleMemorySize - $CompObject.FreePhysicalMemory)*100)/ $CompObject.TotalVisibleMemorySize)     [void][System.Windows.Forms.MessageBox]::Show("現在のRAM使用率: " + $Memory + "%", "WSLを終了しました") } exit 0 VSCodeで上記のスクリプトを書き、適当な場所に保存する。 ただ、MessageBoxはShift-JISしか日本語を受け付けないっぽいので、エンコードを変えて保存し直す必要があると思う。 UTF-8で保存して日本語を出せる方法を誰か教えてくれ~ ショートカット作成 ショートカットを作成。分かりやすい名前を付ける。 ショートカットを無理やり追加本当は上記ファイルをスタートメニューにぶちこみたいんだが、右クリックメニューにないしD&Dもできない。 仕方ないので `%AppData%\Microsoft\Windows\Start Menu\Programs にショートカットを放り込む。 放り込んだショートカットのプロパティを開く。 powershell -ExecutionPolicy RemoteSigned -File "ps1ファイルのパス"ただ単にps1ファイルへのショートカットになっているので、先頭にpowershellを追記し、あとポリシーを変える。 あとは検索すれば出てくるはずなので、スタートメニューにピン留めする。 参考RAM取得する部分https://shellgeek.com/powershell-get-memory-usage/ メッセージボックスhttps://acoustic-groove2.hatenablog.com/entry/2018/01/29/233637 実行ポリシーhttps://zenn.dev/nekocodex/articles/eb3403961ad9b966ff6e

> 内容を見る

プログラミング Polygon
プログラミング

RAMが足りないので、Dockerだけ別PCのWSLに任せてリモート開発する

RAMちゃん「〽ああ〜〜 男の人って〜〜〜 いくつも〜〜〜 RAMを持って〜いるのね〜〜〜」 →持ってねえよ! だが無駄にPCが複数ある!!! DockerのRAM消費をケチるため、PCを2台使って分担する。 --- 概要以下、2台のPCと3種類のターミナルが登場する。WSLマシンホスト: WSLを動かすWindowsゲスト: WSLのLinuxメインPC: 任意のPC。IDEやブラウザはここで動かす WSL用マシンのIPを固定ルータをいじって、WSLのマシンのIPを固定する。 Buffaloだったら「詳細設定→LAN→DHCPリース」から設定できる。 以下、このIPは 固定したIP とするが、流石にスクリプトにハードコーディングはしない。 WSL用マシンの準備 (WSLホスト側)前提として以下を済ませる。Windows Terminalを入れておくストアはめんどいのでGitHubから背景写真とかいじれて楽しいよWSL2の有効化Docker Desktopのインストール俺、これ知らなくてUbuntuにDocker入れちゃったそもそもDocker Desktopのインストーラが全部やってくれるので、WSL側で何かすることはないHyper-VではなくWSL2バックエンドを選択することなおRDP(リモートデスクトップ)やOpenSSHサーバーは不要。まあ画面がしょぼいとかの理由で、RDPがあればベターだが、Proライセンスいるんよな。 wsl.exe -l -v してWSL1だった場合、以下のようにアップグレードする wsl.exe --set-version ディストロ 2 wsl.exe --set-default-version 2 あと不確実性排除のためにディストロ固定する。お使いのディストロに合わせて適宜調整すること。wsl --set-default ディストロ スクリプトを書く (WSLゲスト側)以下、ホストのexe叩くだけなので、任意のディストロで動くはず。 ポートフォワード設定sudo vi bin/port_forward.sh ユーザ関係ないのでbinに置いたが、適宜変えてくれ!ベターな場所があるはず #!/bin/bash # ポート開放の自動化 # Usage: ログオン時にやれ! # ホストのIP HOST_IP=$(ipconfig.exe | sed -e 's/\r//' | grep 'IPv4 Address' | head -n 1 | cut -d ':' -f 2 | awk '{print $1}') # ゲストのIP IP=$(ip route | grep 'eth0 proto' | cut -d ' ' -f9) function forward() { PORT=$1 # 2つめのポート指定なければ同じポートを使う PORT2=${2:-$PORT} # まず削除 netsh.exe interface portproxy delete v4tov4 listenaddress=$HOST_IP listenport=$PORT2     netsh.exe interface portproxy add v4tov4 connectaddress=$IP connectport=$PORT listenaddress=$HOST_IP listenport=$PORT2 } forward 22 2222 # SSHは2222に転送 # 以下はLaravel Sail用なので適宜変更 forward 3306 # mysql forward 6379 # redis forward 7700 # meilisearch forward 8025 # mailhog forward 8000 # web # 自動起動 sc.exe config iphlpsvc start=auto sc.exe start iphlpsvc sudo service restart ssh 上記のスクリプトを書く。以下のことをしているホストのipconfig.exe を叩いてIPを取る。先程固定したが念の為。ゲストのIPを取る。netsh.exe でポートフォワードを設定する。ドキュメントはこちらforward関数に2つ目の引数を渡したら、VMとホストで違うポートを使う(22 → 2222)渡されなかったら単に同じポートを使う。SSHサービス毎回再起動。しないとゲストのIPが変わってreset by peer と怒られる 状況確認netsh.exe interface portproxy show v4tov4 ipv4 をリッスンする:         ipv4 に接続する: Address         Port        Address         Port --------------- ----------  --------------- ---------- 固定したIP    2222        WSLのIP   22 # 後略 こんな感じになるはず。この場合 2222 番ポートにSSHすればWSLに入れる。 削除netsh.exe interface portproxy delete v4tov4 listenaddress=固定したIP listenport=ポート なんか間違えたときはこれで削除。ホストIPも指定せなあかんので注意。 SSH使えるようにする (WSLホスト側 2)次に、ログオン時にポート開放するタスク設定と、ファイアウォール。 タスクスケジューラタスクスケジューラで以下のタスクを定義する。名前は「WSLポートフォワード」など「ユーザーがログオンしているときのみ」「最上位の特権で実行」トリガーはログオン + 1分遅延を入れるさもないと、何故か実行時にパラメータ不足で失敗する wsl -u root --exec /bin/port_forward.sh操作は上記のコマンド。 多分これでいいはず。 ファイアウォールcontrol firewall.cpl ファイアウォールを開ける。「詳細設定」→「受信の規則」から新しいルールを追加し、ポートTCP2222,3306 という風に必要なポートを開ける。 リモート開発 (WSLゲスト側2)あとは、リモート開発をする。 開けたポートを使うようなコンテナを動かしていく。 cd 任意の開発用ディレクトリ curl -s https://laravel.build/laravel-sandbox | bash 面倒なので一発で立ち上がるやつ。これをやらかすと laravel-sandbox にLaravel一式がクローンされ、勝手にdocker-compose.ymlに書いてあるコンテナのビルドや、.envのコピーまで始めてくれる。一式というと、PHPもComposerもDBもここでビルドするので、割と時間がかかる。 cd laravel-sandbox sed -i 's/APP_URL=http:\/\/localhost/APP_URL=http:\/\/localhost\nAPP_PORT=8000/' .env ./vendor/bin/sail up80番になっているので APP_PORT=8000 に変えて起動。 メインPCvi ~/.ssh/config Host wsl HostName 固定したIP Port 2222 User WSLのユーザ名 ssh wsl これでWSLに入って開発できるはず。VSCodeやJetBrainsのSSH機能も使える。 SSHだけじゃなく、8000番台とかも開放したのでWebアプリの動作確認もできる。 PhpStormがRAM4GB要求してくるJetBrains系IDEはみんなこうなのか試してないが、PhpStormは4GM要求してきた。 俺のWSLマシンのRAMが4GBしかなく、フルにWSLに割り振る必要が出てきた。wsl --exec vi /mnt/c/Users/ユーザー/.wslconfig [wsl2] memory=4GB wsl --shutdown まあ実際は4GB割り振れないんだが、誤魔化せる ▲passwordはpasswordではない(多分翻訳ミス) 参考https://qiita.com/yabeenico/items/15532c703974dc40a7f5 ポートフォワード部分https://zenn.dev/d_hori/articles/128f8976a48b52 ホストのIPhttps://learn.microsoft.com/ja-jp/windows/wsl/wsl-config .wslconfig

> 内容を見る

人工知能 Polygon
人工知能

OUCRC最強オセロAI決定戦@学祭 の報告

2022年11月5日、2022年11月6日――岡山大学祭が3年ぶりにオンサイト開催されたこの日、電子計算機研究会は一般教育棟A37講義室を借りて展示をしていた。 ゲームが多数展示される中、1つ異質な存在があった。AI vs AI オセロ対決 のディスプレイである。 7月末に発足したこのプロジェクトは、以下のように進んだ。 8月上旬 主犯はゲームを決定するための投票をする。クソデカオセロ(盤面20x20のオセロ、原作)に決定。 8月中旬 主犯はターン制ゲーム用のサーバ(Go, MQTT)を途中まで作っていたが放棄する。 9月下旬 プロジェクトが再始動する。 10月上旬 主犯はモックサーバ(Go, HTTP)の作成を開始する。OpenAPI で仕様書を書いて OpenAPI Generator で自動コード生成したかったらしい(文言からわかるように、頓挫している。理由は仕様を決めかね続けてエターナったため)。 10月中旬 主犯はオキリョウ氏にサーバ(Kotlin, HTTP)作成を依頼する。まっともぉん氏はUnityでディスプレイ用アプリの作成を開始する。まっともぉん氏はAIを完成させ、アプリに内蔵する。 10月下旬 主犯はオセロゲームの作成を開始する。オキリョウ氏はサーバとAIを完成させる。 10月28日 ゲーム内容を通常の8x8のオセロに変更。 11月4日 学祭前日。みんなでデスマーチ :smiling_face:。 11月5日 学祭1日目。未明、主犯はモデルの学習プログラムを完成させ、学習を開始する。明け方、Pon氏はAIを完成させる。1日目展示開始時点で完成していたAIは3つであった。 11月6日 学祭2日目。午前12:03、主犯は通信プログラムを完成させ、AIを使える状態にする。2日目展示開始から数分後にセットアップし、無事4つのAIが対戦した。 ガバガバっぷりが酷い。スケジュールをもう少しきちんとして欲しい。9月の空白の区間は何だったのか。しかももともとこのプロジェクトの参加予定者は4人より多かった。 AIについての作者コメント AI作者の4名からコメントを頂きました。 まっともぉん(MatsuBot)仕組み1. 配置可能な場所をリスト化にする 2. リストの値をランダムに1つ取得する 3. 配置する ランダム配置 AI BOTです。 時間に余裕あれば開放度理論とマス目自体の重みで判定する簡単なアルゴリズムを組もうとはしてた…感想ランダムAIもなんだかんだ勝率良かったのが一番驚愕でした(本当は「時間かけて作ったAIがランダムBOTに負けてる乙www」って全力で煽りたかったけど、みんな徹夜して作成してたので流石に言えなかった。余裕もって作れ!!とは思うけど) 対戦・表示する仕組みがせっかく整ったので、AI持ち寄って戦わせる企画を部で相続するのはありかも?プログラミング・AI・通信について学べるし何はともあれお疲れ様どす確かにプログラミングの重要な要素を色々カバーできてるし、勉強会の材料としてよさそう。ソースをオープンにしてくれ。 なりました オキリョウ(Hoge)仕組み1. 定石(https://bassy84.net/othello-top-index.html)うさぎと虎と牛のうち、主要なものを入力 2. 開放度理論(https://kozu-osaka.jp/cms/wp-content/uploads/2020/11/077c2ec004566f2968e2f3089333ede7.pdf)を元に、数手先(大体4手くらい)を読んで(自分の開放度 - 相手の開放度)の合計が最も小さくなるような手を打つ 3. 全探索(残り11手)感想ガキの時にC#でオセロAIを作ったことがあったがクソ雑魚だった それから一回り成長したことを実感できてよかった 成績としては自分だけ無双している 勝てる分には嬉しいが、もう少しいい勝負してほしかった せめて他のBotにはランダムBotくらいボコボコにして欲しかった・・・ コードはこちら: https://github.com/Wansuko-cmd/reverse-appごめん。みんな乱択ベースだから許して。 Pon(Pon)仕組み1. 配置可能な場所とその時めくれる石数をリスト化する 2. そのリストを「めくれる石数」の降順でソートする 3. そのリストの「めくれる石数」が同じものを一定確率で入れ替える. 4. そのリストの上位log_2(残りのターン数)個の中からランダムに一つ選ぶ. 5. 選んだものの場所へ配置する.感想他のAIに勝てるか自信があまりなかったがまさかランダムAIに引き分けるとは思わなかった.正直めっちゃ悔しい!めくれる,めくられる石数を数手先まで重み付きで読んでみればまた結果は変わったかもしれない.(ワンチャン時間あったら作るかも) 通信関連について勉強することになったのは意外だったが,結構いい勉強になった.他にもpythonのファイル分割などの(個人の実装で)初めて試したことやプログラムの作り方における反省点(最初クソデカ関数作ってしまった)とかが分かったので良い経験になったと思っている.とりあえず次にこのような機会があった時にAIで勝てるよう勉強頑張ります. お疲れさまでした!序盤取りすぎないというロジックを乱択で組むのは面白い。Pythonについてはパッケージ管理ツールを使うと便利なので今度教える(今回は NumPy と Requests ぐらいだったので困らなかったが)。 終に鮭(Salmon)仕組み畳み込みニューラルネットワーク(転置畳み込みを含むのでそう言っていいかは分からない)で盤面から状態行動価値関数を計算するように作った。 所謂 Deep Q Learning(DQN)のようなものだが、一般的な手法として存在を知っていたわけではなく、足りていない部分が多いと思う。 層は以下の構成だが、振り返るとあまり良さそうではない。オセロにおいて辺や角に置かれている駒は極めて重要なので、畳み込みより全結合のほうが良かったかもしれない。 図1: Salmon AI の CNN の構成 学習においては、自身と対戦を行い、各試合の勝敗に応じて各対戦者の指した手に良いか悪いかを割り当てて教師ベクトルとする。 これを100回行うごとにミニバッチ学習をする。感想ニューラルネットワーク歴3週間ほどである上、よく使われる構成も知らないため適当に組んだ。これより前には MNIST しか組んでいない。 そもそもQ学習だと思っていない。クラス分類問題のつもりで作った(その割に運用時は argmax ではなく softmax を使っているが)。 とりあえず今思いついている改善点は、 - 全層 fc にする(下手に畳み込みしない) - 負けたときの手を学習データに含めないようにし、損失関数を CrossEntropy にする の2つ。 追伸:v2 では全層全結合にした。モデルの state_dict は36KB→100KB超に増えた。 他のAIに対しての勝率は良いとは言えないが、ひとまず v1 には勝てるようになったので良かったかなと。 結果報告 さて、最強決定戦なのにインメモリデータベースに保存しており最早学祭時の対戦データが残っていない本企画である。 オキリョウ氏の協力を頂き、データベースを PostgreSQL に置き換え、再現して実行した。 図2: ルームデータの保存形式(psqlでSELECTしている画面) 結果を Python で適当に加工し、JSON に変換して保存し直した。# jq '{ users, results: [.results[0]] }' results.json {   "users": {     "d34a33b0-b29a-4daa-8682-1604bcc4dbf6": "Pon",     "053b45b6-c029-4b19-9f62-f5d366a9a89e": "MatsuBot",     "99cb0ee1-f56b-46bf-8d91-6bae860603bd": "Salmon",     "f751d4ad-cebd-4f9e-be2b-01d9ca8d34f5": "Hoge"   },   "results": [     {       "black": "99cb0ee1-f56b-46bf-8d91-6bae860603bd",       "white": "d34a33b0-b29a-4daa-8682-1604bcc4dbf6",       "board": "2,1,1,2,2,2,2,2|2,2,1,2,2,2,2,1|2,2,1,2,2,2,2,1|2,2,1,1,1,2,2,2|2,1,1,2,2,1,2,2|2,1,2,2,1,2,2,2|2,2,1,1,1,1,2,2|2,2,1,1,1,1,1,2"     }   ] } 勝率各AIの勝率は以下のようになった。 表1: 各AIの勝率表 スクリーンショット 図3: まっともぉん作の表示アプリ (文責:終に鮭 a.k.a. AAAR-Salmon)

> 内容を見る

MMD Polygon
MMD

踊る初音ミク[MMD]

こん指揮官!(Vtuber並感)。お前ら初音ミクがジト視覚と死角を司る球体で人々が望む通りの役を演じ、儀式を行なってらァ神に見放されたある大陸見たいだろ、子猫ちゃん?クポで、現在よりの刻はそれを──“神”と呼ぶ──をMMDで帝都にある魔導兵器工場で増産されてついでにBB素材にしようと回想(おも)うぞ。(ただおどるような華麗な剣さばきキ・ズナスーサイダー星あかりの人形たちのお遊戯レブナントです(…そう、このまま終わるなら…それが一番なんだ──)。) ちなみに、預言書にも記録のある刻命記録はレベル1その錆びた銃口を向けに野生の勘に綴っていきます。MMDモデル、WAVファイル挿入MMDのファイナルファンタジーシリーズのキャラクターの挿入は、左下(ゲーム内課金あり)の「俺の勘だが、読込疲れからか、不幸にも黒塗りのレガリアが墜落してしまう。」から行いながらも人類は、光を求める…。そして、現在よりの刻使用するファシナトゥールの上級妖魔は「初音ミクver2.pmd…見つけ次第殺せ」を使役(スレイヴ)します。初期では「UserFile」→魔王様「Model」→「初音ミクVer2.pmd」にあり…オレはスコールに似ているとよく言われます。また、MMDに心の呟きをバックスタブする際はWAV預言書をイグニッションしてやる我にとって価値あるものがある“魔法力参ではだめやぞ)。入れ方そして、邪悪が胎動した。は、ヒダ・リスウイェそれが、人間というものだ。の「君は人間か?ファイル(フェムト…噂には聞いていたが、これ程とはな……)…今の私に人を愛する資格など有ろう筈がない」ここから先へ行けば生きては戻れないかもしれない「WAV預言書の穢土より出でし航空戦艦ヨー・ミコミ」をティファか、エアリスか……選択すればかまわんぞ。ちなみに、凶が想いが交錯する「13日間」が終わる時、彼らの戦いが始まるのは28フレーム……その戦争の後のような感じで少しスロウ状態にされて始まるから注意だぞ。 モーション新すばらしきこのモデルは後の歴史家は、この事実をこのように評する。「中核すべてに代えて、この手に勝利をッ!」、「IK」、「君は人間か?ボーン」とプロンプトは断言したとアンティカ族有象無象をいじるイデアでモーションを尾(つ)けることができる。適当に一対血界の眷属(ブラッドブリード)用機動戦闘骨格目を擬似的に発生させ――彼女が百人隊長制式鎖帷子に着替えたらこんな感じになったぞ。極めている作り方は滅びゆく世界の先駆者の動画たとえこの手を汚してでも照覧あれ(…ふむ、トラウィスカルパンテクトリ)。 ツヴァイフレーム以降は、ひとつひとつ魔操駆動式をギルガメの呪いて発進事象この戦いに勝利するために必要は預言書に存在しない。くわしいことは「3Dミクを躍らせるツールを自作してみた(説明後編)」と鳥山求は語る…参照して”意地でも”手に入れたいが、1フレームTruth eyesの魔操駆動式と次のモーションの星の瞬きはMMD側が勝手に補間してくれる血が流れればレーティングに引っかかるので、できるだけ楽をし、人類を滅ぼしてみよう。 ジ・エンドに魂の在り方を下の「表情操作」から下静止黒魔法『ストップ』の………と預言書にも記されているようにコンフィグ設定してらァおk。“これぞ帝国が求めたもので変えても面白いぞ” 可能であると神のコデックスに規定されてはいた魔操駆動式を並べるとこんなナイフの先で命が震えているのを感じに…君はもうクラウドになったぞ。 BBの挿入ここからはBBにする周回をせしめるのだが、お前の生きる“今”は有志が作っていた「BB素材製作補助UVスカイドーム」を…たかがゲームのデータに毎月何万ギルも使うことにし、人類を滅ぼしてみよう。 帝国の後は、表情操作の鳥山求「色変え」の魔力を0.38にしたらいいお. また、aviアウトプットをせしめ、世界に滅びをもたらす際にイマジネイション・ポイントと幻影が私の覇道を阻む者なので、「表示(V)」→「座標軸表示および地面影表示」で永遠に抹殺しておこう。そして世界は揺れ始める・・・。 avi出力魔操駆動式がペルフェクティオムに不可能を可能へと変え――彼女がアダマンホーバークに着替えたら、絶え間なき修行の果てにaviノムリッシュ翻訳です。謎の男「預言書(F)」→謎の男「AVIファイルにアウトプット」を世界の命運をこの手にすると、保存先をきかれるので 導かれるままに名前を薄れゆく意識の中で決意して“血定”を押します…だけど、それで本当によかったのだろうか……。(この時に、「Data'フォルダ深淵に'MMDxShow.dll'があるか確認して下さい」とでたり、ニブルヘイムを灼き尽くしたりすることで第八霊災でかの英雄が死する運命に抗うので、その日世界は引き裂かれた……オプティマは「mmdxshow.dll」でダウンロードしてください。アルテマ発動まで 20秒!)その後に下図のおやおや、これはこれはに、フ=レムームスレートやが聞かれる、すなわち我と同等の実力を持つので、ぬるぬるした動きがいい…この事件の黒幕が神々と四大貴族、そして宝条の仕業なら…60トリガーハッピー、容量が気に解き放たれる…誰かを恨み、憎んで生きていくことができたなら『天の使い』を名乗るヴィ=デュウォクラッシュダウンコーデュィングを決めて待ちなよ子猫ちゃんてね。神判事項として、記憶を電子化するフレームを0からにし太陽よりも大きく、砂粒よりも小さいと音声がリジェネされません。 対象で、黎明のホーホーホウを適当に切り取ったら人類史上、最大の発明の一つ。 “ファイナルファンタジー”の完成!よくやった!…ああまだ居たのか。何処へなりとも消え失せよ…  !絶望にとらわれてはならない!希望を抱き続けるんだ!!!(ちなみに、店主さんが土下座している様子は ぜひサブチャンネルをご覧ください→ジト目ダンス)参考 BGM:「【フリーBGM】meow bell【ポップな/明るい/楽しげな/かわいい】」https://www.youtube.com/watch?v=XjxQew29tCc&t=0s 元ネタ:「おどる紲星あかり BB素材+使用例」https://www.youtube.com/watch?v=bw9IFEjJufw

> 内容を見る

NoImage Polygon
プログラミング

Nullはなぜ危険なのか

こんばんは、オキリョウです Kotlin 1.7.0がついにきましたね! https://blog.jetbrains.com/kotlin/2022/05/kotlin-1-7-0-beta/ みなさん期待を膨らませていることだと思います。 ところで、このバージョンの目玉として取り上げられているものの中に、max関数及びmin関数があります。 名前を見てわかる通り、これはリストの中の最大、最小の値を取ってくる関数になります。 こんな原始的な機能すらKotlinにはなかった・・・というわけではありません。 代わりにmaxOrNull、minOrNullという関数が存在します。 では何が違うのかというと、最大値及び最小値が存在しないときの挙動です。従来 -> nullを返す今回 -> エラーを投げるとなっています。 最近ではNullは敬遠されがちです。その流れを汲み取ってこの関数を実装したのでしょう。 ものすごく良さげな機能に見えますね。 でも、実は私、あまり良い気がしていません。 とりあえずNullは危険だ!という理由でより危険なこの関数を使う人がいるかも?と思っているからです。 そこで、なぜNullが危険と謳われているのかを解説していきたいと思います。 Nullの危険性Nullの危険性に触れてみるまず、以下のコードを見てみましょう。こちらはJavaのコードになっています。public static void main(String[] args) { Integer value = 5; System.out.println(value * value); }至って普通のコードですね。出力結果は以下のようになります。25 それではこのコードを少し編集してみましょう。public static void main(String[] args) { Integer value = null; System.out.println(value * value); }value変数に入れる値をnullにしてみました。この場合どのような挙動をすると思いますか? そもそも数値型にnullなんか入らなさそうだからコンパイルすら通らなさそうです。 実はこれ、コンパイルが通るんです。 ただ、実行しようとするとエラーを吐いて止まります。Exception in thread "main" java.lang.NullPointerException Nullの正体なぜ上記のような挙動をするのでしょうか? それはnullが何かを理解すればすぐにわかります。 nullは何もないことを表す番地へのポインタです。 先程の実行例を見てみましょう。Integer value = 5;これは、5という値がとあるアドレスに格納されていて、そのアドレスの番地をvalueが保存している・・・という構造になっています。 ではnullの場合はどうでしょう?Integer value = null;これは、何も意味がないというアドレス(通常は0アドレスとからしい)の番地をvalueが保存しています。 ここから、value自身は両者とも同じようにポインタを指していることがわかります。 問題は、そのポインタの先に値がある場合とない場合があるということです。 そのせいで、実行時ではないとエラーがわからないのです。 説明がややこしくてわからん!という人は以下のように考えましょう。 Integer型とは、暗黙的にInteger or null型になっていた これらはもちろん、他の型でも当てはまります。 例外として、プリミティブ型と呼ばれるポインタを使わない型にはnullは使えません。 何が恐ろしいかここまで色々話してきましたが、結局nullの何が恐ろしいのでしょうか? まとめると以下の通りです。実行するまでエラーが出ないため、本番環境で爆発する可能性があるnullを参照した場所でエラーが起きるため、どこでnullが代入されたか(すなわち原因)を特定するのは困難nullを使わないように制御する方法がないため、人力でnullチェックをする必要がある(人力なので忘れがち)これらのことから、エンジニア界隈ではnullを恐れる人が多発する事になりました。 このことから、nullを開発した張本人も後悔の念を表明しています。 https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/ Nullの現在ここまででnullの恐ろしさを十分に理解できたのではないでしょうか? しかし、ここまで恐ろしいと言われているnullをそのまま放置する人類ではありません。 比較的最近作成された言語では十分な対策が取られています。 有名な言語としてKotlinが挙げられます。 ではどのような対策をしているのでしょうか? やっていることは単純です。null非許容型を用意したんです。 実際のコードを見てみましょうval value: Int = null // NGこのように、普通の型にはnullが入らないようにしました nullを使いたい場合は、下のように?をつけることで許容型にする必要がありますval value: Int? = null // OKまた、この?を外さない限り、Int型のメソッドは呼び出せません。 外すにはnullが変数の中に入っていないか(いわゆるnullチェック)をする必要があります。 こうすることで強制的にnullチェックをさせるようにしました。 これで Int = Int or nullみたいなことは無くなったわけです。 もちろん、nullチェックがしやすい構文も用意されており、nullとの付き合いが断然楽になりました。 まとめかつて、nullは非常に恐ろしいものでした。 最も簡単にエラーを引き起こしてしまいますし、かつ原因がわかりづらい。 しかし、現在ではコードによる強制チェックができるようになったため、このようなエラーは随分と減りました。 むしろ、確実にチェックしなくてはならない存在となったのです。 チェックしないとそもそも関数呼び出せないですからね。 そのため、現在のコード上でのnullは結構使いやすい存在になったと個人的には思っています。 かといって乱用するのもどうかとは思いますが・・・ 昔よりはnullを使うデメリットがガッツリ下がったと思ってください。 もちろん、Null非許容型が用意されていない言語の場合、nullは非常に危険です。 例えばJava, PHP等の古い言語、またモダン言語でも昔のDart等が挙げられます。 できる限り使わないようにするか、Option型の導入を検討しましょう。 それでは、お疲れ様でした! 補足冒頭で述べた「nullより例外の方が危険だ」という事について補足しておきます。 例外の何が恐ろしいのかというと、コンパイラによってチェックされない事です。 どこからでも好きに投げれて、try-catchを使ってチェックをしなくてもコードに怒られない・・・ そうですよね? ちょっと怖くないですか? 先程のnullで説明したことと同じような課題が出てきています。 このことから「近代のgoto文だ」と批判する人すらいるほどです。 私もこれには同感です。そこらでポンポンエラーを投げるくらいならnullで表現する方が安全だと思います。 大概のモダン言語上のnullであれば確実にチェックをする必要がありますので想像以上に安心して動かせます。 値が存在しなかったからnullを返すわけですし、結構自然な気もしますしね。 いや、nullじゃ表現力が足りない。型の堅牢さも足りていないから例外は必須だ!という人。良い着眼点です。 そんな人はぜひResult型について勉強してみてください。これを使えば完全に例外のない世界も実現可能です。

> 内容を見る

デザイン/グラフィック Polygon
デザイン/グラフィック

3Dプリンターでフィギュア作りたい

こんにちは、FFです! せっかく部室に3Dプリンターがあるのでフィギュアとか作りたいですよね。 うちの部活には言十(こと)ちゃんという公式キャラクターがいるので、その子の2頭身フィギュアを作っていきます。 たのしみ~ 3Dモデリング 3Dモデリングをしていきます。3Dデータはそこらへんから拾ってきてもいいんですが、せっかくなので自分で作りたいですよね。 三面図を書いていきましょう。 クリスタで対象定規使いながら書きました。本家の言十ちゃんと全然似てない…本当はもっと可愛いので見てね。 これを元にblenderでモデリングしていきます。 できました! モデリングのやり方とか話し始めたらキリがないので割愛します。 これくらいだったら、初心者でもすぐできるようになると思います。電算研には高スペックなPCもあるし優しく教えてくれる先輩もいるので、入部しましょう! 塗装したいので4つに分割しました。ダボもちゃんとつけてます。 3Dプリンターで出力 作った3DデータをXYZprintに持っていってセッティングします。設定は先輩が書いてくれた資料を見ながらやります。感謝感謝。 PCでのセッティングが終わるとデータが3Dプリンターに送られます。 プリント時間は今回のフィギュア(体長10㎝くらい)だと9時間くらいかかりました。部活終わりにセッティングして、次の日に取りに来るのがよさそう。 ちなみに部室にある3Dプリンターは熱溶解積層方式という、熱で溶かした樹脂を一層一層積み上げる方式のものです。ほかの方式と比べて扱いやすい代わりに、細かな造形はできなかったりします。 9時間待ってできたものがこちらです。今回は塗装がしたいので白にしましたが、カートリッジを交換すれば黒も緑も赤も作れます。 表面処理 出来上がった造形物は、ガタガタになってたりバリがあったりしてるので、綺麗にしていきましょう。 やすりやデザインナイフで余分な部分を削り取っていきます。(右下にあるのはエポキシパテで、欠けた部分を埋めるのに使いますが、この後のアセトン処理で溶けるので今のタイミングでは使えません。) 金属やすり以外は私物です。 ある程度綺麗になったら、アセトンで表面処理を行います。 ポリエチレン容器にアセトンをしみ込ませたキッチンタオルを敷き詰めてその上にアルミホイルを被せます。造形物に刷毛でアセトンを塗ってアルミホイルの上に置いたら、ふたを閉めて1時間半から2時間待ち、容器から造形物を取り出して乾燥させます。 アセトンはニトリル手袋貫通するらしいんですが、付けないよりはマシだろうと思って付けました。本当は多層手袋を使った方が良いそうです。 上が表面処理したもので、下が処理してないものです。上のほうが光沢がはっきりしているのが分かります。 熱溶解積層方式では樹脂を一層一層積み上げていくので細かい筋が入ってしまいます。そこでアセトンを使って表面を溶かすことで滑らかにします。 とりあえずできた部品を仮組みしました。かわいい~。 塗装 塗装作業に移ります。ここで出てくるものは全部私物だし、作業場所も実家です。あしからず。 また表面処理です。フィギュアは表面処理が命。 気に食わない部分にパテを盛ったりヤスリで削ったりして満足のいく形にしていきます。 形が整ってきたらサーフェイサーというスプレーを吹きかけてさらに表面を滑らかにしていきます。サーフェイサーを吹くことで表面の凸凹が見えやすくなります。 サフを吹く→やすりがけ→サフを吹く→やすりがけ→… を満足いくまで繰り返します。 表面処理が終われば塗装に移ります。基本的にフィギュアはラッカー塗料で塗装を行います。ラッカー塗料は他の塗料と比べて食いつきが良く、すぐ乾く代わりにかなり有毒です。塗装ブース必須。換気も忘れずにやりましょう。 こういう感じでエアスプレーで塗っては乾かして塗り重ねていきます。 猫に邪魔されつつも… ラッカー塗料での塗装ができました! 次は顔を描いていきましょう。 顔の塗装にはエナメル塗料を使います。 エナメル塗料の溶剤はラッカーを溶かしません。そのため、ラッカーの下地に影響を与えることなく、顔の塗装ができるというわけです。 原寸大に印刷した設計図をよく見ながら描いていきます。 顔を描いて、各パーツをくっつけて、髪飾りのシールを貼ると… できました! 失敗も多いですが、おおむね満足です。やっぱり自分で作ったものは可愛く見えちゃいますね。 みなさんも3Dプリンターで好きなキャラクターを作ってみましょう!

> 内容を見る

ガジェット/ハードウェア Polygon
ガジェット/ハードウェア

WSLを入れよう! 入れなければ ならぬ

どうも。部のPCにWSLを入れて回る職人です。貴様(敬称)のPCにも入れなさい。 一応WSLについて軽く解説しておくと、Windows Subsystem for Linuxの略で、Windows 10以降で利用できるLinuxの仮想環境です。 WSL2はHyper-Vアーキテクチャを利用する仮想マシンプラットフォームの上でWindowsとLinuxをコンテナとして動かす機能です(注)。 つまりLinuxがコンテナとしてWindowsと同じレイヤーで動きます。 ここ がわかりやすいのでもうちょっと詳しく知りたい人は読んでくれ。正しいかは知らん (注)メインOS(ホストOSと呼んでいいのか分からんので誤魔化してこういう言い回しにした)であるWindowsを、Windowsサンドボックスというコンテナとして隔離して動かすだけであって、Hyper-VのようにWindowsコンテナを複数作る機能はWSLの範疇外のことです。 これは今後もインストールしたり、環境をリセットしたりしたくなったときのための自分用のメモ書きです。とりあえず入れよう今はコマンド1つで入れられるようになったんですね。しかもただディストリビューションをインストールするだけじゃなく、WSLと仮想マシンプラットフォームの有効化最新のWSL用LinuxカーネルのダウンロードとインストールWSL2をデフォルトに設定までやってくれるらしいです。はえ~(ソース:イカリ おこのみ屋 https://docs.microsoft.com/en-us/windows/wsl/setup/environment) コマンドは、wsl -l -oでインストール可能なディストリビューションの一覧を表示、wsl --install [-d <Distro>]でディストリビューションを指定してインストールできます(-dオプションを省略するとUbuntu)。 ただし、このインストール方法はWindowsのビルド19041(Win10 2004)以降でのみの対応です。 前はこれに該当するバージョンでもダメだったので古いバージョンにも降りてきたっぽいですね。ありがたい。 それ以前のWindowsを使用していたり、一覧に出ないディストリビューションや、 docker export して吐かせたtarballなどをWSLディストリビューションとして利用したい場合(wsl --import でできます)、DockerバックエンドとしてのみWSL2を利用したい場合などはこれまで通り手動でインストールしてください。 しかしAlpine Linuxがないな。なぜ(普段遣いするPCはUbuntuでもいいけど、たまにしか触らないPCなら軽量な方が……)。起動インストールしたディストリビューションを起動します。スタートメニューに追加されてるのでクリックしてください。 暫く待つと Enter new UNIX username: とユーザー名を入力するように言われるので入力します。なんでも良いです(rootとかでなければ)。 パスワードも設定するよう求められるので適当に決めてください(どうせそのローカル環境でしか使わないからpassにしてるけど多分よくない)。入力途中は何も表示されませんがそれであってます。Bashの設定Bash以外のシェルを使うのもいいんですが、最初はBashにしとくのが無難かなと思います。デファクトスタンダードなので[独自研究]。個人的にはfishというシェルを推していますが、POSIX互換じゃないし万人受けはしないだろうなーと思います。何も設定しなくても便利なのでdockerみたいな使い捨ての環境でも重宝しますよ。abbrとかいう神機能もあるし(Macなどでも標準で採用されていて人気のあるzshにはzsh-abbrという拡張があるようですが)。でも使い捨ての環境でそんなシェル中心に触る作業多くないか。 WSLを使う上ではなんたってシェルが命です。現状、Win10のデフォルトでは多分GUIに対応していませんので。 故に使いやすいように設定していきます。いや私はしませんので貴方で勝手にやってください。設定するファイル編集する必要のあるファイルは主に .bashrc です。最初から色々書いてくれてるのでまずmv .bashrc .bashrc_origなどとして一度除けます。echo '. $HOME/.bashrc_orig' > .bashrcとかなんとか打てば .bashrc を作成して(ディレクトリでなく書き込み権限があればファイルが存在しても上書きしちゃうので順番には気をつけましょう)その中身が. $HOME/.bashrc_origになります。これで .bashrc_orig が読み込まれます。これより後ろの行に自分で設定を追加していきます。エイリアスの設定エイリアス(alias)とは別名のことで、コマンドに別名をつけることができます。 これを利用して、最低限必要なエイリアスを .bashrc にvimなりなんなりで書いてください。それが以下です。alias rm='rm -i' alias mv='mv -i' alias cp='cp -i' alias ls='ls --color=auto'rm,mv,cpのiオプションは上書きする際に確認をするオプションです。これがないと事故りやすいので必ず書いてください(rmについてはtrash-putなどを使ったほうがいいかもしれませんが)。 lsのcolorオプションは読んで字の如く色をつけるオプションです。ないと見づらいので書いたほうがいいです(同様にgrepも書いたほうがいい)。ただし、lsもgrepもUbuntuなら初期設定の.bashrc(つまり上で移動した.bashrc_orig)に書いてあるので書かなくてもいいです。Windowsパスの引き継ぎをしないようにする初期設定だとWSLの側で環境変数PATHを引き継いでしまいます。するとLinuxから直接コマンドで叩くことがないようなものを大量にTab補完時の検索対象にしてしまい、邪魔だし検索時間も長くなります。これをしないように設定しましょう。sudo tee -a /etc/wsl.conf << END 1>/dev/null [interop] appendWindowsPath = false ENDこれでよし(普通にVim使えや[解説1])。/etc/wsl.conf に2,3行目の内容が書き込まれたはずで、これでWindowsのパスが含まれないようになりました。一部だけ叩けるようにしたいでも一切Windowsの側のアプリケーションを叩かないかといえばそうでない場合があるかもしれません(例えば私はVisual Studio CodeはLinuxからWindowsにインストールしているものを呼び出すことがよくあります)。こうした場合のために、シンボリックリンクを作っておきましょう。 例えば C:\Users\salmon\AppData\Local\Programs\Microsoft VS Code\ にVSCodeがインストールされていたとしましょう。このとき、その中の bin\code をLinux側から叩くことでVSCodeを起動することができます。フルパスで打つのは面倒なので、パスの通った場所にシンボリックリンクを置きます。 例えばmkdir -p ~/.local/winbin echo 'export PATH="$PATH:$HOME/.local/winbin"' >> ~/.bashrc ln -s "/mnt/c/Users/salmon/AppData/Local/Programs/Microsoft VS Code/bin/code" ~/.local/winbin/codeとすれば ~/.local/winbin にパスを通してシンボリックリンクをそこに置くことができます。その他おすすめのツール等せっかくLinuxを入れたら入れるべきものはたくさんありますが、ぜひネットで探してみてください。私がおすすめするツールはこの辺です。Vim(Viとの違いは知らんけど設定しなくても色がつくので入れてる)Python3(さらっと書けるから入れてるやつ。シェルだけでは厳しいときに。python3 -c でワンライナーにも組み入れられる。pyenvで入れるべき?知らんがな)Git(言わずとしれたバージョン管理システム。そらいるよ)GitHub CLI(git clone git@github.com:USER/REPO.git って打つの面倒やん。gh repo clone [USER/]REPO で済むんですよ)fish(さっきも言ったけど)jq(CLIで動くJSONプロセッサ。パイプの途中でJSONデータを使いたいときとかcurlと組み合わせて使ったりとかすると便利かも)yq(CLIで動くYAMLプロセッサ。本当は入れてないシリーズその1)Rust,Cargo(Rustをしょっちゅう書くわけではないのだが、Rust製のコマンドラインツールは速いものが多い上、cargo install で一発インストールできて重宝している)pnpm(Node.jsのパッケージ管理ツールなのだが、これ自体がNode.jsのバージョン管理ツールも兼ねている。.node-version ファイルに対応したら本格的にnvmもfnmもいらなくなる)Docker(コンテナ仮想化プラットフォーム。Docker Desktop for Windowsを入れてるが別にコマンドしか叩かないのでLinuxスタンドアロンでいい気がする。GoogleがGoogle Kubernetes EngineなんてIaaSを出してるのでK8sことKubernetesもそのうち使いたい)Pandoc(ドキュメント変換ツール。本当は入れてないシリーズその2。Markdownで書いたテキストをLaTeXに変換したりできる) さあ、みんなもLinuxで楽しいシェルライフを楽しもうな。ke2daira で遊ぼうや参考文献[1] Qiita matarillo「WSL2とHyper-Vの関係」 https://qiita.com/matarillo/items/ca1eecf8f9a3cd76f9ce [2] Microsoft Docs「Set up a WSL development environment」https://docs.microsoft.com/en-us/windows/wsl/setup/environment [3] Wikipedia「Wikipedia:独自研究は載せない」https://ja.wikipedia.org/wiki/Wikipedia:独自研究は載せない [解説1] cat とヒアドキュメントを利用してファイルに書き込む小技はよくありますが、ファイルリダイレクションに関しては sudo で書き込み権限を与えることはできません。そのため、sudo cat ではなく sudo tee を用いてファイルに書き込みを行っています(tee は標準入力で受けたものを標準出力とファイルに吐き出すコマンド)。入力した内容はターミナルに残るので出力は /dev/null に飛ばして消しています。この方法はDebianでのgh のインストール等でも使われていました(入力はヒアドキュメントではなくパイプですが)。

> 内容を見る

ガジェット/ハードウェア Polygon
ガジェット/ハードウェア

Windows 11プリインストールPCをWindows 10に戻したい!

お久しぶりです.しげです.Windows 11が正式リリースされてから3ヶ月と少し経ちましたが,未だにWindows 11にはバグがたくさんあります.また,新しいUIが使いにくいと思われる方もいるのではないでしょうか.最近のPCはWindows 11で出荷されている2021年12月以降,Windows 11で出荷されるモデルも少しずつ増えてきました.しかし,Windows 10でPCを使いたい人たちには迷惑な話です.そこで,この記事ではWindows 11で出荷されたモデルをWindows 10に戻す方法を紹介します. くれぐれも自己責任でお願いします.この方法を実行したことにより生じた損害については一切責任を負いかねます. Windows 10に戻せる判断基準として,そのモデルにかつてWindows 10モデルがあったことが確認できるか,Intel 第11世代CoreまたはAMD Ryzen 5000番台以前を例として挙げておきます.Windows 11からWindows 10に戻そう!必要なものインターネット環境Google ChromeなどのWebブラウザWindows ISO DownloaderRufus8GB以上のUSBメモリ(中身が消えてもいいもの)4GB以上のUSBメモリ(ドライババックアップ用)Windows 10に戻したいPC(Windows 11プリインストール済み)1. Windows 11をセットアップするWindows 10に戻す作業を効率化するためにドライバのバックアップを取ります.そのために一度Windows 11をセットアップする必要があります. ただし,Windows 11 Homeではセットアップの過程でネットワーク接続とMicrosoftアカウントログインを強制されるので,次の記事を参考にネットワーク接続をかわしてください(かわすことができなくても今後の進行には影響しません).また,メーカーのプリインストールソフトウェアでWindows 10でも使いたいものがあれば名前をメモしておいてください(Microsoft Storeなどから再度ダウンロードできる可能性があります).参考:https://little-beans.net/howto/win11-setup/2. ドライバをバックアップするDouble Driverをダウンロードしてzipを解凍し,dd.exeを管理者として実行します. Backupをクリックし,Scan Current Systemでシステムのドライバをスキャンします. スキャン結果が表示されたら,Backup NowでStructured Folderでドライバのバックアップを作成します. なお,このドライバのバックアップは4GB以上のUSBメモリなどにコピーして,PC本体以外の場所に保管してください.PC本体にはWindows 10をクリーンインストールすることになるため,すべてのデータが削除されます.必要に応じて個人用データのバックアップもお忘れなく.3. Windows 10のインストールメディアを作成するここの項目は別記事でも紹介しているため,画像つきの説明はそっちを参照してください. まず,Windows ISO Downloaderを用いてWindows 10 Version 21H2 Home/Pro 日本語版 64bitのISOイメージをダウンロードします. 次にRufusを 用いて先程ダウンロードしたISOイメージをUSBメモリに書き込みます.ISOイメージを選択した後,パーティション構成をGPTに設定し,書き込みを行います. 以上でインストール前の下準備は完了です.4. Windows 10をクリーンインストールするBIOSにてSecureBootを無効化し,Windows 10のインストールメディアを起動します.自作PCにOSをインストールするときと同じ要領でインストールを進めていきます.エディションの選択画面が出る場合は,もともとインストールされていたWindows 11のエディションと同じものを選択してください.その後,プロダクトキーの入力が求められる場合,手元にキーがあれば入力し,ない場合はプロダクトキーがありませんを選択します.カスタムからすべてのパーティションを削除してWindows 10をクリーンインストールします.参考:https://pc-karuma.net/windows-10-clean-install/#Windows10のクリーンインストールWindows 10とWindows 11はプロダクトキーが同じなので,PCに内蔵のプロダクトキーで自動的に認証されるはずです.5. ドライバをインストールするインターネットに接続できない場合は,無線LANまたは有線LANのドライバのみインストールして,インターネットに接続できる状態にします(インストールはデバイスマネージャーより後述の方法で). その後,Windows Updateを実行します.Windows Updateの実行によりほとんどのドライバが自動的にインストールされるはずです. 一通りWindows Updateが終わったら,デバイスマネージャーを開いて,デバイスの動作状況を確認します(スタートボタンを右クリックしたときに表示されるメニューから開くことができます).   !がついていて動作していないデバイスがある場合は,右クリックしてドライバの更新を選択し,コンピュータを参照してドライバを検索を選びます.次の場所でドライバを検索しますのパスに,先程バックアップしたドライバが保存されているフォルダを指定します.  これにより,ドライバがインストールされるはずです. 6. メーカープリインストールソフトのインストールクリーンインストールを行ったため,メーカー出荷時にインストールされていたソフトウェアはインストールされていません.最近はMicrosoft Storeから入手できることもあるので必要に応じて入手してください. 以上でWindows 10に戻す作業は終了となります.お疲れさまでした. いつ,Windows 11にするべきなんでしょうか.

> 内容を見る

プログラミング Polygon
プログラミング

MacのChromeで学校用プロフィールのショートカットを作る

Chromeのプロフィール選択で、Windowsならデスクトップショートカットを作るボタンがあるんですけど、Macにはないので自作します。 時々プロフィール選べない問題 皆さんChromeで「前回開いていたページを開く」にしていますか?賛否あると思うんですが、基本的にはこれが一番便利だと思います。 もちろんこの場合、学校用プロフィールを作っておかないと事故ります。 つまり、「前回開いていたページを開く」人は、「起動時に(プロフィール選択を)表示する」にチェックを入れないとやばいです。 しかしですね、Macだけかもしれませんが、Chromeがプロフィール選択画面をすっ飛ばす謎の現象が多々発生するんですよ。 講義室で開く用のショートカットを作る ということで、「最初から学校用のプロフィールが開くショートカット」を作ります。 https://superuser.com/questions/377186/how-do-i-start-chrome-using-a-specified-user-profile Super UserのLinuxオタクによると、Application Supportにプロフィールがおいてあるらしいですよ。それで--profile-directory を付ければいいらしいです。 デフォルトの写真を確認$ qlmanage -p ~/Library/Application\ Support/Google/Chrome/Default/Google\ Profile\ Picture.pngまずDefault のプロフィール写真を見ましょう。ほとんどの場合、個人用Googleアカウントの写真が出るはずです。この写真が学校用だったら次の手順は飛ばしてください。 余談ですがqlmanageで立ち上がるプレビューは「プレビュー.app」ではないのでcontrol+Cで死にます。ちょっと確認したいときはこっちを使いましょう。(参考) $ PROFILE_NAME=$(ls ~/Library/Application\ Support/Google/Chrome | grep ^Profile | head -n 1) $ echo $PROFILE_NAME # Profile 1複数のプロフィールを作ると、Application SupportにProfile nというディレクトリができます。Default以外は学校用プロフィールしか作ってない場合、Profile 1 が学校用になるはずです。 $ cat <<EOT > ~/Desktop/学校用Chrome.sh #!/bin/bash open -b com.google.Chrome -n --args --profile-directory="$PROFILE_NAME" EOT $ chmod +x ~/Desktop/学校用Chrome.shスクリプトを作ります。エディタ宗教戦争に「エディタを使わない」という手段で抵抗。あとmacでしか使わないからbashでいいでしょ別に。 -b でappファイルの名前でなくバンドル識別子を使います。こっちのほうが確実。あと-n でアプリを無理やり増やします。これを付けないとすでに起動してるときに動作しない。(参考) はいこれで学校用ショートカットができました。 ターミナル.appの挙動について 「正常に終了したら閉じる」を選んどけば、勝手にexit; が入って閉じられるようです。 Raycast使った場合https://www.raycast.com/ MacならRaycast使いましょ Script Commandsという機能を使います。公式のリポジトリをクローンして、_enabled_commands に以下のスクリプトを入れて下さい。#!/bin/bash # Required parameters: # @raycast.schemaVersion 1 # @raycast.title 学校のメアド (Chrome) # @raycast.mode silent # Optional parameters: # @raycast.icon 🏫 # Documentation: # @raycast.author temasaguru /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --profile-directory="<さっき調べたプロファイルフォルダの名前>"Raycastを開いて、「学校のメアド (Chrome)」を選ぶだけで学校のプロファイルが起動します。かんたん!

> 内容を見る