[{"data":1,"prerenderedAt":361},["ShallowReactive",2],{"content:\u002Fja\u002Ffiddling\u002Fcsapplab0":3,"surround:\u002Fja\u002Ffiddling\u002Fcsapplab0":350},{"id":4,"title":5,"authorship":6,"body":7,"categories":319,"date":321,"description":322,"draft":323,"extension":324,"image":325,"meta":326,"navigation":328,"path":329,"permalink":330,"published":330,"readingTime":331,"recommend":330,"references":330,"seo":336,"seoDescription":337,"seoTitle":330,"sitemap":338,"stem":341,"tags":342,"type":348,"__hash__":349},"content_ja\u002Fposts\u002Ffiddling\u002Fcsapplab0.md","CSAPP Labの環境構築","human-only",{"type":8,"value":9,"toc":303},"minimark",[10,14,21,24,46,49,52,60,63,67,70,81,84,90,93,100,103,108,111,121,124,127,130,133,139,142,148,151,155,158,161,164,170,173,179,182,185,188,197,200,203,206,212,215,221,224,230,233,236,239,245,248,254,257,264,266,269,276,279,282,291,295],[11,12,13],"h3",{"id":13},"はじめに",[15,16,17],"blockquote",{},[18,19,20],"p",{},"CSAPPを学びながら実験をしないのは、中国四大名著を読むのに『紅楼夢』を読まないようなものです。文学的素養と自己研鑽が足りず、内に秘めた高尚な芸術を理解できない。表面の華やかな言葉しか見えず、深遠な精神の核心に到達できない。その人の器はそこで頭打ちになり、比較的失敗した人生を送ることになるのです。",[18,22,23],{},"CSAPPの実験をあきらめさせる最大の要因は、Linux環境です。私は学部生のころ、VMware WorkstationにUbuntu Desktopを入れて一度やりました。自分はとくに困りませんでしたが、周りでは次のような問題が起きていました。",[25,26,27,31,34,37,40,43],"ul",{},[28,29,30],"li",{},"仮想マシンのインストール失敗",[28,32,33],{},"VMwareとHyper-Vの非互換",[28,35,36],{},"仮想マシンがネットにつながらない",[28,38,39],{},"ホストとの共有フォルダーが動かない",[28,41,42],{},"Ubuntuの中国語入力",[28,44,45],{},"その他、原因不明の怪現象",[18,47,48],{},"仮想マシンの性能も褒められたものではありません。ホストのメモリを切り分けるので、先にOOMになるのがゲストかホストか、分かったものではありません。",[18,50,51],{},"以上を踏まえ、私はWSL（Windows Subsystem for Linux）を選びました。WSL 2を使えるWindows 10 Version 2004以降、またはWindows 11をおすすめします。それ以前のWindowsはWSL機能があってもWSL 1で、LinuxのシステムコールをWindowsのシステムコールに翻訳して動かします。一方WSL 2は、軽量でメンテナンス不要の仮想マシン上に完全なLinuxカーネルを動かします。この完全なカーネルが、CSAPPの実験にはとても重要です。",[18,53,54,55,59],{},"macOSはどうするかって？ Intel MacBookならVirtualBox、VMware Fusion、Parallels DesktopなどにLinuxを入れるか、Dockerを使えます。M1 MacBookなら、",[56,57,58],"strong",{},"別のパソコンに替えることをおすすめします","。冗談ではなく、M1では本当に実験できません。",[18,61,62],{},"我ながら、余計な話が多いですね。",[11,64,66],{"id":65},"wslとubuntuのインストール","WSLとUbuntuのインストール",[18,68,69],{},"WindowsでのWSLインストールは簡単です。管理者権限のPowerShellで次のコマンドを入力します。",[71,72,78],"pre",{"className":73,"code":75,"language":76,"meta":77},[74],"language-shell","wsl --install -d Ubuntu\n","shell","",[79,80,75],"code",{"__ignoreMap":77},[18,82,83],{},"必要な機能が自動で設定され、Ubuntuの最新LTSもダウンロードされます。執筆時点では20.04です。インストールが終わると端末が開き、ユーザー名とパスワードを求められます。",[71,85,88],{"className":86,"code":87,"language":76,"meta":77},[74],"Installing, this may take a few minutes...\nPlease create a default UNIX user account. The username does not need to match your Windows username.\nFor more information visit: https:\u002F\u002Faka.ms\u002Fwslusers\nEnter new UNIX username: shinya\nNew password:\nRetype new password:\npasswd: password updated successfully\nInstallation successful!\n",[79,89,87],{"__ignoreMap":77},[18,91,92],{},"パスワードは入力しても画面に表示されません。",[18,94,95,96,99],{},"設定が終わると、",[79,97,98],{"code":98},"shinya@DESKTOP-4TMFLAE:~$","のようなプロンプトが現れ、コマンド待ちになります。これでUbuntuに入れました。",[11,101,102],{"id":102},"便利な使い方",[104,105,107],"h4",{"id":106},"windows-terminal","Windows Terminal",[18,109,110],{},"Windows Terminalは、Windowsの端末の王様と言っていいでしょう。",[18,112,113,114,120],{},"Microsoft Storeで「Windows Terminal」を検索して入れるか、GitHub Releasesの",[115,116,117],"a",{"href":117,"rel":118},"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fterminal\u002Freleases",[119],"nofollow","からmsixbundleをダウンロードしてダブルクリックすればインストールできます。",[18,122,123],{},"WSLとUbuntuが入っていれば、Windows Terminal上部のプラス横のドロップダウンにUbuntuが表示されます。クリックするとUbuntuのデフォルトシェルをすぐ開けます。",[104,125,126],{"id":126},"ファイル共有",[18,128,129],{},"WSL内のUbuntuとWindowsは、それぞれ独自のファイルシステムを持つ隔離された環境です。隔離されていますが、完全に切り離されているわけではありません。",[18,131,132],{},"WindowsのCドライブは、Ubuntuの\u002Fmnt\u002Fcにマウントされています。たとえばLinuxからWindowsのデスクトップを見るには、次のようにします。",[71,134,137],{"className":135,"code":136,"language":76,"meta":77},[74],"$ cd \u002Fmnt\u002Fc\u002FUsers\u002FShinya\u002FDesktop\n$ ls\n course.py     desktop.ini     szxx.bat     szxx.txt\n",[79,138,136],{"__ignoreMap":77},[18,140,141],{},"逆に、WSL自身のファイルシステムにあるファイルをWindowsから見ることもできます。ホームディレクトリ~を開くなら、次のコマンドです。",[71,143,146],{"className":144,"code":145,"language":76,"meta":77},[74],"$ cd ~\n$ explorer.exe .\n",[79,147,145],{"__ignoreMap":77},[18,149,150],{},"エクスプローラーが開き、指定したフォルダーの内容が表示されます。Windowsのフォルダーと同じ感覚で操作できます。",[104,152,154],{"id":153},"visual-studio-code","Visual Studio Code",[18,156,157],{},"世界最高のテキストエディター、VS CodeはWSLのフォルダーを直接開けます。ローカルのプロジェクトとまったく同じように扱えます。誰もがvimで実験したいわけではありませんからね。",[18,159,160],{},"まずWindows側のVS Codeを開き、拡張機能でWSLを検索して「Remote - WSL」をインストールします。通常は検索結果の先頭に出ます。",[18,162,163],{},"続いてUbuntuのプロジェクトフォルダーで、次を入力します。",[71,165,168],{"className":166,"code":167,"language":76,"meta":77},[74],"$ code .\n",[79,169,167],{"__ignoreMap":77},[18,171,172],{},"初回は必要なサポートコンポーネントがインストールされます。",[71,174,177],{"className":175,"code":176,"language":76,"meta":77},[74],"$ code .\nInstalling VS Code Server for x64 (899d46d82c4c95423fb7e10e68eba52050e30ba3)\nDownloading: 100%\nUnpacking: 100%\n",[79,178,176],{"__ignoreMap":77},[18,180,181],{},"その後Windows側のVS Codeが自動で開き、Ubuntuのプロジェクトフォルダーが作業ディレクトリになります。あとは好きなように開発できます。",[104,183,184],{"id":184},"中国国内のミラーに変更する",[18,186,187],{},"まず「源」とは何でしょうか。",[15,189,190],{},[18,191,192,193,196],{},"古書によれば、天地の気が交わり万物を生んだ時代、世界は混沌と濃密な霊気に満ちていました。多くの霊物は天地の根源の精気を吸収し、膨大な生命の精華を封じた琥珀のような結晶を作りました。",[194,195],"br",{},"\n現在まで残ったものを「源」と呼びます。",[18,198,199],{},"すみません、別の作品の話でした。",[18,201,202],{},"簡単に言うと、UbuntuなどDebian系のパッケージマネージャーaptはURLの一覧を持っていて、apt installを実行すると、そこからパッケージを探してダウンロードし、インストールします。この一覧が「源」、つまりsourcesです。デフォルトは中国国外のURLで、例によって非常に遅かったり、接続できなかったりします。そこで中国国内のミラーに変更します。",[18,204,205],{},"手順は次のとおりです。",[71,207,210],{"className":208,"code":209,"language":76,"meta":77},[74],"$ sudo mv \u002Fetc\u002Fapt\u002Fsources.list \u002Fetc\u002Fapt\u002Fsources.list.bak\n$ sudo nano \u002Fetc\u002Fapt\u002Fsources.list\n",[79,211,209],{"__ignoreMap":77},[18,213,214],{},"次の内容を貼り付けます。ここではAlibabaのミラーを使っています。ディストリビューションやバージョンによって設定が異なるので、間違えないようにしてください。これはUbuntu 20.04用です。",[71,216,219],{"className":217,"code":218,"language":76,"meta":77},[74],"deb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal main restricted universe multiverse\ndeb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-security main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-security main restricted universe multiverse\ndeb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-updates main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-updates main restricted universe multiverse\ndeb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-proposed main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-proposed main restricted universe multiverse\ndeb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-backports main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-backports main restricted universe multiverse\n",[79,220,218],{"__ignoreMap":77},[18,222,223],{},"続いてパッケージ一覧を更新し、パッケージをアップグレードします。",[71,225,228],{"className":226,"code":227,"language":76,"meta":77},[74],"$ sudo apt update\n$ sudo apt upgrade\n",[79,229,227],{"__ignoreMap":77},[11,231,232],{"id":232},"実験に必要なソフトウェア",[104,234,235],{"id":235},"パッケージ",[18,237,238],{},"必須のものは、この1行です。",[71,240,243],{"className":241,"code":242,"language":76,"meta":77},[74],"$ sudo apt install build-essential gcc-multilib gdb\n",[79,244,242],{"__ignoreMap":77},[18,246,247],{},"任意でcgdbも入れられます。GDBの軽量なフロントエンドで、通常のgdbと同じコマンド画面とソースコードを分割表示します。パッケージのcgdbは最新版ではないので、ソースからビルドします。",[71,249,252],{"className":250,"code":251,"language":76,"meta":77},[74],"$ sudo apt install automake libncurses5-dev flex texinfo libreadline-dev\n$ git clone git:\u002F\u002Fgithub.com\u002Fcgdb\u002Fcgdb.git\n$ cd cgdb\n$ .\u002Fautogen.sh\n$ .\u002Fconfigure --prefix=\u002Fusr\u002Flocal\n$ make\n$ sudo make install\n",[79,253,251],{"__ignoreMap":77},[18,255,256],{},"インストール後は、どこでもcgdbコマンドで開けます。画面はこんな感じです。",[18,258,259],{},[260,261],"img",{"alt":262,"src":263},"CGDB","https:\u002F\u002Fblog-img.774352199.xyz\u002F2025\u002Fa36f15210399888f0e0cf56efe45a202.jpg",[18,265,262],{},[18,267,268],{},"左がコードウインドウ、右がgdbウインドウです。",[18,270,271,272,275],{},"起動時は上下分割ですが、",[79,273,274],{"code":274},"ctrl+w","で左右分割に切り替えられます。",[18,277,278],{},"escを押すとgdb側からコード側へフォーカスが移ります。コード側ではソースを上下に見て回れ、スペースで選択行にブレークポイントを設定できます。",[18,280,281],{},"iを押すとgdb側へ戻ります。こちらの操作は通常のgdbと同じです。",[18,283,284,285,290],{},"詳しくは",[115,286,289],{"href":287,"rel":288},"https:\u002F\u002Fleeyiw.gitbooks.io\u002Fcgdb-manual-in-chinese",[119],"CGDB中国語マニュアル","を参照してください。",[104,292,294],{"id":293},"実験はどこにある","実験はどこにある？",[18,296,297,298,302],{},"独学なら",[115,299,300],{"href":300,"rel":301},"http:\u002F\u002Fcsapp.cs.cmu.edu\u002F3e\u002Flabs.html",[119],"へどうぞ。各実験のSelf-Study Handoutリンクから教材をダウンロードできます。WSLにコピーすれば、楽しい実験の始まりです！",{"title":77,"searchDepth":304,"depth":304,"links":305},4,[306,308,309,315],{"id":13,"depth":307,"text":13},3,{"id":65,"depth":307,"text":66},{"id":102,"depth":307,"text":102,"children":310},[311,312,313,314],{"id":106,"depth":304,"text":107},{"id":126,"depth":304,"text":126},{"id":153,"depth":304,"text":154},{"id":184,"depth":304,"text":184},{"id":232,"depth":307,"text":232,"children":316},[317,318],{"id":235,"depth":304,"text":235},{"id":293,"depth":304,"text":294},[320],"fiddling","2021-12-27 00:09:00","CSAPPの学習では実験が欠かせませんが、Linux環境の構築が壁になりがちです。とくに仮想マシンでは、インストール失敗、互換性、ネットワーク接続などの問題に悩まされます。Windows 10バージョン2004以降なら、WSL（Windows Subsystem for Linux）が有力な選択肢です。従来の仮想マシンの複雑さや性能面の負担を避けながら、Linux環境を手軽に利用できます。",false,"md","https:\u002F\u002Fblog-img.774352199.xyz\u002FvqOC7N.webp",{"slots":327},{},true,"\u002Ffiddling\u002Fcsapplab0",null,{"text":332,"minutes":333,"time":334,"words":335},"10 min read",9.585,575100,1917,{"title":5,"description":322},"Windows上でCSAPPの実験環境を構築。WSL2とUbuntuの導入、ファイル共有、VS Code連携、パッケージ源の変更、GDB・CGDBの準備と教材の入手方法を説明します。",{"loc":329,"images":339},[340],{"loc":263},"posts\u002Ffiddling\u002Fcsapplab0",[343,344,345,346,347],"CSAPP","WSL2","Linux","GDB","実験環境","tech","B3dhuxsXwy5eFo2Qv8KdMvP5VU5GSbpKQ1P0qt7JqCo",[351,356],{"title":352,"path":353,"stem":354,"date":355,"type":348,"children":-1},"MYDB 10. サーバー・クライアントの実装と通信プロトコル","\u002Fprojects\u002Fmydb\u002Fmydb10","posts\u002Fprojects\u002Fmydb\u002Fmydb10","2021-12-25 18:26:00",{"title":357,"path":358,"stem":359,"date":360,"type":348,"children":-1},"Javaのthisキーワードでコンパイル時の定数伝播が効かなくなる問題","\u002Ffiddling\u002Fthis-in-javac-string-concat","posts\u002Ffiddling\u002Fthis-in-javac-string-concat","2022-04-16 00:01:28",1789914057265]