gitのソースコードをステップ実行する〜環境構築編〜
gitのソースコードをステップ実行する〜環境構築編〜
環境
Eclipse CDTのダウンロード
http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/neon3
Java8のインストール
なんか証明書が必要っぽかった。
apt install -t jessie-backports openjdk-8-jre-headless ca-certificates-java vi /etc/apt/sources.list deb http://ftp.de.debian.org/debian jessie-backports main apt-get update
ここにインストールされた
/usr/lib/jvm/java-8-openjdk-amd64/bin/java
- 参考URL
eclipse.iniを編集する
vmargsの上に、以下を追記した。
-vm /usr/lib/jvm/java-8-openjdk-amd64/bin/java
※eclipse neon3がここで起動する
gdb, make , gccのインストール
apt-get install -y gdb make g++
makeとg++はすでにインストールされていた。
- 参考URL
gitのインストール
apt-get install -y git
gitのリポジトリを複製する
// 一般ユーザーで実行する cd /home/yuzuma/develop git clone https://github.com/git/git.git git_source
gitをコンパイルするために必要なものをインストール
apt-get install -y libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
複製したリポジトリをEclipse CDTにimportする
gitのソースコードをデバッグする。
- Project > Build All
- diff.c を開いて、Run > Debug を実行する
- ステップ実行できるようになる
総括
CLionでやってみたかったが、CmakeListというもので、
Makefileとは別だったため、Eclipse CDTを使った。
C言語のソースコードをステップ実行する知識がなかったため、2日間かかったけど、
ステップ実行できてよかった。
引数を与えたりして、本格的に任意のコマンドをステップ実行したい。
— 追記:20170404
引数を与えて、任意のコマンドをステップ実行できた。
gitのソースをデバッグ実行する〜git log , git log –oneline, git reflog~
http://yuzuma-yuzuma-yuzuma.hatenablog.jp/entry/git-source-debug
debian の初期設定
debian jessieをGUIインストール直後にやったこと。
apt-transport-https のインストール
http://ftp.jp.debian.org/debian/pool/main/a/apt/apt-transport-https_1.0.9.8.4_amd64.deb dpkg -i apt-transport-https_1.0.9.8.4_amd64.deb
vimのインストール
vi /etc/apt/sources.list deb http://security.debian.org/debian-security jessie/updates main apt-get update
mozcのインストール(日本語環境)
vi /etc/apt/sources.list deb http://ftp.de.debian.org/debian jessie main aptitude -y install fcitx-mozc reboot
https://packages.debian.org/ja/jessie/amd64/fcitx-mozc/download
Microsoft Visual Studio Code のインストール
dpkg -i code_1.10.2-1488981323_amd64.deb
Google Chrome のインストール
aptitude -y install libappindicator1 dpkg -i google-chrome-stable_current_amd64.deb
02_数値型を操作する
- Pythonでは数値もオブジェクトであり、メソッドを持っています。
- 数値のメソッドを呼び出すことはほとんどありません。
- 16進数の表記
- 先頭に「0」をつける
- そのあとに「x」を記述する
- 0から9、a〜fまで
- 16進数は、数値型
- hex()
- 16進数相当の文字列を得る
- int()
- 16進数相当の文字列を数値に変換する
- 第2引数に、基数として「16」を渡す。
- 2進数の表記
- 先頭に「0」をつける
- そのあとに「b」を記述する
- 0か1
- bin()
- 10進数の数値を2進数相当の文字列に変換する
- int()
- 基数は「2」を渡す
- bin()
- 8進数の表記
- 先頭に「0」をつける
- そのあとに「o」を記述する
- 0から7までの数値を続ける
- oct()
- 数値を8進数相当の文字列に変換するため
- int()
- 基数は,8
- oct()
- ビット演算子
# coding: utf-8 # In[1]: # 16進数のリテラルを入力 0x1ff # In[2]: # 10進数の数値を16進数相当の文字列に変換 hex(1023) # In[3]: # 16進数相当の文字列を数値に変換する int("0x100", 16) # In[4]: # 2進数のリテラルを入力 0b1000 # In[5]: # 10進数の数値を2進数相当の文字列に変換する bin(1023) # In[6]: # 2進数相当の文字列を数値に変換 int("0b1111111111", 2) # In[7]: # 8進数のリテラルを入力 0o1777 # In[10]: # 10進数の数値を8進数相当の文字列に変換 oct(1023) # In[11]: # 8進数相当の文字列を数値に変換する int("0o1777",8) # In[ ]:
01_オブジェクトとしての組込型
- メソッドとは
- データに紐づいて、データに対する処理や操作をする関数のことを言う。
- メソッドの呼び出しの記法
- データ.メソッド名(引数1, 引数2, …)
- set型とディクショナリ型(変更不可能なデータのコレクション型)
- set型、ディクショナリ型はともに、複数の要素を順番なしに保存することができるデータ型。
- 変更不可能
リストで使える演算子、関数、メソッド
- 演算子や関数
- +
- *
- sum()
- len()
- max()
- min()
- メソッド
- index()
- reverse()
- sport()
- pop()
- remove()
- append()
- extend()
メソッド | 解説 |
---|---|
count() | ある要素がリストにいくつ含まれているか数える |
reverse() | リスト要素の順番を逆にする |
sort() | リスト要素をならべかえる |
06_関数の応用
- 関数にデフォルトの引数を定義する
- 引数のキーワード指定
- 引数はカンマで区切って、複数指定できる
- 順番には大事な意味がある。
- データの種類(データの型)
- あえて順番を入れ替えて呼び出す方法がある。
- 関数に引数を渡す時、引数の名前を明示する。
- 1つだけデフォルト値以外の引数を指定したいときに、キーワード指定を使うことがある。
- 関数とローカル変数
- 関数の中と外で同盟の変数を定義すると、別の変数として扱われる
- 関数内からは外の変数が見えるが、外から中は見えない
- 関数内世界のような機能を、「名前空間」や「ネームスペース」と呼ぶことがある
# coding: utf-8 # In[4]: # 関数にデフォルト引数を定義する def fizzbuzz(count=100, fizzmod=3, buzzmod=5): for cnt in range(1, count+1): if cnt%fizzmod == 0 and cnt%buzzmod == 0: print("FizzBuzz") elif cnt%fizzmod == 0: print("Fizz") elif cnt%buzzmod == 0: print("Buzz") else : print(cnt) fizzbuzz() # In[5]: # 引数のキーワード指定 ## class int(x, base=10) ## https://docs.python.jp/3/library/functions.html#int int(base=2, x="1010") # In[6]: # 関数の外側で定義した変数を関数内で使う local_var = 1 def test_func(an_arg): local_var = an_arg print("test_func()の中", local_var) test_func(200) print("test_func()の外", local_var) # In[ ]:
05_ループの応用
- whileでループを作る
- ループにシーケンスを添えないこと。
- 繰り返し変数もない
- 条件式を添える
- continue文を使う
- それ以降のループブロックを実行せず、ブロックの最初まで戻ることができる。
- 特定の条件にあるとき、ブロックの一部を実行せず、ループを続けたいときに使うと便利です。
- ループのelse
- for文にelseを添えると、ループの実行が終わった後に実行されるブロックを定義できる。
- for文のブロックでbreak文が実行されたときは、else以降のブロックは実行されない。
while文の記法
while 条件式: ループ内で実行するブロック
# coding: utf-8 # In[3]: ### FizzBuzz問題を解くプログラム cnt = 1 while cnt <= 100: if cnt % 3 == 0 and cnt % 5 == 0: print("FizzBuzz") elif cnt % 3 == 0: print("Fizz") elif cnt % 5 == 0: print("Buzz") else: print(cnt) cnt = cnt + 1 # In[14]: ### じゃんけんプログラム from random import randint # ディクショナリの定義をする hands = {0:"グー", 1:"チョキ", 2:"パー",} # タプル をキーに使いディクショナリに設定する # 勝ち負けのルール rules= {(0,0):"あいこ" , (0,1):"勝ち" , (0,2):"負け", (1,0):"負け" , (1,1):"あいこ" , (1,2):"勝ち", (2,0):"勝ち" , (2,1):"負け" , (2,2):"あいこ"} while True: pc_hand = randint(0,2) user_hand_str = input("0:グー, 1:チョキ, 2:パー, 3:やめる") # じゃんけんをやめる if user_hand_str == "3": break # 不正な入力の場合、ループの先頭に戻る if user_hand_str not in ("0", "1", "2"): continue # ユーザーの手を数値に変換 user_hand = int(user_hand_str) print("あなた" + hands[user_hand]+ "、コンピュータ:" + hands[pc_hand]) print(rules[user_hand, pc_hand]) # In[23]: ### for文とelse文の組み合わせ (素数です) a_num = 59 for num in range(2, a_num): print(a_num, num) if a_num % num == 0: print(a_num, "は素数ではありません") break else: print(a_num, "は素数です") # In[22]: ### for文とelse文の組み合わせ(素数ではありません。) a_num = 60 for num in range(2, a_num): print(a_num, num) if a_num % num == 0: print(a_num, "は素数ではありません") break else: print(a_num, "は素数です") # In[ ]:
04_if文の応用
- 比較演算子
- ==
- !=
- >
- <
- >=
- \<=
- in
- 条件式は、True,Falseという2種類の値を返す。真偽値
- 違うデータ型の比較を行うことはできない。
- “100” > 200 のような比較を書いて、自動的に文字列を数値に変換してくれない。
- int(“100”) > 200 のように、明示的に変換する必要がある
- 論理演算
- and
- or
- not
# coding: utf-8 # In[1]: 1+1 == 2 # In[6]: # 5の0乗 + 9 = 10 5**(4-4)+9 == 10 # In[7]: 5 > 2 # In[8]: 100 == 100.0 # In[9]: "かなこ" != "かなこぉ↑↑" # In[10]: [1, 2, 3] == [1, 2, 3] # In[14]: ### 条件式に論理演算子を使った例 v = 30000 if v < 28400: print("地上に落下します") if v > 28400 and v < 40300: # print("月とお友達です") if v > 40300 and v < 60100: print("惑星の仲間入りです") if v == 60100: print("アルファケンタウリを目指せ") # In[15]: # In[ ]: