tig で大きいリポジトリを扱う際、高速にする設定を知る

github.com

この issue を読んでいたところ、下記のような設定がおすすめされているのを知りました

github.com

設定を追加したところ Linux カーネルリポジトリで tig を起動すると数秒〜 待たされるのが シュっと出るようになった! やったー 🐧

今までの時間を返してくれ!

tig でコミットを読んでる際に、コミットメッセージを DeepL でピっと翻訳したい

macOS の話題です

Linux カーネルリポジトリなんかでコミットメッセージをすぐ翻訳して読みたいなと思ったので、以下のように ~/.tigrc を設定してみる

設定例

ショートカットキーは、適当に 9 に bind しています

bind generic 9 @sh -c 'git log --format=%B -n1 %(commit) | pbcopy; open /Applications/DeepL.app; osascript -e \'tell application "System Events" to keystroke "v" using command down\''

利用のイメージ

さて、 tig でコミットを眺めてる時に 9 をピッと押すと

DeepL が出てきて、コミットログをペーストして翻訳して出てくる

とりあえずは便利に使えそうかな?

注意書き

  • もっと便利な方法あったら教えてください!
    • tig から起動できるなら別の翻訳アプリでも OK です。
  • DeepL の翻訳の精度については特に問わないものとします

sar -W の pswpin/s pswpout/s がどのファイルから読まれているか調べる

概要

ちょいと sar -W を使うことがあって ソースを調べた話です

sar -W とは?

sar -W で 一秒間にスワップインしたページ / スワップアウトしたページを参照できる

hiboma@example:~$ sar -W 1
Linux 5.15.0-25-generic (example)   06/20/22    _x86_64_    (4 CPU)

12:25:22     pswpin/s pswpout/s
12:25:23         0.00      0.00
12:25:24         0.00      0.00
12:25:25         0.00      0.00

以下は man の説明を引用したものです

       -W     Report swapping statistics. The following values are displayed:

              pswpin/s
                     Total number of swap pages the system brought in per second.

              pswpout/s
                     Total number of swap pages the system brought out per second.

sar -W はどのファイルから値を取っているのか?

この数値はどこから取ってるのだったかな? と気になったのでソースを調べました。

github.com

ソースを clone します

ghq get git@github.com:sysstat/sysstat.git 

pswpin でソースを grep ( ag ) して、それっぽいコードを探してアタリをつける。ヘッダファイルの 👈 っぽいですね。

 $ ag pswpin

... 略m

rd_stats.h
156:    unsigned long pswpin    __attribute__ ((aligned (8))); 👈 

pcp_stats.c
282:    snprintf(buf, sizeof(buf), "%lu", ssc->pswpin);

xml_stats.c
399:        "pswpin=\"%.2f\" "
401:        S_VALUE(ssp->pswpin,  ssc->pswpin,  itv),

ヘッダファイルを読む

rd_stats.h で struct stats_swap なる構造体を見つける。次は、この構造体が参照されている関数を探す。

/* Structure for swapping statistics */
struct stats_swap {
    unsigned long pswpin    __attribute__ ((aligned (8)));
    unsigned long pswpout   __attribute__ ((aligned (8)));
};

関数を探す

C のソースを読むときは Emacs が手に馴染んでいるので、 GNU Global で絞り込む

sscanf してるのが怪しいですね。ジャンプすると read_vmstat_swap() という関数です

read_vmstat_swap を読む

read_vmstat_swap() で pswpin / pswapout の値を取ってるみたいですね。 /proc/vmstat を読んでるようです。

/*
 ***************************************************************************
 * Read swapping statistics from /proc/vmstat.
 *
 * IN:
 * @st_swap    Structure where stats will be saved.
 *
 * OUT:
 * @st_swap    Structure with statistics.
 *
 * RETURNS:
 * 1 on success, 0 otherwise.
 ***************************************************************************
 */
__nr_t read_vmstat_swap(struct stats_swap *st_swap)
{
    FILE *fp;
    char line[128];

    if ((fp = fopen(VMSTAT, "r")) == NULL)
        return 0;

    while (fgets(line, sizeof(line), fp) != NULL) {

        if (!strncmp(line, "pswpin ", 7)) {
            /* Read number of swap pages brought in */
            sscanf(line + 7, "%lu", &st_swap->pswpin);
        }
        else if (!strncmp(line, "pswpout ", 8)) {
            /* Read number of swap pages brought out */
            sscanf(line + 8, "%lu", &st_swap->pswpout);
        }
    }

    fclose(fp);
    return 1;
}

/proc/vmstatgrep して調べてみると、あったあった

hiboma@example:~$ grep pswp /proc/vmstat
pswpin 0
pswpout 0

感想

  • 10分くらいで調べて、10分でエントリ書き下した
  • イマドキなシステムだと sar をあえて使うケースは少なくなってきてるとは思う
  • /proc から kernel の実装に飛び込んで深追いもできるので、いい材料だとは思うんす

白河南湖公園〜那須高原 🚴

4/12(火) 休みを撮って白河南湖公園那須高原を走った記録。半袖 + 短パン (レーパン) でもほんのり暑いくらいの暑気だった

f:id:hiboma:20220412122055j:plain

f:id:hiboma:20220415120508p:plain

走行距離 93km 獲得標高 787m 。途中、調子悪くなったので早めに切り上げ

続きを読む