草プログラマー、それはつまり草

CS 会計 司法試験 英語 bitcoin 数学 物理学 などいろいろなことを勉強してます

Unix/Linux 入門から中上級者まで おすすめ本

2018 02 25 更新

Unix/Linuxのおすすめ本を紹介していきたいと思います。

エンジニアをやっていれば望もうが望まなかろうが、嫌でもLinuxと関わることになると思います。

まあ、LinuxカーネルぐらいITエンジニアなら理解しときたいですよね???

初心者


まあ、最初はコマンドラインから使えるようになる必要があります。


1週間でLPICの基礎が学べる本 第2版 (徹底攻略)

1週間でLPICの基礎が学べる本 第2版 (徹底攻略)

新しいLinuxの教科書

新しいLinuxの教科書

Linuxに触ったことがないよって人は、この二冊がおすすめです。初心者でも挫折することなく学べると思います。


まあ難しい要素は特にないので、ささっと覚えましょう。


この後に

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

  • 作者: ブルース・ブリン,Bruce Blinn,山下哲典
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 2003/02
  • メディア: 単行本
  • 購入: 18人 クリック: 331回
  • この商品を含むブログ (64件) を見る

で、シェルはOKでしょう。シェルも重要です。しっかりと学ぶ必要があります。


シェルをやるなら、まずこの本をやっておきましょう。何らかのプログラミング言語を勉強したことがある人ならそこまで苦労せずに読めると思います。

初級者


コマンドラインとシェルの勉強をしたあとはシステムプログラミングの勉強をしていきましょう。システムコールの勉強はコマンドラインと同じくそんなに難しいというわけではないので、短い期間で読み込むのがいいとおもいます。


ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道

ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道


最初の一冊としてはふつうのLinuxが無難だと思います。取っ掛かりとしてはいいとおもいますが、まあ個人的にはUnix/Linux理論と実践の方が好きです。


Unix/Linuxプログラミング理論と実践

Unix/Linuxプログラミング理論と実践


Unix/Linux理論と実践はすごいおすすめです。ホントに分かりやすい図があるので多分Linux関連の本のなかで1番読みやすいと思います。

網羅性は高くありませんが、理解が曖昧だったところがスッキリします。


中級者


詳解UNIXプログラミング 第3版

詳解UNIXプログラミング 第3版


いわゆる名著ですね。昔から非常に評価が高い本です。

網羅せいが高く、そのぶん分厚いです。ホントに分厚いです。

短期間でさらっと読めるものではないので、時間をかけてしっかりと読み込みましょう。


Linuxプログラミングインタフェース

Linuxプログラミングインタフェース

こちらはLinuxの名著ですね。こ

ちらもさっきの本と同じように、網羅性が高く、その分、分厚いです。

本当に分厚いです。

とても、持ち歩ける品物ではありません。

ですが、Linuxをつかうのであれば、読み込んでおく必要があると思います。

こちらも時間をかけて読み進めていきましょう。

時間はかかりますが読みやすいので、詰まることはあまりないと思います。


UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

  • 作者: W.リチャードスティーヴンス,W.Richard Stevens,篠田陽一
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 1999/07
  • メディア: 単行本
  • 購入: 8人 クリック: 151回
  • この商品を含むブログ (35件) を見る


こちらは、ネットワークプログラミングの名著です。

ネットワークといえばこの本というくらい有名な本ですので、ネットワークプログラミングに興味がある人は必読だと思います。

ただ、ネットワークの基本的な知識がある人向けです。いきなり読んでも理解するのは難しいでしょう。

量も質も素晴らしいのですが、全部目を通すにはかなり時間がかかるでしょう。

ネットワークの勉強をしてから読みましょう。

システム管理

Linuxは主にシステム管理に使う人が多いとおもいます。

Linuxシステム管理

Linuxシステム管理

取り敢えずさいしょに一冊これをよんでおけばいいと思います。本格的にシステム管理をやる人は


UNIXシステム管理 第3版〈VOLUME 1〉

UNIXシステム管理 第3版〈VOLUME 1〉

  • 作者: アイリーンフリッシュ,AEleen Frisch,飯塚正樹,下田みどり
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2003/07
  • メディア: 単行本
  • 購入: 1人 クリック: 18回
  • この商品を含むブログ (14件) を見る
UNIXシステム管理 第3版〈VOLUME2〉

UNIXシステム管理 第3版〈VOLUME2〉

  • 作者: アイリーンフリッシュ,AEleen Frisch,飯塚正樹,下田みどり
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2003/08
  • メディア: 単行本
  • 購入: 1人 クリック: 15回
  • この商品を含むブログ (9件) を見る


をやるといいとおもいます。ただかなり分量があるのでリファレンス的に使っていくのがいいとおもいます。

全部読もうとするとかなりキツいです。

正直システム管理の勉強は私はあんまり好きじゃないですねえ。

かなり苦しんだ記憶があります。

ネットワーク管理


システム管理も重いのですが、ネットワークもかなり重いです泣。


Linuxネットワーク管理 第3版

Linuxネットワーク管理 第3版

  • 作者: Tony Bautts,Terry Dawson,Gregor N. Purdy,高橋浩和(監訳),伊藤真浩(監訳),三好和人
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2005/11/17
  • メディア: 大型本
  • 購入: 1人 クリック: 13回
  • この商品を含むブログ (7件) を見る


取り敢えずこれを読んでおくとネットワークがどんな感じ可わかるとおもいます。この本は薄いのでさっさと読んでしまいましょう。

真面目にネットワーク管理をやるなら。


TCP/IPネットワーク管理

TCP/IPネットワーク管理

  • 作者: クレイグハント,Craig Hunt,村井純,林秀幸,土本康生
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2003/06
  • メディア: 単行本
  • 購入: 1人 クリック: 1回
  • この商品を含むブログ (5件) を見る


も読んでおいた方がいいでしょう。


こちらはかなり重いです。

ネットワークを理解するには、TCP/IPの理解は欠かせません。

読むのは大変ですが、目を通しておいた方がいいでしょう。😞💦

ここら辺まで来ると何でこんなに勉強してるんだろ( ̄0 ̄)って感じになりますが、まだまだ勉強するべきことはたくさんあります。

DNS & BIND 第5版

DNS & BIND 第5版

こちらの理解も重要です。DNSは必ず使うことになるので、しっかりとした理解が必要です。

これも結構分厚く、よむのに時間がかかります。

なんか重い本ばっかりなので一冊軽い本を挙げると

萌えるシリーズ 萌え萌えうにっくす! UNIXネットワーク管理ガイド ? PC UNIXネットワーク管理日々の疑問に萌えの一手

萌えるシリーズ 萌え萌えうにっくす! UNIXネットワーク管理ガイド ? PC UNIXネットワーク管理日々の疑問に萌えの一手

がおすすめです。この分野を勉強してると、このぐらいの本がものすごく薄く感じるようになります。

カーネル


ITエンジニアである以上、Linuxカーネルは理解したいですよね⁉ そうですよね❓

カーネルの勉強を始める前に読むべき本がありまして、


32ビットコンピュータをやさしく語る はじめて読む486 (アスキー書籍)

32ビットコンピュータをやさしく語る はじめて読む486 (アスキー書籍)


486は必ず読みましょう。すげえ役に立ちます。

本当に役に立ちます。

本当に分かりやすいので必ず読んでください。

仮想メモリとかなかなか理解しづらいところを非常に上手く説明しています。

もう一冊は

熱血! アセンブラ入門

熱血! アセンブラ入門

アセンブラもわかっておいた方が良いですね。

アセンブラくらいは読めないと少し恥ずかしいです。

非常に分厚く量がありますが、詰まるところは特にないのでスラスラ読めると思います。

以外とそこまで時間はかかりません。

カーネル

遂に本丸のカーネルです。

UNIXカーネルの設計

UNIXカーネルの設計

まずはこの本を読むのがいいとおもいます。これも所謂名著ですね。

ふつうにオペレーティングシステムの教科書として使えると思います。

はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)

はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)

コードやアルゴリズムを理解するにはこの本が1番簡単だと思います。取っ掛かりに最適でしょう。

読みやすい分量なので短期間で読み込むといいとおもいます。

ある程度のプログラミングの知識は必要です。


詳解 Linuxカーネル 第3版

詳解 Linuxカーネル 第3版

  • 作者: Daniel P. Bovet,Marco Cesati,高橋浩和,杉田由美子,清水正明,高杉昌督,平松雅巳,安井隆宏
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2007/02/26
  • メディア: 大型本
  • 購入: 9人 クリック: 269回
  • この商品を含むブログ (71件) を見る


詳細Linuxカーネルは必読でしょう。

読むのは大変ですが、この本を理解してやっと初心者から中級者にレベルアップといったところです。

時間を作って読み込む必要があります。

かなり時間が懸かりますが、頑張りましょう。

Linuxカーネル2.6解読室

Linuxカーネル2.6解読室

こっちの方が詳解Linuxカーネルより読みやすく、理解も容易だと思います。

詳解Linuxカーネルよりこちらを先に読んだ方がいいと思われます。

エンジニアとして生きていくのであれば、このぐらいは最低でも理解しておきたいところです。

おまけ


BSDカーネルの設計と実装―FreeBSD詳解

BSDカーネルの設計と実装―FreeBSD詳解

  • 作者: マーシャル・カークマキュージック,ジョージ・V.ネヴィル‐ニール,砂原秀樹,Marshall Kirk McKusick,George V. Neville‐Neil,歌代和正
  • 出版社/メーカー: アスキー
  • 発売日: 2005/10/18
  • メディア: 単行本
  • クリック: 122回
  • この商品を含むブログ (58件) を見る


BSDも面白いので余裕があれば読んでおくといいと思います。


このあたりまでくれば、だいたいソースコードを読めるようになります。

まあこのぐらいはやるには一年~二年くらいかかります。

このぐらいやれば、Unix/Linuxチョットできるよって自称しても許されると思います。

許されますよね😢

Linuxカーネル、glibc、FreeBSDあたりのソースコードはある程度読んでおきましょう。

あとXenやKVMなどの仮想化技術も忘れずに勉強しましょう😃。


おしまい

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件) を見る

で勉強しています。

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

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

Bitcoin Base58Checksum について

Mastering Bitcoin の Base58Checksum のコードにわかりやすくコメントを付けました。

#include <bitcoin/bitcoin.hpp>

int main()
{
    // Private secret key.
    bc::ec_secret secret;
    bool success = bc::decode_base16(secret,
        "038109007313a5807b2eccc082c8c3fbb988a973cacf1a7df9ce725c31b14776");
    assert(success);
    // Get public key.
    bc::ec_point public_key = bc::secret_to_public_key(secret);
    std::cout << "Public key: " << bc::encode_hex(public_key) << std::endl;
    
    // SHA256 + ripemd160
    const bc::short_hash hash = bc::bitcoin_short_hash(public_key);

    bc::data_chunk unencoded_address;
    // Reserve 25 bytes
    //   [ version:1バイト ]
    //   [ hash:20バイト = 160ビット(ripemd160) ]
    //   [ checksum:4バイト]
    unencoded_address.reserve(25);
    // Version byte, 0 is normal BTC address (P2PKH).
    unencoded_address.push_back(0);
    // Hash = ripemd160(sha256(public-key))
    bc::extend_data(unencoded_address, hash);
    // Checksum is computed by hashing data, and adding 4 bytes from hash.
    // Checksum sha256(sha256(unencoded_address)) の最初の4バイト
    bc::append_checksum(unencoded_address);
    // Finally we must encode the result in Bitcoin's base58 encoding
    assert(unencoded_address.size() == 25);
    const std::string address = bc::encode_base58(unencoded_address);

    std::cout << "Address: " << address << std::endl;
    return 0;
}

もっと頑張って勉強しないと。

C 配列の要素の入れ替え

ただの入れ替えです。

#include <stdio.h>

#define ASIZE 8

void swap_elements(int array[], int a, int b);
void display_array(int array[]);

main()
{
    int nums[ASIZE] = {1,9,3,6,8,5,11,7};
    
    printf("This is the initial array: \n");
    display_array(nums);
    swap_elements(nums, 2, 5);
    printf("The final array is: \n");
    display_array(nums);
}

void swap_elements(int array[], int a, int b)
{
    int temp;
    
    temp = array[a];
    array[a] = array[b];
    array[b] = temp;
}

void display_array(int array[])
{
    int index;
    for(index=0; index < ASIZE; index++){
        printf("%4d", array[index]);
    }
    printf("\n");
}

C++を真面目に勉強してPythonの簡単さに気づいた話

最近、ずっとC++の勉強していまして、二か月ぶりくらいにPythonに戻ってきてやっとPythonの簡単さに気づきました。

やっぱりPythonやRubyしか実務で使わない人も、一回 C++ をちゃんと勉強すべきですね。

まあもっとも僕の場合は, C++ と Go が実務(?)で使うものなのですが・・・

動的な言語もいいですね。超簡単。

アルゴリズムの勉強も順調ですので、今年中に bitcoin と ethereum のソースコードを理解できるように頑張ります。

pycoin や pybitcointools のようなものを今年作ってみようと思ってます。

Copyright © 2016 へなちょこプログラマー All rights reserved.