Angular, Blockchain, Science とか

Angular, Blockchain, Science全般 の情報を主に書いていきます。

6月のまとめと7月にやること

6月は関数型言語をやるとか言いましたが、Haskellをちょっとやっただけでした。

代わりに、オペレーティングシステムや言語処理をまじめに勉強し始めました。

とりあえず図書館から有名どころの本は全部借りてきたので、7月中に全部読みたいと思います。

プログラミングも少しづつできることが増えてきたのでこの調子で勉強し続けたいと思います。

ということで、

7月は、 Linux/Unixカーネル、言語処理(コンパイラ・インタープリタ)、アルゴリズム

をやっていきます。

フィボナッチ数列 C++

ただのフィボナッチ数列。いわゆる再帰ってやつですね。

#include <iostream>
using namespace std;

int fib(int a)
{
    if(a <= 1) return 1;
    return fib(a-1) + fib(a-2);
}

int main()
{
    for(int i=0; i<20; i++)
    {
        cout << fib(i) << endl;
    }
}

結果は

1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765

最小公倍数と最大公約数

よく使いますね。

#include <iostream>
using namespace std;

// 最大公約数
int gcd(int a, int b)
{
    if(b == 0) return a;
    return gcd(b, a % b);
}

// 最小公倍数
int lcm(int a, int b)
{
    int c = a * b / gcd(a,b);
    return c;
}

int main()
{
    int a = gcd(256, 828);
    int b = lcm(256, 828);
    cout << a << endl;
    cout << b << endl;

    return 0;
}

proof-of-work のpython スクリプト

Mastering Bitcoinの proof-of-work アルゴリズムのPythonスクリプトにコメントをつけてみました。

特に難しくはないですね。

import hashlib 
import time

max_nonce = 2 ** 32 # 4 billion

def proof_of_work(header, difficulty_bits):
    
    # target は difficulty target のこと
    # target = 0x10000000000...の場合
    # 0x1000000000... より小さい値のハッシュが見つかるまで
    # nonce をループさせる
    target = 2 ** (256 - difficulty_bits)
    
    for nonce in xrange(max_nonce):
        hash_result = hashlib.sha256(str(header)+str(nonce)).hexdigest()
        
        if long(hash_result, 16) < target:
            print "Success with nonce %d" % nonce
            print "Hash is %s" % hash_result
            return (hash_result, nonce)
        
    print "Failed after %d (max_nonce) tries" % nonce
    return nonce

#if __name__ == '__main__': 今回はrepl.itで実行してるので省略 

nonce = 0
hash_result = ''

# difficulty が高くなるほどマイニングに時間がかかる=難しくなる
for difficulty_bits in xrange(32):
    difficulty = 2 ** difficulty_bits
    print "Difficuty: %ld (%d bits)" % (difficulty, difficulty_bits)
    print "starting search..."
    
    # マイニングにかかるスピードを計る
    start_time = time.time()
    
    # new_blockがheaderになる header + nonce でハッシュをとる
    new_block = 'test block with transactions' + hash_result
    
    # proof-of-work 実行
    (hash_result, nonce) = proof_of_work(new_block, difficulty_bits)
    
    end_time = time.time()
    elapsed_time = end_time - start_time
    
    # マイニング時間表示
    print "Elapsed Time : %.4f seconds" % elapsed_time
    
    # nonce を マイニングにかかった時間で割ったのがハッシュパワー
    if elapsed_time > 0:
        hash_power = float(long(nonce)/elapsed_time)
        print "Hashing Power: %ld hashes per second" % hash_power

正規表現 の勉強を開始

いままで正規表現を避けて生きてきたのですが、正規表現もそろそろちゃんと勉強しなくちゃいけないなあと思いまして、正規表現の勉強も始めました。

とりあえず、オライリーの

詳説 正規表現 第3版

詳説 正規表現 第3版

  • 作者: Jeffrey E.F. Friedl,株式会社ロングテール,長尾高弘
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/04/26
  • メディア: 大型本
  • 購入: 24人 クリック: 754回
  • この商品を含むブログ (87件) を見る

で勉強しています。

まだまだ全然コード書けませんが、今後もあきらめずに勉強を続けていきたいと思います。

それとプログラミング言語の勉強ばかりしてきたので、ソフトウェア開発全般の勉強もちゃんと始めようと思います。