tag:crieit.net,2005:https://crieit.net/tags/Ubuntu/feed 「Ubuntu」の記事 - Crieit Crieitでタグ「Ubuntu」に投稿された最近の記事 2024-02-27T00:48:40+09:00 https://crieit.net/tags/Ubuntu/feed tag:crieit.net,2005:PublicArticle/18777 2024-02-27T00:46:48+09:00 2024-02-27T00:48:40+09:00 https://crieit.net/posts/Raspberry-Pi-5-Ubuntu-24-04-LTS-SSH Raspberry Pi 5 に Ubuntu 24.04 LTS を入れて SSH するまで <p>ついに日本でも、 Raspberry Pi 5 の技適対応モデルが発売された。</p> <p>Raspberry Pi にインストールする OS と言えば、まずは <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.com/software/">Raspberry Pi OS (旧 Raspbian)</a> だが、同じ Debian ベースの <a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/download/raspberry-pi">Ubuntu</a> も Raspberry Pi 向けの公式イメージを出している。</p> <p>但し、 Raspberry Pi 5 に対応しているのは、 Ubuntu 23.10 (コードネーム: mantic) 以降のみとなる。</p> <p>現在リリース済みの 23.10 は「非LTS」バージョンとなり、サポートが 9ヶ月 (2024年6月まで) と短い。<br /> 常用するなら、サポートが 5年 (ESM なら 10年) と長い LTS バージョンが望ましいが、残念ながら 22.04 LTS Raspberry Pi 5 に非対応だ。</p> <p>LTS バージョンの次回リリースは 24.04 LTS (コードネーム: noble / 2024年4月リリース予定) で、現在絶賛開発中だ。</p> <p>そんな開発中の 24.04 LTS も、デイリースナップショットが手に入る。<br /> そいつを使って<strong>ディスプレイやキーボードが無い状態</strong>で、インストールから SSH 接続までやってみよう。</p> <p>Raspberry Pi 5 をターゲットに書いているが、 Raspberry Pi 3, 4, Raspberry Pi Zero 2 W でも同じ手順でできるはずだ。</p> <p>なお、この記事は 24.04 LTS がリリースされたら、それに併せて内容に書き換えていくつもり。</p> <h2 id="TL;DR"><a href="#TL%3BDR">TL;DR</a></h2> <ul> <li>microSD カードに Ubuntu の OS イメージを焼いたあと、 RasPi に挿す<strong>前</strong>に初回起動時の設定を書き換える</li> <li>cloud-init の挙動を理解しよう</li> <li>ディスプレイなし & 無線LAN Only だと少し工夫がいる</li> <li>今回の記事の内容は、<a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/?p=1404">Raspberry Pi に Ubuntu を入れて SSH でログインするまでの A to B | Aqua Ware つぶやきブログ</a> の二番煎じ <ul> <li>Ubuntu 24.04 LTS に合わせて内容はアップデートされている</li> </ul></li> </ul> <h2 id="準備するもの"><a href="#%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE">準備するもの</a></h2> <ul> <li>Raspberry Pi 5 <ul> <li>Raspberry Pi 3, 4 でも同じ手順でいけるはず</li> </ul></li> <li>4GB 以上の micorSD カード <ul> <li>IOPS が高い、「アプリケーションパフォーマンスクラス」が A2 のものが良いだろう。値段や速度を考えると、実用上は 64GB 以上になるだろうか。</li> <li>私は、<a target="_blank" rel="nofollow noopener" href="https://amzn.to/42J1AeI">ARCANITE 64GB microSDXCカード 【A2】、UHS-I U3、V30、4K、C10</a> 値段の割にパフォーマンスが良かったため、これを使った。</li> <li>後述するが、最終的には NVMe SSD にした方が断然良い</li> </ul></li> <li>microSD を書き込める PC (Win, Linux, mac)</li> <li>インターネットに繋がる Wi-Fi または イーサネットケーブル</li> </ul> <p>以下もあると便利だが、今回の手順では無くても問題ない。</p> <ul> <li>micro-HDMI で繋がるディスプレイ 又は 変換コネクタ</li> <li>RasPi に繋げる USB キーボード</li> </ul> <h2 id="イメージファイルの取得"><a href="#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%8F%96%E5%BE%97">イメージファイルの取得</a></h2> <p>正式リリース前の Raspberry Pi 向けデイリースナップショットイメージは、以下のいずれかから手に入る。</p> <p>今回は、サーバーOS的に SSH して使う事が目的なので、<strong>後者のサーバー版</strong>を利用する。</p> <ul> <li>Raspberry Pi 向けデスクトップ版イメージ <ul> <li><a target="_blank" rel="nofollow noopener" href="https://cdimage.ubuntu.com/daily-preinstalled/current/">https://cdimage.ubuntu.com/daily-preinstalled/current/</a></li> </ul></li> <li>Raspberry Pi や、汎用 64-bit ARM, RISC-V 向けサーバー版イメージ <ul> <li><a target="_blank" rel="nofollow noopener" href="https://cdimage.ubuntu.com/ubuntu-server/daily-preinstalled/current/">https://cdimage.ubuntu.com/ubuntu-server/daily-preinstalled/current/</a></li> </ul></li> </ul> <p>リンク先から、 <code>noble-preinstalled-server-arm64+raspi.img.xz</code> を選択してダウンロードしよう。</p> <p>24.04 LTS が正式リリースされれば、 <a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/download/raspberry-pi">Install Ubuntu on a Raspberry Pi | Ubuntu</a> のページからダウンロードできるようになるはずだ。</p> <h2 id="ブータブル SD の焼き込み"><a href="#%E3%83%96%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB+SD+%E3%81%AE%E7%84%BC%E3%81%8D%E8%BE%BC%E3%81%BF">ブータブル SD の焼き込み</a></h2> <p>ダウンロードしたイメージファイルを、ブート可能な状態で microSD に書き込む。<br /> ダウンロードしたファイルをただ SD カードに保存するのではなく、専用のツールで書き込む必要があるぞ。</p> <p>方法は色々あるのだが、今回は個人的にオススメな <a target="_blank" rel="nofollow noopener" href="https://www.balena.io/etcher/">balenaEtcher</a> を使った方法で紹介しよう。</p> <ol> <li>microSD を SDカードスロットに挿す</li> <li>balenaEtcher を DL & 起動する。 <ul> <li>DLする balenaEtcher は Portable 版で良い</li> </ul></li> <li>前項でダウンロードするした <code>***.img.xz</code> を選択して、書き込みを開始する <ul> <li><code>***.img.xz</code> は、 <code>***.img</code> ファイルを <code>.xz</code> 形式で圧縮したものなのだが、手動で解凍せず直接 balenaEtcher で選択してしまって問題ない。 balenaEtcher は書き込み時にオンザフライで解凍する。</li> </ul></li> </ol> <p>なお、リリース済みの Ubuntu (や Raspberry Pi OS など) であれば、一般的に <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.com/software/">Raspberry Pi Imager</a> というツールを使った方法がオススメされるのだが、DLが遅いからか、全体的に時間がかかるので私はあまりオススメしない。</p> <h2 id="system-boot パーティション内の cloud-init 等の設定を書き換える"><a href="#system-boot+%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E5%86%85%E3%81%AE+cloud-init+%E7%AD%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">system-boot パーティション内の cloud-init 等の設定を書き換える</a></h2> <p>作成した micorSD を早速 RasPi に挿す <strong>…前に</strong> 、 初回セットアップ設定を書き換える。</p> <p>一度書き込んだ microSD を再び PC に挿し直すと、 <code>"system-boot"</code> という 500MB 位の FAT32 パーティションが開けるはずだ。</p> <p>ここには、 cloud-init という仕組みで初回起動時の設定を定義するファイルがいくつか含まれている。<br /> これらを書き換えていく。</p> <p>書き換え後のファイルは <a target="_blank" rel="nofollow noopener" href="https://gist.github.com/advanceboy/c9b020fe09ababd390c0e95d74dfde7e">こちらの Gist</a> に置いてあるので、結果だけ欲しい人はここから DL をば。</p> <h3 id="cloud-init の network-config"><a href="#cloud-init+%E3%81%AE+network-config">cloud-init の network-config</a></h3> <p>以下のように書き換える。<br /> (元のファイルからの差分を <code>diff</code> のフォーマットで表示している。 以降同様。)</p> <pre><code class="diff">--- network-config.org +++ network-config @@ -22,23 +22,11 @@ ethernets: eth0: dhcp4: true optional: true -# wifis: -# wlan0: -# dhcp4: true -# optional: true -# access-points: -# myhomewifi: -# password: "S3kr1t" -# myworkwifi: -# password: "correct battery horse staple" -# workssid: -# auth: -# key-management: eap -# method: peap -# identity: "[email protected]" -# password: "passw0rd" -# ca-certificate: /etc/my_ca.pem - -# regulatory-domain: GB + wifis: + wlan0: + dhcp4: true + access-points: + "SSID-of-myhomewifi": + password: "password-of-myhomewifi" </code></pre> <p>Ubuntu では Netplan を使ってネットワークが管理されるため、 Netplan の形式で記述する。</p> <p>規定値では IPv4 の有線イーサネットのみ、 DHCP 自動取得で接続されるようになっている。<br /> 必要に応じて、上述のように Wi-Fi で接続する SSID 等の情報を追記したり、逆に有線LANを使わないなら <code>ethernet:</code> プロパティごと削除してしまってもよいだろう。</p> <p>SSID やパスワードは、各自の環境のものに置き換えて書き換えてほしい。</p> <p>コメントアウトされている wifi の記述例では、 <code>wifis.wlan0.optional</code> を <code>true</code> に設定しているが、もし Wi-Fi 単独でネットワークに接続するつもりならこの設定は行わないようにしよう。<br /> さもないと、OS起動の度に2分も余計に時間かかる羽目になる。<br /> これは、 <code>systemd-networkd-wait-online.service</code> デーモンが、(optional true を指定していない) 有効なネットワークの接続をタイムアウトするまで待機してしまうためだ。</p> <p>network-config 自体のリファレンスはこちら。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/23.4.1/reference/network-config.html">https://cloudinit.readthedocs.io/en/23.4.1/reference/network-config.html</a></p> <h3 id="cloud-init の user-data"><a href="#cloud-init+%E3%81%AE+user-data">cloud-init の user-data</a></h3> <p>こちらは書き換え箇所が多いので、何箇所かに分けて説明していく。</p> <p>まず最初はユーザー名まわり。</p> <pre><code class="diff">--- user-data.org +++ user-data @@ -17,13 +17,17 @@ # Some additional examples are provided in comments below the default # configuration. +# Override the `default_user` configuration from `/etc/cloud/cloud.cfg`. The `user` dictionary keys supported for the default_user are the same as the `users` schema. +user: + name: newusername + # On first boot, set the (default) ubuntu user's password to "ubuntu" and # expire user passwords chpasswd: expire: true users: - - name: ubuntu - password: ubuntu + - name: newusername + password: newpassword type: text ## Set the system's hostname. Please note that, unless you have a local DNS </code></pre> <p>規定では、 cloud-init パッケージの <code>/etc/cloud/cloud.cfg</code> ファイルの定義によって、 "ubuntu" というユーザーが作成される。</p> <p>しかし、 既知のユーザー名をそのまま使うのはセキュリティ的にも若干不安があるし、 作成後のユーザー名を書き換えるのは若干面倒なので、作成されるデフォルトのユーザー名自体を、他の名前 (上記例だと "newusername") に書き換えてしまおう。</p> <p>また、 <code>chpasswd</code> による、初回アクセス時のパスワード変更対象とするユーザー名も、併せて変更しておく。</p> <p>--</p> <p>次にホスト名とキーボード周りの設定。</p> <pre><code class="diff">@@ -31,14 +35,14 @@ ## setting the hostname here will not make the machine reachable by this name. ## You may also wish to install avahi-daemon (see the "packages:" key below) ## to make your machine reachable by the .local domain -#hostname: ubuntu +hostname: ubuntu-raspi5 ## Set up the keyboard layout. See localectl(1), in particular the various ## list-x11-* sub-commands, to determine the available models, layouts, ## variants, and options -#keyboard: -# model: pc105 -# layout: gb +keyboard: + model: pc105 + layout: jp # variant: # options: ctrl:nocaps </code></pre> <p>ここはまぁ、見た通りなので追加での説明はいらないかな。</p> <p>--</p> <p>お次は SSH まわり。</p> <pre><code class="diff">@@ -53,6 +57,8 @@ #ssh_import_id: #- lp:my_launchpad_username #- gh:my_github_username +ssh_authorized_keys: +- ssh-rsa AAAA<中略>== rsa-key-of-user1 ## Add users and groups to the system, and import keys with the ssh-import-id ## utility </code></pre> <p><code>ssh_authorized_keys</code> に直接指定するか、<code>ssh_import_id:</code> のところで自分の GitHub のユーザー名を指定してインポートすることにより、 デフォルトのユーザー (上記例だと "newusername") に登録する公開鍵を指定する。</p> <p>SSH に登録するパスワードログインは規定で禁止されているので、この設定をしておかないと SSH による遠隔からのアクセスができない。</p> <p>--</p> <p>タイムゾーンや起動後の処理まわり。</p> <pre><code class="diff">@@ -82,8 +88,13 @@ #- python3-gpiozero #- [python3-serial, 3.5-1] +# locale and timezone +timezone: Asia/Tokyo + ## Write arbitrary files to the file-system (including binaries!) -#write_files: +write_files: +- path: /etc/cloud/cloud-init.disabled + defer: true #- path: /etc/default/console-setup # content: | # # Consult the console-setup(5) manual page. </code></pre> <p>とりあえずタイムゾーンは日本標準時にしておこう。</p> <p>次に、 <code>write_files:</code> のほうだが、これは次回以降のブート時に cloud-init が余計に起動しないようにするための設定だ。</p> <p>cloud-init の設定の大半は、 初回ブート時にただ一度だけ実行されるのだが、 cloud-init サービス自体は基本的に毎回常に起動して、サービスとして常駐しっぱなしになっている。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/topics/modules.html">Modules</a> で、 <code>Module frequency: per always</code> となっているモジュールの実行などは、ブートする度に毎回実行される。<br /> そうすると、場合によっては cloud-init の実行ログがログイン画面を覆ってしまうことが毎回の起動ごとに発生して鬱陶しい。<br /> このため、 <code>/etc/cloud/cloud-init.disabled</code> という <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/howto/disable_cloud_init.html#method-1-text-file">空ファイルを作成しておく</a> ことで、 次回以降の起動時に cloud-init を無効にしている。</p> <p><code>defer: true</code> が指定されている部分についてだが、これは cloud-init の初期化処理が大きく分けて Network (<code>cloud_init_modules</code>), Config (<code>cloud_config_modules</code>), Final (<code>cloud_final_modules</code>) という <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/explanation/boot.html">3ステージ に分かれて</a> いることに関係する。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/reference/modules.html#write-files"><code>write_files:</code> モジュール</a> は Ubuntu の既定だと Network ステージに実行されてしまい、このタイミングで <code>cloud-init.disabled</code> ファイルが作成されてしまうと、 Config や Final ステージの処理が実行されなくなってしまう。<br /> このため、 <code>defer</code> オプションを true にして Final ステージで <code>cloud-init.disabled</code> ファイルが作成されるよう調整しているのだ。</p> <p>なお、どのモジュールがどのステージで実行されるかは、 <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/reference/base_config_reference.html#example"><code>/etc/cloud/cloud.cfg</code></a> で定義されている。<br /> (各ディストリビューション毎の <a target="_blank" rel="nofollow noopener" href="https://git.launchpad.net/ubuntu/+source/cloud-init/tree/config/cloud.cfg.tmpl?h=ubuntu/noble"><code>cloud.cfg</code> のテンプレートソースはこちら</a>)</p> <hr /> <p>最後に、コマンドの実行。<br /> 以下の <code>192.168.0.2</code> の部分は、 ssh で RasPi に接続するゲスト PC の IPアドレス に書き換えてくれ。</p> <pre><code class="diff">@@ -106,7 +117,9 @@ # permissions: '0644' ## Run arbitrary commands at rc.local like time -#runcmd: +runcmd: +# after wlan0 is connected, write the arp entry to target machine on background job +- [ sh, -c, 'sleep 2; ping -c 4 192.168.0.2' ] #- [ ls, -l, / ] #- [ sh, -xc, "echo $(date) ': hello world!'" ] #- [ wget, "http://ubuntu.com", -O, /run/mydir/index.html ] </code></pre> <p>このコマンドは、仮に ssh ゲストの IP アドレスが <code>192.168.0.2</code> であると仮定して、そこへ向かって Ping を打っている。<br /> なぜなら、 ゲストPC から RaspPi の IP アドレスを ARP コマンドで確実に調べられるようにするためだ。</p> <p>RasPi に繋げるディスプレイがないことを前提とすると、 SSH するために DHCP によって RasPi に割り当てられた IP アドレスをどうやって調べるのか、と言う問題に直面する。</p> <p>RasPi の MAC アドレスの先頭 24bit は、 Raspberry 財団の所持する OUI から割り当てられるはずなので、以下のいずれかになるはずだ。</p> <pre><code>28:CD:C1 2C:CF:67 B8:27:EB D8:3A:DD DC:A6:32 E4:5F:01 </code></pre> <p>通常、 RasPi がオンラインになったときに、 ARPリクエストがブロードキャストされるため、 同一ネットワーク内の PC の ARP テーブルに RasPi のレコードが追加され、 以下のような arp コマンドで対象の IP アドレスを調べることができるようになる。。。 <strong>多くの場合は。</strong></p> <pre><code class="powershell">while(1) { arp -a | ?{ $_ -match '\s(28-cd-c1|2c-cf-67|b8-27-eb|d8-3a-dd|dc-a6-32|e4-5f-01)' }; Start-Sleep -Seconds 1} </code></pre> <p>ところが、 RasPi が Wi-Fi で繋いでいる先が (単なるアクセスポイントではなく) ルーターだったりすると、 RasPi が 同じサブネット内に ARPリクエスト をブロードキャストしたのにも関わらず、 ルーターが無駄に気を利かせて ARPリクエスト を代替して投げてしまい、 同じサブネットの別の端末の ARP テーブルには、 RasPi の MAC アドレスのレコードが記録されないことがある。</p> <p>そこで、 RasPi 側から SSH のアクセス元となる PC を指定して ping を投げることで、 その PC の ARP テーブルに確実に RasPi が載るようにしている。</p> <p>--</p> <p>ここまで書き換えたら、 SD カードを取り外して RasPi に挿し、いよいよ起動する。</p> <h3 id="cloud-init 周りの補足"><a href="#cloud-init+%E5%91%A8%E3%82%8A%E3%81%AE%E8%A3%9C%E8%B6%B3">cloud-init 周りの補足</a></h3> <p>system-boot パーティション内の中身について、もう少し細かい仕組み周りを深堀りして補足したい。<br /> 興味が無ければ、読み飛ばしてしまって次の章に進んでもらって問題ない。</p> <p>system-boot パーティション直下にある <code>README</code> というファイルを開くと、このパーティションに存在するファイルの概要が簡単に書いてある。</p> <pre><code class="text:README">================== The Boot Partition ================== This file belongs to the boot partition of the Ubuntu Server for Raspberry Pi. ... </code></pre> <p>このパーティションには、Raspberry Pi に於ける BIOS の代替となる <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.com/documentation/computers/config_txt.html">config.txt</a> といった H/W 設定用のファイルや、 cloud-init の構成ファイルなどが含まれていることがわかる。</p> <p>このうち、<strong>cloud-init</strong> は Infrastructure as Code (IaC) の一種だ。<br /> その名の通り、 AWS などのクラウド上の仮想マシンの初期設定を念頭においた仕組みだが、それに留まらず、一般的な Linux インスタンスの初期設定に活用される。<br /> 設定内容は、YAML形式の設定ファイルを使用して記述し、クラウドやディストリビューションの違いをある程度吸収して初期設定を行うことができる。<br /> Ubuntu の OS のイメージ内には、事前に cloud-init のサービス(デーモン)が組み込まれており、OS の起動時に何らかの方法で指定された設定ファイルを読み取って、初回設定処理が実行される仕組みとなっている。</p> <p>Raspberry Pi 用の Ubuntu Server イメージでは、この cloud-init 用の設定ファイルが上記の <code>system-boot</code> パーティションから取得される。<br /> イメージ内のデフォルト値の定義と、<code>system-boot</code> パーティション内のユーザー定義が組み合わされ、初期設定が進められるワケだ。</p> <p>たとえば、今回 microSD に書き込んだイメージをそのまま書き換えずに Ubuntu を起動すると、ユーザー認証が以下のように構成される。</p> <ol> <li><code>ubuntu</code> というユーザーID</li> <li><code>ubuntu</code> というパスワード</li> <li>初回起動時にパスワードの変更を求める</li> <li>SSH サーバーの起動</li> </ol> <p>このうち、 (1), (4) は、OSに組み込まれた <code>/etc/cloud/cloud.cfg</code> の定義によるもの。<br /> そして、 (2), (3) は <code>system-boot</code> パーティション内の <code>user-data</code> ファイル内の以下の部分の定義によるモノだ。</p> <pre><code class="yaml:user-data">#cloud-config chpasswd: expire: true users: - name: ubuntu password: ubuntu type: text </code></pre> <p>このデフォルトの構成だと流石にセキュリティ的にアレなので、書き換えを行っている… というのが、前項の設定の真相となる。</p> <h2 id="Raspberry Pi に割り当てられた IP アドレスを調べられるようにして起動"><a href="#Raspberry+Pi+%E3%81%AB%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%89%E3%82%8C%E3%81%9F+IP+%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%89%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%A6%E8%B5%B7%E5%8B%95">Raspberry Pi に割り当てられた IP アドレスを調べられるようにして起動</a></h2> <p>こんな感じでひととおりファイルを書き換えたら、いよいよ RasPi を起動する。</p> <p>…と、その前に、 ssh でつなぐ予定のゲスト端末で、管理者権限で以下のコマンドを実行し、端末内の「arp テーブル」をリセットする。</p> <pre><code class="powershell">arp -d * </code></pre> <p>その後、ようやくだが RasPi に microSD を挿して起動させよう。<br /> 初回ブート時の設定を適用しながら起動してくれる。</p> <p>ssh でつなぐ予定のゲスト端末の PowerShell で、以下のような arp コマンドのループを実行し、ゲストPC から RasPi の IPアドレスを調べよう。<br /> 初回起動され安定しただろうところ(SDカードの I/O 性能によるが 1~5分?)で、 RasPi の IP アドレスがヒットしてくるようになるはずだ。</p> <pre><code class="powershell">while(1) { arp -a | ?{ $_ -match '\s(28-cd-c1|2c-cf-67|b8-27-eb|d8-3a-dd|dc-a6-32|e4-5f-01)' }; Start-Sleep -Seconds 1} </code></pre> <p>公開鍵の登録が適切に行えれば、その IP アドレスに対し SSH できるはずだ。</p> <p>初回アクセス時は、以下のようなパスワード変更を求められる。</p> <pre><code>WARNING: Your password has expired. You must change your password now and login again! Changing password for newusername. </code></pre> <p>古いパスワード ("newpassword") と変更後のパスワードを改めて入れる。</p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>一般的な1列端子の microSD で最速な UHS-I SDR104 のバスインターフェースに Raspberry Pi 5 が対応したことや、最近の安価な microSD の I/O 速度もだいぶ向上したのも相まって、 RasPi 4B が登場した頃と比べると、体感できる I/O 性能が大きく向上している。<br /> おかげで、起動やパッケージのインストール、更新などが快適になった。</p> <p>だいぶ高価になってしまった価格的な面からも、 Raspberry Pi の 非Zero/Pico シリーズは「Linuxが動くマイコン」から「小型のLinuxマシン」という面がより強くなったと感じる。<br /> (それはどうなんだという気もするけど。)</p> <p>更に RasPi 5 では PCI Express (PCIe) にも対応しているため、 NVMe で繋いだ SSD からブートさせると、更に桁違いの高速化が臨める。</p> <p>近いうちに、そちらも試してみようと思う。</p> <p>…ただ、どうせ PCIe に対応するなら、microSD Express に対応してくれれば、 NVMe 用 HAT とか買い足さんで済むから良かったのにな~…と、思わんでもない。<br /> しかし、2019年にSD7.1の規格として登場してから4年も経った2024年現在その製品が売られているとこを見たことないので、まぁ無理な相談か。</p> advanceboy tag:crieit.net,2005:PublicArticle/18665 2023-11-28T21:56:53+09:00 2023-12-24T14:09:15+09:00 https://crieit.net/posts/Haskell-Ubuntu Haskell を Ubuntu にインストールできねーの(^〜^)? <h1 id="情報"><a href="#%E6%83%85%E5%A0%B1">情報</a></h1> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://github.com/muzudho/haskell-practice-on-ubuntu">haskell-practice-on-ubuntu</a></p> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Haskel を Ubuntu にインストールできねーの?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 何度も失敗してるよな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 また イチからトライしましょう」</p> <h1 id="(📅2023-11-28 tue) Git Hub の使い方わかんねー(^〜^)"><a href="#%28%F0%9F%93%852023-11-28+tue%29+Git+Hub+%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%8F%E3%81%8B%E3%82%93%E3%81%AD%E3%83%BC%EF%BC%88%EF%BC%BE%E3%80%9C%EF%BC%BE%EF%BC%89">(📅2023-11-28 tue) Git Hub の使い方わかんねー(^〜^)</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Windows と Ubuntu で Git Hub が違う」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 CLaunch の Ubuntu 版は無いの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Visual Studio Code の Ubuntu 版は無いの?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 ↓ うーん、そのうち 願いが叶えられそうなのは これかな?」</p> <h2 id="Visual Studio Code をインストールしようぜ(^〜^)?"><a href="#Visual+Studio+Code+%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%82%88%E3%81%86%E3%81%9C%EF%BC%88%EF%BC%BE%E3%80%9C%EF%BC%BE%EF%BC%89%EF%BC%9F">Visual Studio Code をインストールしようぜ(^〜^)?</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yoshiyasu1111/items/e21a77ed68b52cb5f7c8">UbuntuにVSCodeをインストールする3つの方法</a></p> <p>Input:</p> <pre><code class="shell">sudo snap install --classic code </code></pre> <p>Output:</p> <pre><code class="plaintext">code 1a5daa3a from Visual Studio Code (vscode✓) installed </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ インストールされたらしいけど、どうやって起動する?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>code</code> って打ちゃあ いいんじゃないの?」</p> <p>Input:</p> <pre><code class="shell">code </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ うおっ、CUI から GUI が出てきた メモ帳みたいだ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 コマンド・プロンプトと 似たようなもんなんじゃないか?」</p> <h2 id="git をインストールしようぜ(^〜^)?"><a href="#git+%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%82%88%E3%81%86%E3%81%9C%EF%BC%88%EF%BC%BE%E3%80%9C%EF%BC%BE%EF%BC%89%EF%BC%9F">git をインストールしようぜ(^〜^)?</a></h2> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 じゃあ 次、 git」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 ↓ ほらよ」</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tommy_g/items/771ac45b89b02e8a5d64">UbuntuにGitをインストールする</a></p> <p>Input:</p> <pre><code class="shell"># インストール sudo apt-get install git </code></pre> <p>Input:</p> <pre><code class="shell"># インストールできたか確認 dpkg -l git </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 バージョンは <code>1:2.34.1-1ubuntu1.10</code> って書いてあるぜ」</p> <pre><code class="shell"># git の初期設定 git config --global user.name [任意のユーザ名] git config --global user.email [任意のユーザ名] </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 覚えてねーっ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 メールアドレスは覚えてるだろ。 Git Hub を見ると お父んの名前は <code>muzudho</code> だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 初期設定したぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 ↓ あとは ここを読めだぜ」</p> <p><a target="_blank" rel="nofollow noopener" href="https://tech-blog.rakus.co.jp/entry/20200529/git">【超入門】初心者のためのGitとGitHubの使い方</a></p> <p>Input:</p> <pre><code class="shell">git config --list </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 初期設定の中身が丸見えだぜ」</p> <h2 id="Git Hub にリポジトリを作ろうぜ(^〜^)?"><a href="#Git+Hub+%E3%81%AB%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86%E3%81%9C%EF%BC%88%EF%BC%BE%E3%80%9C%EF%BC%BE%EF%BC%89%EF%BC%9F">Git Hub にリポジトリを作ろうぜ(^〜^)?</a></h2> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↓ Web ブラウザーで Git Hub を開いて リポジトリーを作っておいたぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://github.com/muzudho/haskell-practice-on-ubuntu">haskell-practice-on-ubuntu</a></p> <h2 id="Ubuntu にローカル・リポジトリを作ろうぜ(^〜^)?"><a href="#Ubuntu+%E3%81%AB%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%BB%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86%E3%81%9C%EF%BC%88%EF%BC%BE%E3%80%9C%EF%BC%BE%EF%BC%89%EF%BC%9F">Ubuntu にローカル・リポジトリを作ろうぜ(^〜^)?</a></h2> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Ubuntu のローカルって、どこよ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 ユーザーのホームになんかないか?」</p> <p>Input:</p> <pre><code class="shell">cd ~ ll </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 いっぱいあるが、ユーザーのホームって どこよ?」</p> <pre><code class="shell">cd Documents ll </code></pre> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 GUI で見ると <code>Home/Documents</code> というところに いろいろ置くといいんじゃない?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 じゃあそこで」</p> <pre><code class="shell">mkdir git_hub cd git_hub mkdir example1 cd example1 git init </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 おっ、 <code>Home/Documents/git_hub/example1</code> フォルダーの中に .git フォルダーが作られたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 ローカル・リポジトリを 新規作成するのではなくて、<br /> Git Hub のリポジトリを クローンしたかったのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 あっ、そうか……」</p> <h2 id="Git Hub のリポジトリをクローンしようぜ(^〜^)?"><a href="#Git+Hub+%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3%E3%81%97%E3%82%88%E3%81%86%E3%81%9C%EF%BC%88%EF%BC%BE%E3%80%9C%EF%BC%BE%EF%BC%89%EF%BC%9F">Git Hub のリポジトリをクローンしようぜ(^〜^)?</a></h2> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↓ Git Hub で こんなコマンドライン コピーしてきたけど、使えるのかな?」</p> <pre><code class="shell">gh repo clone muzudho/haskell-practice-on-ubuntu </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ <code>gh</code> なんていうコマンド無かった」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 カレントディレクトリーを <code>Home/Documents/git_hub</code> へ移動」</p> <pre><code class="shell">git clone https://github.com/muzudho/haskell-practice-on-ubuntu </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 おっ、思ってる通り クローンできたぜ」</p> <h2 id="コミットとプッシュの練習をしようぜ(^〜^)?"><a href="#%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%A8%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AE%E7%B7%B4%E7%BF%92%E3%82%92%E3%81%97%E3%82%88%E3%81%86%E3%81%9C%EF%BC%88%EF%BC%BE%E3%80%9C%EF%BC%BE%EF%BC%89%EF%BC%9F">コミットとプッシュの練習をしようぜ(^〜^)?</a></h2> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Git Hub へ ファイルをアップロードする練習をしなさいよ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>Home/Documents/git_hub/haskell-practice-on-ubuntu</code> へ、フォルダーやファイルを追加して」</p> <p>Input:</p> <pre><code class="plaintext">cd haskell-practice-on-ubuntu git add Docs git commit </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 なんか コメントを入れろと出てきたが 無視したった」</p> <p>Input:</p> <pre><code class="plaintext">git push origin </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ユーザー名と パスワードを入れろと 出てきたな、忘れたな」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 思い出せだぜ!」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ダメだ 認証に失敗する」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ↓ パスワード入力による認証は 削除されたそうよ」</p> <p><a target="_blank" rel="nofollow noopener" href="https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls">HTTPS URL を使用したクローン作成</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 文章を読んだだけで 難しそうだ」</p> <h2 id="Git Hub CLI をインストールしてみようぜ(^〜^)?"><a href="#Git+Hub+CLI+%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%E3%81%9C%EF%BC%88%EF%BC%BE%E3%80%9C%EF%BC%BE%EF%BC%89%EF%BC%9F">Git Hub CLI をインストールしてみようぜ(^〜^)?</a></h2> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↓ なんだか分からないが Git Hub CLI をインストールしてみよう」</p> <p><a target="_blank" rel="nofollow noopener" href="https://docs.github.com/en/github-cli/github-cli/about-github-cli">About GitHub CLI</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Ubuntu って、 Debian ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Ubuntu は Debian ねえ」</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/cli/cli/blob/trunk/docs/install_linux.md">Installing gh on Linux and BSD</a></p> <p>Input:</p> <pre><code class="shell">type -p curl >/dev/null || (sudo apt update && sudo apt install curl -y) curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \ && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \ && sudo apt update \ && sudo apt install gh -y </code></pre> <p>Input:</p> <pre><code class="shell">sudo apt update </code></pre> <p>Input:</p> <pre><code class="shell">sudo apt install gh </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 手順は 踏んだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>gh</code> をインストールしたところで push できないぜ」</p> <pre><code class="shell">gh auth login </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 認証トークンを貼れ、とか出てくるが、なんのことだか」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 逆だ、コマンドラインからウェブ・ブラウザを開いて こっちから 認証コードを打ち込みに行くんだ。認証できた」</p> <p>Input:</p> <pre><code class="shell">git push </code></pre> <p>Output:</p> <pre><code class="plaintext">Everything up-to-date </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 別に何も起こってない」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>git commit</code> 、 nano エディターの使い方が分からんな。コメント入れて保存して」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>git push</code> 、これでどうか?」</p> <h2 id="よく使うコマンド"><a href="#%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">よく使うコマンド</a></h2> <pre><code class="bash">#cd レポジトリのディレクトリ git commit -a </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ <code>git commit -a</code> で ローカルのリポジトリに ぶち込むらしい」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ なんか コメントを打鍵して <code>[Ctrl] + [O]</code> キーで <code>COMMIT_EDITMSG</code> ファイルを保存、<br /> <code>[Ctrl] + [X]</code> キーでエディターを終了」</p> <pre><code class="bash">git push </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ <code>git push</code> で リモートのリポジトリに ぶち上げるらしい」</p> <h1 id="(📅 2023-12-20 ⏰ 19:18) まだ Haskell をインストールできていない"><a href="#%28%F0%9F%93%85+2023-12-20+%E2%8F%B0+19%3A18%29+%E3%81%BE%E3%81%A0+Haskell+%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84">(📅 2023-12-20 ⏰ 19:18) まだ Haskell をインストールできていない</a></h1> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 長いなあ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://marketplace.visualstudio.com/items?itemName=haskell.haskell">VS Code Haskell Extension</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ Visual Studio Code に Haskell の拡張があるらしいんで、それを探してみるか」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.haskell.org/ghcup/">GHCup</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ さらに <code>GHCup</code> の説明を読めとあるぜ」</p> <pre><code class="bash">curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ さらに コマンドを叩けということらしい」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↓ イエスと答え続けていくと コマンドを打てと出てきた」</p> <pre><code class="bash">System requirements Please ensure the following distro packages are installed before continuing (you can exit ghcup and return at any time): build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ エンターキーを押したら処理が進んでるぜ」</p> <pre><code class="bash">=============================================================================== OK! /home/muzudho/.bashrc has been modified. Restart your terminal for the changes to take effect, or type "source /home/muzudho/.ghcup/env" to apply them in your current terminal session. =============================================================================== All done! To start a simple repl, run: ghci To start a new haskell project in the current directory, run: cabal init --interactive To install other GHC versions and tools, run: ghcup tui If you are new to Haskell, check out https://www.haskell.org/ghcup/steps/ </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ どうなった?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.haskell.org/ghcup/steps/">https://www.haskell.org/ghcup/steps/</a></p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ↑ URL を開いたらいいんじゃない?」</p> <pre><code class="bash">ghc --version Command 'ghc' not found, but can be installed with: sudo apt install ghc </code></pre> <pre><code class="bash">ghci --version Command 'ghci' not found, but can be installed with: sudo apt install ghc </code></pre> <pre><code class="bash">ghci Command 'ghci' not found, but can be installed with: sudo apt install ghc </code></pre> <pre><code class="bash">sudo apt install ghc </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ GHC がまだインストールされてなかった?」</p> <pre><code class="bash">ghc --version The Glorious Glasgow Haskell Compilation System, version 8.8.4 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ このハスケルが新しいか、ネットで調べるか」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://wiki.haskell.org/Haskell">https://wiki.haskell.org/Haskell</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 9.4.8 にアップデートするには どうすればいい?」</p> <pre><code class="bash">curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 分からんから もう1回コマンドを叩いて アペンドする」</p> <pre><code class="bash">ghci GHCi, version 8.8.4: https://www.haskell.org/ghc/ :? for help Prelude> </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ ダメだ 古いやつが入ってしまう」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.haskell.org/ghc/blog/20231009-ghc-9.8.1-released.html">https://www.haskell.org/ghc/blog/20231009-ghc-9.8.1-released.html</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ こいつを どうやってインストールするか 調べてみるか」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 分からん」</p> <pre><code class="haskell">ghci GHCi, version 8.8.4: https://www.haskell.org/ghc/ :? for help Prelude> main = putStrLn "Hello, Haskell!" Prelude> Prelude> main Hello, Haskell! Prelude> </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 自分が何をやっているのか分からん」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.haskell.org/ghcup/steps/">https://www.haskell.org/ghcup/steps/</a></p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ハスケルのファイル名は <code>hello.hs</code> みたいに名付けるそうよ」</p> <p>🗒 <code>hello.hs</code> :</p> <pre><code class="hs">main = putStrLn "Hello, Haskell!" </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ テキストファイルは こんなんでいいのかだぜ?」</p> <pre><code class="bash">ghc hello.hs </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ コンパイルが必要なようだぜ。 <code>hello</code>, <code>hello.hi</code>, <code>hello.o</code> ファイルが生成されたぜ」</p> <pre><code class="bash">./hello Hello, Haskell! </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ <code>hello</code> コマンドができたのかだぜ? あっ、動いた」</p> <h2 id="ハスケルの構文とか何も分からん"><a href="#%E3%83%8F%E3%82%B9%E3%82%B1%E3%83%AB%E3%81%AE%E6%A7%8B%E6%96%87%E3%81%A8%E3%81%8B%E4%BD%95%E3%82%82%E5%88%86%E3%81%8B%E3%82%89%E3%82%93">ハスケルの構文とか何も分からん</a></h2> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>ghci</code> がインタープリター・モードになってんじゃないの? それで練習するんじゃないの?」</p> <pre><code class="ghci">ghci GHCi, version 8.8.4: https://www.haskell.org/ghc/ :? for help Prelude> 1 + 1 2 Prelude> putStrLn "Hello, world!" Hello, world! </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ そのようだなあ」</p> <pre><code class="hs">Prelude> double x = x + x Prelude> double 2 4 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 数を2倍にする double 関数を作って 実行したようだぜ、飽きてきた」</p> <pre><code class="hs">Prelude> :{ Prelude| map f list = Prelude| case list of Prelude| [] -> [] Prelude| x : xs -> f x : map f xs Prelude| :} Prelude> Prelude> Prelude> </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ どうやって このモードから抜ける?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/Izawa_/items/6fc0a7583dc71be48c2a">GHCiの基本的な使い方まとめ</a></p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 <code>:q</code> じゃないの?」</p> <pre><code class="hs">Prelude> :q Leaving GHCi. </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 確かに」</p> <pre><code class="hs">Prelude> :{ Prelude| map f list = Prelude| case list of Prelude| [] -> [] Prelude| x : xs -> f x : map f xs Prelude| :} Prelude> map <interactive>:7:1: error: • No instance for (Show ((t0 -> a0) -> [t0] -> [a0])) arising from a use of ‘print’ (maybe you haven't applied a function to enough arguments?) • In a stmt of an interactive GHCi command: print it Prelude> map (+1) [1, 2, 3] [2,3,4] </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 抜けたらダメだった 続けるのだった」</p> <pre><code class="hs">Prelude> :load hello.hs [1 of 1] Compiling Main ( hello.hs, interpreted ) Ok, one module loaded. *Main> main Hello, Haskell! </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ ファイルの読み込み」</p> <pre><code class="hs">*Main> import Data.Bits *Main Data.Bits> shiftL 32 1 64 *Main Data.Bits> clearBit 33 0 32 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ モジュールをインポートして論理左シフトか?」</p> <pre><code class="hs">:type putStrLn putStrLn :: String -> IO () </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 型のヘルプでも見てんのか?」</p> <pre><code class="hs">:quit Leaving GHCi. </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 終了」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 練習が全然足りないな」</p> <h1 id="キャベルもスタックも無い"><a href="#%E3%82%AD%E3%83%A3%E3%83%99%E3%83%AB%E3%82%82%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%82%E7%84%A1%E3%81%84">キャベルもスタックも無い</a></h1> <pre><code class="shell">cabal repl --build-depends async,say Command 'cabal' not found, but can be installed with: sudo apt install cabal-install stack exec --package async --package say -- ghci Command 'stack' not found, but can be installed with: sudo apt install haskell-stack </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ キャベルもスタックも無いが?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Visual Studio の拡張ですからねえ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.haskell.org/ghcup/install/">https://www.haskell.org/ghcup/install/</a></p> <p>📺 <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=bB4fmQiUYPw">https://www.youtube.com/watch?v=bB4fmQiUYPw</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 動画もあるが Windows で参考にならねー。飽きてきた」</p> <pre><code class="bash">curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh </code></pre> <pre><code class="bash">[ Warn ] [GHCup-00110] ghc-9.4.7 is already installed; if you really want to reinstall it, you may want to run 'ghcup install ghc --force 9.4.7' [ Info ] GHC 9.4.7 successfully set as default version [ Warn ] [GHCup-00110] cabal-3.6.2.0-p1 is already installed; if you really want to reinstall it, you may want to run 'ghcup install cabal --force 3.6.2.0-p1' </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ cabel はインストールされてるらしいが、コマンドは無い」</p> <pre><code class="bash">ghcup install cabal --force 3.6.2.0-p1 ghcup: command not found </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ <code>ghcup</code> コマンドも無いぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 <strong>Visual Studio Code を再起動</strong> してみては?」</p> <pre><code class="bash">ghcup --version The GHCup Haskell installer, version 0.1.20.0 </code></pre> <pre><code class="bash">ghc --version The Glorious Glasgow Haskell Compilation System, version 9.4.7 </code></pre> <pre><code class="bash">ghci --version The Glorious Glasgow Haskell Compilation System, version 9.4.7 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ インストールされてる……」</p> <pre><code class="bash">cabal repl --build-depends async,say </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 何をやってるか分からないが コマンドを叩くぜ」</p> <pre><code class="bash">Resolving dependencies... Build profile: -w ghc-9.4.7 -O1 In order, the following will be built (use -v for more details): - hashable-1.4.3.0 (lib) (requires download & build) - say-0.1.0.1 (lib) (requires download & build) - async-2.2.5 (lib) (requires download & build) - fake-package-0 (lib) (first run) Downloading hashable-1.4.3.0 Downloaded hashable-1.4.3.0 Downloading async-2.2.5 Starting hashable-1.4.3.0 (lib) Building hashable-1.4.3.0 (lib) Downloaded async-2.2.5 Downloading say-0.1.0.1 Downloaded say-0.1.0.1 Starting say-0.1.0.1 (lib) Building say-0.1.0.1 (lib) Installing hashable-1.4.3.0 (lib) Installing say-0.1.0.1 (lib) Completed hashable-1.4.3.0 (lib) Starting async-2.2.5 (lib) Completed say-0.1.0.1 (lib) Building async-2.2.5 (lib) Installing async-2.2.5 (lib) Completed async-2.2.5 (lib) Configuring library for fake-package-0.. Preprocessing library for fake-package-0.. Warning: No exposed modules GHCi, version 9.4.7: https://www.haskell.org/ghc/ :? for help Loaded GHCi configuration from /tmp/cabal-repl.-149129/setcwd.ghci ghci> </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 何のこっちゃ」</p> <pre><code class="hs">ghci> import Control.Concurrent.Async ghci> import Say ghci> concurrently_ (sayString "Hello") (sayString "World") Hello World </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 並行処理をしたんかな?」</p> <pre><code class="bash">:quit Leaving GHCi. </code></pre> <pre><code class="bash">cabal install --lib async say --package-env . </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ 何をやってるか分からないが コマンドを叩くぜ」</p> <pre><code class="bash">Warning: Unknown/unsupported 'ghc' version detected (Cabal 3.6.2.0 supports 'ghc' version < 9.4): /home/muzudho/.ghcup/bin/ghc is version 9.4.7 Warning: Unknown/unsupported 'ghc' version detected (Cabal 3.6.2.0 supports 'ghc' version < 9.4): /home/muzudho/.ghcup/bin/ghc is version 9.4.7 Resolving dependencies... Up to date </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ だんだん 嫌になってきた」</p> <h1 id="パッケージを作る?"><a href="#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E3%82%8B%EF%BC%9F">パッケージを作る?</a></h1> <pre><code class="bash">mkdir haskell-project cd haskell-project cabal init --interactive </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ わけもわからず打鍵」</p> <pre><code class="bash">Should I generate a simple project with sensible defaults? [default: y] Guessing dependencies... Generating LICENSE... Warning: unknown license type, you must put a copy in LICENSE yourself. Generating CHANGELOG.md... Generating src/MyLib.hs... Generating app/Main.hs... Generating haskell-project.cabal... Warning: no synopsis given. You should edit the .cabal file and add one. You may want to edit the .cabal file and add a Description field. </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ なんのこっちゃ」</p> <p>Input:</p> <pre><code class="bash">cabal build </code></pre> <p>Output:</p> <pre><code class="bash">Warning: Unknown/unsupported 'ghc' version detected (Cabal 3.6.2.0 supports 'ghc' version < 9.4): /home/muzudho/.ghcup/bin/ghc is version 9.4.7 Resolving dependencies... Build profile: -w ghc-9.4.7 -O1 In order, the following will be built (use -v for more details): - haskell-project-0.1.0.0 (lib) (first run) - haskell-project-0.1.0.0 (exe:haskell-project) (first run) Configuring library for haskell-project-0.1.0.0.. Preprocessing library for haskell-project-0.1.0.0.. Building library for haskell-project-0.1.0.0.. [1 of 1] Compiling MyLib ( src/MyLib.hs, /home/muzudho/Documents/git_hub/haskell-practice-on-ubuntu/haskell-project/dist-newstyle/build/x86_64-linux/ghc-9.4.7/haskell-project-0.1.0.0/build/MyLib.o, /home/muzudho/Documents/git_hub/haskell-practice-on-ubuntu/haskell-project/dist-newstyle/build/x86_64-linux/ghc-9.4.7/haskell-project-0.1.0.0/build/MyLib.dyn_o ) Configuring executable 'haskell-project' for haskell-project-0.1.0.0.. Preprocessing executable 'haskell-project' for haskell-project-0.1.0.0.. Building executable 'haskell-project' for haskell-project-0.1.0.0.. [1 of 1] Compiling Main ( app/Main.hs, /home/muzudho/Documents/git_hub/haskell-practice-on-ubuntu/haskell-project/dist-newstyle/build/x86_64-linux/ghc-9.4.7/haskell-project-0.1.0.0/x/haskell-project/build/haskell-project/haskell-project-tmp/Main.o ) [2 of 2] Linking /home/muzudho/Documents/git_hub/haskell-practice-on-ubuntu/haskell-project/dist-newstyle/build/x86_64-linux/ghc-9.4.7/haskell-project-0.1.0.0/x/haskell-project/build/haskell-project/haskell-project </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ なんのこっちゃ」</p> <p>Input:</p> <pre><code class="bash">cabal run </code></pre> <p>output:</p> <pre><code class="plaintext">Up to date Hello, Haskell! someFunc </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ なんのこっちゃ」</p> <h1 id="依存性の追加"><a href="#%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E8%BF%BD%E5%8A%A0">依存性の追加</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>haskell-project.cabal</code> ファイルを Visual Studio Code で開くぜ」</p> <p>🗒 <code>haskell-project.cabal</code>:</p> <pre><code class="cabal">cabal-version: 2.4 name: haskell-project version: 0.1.0.0 -- A short (one-line) description of the package. -- synopsis: -- A longer description of the package. -- description: -- A URL where users can report bugs. -- bug-reports: -- The license under which the package is released. -- license: author: muzudho maintainer: [email protected] -- A copyright notice. -- copyright: -- category: extra-source-files: CHANGELOG.md library exposed-modules: MyLib -- Modules included in this library but not exported. -- other-modules: -- LANGUAGE extensions used by modules in this package. -- other-extensions: build-depends: base ^>=4.17.2.0 hs-source-dirs: src default-language: Haskell2010 executable haskell-project main-is: Main.hs -- Modules included in this executable, other than Main. -- other-modules: -- LANGUAGE extensions used by modules in this package. -- other-extensions: build-depends: base ^>=4.17.2.0, haskell-project hs-source-dirs: app default-language: Haskell2010 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ なんのこっちゃ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>src/MyLib.hs</code> ファイルを Visual Studio Code で開くぜ」</p> <p>🗒 <code>src/MyLib.hs</code> :</p> <pre><code class="hs">module MyLib (someFunc) where import System.Directory someFunc :: IO () someFunc = do contents <- listDirectory "src" putStrLn (show contents) </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ なんのこっちゃ」</p> <h2 id="モジュールの追加"><a href="#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0">モジュールの追加</a></h2> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 以下のファイルを新規作成しろとのことだぜ」</p> <p>🗒 <code>src/OtherLib.hs</code> :</p> <pre><code class="hs">module OtherLib where otherFunc :: String -> Int otherFunc str = length str </code></pre> <pre><code class="bash">cabal repl ghci> import OtherLib <no location info>: error: Could not find module ‘OtherLib’ It is not a module in the current program, or in any known package.``` </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ ダメだ エラーだ 終わった」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 何やってんの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 わからない。コピー貼り付けしてるだけ」</p> <p>🗒 <code>haskell-project.cabal</code>:</p> <pre><code class="cabal">library exposed-modules: MyLib </code></pre> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ↑ この部分を」</p> <p>🗒 <code>haskell-project.cabal</code>:</p> <pre><code class="cabal">library exposed-modules: MyLib OtherLib </code></pre> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 ↑ こう書き換えたらいいんじゃない?」</p> <pre><code class="bash">cabal repl Resolving dependencies... Build profile: -w ghc-9.4.7 -O1 In order, the following will be built (use -v for more details): - haskell-project-0.1.0.0 (lib) (configuration changed) Configuring library for haskell-project-0.1.0.0.. Preprocessing library for haskell-project-0.1.0.0.. GHCi, version 9.4.7: https://www.haskell.org/ghc/ :? for help [1 of 2] Compiling MyLib ( src/MyLib.hs, interpreted ) [2 of 2] Compiling OtherLib ( src/OtherLib.hs, interpreted ) Ok, two modules loaded. ghci> import OtherLib ghci> otherFunc "Hello Haskell" 13 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↑ なんか動いた。何をやってるか分からないぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 エグザンプルは ここで終わってるぜ。あとは勝手に調べろとのことだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 サンプル・プログラムを探そうぜ?」</p> <h1 id="(📅 2023-12-23 sat) サンプル・プログラムを探そうぜ?"><a href="#%28%F0%9F%93%85+2023-12-23+sat%29+%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%8E%A2%E3%81%9D%E3%81%86%E3%81%9C%EF%BC%9F">(📅 2023-12-23 sat) サンプル・プログラムを探そうぜ?</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ↓ ハスケルの素人はこれを観ろ、ということだぜ」</p> <ul> <li>📖 <a target="_blank" rel="nofollow noopener" href="https://github.com/haskell-beginners-2022/course-plan">https://github.com/haskell-beginners-2022/course-plan</a> <ul> <li>📺 <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=6MsQcUprO9o&list=PLOJjn67NeYg9cWA4hyIWcxfaeX64pwo1c">Haskell Beginners 2022: Lecture 1</a> - 1時間23分</li> </ul></li> </ul> <h2 id="FP - Functional Programming"><a href="#FP+-+Functional+Programming">FP - Functional Programming</a></h2> <pre><code>fx(x) = x^2 </code></pre> <p>プログラミングの関数は、この数学の関数ではない</p> <ul> <li>無限ループでハングするから</li> <li>副作用があるから</li> <li>例外があるから</li> <li>メモリがなくなるから</li> </ul> <p>プログラミングの関数は</p> <ul> <li><p>ブロックを組み立てるようなもの</p> <ul> <li>Define</li> <li>Call</li> <li>Compose</li> <li>Pass as an argument</li> <li>Inspect</li> </ul></li> <li><p>FP Concepts</p> <ul> <li>Higher-Order Functions (HOF)</li> <li>Algebraic Data Types (ADT)</li> <li>Pattern Matching</li> <li>Purity</li> <li>Immutability</li> <li>Totality</li> <li>Laziness</li> </ul></li> <li><p>Haskell Features</p> <ul> <li>Static typing</li> <li>Polymorphisms</li> <li>Type inference</li> <li>Layout-sensitivity</li> <li>ML syntax</li> <li>Automatic currying</li> <li>Garbabe collector</li> <li>Green threads</li> <li>Software Transactional memory (STM)</li> <li>etc...</li> </ul></li> <li><p>Haskell Toolchain</p> <ul> <li>GHC (Glasgow Haskell Compiler) - the compiler</li> <li>GHCi (GHC interactive) - interactive interpreter aka REPL(Read-Eval-Print-Loop)</li> <li>cabal - a Haskell build tool, the .......</li> <li>stack</li> <li>HLS (Haskell Language Server)</li> <li>ghcup</li> </ul></li> <li><p>Haskell Toolchain / GHCi</p> <ul> <li>Arithmetic</li> <li>Logic</li> <li>Calling functions <ul> <li><code>()</code> are important!</li> </ul></li> <li>Types - 式は型を持つ。 <code>:t</code> や <code>:tpye</code> で型を見れる。 型の型は見れない</li> <li>Types of numbers - <code>:t +d</code> で調べる</li> <li><p>Types of functions -> <code>:t div</code> より、 <code>:t +d div</code> を使って調べる。2項の引数のとき、見やすい</p></li> <li><p>List</p> <ul> <li>List literals - <code>[]</code> の話。 <code>[] ++ []</code> とか</li> <li>List: head/tail/last/init <ul> <li>空リストの head は例外</li> </ul></li> <li>List: more functions <ul> <li>reverse</li> <li>take</li> <li>drop</li> <li>null</li> <li>elem</li> <li>concat</li> <li>length</li> <li><code>!!</code> - この操作は処理が遅い。インデックスを使ったランダムアクセスか?</li> </ul></li> <li>List: ranges <ul> <li><code>[1 .. 10]</code> や、 <code>[1, 3 .. 20]</code></li> <li><code>[10 .. 1]</code> は空っぽ。 <code>[10, 9 .. 1]</code> はできる</li> <li><code>[0 .. ]</code> インフィニティもできる</li> </ul></li> </ul></li> </ul></li> <li><p>Lazy evaluation</p> <ul> <li><code>take 3 [0 .. ]</code> で、 <code>[0, 1, 2]</code></li> <li><code>take 3 (drop 5 [0 .. ]</code> で、<code>[5,6,7]</code></li> <li><code>length [0 .. ]</code> - 終わらない。無限のリストには注意</li> </ul></li> <li><p>ディスプレイの信号が消えた</p></li> <li><p>Syntax</p> <ul> <li>Define a function</li> <li>Loading a module</li> </ul></li> <li><p>Packages</p> <ul> <li>module</li> <li>package</li> <li>Hackage</li> <li>base</li> <li>prelude</li> </ul></li> <li><p>if-then-else</p> <ul> <li><code>def list = if null list then def else head list</code></li> </ul></li> </ul> <pre><code class="hs">headOfDefault def list = if null list then def else head list </code></pre> <ul> <li>続き <ul> <li>guards - マッチ構文みたいなやつ</li> </ul></li> </ul> <pre><code>sign n | 略 </code></pre> <ul> <li><p>続き</p> <ul> <li><code>let-in</code> - リストに含まれているか調べる?</li> <li><code>where</code> - 関数定義で使う?</li> <li><code>immutablirity</code> - 1回だけ代入できるというもの</li> <li>How do you change if you can't? <ul> <li>Recursion</li> <li>No more loops</li> </ul></li> </ul></li> <li><p>Higher-order functions</p> <ul> <li>First-Class Functions</li> <li>Lambda functions</li> <li>Partial application</li> <li>Standard HOFs <ul> <li>map</li> <li>filter even</li> <li>filter</li> <li>any</li> <li>concatMap replicate</li> <li>take iterate</li> </ul></li> <li>Functions inside lists</li> <li>Recap: GHCi commands <ul> <li><code>:q</code></li> <li><code>:t</code></li> <li><code>:t +d</code></li> <li><code>:l</code></li> <li><code>:i</code></li> </ul></li> <li>More sources</li> </ul></li> </ul> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 フーム」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 ↓ 基礎勉強は もういいだろ、コンピューター将棋を作ろうぜ?」</p> <p>📖 <a href="https://crieit.net/posts/Haskell-o">Haskell でコンピューター将棋を作ろうぜ(^o^)?</a></p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 レクチャーの動画は あと3本 あるみたいよ?</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 基礎勉強ばっかりだと飽きるんで 並行してやろう」</p> <h1 id="レクチャー2"><a href="#%E3%83%AC%E3%82%AF%E3%83%81%E3%83%A3%E3%83%BC%EF%BC%92">レクチャー2</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 すぐ 詰まる。動画見よ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=rf-lie7U04Q">Haskell Beginners 2022: Lecture 2</a></p> <ul> <li>Pattern Matching <ul> <li>Pattern</li> <li><code>case-of</code> - スイッチ文みたいなやつか?</li> </ul></li> </ul> <pre><code class="hs">eval :: Char -> Int -> Int -> Int eval op x y = case op of '+' -> x + y '-' -> x - y '*' -> x * y '/' -> div x y _ -> 0 </code></pre> <ul> <li><p>続き</p> <ul> <li>Patterns on lists</li> <li>Structural List Patterns</li> <li>Heads or Tails?</li> <li>List Recursion</li> <li><code>What's wrong, Haskell?</code> - 書き方でコンパイル・エラーが出る例、エラーは出ないが悪い書き方の例</li> <li><code>Totality</code> - すべての入力に対して出力が定義されていることか? <ul> <li><code>Partial</code> - 非 total</li> </ul></li> </ul></li> <li><p>Data</p> <ul> <li>Tuples</li> <li>Working with tuples</li> <li>Algebraic Data Type (ADT) <ul> <li><code>Product Type</code> - 異なる型などを結合したもの <ul> <li><code>data: Product</code></li> <li><code>data: Working with data</code> - セッターとゲッターの書き方</li> <li><code>data: Records</code> - 構造体みたいなもん</li> </ul></li> <li><code>Sum Type</code> <ul> <li><code>Sum Types: Enumerations</code> - いわゆる列挙型</li> <li><code>Sum Types</code> - Result とか</li> <li><code>Recursive data types</code> <ul> <li><code>Empty list</code></li> <li><code>An eleement prepended to a list</code></li> </ul></li> <li><code>type</code> - type キーワード。型の別名? 式が見やすくなる</li> <li><code>newtype</code> - コンストラクタの別名??</li> </ul></li> </ul></li> </ul></li> <li>Polymorphism <ul> <li><code>Parametric polymorphism</code> - ジェネリクスみたいなやつ</li> <li><code>Real types</code></li> <li><code>Hoogle</code> - Haskell Search Engine</li> <li><code>Polymorphic types</code></li> <li><code>Common types</code> - Optional Value とか、左右とか</li> <li><code>Common Functions</code></li> </ul></li> <li>Back to Functions <ul> <li><code>Eta-reduction, part1</code></li> <li><code>Eta-reduction, part2</code></li> <li><code>Function Composition</code> <ul> <li><code>ELI5 Composition</code></li> </ul></li> <li><code>Composition + Eta-reduction</code></li> <li>More sources</li> </ul></li> </ul> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 はー、ふーん、うーん?」</p> <h1 id="レクチャー3"><a href="#%E3%83%AC%E3%82%AF%E3%83%81%E3%83%A3%E3%83%BC%EF%BC%93">レクチャー3</a></h1> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=Vs-vvlYLtRI">Haskell Beginners 2022: Lecture 3</a></p> <ul> <li>Common properties</li> <li>Polimorphisms <ul> <li><code>Parametric Polymorphism</code></li> <li><code>Ad-hoc polymorphism</code></li> </ul></li> <li>class</li> <li>instance</li> <li>Separation of concerns <ul> <li>data</li> <li>class</li> <li>instance</li> </ul></li> <li>Default methods</li> <li>Not Java Interfaces</li> <li><code>{-# LANGUAGE #-}</code> - ランゲージ・プラグマ。</li> <li>Standard Typeclasses <ul> <li>Eq</li> <li><code>Ord</code> - Ordering 比較演算子 <ul> <li>LT</li> <li>EQ</li> <li>GT</li> </ul></li> <li>Show</li> <li>Read</li> <li>Bounded</li> <li>Enum</li> <li>Num</li> </ul></li> <li>Type interface <ul> <li><code>deriving</code> - 派生</li> <li>Generaliz(s)edNewtypeDeriving</li> <li>Algebra <ul> <li><code><></code> - ダイヤモンド演算子</li> </ul></li> <li>newtype again</li> </ul></li> <li>Everything is Semigroup, Okay, not really everything... <ul> <li><code>Semigroup</code></li> </ul></li> <li>Algebra, part2 <ul> <li><code>Monoid</code></li> <li>Not everything is Monoid</li> </ul></li> <li>Modules</li> <li>Kind <ul> <li>Be kind to us, Haskell <ul> <li><code>Kind</code> - a type of a type</li> <li>Kindly check your types</li> </ul></li> </ul></li> <li>typeclass for type constructors</li> <li>Functor</li> <li><code>Functor laws</code> - 10種類 <ul> <li><code>1: Identity</code></li> <li><code>2: Composition</code></li> </ul></li> <li>Folds <ul> <li><code>ステップ関数</code></li> <li>Everything is a Fold</li> <li>How foldr folds <ul> <li>コンスピレーター</li> </ul></li> <li>How foldl/foldl' folds</li> <li>foldr vs foldl</li> <li>Foldable</li> </ul></li> <li>Strict evaluation <ul> <li><code>等式推論</code></li> </ul></li> <li><code>{-# LANGUAGE BangPatterns #-}</code></li> <li>Use strict/lazy evaluation wise.....</li> <li>More sources</li> </ul> <h1 id="レクチャー4"><a href="#%E3%83%AC%E3%82%AF%E3%83%81%E3%83%A3%E3%83%BC%EF%BC%94">レクチャー4</a></h1> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=12D4Y2Hdnhg">Haskell Beginners 2022: Lecture 4</a></p> <ul> <li>Monad: The Idea <ul> <li>Maybe, yes? Maybe, no? <ul> <li><code>andThen</code> - Ordinary helper function</li> <li>ワンライナーで書けるようになる</li> </ul></li> <li>Either way</li> <li>Multiple combinations</li> <li>It there a pattern?</li> <li>What to do when we see a pattern? <ul> <li><code>1. Nothing</code></li> <li><code>2. Recognize</code></li> <li><code>3. Copy-paste</code></li> <li><code>4. Abstract</code></li> <li><code>5. Put in a library</code></li> </ul></li> </ul></li> <li>Monad is a pattern <ul> <li>数学の圏論と違う。 Haskell は概念を借りてきただけ。</li> <li>Monad</li> <li><code>return</code> も関数</li> <li>Just a typeclass</li> <li>Instance</li> <li>Laws</li> </ul></li> <li>Generalizing <ul> <li><code>(:[])</code> - robot monkey operator</li> </ul></li> <li>Refactoring</li> <li>Actually, in Haskell... <ul> <li><code>pure</code> - ハスケルでは return の代わりに pure をよく使う</li> </ul></li> <li>And that's the Monad</li> <li>Real World <ul> <li><code>Purity</code> - 純粋。副作用がない関数。 <ul> <li><code>1. Determinism</code></li> <li><code>2. Easier reasoning</code></li> <li><code>3. Simpler testing</code></li> <li><code>4. Composability</code></li> <li><code>5. Optimizations</code></li> <li><code>6. Parallelism</code></li> </ul></li> <li>Purity + Laziness <ul> <li><code>getLine</code></li> </ul></li> <li>Input/Output(IO)</li> <li>Concept of IO</li> <li>How to run IO? <ul> <li><code>unit type</code> - 空の丸括弧</li> </ul></li> <li>How to run Haskell programs? <ul> <li><code>main</code> - メイン関数</li> <li>ハローワールド</li> <li>Printing twice</li> </ul></li> <li><code>do 構文</code> - do-notation <ul> <li><code>let-in rule</code></li> <li><code>Example with do</code></li> </ul></li> </ul></li> <li>Cabal - カバール <ul> <li>独自の形式。拡張子は <code>.cabal</code></li> <li><code>app</code> フォルダーと、 <code>src</code> フォルダーに分ける。 app は実行可能で、 src はライブラリーか?</li> <li>Typical main</li> <li><code>build-depends</code> <ul> <li><code>Hackage</code> - ユーザー作成のパッケージが置いてる?</li> </ul></li> </ul></li> <li><code>Functional,Imperative</code> <ul> <li><code>Imperative style</code> - 命令型スタイル</li> <li><code>Functional style</code> - 関数型スタイル</li> </ul></li> <li>More sources</li> </ul> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ふーむむむ?」</p> <h1 id="次の関連記事"><a href="#%E6%AC%A1%E3%81%AE%E9%96%A2%E9%80%A3%E8%A8%98%E4%BA%8B">次の関連記事</a></h1> <p>📖 <a href="https://crieit.net/posts/Haskell-o">Haskell でコンピューター将棋を作ろうぜ(^o^)?</a></p> <p>.</p> むずでょ tag:crieit.net,2005:PublicArticle/18568 2023-09-16T16:59:25+09:00 2023-09-16T20:27:22+09:00 https://crieit.net/posts/Ubuntu-o Ubuntu を使おうぜ(^o^)? <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Ubuntu を使おうぜ、うわっ、なんだ 解像度 荒っ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 なんだぜ この赤紫のデスクトップ画面は?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Windows に戻しましょう!」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 まだ Windows や 日本語のようなマルチバイト文字に対応していない<br /> 海外製のソフトが いろいろ あるんだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Windows Paint はどこにあるの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👇 無い。代替品を使うことになるぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/kaitaku/items/dd20c292c903b4b62b17">Linuxでもペイントは使えるんやで</a></p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 Pinta のインストール時に、エラーが出た」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Mono 6.10 か、それ以上のバージョンが要るのかだぜ?」</p> <pre><code class="shell"># 既にインストールされているか確認 mono --version </code></pre> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://github.com/mono/mono">mono</a><br /> 📖 <a target="_blank" rel="nofollow noopener" href="https://www.mono-project.com/docs/compiling-mono/linux/">Compiling Mono on Linux</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ターボールをダウンロードしとけって書いてるな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👇 じゃあ <code>mono-6.12.0.199.tar.xz</code> をダウンロードしてみるかだぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://download.mono-project.com/sources/mono/">sources / mono</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>Home/Downloads</code> にダウンロードされたようだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 本当か? コマンドラインで確認しろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ターボールが入っていることを確認」</p> <pre><code class="shell"># インストールに必要なものを、先にインストール sudo apt-get install git autoconf libtool automake build-essential gettext cmake python3 curl # 環境変数設定 PREFIX=~/Downloads VERSION=6.12.0.199 # 解凍 tar xvf mono-$VERSION.tar.xz # 解凍したディレクトリーへ移動 cd mono-$VERSION # 構成ファイルをカスタマイズ ./configure --prefix=$PREFIX # インストーラーの作成(風呂の湯船に浸かれるぐらい長時間かかる) make #インストール make install </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 これで mono はインストールできたのかだぜ?」</p> <pre><code class="shell">mono --version Command 'mono' not found, but can be installed with: sudo apt install mono-runtime </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 まだ足らんものがあるのか」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 コマンドがなんか書いてあるぜ、打ってみろ」</p> <pre><code class="shell">sudo apt install mono-runtime mono --version Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-3.2 Wed Jun 30 05:34:49 UTC 2021) Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com TLS: __thread SIGSEGV: altstack Notifications: epoll Architecture: amd64 Disabled: none Misc: softdebug Interpreter: yes LLVM: supported, not enabled. Suspend: hybrid GC: sgen (concurrent by default) </code></pre> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👆 バージョン 6.12 を入れたのに、なんで 6.8 が入ってるんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👇 分からん。アップデートしたろ」</p> <pre><code class="shell">sudo apt update apt list --upgradable </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 mono のバージョンは変わらん」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 この Ubuntu のバージョンは いくつなの?」  </p> <pre><code class="shell">lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 22.04 だぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 この記事を見て やり直したら?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.mono-project.com/download/stable/#download-lin-ubuntu">Mono / Download</a></p> <pre><code class="shell"># 必要なものを先にインストール sudo apt install ca-certificates gnupg # ダウンロード元が安全か、証明書を更新 sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/mono-official-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF echo "deb [signed-by=/usr/share/keyrings/mono-official-archive-keyring.gpg] https://download.mono-project.com/repo/ubuntu stable-focal main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list # 更新 sudo apt update # 更新を確認 apt list --upgradable </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 こっから また mono インストールすんの?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 また風呂に入れるな」</p> <pre><code class="shell"># 構成ファイルをカスタマイズ ./configure --prefix=$PREFIX # インストーラーの作成(風呂の湯船に浸かれるぐらい長時間かかる) make #インストール make install </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 また 6.8 だった。理由はわからない」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 なんで インストールしたいだけなのに<br /> ソースから make の手順をふまなくちゃいけないわけ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Git Hub なんか読んだのがいけなかったのかもしれない」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 👇 これだけでいいのでは?」</p> <pre><code class="shell">sudo apt install mono-devel </code></pre> <pre><code class="shell">mono --version Mono JIT compiler version 6.12.0.200 (tarball Tue Jul 11 21:37:50 UTC 2023) Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com TLS: __thread SIGSEGV: altstack Notifications: epoll Architecture: amd64 Disabled: none Misc: softdebug Interpreter: yes LLVM: yes(610) Suspend: hybrid GC: sgen (concurrent by default) </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 そのコマンドを知ってたら わたしは風呂に入らなくてよかったかもしれない」</p> <h1 id="mono 6.12 はインストールできたぜ。次は?"><a href="#mono+6.12+%E3%81%AF%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%9F%E3%81%9C%E3%80%82%E6%AC%A1%E3%81%AF%EF%BC%9F">mono 6.12 はインストールできたぜ。次は?</a></h1> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 これで mono はインストールできたかな?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 次は Pinta ね」</p> <pre><code class="shell"># Pintaのレポジトリ取得 sudo add-apt-repository ppa:pinta-maintainers/pinta-stable # アップデート # sudo apt-get update # インストール # sudo apt-get install pinta </code></pre> <pre><code class="plaintext">Note: this PPA only provides GTK2 builds of Pinta (1.7.x) and is no longer updated for Pinta 2.0 and later. Installing the flatpak or snap package is recommended instead. </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 あれっ、 <code>Pinta</code> なんかもう更新されてないから<br /> 代わりに <code>flatpak</code> か <code>snap</code> のソース管理ツールからインストールしろ マヌケ って書いてあるぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 マヌケとは書いてないな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 個人開発者の作ったアプリは いずれ更新されなくなるのよ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 ダラの Crieit とかも そうだな」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 そういう点では 最後に Microsoft が勝つのか」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 やっぱ 開発以外に柱となる事業を他に2つぐらいやっていて、<br /> そっちで利益が上がって会社の経営が安定しているときが<br /> 開発も安定するんじゃないかな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 それか 標準化されていて オープンソースになっていて<br /> 企業から支援されるようなミドルウェアか」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 いいの無いんだったら GIMP にするが?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 GIMP は手軽に使えないから Windows Paint の代わりに<br /> ならないだろ?<br /> GIMP の開発元のライバル会社が Krita を作ってるから<br /> Krita を調べてみようぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 GIMP にしようと言ってる人に Krita 勧めるの わらう」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://krita.org/jp/">Krita</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>krita-5.1.5-x86_64.appimage</code> なんかダウンロードしても<br /> このあと どうすりゃいいんだぜ?<br /> Linux ディストリビューションの文化は 分からないぜ?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://virment.com/how-to-use-appimage-linux/">LinuxでAppImage形式のアプリを使う方法と注意点のまとめ</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 実行権限を付ける必要があるのか」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>Home</code> の下に <code>Muzudho Apps</code> というフォルダーを作って<br /> そこへ <code>krita-5.1.5-x86_64.appimage</code> ファイルを移動しておくぜ」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 あれっ、これ 圧縮ファイルかだぜ?」</p> <pre><code class="shell"># 解凍 muzudho@muzudho-MS-7B09:~/Muzudho Apps$ ./krita-5.1.5-x86_64.appimage --appimage-extract </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 <code>AppRun</code> ファイルが出てきた」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 実行したら スプラッシュ画面が出てきて すぐ消えた」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 それを不具合という」</p> <pre><code class="shell">muzudho@muzudho-MS-7B09:~/Muzudho Apps/squashfs-root$ ./AppRun QObject::startTimer: Timers cannot have negative intervals Could not find platform independent libraries <prefix> Could not find platform dependent libraries <exec_prefix> Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>] Python path configuration: PYTHONHOME = (not set) PYTHONPATH = '/home/muzudho/.local/share/krita/:/home/muzudho/Muzudho Apps/squashfs-root/usr/share/krita/:/home/muzudho/.local/share/krita/pykrita/:/home/muzudho/Muzudho Apps/squashfs-root/usr/share/krita/pykrita/:/home/muzudho/Muzudho Apps/squashfs-root/usr/share/pykrita/:/home/muzudho/Muzudho Apps/squashfs-root/usr/lib/krita-python-libs' program name = 'python3' isolated = 0 environment = 1 user site = 1 import site = 1 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 Python がなにか関係ある?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Python 入れりゃ分かんじゃないの?」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.python.jp/install/ubuntu/index.html">Ubuntu環境のPython</a></p> <pre><code class="shell"># 環境を更新 sudo apt update # インストールに必要なものを先にインストール sudo apt install build-essential libbz2-dev libdb-dev \ libreadline-dev libffi-dev libgdbm-dev liblzma-dev \ libncursesw5-dev libsqlite3-dev libssl-dev \ zlib1g-dev uuid-dev tk-dev </code></pre> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://pythonlinks.python.jp/en/index.html">Unofficial Python Download Links</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 非公式か。しゃーない」</p> <pre><code class="shell"># Downloads フォルダー以外のところへ圧縮ファイルを解凍すること # ターボール解凍(ファイル名のバージョン番号を合わせること) tar xJf Python-3.11.5.tar.xz # 解凍したディレクトリーへ移動(ファイル名のバージョン番号を合わせること) cd Python-3.11.5 # 構成をカスタマイズ ./configure # インストーラーの作成 make # インストール sudo make install # インストールできたか確認 python3 -V Python 3.11.5 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 Python はインストールできたぜ」</p> <pre><code class="shell">muzudho@muzudho-MS-7B09:~/Muzudho Apps/Krita$ ./AppRun QObject::startTimer: Timers cannot have negative intervals Could not find platform independent libraries <prefix> Could not find platform dependent libraries <exec_prefix> Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>] Python path configuration: PYTHONHOME = (not set) PYTHONPATH = '/home/muzudho/.local/share/krita/:/home/muzudho/Muzudho Apps/Krita/usr/share/krita/:/home/muzudho/.local/share/krita/pykrita/:/home/muzudho/Muzudho Apps/Krita/usr/share/krita/pykrita/:/home/muzudho/Muzudho Apps/Krita/usr/share/pykrita/:/home/muzudho/Muzudho Apps/Krita/usr/lib/krita-python-libs' program name = 'python3' isolated = 0 environment = 1 user site = 1 import site = 1 # 以下略 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Krita</code> 動かね」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 記事を読みましょう」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://arakoki70.com/?p=7285">Ubuntu 22.04 ペイント代替ソフト Krita の選定</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 Ubuntu Dock って何だぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 Windows で言うところのタスクバーのことじゃないか?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 記事を読みましょう」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/yoshiyasu1111/items/115e40f63c9bedd373c0">KritaをAppImageでインストールする</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 なるほど、 <code>.appimage</code> は圧縮ファイルだが、解凍せずそのまま実行しろ、ということかだぜ」</p> <pre><code class="shell">./krita-5.1.5-x86_64.appimage </code></pre> <pre><code class="plaintext">muzudho@muzudho-MS-7B09:~/Muzudho Apps$ ./krita-5.1.5-x86_64.appimage dlopen(): error loading libfuse.so.2 AppImages require FUSE to run. You might still be able to extract the contents of this AppImage if you run it with the --appimage-extract option. See https://github.com/AppImage/AppImageKit/wiki/FUSE for more information </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 実行できないが」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 <code>FUSE</code> というアプリケーションが <code>.appimage</code> を実行するのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 記事を読みましょう」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://docs.appimage.org/user-guide/troubleshooting/fuse.html">I get some errors related to something called “FUSE”</a></p> <pre><code class="shell"># インストール sudo apt-get install fuse libfuse2 # 何だろう sudo modprobe -v fuse # グループに追加 sudo addgroup fuse sudo adduser $USER fuse </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 fuse はインストールできたのかなあ?」</p> <h1 id="fuse をインストールしたら、次へ"><a href="#fuse+%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E3%82%89%E3%80%81%E6%AC%A1%E3%81%B8">fuse をインストールしたら、次へ</a></h1> <pre><code class="shell">muzudho@muzudho-MS-7B09:~/Muzudho Apps$ ./krita-5.1.5-x86_64.appimage QObject::startTimer: Timers cannot have negative intervals Could not find platform independent libraries <prefix> Could not find platform dependent libraries <exec_prefix> Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>] /tmp/.mount_krita-auB0am/usr/lib/krita-python-libs/krita added to PYTHONPATH </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 動いた」</p> <p><a href="https://crieit.now.sh/upload_images/79d3ce93852f1dccc8d9170e7d59907d650568b9e4b3e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/79d3ce93852f1dccc8d9170e7d59907d650568b9e4b3e.png?mw=700" alt="202309__ubuntu__16-1733--krita.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ようやく スクリーンショットが撮れたぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 Windows Paint の代替は しばらく これねえ」</p> <h1 id="ディスプレイの解像度をどうにかしろ"><a href="#%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%81%AE%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%82%92%E3%81%A9%E3%81%86%E3%81%AB%E3%81%8B%E3%81%97%E3%82%8D">ディスプレイの解像度をどうにかしろ</a></h1> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 ディスプレイの解像度を どうにかしろだぜ」</p> <p><a href="https://crieit.now.sh/upload_images/015684ce728f77c39c53325e140665fe650569faea3d6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/015684ce728f77c39c53325e140665fe650569faea3d6.png?mw=700" alt="202309__ubuntu__16-1739--displaySetting.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 デスクトップの何もないところで、なんで 右クリックしなければならないのか。<br /> 左のタスクバーが仕事してほしい」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 そして <code>Display Settings</code> をクリックしても<br /> 何も出てこないぜ」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 PC がおかしくなったら 再起動したらいいんじゃない?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 再起動しても変わらず」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 記事を読みましょう」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://askubuntu.com/questions/1237965/reporting-i-cant-open-settings-in-ubuntu-20-04-lts">Reporting: I can't open settings in ubuntu 20.04 LTS</a></p> <pre><code class="shell"># 環境を更新 sudo apt-get update # 再インストール sudo apt-get install --reinstall gnome-control-center </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>Display Settings</code> が効くようになったぜ」</p> <p><a href="https://crieit.now.sh/upload_images/a7525c8dd498b655a9c9f8b02e64b69965056ed2b1af7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a7525c8dd498b655a9c9f8b02e64b69965056ed2b1af7.png?mw=700" alt="202309__ubuntu__16-1800--displaySetting.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 この <code>Resolution</code> が、 <code>1024 x 768</code> しか選べないのな」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 記事を読みましょう」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.bioerrorlog.work/entry/change-resolution">Ubuntuディスプレイ解像度の変更 | 1920x1080</a></p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/nanbuwks/items/dc26353486df80660e1f">Ubuntu で 4K Display @ThinkPad X230(Intel HD 4000 Graphics)</a></p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www-user.tu-chemnitz.de/~klada/?site=projects&id=intelhd4k">4K/UHD resolutions on Linux with Intel HD graphics over HDMI</a></p> <pre><code class="shell"># まず、cvt コマンドで、横3840、縦2160、リフレッシュレート60 にするためのコマンドを尋ねる muzudho@muzudho-MS-7B09:~$ cvt 3840 2160 60 # 3840x2160 59.98 Hz (CVT 8.29M9) hsync: 134.18 kHz; pclk: 712.75 MHz Modeline "3840x2160_60.00" 712.75 3840 4160 4576 5312 2160 2163 2168 2237 -hsync +vsync # xrandr でディスプレイの解像度を設定する xrandr --newmode "3840x2160_60.00" 712.75 3840 4160 4576 5312 2160 2163 2168 2237 -hsync +vsync xrandr: Failed to get size of gamma for output default X Error of failed request: BadName (named color or font does not exist) Major opcode of failed request: 140 (RANDR) Minor opcode of failed request: 16 (RRCreateMode) Serial number of failed request: 19 Current serial number in output stream: 19 </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 できないが?」</p> <pre><code class="shell">muzudho@muzudho-MS-7B09:~$ xrandr xrandr: Failed to get size of gamma for output default Screen 0: minimum 1024 x 768, current 1024 x 768, maximum 1024 x 768 default connected primary 1024x768+0+0 0mm x 0mm 1024x768 76.00* 3840x2160 (0x54a) 210.620MHz +HSync -VSync h: width 3840 start 3888 end 3920 total 4000 skew 0 clock 52.66KHz v: height 2160 start 2183 end 2188 total 2194 clock 24.00Hz 3840x2160_60.00 (0x54b) 210.620MHz +HSync -VSync h: width 3840 start 3888 end 3920 total 4000 skew 0 clock 52.66KHz v: height 2160 start 2183 end 2188 total 2194 clock 24.00Hz </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 <code>xrandr</code> コマンドには情報が増えてるけど」</p> <pre><code class="shell">muzudho@muzudho-MS-7B09:~$ xrandr --addmode default 3840x2160_60.00 xrandr: Failed to get size of gamma for output default </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 第1引数には 何を入れたらいいんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/72278fcdb5a3b020001c0a0a6608f890650573280a462.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/72278fcdb5a3b020001c0a0a6608f890650573280a462.png?mw=700" alt="202309__ubuntu__16-1819--resolution.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 解像度が選べそうな見た目をしてるけど、選んで <code>Apply</code> ボタン押しても有効にならない」</p> <pre><code class="shell">muzudho@muzudho-MS-7B09:~$ xrandr xrandr: Failed to get size of gamma for output default Screen 0: minimum 1024 x 768, current 1024 x 768, maximum 3840 x 2160 default connected primary 1024x768+0+0 0mm x 0mm 1024x768 76.00* 3840x2160_60.00 24.00 3840x2160 (0x54a) 210.620MHz +HSync -VSync h: width 3840 start 3888 end 3920 total 4000 skew 0 clock 52.66KHz v: height 2160 start 2183 end 2188 total 2194 clock 24.00Hz </code></pre> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 リフレッシュレートは 60 も出ないのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 記事を読みましょう」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/nsd24/items/c06294d1de40f2e9870b">Ubuntu18.04で突然解像度がおかしくなったときの対処法</a></p> <pre><code class="shell">muzudho@muzudho-MS-7B09:~$ cvt 3840 2160 # 3840x2160 59.98 Hz (CVT 8.29M9) hsync: 134.18 kHz; pclk: 712.75 MHz Modeline "3840x2160_60.00" 712.75 3840 4160 4576 5312 2160 2163 2168 2237 -hsync +vsync muzudho@muzudho-MS-7B09:~$ sudo xrandr --addmode Screen 0 "3840x2160_60.00" xrandr: unrecognized option '3840x2160_60.00' Try 'xrandr --help' for more information. muzudho@muzudho-MS-7B09:~$ xrandr --help </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 分からん」</p> <pre><code class="shell">muzudho@muzudho-MS-7B09:~$ xrandr --output default --mode 3840x2160_60.00 xrandr: Failed to get size of gamma for output default xrandr: Configure crtc 0 failed </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ダメか」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 グラフィックカード抜けてんじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 PCケースはガラス張りになっていて、 GEFORCE RTX は光ってるぜ」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 Ubuntu が GEFORCE RTX を認識してるか、確認できないのかだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 👇 記事を読みなさい」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/sabaku20XX/items/97db2c0bf7298e3a645c">UbuntuのOSやCPU, GPUの情報を確認するコマンド</a></p> <pre><code class="shell">muzudho@muzudho-MS-7B09:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy muzudho@muzudho-MS-7B09:~$ uname -a Linux muzudho-MS-7B09 6.2.0-32-generic #32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 2 x86_64 x86_64 x86_64 GNU/Linux muzudho@muzudho-MS-7B09:~$ sudo lshw -class processor *-cpu description: CPU product: AMD Ryzen Threadripper 2920X 12-Core Processor vendor: Advanced Micro Devices [AMD] physical id: 15 bus info: cpu@0 version: 23.8.2 serial: Unknown slot: SP3r2 size: 2200MHz capacity: 3500MHz width: 64 bits clock: 100MHz capabilities: lm fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp x86-64 constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid amd_dcm aperfmperf rapl pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca sev sev_es cpufreq configuration: cores=12 enabledcores=12 microcode=134251021 threads=24 muzudho@muzudho-MS-7B09:~$ lspci | grep -i nvidia 42:00.0 VGA compatible controller: NVIDIA Corporation Device 2684 (rev a1) 42:00.1 Audio device: NVIDIA Corporation Device 22ba (rev a1) </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 うーん? GPU がなんで VGA なんだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 VGA端子に挿そうと思わなければ VGA端子に挿さらないだろ?<br /> VGA端子に指してるのでは?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 互換性があるって言ってるだけじゃないの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👇 GPU ドライバーでも調べるかだぜ。<br /> クソ記事がいっぱいあるんで、公式へ行くぜ」</p> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://www.nvidia.co.jp/Download/Find.aspx?lang=jp">NVIDIAドライバダウンロード</a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ドライバーをダウンロードしても、340MB ぐらいダウンロードしたところで止まってしまう。<br /> <code>Unconfirmed 377778.crdownload</code> みたいな名前が残ってしまう」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 Google Chrome が出来損ないなのでは?<br /> 他のWebブラウザーに変えてみたらどうだぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 世の中のWebブラウザー、ほとんど Chrome なんで、<br /> その他の Webブラウザーって FireFox ぐらいしかないな」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👇 FireFox なら NVIDIA のドライバーをダウンロードでけた」</p> <p>🗒 <code>NVIDIA-Linux-x86_64-535.104.05.run</code></p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 そのファイルをどうするの? 実行できるの?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 パーミッションを 実行可能に変えて」</p> <pre><code class="shell">muzudho@muzudho-MS-7B09:~/Downloads$ ./NVIDIA-Linux-x86_64-535.104.05.run </code></pre> <p><a href="https://crieit.now.sh/upload_images/6f54c2dbed9059b682cf71d5dd30324a65058cdc590ee.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6f54c2dbed9059b682cf71d5dd30324a65058cdc590ee.png?mw=700" alt="202309__ubuntu__16-2007--nvidiaDriver.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 ルート・ユーザーじゃないとダメかだぜ?」</p> <pre><code class="shell"># 一時的にルート・ユーザーに変わる sudo su # ドライバーのインストール ./NVIDIA-Linux-x86_64-535.104.05.run </code></pre> <p><a href="https://crieit.now.sh/upload_images/f93222930b3705fb17e086a09bd88d0a65058e0c50c53.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f93222930b3705fb17e086a09bd88d0a65058e0c50c53.png?mw=700" alt="202309__ubuntu__16-2013--uninstallNvidiaDriver.png" /></a></p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 既存のドライバーをアンインストールしろってか。<br /> 自動でやってくれりゃいいのに」</p> <pre><code class="shell"># ドライバーのアンインストール # You can remove nvidia-driver-525, and all related packages, by running: apt-get remove --purge nvidia-driver-525 # ドライバーの再インストール # You can upgrade the driver by running: apt-get install nvidia-driver-525 # ルート・ユーザーを止める exit # GPUを確認 lspci | grep -i nvidia 42:00.0 VGA compatible controller: NVIDIA Corporation Device 2684 (rev a1) 42:00.1 Audio device: NVIDIA Corporation Device 22ba (rev a1) </code></pre> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 👆 なんにも変わってないぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/96fb09724c3ce40ee0861a0fd1da563d61daf8a09d9bc.png?mw=700" alt="ohkina-hiyoko-futsu2.png" /></a><br /> 「 PCを再起動してみましょう!」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 なにも変わらなかったぜ?」</p> <p><a href="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/beaf94b260ae2602ca8cf7f5bbc769c261daf8686dbda.png?mw=700" alt="kifuwarabe-futsu.png" /></a><br /> 「 お父んのちからでは ディスプレイの解像度は解決できなかったか。<br /> この狭い画面で 続けるのかな?」</p> <p><a href="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d27ea8dcfad541918d9094b9aed83e7d61daf8532bbbe.png?mw=700" alt="ramen-tabero-futsu2.png" /></a><br /> 「 Windows に戻ろうぜ?」</p> むずでょ tag:crieit.net,2005:PublicArticle/18505 2023-07-06T01:13:51+09:00 2023-07-06T01:13:51+09:00 https://crieit.net/posts/Ubuntu-Main Ubuntu で Main リポジトリ以外のインストール済みパッケージを一覧にする <p>以下のコマンドを使用すると、 Ubuntu にインストールされているパッケージのうち、Main リポジトリ以外(Restricted, Universe, Multiverse)に属するものを一覧で表示できる。</p> <pre><code>dpkg-query --show --showformat='${binary:Package}\n' | xargs -IX bash -c "apt-cache policy X | sed -n --regexp-extended '1h;/.*(\/restricted|\/universe|\/multiverse) .*/{x;p;x;p;Q}'" </code></pre> <p>以上!</p> <p>…とすると、この記事だけでは少し物足りない気がするので、使い方についても少し説明しておく。</p> <h2 id="なぜ Main リポジトリ以外のものを把握したいのか?"><a href="#%E3%81%AA%E3%81%9C+Main+%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E4%BB%A5%E5%A4%96%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E6%8A%8A%E6%8F%A1%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%8B%EF%BC%9F">なぜ Main リポジトリ以外のものを把握したいのか?</a></h2> <p>パッケージの取得元リポジトリのカテゴリを把握する理由は、Canonical による Ubuntu Pro のサポート範囲が関係しているからだ。</p> <p><code>apt</code> コマンドを使用して、Ubuntu の標準リポジトリから取得される各パッケージは、以下の4つのカテゴリに分類される。 <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p> <ul> <li>Main <ul> <li>Ubuntu チームによってサポートされる、フリーソフトウェアを収容するコンポーネントで、 2,300 以上のパッケージを含む。</li> <li>Ubuntu インストール時にデフォルトでインストールされるパッケージの大半はこれ。</li> </ul></li> <li>Restricted <ul> <li>ドライバーなど、利便性の面でデフォルトでインストールされたほうが望ましいものの、プロプライエタリであるソフトウェアを含むコンポーネント。</li> </ul></li> <li>Universe <ul> <li>Ubuntu コミュニティによって管理されている、 Linux 界の多くのオープンソースソフトウェアを収容するコンポーネントで、 23,000 以上のパッケージを含む。</li> </ul></li> <li>Multiverse <ul> <li>フリーソフトの要件を満たさないような、特殊なライセンス要件をもつソフトウェアを収容するコンポーネント。</li> <li>GPU 関連 (CUDA 等) や, VirtualBox などが含まれている。</li> </ul></li> </ul> <p>これらのうち、Restricted と Multiverse リポジトリのパッケージについては、それぞれのソフトの提供元によってのみメンテナンスされ、Canonical によるサポートは行われない。</p> <p>一方で、Main と Universe リポジトリのパッケージについては、セキュリティ修正の提供期間や、電話/オンラインチケットサポート範囲が、 Ubuntu Pro の有無やライセンスの種類ごとに以下のような内訳となっている。 <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p> <blockquote> <div class="table-responsive"><table> <thead> <tr> <th>Security patching</th> <th>Ubuntu LTS</th> <th>Ubuntu Pro (Infra-only)</th> <th>Ubuntu Pro</th> </tr> </thead> <tbody> <tr> <td>Over 2,300 packages in Ubuntu <strong>Main</strong> repository</td> <td>5 years</td> <td>10 years</td> <td>10 years</td> </tr> <tr> <td>Over 23,000 packages in Ubuntu <strong>Universe</strong> repository</td> <td>Best effort</td> <td>Best effort</td> <td>10 years</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/support">Optional phone/ticket support</a></td> <td>No</td> <td>Yes</td> <td>Yes</td> </tr> </tbody> </table></div> </blockquote> <p>5年のLTSの期間中、Main リポジトリのパッケージを主に使用する場合、(ライブパッチ等の他のUbuntu Proのサービスが不要であれば)無料の範囲内で十分だ。</p> <p>Main リポジトリのパッケージを主に使用しながら、10年の延長サポートを望む場合は、"Ubuntu Pro (Infra-only)" を契約することをおすすめする。</p> <p>また、Universe リポジトリのパッケージを積極的に活用したい場合は、"Ubuntu Pro" を契約しておくと、より安心だろう。</p> <h2 id="Ubuntu の Universe リポジトリのパッケージの更新基準"><a href="#Ubuntu+%E3%81%AE+Universe+%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B4%E6%96%B0%E5%9F%BA%E6%BA%96">Ubuntu の Universe リポジトリのパッケージの更新基準</a></h2> <p>ちなみに、Universe repository の "Best effort" と "10 years" の違いがいまいちわかりにくいが…</p> <p>例えば、サポート中の Ubuntu 22.04 LTS であっても、 Universe リポジトリの imagemagick パッケージを更新しようとすると、 <code>Ubuntu Pro with 'esm-apps'</code> の有効化が必要と広告が表示される。</p> <pre><code>$ cat /etc/os-release PRETTY_NAME="Ubuntu 22.04.2 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.2 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy $ $ sudo apt update $ sudo apt install imagemagick $ $ sudo apt upgrade Reading package lists... Done Building dependency tree... Done Reading state information... Done Calculating upgrade... Done Get more security updates through Ubuntu Pro with 'esm-apps' enabled: imagemagick ansible libopenexr25 libmagickcore-6.q16-6-extra libmagickwand-6.q16-6 imagemagick-6.q16 libmagickcore-6.q16-6 imagemagick-6-common Learn more about Ubuntu Pro at https://ubuntu.com/pro 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. $ $ apt-cache policy imagemagick imagemagick: Installed: 8:6.9.11.60+dfsg-1.3ubuntu0.22.04.3 Candidate: 8:6.9.11.60+dfsg-1.3ubuntu0.22.04.3 Version table: *** 8:6.9.11.60+dfsg-1.3ubuntu0.22.04.3 500 500 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages 500 http://archive.ubuntu.com/ubuntu jammy-security/universe amd64 Packages 100 /var/lib/dpkg/status 8:6.9.11.60+dfsg-1.3build2 500 500 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages </code></pre> <p><a target="_blank" rel="nofollow noopener" href="https://askubuntu.com/questions/1452299/im-getting-the-message-the-following-security-updates-require-ubuntu-pro-with/1453309#1453309">package management - I'm getting the message: "The following security updates require Ubuntu Pro with 'esm-apps' enabled" when updating Ubuntu 22.04 - Ask Ubuntu</a></p> <p>上記の回答によると、 Ubuntu の Universe リポジトリのアップストリームパッチの取り込みは引き続き行っているものの、 Canonical のセキュリティチームによるパッチは Ubuntu Pro の 'esm-apps' に限って行うようになっている。</p> <p>ここでいう「アップストリームパッチ」とはなんぞや?</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/ImageMagick/ImageMagick6/tree/6.9.12-90">ImageMagick/ImageMagick6 at 6.9.12-90</a></p> <p>ImageMagick の元の開発元の GitHub を見れば分かる通り、より高いバージョンのパッケージもメンテナンスリリースされ続けているが、これがそのまま取り込まれているわけではなさそうだ。</p> <p><a target="_blank" rel="nofollow noopener" href="https://packages.debian.org/bullseye/imagemagick">Debian -- bullseye の imagemagick パッケージに関する詳細</a></p> <p>一方で、Ubuntu 22.04 LTS の元となっている Debian 11 bullseye のパッケージを見ると、 2023年7月 現在は</p> <pre><code>imagemagick (8:6.9.11.60+dfsg-1.3+deb11u1) </code></pre> <p>と、 Ubuntu 側の非ESMのバージョンと、似たようなバージョンにとどまっている。</p> <p>すなわち、ココで言う「アップストリーム」とは、 Debian のパッケージ管理の方を指しているのだと思われる。</p> <p>おそらく、Universe リポジトリのパッケージについては以下のようになっているのだろう。</p> <ul> <li>ベースとなっている Debian でリリースされているバージョンは Best effort で LTS へ取り込み</li> <li>それ以外の Canonical 側で当てたセキュリティパッチは Ubuntu Pro のみに提供</li> </ul> <p>だとすれば、Ubuntu Pro の esm-apps を有効にしていなくても、ベースとなった Debian レベルの修正はされると考えてよさそうだ。</p> <h3 id="実際にソースコードを見てみる"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%BF%E3%82%8B">実際にソースコードを見てみる</a></h3> <p>実際に、 <a target="_blank" rel="nofollow noopener" href="http://ftp.debian.org/debian/dists/bullseye/main/source/Sources.gz">Debian 11 bullseye</a>, <a target="_blank" rel="nofollow noopener" href="http://archive.ubuntu.com/ubuntu/dists/jammy-security/universe/source/Sources.gz">Ubuntu 22.04 LTS</a>, <a target="_blank" rel="nofollow noopener" href="https://esm.ubuntu.com/apps/ubuntu/dists/jammy-apps-security/main/source/Sources.gz">Ubuntu 22.04 ESM</a> それぞれに於ける2023年7月現在最新版のソースを、 <code>apt source</code> コマンドで入手してみて比べてみると…</p> <div class="table-responsive"><table> <thead> <tr> <th>ディストリビューション</th> <th><a target="_blank" rel="nofollow noopener" href="https://debian-handbook.info/browse/ja-JP/stable/sect.source-package-structure.html">.dsc (Debian Source Control) ファイル</a></th> <th>ソースファイル</th> </tr> </thead> <tbody> <tr> <td>Debian 11 bullseye</td> <td><a target="_blank" rel="nofollow noopener" href="http://ftp.debian.org/debian/pool/main/i/imagemagick/imagemagick_6.9.11.60+dfsg-1.3+deb11u1.dsc">imagemagick_6.9.11.60+dfsg-1.3+deb11u1.dsc</a></td> <td>imagemagick_6.9.11.60+dfsg.orig.tar.xzimagemagick_6.9.11.60+dfsg-1.3+deb11u1.debian.tar.xz</td> </tr> <tr> <td>Ubuntu 22.04 LTS</td> <td><a target="_blank" rel="nofollow noopener" href="http://archive.ubuntu.com/ubuntu/pool/universe/i/imagemagick/imagemagick_6.9.11.60+dfsg-1.3ubuntu0.22.04.3.dsc">imagemagick_6.9.11.60+dfsg-1.3ubuntu0.22.04.3.dsc</a></td> <td>imagemagick_6.9.11.60+dfsg.orig.tar.xzimagemagick_6.9.11.60+dfsg-1.3ubuntu0.22.04.3.debian.tar.xz</td> </tr> <tr> <td>Ubuntu 22.04 esm-apps</td> <td><a target="_blank" rel="nofollow noopener" href="https://esm.ubuntu.com/apps/ubuntu/pool/main/i/imagemagick/imagemagick_6.9.11.60+dfsg-1.3ubuntu0.22.04.3+esm2.dsc">imagemagick_6.9.11.60+dfsg-1.3ubuntu0.22.04.3+esm2.dsc</a> <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></td> <td>imagemagick_6.9.11.60+dfsg.orig.tar.xzimagemagick_6.9.11.60+dfsg-1.3ubuntu0.22.04.3+esm2.debian.tar.xz</td> </tr> </tbody> </table></div> <p>このうち、 <code>imagemagick_6.9.11.60+dfsg.orig.tar.xz</code> についてはハッシュ値まで同じファイルなので、相違点は以下のファイルとなる。</p> <ul> <li><code>imagemagick_6.9.11.60+dfsg-1.3+deb11u1.debian.tar.xz</code></li> <li><code>imagemagick_6.9.11.60+dfsg-1.3ubuntu0.22.04.3.debian.tar.xz</code></li> <li><code>imagemagick_6.9.11.60+dfsg-1.3ubuntu0.22.04.3+esm2.debian.tar.xz</code></li> </ul> <p>これらのアーカイブファイルの中身に対して WinMerge の3方向マージなどを使い、changelog やパッチファイルなどの比較をしてみよう。<br /> すると、いずれも <code>6.9.11.60+dfsg-1.3</code> までのパッチがあたっているのに加えて、それぞれ以下のセキュリティフィックスを含んでいることがわかる。</p> <ul> <li>Debian 11 と Ubuntu 22.04 LTS <ul> <li>CVE-2022-44267</li> <li>CVE-2022-44268</li> </ul></li> <li>Ubuntu 22.04 esm-apps <ul> <li>CVE-2022-44267</li> <li>CVE-2022-44268</li> <li>CVE-2021-3574</li> <li>CVE-2021-3610</li> <li>CVE-2021-4219</li> <li>CVE-2021-20241</li> <li>CVE-2021-20243</li> <li>CVE-2021-20244</li> <li>CVE-2021-20245</li> <li>CVE-2021-20246</li> <li>CVE-2021-20309</li> <li>CVE-2021-20312</li> <li>CVE-2021-20313</li> <li>CVE-2021-39212</li> <li>CVE-2022-1114</li> <li>CVE-2022-28463</li> <li>CVE-2022-32545</li> <li>CVE-2022-32546</li> <li>CVE-2022-32547</li> <li>CVE-2023-1289</li> <li>CVE-2023-1906</li> <li>CVE-2023-3195</li> <li>CVE-2023-3428</li> <li>CVE-2023-34151</li> </ul></li> </ul> <p>前述の、 <code>Debian 11</code> ≒ <code>Ubuntu 22.04 LTS</code> ≦ <code>Ubuntu 22.04 esm-apps</code> だろうという予想は当たっていそうだ。</p> <p>ちなみに、つい先日2023年6月にリリースされたばかりの <a target="_blank" rel="nofollow noopener" href="http://ftp.debian.org/debian/dists/bookworm/main/source/Sources.gz">Debian 12 bookworm</a> では、<a target="_blank" rel="nofollow noopener" href="http://ftp.debian.org/debian/pool/main/i/imagemagick/imagemagick_6.9.11.60+dfsg-1.6.dsc">imagemagick_6.9.11.60+dfsg-1.6.dsc</a> という少し dfsg のバージョンが高いパッケージがリリースされている。<br /> その changelog を見てみると、<code>6.9.11.60+dfsg-1.3</code> までのパッチに加えて、以下のセキュリティフィックスが含まれていた。</p> <ul> <li>Debian 12 <ul> <li>CVE-2022-44267</li> <li>CVE-2022-44268</li> <li>CVE-2021-3574</li> <li>CVE-2021-4219</li> <li>CVE-2021-20241</li> <li>CVE-2021-20243</li> <li>CVE-2021-20244</li> <li>CVE-2021-20245</li> <li>CVE-2021-20246</li> <li>CVE-2021-20309</li> <li>CVE-2021-20312</li> <li>CVE-2021-20313</li> <li>CVE-2021-39212</li> <li>CVE-2022-1114</li> <li>CVE-2022-28463</li> <li>CVE-2022-32545</li> <li>CVE-2022-32546</li> <li>CVE-2022-32547</li> </ul></li> </ul> <p>Ubuntu Pro の esm-apps のほうが、Debian 12 に含まれているパッチに加え、更に多くのセキュリティフィックスを含んでいることがわかる。</p> <p>… Debian 12 bookworm のパッケージでも、ImageMagick 6.9.12系 や ImageMagick 7系へのパッケージの更新はしていないのね。</p> <hr /> <p>参考:</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/admin/clip/01/ubuntu-topics/202210/07">「Ubuntu Pro」のワークステーション・データセンター向けベータリリース | gihyo.jp</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://pc.watch.impress.co.jp/docs/column/ubuntu/1512815.html">【Ubuntu日和】【第30回】DebianとUbuntu、CentOSとRHELから学ぶ、Upstreamとの関係 - PC Watch</a></li> </ul> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:1" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://help.ubuntu.com/community/Repositories">Repositories - Community Help Wiki</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:2" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/pro">Ubuntu Pro | Ubuntu</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:3" role="doc-endnote"> <p>ESM向けの配信ページはパスワード保護がかかっているが、Ubuntu Pro を有効すると作成される<a target="_blank" rel="nofollow noopener" href="https://askubuntu.com/a/1454416"><code>/etc/apt/auth.conf.d/</code>内のファイルに記載されたユーザー名(<code>bearer</code>)とパスワードで認証できる</a>。 <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> advanceboy tag:crieit.net,2005:PublicArticle/18432 2023-05-11T23:28:12+09:00 2023-05-11T23:28:12+09:00 https://crieit.net/posts/resolve-404-error-at-apt-update 【Ubuntu】apt updateで404エラーがでたので解消する <p>こんにちは、しきゆらです。<br /> 今回は、Ubuntuで<code>apt update</code>を実行したときに404エラーが発生していたので<br /> 解消するために色々調べつつ対応したのでメモしておきます。</p> <p>今回利用していたUbuntuのバージョンは以下の通り。</p> <pre><code>$ cat /etc/os-release PRETTY_NAME="Ubuntu 22.10" NAME="Ubuntu" VERSION_ID="22.10" VERSION="22.10 (Kinetic Kudu)" ... </code></pre> <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://shikiyura.com/2023/05/resolve_key_is_stored_in_legacy_trusted-gpg-keyring_issue/">前回のPostgreSQLのインストール</a>のように、あれこれリポジトリを追加したりOSを更新していると<code>apt update</code>を実行するとリポジトリの一部で404エラーが出るようになっていました。<br /> 出ていたエラーは以下の通り。</p> <pre><code>$ sudo apt update ... Err:10 <https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu> kinetic Release 404 Not Found [IP: 185.125.190.52 443] </code></pre> <p>エラーが出ていたのは「<code>ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu</code>」でした。<br /> 何を入れたときのものかすでに覚えていないですが、404であれば不要だろう、ということで解消していきます。</p> <h2 id="解消方法"><a href="#%E8%A7%A3%E6%B6%88%E6%96%B9%E6%B3%95">解消方法</a></h2> <p>ざっくりと手順を記載すると以下の通りです。</p> <ol> <li>対象リポジトリを管理しているファイルを探す</li> <li>リポジトリを無効化する</li> <li>解消されたかを確認する</li> </ol> <p>それぞれに分けてみていきます。</p> <h3 id="対象リポジトリを管理しているファイルを探す"><a href="#%E5%AF%BE%E8%B1%A1%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E7%AE%A1%E7%90%86%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%8E%A2%E3%81%99">対象リポジトリを管理しているファイルを探す</a></h3> <p>調べてみると、apt updateで参照するリポジトリは/etc/apt配下にあるxxx.listというファイルで管理されているようです。<br /> <a target="_blank" rel="nofollow noopener" href="https://help.ubuntu.com/community/Repositories/CommandLine">Repositories/CommandLine - Community Help Wiki</a></p> <p>ということで、この中にあるファイルの中に該当するURLが書かれているファイルを探しましょう。 まずは、該当するリポジトリが書かれたファイルの一覧を取得してみます。<br /> なお、出力結果は環境によって異なるので適宜ご自身の環境に合わせて読み替えてください。</p> <pre><code>$ find /etc/apt -name "*.list" /etc/apt/sources.list /etc/apt/sources.list.d/amdgpu.list /etc/apt/sources.list.d/rocm.list /etc/apt/sources.list.d/deadsnakes-ubuntu-ppa-kinetic.list /etc/apt/sources.list.d/amdgpu-proprietary.list /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/pgdg.list </code></pre> <p>取得できたそれぞれのファイルの中を確認していきます。<br /> とはいえ、catとかエディタとかでひとつづつ見ていくのは手間。<br /> この辺もコマンドでやってしまいましょう。</p> <pre><code>$ find /etc/apt -name "*.list" | xargs grep ppa /etc/apt/sources.list.d/deadsnakes-ubuntu-ppa-kinetic.list:deb <https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu/> kinetic main /etc/apt/sources.list.d/deadsnakes-ubuntu-ppa-kinetic.list:# deb-src <https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu/> kinetic main </code></pre> <p>なお、xargsは標準入力やファイルなどからリストを受け取って、それを別コマンドの引数とするコマンドのようです。<br /> <a target="_blank" rel="nofollow noopener" href="https://atmarkit.itmedia.co.jp/ait/articles/1801/19/news014.html">【 xargs 】コマンド――コマンドラインを作成して実行する:Linux基本コマンドTips(176) - @IT</a></p> <p>これで、該当するファイルのパスと内容を確認できました。</p> <h3 id="リポジトリを無効化する"><a href="#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B">リポジトリを無効化する</a></h3> <p>無効化するには、単純にコメントアウトすればよいだけなので以下のように先頭に#を追加。</p> <pre><code>cat /etc/apt/sources.list.d/deadsnakes-ubuntu-ppa-kinetic.list # deb &lt;https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu/&gt; kinetic main # deb-src &lt;https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu/&gt; kinetic main </code></pre> <p>これにて対応は完了。</p> <h3 id="解消されたかを確認する"><a href="#%E8%A7%A3%E6%B6%88%E3%81%95%E3%82%8C%E3%81%9F%E3%81%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">解消されたかを確認する</a></h3> <p>apt updateを実行して404エラーが出ないことを確認できれば完了です。</p> <p>私の環境では特に不要としてコメントアウトしてしまっていますが、リポジトリを追加したということは何らかのアプリ等をインストールするために追加しているはずなので<br /> 利用しているパッケージが度のリポジトリで管理されているかを確認してあげる必要があるかと思います。<br /> 未確認ですが、この辺で確認できそうです。<br /> <a target="_blank" rel="nofollow noopener" href="https://kazuhira-r.hatenablog.com/entry/2022/08/13/202239">現在認識しているaptリポジトリーの一覧や、リポジトリーに含まれているパッケージを調べたい - CLOVER🍀</a></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>今回はUbuntuでapt update時に404エラーが発生していたので、解消するために原因や解消方法を調べました。</p> <p>何気なく使っているパッケージマネージャの裏側をなんとなくチラ見できた気がします。<br /> 調べてみると、よく使うものでもよくわからずに使っているんだなぁというのと、もう少し深く知りたくなります。</p> <p>今回はここまで。<br /> おわり</p> しきゆら tag:crieit.net,2005:PublicArticle/18427 2023-05-07T08:47:15+09:00 2023-05-07T08:55:07+09:00 https://crieit.net/posts/resolve-key-is-stored-in-legacy-truste-gpg-keyring-issue 【Ubuntu】apt updateでKey is stored in legacy trusted.gpg keyringと注意されたので対応する <p>こんにちは、しきゆらです。<br /> 今回は公式のドキュメントを見ながら対応したのに、<code>apt update</code>で怒られるようになったので<br /> なぜなのか調べつつ、対応方法を見つけて対応したのでメモしておきます。</p> <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p>今回起こったのはPostgreSQLのインストール時のこと。<br /> PostgreSQLをインストールするためにリポジトリ追加を行った。 手順はこれ。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.postgresql.org/download/linux/ubuntu/">PostgreSQL: Linux downloads (Ubuntu) </a></p> <p>該当箇所は以下の通り。</p> <pre><code class="zsh"># Create the file repository configuration: $ sudo sh -c 'echo "deb <http://apt.postgresql.org/pub/repos/apt> $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' # Import the repository signing key: $ wget --quiet -O - <https://www.postgresql.org/media/keys/ACCC4CF8.asc> | sudo apt-key add - # Update the package lists: $ sudo apt-get update # <= ここでWarningが出た ... Key is stored in legacy trusted.gpg keyring </code></pre> <p>ということで、記載されているが、そもそも何を怒っているのかを調べてみました。</p> <h2 id="何が起きているのか"><a href="#%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81%8D%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B">何が起きているのか</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675">apt-keyはなぜ廃止予定となったのか</a><br /> <a target="_blank" rel="nofollow noopener" href="https://salsa.debian.org/apt-team/apt/-/commit/ee284d5917d09649b68ff1632d44e892f290c52f">Fully deprecate apt-key, schedule removal for Q2/2022 (ee284d59) · Commits · APT Developers / apt · GitLab</a></p> <p>apt-keyコマンドがだいぶ前の2020年8月ころから廃止予定で、2022年Q2に廃止となっていたようです。<br /> 手元の環境はWSL2上のUbuntu 22.10でしたが、まだ残っているようでした。<br /> 今後はなくなるんでしょう。</p> <blockquote> <p>セキュリティ上の懸念点からくるもので、簡単にまとめると次の2点が理由です。</p> <ol> <li>apt-key addは単一ファイル(/etc/apt/trusted.gpg)に鍵を追加していくため、複数のリスクの異なるリポジトリの鍵を同じ権限で管理しなくてはならない。</li> <li>リポジトリ鍵として追加した鍵は、すべてのリポジトリに対して適用される。</li> </ol> <p>引用元: https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675</p> </blockquote> <p>ということで、リポジトリごとにリスクが異なるカギを全体で使うのよくいないよね、ということでこれをやめた、という感じなのかなと。<br /> やめたはいいが、この記事時点では代替となるものが用意されていないようです。 今後は、各リポジトリで利用するカギを/usr/share/keyrings/配下に設置して個別に指定する運用が良いだろう、として締めています。</p> <h2 id="対応方法"><a href="#%E5%AF%BE%E5%BF%9C%E6%96%B9%E6%B3%95">対応方法</a></h2> <p>大きく分けると以下の通り。</p> <ol> <li>既存のカギを削除する</li> <li>別途カギを取得し設定しなおす</li> <li>リポジトリとカギを紐づける</li> </ol> <h3 id="1. 既存のカギを削除する"><a href="#1.+%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%AB%E3%82%AE%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B">1. 既存のカギを削除する</a></h3> <pre><code class="zsh">$ apt-key list Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg # <= これを削除する --------------------------------------------- pub rsa4096 2011-10-13 [SC] B97B 0AFC AA1A 47F0 44F2 44A0 7FCC 7D46 ACCC 4CF8 uid [ unknown] PostgreSQL Debian Repository ... # 鍵の削除はfinger printの最後の8文字のようです $ sudo apt-key del ACCC4CF8 Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). OK # 消えたことを確認 $ apt-key list Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)). ... </code></pre> <h3 id="2. 別途カギを取得し設定しなおす"><a href="#2.+%E5%88%A5%E9%80%94%E3%82%AB%E3%82%AE%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%8A%E3%81%99">2. 別途カギを取得し設定しなおす</a></h3> <p>カギについては、ここに記載されているので取得して入れなおします。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.postgresql.org/download/linux/ubuntu/">PostgreSQL: Linux downloads (Ubuntu) </a></p> <pre><code class="zsh"># カギの取得 $ wget <https://www.postgresql.org/media/keys/ACCC4CF8.asc> # カギをgpgコマンドを使って変換 $ gpg --no-default-keyring -o postgresql-keyring.gpg --dearmor ACCC4CF8.asc # カギを確認 $ file postgres-keyring.gpg postgres-keyring.gpg: GPG keybox database version 1 ... # 変換したカギを/usr/share/keyrings/へ設置する # 手元ではフォルダがなかったので手動で作成 $ sudo mkdir -p /usr/share/keyrings $ sudo cp postgres-keyring.gpg /usr/local/share/keyrings </code></pre> <h3 id="3. リポジトリとカギを紐づける"><a href="#3.+%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%A8%E3%82%AB%E3%82%AE%E3%82%92%E7%B4%90%E3%81%A5%E3%81%91%E3%82%8B">3. リポジトリとカギを紐づける</a></h3> <p>リポジトリは/etc/apt/sources.list.d/pgdg.listに作成しているので、このファイルを以下のように変更。</p> <pre><code class="zsh"># deb [signed-by=/path/to/gpg_key] URLの形式でカギの場所を記載 deb [signed-by=/usr/local/share/keyrings/postgresql-keyring.gpg] <http://apt.postgresql.org/pub/repos/apt> kinetic-pgdg main </code></pre> <p>これにて対応完了です。<br /> Warningが出ないことを確認しましょう。</p> <pre><code class="zsh"># warningが出ないことを確認 $ sudo apt update ... Hit:7 <http://apt.postgresql.org/pub/repos/apt> kinetic-pgdg InRelease </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>今回は、apt-keyコマンドが廃止となっているために、ドキュメント通りに対応してもWarningが出てしまっていたので、諸々調べつつ対応してみました。 そもそもの廃止から知らなかったので勉強になりました。</p> <p>なお、DockerやGithub CLIでは /etc/apt/keyrings 配下に設置しているようです。<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository">Install Docker Engine on Ubuntu | Docker Documentation</a><br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/cli/cli/issues/5122">Linux installation instructions recommend storing GPG keyring in the wrong location · Issue #5122 · cli/cli · GitHub</a></p> <p>管理をユーザ側でやる、という形であれば1か所にまとめたほうが良いので どこか1か所を決めて、リポジトリ追加時にそこへ追加していく方法をとったほうが良いかもしれません。<br /> DebianのWikiにも /etc/apt/keyrings 配下に設置しよう、となっているのでこっちに合わせたほうが良いかもしれません。<br /> <a target="_blank" rel="nofollow noopener" href="https://wiki.debian.org/DebianRepository/UseThirdParty">DebianRepository/UseThirdParty - Debian Wiki</a></p> <p>今回はここまで。<br /> おわり</p> しきゆら tag:crieit.net,2005:PublicArticle/18314 2022-11-10T10:08:52+09:00 2023-10-19T14:22:13+09:00 https://crieit.net/posts/WSL-Windows-Ubuntu 【WSL】WindowsでUbuntuを検証したいときによく使うコマンド <h2 id="確認済み環境"><a href="#%E7%A2%BA%E8%AA%8D%E6%B8%88%E3%81%BF%E7%92%B0%E5%A2%83">確認済み環境</a></h2> <ul> <li>Windows 11 22H2</li> </ul> <h2 id="Ubuntuをインストール"><a href="#Ubuntu%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Ubuntuをインストール</a></h2> <p>管理権限で起動したコマンドプロンプトかPowerShellで実施、WSL未導入の場合は再起動(バックグラウンドでWSLを導入するため、ハイパーバイザーや仮想マシンプラットフォーム機能などが有効化されるため)が必要です。再起動後Ubuntuが起動するのでID/PWの設定を行います。</p> <pre><code class="dos">> wsl --install -d Ubuntu </code></pre> <h2 id="インストール状況を確認する"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E7%8A%B6%E6%B3%81%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">インストール状況を確認する</a></h2> <p>管理権限で起動したコマンドプロンプトかPowerShellで実施、インストールされたディストリビューション名や状態、WSLバージョンが確認できます</p> <pre><code class="dos">> wsl -l -v </code></pre> <h2 id="Ubuntuをエクスポート"><a href="#Ubuntu%E3%82%92%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88">Ubuntuをエクスポート</a></h2> <p>管理権限で起動したコマンドプロンプトかPowerShellで実施、他のPCに環境を移動したい時に使います</p> <pre><code class="dos">> wsl --export "ディストリビューション名(例:Ubuntu)" "エクスポートファイル名(例:Ubuntu_export.tar)" </code></pre> <h2 id="Ubuntuをインポート"><a href="#Ubuntu%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88">Ubuntuをインポート</a></h2> <p>管理権限で起動したコマンドプロンプトかPowerShellで実施、WSLを導入していないPCの場合は事前に導入が必要です(私の環境ではWSL未導入だと--importオプションが使えませんでした)</p> <pre><code class="dos">> wsl --import Ubuntu "インポート先のフォルダ名(例:c:¥wslimg→フォルダがない場合は自動で作られる)" "エクスポートファイル名(例:Ubuntu_export.tar)" </code></pre> arohajiro tag:crieit.net,2005:PublicArticle/17689 2021-09-26T22:04:36+09:00 2023-12-09T11:25:10+09:00 https://crieit.net/posts/ubuntu-desktop-midnight-maximum-tune Ubuntu (Desktop) Midnight -- Maximum Tune (in my history) <h1 id="はじめに(ご容赦事項)"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB%28%E3%81%94%E5%AE%B9%E8%B5%A6%E4%BA%8B%E9%A0%85%29">はじめに(ご容赦事項)</a></h1> <p>今回記す内容は以下を求めている方には <strong>適さない</strong> 可能性が多いにある:</p> <ul> <li>Linux全般またはDebian, Ubuntuの『Server Edition』などのパフォーマンス改善</li> <li>ハイパーバイザーな仮想環境上でのUbuntu Desktopの挙動改善(あまり期待できないと思う)</li> <li>他、ホゲフカ特化のLinuxカーネルチューニング(そんな人はこの記事を見ていないで、初めから『カーネルビルド』について調べた方が良い)</li> </ul> <p>タイトルは完全に『湾岸ミッドナイト・マキシマムチューン』を意識したものの、内容は大変薄っぺらい。<br /> そしてしっかりとしたベンチマークを取ってもいないし、後記の事を行っていてもなお <code>sudo journalctl -b-1 -xe</code> と叩けば;</p> <pre><code class="log">M月 dd hh:mm:ss manzyun-greed gnome-shell[dddddd]: Gnome Shell crashed with signal 11 ... M月 dd hh:mm:ss manzyun-greed gnome-shell[dddddd]: [email protected]: Main process exited, code=killed, status=11/SEGV </code></pre> <p>と吐かせる様な事をしているのだ。</p> <p>もちろんながら、同様の方法を試みて読者に何か損失・不利益が生じたとしても、私は何も責任を取らない(相談には乗るかもしれないが)。</p> <h1 id="概要"><a href="#%E6%A6%82%E8%A6%81">概要</a></h1> <ul> <li>可能な限りのファンの分解・グリースの補充・ラジエーターやヒートシンクの清掃、RAMやビデオカードの接点の無水エタノールによる清掃。</li> <li><code>linux-zen</code> カーネルのPPA追加とインストール。</li> <li>ビデオカードの追加と、できる限り最新の <code>freedesktop.org</code> 製グラフィックドライバのPPAの追加とインストール。</li> </ul> <p>見ての通り、とてつもなく『フリーライド(無賃乗車)』で『スクリプトキディ(コピペスクリプトを組む事しか能の無い小便臭いガキンチョ)』な事しかやってない。</p> <p>ましてやベータリリースのディストロでやっているのだから、ディストロ開発をしている方々(主に『Canonical Ltd』に所属している方々やそれ以外のDebianパッケージメンテナの皆々様)には迷惑を掛けているかもしれない。</p> <p>もし以降を実施するのであれば、 <em>ベータリリースでは行わない</em> で頂けると筆者個人は大変有り難い。<del>「まずお前が止めろよ」と言わ……いや、言って良い。石を投げてくれ</del></p> <h2 id="筆者のマシン"><a href="#%E7%AD%86%E8%80%85%E3%81%AE%E3%83%9E%E3%82%B7%E3%83%B3">筆者のマシン</a></h2> <p><code>neofetch</code> の結果より:</p> <pre><code class="shell-session"> .-/+oossssoo+/-. `:+ssssssssssssssssss+:` -+ssssssssssssssssssyyssss+- .ossssssssssssssssssdMMMNysssso. manzyun@manzyun-greed /ssssssssssshdmmNNmmyNMMMMhssssss/ --------------------- +ssssssssshmydMMMMMMMNddddyssssssss+ OS: Ubuntu Impish Indri (development branch) x86_64 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Host: MS-7693 4.0 .ssssssssdMMMNhsssssssssshNMMMdssssssss. Kernel: 5.13.19-xanmod1 +sssshhhyNMMNyssssssssssssyNMMMysssssss+ Uptime: 1 hour, 15 mins ossyNMMMNyMMhsssssssssssssshmmmhssssssso Packages: 3403 (dpkg), 58 (flatpak), 28 (snap) ossyNMMMNyMMhsssssssssssssshmmmhssssssso Shell: fish 3.1.2 +sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 3840x2160 .ssssssssdMMMNhsssssssssshNMMMdssssssss. DE: GNOME /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/ WM: Mutter +sssssssssdmydMMMMMMMMddddyssssssss+ WM Theme: Adwaita /ssssssssssshdmNNNNmyNMMMMhssssss/ Theme: Yaru-dark [GTK2/3] .ossssssssssssssssssdMMMNysssso. Icons: Yaru [GTK2/3] -+sssssssssssssssssyyyssss+- Terminal: gnome-terminal `:+ssssssssssssssssss+:` CPU: AMD FX-8320E (8) @ 3.200GHz .-/+oossssoo+/-. GPU: AMD ATI Radeon R7 370 / R9 270/370 OEM GPU: AMD ATI Radeon R7 370 / R9 270/370 OEM Memory: 3317MiB / 32056MiB </code></pre> <p>察しの良い方なら、<br /> 「5年落ちのマシン構成に、4Kディスプレイのモニタを差してる……だと?」<br /> と困惑するだろう。</p> <p>流石に『Radeon R7 370』が可哀想なので、<code>2880x1620</code> と控えめにしている。</p> <h1 id="マシン清掃"><a href="#%E3%83%9E%E3%82%B7%E3%83%B3%E6%B8%85%E6%8E%83">マシン清掃</a></h1> <p><a href="https://crieit.now.sh/upload_images/067650d832d775b49d71d1c9921bfc62615068393ee4e.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/067650d832d775b49d71d1c9921bfc62615068393ee4e.jpg?mw=700" alt="これでも分解清掃後のマシンの図" /></a></p> <p>ほぼ盆栽弄りの様なものだ。</p> <p>パソコンを組み立てた事のある方には常識とは思うが;</p> <ul> <li>エアフロー(外気を底面に近い所から吸引、天井へと熱を逃して排気)を意識する</li> <li>メンテナンス容易性の観点から、フルタワーマシンが好ましい</li> </ul> <p>やってる事はその程度である。</p> <p>以降の工程に入る前に、「せっかくならもっとマシンに本気を出してもらう設定を組むきっかけ作りとして、BIOSやUEFIの内容をまっさらにする」為に、CMOS内のデータ保存用のボタン電池を取り外して作業をしてても良いだろう。</p> <h2 id="各部ファンの分解・グリース充填・ファンの羽根の清掃"><a href="#%E5%90%84%E9%83%A8%E3%83%95%E3%82%A1%E3%83%B3%E3%81%AE%E5%88%86%E8%A7%A3%E3%83%BB%E3%82%B0%E3%83%AA%E3%83%BC%E3%82%B9%E5%85%85%E5%A1%AB%E3%83%BB%E3%83%95%E3%82%A1%E3%83%B3%E3%81%AE%E7%BE%BD%E6%A0%B9%E3%81%AE%E6%B8%85%E6%8E%83">各部ファンの分解・グリース充填・ファンの羽根の清掃</a></h2> <p>⛔ ::手先の感覚や力加減に自信のある人 <strong>だけ</strong> ここの章はやれたらやりましょう。</p> <hr /> <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">同じ調子で簡易水冷クーラーもオーバーホール。 <a target="_blank" rel="nofollow noopener" href="https://t.co/ZPLM33rpyp">pic.twitter.com/ZPLM33rpyp</a></p>— まんじゅ(´ん`)@現世人型害畜 (@manzyun) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/manzyun/status/1438386303335206914?ref_src=twsrc%5Etfw">2021年9月16日</a></blockquote> <p>『勝手に修理・気ままに工作』さんの『<a target="_blank" rel="nofollow noopener" href="http://projexam.com/blog/hotall/DIY.php?itemid=91">PCファンの分解、メンテナンス</a>』を参照しながら行った。</p> <p>### 用意するもの</p> <ul> <li>大きめのマイナスドライバー x 2</li> <li>グリース (オイル <em>ではない</em> , また「CPUとヒートシンクの間」に塗る『放熱グリス』とも <em>違う</em> )</li> </ul> <p>グリースについてはスプレーで十分とは思うが、ペースト状の物を今回は使用。</p> <h3 id="やり方"><a href="#%E3%82%84%E3%82%8A%E6%96%B9">やり方</a></h3> <ol> <li>2本のドライバーをファンの軸部の境目に捻り込む</li> <li>マイナスドライバーをひねったり傾けたりして <em>ジワジワ</em> と外すつもりでやる</li> <li>外れたら楊枝などで羽根部位の支柱が入っていた所にグリースを <em>少しずつ</em> 継ぎ足す様に入れる</li> <li>羽根部位は固く絞った布などで軽く拭き、乾拭きをする。</li> <li>羽根部位の支柱と支柱が入っていた穴を合わせて押し込んで、手動で少し回す</li> </ol> <hr /> <p>2 の過程については、自分も初めてやった割には上手く行ってしまったので『コツ』と言える様なものがほぼ無い。しいて挙げるなら;</p> <ul> <li>ドライバーから来る張り・抵抗に注意を払う</li> <li>視覚も用いて張り・抵抗がどの位置から来ているのか注意を払う</li> <li>破損・破壊の不安を感じたら、 <strong>諦める</strong></li> <li><p>羽根を押し込む前に銅線(コイル)があまりにも乱れていたら、ととのえる</p> <p>くらいしか無い。</p> <p>そんな調子で、簡易水冷クーラーのラジエーターのファンとビデオカードのファンをメンテナンスした。ケース側面のファンについては「破壊する不安」を感じたので諦めた。</p></li> </ul> <h4 id="2022-04-12T1850 追伸"><a href="#2022-04-12T1850+%E8%BF%BD%E4%BC%B8">2022-04-12T1850 追伸</a></h4> <p>初めから期待はしていなかったが、<br /> 『ビデオカードのシリコングリースの塗り直し』<br /> をやった:</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MSIサポートの対象外へと足を踏み入れました。グリースをつけ直しても対して変わらないだろうけど。自己責任の覚悟、完了! <a target="_blank" rel="nofollow noopener" href="https://t.co/zOP8MjoGoS">pic.twitter.com/zOP8MjoGoS</a></p>— まんじゅ(´ん`)@現世社会的アウター (@manzyun) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/manzyun/status/1512366814323347458?ref_src=twsrc%5Etfw">April 8, 2022</a></blockquote> <p>残念な期待通りだったが、そこまで変わらなかった。</p> <p>上記を機会にと、ビデオカードの設定見直しを、<br /> 「常時高火力(演算性能)」<br /> から、<br /> 「自動演算能力性能制御」<br /> に切り替えたり、ビデオカードのネジのトルク(締め加減)を高め(強め)にした。</p> <p>『コンコルドの誤り』もあるだろうが、多少ファンの回転中に生じていた振動音が消えた様ではある。</p> <p>## ラジエーターやヒートシンクの清掃<br /> ⚠ :: 清掃対象に適する洗剤や清掃方法を事前によく確認しましょう。</p> <hr /> <p>大抵はエアーダスターで綿ホコリを飛ばすだけで十分かと思う。</p> <p><del>うっかり錆が付いていたら丁寧に取り除き、その部位には材質に適した防錆剤を塗布したら良いかもしれないが……今時そういったパーツに鉄を使っている事自体がまれなので、</del> 気にしなくて良い。</p> <p>## ビデオカードやRAMのマザーボードとの接触端子の清掃</p> <p>ここまで神経質にならなくても良いが、組み立ててから5年も使ってると、<br /> 「ねぎらいの心情」<br /> でやりたくなった。</p> <p>ごく普通に『無水エタノール』を染み込ませた綿棒で端子部分を拭いただけである。</p> <p>## BIOS・UEFIの設定<br /> ⚠ :: マシンのBIOS・UEFIのドキュメント(説明書)を事前に確認し、調整可能項目を踏まえてから操作しましょう</p> <p>分解清掃したパーツ群を適切に再装着をしたら、マシン起動直後にBIOS・UEFIの画面に遷移するコマンドキーを5回毎秒程度で連打し、それらの画面に遷移する。</p> <p>丁寧にCMOSの内容を破棄した方は見慣れないメッセージが出るかもしれないが、冷静に読めば内容の判る英語のはずなので、適切に『セットアップ画面』へ遷移する様に操作する。</p> <p>特筆する事は無いとは思うが、一応書いておく。</p> <ul> <li>IOMMU(Intelだと『VT-x』とかかも)の有効化</li> <li>ファンの回転数は高め(35℃代で1000rpmを基準)に設定</li> </ul> <h1 id="Linux-Zenの導入"><a href="#Linux-Zen%E3%81%AE%E5%B0%8E%E5%85%A5">Linux-Zenの導入</a></h1> <p>おそらくこの記事の一番のお題。</p> <p>自分が下手に説明するより、『点と接線。』さんの『<a target="_blank" rel="nofollow noopener" href="https://riq0h.jp/2020/12/07/210053/">linux-zenの導入について</a>』を読んだ方が誤解が無い気がする:</p> <blockquote> <p>一方、linux-zen、俗にZENカーネルと呼ばれるカスタムカーネルにはもっと普遍的な付加価値がありそうに思われた。なんせArch LinuxのWikiでは下記のように説明されている。</p> <blockquote> <p>ZEN Kernel はカーネルハッカーたちの知恵の結晶です。日常的な利用にうってつけの最高の Linux カーネルになります。詳しい情報は https://liquorix.net を見てください (Debian 向けの ZEN ベースのカーネルバイナリ)。</p> </blockquote> <p>なるほど、いかにもすごそうだ。しかしこれでは抽象的すぎて説明になっていない。文中のリンク先にもそのものズバリの情報はなかったので、自ら調べたところ下記の解説が得られた。</p> <blockquote> <p>Well I think the Zen Kernel (or the patches that are applied to it) increases your system’s responsiveness and lowers your latency at the expense of some performance hit (I’d say about 1-3% at best).</p> </blockquote> <p>簡単に言えばわずかなパフォーマンスの犠牲(1~3%くらい)と引き換えにシステムの応答性を向上させてくれるカーネルということらしい。</p> </blockquote> <p>Ubuntu含むDebianディストリビューションでは2つの選択肢がある。『<a target="_blank" rel="nofollow noopener" href="https://liquorix.net/">Liquorix</a>』と『<a target="_blank" rel="nofollow noopener" href="https://xanmod.org/">XanMod</a>』である。</p> <h2><a target="_blank" rel="nofollow noopener" href="https://liquorix.net/">Liquorix</a></h2> <p>Liquorixをかい摘んで筆者の言葉で述べるなら、<br /> 「 <em>最新のLinuxカーネル</em> に ZEN なカスタムを施したカーネルバイナリパッケージ」<br /> である。</p> <p><em>最新のLinuxカーネル</em> というのがやや難儀なもので、テキトーな比較資料として筆者のマシンで <code>ls /boot/ -l | grep -e "^vmlinuz.*</code> を叩いてみる:</p> <pre><code class="shell-session">~ $ ls /boot/ | grep -e "^vmlinuz.*" vmlinuz vmlinuz-5.10.65-rt53-xanmod1 vmlinuz-5.13.0-16-generic vmlinuz-5.13.19-xanmod1 vmlinuz-5.14.0-6.4-liquorix-amd64 vmlinuz-5.14.0-7.1-liquorix-amd64 vmlinuz.old </code></pre> <p>注目して頂きたいのは、 <code>vmlinuz-5.13.0-16-generic</code> と <code>vmlinuz-5.14.0-6.4-liquorix-amd64</code>, それと <code>vmlinuz-5.14.0-7.1-liquorix-amd64</code> の行である。マイナーバージョンがガラリと変わっている事がお判り頂けるだろうか。</p> <p>差し当って「ホームユース」には支障は無いので神経質になる必要は無いものと思う。 <del>「Ubuntuをホームユースしている人が稀」とは言わないでくれ。ここに居るんだ。</del></p> <p>筆者も初めはこちら(ただしベータリリース起動後しばらくは除く)を使っていたが、<br /> 「UbuntuでDTMを真面目にやるとすると、RealTimeカーネルかねえ……」<br /> と魔が差してしまった為、次に紹介するカスタムカーネルを用いる様になった。</p> <h2><a target="_blank" rel="nofollow noopener" href="https://xanmod.org/">XanMod</a></h2> <p>Webページが「ゲーマー向け」だったので当初は避けてしまっていたが最近は、<br /> 「いや、ゲームを作りたいんだったら、ゲーム向けにカスタムされたカーネルを使うのは必然だったのでは?」<br /> とか、<br /> 「 <code>stable</code> パッケージを作っていて、かつUbuntuのgenericカーネルとの開きはそこまで無い」<br /> 「RealTimeカーネルも有り難いなあ」<br /> とつい思い抱いて浮気する形となっている。</p> <hr /> <p>とはいえ、そこまでRealTimeを意識する事があるかと問われると……それこそ<a target="_blank" rel="nofollow noopener" href="https://jackaudio.org/">JACK</a>オーディオサーバーもカリッカリにチューニングした上で<a target="_blank" rel="nofollow noopener" href="https://mixxx.org/">Mixxx</a>や<a target="_blank" rel="nofollow noopener" href="https://ardour.org/">Ardour</a>で高サンプリング周波数の音声ファイルを扱ったDJ,DAWをする時に必要になるのかもしれない。 <del>つまり直近では無い</del></p> <p>マシンの用途に合わせて選んで、PPAを追加し、インストールして頂きたい。</p> <h1>最新の <code>freedesktop.org</code> 製グラフィックドライバ</h1> <p>次に、 <a target="_blank" rel="nofollow noopener" href="https://launchpad.net/~oibaf/+archive/ubuntu/graphics-drivers">oibaf氏がLaunchpadで提供しているPPA</a>を追加してビデオカードのアップグレードを行う。(コマンドは省略)</p> <h2>なんで <code>freedesktop.org</code> 製(フリーソフトウェア)を使うのか</h2> <p><a target="_blank" rel="nofollow noopener" href="https://wiki.archlinux.jp/index.php/PRIME">PRIME</a>を使いたいので。</p> <p>当初これをしたかった訳では無いが、デスクトップマシンはたまたまビデオカードが2枚になったので、思う存分にビデオカードの演算能力を発揮してもらおうと。<br /> そしてラップトップマシンはNvidiaのビデオカードだが、プロプライエタリなドライバだとあまり応答速度が良くない印象だったので。</p> <h2 id="カーネルモジュール設定とパラメーター"><a href="#%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E8%A8%AD%E5%AE%9A%E3%81%A8%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC">カーネルモジュール設定とパラメーター</a></h2> <p>カーネルモジュールが何なのかについて、雰囲気解釈で良いなら「Linuxカーネルのアドオン」と解釈しておけば良いかと。<br /> Linuxで仮想カメラを実現する <code>v4l2loopback</code> もその一つ。</p> <p>パッケージをインストールしただけで本領を発揮する事が多いとは思うが、筆者は、<br /> 「ビデオチャットのクライアントアプリ(Zoomとか<a target="_blank" rel="nofollow noopener" href="https://jitsi.org/jitsi-meet/">Jitsi</a>とかDiscordとか……)と仮想カメラ制御用ソフト(<a target="_blank" rel="nofollow noopener" href="https://obsproject.com/ja">OBS Studio</a>)を起動しても平気」<br /> という状態まで持って来るまで異様に時間が掛ってしまった為、この様に健忘対策で記している。</p> <p>この辺りの情報は <del>賞賛するが悔しいものの</del> 『ArchWiki』の『<a target="_blank" rel="nofollow noopener" href="https://wiki.archlinux.jp/index.php/AMDGPU">AMDGPU</a>』の項が大変参考になった。</p> <p>ただしUbuntuの場合(というより筆者の場合)は多少読み換えが必要な箇所があった。</p> <p>『ArchWiki』に倣い <code>/etc/modprobe.d/radeon.conf</code> の内容は ;</p> <pre><code class="conf">options radeon_si_support=0 </code></pre> <p><code>/etc/modprobe.d/amdgpu.conf</code> の内容は;</p> <pre><code class="conf">options amdgpu_si_support=1 </code></pre> <p>とし、念の為 <code>/etc/modules</code> ファイルに <code>amdgpu</code> と1行追記した。</p> <p>ここまで行った後で一度 <code>update-initramfs -u -k 'all'</code> を行なうのは <strong>必須</strong> なので、忘れぬ様。</p> <h2 id="ビデオカードの冷却コントロールとモニタリングツール"><a href="#%E3%83%93%E3%83%87%E3%82%AA%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E5%86%B7%E5%8D%B4%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%A8%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%84%E3%83%BC%E3%83%AB">ビデオカードの冷却コントロールとモニタリングツール</a></h2> <p>🛈 :: 必須では無いですが、あると便利なツールの紹介です。</p> <hr /> <ul> <li><code>amdgpu-fan</code> <a target="_blank" rel="nofollow noopener" href="https://github.com/chestm007/amdgpu-fan">GitHubリポジトリ</a> :: Python製のRadeonビデオカードのファン制御スクリプト。後記するカーネルパラメーターの設定によってはこれが必要になる。 <code>pip3 install amdgpu-fan</code> でインストール。</li> <li><code>bpytop</code> <a target="_blank" rel="nofollow noopener" href="https://github.com/aristocratos/bpytop">GitHubリポジトリ</a> :: CPUやRAMの使用率やプロセス一覧と制御を行えるCUIツール。ターミナル上で動かすからと侮る無かれ。 <code>pip3 install bpytop</code> でインストール。</li> <li><code>radeontop</code> <a target="_blank" rel="nofollow noopener" href="https://github.com/clbr/radeontop">GitHubリポジトリ</a> :: ビデオカードのVRAMやクロック周波数の確認ができるCUIツール。ちゃんとグラフ表示なので安心。 <code>apt install radeontop</code> でインストール。</li> </ul> <h1 id="カーネルパラメーター"><a href="#%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC">カーネルパラメーター</a></h1> <p>カーネルパラメーターとは何かについては、また雰囲気解釈で良いなら「ビルド済みのLinuxカーネルそのものに後から設定できる値」と解釈しておくのが良いかと。</p> <p>こちらに関しては「Windowsとのデュアルブート」をしている方々にはお馴染みで <del>嫌悪される事もある?</del> <code>grub2</code> の設定で、<br /> 「全てのカーネルに対してのカーネルパラメーター」<br /> を当てた。以下筆者の、 <code>/etc/default/grub</code> の先頭から数十行抜粋:</p> <pre><code># If you change this file, run 'update-grub' afterwards to update # /boot/grub/grub.cfg. # For full documentation of the options in this file, see: # info -f grub -n 'Simple configuration' # [NOTE] This section was enabled auto select kernel from before booted. GRUB_DEFAULT=saved GRUB_SAVEDEFAULT=true # [HACK] I don't know `GRUB_TIMEOUT` values effect too... GRUB_TIMEOUT_STYLE=hidden GRUB_TIMEOUT=3 GRUB_HIDDEN_TIMEOUT=3 GRUB_HIDDEN_TIMEOUT_QUIET=true # [CAUTION] Do NOT remove this section! GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` # [NOTE]:: # - amd_iommu=on :: Enable IOMMU on Kernel. Of course, Enabled IOMMU on UEFI # - amdgpu.runpm=0 :: Turn off power management on VGA board, maybe. # - amdgpu.audio=0 :: Interesting bug. Turn off audio support amdgpu: # The kernel was supported HDMI audio. but, If that option was enabled, # HDMI display make buggy view. GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on amdgpu.runpm=0 amdgpu.audio=0" GRUB_CMDLINE_LINUX="" </code></pre> <p>最初の4行は元々あるコメントだが、それ以外のコメント部分は「筆者の知性と教養」で書いたテキトー英語なので、頭の悪さが垣間見えるだろう。</p> <p>一番重要なのは <code>GRUB_CMDLINE_LINUX_DEFAULT=...</code> の中の <code>amd_iommu=on</code> である。</p> <p>ハイパーバイザー型の仮想環境からのビデオカードへのアクセスの用途で使う記憶ではあるが、筆者の学習不良につき、<br /> 「なぜIOMMUがPRIMEの利用可否に影響を与えるのか」<br /> について解説できない現状である。</p> <p>さて、ここまで来たら再起動…… <strong>の前に</strong> <code>update-grub2</code> をしっかり叩いてビルド完了を見送る事。</p> <h1 id="モニタリング"><a href="#%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0">モニタリング</a></h1> <p>🛈 :: 必須では無いですが、できると今後のチューニングが捗ります。</p> <hr /> <p><a href="https://crieit.now.sh/upload_images/b5bbc9b34002d9ceffa56a1889b3c12961506a5003eb2.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b5bbc9b34002d9ceffa56a1889b3c12961506a5003eb2.jpg?mw=700" alt="サブモニタでCPUとGPU2台の様子を観察している図" /></a></p> <p>Ubuntuの再起動後は、マシンのファンの音やデスクトップ環境の挙動を眺めて調整していくのも一つかと思う。</p> <p>もし「サブモニタ」を使えるならば、上に載せた画像の様にいくつかのツールを起動しておいて観測しておくと、ファンの適切な回転数やプロセッサの限界値が垣間見えるかもしれない。</p> <p>それでは、良きLinuxデスクトップライフを……え、嫌?</p> <h1 id="補足資料"><a href="#%E8%A3%9C%E8%B6%B3%E8%B3%87%E6%96%99">補足資料</a></h1> <p><code>update-initramfs</code> や <code>update-grub2</code> についての詳しい話は『Ubuntu Weekly Recipe』の下記をご覧頂けると幸い:<br /> * <a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0638">第638回 Ubuntuに「普通に」ログインするいろいろな方法</a><br /> * <a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0639">第639回 Ubuntuに「トラブル時に」ログインするいろいろな方法</a></p> <p>また、Ubuntuでの「Steamで配信されているゲーム」については、下記も非常に参考になった:<br /> * <a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/admin/serial/01/ubuntu-recipe/0626">第626回 UbuntuでもSteamのWindowsゲームを!</a><br /> * <a target="_blank" rel="nofollow noopener" href="https://qiita.com/mehdi/items/b78778c4afe40d222538">AMD GPUを使用してLinux/Ubuntu 20.04でCyberPunk 2077をプレイする方法 - Qiita</a></p> <p>さらに、「『Wayland』上での『GNOMEデスクトップ環境』で『OBS Studio』の画面・ウィンドウキャプチャをする」に当っては<a target="_blank" rel="nofollow noopener" href="https://www.kofuk.org/blog/20210414-obs-wayland-screen-capture/">OBS StudioにWaylandのスクリーンキャプチャが入ったので試してみた - チラシの裏とかそういう類の</a>に助けられた。</p> <p>これらの記事を記して下さった皆々様、もちろんArchWikiのページを編集している皆様には、改めてこの場で感謝申し上げさせて頂く。</p> <h1 id="この後"><a href="#%E3%81%93%E3%81%AE%E5%BE%8C">この後</a></h1> <p>以降、この記事を書き終えた後で色々気づいた事を書き留めてる。</p> <h2 id="2021-09-27T08:12"><a href="#2021-09-27T08%3A12">2021-09-27T08:12</a></h2> <p>カーネルのアップグレードが入ると(ベータリリースのディストリビューションを使っているので尚更)高頻度で、<br /> 「一部のソフトウェア・アプリケーションが画面表示されない」<br /> 事象が発生する。</p> <p>対処方法は単純に(思考停止だが)「再インストール」で何とかしているので、それについて追記する:</p> <pre><code>sudo ppa-purge oibaf/graphics-drivers -- # oibafさん提供の最新ドライバを一旦消してダウングレード sudo apt autoremove && sudo apt autoclean -- # 念の為消せるパッケージや設定は削除する sudo sed 's/^# deb /deb /' /etc/apt/sources.list.d/oibaf-ubuntu-graphics-drivers-{DistroCodeName}.list -- # ppa-purgeで無効にしたリポジトリを有効化する。不安な人は『ソフトウェアとアップデート』などの他プログラムで編集する事を強く勧める。なお {DistroCodeName} は「PPAを追加した時のUbuntuのコードネーム」になる。 sudo apt update && sudo apt upgrade -- #アップデート(パッケージリストの更新)とアップグレード(パッケージそのものの更新) sudo systemctl reboot -- # 再起動。古いコマンドではあるが `sudo shutdown -r now` でも良い。 </code></pre> <h2 id="2021-10-16T17:24"><a href="#2021-10-16T17%3A24">2021-10-16T17:24</a></h2> <p><a target="_blank" rel="nofollow noopener" href="カーネルパラメーター">カーネルパラメーター</a> を以下の様に変更;</p> <pre><code class="diff">- GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on amdgpu.runpm=0 amdgpu.audio=0" + GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on" </code></pre> <p>理由というより、こうなるに至った展開は;</p> <ol> <li><code>amdgpu-fan</code> が <code>YAML</code> ファイルの読み込みで起動しなくなった</li> <li>カーネルパラメーターを見直して以下を思った:<br /> 2.1. LinuxカーネルにAMD自体もコミットしてなかったっけ?<br /> 2.2. 3年も経っていてかつ、新しめのカスタムカーネルなら、そういう変更(パッチ)も適用されているのでは?</li> <li>試しに消す。 <strong>ビデオカードのファンが回ってくれた</strong></li> </ol> <p>この後で <code>amdgpu-fan</code> の本体であるPythonスクリプトを少し弄るが問題の根が深そうなので諦め、<a target="_blank" rel="nofollow noopener" href="https://misskey.io/notes/8r5wg1rh10">川音リオ氏にお勧め頂いた</a>『<a target="_blank" rel="nofollow noopener" href="https://gitlab.com/corectrl/corectrl">CoreCtrl</a>』で、ビデオカードのファンの回転数を高めにするのであった。幸いパッケージの衝突は無かった。</p> <h2 id="2023-12-09T10:45"><a href="#2023-12-09T10%3A45">2023-12-09T10:45</a></h2> <p>その後、数回のディストリビューションアップグレードでパッケージが一旦アンインストールされるという事があったので、今後困る事があるかもしれないので書いておく</p> <h3 id="Steam Protonで動かしていたゲームが起動しなくなった"><a href="#Steam+Proton%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F">Steam Protonで動かしていたゲームが起動しなくなった</a></h3> <p><code>sudo apt install dxvk mesa-vulkan</code> で解消した。要は、<br /> 「DirectXの役割をVulkanに代替するライブラリと、Vulkanそのものがいつの間にか抜けていた」<br /> という事だ</p> <p>調査方法はうろ覚えだが、『Steam Lancher』で調査したいゲームの設定からコマンドを次の様に編集し、コンソールログをファイル出力した:<br /> <code>%command% -condebug</code></p> <p>出力したログファイルは <code>$HOME/.steam/steam/log</code>の配下にそれっぽいものが出力されたと思う</p> <h3 id="CoreCtrl がアップグレード後に、また管理者権限を要求される"><a href="#CoreCtrl+%E3%81%8C%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E5%BE%8C%E3%81%AB%E3%80%81%E3%81%BE%E3%81%9F%E7%AE%A1%E7%90%86%E8%80%85%E6%A8%A9%E9%99%90%E3%82%92%E8%A6%81%E6%B1%82%E3%81%95%E3%82%8C%E3%82%8B">CoreCtrl がアップグレード後に、また管理者権限を要求される</a></h3> <p>アップグレード後のお約束なので、<code>mkdir $HOME/.local/etc.bak</code> とディレクトリを作っておいて、設定ファイルの原本をそこに置いておくと後々楽。なお筆者の例:</p> <pre><code class="shell-session">$ pwd /home/manzyun/.local/etc.bak $ ls -l 合計 8 -rw-rw-r-- 1 manzyun manzyun 86 12月 28 2021 90-corectrl.pkla -rw-rw-r-- 1 manzyun manzyun 310 12月 28 2021 90-corectrl.rules $ cat 90-corectrl.rules polkit.addRule(function(action, subject) { if ((action.id == "org.corectrl.helper.init" || action.id == "org.corectrl.helperkiller.init") && subject.local == true && subject.active == true && subject.isInGroup("manzyun")) { return polkit.Result.YES; } }); $ sudo cp ./90-corectrl.rules /etc/polkit-1/rules.d/ </code></pre> <h1 id="蛇足"><a href="#%E8%9B%87%E8%B6%B3">蛇足</a></h1> <ul> <li>PRIMEを有効活用するにはビデオカードが2枚必要になる。さらに「 <em>一枚のビデオカードに映像出力を全て任せる</em> 」ケーブル接続を行わないと、「2ヶ月経っても安定してグラフィック編集ソフトを駆動できない」筆者の様になる。 <ul> <li>しかしPRIMEの有効性から察するに、ビデオカード2枚挿し(特にマザーボードに映像出力端子が備わっていない構成のマシン)はかなり有効な手立てかもしれない。</li> <li>SteamランチャーからのゲームでPRIMEを使う場合は、ゲームの起動オプションで <code>env DRI_PRIME=1 %command%</code> と指定するのが良さそうではある。</li> <li>実はUbuntuメニューに表示される <code>*.desktop</code> ファイルでも同じく <code>env</code> コマンドで環境変数を指定する事ができる。</li> </ul></li> <li><code>/etc</code> 配下を弄り倒すのは割と勇気が要る。しかし <code>etckeeper</code> と <code>brz</code> や <code>git</code> を入れておくと、多少心配事が少なくなると思う。</li> </ul> まんじゅ(´ん`) tag:crieit.net,2005:PublicArticle/17180 2021-05-19T09:57:20+09:00 2021-05-21T01:14:28+09:00 https://crieit.net/posts/Vagrant-Temporary-failure-resolving-DNS Vagrant で Temporary failure resolving となる問題の解決 - イントラネット DNS 編 <p>Vagrant で Ubuntu の VM を立ち上げたとき、 apt 等を行おうとすると、以下のようなエラーに遭遇した。</p> <pre><code class="plain">client: Err:1 http://security.ubuntu.com/ubuntu focal-updates/main amd64 libjpeg-turbo8 amd64 2.0.3-0ubuntu1.20.04.1 client: Temporary failure resolving 'proxy.local.example' </code></pre> <p>上記のエラーの内容はプロキシに接続できないというものだが、 問題のポイントはプロキシかどうかはあまり関係が無く、 名前解決に失敗しているという部分だ。<br /> こういうのはだいたい <code>systemd-resolved</code> のスタブリゾルバ周りの問題だと相場が決まっている。</p> <p>…ということで、順番に確認しながら問題を解決していこう。</p> <p>なお、 使った box は <code>generic/ubuntu2004</code> で、 VirtualBox で VM をホストしている。</p> <h2 id="スタブリゾルバの確認"><a href="#%E3%82%B9%E3%82%BF%E3%83%96%E3%83%AA%E3%82%BE%E3%83%AB%E3%83%90%E3%81%AE%E7%A2%BA%E8%AA%8D">スタブリゾルバの確認</a></h2> <p>まず、 <code>resolv.conf</code> を確認してみる。</p> <pre><code class="plain">$ cat /etc/resolv.conf # This file is managed by man:systemd-resolved(8). Do not edit. # # This is a dynamic resolv.conf file for connecting local clients to the # internal DNS stub resolver of systemd-resolved. This file lists all # configured search domains. # # Run &quot;resolvectl status&quot; to see details about the uplink DNS servers # currently in use. nameserver 127.0.0.53 </code></pre> <p>テキストファイルのコメントに書いてあるとおり、コイツを書き換えるのは悪手。</p> <p>ネームサーバーが 127.0.0.53 を指しているが、 これが <code>systemd-resolved</code> のスタブリゾルバだ。</p> <p>ここで言う<strong>リゾルバ</strong>とは、ドメイン名を元にIPアドレスを解決する仕組みのことを指していて、 DNS なども同様の機能を持っている。<br /> その中でも、<strong>スタブリゾルバ</strong>は、(「スタブ」と言うだけあって、)それ自身はドメイン名とIPの対応リストを持たずに、 DNS 等の他のリゾルバを呼び出して解決する仕組みをもっている、ローカルのサービスだ。<br /> ローカルアプリケーションが直接 DNS を参照せず、一旦スタブリゾルバを参照することで、 <code>systemd</code> で管理された適切な DNS を自動的に参照されるようになったり、 DNS では解決できない <code>hostname.local</code> といったホスト名ベースの名前解決 (mDNS) を行えるようになっている。</p> <p>さて、 そのスタブリゾルバがどう動いているか <code>resolvectl status</code> で確認してみよう。</p> <pre><code class="plain">$ resolvectl status [...] Global Current DNS Server: 4.2.2.1 DNS Servers: 4.2.2.1 4.2.2.2 [...] Link 2 (eth0) Current Scopes: DNS DNSSEC supported: yes Current DNS Server: 4.2.2.1 DNS Servers: 4.2.2.1 4.2.2.2 208.67.220.220 10.0.2.3 </code></pre> <p>4.2.2.1 や 208.67.220.220 などが DNS に設定されているのがわかる。<br /> これらは、いわゆるパブリックDNSだ。</p> <p>実は、先ほど名前解決できなかったプロキシは、 LAN 内のサーバーだった。 このため、 パブリックDNSに問い合わせられてしまっては、名前解決ができないのも当然だ。</p> <h2 id="パブリックDNS はどこで設定されているのか"><a href="#%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AFDNS+%E3%81%AF%E3%81%A9%E3%81%93%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B">パブリックDNS はどこで設定されているのか</a></h2> <p>名前解決に失敗する理由はわかった。 しかし、この DNS はどこで設定されているのか?</p> <p>ざっと確認してみたところ、 <code>resolved.conf</code> の設定と、 仮想マシン内の NAT を繋いだ NIC の netplan 設定に、それっぽい設定が書かれていた。</p> <pre><code class="plain">$ cat /etc/systemd/resolved.conf [Resolve] DNS=4.2.2.1 4.2.2.2 208.67.220.220 </code></pre> <pre><code class="plain">$ cat /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: eth0: dhcp4: true dhcp6: false optional: true nameservers: addresses: [4.2.2.1, 4.2.2.2, 208.67.220.220] </code></pre> <p>これらは通常の Ubuntu のインストールプロセスでは設定されないので、 <code>generic/ubuntu2004</code> の box の作成者の味付けなのだろう。</p> <p>これらの DNS のアドレスの設定を、プライベートネットワーク内の DNS のアドレスに書き換えてしまえば、きっと意図した動作に近づくはずだ。</p> <h2 id="スタブリゾルバを使わずに LAN内 の DNS を指定する"><a href="#%E3%82%B9%E3%82%BF%E3%83%96%E3%83%AA%E3%82%BE%E3%83%AB%E3%83%90%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E3%81%AB+LAN%E5%86%85+%E3%81%AE+DNS+%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B">スタブリゾルバを使わずに LAN内 の DNS を指定する</a></h2> <p>スタブリゾルバは、細かい優先度合いの制御などを外から行えない。 これはネットワークの状況に応じて最適調整してくれる設計だからなのだが、 Vagrant で立ちあげる VM のように、 NAT の DNS や ローカルの DNS が混在していると、うまく調整できずに、こういった問題の解決がやりにくい。</p> <p>スタブリゾルバを動かしているままでも問題なく動いているのならそれでもかまわないのだが、 上記の DNS の書き換えを行ってもどうも意図通りに名前解決されない場合は、 <code>systemd-resolved</code> のスタブリゾルバを使わずに、 <code>/etc/resolv.conf</code> の nameserver を切り替えるようにしたい。</p> <p>具体的には、 <code>/etc/resolv.conf</code> が <code>../run/resolvconf/resolv.conf</code> へのシンボリックリンクになっているところ、 <code>../run/systemd/resolve/resolv.conf</code> へのシンボリックリンクに書き換える。<br /> こうすることで、 <code>resolved.conf</code> や netplan で設定した DNS が直接 <code>/etc/resolv.conf</code> の nameserver に書かれるようになる。<br /> 詳しくは、 <a target="_blank" rel="nofollow noopener" href="https://translate.google.com/translate?hl=ja&sl=en&u=https://man.archlinux.org/man/systemd-resolved.8.en&prev=search&pto=aue">systemd-resolved.service のマニュアル</a> あたりを見て欲しい。</p> <p>…と、このような書き換えを、 Vagrantfile の定義に書き落とすと、以下のようになる。<br /> なお、以下は <code>192.168.11.1</code> がローカルネットワークの DNS のアドレスである場合の例なので、適宜書き換えていただければと。</p> <pre><code class="ruby">config.vm.provision :shell, inline: <<-'SHELL' ln -sf ../run/systemd/resolve/resolv.conf /etc/resolv.conf sed -i -E '/nameservers:/{n; s/(addresses:).*/\1 [192.168.11.1]/}' /etc/netplan/01-netcfg.yaml netplan apply sed -i -E 's/(^\s*DNS\s*=\s*).*$/\1192.168.11.1/' /etc/systemd/resolved.conf systemctl restart systemd-resolved.service SHELL </code></pre> <p>そうすると、 <code>resolv.conf</code> の中身が以下のように netplan の設定などから求められた DNS に置き換えられ、スタブリゾルバを経由せずに名前解決されるようになる。</p> <pre><code class="plain">$ cat /etc/resolv.conf # This file is managed by man:systemd-resolved(8). Do not edit. # # This is a dynamic resolv.conf file for connecting local clients directly to # all known uplink DNS servers. This file lists all configured search domains. # nameserver 192.168.11.1 nameserver 10.0.2.3 </code></pre> <p>このようになれば、ローカルの DNS でキチンと名前解決されるようになるだろう。</p> advanceboy tag:crieit.net,2005:PublicArticle/16459 2021-01-03T15:39:43+09:00 2021-01-26T18:29:28+09:00 https://crieit.net/posts/Ubuntu-Server-18-04-xrdp 【Ubuntu Server 18.04】xrdpをインストールする <p>Ubuntu Server のGUIをMacでもWindowsでもリモート操作したい場合にxrdpがわりと便利です。<br /> 以下導入手順です。</p> <h2 id="動作確認済み動作環境"><a href="#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%E6%B8%88%E3%81%BF%E5%8B%95%E4%BD%9C%E7%92%B0%E5%A2%83">動作確認済み動作環境</a></h2> <ul> <li>サーバ Ubuntu Server 18.04.3 LTS</li> <li>クライアント MacOS 10.14.5 + Microsoft Remote Desktop 10.2.13</li> </ul> <h2 id="導入手順"><a href="#%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86">導入手順</a></h2> <h3 id="1. xrdpインストール"><a href="#1.+xrdp%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">1. xrdpインストール</a></h3> <p>aptでインストールします</p> <pre><code class="bash">$ sudo apt -y install xrdp </code></pre> <p>一応これでもリモートログインできるが以下のダイアログが出てきて、ログインの度にキャンセルしないとリモート操作ができず気持ち悪い。2.の手順で解消できます。<br /> <a href="https://crieit.now.sh/upload_images/22c2ca0bb675f906c691de2ae380fd1b5ff163ed7aafc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/22c2ca0bb675f906c691de2ae380fd1b5ff163ed7aafc.png?mw=700" alt="141a685d38e27963a70a43ee27afec33.png" /></a></p> <h3 id="2. 認証が要求されましたダイアログを出さない方法"><a href="#2.+%E8%AA%8D%E8%A8%BC%E3%81%8C%E8%A6%81%E6%B1%82%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%82%92%E5%87%BA%E3%81%95%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95">2. 認証が要求されましたダイアログを出さない方法</a></h3> <p>どこかで似たような症状が出た人の対応策を丸パクリですが、xrdp-color-manager.pklaファイルにおまじないを記述します</p> <pre><code class="bash">$ sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla <<EOL >/dev/null [Netowrkmanager] Identity=unix-user:* Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile ResultAny=no ResultInactive=no ResultActive=yes EOL </code></pre> <p>反映のため、polkitを再起動します</p> <pre><code class="bash">$ sudo systemctl restart polkit </code></pre> <p>以上で完了です。</p> arohajiro tag:crieit.net,2005:PublicArticle/16042 2020-09-01T00:07:27+09:00 2020-09-01T02:54:31+09:00 https://crieit.net/posts/Raspberry-Pi-Ubuntu-SSH-A-to-B Raspberry Pi に Ubuntu を入れて SSH でログインするまでの A to B <p>何番煎じかわからないが、 Raspberry Pi (以下、 RasPi) に Ubuntu を入れる手順についてまとめてみようと思う。</p> <p>Ubuntu 公式の <a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi">How to install Ubuntu on your Raspberry Pi</a> チュートリアルは充実しているし、 単にインストールして動かすだけなら、既にある記事でも十分だろうとは思う。<br /> しかし、初回セットアップ時の細かいカスタマイズについて書かれているものがあまり見当たらなかったので、この記事ではそれについて補足しながらまとめていく。</p> <p>先に断っておくが、 cloud-init による IaC の話が中心になる。</p> <h2 id="TL;DR"><a href="#TL%3BDR">TL;DR</a></h2> <ul> <li>焼いた SD を RasPi に挿す<strong>前</strong>にブートプロセスの設定を書き換える</li> <li>cloud-init の挙動を理解しろ</li> <li>モニター無し & 無線LAN Only だと、工夫がいる</li> <li>ARP リクエストのブロードキャストが届かないと苦労する</li> </ul> <h2 id="きっかけ"><a href="#%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91">きっかけ</a></h2> <p>完全に私事だが、 おしごとで Linux 使うことが増えてきて、 WSL (or WSL2) や仮想マシン上の知識だけではなかなか難しい、ネットワーク回りの知識が不足してきた。<br /> そこで、勉強がてら何らかの物理的な Linux マシンが欲しかった。</p> <p>中古の x86 ラップトップに Linux を入れるのでも良かったのだが、 それだと Linux 向けの無線やネットワーク回りのドライバーが揃っているか確認するのが難しい。<br /> そこで、様々な Linux ディストリビューションが公式でサポートされ、 I/O も充実していて、 コスパの高い Raspberry Pi 4 B+ をチョイス。</p> <p>これまで、 RasPi 自体は所持していたのだが、 電子工作目的であったことから Raspberry Pi OS (旧 Raspbian) しか入れていなかった。<br /> より Linux サーバーらしい使い方も試してみたいと言うことから、今回は Ubuntu をいれることした。</p> <p>いざ、セットアップはじめようとして、致命的な問題に気づく。<br /> <strong>micro-HDMI のケーブルを持っていないと言うことに…</strong></p> <p>ということで、 なんとかセットアップを工夫して、 <strong>モニターが無くても一通り設定して ssh できる</strong> ところまで持って行くことを目標にする。</p> <h2 id="準備"><a href="#%E6%BA%96%E5%82%99">準備</a></h2> <p>用意するものは以下の通り。</p> <ul> <li>Raspberry Pi 2 または 3 または 4</li> <li>8GB 以上の microSD カード</li> <li>misroSD を書き込める PC (Win, Linux, mac)</li> <li>インターネットに繋がる Wi-Fi または イーサネットケーブル</li> </ul> <p>RasPi 無印 や Zero など、 SoC (CPU) が ARMv6 のものは、 Ubuntu ではサポートされていない。</p> <p>microSD カードは、 IOPS が速いものの方が、後々うれしいだろう。<br /> SD カードの規格で言えば、 アプリケーションパフォーマンスクラス A1 や A2 に対応しているものが良いというコトなのだろうが、正直モデル差やロット差が激しすぎるので、実際買ってみて IPOS が早いかどうか試してみるしかないと思う。</p> <p>以下のものも有れば望ましいが、今回の手順ではなくても大丈夫。</p> <ul> <li>HDMI (RasPi 4 の場合は micro-HDMI) で繋がるモニター</li> <li>RasPi 繋げる USB キーボード</li> </ul> <h2 id="ブータブル SD の作成"><a href="#%E3%83%96%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB+SD+%E3%81%AE%E4%BD%9C%E6%88%90">ブータブル SD の作成</a></h2> <p>まず、使用する Ubuntu の OS イメージを準備しよう。</p> <p>2020年8月時点では、 20.04 LTS と 18.04 LTS に対して、それぞれ 32bit版 と 64bit版 が存在する。</p> <p>特に理由が無ければ、 20.04 LTS の 64bit 版で良いだろう。<br /> 但し、 512MiB しか RAM がない RasPi 3A+ では、 64bit OS だと ssh でアクセスするだけで Out of Memory してしまうので、 32bit にすることをオススメする。<br /> また、 RasPi 2 の CPU は 32bit 版なので、 32bit OS しか選べない。</p> <p>microSD への書き込みは、 主に 以下の 2種類 の方法がある。<br /> どちらか好きな方でどうぞ。</p> <p>メモ:</p> <pre><code>以前は NOOBS という、 RasPi を起動後に OS 選択させてインストールさせるツールも存在したが、今回は触れない。 詳しくはググってほしい。 </code></pre> <h3 id="1. イメージファイルをダウンロードして 任意のツールで焼き込む"><a href="#1.+%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6+%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A7%E7%84%BC%E3%81%8D%E8%BE%BC%E3%82%80">1. イメージファイルをダウンロードして 任意のツールで焼き込む</a></h3> <p><a href="https://crieit.now.sh/upload_images/cf06274a6f0865c95189a30c93ffa1195f4d1191446db.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cf06274a6f0865c95189a30c93ffa1195f4d1191446db.png?mw=700" alt="raspi-ubuntu-a-to-b-00.png" /></a><br /> <a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/download/raspberry-pi">Install Ubuntu Server on a Raspberry Pi 2, 3 or 4</a> のページからダウンロードしたイメージファイルを、任意のツールで microSD に焼く方法。</p> <p>個人的には、 <a target="_blank" rel="nofollow noopener" href="https://www.balena.io/etcher/">balenaEtcher</a> を使って焼くのが、以下の理由でオススメ。</p> <ul> <li>.gz, .xz, zip などで圧縮された状態のイメージをそのまま焼ける <ul> <li>オンザフライで解凍しながら焼かれるので、あらかじめ展開しておく必要が無い</li> <li>... と思っていたけど、最近のバージョンでは一旦一時ファイルに展開されてから焼かれるっぽい。 それでも早いけど。</li> </ul></li> <li>Portable 版がある (インストール不要)</li> </ul> <h3 id="2. Raspberry Pi Imager を使う"><a href="#2.+Raspberry+Pi+Imager+%E3%82%92%E4%BD%BF%E3%81%86">2. Raspberry Pi Imager を使う</a></h3> <p><a href="https://crieit.now.sh/upload_images/19226279f917418413a8da2657fee0ee5f4d11a93a8bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/19226279f917418413a8da2657fee0ee5f4d11a93a8bc.png?mw=700" alt="raspi-ubuntu-a-to-b-02.png" /></a><br /> Raspberry Pi 財団公式サイトの <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.org/downloads/">Raspberry Pi Downloadsi</a> ページからダウンロードできる、 Raspberry Pi Imager を使って、 OS のイメージをダウンロードしながら microSD に焼く方法。</p> <p>Raspberry Pi Imager をインストールして起動すると、 インストールしたい OS を尋ねられるので、 ここで Ubuntu の任意のバージョンを選択する。</p> <p>ダウンロードしながらそのまま焼き込むため、本来なら (1) よりも早くてオススメのハズ…<br /> …なのだが、少なくとも私が試した限り、 (1) のほうがずっと早いんだよねぇ。。。</p> <p>OS イメージを DL元 が違って、ダウンロード速度がネックになって遅くなっているのかな…<br /> あまり深く調べてないけど。</p> <h2 id="system-boot パーティション内の cloud-init 等の設定を書き換える"><a href="#system-boot+%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E5%86%85%E3%81%AE+cloud-init+%E7%AD%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">system-boot パーティション内の cloud-init 等の設定を書き換える</a></h2> <p>作成した micorSD を早速 RasPi に挿す <strong>…前に</strong> 、 初回セットアップ設定の書き換えを行う。</p> <p>一度書き込んだ microSD を再び PC に挿すと、 <code>"system-boot"</code> という 250MB 位の FAT32 パーティションが開けるはずだ。</p> <p>このパーティション直下にある <code>README</code> というファイルを開くと、このパーティションに存在するファイルの概要が簡単に書いてある。</p> <pre><code class="text">An overview of the files on the /boot/firmware partition (the 1st partition on the SD card) used by the Ubuntu boot process (roughly in order) is as follows: * bootcode.bin - this is the second stage bootloader loaded by all pis with the exception of the pi4 (where this is replaced by flash memory) * config.txt - the first configuration file read by the boot process * syscfg.txt - the file in which system modified configuration will be placed, included by config.txt * usercfg.txt - the file in which user modified configuration should be placed, included by config.txt * start*.elf - the third stage bootloader, which handles device-tree modification and which loads... * uboot*.bin - various u-boot binaries for different pi platforms; these are launched as the "kernel" by config.txt * boot.scr - the boot script executed by uboot*.bin which in turn loads... * vmlinuz - the Linux kernel, executed by boot.scr * initrd.img - the initramfs, executed by boot.scr * meta-data - meta-data for cloud-init; usually just contains the instance id * network-config - network configuration for cloud-init; edit this to set up wifi access points and other networking settings * user-data - user-data for cloud-init; edit this to configure initial users, SSH keys, packages, etc. </code></pre> <p>このパーティションには、 Raspberry Pi の BIOS の変わりとなる <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.org/documentation/configuration/config-txt/">config.txt, bootcode.bin, start.elf</a> と言った構成ファイルや、 ブートコード、 そして cloud-init の構成ファイルが入っている。</p> <p>このうち <strong>cloud-init</strong> というのは、 Infrastructure as Code (IaC) の一種だ。 その名の通り、 AWS 等のクラウド上の仮想マシンの初期設定を得意としている。<br /> 校正用の設定ファイル (YAML) を使って設定内容を記述することで、 クラウドやディストリビューションの違いをある程度吸収して初期設定を記述することができる。<br /> OS のイメージ内に予め cloud-init のサービス(デーモン) が組み込まれており、 OS の起動時に各クラウドのサービスの UI 経由で設定ファイルを読み取って、 主に初回起動時に初期設定処理が走る… というのが主な仕組みとなっている。</p> <p>RaspPi 用の Ubuntu Server イメージでは、この cloud-init 用の設定ファイルの取得元が上記の <code>system-boot</code> パーティションとなっている。<br /> イメージ組み込みの定義と <code>system-boot</code> パーティション内の定義を組み合わせて、 初期設定が実行される。</p> <p>例えば、 このイメージを使ってそのまま Ubuntu を起動すると、 "ubuntu" という ログイン ID に "ubuntu" というパスワードが設定され、 SSH のパスワード認証が有効になった状態で起動している。<br /> このうち、 "ubuntu" というユーザー名と SSH サーバーの起動は、 OS 組み込みの <code>/etc/cloud/cloud.cfg</code> の定義によるもの。<br /> そして、 "ubuntu" というパスワードの設定と、 SSH のパスワード認証の有効化は、 <code>system-boot</code> パーティションの <code>user-data</code> ファイル内の以下の定義によるものだ。</p> <pre><code class="yaml">#cloud-config chpasswd: expire: true list: - ubuntu:ubuntu ssh_pwauth: true </code></pre> <p>とうことで、 遠隔から SSH ログインできるように、 こららのファイルを順に書き換えていこう。</p> <h3 id="cloud-init の network-config"><a href="#cloud-init+%E3%81%AE+network-config">cloud-init の network-config</a></h3> <p>network-config ファイルには、 以下の 2つ の大きな役割がある。</p> <ul> <li>cloud-init 初期設定実行前にデバイスをネットワークにつなぐ</li> <li>netplan の <code>/etc/netplan/50-cloud-init.yaml</code> にファイルの内容を転記する</li> </ul> <p>『何だ、同じことじゃないか』 と思われるかも知れないが、この二つは システムに適用されるタイミング と言う点で大きく異なる。</p> <p>前者は、 cloud-init サービス の起動直後に、 cloud-init の通信を行うためにシステムに適用される。<br /> 一方後者は、後者は内容をファイルにコピーするだけである。</p> <p>cloud-init サービスによって netplan の <code>50-cloud-init.yaml</code> が書き換わるのは、ネットワークサービスの起動より後になる (systemd の <code>/usr/lib/systemd/system/cloud-init.service</code> の設定を参照)。<br /> このため、システムやサービスが再起動されるか、能動的に netplan apply しないと、 <code>50-cloud-init.yaml</code> の内容は適用されない。</p> <p>そしてもう一つ重要なのが、以下の一文。</p> <p><a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/topics/network-config-format-v2.html#network-config-v2">Networking Config Version 2 — cloud-init 20.3 documentation</a></p> <blockquote> <p>Cloud-init does not current support wifis type that is present in native netplan.</p> </blockquote> <p>そう。<br /> 前者では、 Wi-Fi の設定が無視されるのだ。</p> <p>すなわちこれは、 有線LAN が繋がっていない場合、 ファイルの更新や apt パッケージの取得などのインターネットに繋ぐような処理は、初回ブート時の cloud-init では全くできないことを意味する。<br /> 幸いにも、 Ubuntu イメージ組み込みの cloud-init の初期設定の内容は、ネットワークに繋がっていなくても処理が完走できる。</p> <p>cloud-init の元々の用途を考えれば、 Wi-Fi が設定できる必要性はないだろうし、 仕方が無いことなのかも知れないが……</p> <p>このファイルに Wi-Fi の設定を記載しただけでは、 初回起動時には Wi-Fi が有効にならないことは覚えておこう。<br /> 後の手順に関係してくる。</p> <p>とりあえず、 netplan の設定に Wi-Fi アクセスポイントの情報は書いておきたいので、 <code>network-config</code> は以下のように書き換える。<br /> SSID やパスワードは自分の環境のものに置き換えて書いてくれ。</p> <pre><code class="diff">--- network-config.org +++ network-config @@ -11,15 +11,15 @@ ethernets: eth0: dhcp4: true optional: true -#wifis: -# wlan0: -# dhcp4: true -# optional: true -# access-points: -# myhomewifi: -# password: "S3kr1t" +wifis: + wlan0: + dhcp4: true + optional: true + access-points: + "SSID-of-myhomewifi": + password: "password-of-myhomewifi" # myworkwifi: # password: "correct battery horse staple" # workssid: # auth: </code></pre> <h3 id="cloud-init の user-data"><a href="#cloud-init+%E3%81%AE+user-data">cloud-init の user-data</a></h3> <p>cloud-init 書き換えのメインとなる user-data。<br /> これは、 <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/topics/format.html#cloud-config-data">Cloud Config Data</a> の内容を記述する YAML 形式のファイルだ。<br /> 基本的には、 OS 組み込みの <code>/etc/cloud/cloud.cfg</code> の値を上書きしたり、 <code>cloud.cfg</code> で読み込まれた <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/topics/modules.html">Modules</a> の設定を記述していく。</p> <p>書き換え部分が長いので、3カ所に分けて説明していく。</p> <pre><code class="diff">--- user-data.org +++ user-data @@ -14,12 +14,22 @@ # expire user passwords chpasswd: expire: true list: - - ubuntu:ubuntu + - newusername:ubuntu + +# Override the default user name defined in cloud.cfg +system_info: + default_user: + name: newusername # Enable password authentication with the SSH daemon -ssh_pwauth: true +ssh_pwauth: false +ssh_authorized_keys: +- ssh-rsa AAAA<中略>== rsa-key-of-user1 + +# locale and timezone +timezone: Asia/Tokyo ## On first boot, use ssh-import-id to give the specific users SSH access to ## the default user #ssh_import_id: </code></pre> <p>既に上でも触れたが、 OS 組み込みの <code>cloud.cfg</code> の定義によって、 "ubuntu" というユーザーが作成されている。<br /> しかし、 既知のユーザー名をそのまま使うのはセキュリティ的にも若干不安があるし、 作成後のユーザー名を書き換えるのは若干面倒なので、作成されるデフォルトのユーザー名自体を、他の名前に書き換えてしまおう。<br /> <code>system_info.default_user</code> で、作成されるユーザ名を変更できる。<br /> また、 <code>chpasswd</code> によるパスワード書き換えの対象となるユーザ名も変更しておこう。</p> <p><code>ssh_pwauth</code> で、 ssh のパスワード認証が有効になっているので、 コレは切ってしまいつつ、<br /> 代わりに、 <code>ssh_authorized_keys[*]</code> リストに公開鍵を登録する。<br /> これで安全に ssh できるようになった。恵dc</p> <p>ついでにタイムゾーンも JST (Asia/Tokyo) に書き換えておこう。</p> <pre><code class="diff">--- user-data.org +++ user-data @@ -53,19 +63,20 @@ #- pastebinit #- [libpython2.7, 2.7.3-0ubuntu3.1] ## Write arbitrary files to the file-system (including binaries!) -#write_files: -#- path: /etc/default/keyboard -# content: | -# # KEYBOARD configuration file -# # Consult the keyboard(5) manual page. -# XKBMODEL="pc105" -# XKBLAYOUT="gb" -# XKBVARIANT="" -# XKBOPTIONS="ctrl: nocaps" -# permissions: '0644' -# owner: root:root +write_files: +- path: /etc/default/keyboard + content: | + # KEYBOARD configuration file + # Consult the keyboard(5) manual page. + XKBMODEL="pc105" + XKBLAYOUT="jp" + XKBVARIANT="" + XKBOPTIONS="" + permissions: '0644' + owner: root:root +- path: /etc/cloud/cloud-init.disabled #- encoding: gzip # path: /usr/bin/hello # content: !!binary | # H4sIAIDb/U8C/1NW1E/KzNMvzuBKTc7IV8hIzcnJVyjPL8pJ4QIA6N+MVxsAAAA= </code></pre> <p>お次は、ファイルの作成。</p> <p>日本語キーボードを認識しないと面倒なので、 <code>/etc/default/keyboard</code> を書き換えて日本語キーレイアウトを認識させる。<br /> 但し、 Ubuntu Server では、このファイルを書き換えただけだとキーボードレイアウトの変更が有効にならないので、後述の <code>runcmd</code> で <code>dpkg-reconfigure</code> コマンドを対話無しのオプションをつけて実行しておく。</p> <p>cloud-init の設定の大半は、 初回ブート時にただ一度だけ実行されるのだが、 cloud-init サービス自体は基本的に毎回常に起動して、サービスとして常駐しっぱなしになっている。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/topics/modules.html">Modules</a> で、 <code>Module frequency: per always</code> となっているモジュールの実行などは、ブートする度に毎回実行される。<br /> そうすると、場合によっては cloud-init の実行ログがログイン画面を覆ってしまうことが毎回の起動毎に発生して鬱陶しい。<br /> このため、 <code>/etc/cloud/cloud-init.disabled</code> という <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/topics/boot.html?highlight=%22cloud-init.disabled%22#generator">空ファイルを作成しておく</a> ことで、 次回以降の起動時に cloud-init を無効にしておく。</p> <pre><code class="diff">--- user-data.org +++ user-data @@ -72,8 +83,19 @@ # owner: root:root # permissions: '0755' ## Run arbitrary commands at rc.local like time -#runcmd: +runcmd: +# apply keyboard configration +- [ dpkg-reconfigure, -f, noninteractive, keyboard-configuration ] +# apply netplan config defined on 'network-config' +- [ netplan, apply ] +# after wlan0 is connected, write the arp entry to target machine on background job +- [ nohup, sh, -c, 'sleep 30; ping 192.168.0.2 &' ] #- [ ls, -l, / ] #- [ sh, -xc, "echo $(date) ': hello world!'" ] #- [ wget, "http://ubuntu.com", -O, /run/mydir/index.html ] + +# Restart 2 minutes after running all config modules (for apply keyboard configration) +power_state: + delay: '+2' + mode: reboot </code></pre> <p>最後に、任意のコマンドの実行。</p> <p>最初の <code>dpkg-reconfigure</code> は、 <code>keyboard</code> の書き換えを反映させるため。</p> <p><code>[ netplan, apply ]</code> のコマンドで初めて、 <code>network-config</code> で設定した Wi-Fi 設定が有効になる。</p> <p>最後の <code>[ nohup, sh, -c, 'sleep 30; ping 192.168.0.2 &' ]</code> は説明が難しいのだが、これは仮に ssh でゲストの IP アドレスが <code>192.168.0.2</code> であると仮定して、そこへ向かって Ping を打っている。<br /> 何故そのようなことをしているかというと、 ゲストPC から RaspPi の IP アドレスを ARP コマンドで確実に調べられるようにするためだ。</p> <p>RasPi に繋げるモニターがないことを前提とすると、 SSH するために DHCP によって RasPi に割り当てられた IP アドレスをどうやって調べるのか、と言う問題に直面する。</p> <p><a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#4-boot-ubuntu-server">How to install Ubuntu on your Raspberry Pi #4</a> に書かれているように、 RasPi の MAC アドレスの先頭 24bit は b8-27-eb (Pi 2~3) もしくは dc-a6-32 (Pi 4) と決まっている。<br /> 通常、 RasPi がオンラインになったときに、 ARPリクエストがブロードキャストされるため、 同一ネットワーク内の PC の ARP テーブルに RasPi のレコードが追加され、 以下のような arp コマンドで対象の IP アドレスを調べることができるようになる。。。 <strong>多くの場合は。</strong></p> <pre><code class="powershell">while(1) { arp -a | ?{ $_ -match 'dc-a6-32' }; Start-Sleep -Seconds 1} </code></pre> <p>ところが、 RasPi が Wi-Fi で繋いでいるのがルーターだったりすると、 ルーターが気を利かせて、 同じ サブネット内であっても ARPリクエストを代替して投げてしまい、 同じサブネットの端末全員の ARP テーブルには、 RasPi の MAC アドレスのレコードが記録されないことがある。</p> <p>そこで、 RasPi 側から SSH のアクセス元となる PC を指定して ping を投げることで、 その PC の ARP テーブルに確実に RasPi が載るようにしている。</p> <p>ちなみに、 30秒 sleep しているのは、 <code>netplan apply</code> した直後はまだ Wi-Fi に繋がっていないことが多いためだ。</p> <p>そして最後に、 cloud-init の停止や タイムゾーンの変更を確実に反映するため、 <code>power_state</code> で再起動させている。</p> <h2 id="RasPi の config.txt"><a href="#RasPi+%E3%81%AE+config.txt">RasPi の config.txt</a></h2> <p>cloud-init とは関係ないが、 必要があれば <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.org/documentation/configuration/config-txt/">config.txt</a> の構成ファイル書き換えてしまおう。</p> <p>例えば、 HDMI の解像度が一般的でなかった場合や、 端末とのネゴシエーションがヘタクソで適切な解像度で表示できない場合などは、 このファイルで HDMI の解像度を指定してやる必要がある。</p> <p>参考:<br /> * <a target="_blank" rel="nofollow noopener" href="https://qiita.com/god19/items/da8ce82b93b36dd5489d">Raspberry Pi 4B 画面解像度設定(TV出力版) - Qiita</a><br /> * <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.org/documentation/configuration/config-txt/video.md">Video options in config.txt - Raspberry Pi Documentation</a></p> <p>但し、 <code>config.txt</code> には、</p> <pre><code class="conf"># Please DO NOT modify this file; if you need to modify the boot config, the # &quot;usercfg.txt&quot; file is the place to include user changes. </code></pre> <p>って書いてあるので、 書き換えるなら <code>config.txt</code> ではなく <code>usercfg.txt</code> にしておくと良い。</p> <pre><code class="diff">--- usercfg.txt.org +++ usercfg.txt @@ -1,3 +1,9 @@ # Place "config.txt" changes (dtparam, dtoverlay, disable_overscan, etc.) in # this file. Please refer to the README file for a description of the various # configuration files on the boot partition. + +framebuffer_width=1024 +framebuffer_height=600 +hdmi_group=2 +hdmi_mode=87 +hdmi_cvt=1024 600 60 1 0 0 0 </code></pre> <h2 id="起動する"><a href="#%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B">起動する</a></h2> <p>こんな感じで一通りファイルを書き換えたと、 RasPi に microSD をさして起動すると、初回ブート時の設定を適用しながら起動してくれる。</p> <p>cloud-init の処理が終わらなくても、 ログイン画面には進み、 その後も cloud-init のサービスは稼働し続ける。<br /> このため、 最初の起動でログイン可能になったとしてもログインせず、 全ての処理が終わって一度再起動されるのをおとなしく待つ方が良い。</p> <p>RasPi 3A+ の場合、全ての処理が終わるのに5分以上ったので、気長に待つようにしよう。</p> <p>前述の arp で RasPi の IPアドレスを調べて、そこに対して SSH できるようになっていれば、とりあえずは完成だ。</p> <p>cloud-init についてもう少し掘り下げて説明しようと思ったのだが、記事が長くなってしまったので、次回の更新に回す。</p> advanceboy tag:crieit.net,2005:PublicArticle/15579 2019-12-04T08:33:06+09:00 2019-12-04T08:33:06+09:00 https://crieit.net/posts/C-REPL-GUI-Shell-Mono-gsharp-Ubuntu C# REPL GUI Shell, Mono gsharp を Ubuntu に入れようとすると発生するエラーを回避する <p>.NET Core の登場で大分影が薄くなったものの、 まだまだ Xamarin でガンガン使われている Mono。<br /> この Mono には, gsharp という C# GUI Shell が存在する。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.mono-project.com/docs/tools+libraries/tools/repl/">C# REPL | Mono</a></p> <p>CUI 版の Shell と比べると、 グラフがプロットできるとか、 画像が手軽に表示できるといったメリットしかないが、タブ補完も効くし、まぁ便利っちゃ便利なツールだ。<br /> <a href="https://crieit.now.sh/upload_images/fe9c36d2f1670210fe0a12646009979d5de6f05d6ecd4.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fe9c36d2f1670210fe0a12646009979d5de6f05d6ecd4.gif?mw=700" alt="gsharp.gif" /></a></p> <p>しかし Windows で gsharp を動かしたくても、 Windwos 用の Mono インストーラには gsharp が入っていないため、そのままでは gsharp を使えない。<br /> このため、 WSL の Ubuntu に gsharp をインストールして、 VcXsrv などの X Server を使って動かすのが手っ取り早い。</p> <p>以下の記事が詳しい。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html">WSL上にXサーバをインストールしてGUIを実現する(VcXsrv編):Tech TIPS - @IT</a></p> <p>ところが、 この gsharp などを含む、 Mono 拡張 GUI ツールを、 WSL を含む Ubuntu ベースのディストリビューションにインストールしようとすると、エラーになってしまう。</p> <p>今回は、 その暫定的な回避策について。</p> <h2 id="TL;DR"><a href="#TL%3BDR">TL;DR</a></h2> <p>早く <a target="_blank" rel="nofollow noopener" href="https://github.com/mono/mono/issues/16322">mono/mono#16322</a> の不具合直した Mono パッケージを出してくれ。</p> <h2 id="Ubuntu に mono-tools-gui をインストールしようとすると、依存関係エラー"><a href="#Ubuntu+%E3%81%AB+mono-tools-gui+%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%82%A8%E3%83%A9%E3%83%BC">Ubuntu に mono-tools-gui をインストールしようとすると、依存関係エラー</a></h2> <p>基本的に、 WSL だろうと ピュアな Ubuntu だろうと、インストール手順は変わらない。</p> <p>前述の Mono Project の記事では、 GUI ツールは <code>mono-tools</code> というパッケージでインストールすると記載されているが、 Ubuntu では <code>mono-tools-gui</code> というパッケージ名で登録されている。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.mono-project.com/download/stable/#download-lin-ubuntu">Download - Stable | Mono / Ubuntu</a> の案内に従ってインストールしようとすると、以下のような依存関係エラーが発生する。</p> <pre><code class="console">$ sudo apt install gnupg ca-certificates $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF $ echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list $ sudo apt update $ sudo apt install mono-devel mono-tools-gui Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: mono-tools-gui : Depends: libmono-cecil-private-cil (< 6.4.0.171) but 6.4.0.198-0xamarin3+ubuntu1804b1 is to be installed E: Unable to correct problems, you have held broken packages. </code></pre> <p>2019-10-25 時点の mono-tools-gui のパッケージの依存関係を見てみると、</p> <pre><code class="console">$ apt depends mono-tools-gui mono-tools-gui [...] Depends: libmono-cecil-private-cil (>= 6.4.0.170) Depends: libmono-cecil-private-cil (<< 6.4.0.171) </code></pre> <p>6.4.0.170 のピンポイントの依存関係が書かれているのだが、 そんなバージョン存在しないため、 エラーになっているようだ。<br /> 依存関係の ">=" とか "</p> <p>何故 <code>=6.4.0.170</code> と書かないのか。 <code><< 6.4.0</code> としてバグフィックスバージョンが上がるのを許容しようとしていた?<br /> うーん、 依存関係定義のバグっぽい。</p> <p>調べてみると、 <a target="_blank" rel="nofollow noopener" href="https://download.mono-project.com/repo/ubuntu/dists/vs-bionic/snapshots/6.0/main/binary-amd64/Packages">Mono 6.0 系</a> も同じバグ (<code>>= 6.0.0.313, << 6.0.0.314</code> の依存関係が定義されているのに、 存在するのは <code>6.0.0.319</code> 以降のバージョン) がある。</p> <p><a target="_blank" rel="nofollow noopener" href="https://download.mono-project.com/repo/ubuntu/dists/stable-bionic/snapshots/">過去のバージョンのスナップショット</a> を確認してみたところ、 Mono 5.18 系 まで遡れば不具合なくインストールできるようなので、 mono-tools-gui は 5.18系で、 Mono 自体は最新版でインストールしてみよう。</p> <h2><strong>バージョンを指定してパッケージをインストールしたい</strong></h2> <p>Ubuntu や Debian 用の Mono のリポジトリでは、 各パッケージの最新 <strong>のみ</strong> が載っているリストがリリース毎に用意され、 その最新のリストのシンボリックリンクを参照する構造になっている。<br /> (何故そのような仕組みなのかはよく知らないが…)</p> <p>例えば、 Ubuntu 18.04 向けに登録している Mono のパッケージソースは<br /> <code>deb https://download.mono-project.com/repo/ubuntu stable-bionic main</code><br /> となっているが、 これは 2019年10月 現在、<br /> <code>deb https://download.mono-project.com/repo/ubuntu stable-bionic/snapshots/6.4.0.198 main</code><br /> への参照となっている。</p> <p>このため、 インストール手順に書かれたリポジトリ設定では、 mono-tools-gui の 5.18系 のバージョンを探そうにも、そのようなバージョンはみつからない。</p> <p>これを解消するためは、以下のように 5.18系 のリストを書き足してやればよい。</p> <pre><code class="console">$ echo -e "deb https://download.mono-project.com/repo/ubuntu stable-bionic/snapshots/5.18 main\ndeb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list $ sudo apt update </code></pre> <p>上記は Ubuntu 18.04 の場合だが、 例えば 16.04 であれば bionic の部分をを xenial に読み替えるなど、 他の Ubuntu / Debian / Raspbian ディストリビューションの場合は適度に読み替えてくれ。</p> <p>次に、 <code>apt list -a</code> で 5.18 のスナップショットに登録されている mono-tools-gui のバージョンを確認する。</p> <pre><code class="console">$ apt list -a mono-tools-gui Listing... Done mono-tools-gui/stable-bionic 4.2-3xamarin3+ubuntu1804b1 all mono-tools-gui/bionic 4.2-2.2 all mono-tools-gui/bionic/snapshots/5.18.1.3 4.2-2xamarin12+ubuntu1804b1 all </code></pre> <p>4.2-2xamarin12+ubuntu1804b1 というバージョンだということがわかった。<br /> (これも、ディストリビューションが異ればバージョンの名前も異なるので、適宜読み替えてくれ)</p> <p>最後に <code>apt install</code> で バージョン指定した mono-tools-gui と、 最新の mono-devel をインストールすれば、無事 gsharp がインストールされる。</p> <pre><code class="console">sudo apt install mono-tools-gui=4.2-2xamarin12+ubuntu1804b1 mono-devel </code></pre> <h2 id="原因"><a href="#%E5%8E%9F%E5%9B%A0">原因</a></h2> <p>この問題に関する Issue は、すでに <a target="_blank" rel="nofollow noopener" href="https://github.com/mono/mono/issues/16322">mono/mono#16322</a> に立っている。<br /> Ubuntu のパッケージの依存バージョンを Debian のものにしてしまうと言う、 Mono Project 内のビルドツールによるものらしい。</p> <p>Issue はクローズされているが、 その後にリリースされた 6.4.0.198 でも不具合が残っている。</p> <p>さっさと直して欲しい。。。</p> advanceboy tag:crieit.net,2005:PublicArticle/15469 2019-10-09T11:22:41+09:00 2019-10-09T11:22:41+09:00 https://crieit.net/posts/Proxy-vscode-WSL-5d9d4471f2671 Proxy 下で vscode の WSL 上の他の拡張機能のインストールに失敗する <p>プロキシ環境下の vscode で、 WSL 上で拡張機能を動かしたいのに、 インストールインストールに失敗する問題を解決するメモ。</p> <p>前回の↓の記事は、 『Remote – WSL 拡張が有効にできない』問題だったが、今回は『Remote – WSL 拡張 を有効にした後、その環境上で他の拡張機能がインストールできない』問題なのでちょっと違う点に注意。ややこしいね。<br /> <a href="https://crieit.net/posts/Proxy-vscode-WSL">https://crieit.net/posts/Proxy-vscode-WSL</a></p> <h2 id="遭遇した問題"><a href="#%E9%81%AD%E9%81%87%E3%81%97%E3%81%9F%E5%95%8F%E9%A1%8C">遭遇した問題</a></h2> <p>Visual Sutdio Code (以下、 vscode) へ 無事に Remote – WSL 拡張機能 の "VS Code Server for WSL" のインストールが完了し、 Windows 上から 快適に WSL の環境にアクセスできるようになった。<br /> しかし、 いくつかの vscode の拡張機能は、 Windows 上の環境とは別に WSL 上の環境で改めてインストールしなくてはならない。</p> <p>そこで、 UI 上の案内に従って各拡張機能で "Install in WSL" を行ったところ、 プロキシ環境下だと以下のエラーが発生してインストールに失敗する問題に遭遇した。</p> <pre><code class="text">Failed to install extension </code></pre> <p>パネル上の OUTPUT タブで "Log (Remote Server)" の情報を見ると、以下のようなエラーが発生しているのがわかる。</p> <pre><code class="text">[remoteagent] [error] Failed to install extension: {拡張機能ID} connect ECONNREFUSED 13.107.6.175:443 </code></pre> <p>settings.json ではプロキシの設定しているし、更には WSL 上の環境変数 (<code>http_proxy</code>, <code>https_proxy</code>) にだってプロキシを入れている。<br /> 更には(前述の)前回の記事に倣って、 WSL のコンソール上から <code>code .</code> の立ち上げまで行ってみた。</p> <p>それでも解消しない。何故だ。</p> <p>なお、試した vscode のバージョンは、 August 2019 (version 1.38.1) だ。</p> <h2 id="&quot;Remote [WSL]&quot; 用の設定ファイルを書き換える"><a href="#%26quot%3BRemote+%5BWSL%5D%26quot%3B+%E7%94%A8%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">"Remote [WSL]" 用の設定ファイルを書き換える</a></h2> <p>Remote – WSL 拡張をインストールすると、 Settings のウィンドウに "Remote [WSL]" というタブが増えている。<br /> <a href="https://crieit.now.sh/upload_images/c1422cf5784c566f688efb098c252f495d9d4402696fa.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c1422cf5784c566f688efb098c252f495d9d4402696fa.png?mw=700" alt="1910_vscode-remote-wsl_01.png" /></a></p> <p>そのタブに移動してみると、 Proxy の設定が空欄になっているのがわかる。<br /> <a href="https://crieit.now.sh/upload_images/d51b7217c7491a53f7a90acaf108f09f5d9d4419a4903.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d51b7217c7491a53f7a90acaf108f09f5d9d4419a4903.png?mw=700" alt="1910_vscode-remote-wsl_02.png" /></a><br /> "Modified in: User" って書いてあるので、 User タブの内容で上書きされる動作をしてくれそうだったり、 設定されてなかったら <code>http_proxy</code>, <code>https_proxy</code> の環境変数の値が使われると書いてあったりしているが、 とりあえずその情報は無視。</p> <p>この "Remote [WSL]" 上のプロキシの設定も、 User タブと同様に改めて記載して保存し、 vscode をリロードしてみる。<br /> <a href="https://crieit.now.sh/upload_images/2d1f0e628d1ffe8769c785993596ba165d9d442db205f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2d1f0e628d1ffe8769c785993596ba165d9d442db205f.png?mw=700" alt="1910_vscode-remote-wsl_03.png" /></a></p> <p>その結果、 <strong>WSL 上の拡張機能もインストールに成功するようになった!</strong></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <ul> <li>プロキシ環境下で WLS - Remote を使うときは、 Settings の "Remote [WSL]" タブにもプロキシの設定を書こう。</li> <li>WSL 上の <code>http_proxy</code>, <code>https_proxy</code> の環境変数を設定しただけでは、 vscode の全ての通信をプロキシ経由にするには不十分のようだ。 <ul> <li><a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/?p=1172">VS Code Server for WSL の更新のため</a> に、これらの環境変数は設定しておくべき。</li> <li>もしかしたら、 Windows 側の環境変数にも上記の値を設定させておけば、 本問題が発生しないのかも知れないが、試していない。</li> </ul></li> <li>vscode のプロキシ環境下の動作の作り込みは、まだまだ甘い。</li> </ul> advanceboy tag:crieit.net,2005:PublicArticle/15468 2019-10-09T11:02:59+09:00 2019-10-09T11:32:30+09:00 https://crieit.net/posts/Proxy-vscode-WSL Proxy 下で vscode の WSL 拡張へ接続できない <p>Windows 上の Visual Studio Code (以下、 vscode) で、WSL 上のファイルやシェルを使えるようになる、 <a target="_blank" rel="nofollow noopener" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl">Remote - WSL</a> 拡張機能。</p> <p>これを、プロキシ環境下でインストールしたり更新したりすると、 vscode から WSL 環境ににアクセスするときに、</p> <pre><code class="text">VS Code Server for WSL closed unexpectedly. Check WSL terminal for mor details. </code></pre> <p>とエラーになってしまう。</p> <p>WSL ターミナルのログを見てみると、だいたい以下のようになっていて、どうやら update.code.visualstudio.com から VS Code Server の更新版のファイルをダウンロードするのに失敗しているように見える。</p> <pre><code class="text">Starting VS Code Server inside WSL (default distro) Extension version: 0.39.5, Windows build: 17763. Multi distro support: disabled. WSL path support: enabled Probing if server is already installed: C:\WINDOWS\System32\wsl.exe -e sh -c "[ -d ~/.vscode-server/bin/3db7e09f3b61f915d03bbfa58e258d6eee843f35 ] && echo found || echo missing" No server install found on WSL, downloading server on client side: C:\Users\user\AppData\Local\Temp\vscode-remote-wsl\3db7e09f3b61f915d03bbfa58e258d6eee843f35\vscode-server-linux-x64.tar.gz Unable to detect if server is already installed: Error: connect ECONNREFUSED 104.42.78.153:443 Launching C:\WINDOWS\System32\wsl.exe sh -c '"$VSCODE_WSL_EXT_LOCATION/scripts/wslServer.sh" 3db7e09f3b61f915d03bbfa58e258d6eee843f35 stable .vscode-server 0 --disable-telemetry' in c:\Users\user\.vscode\extensions\ms-vscode-remote.remote-wsl-0.39.5 WSL version: 4.4.0-17763-Microsoft Updating server... Updating VS Code Server to version 3db7e09f3b61f915d03bbfa58e258d6eee843f35 Removing previous installation... Downloading: Failed --2019-09-11 20:50:12-- https://update.code.visualstudio.com/commit:3db7e09f3b61f915d03bbfa58e258d6eee843f35/server-linux-x64/stable Resolving update.code.visualstudio.com (update.code.visualstudio.com)... 104.42.78.153 Connecting to update.code.visualstudio.com (update.code.visualstudio.com)|104.42.78.153|:443... failed: Connection refused. ERROR: Failed to download https://update.code.visualstudio.com/commit:3db7e09f3b61f915d03bbfa58e258d6eee843f35/server-linux-x64/stable to ~/.vscode-server/bin/3db7e09f3b61f915d03bbfa58e258d6eee843f35-xxxxxxxxxx.tar.gz VS Code Server for WSL closed unexpectedly. For help with startup problems, go to [https://code.visualstudio.com/docs/remote/troubleshooting#_wsl-tips](https://code.visualstudio.com/docs/remote/troubleshooting#_wsl-tips) </code></pre> <p>どう解決したものか。</p> <hr /> <h2 id="そもそも wget でダウンロードができる状態なのか"><a href="#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82+wget+%E3%81%A7%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E7%8A%B6%E6%85%8B%E3%81%AA%E3%81%AE%E3%81%8B">そもそも wget でダウンロードができる状態なのか</a></h2> <p>拡張機能の GitHub プロジェクト上の Issue によると、内部的には wget でファイルをダウンロードしているらしい。<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/78">https://github.com/microsoft/vscode-remote-release/issues/78</a><br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/79">https://github.com/microsoft/vscode-remote-release/issues/79</a></p> <p><code>.bashrc</code> で http_proxy, HTTP_PROXY, https_proxy, HTTPS_PROXY 全ての環境変数にプロキシの URL を設定しているので、 wget に対してプロキシの情報は渡っているはずなのだが。。。</p> <p>とりあえず WSL を起動して、 書き込み権限がある適当なディレクトリで、エラーになっているファイルのダウンロードを <span style="font-family:monospace;word-break:break-word;">wget <a target="_blank" rel="nofollow noopener" href="https://update.code.visualstudio.com/commit:3db7e09f3b61f915d03bbfa58e258d6eee843f35/server-linux-x64/stable" rel="noopener" target="_blank">https://update.code.visualstudio.com/commit:3db7e09f3b61f915d03bbfa58e258d6eee843f35/server-linux-x64/stable</a></span> で試してみて、 成功するか試してみよう。</p> <p>私の場合、 以下のような初歩的なミスでダウンロードに失敗していた。</p> <ul> <li>HTTP_PROXY と HTTPS_PROXY の大文字の環境変数にしか設定しておらず、 wget がプロキシを認識してくれなかった。<br /> curl とかはどっちでもイケるから、気づくのに時間がかかった。</li> <li>何故か <code>~/.wget-hsts</code> のパーミッションが 666 に書き換わっていて、 wget のセキュリティエラーでダウンロードに失敗している事があった。</li> <li>カレントディレクトリが <code>/mnt/c/</code> になっていて、ダウンロードしたファイルの書き込めなかった。</li> </ul> <hr /> <h2 id="それでもダウンロードに失敗する"><a href="#%E3%81%9D%E3%82%8C%E3%81%A7%E3%82%82%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B">それでもダウンロードに失敗する</a></h2> <p>以下の記事によると、 Windows 側から WSL Remote の VS Code Server を起動するとき、 .bash_profile や .bashrc, .profile などを読んでくれないらしい。<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/432">https://github.com/microsoft/vscode-remote-release/issues/432</a><br /> このため、環境変数でプロキシを設定しても反映されないようだ。</p> <p>以下のどちらかを行うと、この問題を回避できる。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/79#issuecomment-503989625">#79#issuecomment-503989625</a> のコメントのように、 <code>~/.wgetrc</code> にプロキシの設定を書く。 <ul> <li>http_proxy と https_proxy だけ設定すればよいはず。 check_certificate = off をむやみに設定するのはセキュリティ上良くない。</li> </ul></li> <li>いったんすべての VS Code を終了させ、 WSL のコンソール上で <code>code</code> と実行し、 Windows の VS Code を起動する。 <ul> <li>このとき、 WSL 側に Linux 版の VS Code がインストールされていると、そちらが起動してしまうのでダメ。</li> </ul></li> </ul> <p>正直、どちらが良いかは一長一短だ。</p> <p><code>.bashrc</code> や <code>.wgetrc</code> などあちこちにプロキシの設定を書くと管理が大変だし、<br /> VS Code Server が更新されるたびに WSL 側から VS Code を実行するのは手間だ。</p> <p>幸い、 <a target="_blank" rel="nofollow noopener" href="https://github.com/microsoft/vscode-remote-release/issues/79#issuecomment-504368316">#79#issuecomment-504368316</a> によると、 今後のバージョンでは VS Code Server のダウンロードを Windows 側で行うように更新する予定のようだ。<br /> それまでの間は逐一 WSL 側から VS Code を実行する方法で回避するのでも良いかもしれない。</p> <p>しかし、少なくとも現時点のバージョンである VS Code 1.38.0 + Remote - WSL 0.39.5 の組み合わせでは、そうなっていない。</p> advanceboy