gitのすすめ
DESCRIPTION
TRANSCRIPT
gitのすすめ
デンソーアイティーラボラトリ吉田悠一
プレゼンで出てくる話はすべてフィクションです。実在の人物や団体などとはたぶん関係ありません。
subversion?
____ / \ /\ キリッ. / (ー) (ー)\ / ⌒(__人__)⌒ \ | |r┬-| | さて,今日もsubversionからチェックアウトして \ `ー'´ / コーディングだお!! ノ \ /´ ヽ
subversion?
___ / \ /ノ \ u. \ !? / (●) (●) \ | (__人__) u. | クスクス> \ u.` ⌒´ / ノ \ /´ ヽ
subversion?
____<クスクス / \!?? / u ノ \ / u (●) \ | (__人__)| \ u .` ⌒/ ノ \ /´ ヽ
git・・・・?
svn??
svn
自重
って言われても
____ / \ / ─ ─ \ / (○) (○) \ SVNじゃだめなのかお… | (__人__) | \ ` ⌒´ /
/ ̄ ̄\ / _ノ \ | ( ●)(●). | (__人__) いまだにsvnか・・・・・ | ` ⌒´ノ 日付でファイルが増えていくよりマシだが・・・. | } . ヽ } エンジニアならgitを使うだろJK ヽ ノ \ / く \ \ | \ \ \ | |ヽ、二⌒)、 \
そんなこんなで
____ /⌒ ⌒\ /( ●) (●)\ /::::::⌒(__人__)⌒:::::\ やらない夫! | |r┬-| | gitについてやる夫に教えろお! \ `ー'´ /
/ ̄ ̄\ / _ノ \ | ( ●)(●). | (__人__) まぁいいだろう・・・・ | ` ⌒´ノ . | } . ヽ } (このプレゼン作るのに2時間かかったんだが) ヽ ノ \ / く \ \ | \ \ \ | |ヽ、二⌒)、 \
git
• 分散型ソースコード管理ツール• SVN, CVSとは違うよ
• リーナスさんがLinuxカーネルの開発を進めるために開発
git理解への早道
• まずコンセプトを理解する• 仕様,コマンドから始めると死ねる
そんなこんなで
/ ̄ ̄\ /ノ( ゝ 、_,ノヽ r'´ ゙ヽ /`ヽ ____ | ⌒(( ●)(●) ヽ ヽ从从/ / \ /\. | (__人__) /⌒l \ \/ /て (●)liil(●) ノ( \ | ` ⌒´ノ |`'''| ∑ ヽ/ / そ / (__人__) ⌒ \ / ⌒ヽ } | | ,)/ / \ く | |!!il|!|!l| | コンセプトとかいいからさっさと / へ \ }__/ / / /\ \ \i⌒ヽェェ| / 使い方を教えるお!!! / / | ノ ノ / / YYY\ \ \ \ /⌒,/´( _ ノ | \´ / / \ \ / \ \/ /l | \_,/ / \ \_/ \__ノ |\ .| / \ |) ) ヽ / \ ,r' / \ , '´ `' , /ー'′ \ ( ) / \ \ / /
使い方からいくとsvnとの乖離とコマンド大杉のせいで挫折するんだよ!
コンセプト・・・ですか・・・
____ / \ / _ノ ヽ、_ \ そんなこと言われても / (●) (●) \ どうすりゃいいのさ | (__人__) | コンセプトとかわからないお \ ` ⌒´ / /´ `\ / / l l__l l_.[] _____/_/__ \, ´-'ヽ ヾ_ノ | | |__ コロ・・・・ _____\ コロ・・・・ ()__)」
/ ̄ ̄\ / _ノ \ | ( ●)(●). | (__人__) ゆっくりはじめるぞ | ` ⌒´ノ . | } . ヽ } ヽ ノ \ / く \ \ | \ \ \ | |ヽ、二⌒)、 \
gitのコンセプト
リポジトリ
• すべてのリポジトリは並列• すべてのリポジトリは今までの履歴を持つ
commitを理解する
空のリポジトリ
ファイルを追加したり
編集・・・
git add, git commitで
コミット
新しいコミットができる
hoge.cを追加
コミットに含まれるもの
hoge.cを追加
revision(SHAハッシュ値)
コミットした人コミットを作った人ファイル構造
一つ前のrevision(ポインタみたいな)
コミットに含まれるもの
hoge.cを追加
revision(SHAハッシュ値)
コミットした人コミットを作った人ファイル構造
一つ前のrevision(ポインタみたいな)
リポジトリに含まれるすべてのデータは
このコミットなのです
コミットに含まれるもの
hoge.cを追加
revision(SHAハッシュ値)
コミットした人コミットを作った人ファイル構造
一つ前のrevision(ポインタみたいな)
svnのように番号で管理されないことに気をつけて
さらに重ねると
hoge.cを追加 hoge.cを編集 hoge.cを編集
こういうグラフをコミットグラフといいますbackポインタが常にあるので
すべてのコミットを辿るとファイル構造を常に再現できます
実際にやってみよう
Mac-mini:Desktop sonson$ mkdir test Mac-mini:Desktop sonson$ cd test
実際にやってみよう
Mac-mini:Desktop sonson$ mkdir test Mac-mini:Desktop sonson$ cd testMac-mini:test sonson$ git initInitialized empty Git repository in /Users/sonson/Desktop/test/.git/ リポジトリ作成
実際にやってみよう
Mac-mini:Desktop sonson$ mkdir test Mac-mini:Desktop sonson$ cd testMac-mini:test sonson$ git initInitialized empty Git repository in /Users/sonson/Desktop/test/.git/Mac-mini:test sonson$ ls -altotal 0drwxr-xr-x 3 sonson staff 102 3 13 09:53 .drwx------+ 22 sonson staff 748 3 13 09:53 ..drwxr-xr-x 10 sonson staff 340 3 13 09:53 .git この不可視ファイルの中身がリポジトリのデータ
実際にやってみよう
Mac-mini:Desktop sonson$ mkdir test Mac-mini:Desktop sonson$ cd testMac-mini:test sonson$ git initInitialized empty Git repository in /Users/sonson/Desktop/test/.git/Mac-mini:test sonson$ ls -altotal 0drwxr-xr-x 3 sonson staff 102 3 13 09:53 .drwx------+ 22 sonson staff 748 3 13 09:53 ..drwxr-xr-x 10 sonson staff 340 3 13 09:53 .gitMac-mini:test sonson$ touch main.c
実際にやってみよう
Mac-mini:Desktop sonson$ mkdir test Mac-mini:Desktop sonson$ cd testMac-mini:test sonson$ git initInitialized empty Git repository in /Users/sonson/Desktop/test/.git/Mac-mini:test sonson$ ls -altotal 0drwxr-xr-x 3 sonson staff 102 3 13 09:53 .drwx------+ 22 sonson staff 748 3 13 09:53 ..drwxr-xr-x 10 sonson staff 340 3 13 09:53 .gitMac-mini:test sonson$ touch main.cMac-mini:test sonson$ git add main.c gitのファイルツリーの中に追加する
実際にやってみよう
Mac-mini:Desktop sonson$ mkdir test Mac-mini:Desktop sonson$ cd testMac-mini:test sonson$ git initInitialized empty Git repository in /Users/sonson/Desktop/test/.git/Mac-mini:test sonson$ ls -altotal 0drwxr-xr-x 3 sonson staff 102 3 13 09:53 .drwx------+ 22 sonson staff 748 3 13 09:53 ..drwxr-xr-x 10 sonson staff 340 3 13 09:53 .gitMac-mini:test sonson$ touch main.cMac-mini:test sonson$ git add main.c Mac-mini:test sonson$ git commit -m "First commit, added main.c"[master (root-commit) d3f62cb] First commit, added main.c 0 files changed create mode 100644 main.c
新しいコミットが作成された
git
• hashの一意性
• 差分のツリー構造• 常に後ろに辿れる
わかった?
____ / \ ( ;;;;( / _ノ ヽ__\) ;;;;)/ (─) (─ /;;/| (__人__) l;;,´ コミットの管理がかわっただけだお?/ ∩ ノ)━・'/ ( \ / _ノ´.| | 結局svnと同じじゃないかお・・・・?.\ " /__| | \ /___ /
/ ̄ ̄\ / _ノ \ | ( ●)(●). | (__人__) ツリー構造で管理していて, | ` ⌒´ノ ファイルの部分ごとの差分もちゃんと取れる. | } 良さがあるんだが・・・・.. ヽ } まぁ,ここはそのままでいいだろう ヽ ノ \ / く \ \ | \ \ \ | |ヽ、二⌒)、 \
clone/push/pullを理解する
どこかにリポジトリがあるhoge.cを追加 hoge.cを編集 hoge.cを編集
コピーする(くろーん)
hoge.cを追加 hoge.cを編集 hoge.cを編集
clone
hoge.cを追加 hoge.cを編集 hoge.cを編集
コードを書くhoge.cを追加 hoge.cを編集 hoge.cを編集
hoge.cを追加 hoge.cを編集 hoge.cを編集 bar.cを追加
hoge.cを追加 hoge.cを編集 hoge.cを編集
コミットするhoge.cを追加 hoge.cを編集 hoge.cを編集hoge.cを追加 hoge.cを編集 hoge.cを編集
hoge.cを追加 hoge.cを編集 hoge.cを編集 コミット
pushする
push
hoge.cを追加 hoge.cを編集 hoge.cを編集hoge.cを追加 hoge.cを編集 hoge.cを編集
hoge.cを追加 hoge.cを編集 hoge.cを編集 コミット
ウマー
hoge.cを追加 hoge.cを編集 hoge.cを編集 bar.cを追加
push
hoge.cを追加 hoge.cを編集 hoge.cを編集 bar.cを追加
pullは?hoge.cを追加 hoge.cを編集 hoge.cを編集 bar.cを追加 bar.cを編集
hoge.cを追加 hoge.cを編集 hoge.cを編集 bar.cを追加
あ,なんか他のリポジトリが更新されてる!!
pullは?
hoge.cを追加 hoge.cを編集 hoge.cを編集 bar.cを追加
pull
hoge.cを追加 hoge.cを編集 hoge.cを編集 bar.cを追加 bar.cを編集
ひっぱってくる
更新された!
hoge.cを追加 hoge.cを編集 hoge.cを編集 bar.cを追加 bar.cを編集
hoge.cを追加 hoge.cを編集 hoge.cを編集 bar.cを追加 bar.cを編集
わかった?
____ / \ ( ;;;;( / _ノ ヽ__\) ;;;;)/ (─) (─ /;;/| (__人__) l;;,´ コミットと何が違うのかお?/ ∩ ノ)━・'/ ( \ / _ノ´.| | pullとpushの呼び方が変わっただけかお・・・・?.\ " /__| | \ /___ /
/ ̄ ̄\ / _ノ \ | ( ●)(●). | (__人__) 確かにな・・・・・ | ` ⌒´ノ 実際の開発の風景を思い浮かべると. | } リポジトリがpush/pullで対等であることの. ヽ } よさがわかると思うぞ ヽ ノ \ / く \ \ | \ \ \ | |ヽ、二⌒)、 \
対等性 - 公開リポジトリの場合
S川くん
Y田さん
対等性 - 社内リポジトリの場合
S川くん
Y田さんのコードにバグがある!!どーしよー
Y田さん
人間関係
S川くん
間違ってコミットしたら怒られるの怖いけど
直したい・・・・
Y田さん
やっちゃったのか
S川くん
実際,前にY田さんのリポジトリめちゃめちゃにしちゃって
Y田さんのリポジトリにPushする権限がないし・・・・・
Y田さん
そんなときは
S川くん
clone
どっかのリポジトリY田さん
対等性
S川くん
commit
Y田さん
対等性
S川くん
バグ直しましたよ!!こんなもんで,どうですか?
Y田さん
対等性
S川くん
あ,いいじゃん
Y田さん
対等性
S川くん
pull
Y田さん
pullする
対等性
S川くん
やったーバグ治った!俺のコードがちゃんと役立った!
Y田さん
clone/push/pull
• clone/push/pullの考えみたいなもの?
• 親とか子とか関係ないので,clone元からpull
して更新することもできます
• push/pullというのは力関係がないことを意味するわけです
わかった?
____ / \ ( ;;;;( / _ノ ヽ__\) ;;;;)/ (─) (─ /;;/| (__人__) l;;,´ 分散ってのはわかったお・・・・・・・・/ ∩ ノ)━・'/ 色々な人とやるには便利っぽいお・・・・・・( \ / _ノ´.| | ウチの開発環境に関係ないお・・・・・・?.\ " /__| | \ /___ /
/ ̄ ̄\ / _ノ \ | ( ●)(●). | (__人__) pull requestと呼ばれるgithubの仕組みを思い浮かべるといい. | ` ⌒´ノ . | } マージする場所をbranchを作った人が指定するような感じだ. ヽ } 職人的にマージする必要性がなくなるので捗る ヽ ノ \ / く \ \ | \ \ \ | |ヽ、二⌒)、 \
branchを理解する
branch
master
branchを切る
master
debug-feat1
branchを切り替える
master
debug-feat1
branchを切り替える
master
debug-feat1
つまりbranchとはポインタのようなものですbranchの有無とは無関係にコミットは存在します
コミットする
master
debug-feat1
さらにコミットする
master
debug-feat1
さらにコミットする
master
バグも取れたし,テストも終わったわー
debug-feat1
master側も作業
master
debug-feat1
branchを切り替えて・・・
master
debug-feat1
master側コミットされたようです
master
debug-feat1
マージ開始バグFixして欲しい
debug-feat1
master
gitがチェック
debug-feat1
master
git
チェック!
gitがチェック
debug-feat1
master
git
コンフリクトとかなさげ,Go
マーーーーーーーーージ!!
master
debug-feat1
よし,よしバグ取れたわ
master
debug-feat1
あれ?
あのー,俺は?
master
debug-feat1
・・・・あ,用済みだわ
master
debug-feat1
branch削除
master
あああああああ!
branchの考え方
branchとはこんなイメージですsvnと違ってデータがすべてコピーされませんあくまでポインタであることをお忘れなく
実体はコミットグラフとして常に存在しています
master
実際にやってみようMac-mini:test sonson$ git branch* master
現在のbranchを調べる
master
実際にやってみようMac-mini:test sonson$ git branch* masterMac-mini:test sonson$ git branch develop 新しくbranchを作成
develop
master
実際にやってみようMac-mini:test sonson$ git branch* masterMac-mini:test sonson$ git branch developMac-mini:test sonson$ git checkout developSwitched to branch 'develop' 新しく作ったbranchに切り替える
develop
master
実際にやってみようMac-mini:test sonson$ git branch* masterMac-mini:test sonson$ git branch developMac-mini:test sonson$ git checkout developSwitched to branch 'develop'Mac-mini:test sonson$ git branch* develop master
branchを調べるとちゃんとふたつある
develop
master
実際にやってみようMac-mini:test sonson$ git branch* masterMac-mini:test sonson$ git branch developMac-mini:test sonson$ git checkout developSwitched to branch 'develop'Mac-mini:test sonson$ git branch* develop masterMac-mini:test sonson$ touch feature1.cMac-mini:test sonson$ git add feature1.c Mac-mini:test sonson$ git commit -m "Added new feature."[develop 5b5cc9c] Added new feature. 0 files changed create mode 100644 feature1.c branch “develop”でファイルを追加する
develop
master
実際にやってみようMac-mini:test sonson$ git branch* masterMac-mini:test sonson$ git branch developMac-mini:test sonson$ git checkout developSwitched to branch 'develop'Mac-mini:test sonson$ git branch* develop masterMac-mini:test sonson$ touch feature1.cMac-mini:test sonson$ git add feature1.c Mac-mini:test sonson$ git commit -m "Added new feature."[develop 5b5cc9c] Added new feature. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$ ls feature1.c main.c ちゃんとファイルはふたつあるよね
develop
master
実際にやってみようMac-mini:test sonson$ git branch* masterMac-mini:test sonson$ git branch developMac-mini:test sonson$ git checkout developSwitched to branch 'develop'Mac-mini:test sonson$ git branch* develop masterMac-mini:test sonson$ touch feature1.cMac-mini:test sonson$ git add feature1.c Mac-mini:test sonson$ git commit -m "Added new feature."[develop 5b5cc9c] Added new feature. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$ ls feature1.c main.cMac-mini:test sonson$ git checkout masterSwitched to branch 'master'
ここでbranch “master”に戻すとどうなる?
develop
master
実際にやってみようMac-mini:test sonson$ git branch* masterMac-mini:test sonson$ git branch developMac-mini:test sonson$ git checkout developSwitched to branch 'develop'Mac-mini:test sonson$ git branch* develop masterMac-mini:test sonson$ touch feature1.cMac-mini:test sonson$ git add feature1.c Mac-mini:test sonson$ git commit -m "Added new feature."[develop 5b5cc9c] Added new feature. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$ ls feature1.c main.cMac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.c あ,ファイルが消えてる!!!!!!!!!
develop
master
実際にやってみようMac-mini:test sonson$ git branch* masterMac-mini:test sonson$ git branch developMac-mini:test sonson$ git checkout developSwitched to branch 'develop'Mac-mini:test sonson$ git branch* develop masterMac-mini:test sonson$ touch feature1.cMac-mini:test sonson$ git add feature1.c Mac-mini:test sonson$ git commit -m "Added new feature."[develop 5b5cc9c] Added new feature. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$ ls feature1.c main.cMac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.c あ,ファイルが消えてる!!!!!!!!!
gitのリポジトリを作ったディレクトリはgitに管理されるイメージ.すべてのデータは.git内にあり,そこからデータを引き出して,
そのディレクトリ内で作業する感じになる
マージしてみるMac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.c
develop
master
あれ?Mac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.cMac-mini:test sonson$ git merge develop -m "Merge new feature1."Merge made by the 'recursive' strategy. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$
developをmasterにマージ
develop
master
あれ?Mac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.cMac-mini:test sonson$ git merge develop -m "Merge new feature1."Merge made by the 'recursive' strategy. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$
developをmasterにマージ
develop
master
これをfast forwardマージといいます.ファイル等の変更にコンフリクト等がない場合は,
そのままbranchを飛ばすだけでマージが成立するのです.
マージしてみる2Mac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.c
develop
master
おーMac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.cMac-mini:test sonson$ git merge develop -m "Merge new feature1." --no-ffMerge made by the 'recursive' strategy. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$
developをmasterにマージ
develop
master
おーMac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.cMac-mini:test sonson$ git merge develop -m "Merge new feature1." --no-ffMerge made by the 'recursive' strategy. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$
developをmasterにマージ
develop
master
これをno fast forwardマージといいます.常に新しいコミットを作ってマージします.
おーMac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.cMac-mini:test sonson$ git merge develop -m "Merge new feature1." --no-ffMerge made by the 'recursive' strategy. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$
developをmasterにマージ
develop
master
手元でマージするときは必ず,--no-ffで行うべきです.どこでマージが行われたのかわからないからです.
さっきの例は--no-ffだったのね(というか絶対コミットができる)
おーMac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.cMac-mini:test sonson$ git merge develop -m "Merge new feature1." --no-ffMerge made by the 'recursive' strategy. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$
developをmasterにマージ
develop
master
ただし,pullするときには--ffでやる方がいいでしょう.ローカルに対してもコミットが発生してしまうので,コミットグラフがぐちゃぐちゃになってしまいます
おーMac-mini:test sonson$ git checkout masterSwitched to branch 'master'Mac-mini:test sonson$ lsmain.cMac-mini:test sonson$ git merge develop -m "Merge new feature1." --no-ffMerge made by the 'recursive' strategy. 0 files changed create mode 100644 feature1.cMac-mini:test sonson$
developをmasterにマージ
develop
master
とは言っても,グラフがめちゃくちゃになってもコードはちゃんと保たれるのであまり心配することもありません.最初は恐れずガンガンやって,後悔することにしましょう.
branch
• gitのbranchは軽い
• んでbranchのようで(svnの)branchではない
• svnのようにコピーではありません
• いくら作ってもリポジトリは大きくなりません
• すぐに気軽に作って潰せます
わかった?
____ / \ ( ;;;;( / _ノ ヽ__\) ;;;;)/ (─) (─ /;;/| (__人__) l;;,´ ますますわからなくなったお・・・・・・・・/ ∩ ノ)━・'/ これが何の役に立つんだお・・・・・・?( \ / _ノ´.| | .\ " /__| | \ /___ /
/ ̄ ̄\ / _ノ \ | ( ●)(●). | (__人__) このbranchとpush/pullを組み合わせると | ` ⌒´ノ 分散型の開発開発すごく捗るんだが・・・・. | } . ヽ } 仕方がない具体的な例で説明するか ヽ ノ \ / く \ \ | \ \ \ | |ヽ、二⌒)、 \
gitを実践で考える
実践
例)アプリを展示会に出すmaster
feature1
develop
ついにver1が完成!明日から3日間展示会です!
cloneします master
feature1
develop
master
feature1
develop
cloneします master
feature1
develop
master
feature1
develop
展示会組
居残り組
展示会の準備中master
feature1
動かしたら・・・master
feature1
ちょwwwwwおまwwwwwww
S木さんのコードバグってる!!!
動かしたら・・・master
feature1
どーすんのよーこの場で直すかー
動かしたら・・・master
どーすんのよーこの場で直すかーbranch切るよー
feature1
デバッグ!master
feature1
demo-fix
デバッグ!master
demo-fix
まだ何かヘンだなー
feature1
展示会も終わり・・・master
demo-fix
feature1
さて,帰ってきたのでPush!
master
demo-fix
feature1
さて,帰ってきたのでPush!
master
demo-fix
feature1
おお,統合されたmaster
demo-fix
develop
feature1
マージして整理しようかmaster
demo-fix
develop
feature1
展示会でのfixどうする?master
demo-fix
develop
feature1
よさげなのでマーーーージmaster
develop
feature1
demo-fix
こっちもくださいmaster
develop
feature1
こっちもくださいmaster
develop
feature1
ちゃんちゃんmaster
develop
feature1
祭りの後
____ / \ ( ;;;;( / _ノ ヽ__\) ;;;;)/ (─) (─ /;;/| (__人__) l;;,´ なんとなくわかったような・・・・・・・・/ ∩ ノ)━・'/ なんだかわからないような・・・・・だお( \ / _ノ´.| | .\ " /__| | \ /___ /
/ ̄ ̄\ / _ノ \ | ( ●)(●). | (__人__) しょせん概念は概念. | ` ⌒´ノ 実際にやらないとわからないだろJK. | }. ヽ } この使い方を年頭にいれて使ってみるのが定石だ ヽ ノ \ / く \ \ | \ \ \ | |ヽ、二⌒)、 \
____ /⌒ ⌒\ ホジホジ /( ●) (●)\ /::::::⌒(__人__)⌒::::: \ とりあえずやってみるお | mj |ー'´ | \ 〈__ノ / ノ ノ
._ \ヽ, ,、 `''|/ノ .| _ | \`ヽ、| \, V `L,,_ |ヽ、) ,、 / ヽYノ / r''ヽ、.| | `ー-ヽ|ヮ | `| |. | ヽ、 | ヽ____ノ /_ノ ' ヽ_\ /(≡) (≡)\ /::::::⌒(__人__)⌒::::: \ | |r┬-| | \ `ー'´ / / \ ( | | ) \| э |/ ( ,,,, ,ノ \ 、(U)ノ ノ \/ / ┼ヽ -|r‐、. レ | / /\ d⌒) ./| _ノ __ノ ⊂⌒__)__)
backup slide
backup