SlideShare a Scribd company logo
1 of 29
Download to read offline
ソースコード読経会 
報告書 
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

Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Jun Ohtani
 
PostgreSQL運用管理入門
PostgreSQL運用管理入門PostgreSQL運用管理入門
PostgreSQL運用管理入門Yoshiyuki Asaba
 
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)Issei Nishigata
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプトbsdhack
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門icchy
 
PostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールPostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールMasahiko Sawada
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014Shigeru Hanada
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaShigeru Hanada
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 TokyoYoshiyuki Asaba
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisitedUptime Technologies LLC (JP)
 
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境Shinsuke Sugaya
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能についてshigeki_ohtsu
 
OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料Chika SATO
 

What's hot (20)

Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
Boost Tour 1.53.0 merge
Boost Tour 1.53.0 mergeBoost Tour 1.53.0 merge
Boost Tour 1.53.0 merge
 
Sc2009autumn s2robot
Sc2009autumn s2robotSc2009autumn s2robot
Sc2009autumn s2robot
 
PostgreSQL運用管理入門
PostgreSQL運用管理入門PostgreSQL運用管理入門
PostgreSQL運用管理入門
 
Mongodb 紹介
Mongodb 紹介Mongodb 紹介
Mongodb 紹介
 
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
Solr6 の紹介(第18回 Solr勉強会 資料) (2016年6月10日)
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門
 
PostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールPostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツール
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
 
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
 
Stream2の基本
Stream2の基本Stream2の基本
Stream2の基本
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能について
 
Slub data structure
Slub data structureSlub data structure
Slub data structure
 
OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料
 

Similar to コード読経会報告書

OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたYoshio Hanawa
 
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)Hadoop / Spark Conference Japan
 
Kubernetes in プロダクション! -- cndjp第2回
Kubernetes in プロダクション! -- cndjp第2回Kubernetes in プロダクション! -- cndjp第2回
Kubernetes in プロダクション! -- cndjp第2回Hiroshi Hayakawa
 
Alfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAlfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAshitaba YOSHIOKA
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門じゅん なかざ
 
Zabbixのパフォーマンスチューニング & インストール時の注意点
Zabbixのパフォーマンスチューニング & インストール時の注意点Zabbixのパフォーマンスチューニング & インストール時の注意点
Zabbixのパフォーマンスチューニング & インストール時の注意点Kodai Terashima
 
Coherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherenceCoherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherenceToshiaki Maki
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門Daiyu Hatakeyama
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented featuretamtam180
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドToru Tamaki
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説Shoken Fujisaki
 

Similar to コード読経会報告書 (20)

OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
Slide
SlideSlide
Slide
 
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
A Deeper Understanding of Spark Internals (Hadoop Conference Japan 2014)
 
Yesod on Heroku
Yesod on HerokuYesod on Heroku
Yesod on Heroku
 
20170124 linux basic_1
20170124 linux basic_120170124 linux basic_1
20170124 linux basic_1
 
Kubernetes in プロダクション! -- cndjp第2回
Kubernetes in プロダクション! -- cndjp第2回Kubernetes in プロダクション! -- cndjp第2回
Kubernetes in プロダクション! -- cndjp第2回
 
Hadoop Summit 2016 San Jose ストリーム処理関連の報告 #streamctjp
Hadoop Summit 2016 San Jose ストリーム処理関連の報告 #streamctjpHadoop Summit 2016 San Jose ストリーム処理関連の報告 #streamctjp
Hadoop Summit 2016 San Jose ストリーム処理関連の報告 #streamctjp
 
Linux Namespace
Linux NamespaceLinux Namespace
Linux Namespace
 
AI・HPC・ビッグデータで利用される分散ファイルシステムを知る
AI・HPC・ビッグデータで利用される分散ファイルシステムを知るAI・HPC・ビッグデータで利用される分散ファイルシステムを知る
AI・HPC・ビッグデータで利用される分散ファイルシステムを知る
 
Version管理 1
Version管理 1Version管理 1
Version管理 1
 
Alfrescoのバックアップとレストア
AlfrescoのバックアップとレストアAlfrescoのバックアップとレストア
Alfrescoのバックアップとレストア
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門
 
Zabbixのパフォーマンスチューニング & インストール時の注意点
Zabbixのパフォーマンスチューニング & インストール時の注意点Zabbixのパフォーマンスチューニング & インストール時の注意点
Zabbixのパフォーマンスチューニング & インストール時の注意点
 
Coherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherenceCoherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherence
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門SQL Server 使いのための Azure Synapse Analytics - Spark 入門
SQL Server 使いのための Azure Synapse Analytics - Spark 入門
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
 

Recently uploaded

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 

Recently uploaded (9)

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 

コード読経会報告書

  • 1. ソースコード読経会 報告書 2014/09/23 参加者:熊渕健二、豊吉政彦、西田泰大 企画:豊吉
  • 2. 今回の目的 • コーディング能力の向上 • 凄い人のコードを読めば能力向上するのでは? • 凄い人って誰だ?
  • 3.
  • 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