<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>tomiy's blog</title><link>https://tomiylab.com/</link><description>Recent content on tomiy's blog</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Sat, 08 Aug 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://tomiylab.com/index.xml" rel="self" type="application/rss+xml"/><item><title>About</title><link>https://tomiylab.com/about/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0900</pubDate><guid>https://tomiylab.com/about/</guid><description>&lt;p&gt;低レイヤ好きなとある地方国立大の大学院生&lt;/p&gt;
&lt;h3&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href="https://github.com/tomiy-0x62"&gt;@tomiy_0x62&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;X: &lt;a href="https://https://x.com/tomiy_0x62"&gt;@tomiy_0x62&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>ニコニコ動画でコメントが表示されない問題 on 英語環境</title><link>https://tomiylab.com/2025/06/nicovideo-comment-problem/</link><pubDate>Sun, 01 Jun 2025 17:38:57 +0900</pubDate><guid>https://tomiylab.com/2025/06/nicovideo-comment-problem/</guid><description>&lt;p&gt;合成音声が好きでニコニコ動画を良く見るのですが、macやLinuxでほとんどの動画で何故かコメント(とタグ)が表示されないという問題が発生していました。(Windowsでは見れますし、iPhoneやiPadのSafariでは見れます。)&lt;/p&gt;
&lt;h2&gt;原因&lt;/h2&gt;
&lt;p&gt;ブラウザの言語設定が英語のみになっていた&lt;/p&gt;
&lt;p&gt;この件に関してニコニコに問い合わせた結果、「ニコニコの言語設定が英語もしくは日本語の場合、言語設定に合わせたコメントが表示される仕様となっております。」との回答をいただきました。 どうやら、ブラウザの言語設定によって自動でニコニコの言語設定が英語になる -&gt; 英語に合わせたコメントしか表示されなくなる(日本語のコメントが表示されなくなる)というのが原因だったみたいです。(2025/6/11追記)&lt;/p&gt;
&lt;h2&gt;解決策&lt;/h2&gt;
&lt;p&gt;ブラウザの言語設定に日本語を追加&lt;/p&gt;
&lt;p&gt;Safari: OSの言語設定と紐付いているみたいです。OSの言語設定を日本語にするしか無さそうです。&lt;/p&gt;
&lt;p&gt;Firefox: Settings -&amp;gt; General -&amp;gt; Language -&amp;gt; "Choose your preferred language for displaying pages"で日本語を追加してください。&lt;/p&gt;
&lt;p&gt;ブラウザの言語設定を変更しなくても&lt;a href="https://qa.nicovideo.jp/faq/show/516?category_id=384"&gt;https://qa.nicovideo.jp/faq/show/516?category_id=384&lt;/a&gt;に従ってニコニコの言語設定を日本語に変更すればコメント、タグが表示されるようになります。(2025/6/11追記)&lt;/p&gt;
&lt;h2&gt;原因調査&lt;/h2&gt;
&lt;p&gt;WindowsやiPhoneやiPadで見れて、mac, Linuxで見れないということは、UA(User-Agent)を見てサーバ側でコメントの送信をブロックしてるのでは?と思いmacのSafariのデベロッパーメニューからUAをiPadに変更してみました。すると、www.nicovideo.jpからsp.nicovideo.jpというモバイル版のページにリダイレクトされました。モバイル版ではコメントが見れました。しかし、WindowsのChromeやFirefoxに設定してもコメントが見れなかったのでUAは関係無さそうです。&lt;/p&gt;
&lt;p&gt;ごく一部の動画ではコメントが見えていました。たとえば、テトリス / 重音テトSV (柊マグネタイト)&lt;a href="https://www.nicovideo.jp/watch/sm44301514"&gt;https://www.nicovideo.jp/watch/sm44301514&lt;/a&gt; ではコメントが見えますが、カラフル / 宮舞モカ (柊マグネタイト)&lt;a href="https://www.nicovideo.jp/watch/sm44753979"&gt;https://www.nicovideo.jp/watch/sm44753979&lt;/a&gt; ではコメントが見えません。&lt;/p&gt;
&lt;p&gt;使用しているブラウザはmacでは、Safari, Firefox、LinuxではFirefoxでmacでは動作環境 (&lt;a href="https://qa.nicovideo.jp/faq/show/1112?"&gt;https://qa.nicovideo.jp/faq/show/1112&lt;/a&gt;)を満たしているはずです。&lt;/p&gt;
&lt;p&gt;まずはデベロッパーツールでどうやってコメントを表示しているのか調査してみます。&lt;/p&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://tomiylab.com/wp-content/uploads/2025/06/comment-canvas-1024x560.png" alt="" class="wp-image-632"/&gt;&lt;/figure&gt;
&lt;p&gt;どうやらcanvasってやつを動画にかぶせてるみたいです。Web?ってやつに関して素人なのでこのcanvasってやつをどうやって書きかえてるのか追跡できなかったので、ネットワークの方を調査してみます。&lt;/p&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://tomiylab.com/wp-content/uploads/2025/06/comment-json-1024x559.png" alt="" class="wp-image-633"/&gt;&lt;/figure&gt;
&lt;p&gt;コメントはPOSTってやつでJSONとして取得しているみたいです。このリクエストのCookiesは空でした。&lt;/p&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;img src="https://tomiylab.com/wp-content/uploads/2025/06/Screenshot-2025-06-01-at-16.47.10.png" alt="" class="wp-image-623"/&gt;&lt;/figure&gt;
&lt;p&gt;リクエストヘッダは↑でした。コメントが表示されるWindowsと比較してみます。&lt;/p&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://tomiylab.com/wp-content/uploads/2025/06/スクリーンショット-2025-06-01-165224-1024x327.png" alt="" class="wp-image-624"/&gt;&lt;/figure&gt;
&lt;p&gt;"Accept-Language"が怪しいです。Windowsの方には"ja"がありますが、macの方にはありません。&lt;/p&gt;
&lt;figure class="wp-block-gallery has-nested-images columns-default is-cropped"&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://tomiylab.com/wp-content/uploads/2025/06/Screenshot-2025-06-01-at-16.58.02.png" alt="" class="wp-image-625"/&gt;&lt;/figure&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://tomiylab.com/wp-content/uploads/2025/06/Screenshot-2025-06-01-at-16.58.11.png" alt="" class="wp-image-626"/&gt;&lt;/figure&gt;
&lt;/figure&gt;
&lt;p&gt;Firefoxの言語設定を確認したら日本語が無かったので追加してみました。すると、macのFirefoxでもコメントが見れるようになりました。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description></item><item><title>Ubuntu 22.04 LTSにアップデートしてみた</title><link>https://tomiylab.com/2022/10/upgrade-ubuntu/</link><pubDate>Tue, 25 Oct 2022 23:39:57 +0900</pubDate><guid>https://tomiylab.com/2022/10/upgrade-ubuntu/</guid><description>&lt;p&gt;Ubuntu 20.04LTSを使っていましたが、Neovimの新しいバージョンがどうしてもコンパイルできないので、アップグレードしました。そのときの、手順と発生したトラブルの解決方法をメモしときます。&lt;/p&gt;
&lt;h1&gt; アップグレード&lt;/h1&gt;
&lt;p&gt;アップデートですが、以下のコマンドでアップグレードできました。&lt;/p&gt;
&lt;pre&gt;&lt;code class="bash"&gt;$ sudo apt update
$ sudo apt upgrade
$ sudo apt full-upgrade
$ sudo apt autoremove -y
$ sudo apt autoclean -y
$ sudo reboot
$ sudo do-release-upgrade&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ディストリビューションをアップグレードするには、すべてのパッケージをアップグレードする必要があるみたいです。sudo apt upgradeでアップグレードできなかったパッケージがあったのでsudo apt full-upgradeで強制的にアップグレードしました。&lt;/p&gt;
&lt;h1&gt;GPUドライバの再インストール&lt;/h1&gt;
&lt;p&gt;アップグレードするど、NVIDIAのGPUドライバまわりがおかしくなって、マイクラでこれまで60FPS出てたのが、10FPSくらいしか出なくなったり、blenderが起動できなくなったので、ドライバを再インストールしました。&lt;/p&gt;
&lt;pre&gt;&lt;code class="bash"&gt;$ sudo apt remove nvidia-driver-*
$ sudo apt autoremove
$ sudo reboot&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;でアンインストールして再起動後、additional driversからnvidia-driver-515をインストールしました。nvidia-drivers-520-openを最初にインストールしたのですが、バグだらけだったので、nvidia-driver-515にしました。&lt;/p&gt;
&lt;h1&gt;Poetryが動かない&lt;/h1&gt;
&lt;p&gt;ディストロをアップグレードすると、poetryが動かなくなりました。&lt;/p&gt;
&lt;pre&gt;&lt;code class="bash"&gt;libssl.so.1.1: cannot open shared object file: No such file or directory&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;libssl.so.1.1がないと怒られます。https://kledgeb.blogspot.com/2021/10/ubuntu-2204-3-openssl-30.htmlによると、Ubuntu 22.04LTSでopenssl 1.1が排除されたみたいです。pythonがopenssl 1.1に依存しているのが原因なので、openssl 1.1が排除された環境でPython をビルドすれば解決します。pyenvでpythonをインストールしていたので、pyenv uninstallしてからpyenv installすると解決しました。&lt;/p&gt;</description></item><item><title>MacのTeXでヒラギノを埋め込もうとしたらエラー吐いた</title><link>https://tomiylab.com/2022/08/mac-tex-hiragino/</link><pubDate>Thu, 11 Aug 2022 21:16:50 +0900</pubDate><guid>https://tomiylab.com/2022/08/mac-tex-hiragino/</guid><description>&lt;meta charset="UTF-8"&gt;&lt;meta name="viewport" content="width=device-width initial-scale=1"&gt;
&lt;title&gt;hiragino_tex&lt;/title&gt;
&lt;p&gt;macをクリーンインストールしたので、&lt;a href="https://gihyo.jp/book/2020/978-4-297-11712-2" target="_blank" class="url" rel="noopener"&gt;［改訂第8版］LaTeX2ε美文書作成入門&lt;/a&gt;付属のDVDからTeX Linveをインストールして&lt;a href="https://github.com/munepi/bibunsho7-patch/" target="_blank" class="url" rel="noopener"&gt;&lt;a href="https://github.com/munepi/bibunsho7-patch/"&gt;https://github.com/munepi/bibunsho7-patch/&lt;/a&gt;&lt;/a&gt;のパッチを当てたらエラーを吐いたので解決方法をメモしておきます。
環境は macOS Monterey version 12.5, TeX Live 2020 です
参考: &lt;a href="https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2056" target="_blank" class="url" rel="noopener"&gt;&lt;a href="https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2056"&gt;https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=2056&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TeXファイルをコンパイルしようとすると、こんなエラーを吐きました&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dvipdfmx:warning: &amp;gt;&amp;gt; This font is mapped to a physical font " HiraginoSerif.ttc".
dvipdfmx:warning: &amp;gt;&amp;gt; Please check if kpathsea library can find this font: HiraginoSerif.ttc
dvipdfmx:fatal: Cannot proceed without .vf or "physical" font for PDF output...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;別のMacで&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;kpsewhich -progname=dvipdfmx -format=.ttc HiraginoSerif.ttc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;を実行すると、/Users/Shared/TeXLive/texmf/fonts/opentype/cjk-gs-integrate/にHiraginoSerif.ttcのシンボリックリンクを貼るといいことがわかったので、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ln -s /System/Library/Fonts/HiraginoSerif.ttc /Users/Shared/TeXLive/texmf/fonts/opentype/cjk-gs-integrate/HiraginoSerif.ttc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ついでにヒラギノ角ゴシックのシンボリックリンクも貼れてなかったみたいなので、それも貼っておきます。&lt;/p&gt;</description></item><item><title>mikanOSのデバッグの話</title><link>https://tomiylab.com/2021/12/debug-mikanos/</link><pubDate>Tue, 07 Dec 2021 23:12:00 +0900</pubDate><guid>https://tomiylab.com/2021/12/debug-mikanos/</guid><description>&lt;meta charset="utf-8"&gt;
&lt;title&gt;mikanosのデバッグの話&lt;/title&gt;
&lt;h2&gt;mikanOSのデバッグの話&lt;/h2&gt;
この記事は &lt;a href="https://adventar.org/calendars/6581"&gt;自作OS Advent Calendar 2021&lt;/a&gt;の「1桁の最大の素数」日目の記事として作成されました。
&lt;h3 id="whoami"&gt;whoami&lt;/h3&gt;
サイボウズ・ラボユース第11期生のtomiyです。
ラボユースの活動として内田公太さんご指導のもとmikanOSをいじっています。
その過程で得られたqemu上で動作する自作OSのカーネルやアプリをデバッグする方法等について僕がやらかした話も交えながら書きたいと思います。
この記事ではプロンプトは
&lt;pre&gt;&lt;code class="bash"&gt;&lt;/code&gt;# ターミナル
$ hoge
# gdbのシェル
(gdb) hoge
# qemuモニター
(qemu) hoge&lt;/pre&gt;
のように表記します。
&lt;h3&gt;デバッグのための準備&lt;/h3&gt;
最初にデバッグ対象の最適レベルをを-Ogにしましょう。 カーネルのデバッグであればmikanos/kernel/MakefileのCFLAGSとCXXFLAGSの-O2を -Ogにすればいいです。 もし最適レベルをを-Ogにすると問題が再現しなくなるならもとに戻すべきですが、 デバッグ時は最適化レベルを落としましょう。 最適化レベルが高いとソースコードとアセンブリ言語の対応関係がわかりにくかったり、 変数が見えなくなったりしてデバッグしづらくなります。
tmuxでターミナルを分割して左にqemu右にgdbというのが気に入っています。 これだとすぐにmikanOSを再起動できますし、bashのコマンドが使いたくなったら 右のペインを上下に分割してそこからbashのコマンドが使えます。 ウィンドウを何枚も開いてマウスでウィンドウ間を移動するのは面倒ですよね。
デバッガーはgdbを使用します。
mikanOSはClangでコンパイルされているのでlldbを使うべきかも知れませんが、
Clangをqemuに接続する方法がわからなかったのでgdbを使うことにしました。
gdbをqumuに接続する方法についてはこちらの記事を参照して下さい。
https://tomiylab.com/2021/09/gdb-mikanos/
↑ではgdbを起動するたびにqemuに接続するコマンドを打って、毎回同じ箇所にブレークポイントを貼ったり、逆アセンブル結果の表示設定やfileコマンででのkernel.elfの読み込みを手動で行なってますが、面倒なため自動化します。
gdbには起動時に-xオプションでファイルからgdbのコマンドを読み込んで実行する機能があるのでこれを利用します。
mikanosディレクトリに適当な名前のファイル(僕はgdb_initにしました)を作成してそこにコマンドを書き込みます。
先頭が#で始まる行はコメントです。行の途中に#を入れても、それ以降がコメントと解釈されないので注意してください。
&lt;pre&gt;&lt;code class="bash"&gt;# qemuに接続
target remote localhost:1234
file ./kernel/kernel.elf
# 逆アセンブル結果をintel形式に
set disassembly-flavor intel
# ブレークするごとに逆アセンブル結果を表示
disp/3i $pc&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;gdbのpコマンドxコマンドについて&lt;/h3&gt;
pコマンド: printの略 変数の値、数値や文字を表示
使用例: 数値を16進数に変換
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) p/x 307200&lt;/code&gt;&lt;/pre&gt;
使用例: 変数の表示
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) p hoge&lt;/code&gt;&lt;/pre&gt;
使用例: rspレジスタの値を表示
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) p $rsp&lt;/code&gt;&lt;/pre&gt;
レジスタ名の前には$をつける。
xコマンド: メモリダンプの表示
使用例: 0x10000から8Byte * 10だけ16進数としてダンプ
&lt;pre&gt;&lt;code class="bash"&gt;(gdb)x/10gx 0x10000&lt;/code&gt;&lt;/pre&gt;
pコマンドの出力フォーマットはhttps://flex.phys.tohoku.ac.jp/texi/gdb-j/gdb-j_40.html を参照
xコマンドの出力フォーマットはhttps://flex.phys.tohoku.ac.jp/texi/gdb-j/gdb-j_41.html を参照
pコマンドやxコマンドの引数にはC言語でいう式が入る
つまり四則演算できる
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) p/x 307200 + 0x10 
(gdb) x/3gx 0x8000000 + 0x1d8&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;間接参照演算子*について&lt;/h3&gt;
gdbのコマンドではC言語のように間接参照演算子*がつかえる。たとえば
&lt;pre&gt;&lt;code class="c"&gt;int hoge = 5;
int *phoge = &amp;amp;hoge;&lt;/code&gt;&lt;/pre&gt;
があったとき
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) p hoge
0x8000031
(gdb) p *hoge
5&lt;/code&gt;&lt;/pre&gt;
のようになる。 また、
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) p *0x8000031
5&lt;/code&gt;&lt;/pre&gt;
のようにも書ける。
&lt;h3&gt;僕がよく使うgdbコマンド&lt;/h3&gt;
バックトレースの表示
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) bt&lt;/code&gt;&lt;/pre&gt;
フレームの指定(フレーム番号は↑で確認)
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) frame 2&lt;/code&gt;&lt;/pre&gt;
現在のフレームのローカル変数を確認
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) info locals&lt;/code&gt;&lt;/pre&gt;
現在停止している周辺のソースコードを表示
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) list&lt;/code&gt;&lt;/pre&gt;
ブレークポイント一覧を表示
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) info breakpoints&lt;/code&gt;&lt;/pre&gt;
ブレークポイント削除(ブレークポイント番号は↑で確認)
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) delete 3&lt;/code&gt;&lt;/pre&gt;
qemuモニターのコマンドだけど、レジスタの値を確認
&lt;pre&gt;&lt;code class="bash"&gt;(qemu) info registers&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;16進数計算のテクニック？&lt;/h3&gt;
自明なので証明は省略するがn進数の数においてn^mを{かける|割る}とき、 m桁だけ{左|右}にシフトすれば良い。
例えばn = 10, m = 5のとき42に10^5をかけると4200000となる。
これを使用すると計算が桁をシフトするだけですむ。
１ページ4KiB=4 * 2^10 Bのときページ数からアドレスの大きさ？に直したり、アドレスの大きさ？からページ数に直したりするとき、
16進数に4 * 2^10=4096を掛けたり割ったりする機会は多い。
4 * 2^10 = 2^12 = 16^3なので16進数に4096を{かける|割る}とき、
3桁だけ{左|右}にシフトすれば良い。
ついでに２進数に4096を{かける|割る}とき、12桁だけ{左|右}にシフトすれば良い。
&lt;h3&gt;逆アセンブル&lt;/h3&gt;
&lt;pre&gt;&lt;code class="bash"&gt;$ objdump -C -M intel -d kernel.elf &amp;gt; kernel.dis&lt;/code&gt;&lt;/pre&gt;
逆アセンブルを行うにはobjdumpコマンドを使用します。詳しい仕様については
&lt;pre&gt;&lt;code class="bash"&gt;$ man objdump&lt;/code&gt;&lt;/pre&gt;
で調べて下さい。
ここでのオプションの意味は-Cがオブジェクト名をデマングル-M itelがアセンブラの形式をintel形式に-dが逆アセンブル(disasemmble)です。結果は標準出力に出力されるのでファイルにリダイレクトします。
結果をファイルに保存すると10MBを超えることがあるので注意して下さい。
LinuxのVSCodeではサイズがデカすぎて開けないのでVimで開きましょう。
Linuxコマンドに慣れている方はファイルに保存しなくても
&lt;pre&gt;&lt;code class="bash"&gt;$ objdump -C -M intel -d kernel.elf | less&lt;/code&gt;&lt;/pre&gt;
で十分かも知れません。
&lt;h3&gt;CPU例外のデバッグ&lt;/h3&gt;
ページフォルト(PF)や一般保護例外(GP)等のCPU例外のデバッグは例外ハンドラーにブレークポイントを設置するのが有効です。
しかし、gdbで
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) b IntHandlerPF&lt;/code&gt;&lt;/pre&gt;
のようにブレークポイントを設置するとgdbが気を使って例外ハンドラーの開始より少し後ろにブレークポイントが貼られてしまいます。関数呼び出し直後には
&lt;pre&gt;&lt;code class="x86asm"&gt;push rax
push rbp
mov rbp,rsp
push rax&lt;/code&gt;&lt;/pre&gt;
のような処理を行うのでこの処理の後にブレークポイントが貼られます。
しかし、これでは困ります。
&lt;pre&gt;&lt;code class="bash"&gt;$ nm -C kernel.elf | grep IntHandlerPF&lt;/code&gt;&lt;/pre&gt;
で例外ハンドラのアドレスを調べて
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) b *0x134420&lt;/code&gt;&lt;/pre&gt;
のようにしてもいいですが、カーネルに変更を加えるとこのアドレスがずれてしまうことがあります。
例外ハンドラにブレークポイントを貼っておくとデバッグに便利なので常にブレークポイントを貼っておきたいですが、
gdb_initにアドレスを書き込むとアドレスがずれてしまったときにブレークポイントが正しく貼れなくなってしまいます。
そこでシェルスクリプトを使ってgdb_initを動的に生成することで解決できました。
&lt;pre&gt;&lt;code class="bash"&gt;rm -rf ./gdb_init
echo “# qemuに接続
target remote localhost:1234
file ./kernel/kernel.elf
# 逆アセンブル結果をintel形式に
set disassembly-flavor intel
# ブレークするごとに逆アセンブル結果を表示
disp/3i $pc ”&amp;gt;&amp;gt; ./gdb_init
echo “# IntHandlerPF” &amp;gt;&amp;gt; ./gdb_init
nm -C ./kernel/kernel.elf | grep IntHandlerPF | awk ’{printf “b *0x%s”, $1}’ &amp;gt;&amp;gt; ./gdb_init 
echo “” &amp;gt;&amp;gt; ./gdb_init
echo “# IntHandlerGP” &amp;gt;&amp;gt; ./gdb_init
nm -C ./kernel/kernel.elf | grep IntHandlerGP | awk ’{printf “b *0x%s”, $1}’ &amp;gt;&amp;gt; ./gdb_init 
echo “” &amp;gt;&amp;gt; ./gdb_init
echo “# IntHandlerUD” &amp;gt;&amp;gt; ./gdb_init
nm -C ./kernel/kernel.elf | grep IntHandlerUD | awk ’{printf “b *0x%s”, $1}’ &amp;gt;&amp;gt; ./gdb_init 
echo “” &amp;gt;&amp;gt; ./gdb_init
echo “# IntHandlerBP” &amp;gt;&amp;gt; ./gdb_init
nm -C ./kernel/kernel.elf | grep IntHandlerBP | awk ’{printf “b *0x%s”, $1}’ &amp;gt;&amp;gt; ./gdb_init 
echo “” &amp;gt;&amp;gt; ./gdb_init
gdb -x gdb_init&lt;/code&gt;&lt;/pre&gt;
これで常に例外ハンドラーにブレークポイントを貼れるようになりました。 CPU例外のデバッグ準備完了です。
qemuを起動した状態で
&lt;pre&gt;&lt;code class="bash"&gt;$ ./gdb.sh&lt;/code&gt;&lt;/pre&gt;
でgdbをqemuに接続してカーネルの読み込み、ブレークポイントの設置まで自動でやってくれます。
PFの具体的なデバッグ方法を紹介します。
例外ハンドラは特殊な関数なのでバックトレースが使えません。
例外ハンドラでブレークしたらまずすることはスタックの確認です。
スタックを確認するには
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) x/6gx $rsp&lt;/code&gt;&lt;/pre&gt;
です。
rspレジスタの指すアドレスから6領域をジャイアント(8byte)単位*6で16進数でダンプしています。
これが何を意味しているのかはIntel SDM Vol.3 6.14 のFigure 6-9右側をみればわかります。
Intel SDMはOS自作erのバイブルなので必ずダウンロードしておきましょう！
実際の事例を紹介します。 アプリケーション実行中にページフォルトが起きてIntHandlerPFでブレークしました。
そこでスタックを確認すると
&lt;pre&gt;&lt;code class="bash"&gt;&lt;/code&gt;(gdb) x/6gx $rsp
0x8fd0: 0x0000000000000005 0x000000000004b765
0x8fe0: 0x0000000000000023 0x0000000000000246
0x8ff0: 0xffffffffffffeed8 0x000000000000001b&lt;/pre&gt;
となりました。
Intel SDM Vol.3 6.14 のFigure 6-9右側をみると
Error Code: 0x5
RIP: 0x4b765
CS: 0x23
RFLAGS: 0x246
RSP: 0xffffffffffffeed8
SS: 0x1bとなります。
ここでエラーコードの意味を調べてみましょう。
PFのエラーコードの意味はIntel SDM Vol.3 6.15 のFigure 6-11にあります。
0x5を2進数になおすとb101なので
エラーコード: 0x5
bit0:1 ページは存在してる
bit1:0 読み込みでPFが発生
bit2:1 ユーザーモードで発生
と解釈できます。アプリケーション実行中にPFが発生したので 確かにユーザーモードで発生したのであっていそうです。
これだけでは原因がわからないのでつぎは スタックにあるRIPを確認します。
あれ？アプリが0x4b765なんてアドレスに配置されてるわけないのにおかしいな。
とりあえず、0x4b765をダンプ
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) x/6gx 0x4b765
0x4b765: 0x0000000000000000 0x0000000000000000
0x4b775: 0x0000000000000000 0x0000000000000000
0x4b785: 0x0000000000000000 0x0000000000000000&lt;/code&gt;&lt;/pre&gt;
おかしい。
これならRIPが0x4b765になった時点でPFじゃなくてUDがおきるはず！
つまり、例外ハンドラーが呼ばれたときにメモリが壊れた。
ここから推測できるのは、
アプリ側で本来飛ぶべきじゃない場所に飛んでしまってる(RIPがありえない値だから)
その飛んだ先がたまたま機械語命令として解釈できた(UDじゃないから)
その機械語命令がカーネルモードじゃないと読めない領域を読もうとしてPF
とりあえず、アプリ呼び出し直前あたりでブレークして0x4b765をダンプしました。
記録が残ってなかったので以下は似た状況を再現したものです。
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) x/6gx 0x4b765
0x4b765: 0x0000000000012005 0x0000000000013005
0x4b775: 0x0000000000014005 0x0000000000015005
0x4b785: 0x0000000000016005 0x0000000000017005&lt;/code&gt;&lt;/pre&gt;
どうやらページテーブルっぽいです。
このとき僕はこの場所に飛んでしまう原因を調べるためにアプリをステップ実行しました。
この方法ではとんでもなく時間がかかりますが、このとき動かしていたアプリはhelloで、PFが起きるのがhelloが表示される前だったため
アプリ起動直後に異常がある可能性が高いと考えていました。なのでこの方法でもそんなに手間はかからないと考えてこの方法を使いました。
そしてこの場所にcll or jmpするす場所を特定できました。
これが使えない場合であれば、後で説明するint3命令をアプリに何箇所か入れてBP例外(ブレークポイント例外)を発生させ問題箇所を大まかに特定してからステップ実行したと思います。
0x4b765をcallしていた箇所は
&lt;pre&gt;&lt;code class="x86asm"&gt;call QWORD PTR [rbx+0x10]&lt;/code&gt;&lt;/pre&gt;
でrbx+0x10は0x80001d8でした。
0x80001d8はelfファイルから読み込んだものが置かれていた領域です。
ダンプしてみると
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) x/6gx 0x80001d8
0x80001d8: 0x000000000004b765 0x000000000004c0c5
0x80001e8: 0x0000000000000025 0x000000000004d775
0x80001f8: 0x000000000004e0cd 0x0000000000000025&lt;/code&gt;&lt;/pre&gt;
でした。
アプリを逆アセンブルしてみると、0x80001d8は本来0x8078760が書かれているはずだとわかりました。
0x4b765,0x4c0c5,0x4d775という増え方はページテーブルのエントリーっぽいです。
つまりPFの原因はelfファイルが読み込まれた領域にOSがページテーブルのエントリーを書き込んでしまってメモリ破壊が起きたことだと推測されます。
ここで0x80001d8に0x4b765を書き込んだ犯人を特定してこれが正しいのか検証してみましょう。
これにはwatchポイントを使用します。
&lt;h3&gt;watchポイント&lt;/h3&gt;
watchポイントは変数や指定したメモリ領域に読み込み/書き込みがあったときにブレークする機能です。 メモリ破壊が起こっている可能性があるときにメモリを破壊している犯人を探すのに役に立ちます。
最初にelfファイルをメモリに読み込んだ直後でブレークしてその後0x80001d8 にwatchポイントを仕込みます。
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) watch ＊0x80001d8&lt;/code&gt;&lt;/pre&gt;
すると
&lt;pre&gt;&lt;code class="bash"&gt;Old value = 134711136
New value = 309093
PageMapEntry::SetPointer (this=0x80001d8, p=0x4b000) at ./paging.hpp:89
89 }
1: x/3i $pc
=&amp;gt; 0x136564 &lt;pagemapentry::setpointer(pagemapentry*)+36&gt;: pop rbp
 0x136565 &lt;pagemapentry::setpointer(pagemapentry*)+37&gt;: ret 
 0x136566: int3
(gdb) p/x 134711136
$1 = 0x8078760
(gdb) p/x 309093
$2 = 4b765&lt;/pagemapentry::setpointer(pagemapentry*)+37&gt;&lt;/pagemapentry::setpointer(pagemapentry*)+36&gt;&lt;/code&gt;&lt;/pre&gt;
pop rbpはメモリに値を書き込んでいないのでおかしい？
watchポイントはメモリ値を書き込んだ次の命令でブレークするからlistコマンドで 周辺のソースコードを表示すればok
これで0x80001d8に0x4b765を書き込んだ犯人が特定できました。
たしかにページングのページエントリーを書き込む命令でした。
ちなみに、なぜelfファイルを読み込んだ領域にページングのページエントリーを書き込まれるのかは原因がわかっていないです。
現在調査中です。
&lt;h3&gt;asm(“int3”)&lt;/h3&gt;
ブレークポイント例外を発生させるCPU命令がint3です。 C言語やC++からインラインアセンブラで呼び出せます。
&lt;h3&gt;while(1) asm(“hlt”)&lt;/h3&gt;
例外ハンドラの設定前でasm(“int3”)が使えない、コンソールの描画も終わってなくてputString()も使えない状況でデバッグに使えるのがwhile(1) asm(“hlt”)です。
hlt命令はカーネルモードでしか使えないので、アプリの動作中にシステムコールでカーネルモードに移っているときか、カーネル内でしか使えません。
hlt命令はCPUの動作を停止させるCPU命令ですが、割り込み等によって停止状態が解除されてしまいます。
そのため、割り込みが入ってもそのタスクが停止し続けるためには無限ループの中に入れる必要があります。
&lt;h3&gt;階層ページング構造を辿る&lt;/h3&gt;
ページの設定を確認したい場合や仮想アドレスが どの物理アドレスに割り当てられているか調べたい場合等に階層ページング構造を確認したい場面があります。
4階層ページングについてはみかん本19.4を参照してください。
階層ページング構造を調べる方法
１. qemu monitorでinfo tlb
&lt;pre&gt;&lt;code class="bash"&gt;(qemu) info tlb&lt;/code&gt;&lt;/pre&gt;
2. CR3からたどる
&lt;pre&gt;&lt;code class="bash"&gt;(qemu) info registers
CR3=hoge
(qemu) x/4gx hoge
…&lt;/code&gt;&lt;/pre&gt;
1. はqemu上だからlessコマンドがつかえなくて辛く
件数が多くなりすぎて目的のアドレスを探し出すのが困難なので2.を使います。
&lt;p&gt;仮想アドレスから各階層の配列の添字を調べるにはosdev.jpのツールが便利です。
&lt;a href="https://osdev.jp/tools/x86_64_vaddr_composer.html"&gt;https://osdev.jp/tools/x86_64_vaddr_composer.html&lt;/a&gt;
ここでは0x8000000がどの物理アドレスに割り当てられているかと、ページの設定を確認してみます。
0x8000000を分解すると
PML4 0x000=0
PDP 0x000=0
PD 0x040=64
PT 0x000=0
Offset 0x000=0
となります。
CR3を調べてPML4の先頭アドレスを調べます。&lt;/p&gt;</description></item><item><title>qemu上のmikanOSをgdbでデバッグする方法</title><link>https://tomiylab.com/2021/09/gdb-mikanos/</link><pubDate>Wed, 22 Sep 2021 15:56:44 +0900</pubDate><guid>https://tomiylab.com/2021/09/gdb-mikanos/</guid><description>&lt;p&gt;qemu上のmikanOSにgdbを接続してデバッグする方法を備忘録として残しておきます&lt;/p&gt;
&lt;h2&gt;qemu上のmikanOSをgdbでデバッグする方法&lt;/h2&gt;
&lt;h3&gt;gdbをqemuに接続&lt;/h3&gt;
gdbを接続するためにqemuの起動オプションに-s -Sをつけます。
-sは-gdb tcp::1234の意味は意味です。
-Sはデバッガからコマンドを受け取るまでCPUを起動させないオプションです。
mikanos/build.shからmikanOSを起動している場合osbook/devenv/run_image.shでqemuを
起動しているのでrun_image.shを編集してください。
&lt;p&gt;mikanOSを起動したらgdbを起動してqemuに接続します。
以下シェルのプロンプトを&amp;rsquo;$&amp;rsquo;、gdbのプロンプトを&amp;rsquo;(gdb)&amp;lsquo;として表示します。&lt;/p&gt;
&lt;pre&gt;&lt;code class="bash"&gt;$ gdb
(gdb) target remote localhost:1234&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;gdbの表示設定&lt;/h3&gt;
逆アセンブル結果をintel形式に設定
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) set disassembly-flavor intel&lt;/code&gt;&lt;/pre&gt;
ブレークするごとにその後の5命令を表示するように設定
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) disp/5i $pc&lt;/code&gt;&lt;/pre&gt;
ブレークするごとにフラグレジスタの値を表紙するよに設定
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) disp $eflags&lt;/code&gt;&lt;/pre&gt;
その他目的に応じてお好みの表示設定をしてください
&lt;h3&gt;ブレークポイントの設置&lt;/h3&gt;
まず、ブレークポイントを関数名、シンボル名で設置できるようにkernel.elfをgdbに読み込みます。
アプリのデバッグをしたい場合はkernel.elfではなくそのアプリのelfファイルを読み込みます。
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) file /path/to/kernel.elf&lt;/code&gt;&lt;/pre&gt;
以下のように聞かれるのでyと入力してください。
&lt;pre&gt;&lt;code class="bash"&gt;A program is beging debagged already.
Are you sure you want to change the file? (y or n)&lt;/code&gt;&lt;/pre&gt;
ブレークポイントを設置するのは'b'コマンドです。
hogeにはシンボル名や関数名を入れます。
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) b hoge&lt;/code&gt;&lt;/pre&gt;
アドレスを直接指定してブレークポイントを設置する場合は以下のようにします。
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) b *0x88888&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;デバッグ&lt;/h3&gt;
ブレークポイントを設置したらqemuを動かします。
&lt;pre&gt;&lt;code class="bash"&gt;(gdb) c&lt;/code&gt;&lt;/pre&gt;
cはcontinueの短縮形です。次のブレークポイントまでqemuを動かします。
&lt;p&gt;ステップ実行したい場合はsiコマンドを実行します。&lt;/p&gt;</description></item><item><title>Windowsでキーバインドを変更する</title><link>https://tomiylab.com/2021/03/change-key/</link><pubDate>Mon, 22 Mar 2021 11:02:00 +0900</pubDate><guid>https://tomiylab.com/2021/03/change-key/</guid><description>&lt;p&gt;US配列のMacBook Pro でBootcampを使ってWindowsを使っています。
しかし、Macとのキーボードショートカットの違いと、キー配列の違いからとても使いにくいです。
なのでキーバインドを変更してMacに使用感を近づけようと思います。&lt;/p&gt;
&lt;h2&gt;キーバインドの変更&lt;/h2&gt;
Windowsのキーバインドを変更する方法はいろいろありますが、ここでは、ソフトを常駐させる必要がなく動作が重くならないので、レジストリを変更する方法を使います。
直接レジストリエディタをいじらず、KeySwapを使うと楽です。
&lt;h3&gt;KeySwap&lt;/h3&gt;
&lt;a href="https://www.vector.co.jp/soft/winnt/util/se228667.html"&gt;https://www.vector.co.jp/soft/winnt/util/se228667.html&lt;/a&gt;からダウンロードできます。
Windows7・Vista・XP・2000専用とありますが、Windows10でもちゃんと動作しました。
適当な場所に展開したら、KeySwap.exeを右クリックして、管理者として実行してください。
レジストリを書き換えるので管理者として実行する必要があります。
&lt;img class="alignnone size-full wp-image-480" src="https://tomiylab.com/wp-content/uploads/2021/03/key.png" alt="" width="873" height="360"&gt;
キーボードのレイアウトをお使いのキーボードに合わせたら、あとは設定するだけです。
&lt;img class="alignnone size-full wp-image-484" src="https://tomiylab.com/wp-content/uploads/2021/03/key_3.png" alt="" width="781" height="572"&gt;
設定が終わったらファイルに保存して、
&lt;img class="alignnone size-full wp-image-485" src="https://tomiylab.com/wp-content/uploads/2021/03/key_4.png" alt="" width="781" height="574"&gt;
終了します。
&lt;img class="alignnone size-full wp-image-483" src="https://tomiylab.com/wp-content/uploads/2021/03/key_2.png" alt="" width="780" height="574"&gt;
終了後OSを再起動すると変更が反映されているはずです。
&lt;h2&gt;参考にしたもの&lt;/h2&gt;
・&lt;a href="http://pasokatu.com/8460"&gt;http://pasokatu.com/8460&lt;/a&gt;</description></item><item><title>Windows上にTensorflow-gpu 2.2.* をインストール</title><link>https://tomiylab.com/2021/03/win-tensorflow-gpu/</link><pubDate>Sun, 21 Mar 2021 18:34:00 +0900</pubDate><guid>https://tomiylab.com/2021/03/win-tensorflow-gpu/</guid><description>&lt;p&gt;NVIDIAのGeForce搭載のWindows上にTensorflow-gpuの環境を構築する方法をメモ&lt;/p&gt;
&lt;h2&gt;CUDA周りをインストール&lt;/h2&gt;
最初にドライバを最新版にアップデートしておいてください。
ドライバは&lt;a href="https://www.nvidia.co.jp/Download/index.aspx?lang=jp"&gt;https://www.nvidia.co.jp/Download/index.aspx?lang=jp&lt;/a&gt;からダウンロードできます。
次にCUDAをインストールします。
今回はTensorflow-gpu 2.2.* をインストールするのでCUDA 10.1をインストールします。
&lt;figure class="wp-caption"&gt;&lt;img class="size-full wp-image-432" src="https://tomiylab.com/wp-content/uploads/2021/03/gpu.png" alt="" width="904" height="869"&gt;&lt;figcaption&gt;&lt;a href="https://www.tensorflow.org/install/source_windows?hl=ja"&gt;https://www.tensorflow.org/install/source_windows?hl=ja&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;CUDAのバージョンは重要なので上の表に必ず合わせてください。
&lt;a href="https://developer.nvidia.com/cuda-10.1-download-archive-base"&gt;&lt;a href="https://developer.nvidia.com/cuda-10.1-download-archive-base"&gt;https://developer.nvidia.com/cuda-10.1-download-archive-base&lt;/a&gt;&lt;/a&gt;からインストーラをダウンロードしてインストールしてください。
&lt;img class="alignnone size-full wp-image-435" src="https://tomiylab.com/wp-content/uploads/2021/03/cudo10_1.png" alt="" width="1343" height="799"&gt;
インストール時の質問はすべてデフォルトのままで問題ありません。
PowerShellかコマンドプロンプトで&lt;/p&gt;
&lt;pre&gt;&lt;code class="bash"&gt;nvcc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;を実行して&lt;/p&gt;
&lt;pre&gt;&lt;code class="bash"&gt;nvcc fatal : No input files specified; use option --help for more information&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;と表示されることを確認してください。
次にcuDNNのインストールです。
cuDNNは上の表から7.6をインストールします。
&lt;a href="https://developer.nvidia.com/cudnn"&gt;&lt;a href="https://developer.nvidia.com/cudnn"&gt;https://developer.nvidia.com/cudnn&lt;/a&gt;&lt;/a&gt;にアクセスして&amp;quot;Download cuDNN&amp;quot;をクリックしてください。
ここで、NVIDIA Developer Program Membershipが必要になります。
まだ登録していない方は&amp;quot;Join now&amp;quot;からアカウントを作成してください。
ログインしたらチェックボックスにチェックを入れて&amp;quot;Archived cuDNN Releases &amp;ldquo;をクリック、
&lt;img class="alignnone size-full wp-image-443" src="https://tomiylab.com/wp-content/uploads/2021/03/nvidia.png" alt="" width="1430" height="422"&gt;
cuDNN v7.6.* for CUDA 10.1　をダウンロードしてください。&lt;img class="alignnone wp-image-445 size-full" src="https://tomiylab.com/wp-content/uploads/2021/03/cudnn-e1616322737712.png" alt="" width="1077" height="350"&gt;
zipを展開したら、cudaの中身をどこか好きな場所においてください。
&lt;img class="alignnone size-full wp-image-471" src="https://tomiylab.com/wp-content/uploads/2021/03/cudnn_2.png" alt="" width="905" height="382"&gt;
僕はCドライブの直下にcuDNNフォルダを作ってC:\cuDNNに入れました。
&lt;img class="alignnone size-full wp-image-472" src="https://tomiylab.com/wp-content/uploads/2021/03/cudnn_3.png" alt="" width="885" height="363"&gt;
どこにおいてもいいですがあまり深いところには置かないでください。
次にPathを通します。
Win + R で&amp;quot;ファイル名を指定して実行&amp;quot;を起動し、&amp;ldquo;sysdm.cpl&amp;quot;と入力、詳細設定タブの環境変数をクリックしてください。
&lt;img class="alignnone size-full wp-image-411" src="https://tomiylab.com/wp-content/uploads/2021/03/env_var.png" alt="" width="411" height="467"&gt;
システム環境変数のPathを開いて以下を追加します。&lt;/p&gt;</description></item><item><title>Windows上にpyenv+poetryでPython環境を構築</title><link>https://tomiylab.com/2021/03/win-python/</link><pubDate>Sun, 21 Mar 2021 18:04:35 +0900</pubDate><guid>https://tomiylab.com/2021/03/win-python/</guid><description>&lt;p&gt;Anacondaはけしからんといううわさを聞いたので、pyenv+poetryでWindows上にPython環境を構築します。&lt;/p&gt;
&lt;h2&gt;Pyenvのインストール&lt;/h2&gt;
&lt;h3&gt;ダウンロード&lt;/h3&gt;
本家のPyenv(&lt;a href="https://github.com/pyenv/pyenv"&gt;https://github.com/pyenv/pyenv&lt;/a&gt;)はWindows上では動かないので、
pyenv-win(&lt;a href="https://github.com/pyenv-win/pyenv-win"&gt;https://github.com/pyenv-win/pyenv-win&lt;/a&gt;)を使います。
まず、&lt;a href="https://github.com/pyenv-win/pyenv-win"&gt;https://github.com/pyenv-win/pyenv-win&lt;/a&gt;のmasterブランチを以下のコマンドでgit cloneするか、zipでダウンロードして、%USERPROFILE%に展開、.pyenv_winにファイル名を変更してください。
&lt;pre&gt;&lt;code class="bash"&gt;git clone https://github.com/pyenv-win/pyenv-win.git ~/.pyenv_win&lt;/code&gt;&lt;/pre&gt;
画像のようになっているはずです。
&lt;img class="alignnone size-full wp-image-410" src="https://tomiylab.com/wp-content/uploads/2021/03/pyenv_win.png" alt="" width="934" height="523"&gt;
&lt;h3&gt;インストール&lt;/h3&gt;
PATHを通します。
Win + R で"ファイル名を指定して実行"を起動し、"sysdm.cpl"と入力、詳細設定タブの環境変数をクリックしてください。
&lt;img class="alignnone size-full wp-image-411" src="https://tomiylab.com/wp-content/uploads/2021/03/env_var.png" alt="" width="411" height="467"&gt;
ユーザー環境変数のPathを開いて以下を先頭に追加します。
&lt;img class="alignnone size-full wp-image-416" src="https://tomiylab.com/wp-content/uploads/2021/03/env_var_2.png" alt="" width="618" height="585"&gt;
&lt;pre&gt;&lt;code class="bash"&gt;C:\Users\FOO\.pyenv_win\pyenv-win\bin
C:\Users\FOO\.pyenv_win\pyenv-win\bin&lt;/code&gt;&lt;/pre&gt;
(FOOにはユーザー名を入れてください)
&lt;img class="alignnone size-full wp-image-417" src="https://tomiylab.com/wp-content/uploads/2021/03/env_var_3.png" alt="" width="524" height="502"&gt;
PowerShellかコマンドプロンプトで
&lt;pre&gt;&lt;code class="bash"&gt;pyenv versions&lt;/code&gt;&lt;/pre&gt;
を実行してエラーが出ないことを確認してください。
エラーが出た場合は一度OSを再起動してみてください。
これで、Pyenvのインストールは完了です。
&lt;pre&gt;&lt;code class="bash"&gt;pyenv install -l&lt;/code&gt;&lt;/pre&gt;
でインストール可能なPythonのバージョンを確認して、お好みのバージョンのPythonをインストール、
&lt;pre&gt;&lt;code class="bash"&gt;pyenv global foo&lt;/code&gt;&lt;/pre&gt;
(fooはインストールしたPythonのバージョン)でインストールしたPythonをデフォルトに設定してください。
&lt;h2&gt;Poetryのインストール&lt;/h2&gt;
PowerShellで以下のコマンドを実行するだけです。
&lt;pre&gt;&lt;code class="bash"&gt;(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python
&lt;/code&gt;&lt;/pre&gt;
以下のコマンドでバージョンが表示されることを確認してください。
&lt;pre&gt;&lt;code class="bash"&gt;poetry --version&lt;/code&gt;&lt;/pre&gt;
仮想環境をプロジェクトのディレクトリ直下に作成するために、以下のコマンドを実行しておくといいでしょう。
&lt;pre&gt;&lt;code class="bash"&gt;poetry config virtualenvs.in-project true&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;参考にしたもの&lt;/h2&gt;
・&lt;a href="https://qiita.com/kerobot/items/3f4064d5174676080585"&gt;https://qiita.com/kerobot/items/3f4064d5174676080585&lt;/a&gt;
・&lt;a href="https://medium.com/music-and-technology/poetry%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E4%BD%9C%E6%88%90%E5%85%88%E3%81%AE%E5%A4%89%E6%9B%B4-96e1bab83725"&gt;https://medium.com/music-and-technology/poetry%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E4%BD%9C%E6%88%90%E5%85%88%E3%81%AE%E5%A4%89%E6%9B%B4-96e1bab83725&lt;/a&gt;
・&lt;a href="https://qiita.com/akym03/items/3576842eed0e9d28cf82"&gt;https://qiita.com/akym03/items/3576842eed0e9d28cf82&lt;/a&gt;</description></item><item><title>USキーボードのWindowsのGoogle日本語入力で入力切り替え</title><link>https://tomiylab.com/2021/03/us-keybord/</link><pubDate>Sun, 21 Mar 2021 17:58:34 +0900</pubDate><guid>https://tomiylab.com/2021/03/us-keybord/</guid><description>&lt;p&gt;USキーボードのMacBook ProにBootcampでWindowsを入れると入力切り替えに困ります。デフォルトではcontril ＋ ｀なので押しにくいです。&lt;/p&gt;
&lt;h2&gt;設定&lt;/h2&gt;
Google日本語入力をインストールしたらデフォルトの日本語入力を消して、IMEをGoogle日本語入力だけにしてください。
タスクバー右下のIMEを右クリックして、プロパティを選んで開いてください．
キー設定の編集をクリックしてことえりを選択。
BootcampじゃないWinsowsでUSキーボードを使っている場合はMS-IMEを選択。
keyが"半角/全角"になっている項目を全てcontrol ＋ spaceに変更してください。(４つあるはずです。)
(Windowsを英語でインストールしてるので画像は英語になっています。)
&lt;img class="alignnone size-full wp-image-397" src="https://tomiylab.com/wp-content/uploads/2021/03/IME.png" alt="" width="500" height="378"&gt;</description></item><item><title>Visual Studioの古いバージョンを入手する方法</title><link>https://tomiylab.com/2021/03/old-vs/</link><pubDate>Sun, 21 Mar 2021 06:25:00 +0900</pubDate><guid>https://tomiylab.com/2021/03/old-vs/</guid><description>&lt;p&gt;Visual Studioの古いバージョンの入手法をメモ
&lt;a href="https://visualstudio.microsoft.com/ja/dev-essentials/"&gt;&lt;a href="https://visualstudio.microsoft.com/ja/dev-essentials/"&gt;https://visualstudio.microsoft.com/ja/dev-essentials/&lt;/a&gt;&lt;/a&gt;からVisual Studio Dev Essentialsに登録。
&lt;a href="https://visualstudio.microsoft.com/ja/vs/older-downloads/"&gt;&lt;a href="https://visualstudio.microsoft.com/ja/vs/older-downloads/"&gt;https://visualstudio.microsoft.com/ja/vs/older-downloads/&lt;/a&gt;&lt;/a&gt;からダウンロードできます。&lt;/p&gt;</description></item><item><title>US配列のMacBookで入力切り替え</title><link>https://tomiylab.com/2020/04/change-ime-mac/</link><pubDate>Wed, 08 Apr 2020 16:23:36 +0900</pubDate><guid>https://tomiylab.com/2020/04/change-ime-mac/</guid><description>&lt;p&gt;US配列のMacBookで入力切り替えのショートカットはcontrol + spaceです．
しかし，このままでは押しにくいので切り替えやすいように設定します．&lt;/p&gt;
&lt;h2&gt;方法1：control + spaceのまま&lt;/h2&gt;
この方法は純正日本語入力だけでなくATOK,Google日本語入力,かわせみ2でも使えます．
システム環境設定のキーボードを開いてください．
"右下の修飾キー…"を開いてください．
&lt;img class="alignnone size-full wp-image-243" src="https://tomiylab.com/wp-content/uploads/2020/04/1-1.png" alt="" width="1338" height="1164" /&gt;
&lt;p&gt;caps lockキーの項目をcontrolキーに置き換えてください．&lt;/p&gt;
&lt;img class="alignnone size-full wp-image-244" src="https://tomiylab.com/wp-content/uploads/2020/04/1-2.png" alt="" width="1338" height="1164" /&gt;
これで，caps lockキーがなくなりますが，control + spaceでも押しやすくなります．
&lt;h2&gt;方法2：タッチバー&lt;/h2&gt;
この方法も純正日本語入力だけでなくATOK,Google日本語入力,かわせみ2でも使えます．
システム環境設定のキーボードを開いてください．
右下の"Control Stripをカスタマイズ…"開いてください．
&lt;img class="alignnone size-full wp-image-245" src="https://tomiylab.com/wp-content/uploads/2020/04/2.png" alt="" width="1338" height="1164" /&gt;
入力ソースをタッチバーにドラッグアンドドロップしてください．
タッチバーで入力ソースを切り替えられるようになりなす．
&lt;h2&gt;方法3：caps lock&lt;/h2&gt;
この方法は純正日本語入力だけでしか使えません．
システム環境設定のキーボードを開いてください．
&lt;img class="alignnone size-full wp-image-246" src="https://tomiylab.com/wp-content/uploads/2020/04/3-1.png" alt="" width="1338" height="1164" /&gt;
入力ソースのタブに切り替えて”Caps Lockキーで英字入力モードと切り替える”にチェックを入れてください．
&lt;img class="alignnone size-full wp-image-247" src="https://tomiylab.com/wp-content/uploads/2020/04/3-2.png" alt="" width="1338" height="1165" /&gt;
この方法ではCaps Lockキーが英数/かなキーのような振る舞いになります．</description></item><item><title>Bootcamp でスクリーンショットをとる</title><link>https://tomiylab.com/2020/04/scsho-bootcamp/</link><pubDate>Wed, 08 Apr 2020 14:19:20 +0900</pubDate><guid>https://tomiylab.com/2020/04/scsho-bootcamp/</guid><description>&lt;p&gt;MacのキーボードにはPrintScreenキーがないので，BootcampのWindowsでスクリーンショットを撮るには切り取り＆スケッチを使います．&lt;/p&gt;
&lt;h2&gt;切り取り＆スケッチ&lt;/h2&gt;
Win + shift + S で切り取り＆スケッチを起動します．
ドラッグアンドドロップで範囲を選択します．
選択したエリアのスクリーンショットがクリップボードに保存されます．
ペイントなどに貼り付けて保存してください．</description></item><item><title>WSLでホームディレクトリを変更する</title><link>https://tomiylab.com/2020/03/wsl-home/</link><pubDate>Sun, 29 Mar 2020 23:07:08 +0900</pubDate><guid>https://tomiylab.com/2020/03/wsl-home/</guid><description>&lt;p&gt;WSLのホームディレクトリはデフォルトのままではWindowsのホームディレクトリにアクセスしづらいのでWindows側のホームディレクトリと揃えたいと思います．&lt;/p&gt;
&lt;h2&gt;Vim, zshのインストール&lt;/h2&gt;
パッケージのアップデートとアップグレードした後vimとzshをインストールします．
&lt;pre&gt;&lt;code class="bash"&gt;sudo apt update
sudo apt upgrade
sudo apt install vim
sudo apt install zsh&lt;/code&gt;&lt;/pre&gt;
zshのパスも確認しておきます．
&lt;pre&gt;&lt;code class="bash"&gt;which zsh&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;ホームディレクトリを変更&lt;/h2&gt;
ホームディレクトリとログインシェルを変更します．
ホームディレクトリはWinsowsのホームディレクトリ，ログインシェルはzshに変更します．
ちなみにログインシェルの変更はこれ以外の方法もあります．
詳しく&lt;a href="https://tomiylab.com/2020/03/install-zsh/"&gt;こちら&lt;/a&gt;を見てください．
"/etc/passed"という設定ファイルを書き換えます．
下のコマンドでvimで開きます．
&lt;pre&gt;&lt;code class="bash"&gt;sudo vim /etc/passwd&lt;/code&gt;&lt;/pre&gt;
どこかに　○○:x:1000:1000:,,,:/home/○○:/bin/bash という行があります．
僕の場合は最終行にありました．VimだとGで最終行に移動できます．
○○はWSLのユーザー名です．それを以下のように書き換えます．
&lt;pre&gt;&lt;code class="bash"&gt;○○:x:1000:1000:,,,:/mnt/c/Users/[windows home]:[zsh path]&lt;/code&gt;&lt;/pre&gt;
保存したらWSLを再起動して
&lt;pre&gt;&lt;code class="bash"&gt;pwd&lt;/code&gt;&lt;/pre&gt;
を実行してください．/mnt/c/Users/[windows home]のように表示されるはずです．</description></item><item><title>zshのプロンプトをカッコよくしてGitのブランチを表示させる</title><link>https://tomiylab.com/2020/03/prompt/</link><pubDate>Sun, 29 Mar 2020 18:53:00 +0900</pubDate><guid>https://tomiylab.com/2020/03/prompt/</guid><description>&lt;p&gt;zshのプロンプトがデフォルトのままじゃ見にくいのでカスタマイズします．
ついでにGitのブランチも表示できるようにします．
動作が重くならないように，プラグインなどは使用しません．
ターミナルのフォントはパワーライン用のフォントに設定してください．
パワーライン用のフォントじゃないと正しく表示されません．
インストール方法は&lt;a href="https://tomiylab.com/2020/03/font-powerline/"&gt;&lt;a href="https://tomiylab.com/2020/03/font-powerline/"&gt;https://tomiylab.com/2020/03/font-powerline/&lt;/a&gt;&lt;/a&gt;を見てください．&lt;/p&gt;
&lt;h2&gt;プロンプト&lt;/h2&gt;
下の画像のようにプロンプトを変更します．
1行目はmacOS Catalinaで自動的に表示されるものです．
2行目のhello.は初代MacintoshのKeynoteでのデモの
“Hello, I’m Macintosh. It sure is great to get out of that bag. Unaccustomed as I am to public speaking, I’d like to share with you a maxim I thought of the first time I met an IBM mainframe: NEVER TRUST A COMPUTER YOU CAN’T LIFT.”
からです．
プロンプトを2行にしてpathが長くなっても見やすいようにしています．
また，コマンドの実行後に自動的に改行することで，見やすくしています．
&lt;img class="alignnone wp-image-154 size-large" src="https://tomiylab.com/wp-content/uploads/2020/03/prompt-1024x715.jpg" alt="" width="1024" height="715" /&gt;
&lt;h3&gt;.zshrc&lt;/h3&gt;
以下を~/.zshrcに追加してください．
&lt;pre&gt;&lt;code class="bash"&gt;export CLICOLOR=1
&lt;p&gt;echo hello.&lt;/p&gt;</description></item><item><title>パワーライン フォントをインストール</title><link>https://tomiylab.com/2020/03/font-powerline/</link><pubDate>Sat, 28 Mar 2020 14:11:49 +0900</pubDate><guid>https://tomiylab.com/2020/03/font-powerline/</guid><description>&lt;h2&gt;Mac&lt;/h2&gt;
Macの場合はRicty for Powerline　をインストールします．
Homebrewを使います．まだインストールしていない方&lt;a href="https://tomiylab.com/2020/03/install-homebrew/"&gt;Homebrew を Mac にインストール&lt;/a&gt;を読んでインストールしてください．
インストールするには以下のコマンドをターミナルで実行してください．
Rictyをインストールしたことのある方は1行目は実行しなくても大丈夫です．
&lt;pre&gt;&lt;code class="bash"&gt;brew tap sanemat/font
brew install ricty --with-powerline&lt;/code&gt;&lt;/pre&gt;
終わったら以下のコマンドを実行するとインストール完了です．
&lt;pre&gt;&lt;code class="bash"&gt;cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
fc-cache -vf&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Windows，Linux&lt;/h2&gt;
Windows，Linux の場合はRictyDiminished for Powerline をインストールします．
&lt;a href="https://github.com/mzyy94/RictyDiminished-for-Powerline"&gt;https://github.com/mzyy94/RictyDiminished-for-Powerline&lt;/a&gt;にアクセスしてZIPをダウンロードしてpowerline-fontpatchedの中にあるフォントをインストールしてください．</description></item><item><title>プログラミング用フォントをインストールする</title><link>https://tomiylab.com/2020/03/programing-font/</link><pubDate>Fri, 27 Mar 2020 18:02:00 +0900</pubDate><guid>https://tomiylab.com/2020/03/programing-font/</guid><description>&lt;h2&gt;フォントの重要性&lt;/h2&gt;
プログラムは一文字打ち間違えただけでもエラーが出てしまいます.
たとえば,アメリカ初の惑星探査機マリナー1号は誘導コンピューターのプログラムのハイフン1つ抜けていただけで,打ち上げが失敗してしまいました.
0(ゼロ)とO(大文字のオー),1(いち)とl(小文字のエル)などは似ていて,読み間違えやすいです.
似た文字を読み間違えないため,また,プログラムを読みやすくするためにも,フォントは重要です.
普通フォントは,可読性を上げて美しく見せるために、文字によって幅が違います. (プロポーショナルフォント)
しかし,プログラミングで、プロポーショナルフォントを使うとズレが生じて行が揃わないなどの不具合が生じてしまいます.
だから,プログラミングに使うフォントは字の幅が等しいフォント(等幅フォント)を使うのです.
&lt;h2&gt;おすすめのプログラミング用フォント&lt;/h2&gt;
おすすめのプログラミング用フォントは&lt;a href="http://www.yusa.lab.uec.ac.jp/~yusa/ricty.html"&gt;Ricty&lt;/a&gt;,&lt;a href="https://myrica.estable.jp"&gt;Myrica&lt;/a&gt;,&lt;a href="https://launchpad.net/takao-fonts"&gt;Takaoゴシック&lt;/a&gt;です.
それぞれのフォントをSublimeText 3でフォントサイズ22でPythonのプログラムを表示したときのサンプルを載せておきます.
&lt;img class="alignnone wp-image-107 size-large" src="https://tomiylab.com/wp-content/uploads/2020/03/Ricty-Regular-1024x653.png" alt="" width="1024" height="653" /&gt;
&lt;img class="alignnone wp-image-108 size-large" src="https://tomiylab.com/wp-content/uploads/2020/03/RictyDiminished-Bold-1024x649.png" alt="" width="1024" height="649" /&gt;
&lt;img class="alignnone wp-image-105 size-large" src="https://tomiylab.com/wp-content/uploads/2020/03/Myric-M-1024x653.png" alt="" width="1024" height="653" /&gt;
&lt;img class="alignnone wp-image-110 size-large" src="https://tomiylab.com/wp-content/uploads/2020/03/TakaoGothic-1024x653.png" alt="" width="1024" height="653" /&gt;
&lt;p&gt;ちなみに,僕はRictyを使っています.
理由はこの3つのフォントの中で唯一ボールドが用意されているからです.&lt;/p&gt;
&lt;h2&gt;Rictyのインストール&lt;/h2&gt;
僕が使っているRictyのインストール方法を紹介します.
&lt;h3&gt;Mac&lt;/h3&gt;
まず,Homebrewをインストールしてください.
まだの人は以下の記事を読んで入れてください.
&lt;a href="https://tomiylab.com/2020/03/install-homebrew/"&gt;Homebrew を Mac にインストール&lt;/a&gt;
Homebrewを入れたら,ターミナルを開いて以下のコマンドを実行してください.
&lt;pre&gt;&lt;code class="bash"&gt;brew tap sanemat/font
brew install ricty&lt;/code&gt;&lt;/pre&gt;
brew install が終わると
&lt;pre&gt;&lt;code class="bash"&gt;cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
fc-cache -vf&lt;/code&gt;&lt;/pre&gt;
を実行してインストール完了です.
&lt;h3&gt;Linux (Ubuntu)&lt;/h3&gt;
&lt;pre&gt;&lt;code class="bash"&gt;apt install fontforge
wget http://levien.com/type/myfonts/Inconsolata.otf
cp Inconsolata.otf ~/.fonts
&lt;/code&gt;&lt;/pre&gt;
下記リンクからMigu 1Mフォントをダウンロードする
http://mix-mplus-ipa.sourceforge.jp/migu/
&lt;pre&gt;&lt;code class="bash"&gt;cd Downloads
unzip migu-1m-20130430.zip
cp migu-1m-20130430/*.ttf ~/.fonts
git clone git://github.com/yascentur/Ricty.git
sh ricty_generator.sh auto
cp *.ttf ~/.fonts&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Windows&lt;/h3&gt;
WindowsでRictyをインストールするのは難しいので,代わりにRicty の姉妹フォントである,Ricty Diminishedのインストール方法を紹介します.
サンプルも載せておきます.
&lt;img class="alignnone wp-image-109 size-large" src="https://tomiylab.com/wp-content/uploads/2020/03/RictyDiminished-Regular-1024x649.png" alt="" width="1024" height="649" /&gt;
&lt;img class="alignnone wp-image-108 size-large" src="https://tomiylab.com/wp-content/uploads/2020/03/RictyDiminished-Bold-1024x649.png" alt="" width="1024" height="649" /&gt;
インストールするには
&lt;a href="https://github.com/edihbrandon/RictyDiminished"&gt;こちら&lt;/a&gt;にアクセスしてダウンロードしてください.
ダウンロードしたらZIPを展開して「RictyDiminished-Regular.ttf」と「RictyDiminished-Bold.ttf」をダブルクリックするとインストールできます.
&lt;h2&gt;Sublime Text3での設定方法&lt;/h2&gt;
SuSublime Text3のメニューからPreferences/Settingを開いてください.
次に{}の中に
&lt;pre&gt;&lt;code class="json"&gt;"font_face": "[font name]",&lt;/code&gt;&lt;/pre&gt;
を追加してください.
上で紹介したフォントを指定する場合は, font name に以下のように入れてください.
Ricty(レギュラー):Ricty Regular
Ricty(ボールド):Ricty Bold
RictyDiminished(レギュラー):RictyDiminished-Regular
RictyDiminished(ボールド):RictyDiminished-Bold
Takaoゴシック:TakaoGothic
ミリカ:Myric M</description></item><item><title>2020年10月</title><link>https://tomiylab.com/2020/10/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/2020/10/</guid><description/></item><item><title>2020年3月</title><link>https://tomiylab.com/2020/03/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/2020/03/</guid><description/></item><item><title>2020年4月</title><link>https://tomiylab.com/2020/04/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/2020/04/</guid><description/></item><item><title>2021年12月</title><link>https://tomiylab.com/2021/12/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/2021/12/</guid><description/></item><item><title>2021年3月</title><link>https://tomiylab.com/2021/03/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/2021/03/</guid><description/></item><item><title>2021年9月</title><link>https://tomiylab.com/2021/09/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/2021/09/</guid><description/></item><item><title>2022年10月</title><link>https://tomiylab.com/2022/10/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/2022/10/</guid><description/></item><item><title>2022年8月</title><link>https://tomiylab.com/2022/08/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/2022/08/</guid><description/></item><item><title>2025年6月</title><link>https://tomiylab.com/2025/06/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/2025/06/</guid><description/></item><item><title>tomiy の記事</title><link>https://tomiylab.com/author/tomiy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/author/tomiy/</guid><description/></item><item><title>サイト内検索</title><link>https://tomiylab.com/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://tomiylab.com/search/</guid><description/></item></channel></rss>