debianインストール時のメモ書き
備忘録として記録する。
debian-10.1.0-amd64-netinst.iso の graphical install で一通りインストールした。 ファイルシステムは btrfs にしたのとスワップ領域を減らした以外は特にいじった記憶がない。
以下、graphical install 後に変更・修正した内容である。
ブートローダーの変更
iso では grub2 をブートローダーとしてインストールしたが、システム全体が systemd なので統一してみたく systemd-boot に変更してみた。 以下、その際の作業内容になる。
インストール
# bootctl install
必要に応じて
--path
オプションをつける。
これで systemd-boot に必要なファイルが efi パーティションに展開される。
今回は/boot/efi
が efi パーティションである前提で続ける。ブートエントリの追加
/boot/efi/loader/entries/debian.conf
に下記のように書く。title Debian linux /vmlinuz-4.19.0-6-amd64 initrd /initrd.img-4.19.0-6-amd64 options root=PARTUUID=YOUR_PART_UUID_HERE rw quiet nouveau.modeset=0
linux
やinitrd
には/boot/efi
をルートとしたパスが必要だった。
options
のPARTUUID
はblkid
コマンドで調べた。 自分の環境の場合、grub2 の際に/boot
配下に vmlinuz や initrd.img があったため、それらをコピーして efi パーティションに設置した。
これってシンボリックリンクでもいいんだろうか…?この辺りはメモを忘れてうろ覚えだが、
efibootmgr
コマンドでブート順序を確認した記憶がある。 起動順序でLinux Boot Manager
が最初になっていればsystemd-boot
で起動する。
なお、この辺りで参考にしたのは Arch Wiki 。
nouveau nomodeset
ブートオプションを追加した話。
起動時にコンソールの表示が妙に伸びており、下記エラーが表示されていた。
[ 4.953345] nouveau 0000:07:00.0: DRM: failed to create kernel channel, -22 [ 5.074717] nouveau 0000:07:00.0: DRM: allocated 1920x2160 fb: 0x200000, bo 00000000ab79588a
マシンは NVidia の GPU を使っており、そのドライバに起因するものらしい。
今回 GPU は緊急時のコンソール表示のためにつけており、基本は ssh で使う予定なのでブートオプションで KMS を無効化してしまう。
先の systemd-boot の conf にも書いてあるように、以下の nouveau.modeset=0
をブートローダーのエントリの設定に追加した。
options root=PARTUUID=YOUR_PART_UUID_HERE rw quiet nouveau.modeset=0
このあたり、実はちゃんと理解しておらず nouveau って KMS に対応してるはずでは?とか疑問が残っている。 そのうち調べる。
realtek ドライバ
[ 3.553551] r8169 0000:05:00.0: firmware: failed to load rtl_nic/rtl8168h-2.fw (-2) [ 3.553616] firmware_class: See https://wiki.debian.org/Firmware for information about missing firmware [ 3.553690] r8169 0000:05:00.0: Direct firmware load for rtl_nic/rtl8168h-2.fw failed with error -2 [ 3.553693] r8169 0000:05:00.0 enp5s0: unable to load firmware patch rtl_nic/rtl8168h-2.fw (-2)
apt の non-free なリポジトリを追加して firmware-realtek パッケージを取得することで解決した。
Watchdog 問題
[ 3.382156] sp5100_tco: SP5100/SB800 TCO WatchDog Timer Driver [ 3.382217] sp5100-tco sp5100-tco: Using 0xfed80b00 for watchdog MMIO address [ 3.382227] sp5100-tco sp5100-tco: Watchdog hardware is disabled
特段使う予定もなく、disabledになっていて問題はないがいちいち disabled と出して欲しくなかったためロードしないようにした。
# cat << EOF > /etc/modprobe.d/sp5100_tco.conf blacklist sp5100_tco EOF
上記は調べている時に見つけた これ を参考にしている。
lm_sensors
CPU温度を mackerel に飛ばしたかったので、lm_sensors を入れた。
# apt install lm_sensors
sensors-detect
して sensors
を実行すれば取れるはずがCPUの温度情報が取れていなかった。
sensors-detect
の出力をよく見ると下記の情報が得られた。
To load everything that is needed, add this to /etc/modules: #----cut here---- # Chip drivers nct6775 #----cut here----
このガイドを元に /etc/modules
に nct6775
を追記して再起動したらCPU温度を CPUTIN
として取得できるようになった。
sensors
の出力結果の CPUIN の行は次のようだった。
CPUTIN: +26.5°C (high = +80.0°C, hyst = +75.0°C) sensor = thermistor
この温度の数値部分(26.5)を mackerel に飛ばすために値を整形するのは下記のようにしてみた。
$ sensors|grep CPUTIN|awk '{print $2}'|sed -E 's/^\+(.+)°C$/\1/g'
とりあえずここまで。
まだ設定は全てしていないかもしれないので、気づいたものがあれば追記する。
mikutter on dockerでリンクが開けない問題へのワークアラウンド
dockerコンテナでmikutterを動かしてみたところ、認証時につまづいたことがあったので共有します。
なお、今回の問題とワークアラウンドについてはAppImageユーザーにとっても有用です。
今回話す環境は以下のリポジトリのgui付きのコンテナを実行した時のものです。
docker mikutter
問題
dockerコンテナで動かすmikutterでURLを開こうとしても開かないです。
dockerのコンテナ内にはブラウザがないためです。
このままだと最初のアカウント追加時に認可できずに詰んでしまいます。
ワークアラウンド
mikutter の 「設定 -> 表示 -> URLを開く方法」に下記設定をします。
次のコマンドを使う
を選択して、テキストボックスに echo
と入力。
上記を実行することで、リンクを押したときにmikutterのログにリンクが表示されます。
まとめ
これを設定することでアカウント追加時のリンクで詰まなくなるので困っている方はお試しください。
mikutterインスタンスmaster追従まとめ
気が向いた時くらい書いておこうかと思います。
ハマったこと
/web/getting-started
を開くと/web/timelines/home
へリダイレクトされる
これは本家のバグだったようで翌日のPRでマージされた修正を取り込むことで直った
github.com/about
が見つからない
これは Maya さんに教えていただき解決した。
$ docker-compose run --rm web bundle exec bin/tootctl cache clear
https://taruntarun.net/@mayaeh/102165209509726870
感想
ステージングで上記二つの問題が発覚したので、ステージングとしての機能をしっかりと果たしていてよかった。 やっぱりステージング大事。
GoLand で Myrica を使いたい
Windows で GoLand を使うに当たって Font の設定にインストール済みの Myrica が候補に出てこなかったので、出てくるようにしたときの覚え書き。
%LocalAppData%\JetBrains\Toolbox\apps\Goland\ch-0\183.4886.44\jre64\lib\fonts
に ttc
ファイルを置いて GoLand を再起動して終わり。
小説サイトの新着を取得するやつを作ったときの話
たまには Python を使ってみるかというノリで、いつも読んでる Web 小説のページをスクレイピングして最新のものがあれば Slack に通知するやつを作ってみました。 Pythonをほとんど知らず、調べながらやったので、その過程で調べた内容についてのメモを残します。
環境
やったこと
venv
パッケージ管理をプロジェクト毎にしたかったので、よく使われている virtualenv を使おうと思いましたが、 Python 3.3 からは venv として Python の標準機能にもほぼ同様のものが備わったようです。
$ python3 -m venv project_name
でサクッと生成しました。
追加パッケージなしでこれができるのはありがたいです。
requests, BeautifulSoup4
定番らしい組み合わせでスクレイピングします。
幸い対象が静的 html だったので、requests で GET して、BeautifulSoup4 で必要な DOM を取り出すだけの超シンプルな実装ですみました。
途中、大きく詰まったところとしては GET したファイルの日本語が文字化けしていたことです。
r = requests.get(TARGET_URL) r.encoding = r.apparent_encoding
といったように apparent_encoding
を指定することで charset から文字コードを検出してくれます。
apparent_encoding のソース
対象の html は以下のような構造でした。
<div class="index_box"> <dl class="novel_sublist2"> <dd class="subtitle"> <a href="url">タイトル1</a> </dd> <dt class="long_update"> 20xx/xx/xx xx:xx <span title="20xx/xx/xx xx:xx 改稿"> (<u>改</u>)</span> </dt> </dl> … <dl class="novel_sublist2"> <dd class="subtitle"> <a href="url">タイトルN</a> </dd> <dt class="long_update"> 20xx/xx/xx xx:xx <span title="20xx/xx/xx xx:xx 改稿"> (<u>改</u>)</span> </dt> </dl> </div>
今回必要だったのはタイトルおよび更新日時なので dl タグ一覧を取り出して、dd, dt タグをそれぞれ処理しました。 必要な情報が取れたところで、あとは最終更新日時を比較して最新が来て入れば Slack に通知を適当に実装して完了です。
VS Code
VS Code でコーディングするにあたり、Python 拡張をインストールしました。 Python拡張をインストールすると pylint が見つからないだの警告を出してきます。 せっかくなので使いたいですが、今回は venv で使いたかったのでワークスペースの設定が必要でした。
{ "python.pythonPath": "./bin/python", "python.linting.pylintPath": "./bin/pylint", "python.linting.pylintEnabled": true, "python.linting.enabled": true, }
これでこのワークスペースを開いたときは venv の pylint を参照してくれるようになりました。
つくったもの
こんな感じ
さいごに
このメモ書いてる時に気づいたんですが、a タグのリンクを Slack に投稿した方が絶対に使いやすい
puppetteer のキャッシュ
puppetteer を使って html を PDF に変換する node.js アプリケーションを作っている過程でキャッシュに悩んだのでメモ
やったこと
クライアントから送られてきた html 文字列を以下のように PDF 化するコードを書いていました。
しかし、ポストするhtmlの一部が変わっても出来上がるPDFに変化がありません。
クライアント側や node の express 等を疑っていましたが、いずれもキャッシュの対応などを入れても効果がありませんでした。
そこで puppetteer で何かキャッシュされているのではと疑い、ググったところ以下がヒットしたので試したら当たりでした。
How can I disable cache in puppeteer?
setCacheEnabled
フラグを設定して reload
すればいいようです。
setCacheEnabled
フラグを page.goto()
直前にセットしても特に意味がなく、リロードする必要がありました。
完成系
おまけ
ページ生成時に page.setContent()
を使用していない理由としては、 waitUntil
が指定できないためです。
ワークアラウンドとして date:text/html,
に html 文字列を結合して page.goto()
に渡して waitUntil
するようにしました。
*ngFor で指定回数繰り返し処理
Angular の *ngFor
は *ngFor="let n of ['a', 'b']"
のように配列のループはできるが、 Vue.js の v-for
のように指定回数のループもできるディレクティブが用意されていない。
v-for="n in 4"
相当のことを Angular でやりたかったので、パイプを使って実現してみた。
パイプ
実装
import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'range' }) export class RangePipe implements PipeTransform { transform(value: number): Array<number> { return Array(value); } }
説明
これは引数に与えられた長さを持つ配列を返すパイプである。
*ngFor="let n of 4 | range"
のように使う。
上記の例では、4 | range
で長さ4の配列ができ、*ngFor
は4回実行されるといった寸法だ。
今回は指定回数ループさせるためだけを考えている。
そのため、例えば
<span v-for="n in 4">{{ n }}</span>
と同等のことするには以下のように index を使う必要がある。
<span *ngFor="let n of 4 | range; index as i">{{ i + 1 }}</span>
多少長いが、標準的な機能で完結しているのでひとまずこれでいいかなと思っている。
もっとスマートな実装方法あれば教えて欲しい!
パイプの生成もAngular CLIのコマンドひとつで簡単だし最高