RSPレジスタに対する勘違い
スタックが下に伸びていくという話から実際のデータも大きいアドレスから小さいアドレスへと順に入っているとイメージしてしまっていた。
このような状態ではRSPレジスタがスタックトップに入っているデータの先頭を指していると考えると、スタックトップよりも先にスタックトップが示すデータが入ってしまっている。
仮にこのスタックに更にpushした場合、RSPを進めるまえに、現在のスタックトップに入っているデータ分、RSPを進める必要が出てしまい、現在のデータの大きさをどこかに保持していないとだめになってしまう。
この状態でスタックの計算を考えていたため混乱してしまった。
実際にはデータはアドレスの小さいほうから大きいほうに向かって入っている。
この場合RSPが指すスタックトップはデータのある領域とデータのない領域の境目を指すことになる。
変数のデータ領域を確保するために、RSPを減算する時は変数のバイトサイズ分引くだけでよい。
低レイヤわからん
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 を探しているんじゃないかなどかなり回り道をしてしまった
Chrome などで Emacs キーバインディングを使う
~/.config/gtk-3.0/settings.ini
に追記する
[Settings] gtk-key-theme-name = Emacs
gtk - How do I enable Emacs keybindings in apps, such as Google Chrome? - Ask Ubuntu
emacs で fcitx-mozc を使う
今はこの記事のやり方のほうがよい
以下は今だとうまく動かない
$ 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-8
と en_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
を参考
オーディオ
オーディオを有効にするためには 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-conduit
の httpLbs
で取得したデータをそのままターミナルに出力します。
必要なパッケージは 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
型で包まれているので getResponseBody
で ByteString
を取得し、 String
に変換して出力します。
なぜか ByteString
でなく ByteString.Lazy
になっていたので toStrict
で変換。
そして unpack
しても日本語が表示されないため、 Codec.Binary.UTF8.String
の decodeString
で変換してから表示。
文字列難しい
[参考]