LaTeX でソースコードを貼る listings についてのメモ。 毎回過去に書いた .tex ファイルを掘り返していて効率が悪かったので。
いろいろ設定 \usepackage{listings} \lstset{basicstyle=\ttfamily\footnotesize,frame=single,breaklines=true} 左側に小さく行番号を表示するような設定。 右からあふれた分は改行するようにするくらいしかやってない。
ネットの海を見に行ったらいろいろ細かく設定している人もいるので、やろうと思ったらいろいろできるのだと思う。
キャプション デフォルトだと「Listing 1 ほげほげ」みたいな名前になるので適当に変更。
\renewcommand{\lstlistingname}{リスト} これで「リスト1 ほげほげ」みたいになる。
ソースコードの埋め込み \begin{lstlisting}[caption=ほげほげ] hogehogehoge \end{lstlisting} みたいにするか
\lstinputlisting[caption=ほげほげ]{hoge.c} みたいにするか。
開始行番号をいじる \begin{lstlisting}[firstnumber=10,caption=ほげほげ] で ok
意外と検索しても出てこない (まあ TeXdoc に余裕で書いてあるけど見るのめんどくさいよね)。
超久しぶりに投稿。軽いメモ。
form feed (^L) を入れておくと Emacs で適当にスクロールできるところまでは覚えているのだが、 その使い方を毎回忘れる……。
C-x [ (backward-page) で前のページ、 C-x ] (forward-page) で次のページにジャンプする。
page-ext というパッケージを使えばもっといろいろできるらしいけどまあ今のところ必要ないかな。
まあこういう文字が必要になる時点で複数ファイルに分割すべきという話ではあるかもしれないが。
ファイル 拡張子を .ses にすると自動で ses-mode になる。 また、そうじゃないファイルでも一回 ses-mode で保存すれば Local Variables が付けられた状態で保存されるので 次からは自動で ses-mode になる。
ファイル自体は先頭に表示内容が入っていて、その後ろに正式なデータといろいろメタデータが S 式で入っているという感じに見える。 ses-mode 自体のコードは読んでないけど。
セルの追加・削除 適当な表
/ C- M- o 行を挿入 列を挿入 k 行を削除 列を削除 ただ、一番右に追加していくみたいな場合は C-i で移動していけば追加されていくし、 下に追加していくみたいな場合には C-j でいけるのであんまり表のキーを使うことはなさそう。
コピペ 普通に M-w とか C-y で。
データの入力 ここが Emacs らしくて面白いと思うのだが、数値や文字列の他に S 式も入れられる。 S 式を入れる場合、quote しなければその式を評価した結果が入るし、quote してから入れると自由なデータが入れられる。 セルに S 式を入れまくることで暗黒の神 Excel を簡単に (?) 作ることができる。
QEMU で起動するのが楽な Alpine Linux で aarch64 な Linux 環境を作り、 その中でブートストラップした Arch Linux ARM に chroot して使ってやろうというもの。
Alpine も Arhc も小さいのでビルドしようとするものによるが、tmpfs だけで戦える可能性が十分ある。 bazel と mozc のビルドをやったが、16 GB メモリのマシンで tmpfs しか使わずに作業が終わった (ビルド後にいらなくなった一時ファイルを消したりはしたが)。
準備 aarch64 の仮想マシンの実行には qemu-arch-extra が必要なので事前に入れておく。 Alpine のイメージを公式サイトから落としておく。 多分どれでもいいが、今回は standard を使った。 UEFI を使うため、edk2-armvirt を入れる。 QEMU のイメージの準備 サイズとかは適当に。後で拡張したりできるので大袈裟に気にすることはない (ちょっとめんどくさいが)。
$ qemu-img create -f qcow2 alpine.qcow2 8G インストール ダウンロードした Alpine のイメージを CD-ROM として使って QEMU を起動する。
このサイトは静的サイトジェネレータの Hugo を使って生成していて、これまで検索欄は Google 検索に site: をつけてクエリを投げるという方法で実現されていました (これは使っているテーマのデフォルトだったため)。
それを今回、Google に飛ばずに自前で検索を行うという感じにしました。
モチベーション Google 検索での一番の問題は、「サイト内のすべてのページにタグ一覧が配置されているために、 キーワードがタグ名と一致する場合すべてのページがヒットしてしまう」という点でした。
Google 検索で検索に使う範囲を指定できればよいのですが、そういったこともできそうになく、 自前で検索する必要性を感じていました。
あと、サイト内の情報が知りたいだけなのに Google にクエリの情報を渡さないといけないという部分も なんとなく気持ち悪さはあります (まあ今回いろんなマネージドなサービスを使っているので そこの気持ち悪さはさほど変わらないですが)。
遊びで作っているエミュレータについていろいろまとめておこうかなというだけの投稿。
実験で作った CPU のエミュレータです。 最初は実機でデバッグするのが辛いだろうということでアセンブラに簡易的な実行機能を つけようといった程度のモチベーションで始めたんですが、デバッガの実装が意外に面白かったので だんだん機能が増えてきているという感じです。
機能 今の所こんな感じです。
アセンブリで書いたプログラムを実行する 分岐命令の飛び先のアドレスをラベルで指定できる メモリの初期化ファイルに書かれた内容で内部のメモリを初期化 命令のアドレスにブレークポイントを置く 実行した命令をもとに戻す (Undo) 未定義動作を踏みそうになったら例外を飛ばして威嚇する ワード単位でのイミディエイトをサポートする疑似命令 実際にメモリの内容を読んで実行する (自己書き換えみたいなプログラムも動く) で今後無駄に実装しようと思っているのが
ちょっと前ですが、「Emacs 内のターミナルで Emacs を開こうとしたら既に開いている Emacs でそのファイルを開く」やつを作りました。
しくみ ざっくり説明すると、DBus を使って Emacs とシェル (で立ち上がるプロセス) が通信して、 Emacs を開く代わりに現在のセッションで開いているように見せるという感じになります。 通信できるなら別に DBus じゃなくてソケットでもいいんですが、DBus だと Emacs Lisp の インターフェースでサーバを作るのが楽なので DBus になりました。
さて、この機能の実現には Emacs 側とシェル側 (厳密には emacs コマンドで立ち上げるプロセス) に細工が必要です。これ以降でそれらをもう少し詳しく説明します。
Emacs 側の細工 DBus インターフェースで待ち受けておく必要があります。
めっちゃお久しぶりです。
WebAssembly でハロワ的なサムシングを C++ でやったらすんなり動きすぎて感動したというポストです。
動機としては C++ で書いた SMF (Standard MIDI File) のパーサをブラウザ上で使いたかった ということです。別に速度を求めていたとかそういうわけではないのですが、バイナリを扱うのはやっぱり JavaScript よりも C++ とかの方がぱぱっと書けるかな、という。
で、使ったコードはリンク先に置いてあります。 https://github.com/kofuk/haystack/blob/df5d58caadf1ca640fef80484ac138faa6090c14/smf.cc
一応ビッグエンディアンをリトルエンディアンに変換している部分が wasm での挙動が予想できないため 不安な要素だったんですが、リトルエンディアンと考えていいみたいでした。 (これってコンパイルされた wasm をビッグエンディアンのマシンに持っていったら動かないみたいなことはあるんだろうか)。
久しぶりに vte のリポジトリを見に行ったら HEAD で Sixel が使えるようになっていたので、 その導入方法を……。
適当に調べた感じだと GNOME 端末 3.37 とかでもサポートされてるっぽいです。 sover 見た感じだと ABI 互換性が崩れたことはなさそうなのでどのバージョンでも問題は起きないかと思います。
バージョン Arch Linux 上で確認をしています。 また、実際に使ったコミットのハッシュは以下です。
c17e6d12da00a94c3768be6671182a6a039ec0c0 方法 まだリリースされていないので HEAD を取ってくる必要があります。 なんかサーバ遅い気がするので --depth 1 をつけて履歴を取ってこないようにした方がいいかもしれません。 $ git clone https://gitlab.gnome.org/GNOME/vte.git ソースのディレクトリに入り、Meson で Ninja などなどを生成 & ビルドします。 sixel はデフォルトだと無効なのでここで有効化してやります (-D は Make とか CMake にあるような、ビルドのオプションを変えるというオプション)。 $ meson . _build -Dsixel=true && cd _build && ninja ビルドに成功したらインストールします。ld.so.conf とかで /usr/local/lib を使う設定に していれば、そのまま ninja install とかでインストールすればいいと思います。 僕はめんどくさいので乱暴に _build/src/libvte.so.0.6500.0 を /usr/lib にコピーして soname のリンク (/usr/lib/libvte.so.0 などの古いライブラリに張ってある symlink) を張り替えるというやり方にしました (おそらくログがローカライズされないくらいで実害はないと思います)。
この記事では C++ とか Java とかを触ってる人が、 それと同等のコードを GObject 上に構築するにはどうしたらいいのかという視点で解説していきたいと思います。 ただし、一部にそれらの内部実装に関する知識を要する部分があるので、 使ったことがあるというだけでは理解が難しい部分があるかもしれません。
GObject 使おうとしても意外と Web 上に情報がなく…… (これは単に調べるのが下手という説もある)。
GObject とは GObject は C で書かれたユーティリティライブラリである GLib の一部で、 主に GTK の構築に使われているオブジェクトシステム (オブジェクト指向ぽくコード書くフレームワーク) です。
オブジェクト関連の言語機能がない C で簡単に OOP できます。
……ということになってる (のか知らないけど) けど、C++ から便利機能とか オブジェクト関連の構文を取り除いた感じで、割と自分で管理しないといけない部分が多い。 実際のところ感覚的には他言語のバインディングを触ってる感覚に近いです。