狠狠撸

狠狠撸Share a Scribd company logo
ソースコード読経会 
報告書 
2014/09/23 
参加者:熊渕健二、豊吉政彦、西田泰大 
企画:豊吉
今回の目的 
? コーディング能力の向上 
? 凄い人のコードを読めば能力向上するのでは? 
? 凄い人って誰だ?
コート?読経会报告书
お题
会の流れ 
1. コンパイル(参考資料参照の事) 
2. まずは動かす 
3. それぞれのファイルについて読経 
4. 読経した結果はパワポでまとめ
各プログラム解説 
? init-db : キャッシュフォルダの初期化(git initっぽいもの) 
? update-cache : トレースファイルの追加、更新(git addっぽいもの) 
? write-tree : treeの作成(git commitっぽいもの) 
? commit-tree : データベースへ登録(git pushっぽいもの) 
? cat-file : ファイル名の表示 
? read-tree : tree内容の出力 
? show-diff : 最新コミットとの差異(git diff)
まずは動かす 
? % ./init-db 
? % ./update-cache README 
? % ./write-tree 
? % ./commit-tree 
? READMEを編集 
? % ./show_diff 
? % ./update-cache README 
? % ./write-tree 
? % ./commit-tree 
? % ./show_diff
Let’s 読経
1. データ構造
cache_header 
?in cache.h 
#define CACHE_SIGNATURE 0x44495243 /* "DIRC" */ 
struct cache_header { 
unsigned int signature; 
unsigned int version; 
unsigned int entries; 
unsigned char sha1[20]; 
}; 
! 
? キャッシュ(ファイルの状態を一時保存する構造)のヘッダ 
? バージョンとエントリ数を持ち、そこから一意に決まるsha1を持つ
cache_entry 
? in cache.h 
struct cache_entry { 
struct cache_time ctime; 
struct cache_time mtime; 
unsigned int st_dev; 
unsigned int st_ino; 
unsigned int st_mode; 
unsigned int st_uid; 
unsigned int st_gid; 
unsigned int st_size; 
unsigned char sha1[20]; 
unsigned short namelen; 
unsigned char name[0]; 
}; 
! 
? キャッシュに含まれるファイルの場所を指し示すポインタのようなもの 
? nameが0なのは長さを自由に設定するため。こんな使い方初めて見た!すごいぞ!トーパルズ!
作業メモ:cache.h 
? データ構造 
? cache_header 
? キャッシュの種類等を示す? 
? cache_time 
? キャッシュが保存された時間 
? cache_entry 
? データそのもの? 
? 不明点 
? 58: unsigned char name[0];
2. 関数の流れ
init-db.c (1) 
? キャッシュを格納するフォルダを決定する 
? 環境変数にSHA1のフォルダがあればそれを使う 
? フォルダ環境変数を使ってひとまとめにするかどうか決められる 
? 環境変数でまとめることで、PCに固有なキャッシュフォルダができる 
! 
? 作業メモ:知らなかった関数達 
? getenv : 環境変数を取得 
? stat : ファイル、ディレクトリの状態を取得 
? errno : マクロ、エラーが起きると0以外になる
init-db.c(2) 
? 指定されたpathに、256個のフォルダを作って、00からffに 
ネーミングする 
! 
! 
? これが、キャッシュを格納するフォルダとなる 
? ちなみにフォルダ名がSHA1の頭2文字になる 
? init-dbは以上
update-cache.c 
関数の流れ 
? main() 
? read_cache() : 最新キャッシュを読む 
? indexをロック 
? verify_path() : 入力されたファイルを確認する 
? add_file_to_cache() : ファイルをキャッシュに変換 
? write_cache() : キャッシュを書き込む
read_cache() 
? .dircache/indexには最新のキャッシュのインデックスが保存されている 
? read_cacheでは、indexから、最新のキャッシュをメモリに読み込む 
1. インデックスの読み込み 
2. メモリにマップ 
3. ヘッダのチェック 
4. メモリの確保 
5. エントリのロード 
! 
? 以下作業メモ 
? void *型 あらゆるポインタ型に変換できる型 
? if (-1 == (int)(long)map) 
? return error("mmap failed"); 
? mapを、NULLか、なにか入っている場合はindexのアドレスに設定する 
? #define alloc_nr(x) (((x)+16)*3/2) : ちょっと多めにメモリ確保、わかりづれぇよ、トーパルズ
read_cache() 
? gotoさんと遭遇
verify_hdr() 
? verify_hdr : 正しいcache_headerかチェック 
! 
SHA1_Init(&c); 
SHA1_Update(&c, hdr, offsetof(struct cache_header, sha1)); 
SHA1_Update(&c, hdr+1, size - sizeof(*hdr)); 
SHA1_Final(sha1, &c); 
if (memcmp(sha1, hdr->sha1, 20)) 
return error("bad header sha1"); 
! 
? cache-headerからSHA1生成、cache-headerのSHA1と合っているかチェック
read_cache() 
? バグを発見 
! 
map = (void *)-1; 
if (!fstat(fd, &st)) { 
map = NULL; 
size = st.st_size; 
errno = EINVAL; 
if (size > sizeof(struct cache_header)) 
map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); 
} 
! 
? mapがNULLだとその後のverify_hdrでセグフォる
作業メモ:read-cache.c 
? active_cache : cache_entry 
! 
? errno = ENOENT; 
? sha1_file_directory = getenv(DB_ENVIRONMENT); 
? if (!sha1_file_directory) 
? sha1_file_directory = DEFAULT_DB_ENVIRONMENT; 
? if (access(sha1_file_directory, X_OK) < 0) 
? return error("no access to SHA1 file directory"); 
? fd = open(".dircache/index", O_RDONLY); 
? if (fd < 0) 
? return (errno == ENOENT) ? 0 : error("open failed”); 
! 
? indexがなければreturn 0 (正常終了)
作業メモ:read-cache.c 
? エントリの数からメモリを確保 
? エントリをメモリ上(active_cache)に保存
作業メモ:update-cache.c 
? 関数のstatic宣言 : ファイル外から参照不可 
? read-cacheで、最新のコミットを読み込み 
? 全ての引数を正しいパスかチェック 
? verify_pathで正しいPATHが指定されているかチェック 
? add_cache_entry 
? もし、指定されたPATHにファイルがなく、さらにキャッシュ上に 
ファイルが存在するならそのファイルをキャッシュ上から削除する 
? PATHからキャッシュエントリを生成
作業メモ:update-cache.c 
? #define cache_entry_size(len) ((offsetof(struct 
cache_entry,name) + (len) + 8) & ~7) 
? 下位3ビットを000にする 
? メモリ上のentryの区切りを示す。
作業メモ:update-cache.c 
? index_fd 
? Zlibを使ったファイルの圧縮 
? z-stream 
? inにファイルをmmap 
? zlibで圧縮 : deflate
作業メモ:update-cache.c 
? /* Add it in.. */ 
? active_nr++; 
? if (active_nr > pos) 
? memmove(active_cache + pos + 1, active_cache + pos, 
(active_nr - pos - 1) * sizeof(ce)); 
? active_cache[pos] = ce; 
? return 0; 
? posに入れるために後ろをずらす
読経終わり 
? 今回積んだ功徳 
? cache.h(93) 
? init-db.c (51) 
? update-cache.c (254) 
? read-cache.c (266) 
? 664行
まとめ 
? プログラム自体について 
? メモリの使い方が神がかっている 
? データ保存のアイディアがすごい 
? SHA1をファイルにして保存、こうすると高速化できる?? 
? 読経会について 
? モチベーションが高まる、楽しい! 
? 関数の細かいところに時間をかけすぎた、次回はもっと大雑把に読みたい 
? なぜこういう設計にしたのか?という考察をしたい 
? 開発された経緯、設計の理由を知りたい 
? プログラムで何を、どのように抽象化しているのかということをもっと意識して読みたい
資料:コンパイル関連 
? git clone https://github.com/git/git 
? git checkout e83c5163 
? zlibとcryptoをリンク(LIBS += -lz -lcrypto) 
? st_mtimでエラー→st_mtimespec 
? st_ctimでエラー→st_ctimespec

More Related Content

What's hot (20)

PDF
Elasticsearch入門 pyfes 201207
Jun Ohtani
?
PDF
WDD2012_SC-004
Kuninobu SaSaki
?
PDF
Boost Tour 1.53.0 merge
Akira Takahashi
?
PDF
Sc2009autumn s2robot
Shinsuke Sugaya
?
PDF
笔辞蝉迟驳谤别厂蚕尝运用管理入门
Yoshiyuki Asaba
?
PDF
Mongodb 紹介
Ryo Matsumura
?
PPTX
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Issei Nishigata
?
ODP
仕事て?使えるシェルスクリフ?ト
bsdhack
?
PDF
シェル芸初心者によるシェル芸入门
icchy
?
PPTX
笔辞蝉迟驳谤别厂蚕尝共有ハ?ッファと関连ツール
Masahiko Sawada
?
PPTX
SQLチューニング入門 入門編
Miki Shimogai
?
PDF
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
Shigeru Hanada
?
PDF
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
Shigeru Hanada
?
PDF
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
Yoshiyuki Asaba
?
PDF
「今そこにある危機」を捉える ~ pg_stat_statements revisited
Uptime Technologies LLC (JP)
?
PDF
尝补蝉迟补贵濒耻迟别に移行した贵别蝉蝉と贰濒补蝉迟颈肠蝉别补谤肠丑+贰厂贵濒耻迟别による顿叠贵濒耻迟别环境
Shinsuke Sugaya
?
PPTX
厂迟谤别补尘2の基本
shigeki_ohtsu
?
PDF
狈辞诲别-惫0.12の新机能について
shigeki_ohtsu
?
PDF
Slub data structure
Masami Ichikawa
?
PDF
翱厂颁东京2013/厂辫谤颈苍驳冲闯笔鲍骋资料
Chika SATO
?
Elasticsearch入門 pyfes 201207
Jun Ohtani
?
WDD2012_SC-004
Kuninobu SaSaki
?
Boost Tour 1.53.0 merge
Akira Takahashi
?
Sc2009autumn s2robot
Shinsuke Sugaya
?
笔辞蝉迟驳谤别厂蚕尝运用管理入门
Yoshiyuki Asaba
?
Mongodb 紹介
Ryo Matsumura
?
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Issei Nishigata
?
仕事て?使えるシェルスクリフ?ト
bsdhack
?
シェル芸初心者によるシェル芸入门
icchy
?
笔辞蝉迟驳谤别厂蚕尝共有ハ?ッファと関连ツール
Masahiko Sawada
?
SQLチューニング入門 入門編
Miki Shimogai
?
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
Shigeru Hanada
?
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
Shigeru Hanada
?
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
Yoshiyuki Asaba
?
「今そこにある危機」を捉える ~ pg_stat_statements revisited
Uptime Technologies LLC (JP)
?
尝补蝉迟补贵濒耻迟别に移行した贵别蝉蝉と贰濒补蝉迟颈肠蝉别补谤肠丑+贰厂贵濒耻迟别による顿叠贵濒耻迟别环境
Shinsuke Sugaya
?
厂迟谤别补尘2の基本
shigeki_ohtsu
?
狈辞诲别-惫0.12の新机能について
shigeki_ohtsu
?
Slub data structure
Masami Ichikawa
?
翱厂颁东京2013/厂辫谤颈苍驳冲闯笔鲍骋资料
Chika SATO
?

Similar to コート?読経会报告书 (20)

PDF
Programming camp 2008, Codereading
Hiro Yoshioka
?
PDF
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー?リー
CODE BLUE
?
ODP
Programming camp Codereading
Hiro Yoshioka
?
PDF
Code Reading at Security and Programming camp 2011
Hiro Yoshioka
?
PDF
Cpu cache arch
Shinichiro Niiyama
?
PDF
Programming camp code reading
Hiro Yoshioka
?
PDF
翱笔肠补肠丑别の新机能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
?
PDF
Pfi Seminar 2010 1 7
Preferred Networks
?
PPTX
キャッシュコヒーレントに囚われない并列カウンタ达
Kumazaki Hiroki
?
PDF
Dive into .git 日本語版
nishio
?
PPTX
竞技プログラミングのための颁++入门
natrium11321
?
PDF
HashTable と HashDos
Yuya Takeyama
?
ODP
Sourcecode Reading Workshop2010
Hiro Yoshioka
?
PPT
窜贵厂のソースコードをチラ见してみる
Koichi Suzuki
?
PDF
Amazon ElastiCache - AWSマイスターシリーズ
SORACOM, INC
?
PDF
社内勉強会資料(Varnish Module)
Iwana Chan
?
ODP
搁耻产测のソースコードを読んでみよう(入门编)
baban ba-n
?
PDF
20120117 13 meister-elasti_cache-public
Amazon Web Services Japan
?
ODP
0x300
geek_alice
?
PDF
Ext4 filesystem(2)
Yoshihiro Yunomae
?
Programming camp 2008, Codereading
Hiro Yoshioka
?
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー?リー
CODE BLUE
?
Programming camp Codereading
Hiro Yoshioka
?
Code Reading at Security and Programming camp 2011
Hiro Yoshioka
?
Cpu cache arch
Shinichiro Niiyama
?
Programming camp code reading
Hiro Yoshioka
?
翱笔肠补肠丑别の新机能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
?
Pfi Seminar 2010 1 7
Preferred Networks
?
キャッシュコヒーレントに囚われない并列カウンタ达
Kumazaki Hiroki
?
Dive into .git 日本語版
nishio
?
竞技プログラミングのための颁++入门
natrium11321
?
HashTable と HashDos
Yuya Takeyama
?
Sourcecode Reading Workshop2010
Hiro Yoshioka
?
窜贵厂のソースコードをチラ见してみる
Koichi Suzuki
?
Amazon ElastiCache - AWSマイスターシリーズ
SORACOM, INC
?
社内勉強会資料(Varnish Module)
Iwana Chan
?
搁耻产测のソースコードを読んでみよう(入门编)
baban ba-n
?
20120117 13 meister-elasti_cache-public
Amazon Web Services Japan
?
Ext4 filesystem(2)
Yoshihiro Yunomae
?
Ad

Recently uploaded (9)

PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?
PPTX
色について.pptx .
iPride Co., Ltd.
?
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
PPTX
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
PDF
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
PPTX
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
PDF
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?
PDF
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
PDF
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?
色について.pptx .
iPride Co., Ltd.
?
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
Ad

コート?読経会报告书

  • 1. ソースコード読経会 報告書 2014/09/23 参加者:熊渕健二、豊吉政彦、西田泰大 企画:豊吉
  • 2. 今回の目的 ? コーディング能力の向上 ? 凄い人のコードを読めば能力向上するのでは? ? 凄い人って誰だ?
  • 5. 会の流れ 1. コンパイル(参考資料参照の事) 2. まずは動かす 3. それぞれのファイルについて読経 4. 読経した結果はパワポでまとめ
  • 6. 各プログラム解説 ? init-db : キャッシュフォルダの初期化(git initっぽいもの) ? update-cache : トレースファイルの追加、更新(git addっぽいもの) ? write-tree : treeの作成(git commitっぽいもの) ? commit-tree : データベースへ登録(git pushっぽいもの) ? cat-file : ファイル名の表示 ? read-tree : tree内容の出力 ? show-diff : 最新コミットとの差異(git diff)
  • 7. まずは動かす ? % ./init-db ? % ./update-cache README ? % ./write-tree ? % ./commit-tree ? READMEを編集 ? % ./show_diff ? % ./update-cache README ? % ./write-tree ? % ./commit-tree ? % ./show_diff
  • 10. cache_header ?in cache.h #define CACHE_SIGNATURE 0x44495243 /* "DIRC" */ struct cache_header { unsigned int signature; unsigned int version; unsigned int entries; unsigned char sha1[20]; }; ! ? キャッシュ(ファイルの状態を一時保存する構造)のヘッダ ? バージョンとエントリ数を持ち、そこから一意に決まるsha1を持つ
  • 11. cache_entry ? in cache.h struct cache_entry { struct cache_time ctime; struct cache_time mtime; unsigned int st_dev; unsigned int st_ino; unsigned int st_mode; unsigned int st_uid; unsigned int st_gid; unsigned int st_size; unsigned char sha1[20]; unsigned short namelen; unsigned char name[0]; }; ! ? キャッシュに含まれるファイルの場所を指し示すポインタのようなもの ? nameが0なのは長さを自由に設定するため。こんな使い方初めて見た!すごいぞ!トーパルズ!
  • 12. 作業メモ:cache.h ? データ構造 ? cache_header ? キャッシュの種類等を示す? ? cache_time ? キャッシュが保存された時間 ? cache_entry ? データそのもの? ? 不明点 ? 58: unsigned char name[0];
  • 14. init-db.c (1) ? キャッシュを格納するフォルダを決定する ? 環境変数にSHA1のフォルダがあればそれを使う ? フォルダ環境変数を使ってひとまとめにするかどうか決められる ? 環境変数でまとめることで、PCに固有なキャッシュフォルダができる ! ? 作業メモ:知らなかった関数達 ? getenv : 環境変数を取得 ? stat : ファイル、ディレクトリの状態を取得 ? errno : マクロ、エラーが起きると0以外になる
  • 15. init-db.c(2) ? 指定されたpathに、256個のフォルダを作って、00からffに ネーミングする ! ! ? これが、キャッシュを格納するフォルダとなる ? ちなみにフォルダ名がSHA1の頭2文字になる ? init-dbは以上
  • 16. update-cache.c 関数の流れ ? main() ? read_cache() : 最新キャッシュを読む ? indexをロック ? verify_path() : 入力されたファイルを確認する ? add_file_to_cache() : ファイルをキャッシュに変換 ? write_cache() : キャッシュを書き込む
  • 17. read_cache() ? .dircache/indexには最新のキャッシュのインデックスが保存されている ? read_cacheでは、indexから、最新のキャッシュをメモリに読み込む 1. インデックスの読み込み 2. メモリにマップ 3. ヘッダのチェック 4. メモリの確保 5. エントリのロード ! ? 以下作業メモ ? void *型 あらゆるポインタ型に変換できる型 ? if (-1 == (int)(long)map) ? return error("mmap failed"); ? mapを、NULLか、なにか入っている場合はindexのアドレスに設定する ? #define alloc_nr(x) (((x)+16)*3/2) : ちょっと多めにメモリ確保、わかりづれぇよ、トーパルズ
  • 19. verify_hdr() ? verify_hdr : 正しいcache_headerかチェック ! SHA1_Init(&c); SHA1_Update(&c, hdr, offsetof(struct cache_header, sha1)); SHA1_Update(&c, hdr+1, size - sizeof(*hdr)); SHA1_Final(sha1, &c); if (memcmp(sha1, hdr->sha1, 20)) return error("bad header sha1"); ! ? cache-headerからSHA1生成、cache-headerのSHA1と合っているかチェック
  • 20. read_cache() ? バグを発見 ! map = (void *)-1; if (!fstat(fd, &st)) { map = NULL; size = st.st_size; errno = EINVAL; if (size > sizeof(struct cache_header)) map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); } ! ? mapがNULLだとその後のverify_hdrでセグフォる
  • 21. 作業メモ:read-cache.c ? active_cache : cache_entry ! ? errno = ENOENT; ? sha1_file_directory = getenv(DB_ENVIRONMENT); ? if (!sha1_file_directory) ? sha1_file_directory = DEFAULT_DB_ENVIRONMENT; ? if (access(sha1_file_directory, X_OK) < 0) ? return error("no access to SHA1 file directory"); ? fd = open(".dircache/index", O_RDONLY); ? if (fd < 0) ? return (errno == ENOENT) ? 0 : error("open failed”); ! ? indexがなければreturn 0 (正常終了)
  • 22. 作業メモ:read-cache.c ? エントリの数からメモリを確保 ? エントリをメモリ上(active_cache)に保存
  • 23. 作業メモ:update-cache.c ? 関数のstatic宣言 : ファイル外から参照不可 ? read-cacheで、最新のコミットを読み込み ? 全ての引数を正しいパスかチェック ? verify_pathで正しいPATHが指定されているかチェック ? add_cache_entry ? もし、指定されたPATHにファイルがなく、さらにキャッシュ上に ファイルが存在するならそのファイルをキャッシュ上から削除する ? PATHからキャッシュエントリを生成
  • 24. 作業メモ:update-cache.c ? #define cache_entry_size(len) ((offsetof(struct cache_entry,name) + (len) + 8) & ~7) ? 下位3ビットを000にする ? メモリ上のentryの区切りを示す。
  • 25. 作業メモ:update-cache.c ? index_fd ? Zlibを使ったファイルの圧縮 ? z-stream ? inにファイルをmmap ? zlibで圧縮 : deflate
  • 26. 作業メモ:update-cache.c ? /* Add it in.. */ ? active_nr++; ? if (active_nr > pos) ? memmove(active_cache + pos + 1, active_cache + pos, (active_nr - pos - 1) * sizeof(ce)); ? active_cache[pos] = ce; ? return 0; ? posに入れるために後ろをずらす
  • 27. 読経終わり ? 今回積んだ功徳 ? cache.h(93) ? init-db.c (51) ? update-cache.c (254) ? read-cache.c (266) ? 664行
  • 28. まとめ ? プログラム自体について ? メモリの使い方が神がかっている ? データ保存のアイディアがすごい ? SHA1をファイルにして保存、こうすると高速化できる?? ? 読経会について ? モチベーションが高まる、楽しい! ? 関数の細かいところに時間をかけすぎた、次回はもっと大雑把に読みたい ? なぜこういう設計にしたのか?という考察をしたい ? 開発された経緯、設計の理由を知りたい ? プログラムで何を、どのように抽象化しているのかということをもっと意識して読みたい
  • 29. 資料:コンパイル関連 ? git clone https://github.com/git/git ? git checkout e83c5163 ? zlibとcryptoをリンク(LIBS += -lz -lcrypto) ? st_mtimでエラー→st_mtimespec ? st_ctimでエラー→st_ctimespec