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。こちらもちゃんと発表できて素晴らしい。
懇親会(?)で学生さんの発表を褒められた。「自分で研究を理解して話している。やらされていない」と。そこを一番大事にしているところだったのでうれしい。
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" \
"-I$HOME/local/include" \
CPPFLAGS="-L$HOME/local/lib"
LDFLAGS=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を作る。
- 右上の「+」から「New Organization」を選ぶ
- プランが出てくるので「Create a free organization」を選ぶ。
- 「Organization account name」で名前を、「Contact email」でメールアドレスを選ぶ。「This organization belongs to」は、本来なら学科が良いが、ここでは「My personal account」にする。
- 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.
無事に入ったぞ。よかった。
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上のファイルをローカルで開くためのツールらしい。要するにローカルにダウンロードしたファイルを監視し、変更があったら裏でアップロードするツール。うーむ。
なんか、Intelの奴も死んでなかったっけ?
思い出した、Intel Cilk Plusだ。
研究室ミーティング。本読み輪講。一冊終わりそう。素晴らしい。
Gitのハッシュがどうしても合わないと悩んでいたら、Vimが保存時に行末に改行コードを自動的に付与するという仕様のせいだった。しらなかった。
Pro Gitのハッシュ値の計算をする例をPythonで書き直す。
import hashlib
= "what is up, doc?"
content = f"blob {len(content)}\0{content}".encode("utf-8")
store hash = hashlib.sha1(store).hexdigest()
print(hash) #=> bd9dbf5aae1a3862dd1526723246b20206e5fc37
できた。続き。
import zlib
= zlib.compress(store)
data 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
= "Hello Git!"
content = f"blob {len(content)}\0{content}".encode("utf-8")
store = zlib.compress(store)
data print(bytes.hex(data))
$ python3 test.py
789c4bcac94f52303460f048cdc9c95770cf2c5104003498057a
一致していますね。めでたい。これでGit内部についてはおしまいかな。
Gitのblobはbinary large object
の略らしい。ほんとか?
少なくともGitHubはそう言っていると。
Gitのコミットオブジェクトは
- スナップショット全体を保存するtreeオブジェクト
- 親コミット
- 著者やメールアドレス
- コミットメッセージ
を含んでいる。
スナップショットを保存する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
よしよし、無事に一致した。