2021年9月

ログ一覧

09月29日(水)

Canvasで「クイズ」を別のモジュールにコピーしてしまうと、参照になってしまう問題にハマった。

プログラミング基礎同演習はスライドとか全部Canvasにアップロードした。GitHub演習はまだ。

GitHub演習、座学第二回のスライドを作り終わった。

WindowsのVS CodeでRemote SSHできないの、VS CodeがWindows側の設定を見に行ってしまうからだった。いつもWSL:Ubuntuで作業しているので、そこでsshできるのにVS Codeができないのがよくわからなかった。issueも立っている。まだオープンだ。

えっと、GitHub演習は、あとスライド4つ、講義ビデオ5つ録画しないといけないのか。

プログラミング基礎同演習は、スライドと課題は終わってるから、講義ビデオの録画ですな。去年のビデオの再利用の誘惑に耐えている。

09月28日(火)

GitHub演習の講義とプログラミング基礎同演習の講義を録画した。

09月27日(月))

HPC研究会。

OS自作もくもく会。

湯川さんの本、在庫があったので買った。

09月26日(日))

何してたっけか?Gitのログによるとスライドを作っていたっぽいな。

09月25日(土)

なんとか最初のスライド作った。 ## 09月27日(月)

OS自作もくもく会。9.4章。

また時計が死ぬほど遅れているぞ。

$ date
                        2021年  9月 21日 火曜日 09:50:46 JST
                        
                        $ sudo hwclock -s
                        
                        $ date
                        2021年  9月 27日 月曜日 17:30:25 JST

一週間遅れるってひどいな。

09月26日(日)

09月25日(土)

09月24日(金)

湯川さんの統計力学とKrauthさんの本、注文した・・・ら、湯川さんの本はあったらしい。月曜に取りに行こう。

論文もそうだけど、教科書って「何を書かないか」が大事だよね。なんでもかんでも入れれば良いってもんじゃない。特に初学者向けは、「これを説明しない」と割り切って、必要最小限の構成で分野を概観させ、そのあと「全部説明する」という本に行くと良い気がする。

Qiita、本当に、本当にトレンドやタイムラインに興味のある記事が乗らなくなってしまったなあ。一時期、わりと良かった時もあったんだけど。

09月23日(木)

学生さんの発表その2。こちらもちゃんと発表できて素晴らしい。

懇親会(?)で学生さんの発表を褒められた。「自分で研究を理解して話している。やらされていない」と。そこを一番大事にしているところだったのでうれしい。

Krauthさんの本

09月22日(水)

学生さんの発表その1。デビューなのに堂々としてて素晴らしい。

09月21日(火)

学会発表。久しぶりだ。

座長。つつがなく。

なんかMacのアップデートをして、macOS Big Sur 11.6にしたら、Cisco系のアプリケーションが全てマルウェアとして判定されるように。うまくアンインストールもできない。以下の様に、ターミナルからsuduで消したらうまくいった。

sudo /opt/cisco/anyconnect/bin/vpn_uninstall.sh
                        sudo /opt/cisco/anyconnect/bin/dart_uninstall.sh 
                        sudo /opt/cisco/anyconnect/bin/websecurity_uninstall.sh
                        sudo /opt/cisco/anyconnect/bin/amp_uninstall.sh
                        sudo /opt/cisco/anyconnect/bin/nvm_uninstall.sh
                        sudo /opt/cisco/anyconnect/bin/umbrella_uninstall.sh
                        sudo /opt/cisco/anyconnect/bin/iseposture_uninstall.sh
                        sudo /opt/cisco/hostscan/bin64/csd_uninstall.sh

root権限が無いところに、Zshをソースから入れる。

mkdir build
                        cd build
                        wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz
                        tar xf ncurses-6.1.tar.gz
                        cd ncurses-6.1
                        ./configure --prefix=$HOME/local CXXFLAGS="-fPIC" CFLAGS="-fPIC"
                        make -j && make install
                        cd ..
                        
                        ZSH_SRC_NAME=$HOME/packages/zsh.tar.xz
                        ZSH_PACK_DIR=$HOME/packages/zsh
                        ZSH_LINK="https://sourceforge.net/projects/zsh/files/latest/download"
                        
                        if [[ ! -d "$ZSH_PACK_DIR" ]]; then
                            echo "Creating zsh directory under packages directory"
                            mkdir -p "$ZSH_PACK_DIR"
                        fi
                        
                        if [[ ! -f $ZSH_SRC_NAME ]]; then
                            curl -Lo "$ZSH_SRC_NAME" "$ZSH_LINK"
                        fi
                        
                        tar xJvf "$ZSH_SRC_NAME" -C "$ZSH_PACK_DIR" --strip-components 1
                        cd "$ZSH_PACK_DIR"
                        
                        ./configure --prefix="$HOME/local" \
                            CPPFLAGS="-I$HOME/local/include" \
                            LDFLAGS="-L$HOME/local/lib"
                        make -j && make install

領域11のインフォーマルミーティング出た。何年ぶりだろ。

09月20日(月)

GBドラキュラ伝説2のドラキュラ城後半のBGM、ドビュッシーの「パスピエ」という曲だということを初めて知った。ソレイユとのボス戦がクラシックだろうな、とは思ってた(バッハだそうだ)が、そっちは予想外。

GitHub演習パート、あと少しちょっと・・・。

09月19日(日)

Git/GitHub演習、「Gitの仕組み」書き終わった。これで座学パート終了。

09月18日(土)

Git/GitHub演習、「Gitの操作(応用編)」あらかた書いた。

09月17日(金)

ISSP ohtakaでTensorFlow。

mkdir tftest
                        cd tftest
                        python3 -m venv tf
                        source tf/bin/activate
                        python3 -m pip install --upgrade pip
                        python3 -m pip install tensorflow tensorflowjs
                        python3 -m pip install ipython
git clone git@github.com:kaityo256/fashion_mnist_check.git
                        cd fashion_mnist_check
                        python3 -m venv tf
                        source tf/bin/activate
                        python3 -m pip install --upgrade pip
                        python3 -m pip install tensorflow tensorflowjs
                        python3 train.py
                        python3 export.py

ここまで動いた。

ローカルでの確認。

git clone https://github.com/kaityo256/fashion_mnist_check.git
                        cd fashion_mnist_check
                        python3 -m venv tf
                        source tf/bin/activate
                        python3 -m pip install --upgrade pip
                        python3 -m pip install tensorflow tensorflowjs
                        python3 train.py
                        python3 export.py

バッチ処理の確認。

#!/bin/sh
                        #SBATCH -p i8cpu
                        #SBATCH -N 1
                        #SBATCH -n 1
                        
                        source tf/bin/activate
                        python3 train.py
                        python3 export.py
sbatch test.sh

問題なく実行できた。

WSL2のGitのバージョンが古くて(2.25.1)デフォルトブランチを変更できないのでバージョンアップする。

$ sudo add-apt-repository ppa:git-core/ppa
                        $ sudo apt update
                        $ sudo apt upgrade
                        $ git --version
                        git version 2.33.0

できたできた。

学会スライド作った。

09月16日(木)

研究室ミーティング。

VS CodeのWorkspaceの信頼がどうたらというもの。とりあえずオフる。設定でworkspaceで検索して「Security › Workspace › Trust:」をオフれば良い。

09月15日(水)

断固今日中に座学を終わらせないと絶対にヤバい。

GitでfetchとpushのURLを変える。まず、リモート二つとローカル一つを作る

git init --bare test1.git
                        git init --bare test2.git
                        git init test

testでリモートを追加する。

cd test
                        git remote add origin ../test.git

fetchもpushも同じURLになる。

$ git remote -v
                        origin  ../test.git (fetch)
                        origin  ../test.git (push)

originという名前で、プッシュだけ別の場所にする。

git remote set-url --push origin ../test2.git
$ git remote -v
                        origin  ../test.git (fetch)
                        origin  ../test2.git (push)

同じ名前でfetchとpushが別のURLになった。

リモートを追加し、上流ブランチを設定せずにpush。

git push origin main
$ git branch -vva
                        * main                90bdb0e initial commit
                          remotes/origin/main 90bdb0e initial commit
                        
                        $ git status -b
                        ブランチ master
                        nothing to commit, working tree clean
                        
                        $ git status -sb
                        ## main

上流ブランチを設定してもう一度。

$ git branch -u origin/main
                        Branch 'main' set up to track remote branch 'main' from 'origin'.
                        
                        $ git branch -vva
                        * main                90bdb0e [origin/main] initial commit
                          remotes/origin/main 90bdb0e initial commit
                        
                        $ git status -b
                        ブランチ main
                        Your branch is up to date with 'origin/main'.
                        
                        nothing to commit, working tree clean
                        
                        $ git status -sb
                        ## main...origin/main

リベース後にpushするのに失敗する例。

git init --bare test.git
                        git init test
                        cd test
                        echo "Hello" > test.txt
                        git add test.txt
                        git commit -m "c1"
                        echo "Hello2" > test.txt
                        git commit -am "c2"
                        git branch feature
                        echo "Hello3" > test.txt
                        git commit -am "c3"

ここまででこんな歴史ができた。

$ git log --oneline
                        3f3255e (HEAD -> master) c3
                        8ac3073 (feature) c2
                        8269d34 c1

リモートを追加してpush。

git remote add origin ../test.git
                        git push -u origin master
$ git log --oneline
                        3f3255e (HEAD -> master, origin/master) c3
                        8ac3073 (feature) c2
                        8269d34 c1

featureブランチを伸ばす。

git switch feature
                        echo "test" > test2.txt
                        git add test2.txt
                        git commit -m "f1"

こうなった。

$ git switch master
                        $ git log --graph --all --oneline
                        * 7ade9dd (feature) f1
                        | * 3f3255e (HEAD -> master, origin/master) c3
                        |/
                        * 8ac3073 c2
                        * 8269d34 c1

masterからfeatureへrebaseする。

$ git rebase feature
                        First, rewinding head to replay your work on top of it...
                        Applying: c3
                        
                        $ git log --graph --all --oneline
                        * adcc72b (HEAD -> master) c3
                        * 7ade9dd (feature) f1
                        | * 3f3255e (origin/master) c3
                        |/
                        * 8ac3073 c2
                        * 8269d34 c1

なんか変なことを言われたが、想定通りの歴史になった。この状態でpushを試みる。

$ git push
                         ! [rejected]        master -> master (non-fast-forward)
                        error: failed to push some refs to '../test.git'
                        hint: Updates were rejected because the tip of your current branch is behind
                        hint: its remote counterpart. Integrate the remote changes (e.g.
                        hint: 'git pull ...') before pushing again.
                        hint: See the 'Note about fast-forwards' in 'git push --help' for details.

git mergeしたらgit pushできた。

$ git merge
                        $ git l
                        91a23b1 (HEAD -> master) Merge remote-tracking branch 'refs/remotes/origin/master'
                        adcc72b c3
                        7ade9dd (feature) f1
                        3f3255e (origin/master) c3
                        8ac3073 c2
                        8269d34 c1
                        $ git push

うーん、良い例にはならなかったな。

コミット済みの奴をgit commit –amendしてもpushできなくなるな。

git init --bare test.git
                        git init test
                        cd test
                        echo "Hello" > test.txt
                        git add test.txt
                        git commit -m "c1"
                        echo "Hello2" > test.txt
                        git commit -am "c2"
                        git remote add origin ../test.git
                        git push -u origin master
                        git commit --amend -m "c2'"

これで歴史が改変されて分岐する。git pushできなくなる。git mergeすれば歴史を共有できる。

git merge -m "merge"
                        git push

rebase版。

git init --bare test.git
                        git init test
                        cd test
                        echo "Hello" > test.txt
                        git add test.txt
                        git commit -m "c1"
                        git branch feature
                        echo "Hello2" > test.txt
                        git commit -am "c2"
                        git remote add origin ../test.git
                        git push -u origin master
                        git rebase -i feature

09月14日(火)

朝から発表会。その後会議。メール処理。

なんかぼーっとしてしまう。

09月13日(月)

いろいろ忙しい。学会発表来週か。いつスライド作るんだ?

10月1日までには、最低でも2つ講義ビデオを録画しておかないといけない。10月5日までにプログラミング基礎同演習の講義を最低1つ、できれば2つ録画しておきたい。

わりとスケジュール破綻してない?とにかくGitHub演習の講義作らないといろいろ進まないぞ。

GitHubでOrganizationを作る。

  1. 右上の「+」から「New Organization」を選ぶ
  2. プランが出てくるので「Create a free organization」を選ぶ。
  3. 「Organization account name」で名前を、「Contact email」でメールアドレスを選ぶ。「This organization belongs to」は、本来なら学科が良いが、ここでは「My personal account」にする。
  4. Add organization members は無しでよいか

なんかWelcome to GitHubとかいうサーベイが。

GitHubの名前はlowercase-with-hyphensが普通っぽい。

09月12日(日)

講義の準備がほとんとできず。子供の相手をして疲れた。体が重い。

09月11日(土)

講義の準備。ブランチ操作をあらかた書いたことにする。

09月10日(金)

certbotがエラーを出している。

Your system is not supported by certbot-auto anymore.

ログインして確認。

$ sudo certbot renew --dry-run
                        (snip)
                        All renewal attempts failed. The following certs could not be renewed:
                        (snip)

おっと。なんかバージョンが古いのが問題らしい。

$ certbot --version
                        certbot 0.31.0

バージョンをあげてみる。

yum install --enablerepo=epel certbot
$ certbot --version
                        An unexpected error occurred:
                        AttributeError: 'module' object has no attribute 'TLSSNI01'
                        Please see the logfile '/tmp/tmpjRf06l/log' for more details.

うげ、バージョンを上げたら動かなくなったぞ。python2-certbotをアップデートすれば良いらしい。

sudo yum update python2-certbot*
$ certbot --version
                        certbot 1.11.0

よしよし、動いた。

$ sudo certbot renew --dry-run
                        (snip)
                        Congratulations, all simulated renewals succeeded:

動いた。よかった。焦った。

09月09日(木)

本の購入。

プレ技の発表練習。輪講。一冊読み終わった。素晴らしい。そして浸透圧について何もわかっていなかったことがわかった。

なんか呆然としてしまって、手が動かないぞ。

学校のPCにsnapを入れる確認。

$ which snap
                        /usr/bin/snap

snapはデフォルトで入っている。しかし、そのままでは返答しない。

snap --version # 処理が返ってこない。

というわけでsnapを入れる。まだ時間が遅れてたので、まず直す。

sudo hwclock -s

daemonize dbus-user-session fontconfigの三つをインストール。

sudo apt-get update
                        sudo apt-get install -yqq daemonize dbus-user-session fontconfig

demonizeを起動。

sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target

snapが返事をするようになる。

$ snap version
                        snap    2.48.3+20.04
                        snapd   2.48.3+20.04
                        series  16
                        ubuntu  20.04
                        kernel  4.19.128-microsoft-standard

ログインしていないと、listなどが見られない。

$ snap list
                        error: access denied (try with sudo)

sudoを試せと言ってくるが、listを見るにはroot権限は不要で、ログインが必要。この状態でsudoしてもダメと言われる。

$ sudo snap list
                        error: access denied (see 'snap help login')

ログインしようとしたら以下のコマンドで死ぬ。

exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME

調べてみると、systemdが二つ動いている。

$ pidof systemd
                        32692 30864

ssh-agentはたくさん動いてる。

$ pidof ssh-agent
                        33686 33657 33572 32677 29135 28925 27485 24655 24530 23881 16910 10516 13

再起動してみるかな。PowerShellから

wsl --shutdown

を実行。

$ pidof ssh-agent
                        16
                        $ pidof systemd

ssh-agentが一つ、systemdは動いていない状態になった。demonizeでsystemdを起動。

sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
$ pidof systemd
                        262

うん、一つになった。snapにログインする。

exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME

できた。

$ snap list
                        Name    Version   Rev    Tracking       Publisher   Notes
                        core18  20200707  1880   latest/stable  canonical✓  base
                        lxd     4.0.2     16558  4.0/stable/…   canonical✓  -
                        snapd   2.45.2    8542   latest/stable  canonical✓  snapd

実行できた。

$ snap search pdftk
                        pdftk  2.02-4   smoser     -      command-line tool for working with PDF files

pdftkを見つけた。インストールする(rootが必要)。

sudo snap install pdftk
$ pdftk --version
                        
                        pdftk 2.02 a Handy Tool for Manipulating PDF Documents
                        Copyright (c) 2003-13 Steward and Lee, LLC - Please Visit: www.pdftk.com
                        This is free software; see the source code for copying conditions. There is
                        NO warranty, not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

無事に入ったぞ。よかった。

WLS2のUbuntuでsystemdを使う

unshareにより、隔離された名前空間でデーモンとなるので、nsenterでその中に入る。

09月08日(水)

WSL2のUbuntuでpdftkを使いたい。そのためにはsnapが必要。しかし、WSL2のUbuntuではsnapdが走っていない。走らせるには以下のようにすれば良いらしい

sudo apt-get update && sudo apt-get install -yqq daemonize dbus-user-session fontconfig
                        sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
                        exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME
$ snap version
                        snap    2.49.2+20.04
                        snapd   2.49.2+20.04
                        series  16
                        ubuntu  20.04
                        kernel  4.19.128-microsoft-standard

動いた。

sudo snap install pdftk
$ pdftk --version
                        
                        pdftk 2.02 a Handy Tool for Manipulating PDF Documents
                        Copyright (c) 2003-13 Steward and Lee, LLC - Please Visit: www.pdftk.com
                        This is free software; see the source code for copying conditions. There is
                        NO warranty, not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

わーい、入った。

09月07日(火)

書類発送した。

忙しい忙しい。

頼まれてた本を買おうとしたら、生協が閉まってた。そうだ、16時までだった……

09月06日(月)

忙しい忙しい。

OS自作もくもく会。8章の途中。むずい。

09月05日(日)

いつのころからかVSCodeがローカルの.markdownlint.jsonを読まなくなってる?← WSL2のUbuntuにMarkdownlintが入っていなかったのが原因だった。インストールしたら読むようになった。

うーん、ネットですごい自信満々な人をよく見かけるんだけど、なんであんなに自分に自信持てるんだろ。近くにつよつよな人がいなかったのかなぁ。

作業中のBGMにYouTube聞いてるんだけど、一時期出なくなってたHero Warsがまた頻繁に出始めた。広告設定見ると、ちゃんとブロックしていることになっているんだけど。広告主がそれをわかってて、別のタイトルの広告として出しているのかなぁ。

僕は「はてブコメント」は悪だと思ってる。少しブックマークされると、「ホットエントリ(ホッテントリとも)」としてトレンドに乗って、それで大勢の目に触れて、さらにブックマークされることになる。で、技術系の記事が「ホットエントリ」に入ると、必ずといって良いほど、一行マウント系のコメントがつく。よくあるパターンが「なんでこんなのがいまさらホッテントリに?」みたいに、「俺はこんなの前から知ってたぜ」という奴。後、「いろいろ間違っている気が」という「俺は著者よりも詳しいぜ」というにおわせ系。どちらも「自分の能力のアピール」になっており、どちらも「ネットになんら新しい情報を増やしていない」という点で共通しており、さらに記事の著者のやる気をそぐ。

たまに自分の記事がホットエントリに入っているようだが、はてブコメントを見ると気分が悪くなるのでetc/hosts

127.0.0.1       b.hatena.ne.jp

を指定してしまっている。しかし、スマホだと見られてしまうので、たまに見に行ってしまう(そして気分が悪くなる)。この、「見ると気分が悪くなるのがわかっているのに、つい見に行ってしまう」のは、なんらかの報酬機構のせいだと聞いた(予想が当たることで云々とか)。とりあえずスマホでもブロックしてしまうかな。BlockSiteというアプリが良いらしい。

09月04日(土)

Gitのオブジェクトの中身についての記事書いた。そろそろGitを人に教えてもおこがましくない知識を得られただろうか。

09月03日(金)

いろいろ忙しい。講義の準備がヤバい。

09月02日(木)

Windowsのプリンター関連の「モニタリングツール」というのが入っているのだが、それがアップデートを要求してきた。何の気なしに「更新履歴」を見てみたら「社名変更」だけでずっこけてしまった。

なんかBoxeditというアプリが常駐してて何かと思ったら、Box上のファイルをローカルで開くためのツールらしい。要するにローカルにダウンロードしたファイルを監視し、変更があったら裏でアップロードするツール。うーむ。

C++ AMPの死について

なんか、Intelの奴も死んでなかったっけ?

思い出した、Intel Cilk Plusだ。

研究室ミーティング。本読み輪講。一冊終わりそう。素晴らしい。

Gitのハッシュがどうしても合わないと悩んでいたら、Vimが保存時に行末に改行コードを自動的に付与するという仕様のせいだった。しらなかった。

Pro Gitのハッシュ値の計算をする例をPythonで書き直す。

import hashlib
                        content = "what is up, doc?"
                        store = f"blob {len(content)}\0{content}".encode("utf-8")
                        hash = hashlib.sha1(store).hexdigest()
                        print(hash) #=> bd9dbf5aae1a3862dd1526723246b20206e5fc37    

できた。続き。

import zlib
                        data = zlib.compress(store)
                        print(bytes.hex(data)) #=> 789c4bcac94f5230346328cf482c51c82c56282dd05148c94fb607005f1c079d

こっちもできた。gitの作るオブジェクトと比べる。

git init
                        echo -n "what is up, doc?" > test.txt
                        git add test.txt 

この時点で「bd9dbf5aae1a3862dd1526723246b20206e5fc37」というオブジェクトができて、中身が「789c4bcac94f5230346328cf482c51c82c56282dd05148c94fb607005f1c079d」になっているはず。

$ od -tx1 .git/objects/bd/9dbf5aae1a3862dd1526723246b20206e5fc37 
                        0000000    78  01  4b  ca  c9  4f  52  30  34  63  28  cf  48  2c  51  c8
                        0000020    2c  56  28  2d  d0  51  48  c9  4f  b6  07  00  5f  1c  07  9d
                        0000040

なってますね。

もう一度、`Hello Git!"でやりなおす。

ハッシュ値が一致することを確認。

$ echo -n 'Hello Git!' > test.txt
                        $ git hash-object test.txt 
                        fdc3d3cd37c23aeb665aa995f395d9c6979bd508
                        
                        $ { echo -n 'blob 10\0';cat test.txt} | shasum 
                        fdc3d3cd37c23aeb665aa995f395d9c6979bd508  -

中身が一致することを確認。

$ git init
                        $ git add test.txt
                        $ od -tx1 .git/objects/fd/c3d3cd37c23aeb665aa995f395d9c6979bd508
                        0000000    78  01  4b  ca  c9  4f  52  30  34  60  f0  48  cd  c9  c9  57
                        0000020    70  cf  2c  51  04  00  34  98  05  7a                        
                        0000032
import zlib
                        content = "Hello Git!"
                        store = f"blob {len(content)}\0{content}".encode("utf-8")
                        data = zlib.compress(store)
                        print(bytes.hex(data))
$ python3 test.py
                        789c4bcac94f52303460f048cdc9c95770cf2c5104003498057a

一致していますね。めでたい。これでGit内部についてはおしまいかな。

Gitのblobはbinary large objectの略らしい。ほんとか?

少なくともGitHubはそう言っていると。

Gitのコミットオブジェクトは

を含んでいる。

スナップショットを保存するtreeオブジェクトは、ワーキングツリーのファイルとディレクトリを保存している。ディレクトリはtree、ファイルはblobオブジェクトとして保存。blobオブジェクトはファイル名を保存しておらず、blobとファイル名を結びつけるのはtree。したがって、同じ内容で異なるファイル名を持つファイルがワーキングツリーにある場合、blobオブジェクトは一つになり、treeオブジェクトが二つのファイルとして認識する。

よし、Gitの内部状態についてはもうだいたい理解したな。

09月01日(水)

9月になってしまった。

科研費の独立基盤形成の書類を一つ提出。これであとひとつのはず。

健康診断の予約したぞ。

久しぶりに迷惑メールみたら、8月16日に友人から久しぶりに来てたメールが迷惑メールに振り分けられているのを発見。Gmailの迷惑メール判定、もう信頼できない(偽陽性が多すぎる)ので、数日に一度は見に行かないとダメだな……

git rebaseの説明をZennに書いた。こうしてトピックごとにZennに書いて、思考を整理してから講義ノートにまとめていくスタイル。

Linuxのコマンドグルーピングというものを知った。echoの結果とcatの結果を、この順番でファイルに落としたい。

普通にやるなら中間ファイルが必要。

echo "Hoge" > head.txt
                        cat head.txt tail.txt > total.txt

しかし、中括弧で囲むとこんなことができる。

{echo "Hoge"; cat tail.txt;} > total.txt

これで、Gitのハッシュを調べることができる。こんなファイルを考える。

Hello Git!

Gitのハッシュを調べる。

$ git hash-object test.txt
                        106287c47fd25ad9a0874670a0d5c6eacf1bfe4e

Gitのハッシュはsha1sumなのだが、このまま食わせると違うものになる。

$ shasum test.txt
                        871fc2d049fbfab104eeca13c37ff938a1ffaf3d  test.txt

これは、頭にblob filesize\0というヘッダがついているから。filesizeはファイルサイズ。\0はヌル文字。

ファイルサイズを調べる。

$ wc -c < test.txt
                              11

11バイトなので、blob 11\0をヘッダとして追加し、それをshasumにかける。

$ { echo -en 'blob 11\0'; cat test.txt; } | shasum
                        106287c47fd25ad9a0874670a0d5c6eacf1bfe4e  -
                        
                        $ git hash-object test.txt
                        106287c47fd25ad9a0874670a0d5c6eacf1bfe4e

よしよし、無事に一致した。