(wat-aro)

生きてます

RSPレジスタに対する勘違い

RSPレジスタとスタックについて勘違いしていた。

スタックが下に伸びていくという話から実際のデータも大きいアドレスから小さいアドレスへと順に入っているとイメージしてしまっていた。
このような状態ではRSPレジスタがスタックトップに入っているデータの先頭を指していると考えると、スタックトップよりも先にスタックトップが示すデータが入ってしまっている。
仮にこのスタックに更にpushした場合、RSPを進めるまえに、現在のスタックトップに入っているデータ分、RSPを進める必要が出てしまい、現在のデータの大きさをどこかに保持していないとだめになってしまう。
この状態でスタックの計算を考えていたため混乱してしまった。

実際にはデータはアドレスの小さいほうから大きいほうに向かって入っている。
この場合RSPが指すスタックトップはデータのある領域とデータのない領域の境目を指すことになる。
変数のデータ領域を確保するために、RSPを減算する時は変数のバイトサイズ分引くだけでよい。

f:id:wat-aro:20210916221321p:plain

低レイヤわからん

container 内で wasm-pack test を実行すると bind() failed: Cannot assign requested address (99) になる

wasm-pack を使える Docker 環境を作成し、その中でチュートリアルをしていたところ、タイトルのようなエラーが出て wasm-pack test が実行できなかった。
このコンテナでは rust, wasm-pack, npm が使えるだけの状態で、コンテナ内に Chrome がインストールされていないことが原因だった。
Dockerfile に google-chrome-stable を追加すると無事実行できるようになりました。

-RUN apt-get update -qq \
- && apt-get install -y libnss3
+RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add \
+  && echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list \
+  && apt-get update -qq \
+  && apt-get install -y google-chrome-stable libnss3 libgconf-2-4

chromedriver が ipv6 の subnet を探しているんじゃないかなどかなり回り道をしてしまった

emacs で fcitx-mozc を使う

今はこの記事のやり方のほうがよい

ain0204.hatenablog.com


以下は今だとうまく動かない

$ yay -G fcitx-mozc

PKGBUILD を編集する。

-  _targets="server/server.gyp:mozc_server gui/gui.gyp:mozc_tool unix/fcitx/fcitx.gyp:fcitx-mozc"
+  _targets="server/server.gyp:mozc_server gui/gui.gyp:mozc_tool unix/fcitx/fcitx.gyp:fcitx-mozc unix/emacs/emacs.gyp:mozc_emacs_helper"

   install -D -m 755 out_linux/${_bldtype}/mozc_server "${pkgdir}/usr/lib/mozc/mozc_server"
   install    -m 755 out_linux/${_bldtype}/mozc_tool   "${pkgdir}/usr/lib/mozc/mozc_tool"

+  install -D -m 755 out_linux/${_bldtype}/mozc_emacs_helper "${pkgdir}/usr/bin/mozc_emacs_helper"
+
   install -d "${pkgdir}/usr/share/licenses/$pkgname/"
   install -m 644 LICENSE data/installer/*.html "${pkgdir}/usr/share/licenses/${pkgname}/"

手動でインストール

$ cd fcitx-mozc
$ makepkg -si

# 不明な公開鍵についてのエラーがでる
$ sudo pacman-key --recv-keys <keyid>
$ gpg --recv-keys <keyid>

$ makepkg -si

これで /usr/bin/mozc_emacs_helper が入る。 あとはemacsの設定をする。

(use-package mozc
  :init
  (setq default-input-method "japanese-mozc")
  :custom
  (mozc-candidate-style 'overlay))

X1 Carbon Gen 7th に Arch Linux をインストール

基本的にはインストールガイドのとおり https://wiki.archlinux.jp/index.php/インストールガイド WindowManager は XMonad

パーティション

funtoo を参考 https://www.funtoo.org/Install/GPT_Partitioning

フォーマット

# mkfs.fat -F32 /dev/nvme0n1p1 # ESP
# fatlabel /dev/nvme0n1p1 efi
# mkfs.btrfs -L root /dev/nvme0n1p3 # Root
# mkswap /dev/nvme0n1p2
# swapon /dev/nvme0n1p2

マウント

# mount /dev/nvme0n1p3 /mnt
# mkdir /mnt/boot
# mount /dev/nvme0n1p1 /mnt/boot

システムクロックの更新

# timedatectl set-ntp true

インストール

Japanのミラーのみを使うように変更

# vim /etc/pacman.d/mirrorlist
# pacstrap /mnt base linux linux-firmware

システムの設定

# genfstab -L /mnt >> /mnt/etc/fstab
# cat /mnt/etc/fstab

chroot

# arch-chroot /mnt

タイムゾーン

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc --utc

ロケール

# pacman -S neovim
# nvim /etc/locale.gen

ja_JP.UTF-8 UTF-8en_US.UTF-8 UTF-8 をアンコメント

# locale-gen
# echo LANG=en_US.UTF-8 > /etc/locale.conf

ネットワーク

# pacman -S networkmanager
# systemctl enable NetworkManager.service

Rootパスワード

# passwd

ブート

# pacman -S efibootmgr
# efibootmgr -d /dev/nvme0n1 -p 1 -c -L "Arch Linux" -l /vmlinuz-linux -u "root=/dev/nvme0n1p3 rw initrd=/initramfs-linux.img"
# exit
# reboot

ユーザ追加

# pass
# useradd -m -g users -G wheel -s /bin/bash wat-aro
# passwd wat-aro
# groupadd wat-aro
# gpasswd -a wat-aro wat-aro
id wat-aro

sudo

# pacman -S sudo
# EDITOR=nvim visudo

以下を追記

%wheel ALL=(ALL) ALL

Yay

$ sudo pacman -S git
$ sudo pacman -S base-devel
$ git clone https://aur.archlinux.org/yay.git
$ cd yay
$ makepkg -si

man

$ yay -S man-db
$ mandb

Xorg

$ yay -S xorg-server
$ lspci | grep -e VGA -e 3D
$ yay -S xf86-video-intel
$ yay -S xorg-xrdb rxvt-unicode xorg-xmodmap

GUI 準備

uim の設定が終わるまで xmonad がちゃんと動かない

$ git clone https://github.com/wat-aro/dotfiles
$ cd dotfiles
$ ./install.sh
$ yay -S xmonad xmonad-contrib dmenu xmobar
$ xmonad --recompile

日本語入力

$ yay -S uim anthy gtk3
$ uim-pref-gtk3

ブラウザ

$ yay -S noto-fonts noto-fonts-cjk noto-fonts-emoji
$ yay -S google-chrome

フォント

Ricty を手動で入れる

LightDM

LightDM - ArchWiki

【ArchLinux】最高のログイン画面 - Qiita

を参考

オーディオ

オーディオを有効にするためには sof-firmware も必要

Thinkpad X1 Carbon Gen 7 audio broken on 5.4.1-arch1-1 : archlinux

$ yay -S alsa-utils sof-firmware pulseaudio pavucontrol

ActiveModel::Attributesでカスタムタイプを使う

Rails 5.2.0 で入ったActiveModel::Attributes API 最高ですよね。

でもカスタムタイプのドキュメントが見つからないんですよね。 ActiveRecord::Attributes API のカスタムタイプ ならあるのですが。

ソースコード見たところ簡単に作れるのがわかったので紹介します。

まず型の登録部分ですが、lib/active_model/type.rb で定義されています。

また、ActiveModelで使われているデフォルトタイプの実装を見ると cast_value メソッドがあればよさそうです。

ActiveRecord::Attributes API と同様に実装します。

class MoneyType < ActiveModel::Type::Integer
  def cast_value(value)
    if !value.kind_of?(Numeric) && value.include?('$')
      price_in_dollars = value.gsub(/\$/, '').to_f
      super(price_in_dollars * 100)
    else
      super
    end
  end
end

# config/initializers/types.rb
ActiveModel::Type.register(:money, MoneyType)

# app/models/store_listing.rb
class StoreListing
  include ActiveModel::Model
  include ActiveModel::Attributes

  attribute :price_in_cents, :money
end

store_listing = StoreListing.new(price_in_cents: '$10.00')
store_listing.price_in_cents # => 1000

このように ActiveModel::Attributes でカスタムタイプを使うことができます。

http-conduit で取得したデータを日本語表示する

簡単なcliツールを書こうとしたら http-conduit で取得したデータの日本語表示でハマってしまいました。

http-conduithttpLbs で取得したデータをそのままターミナルに出力します。
必要なパッケージは http-conduit bytestring utf8-string の3つ。

{-# LANGUAGE OverloadedStrings #-}

import qualified Codec.Binary.UTF8.String as Codec
import           Data.ByteString.Char8    (unpack)
import           Data.ByteString.Lazy     (toStrict)
import qualified Network.HTTP.Simple      as Simple

main :: IO ()
main = do
    res <- Simple.httpLbs "https://twitter.com/"

    putStrLn $ Codec.decodeString $ unpack $ toStrict $ Simple.getResponseBody res

httpLbs を使い取得したデータは Reponse 型で包まれているので getResponseBodyByteString を取得し、 String に変換して出力します。
なぜか ByteString でなく ByteString.Lazy になっていたので toStrict で変換。
そして unpack しても日本語が表示されないため、 Codec.Binary.UTF8.StringdecodeString で変換してから表示。

文字列難しい

[参考]

Haskellから簡単にWeb APIを叩く方法 - Qiita

Haskell 文字列変換入門 - Qiita