【技術書】独学プログラマー 第3部

はじめに
--
他の言語をある程度知っている上で、覚えておきたいことを書いています。
勉強として何度も読み返さず、Qiitaにまとめたものだけをたまに見返せば十分なように書いています（全ての本がこの限りではない）。
([第2部](https://qiita.com/giwasuke/items/2d6813d0b77f0e3686ee)はこちら）

目次
--
1. 第16章 Bash
2. 第17章 正規表現
3. 第18章 パッケージ管理
4. 第19章 バージョン管理
5. 第20章 知識を1つにまとめる（スクレイピング)

第16章 Bash
--

- Bashはコマンドラインインターフェースと呼ばれるツールで、OSと対話するように命令し、プログラムを実行する。
- コマンドラインは、コードを書かずになんでも実行できる「コントロールセンター」。パッケージ管理やバージョン管理、それからLinuxサーバーとの通信などの全ての操作はコマンドラインで行う。ユーザー向けの、グラフィカルな画面ではない。
- プロとしてプログラミングしていくなら、本書で紹介するようなツールを使いこなそう。

#### - コマンド

- Bashでコマンドを入力することは、Pythonで関数を実行するようなもの。スペースを開けて引数を代入するのも、関数に似ている。
- cdやmkdir、lsなどの基本コマンドが紹介されている
- コマンドの引数には、フラグを渡すことができる。フラグを指定して実行したとき、デフォルトとは異なる動作をする。他の引数と区別するために、 - や -- に続けてフラグ名を書く。

```bash

$ ls --author -l
```

- パイプと呼ばれる縦棒記号（ | ）を使うと、あるコマンドの実行結果を別のコマンドへの入力として渡すことができる。

```bash
$ ls | less

>> Applications ...
```

- 環境変数は、OSに値を記録しておくための変数。``export [変数名]=[変数の値]``(spaceは入れない)で設定できる。

```bash
$ export x=100
$ echo $x

>>100
```

- 設定した環境変数をずっと使いたければ、ホームディレクトリにある.profileというファイルを編集して追加できる（Unix系OSの場合）。
``export x="ls -a"``のように、コマンド命令なども文字列として保存できる。$x で使用する。
(Macの場合[こちら](https://qiita.com/soarflat/items/d5015bec37f8a8254380)などを参考にする)

- OSにログインするユーザーは複数設定できる。各ユーザーはユーザー名とパスワードを持ち、権限（パーミッション）を持つ。
- 権限の一番高いユーザーはrootユーザーで、最も多くの権限を持っている。普段はrootユーザーとしてログインしてはいけないが、rootユーザーとしてコマンドを実行する必要があるときに限り、``sudo`` (superuser do)コマンドを使って実行する。(パスワードを要求される)
rootユーザーはスーパーユーザーとも呼ばれる。
- Bashについてさらに学びたいなら、[リンク1](https://xtech.nikkei.com/it/article/COLUMN/20060711/242981/) や[リンク2](https://www.ibm.com/developerworks/jp/linux/library/l-bash.html) を参照。

第17章 正規表現
--

- 正規表現とは、「連続した文字列の検索パターン定義」のこと。
- ファイル名やデータの中から、複雑なパターンと一致するものを探すのに役立つ。
- Unixのgrepコマンドに正規表現を指定し、文字列検索をした例：

```bash
$ grep Beautiful zen.txt
>> Beautiful is better than ugly. # 一致した行を返す
```

- Pythonのプログラムで正規表現を使うには、標準ライブラリのre(regular expression)を使う。

```python
import re

l = "Beautiful is better than ugly."
matches = re.findall("Beautiful", l)

print(matches)
>>['Beautiful']
```

- 他にも様々な一致判別の方法や正規表現の表し方などが記されているので、必要性を感じたら学ぶ。

第18章 パッケージ管理
--

- パッケージ管理ツールは、プログラムのインストールや管理を行うプログラムのこと。本章では、Pythonで書かれたパッケージソフトウェアをインストール・管理する**pip**の使い方を学ぶ。
``pip install [パッケージ名]``

- パッケージとは、「梱包された」ソフトウェア。プログラムファイルの他に、メタデータが含まれる。メタデータには、プログラムが動作するのに必要な他のパッケージへの依存関係などの情報が書かれており、パッケージ管理ツールを使うことで、そのコンピュータ上で動作するようにインストールできる。
- そのインストール時、パッケージ管理ツールはそのパッケージの動作に必要となる他のパッケージも自動的にダウンロード・インストールしてくれる。
- インストールできるパッケージは[PyPI](https://pypi.python.org/pypi)にすべて登録されている。パッケージのインストール先はPythonのsite-packagesディレクトリ。
- ウェブフレームワークFlaskをインストールする例を示す：

```bash
$ sudo pip install Flask==0.11.1 # バージョン番号の指定

>> Password:
>> Successfully installed Flask-0.11.1
```
Flaskでウェブブラウザにハローワールドを表示するまで行った。

- マシンにインストールしたパッケージの一覧は``pip freeze``コマンドで表示
- アンインストールは``pip uninstall [パッケージ名]``

第19章 バージョン管理
--

- ソフトウェア作りは、チーム競技だ。だから、1つのプロジェクトを進めるとき、コードベースを変更できるようにすることが不可欠である。
- コードベースとは、ソフトウェアのためのフォルダやファイルの集まりで、ある人の変更を全員で共有するもの。バージョン管理システム(VCS:Version Control System)の使用が推奨される。
- バージョン管理システム自体がプログラム（ツール）であり、GitとSVNが人気。通常、コードはクラウドに保存される。Gitでコードをバージョン管理し、GitHubでウェブサービスにコードを保存する方法を説明する。
- バージョン管理システムによって、リポジトリというデータ構造が作られる。コードの変更個所（変更差分）が記録される。プロジェクトに参加する全員がそれぞれのコンピューター上にローカルリポジトリを持ち、GitHubのようなウェブサイトで中央リポジトリを用意する。

![git.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673560/6d666a11-4d6a-8797-b65f-ddbe738461c6.jpeg)

- ローカルリポジトリの内容を中央リポジトリに同期させることを「プッシュ」、その逆を「プル」という。本書でその両方を試した。必要になった際にまた学び直そう。
- 今までのチャレンジ（章末のクイズ）で作成したすべてのPythonファイルをGitHubで新たに作成したリポジトリにコミットし、プッシュしよう。

第20章 知識を1つにまとめる
--

- 本章でウェブスクレイパーを作ろう。ウェブサイトのページを取得し、欲しい情報を収集・分析・抽出する（＝スクレイピングする）プログラムのこと。世の中にある膨大な量の情報を収集できるようになる。
- HTMLの簡単な復習：

```html
<html lang = "en">
<head>
    <meta charset="UTF-8">
    <title>My Website</title>
</head>
<body>
    Hello, World!
    <a href="https://www.google.com"/>here</a>
</body>
</html>
````
ウェブブラウザは、ファイルに書かれた複数の異なる**HTMLタグ**を読み取る。（例：``<a></a>タグ``はページにリンクを作れる。）

- 本節で、「Googleニュースからすべての<a></a>タグを読み取り、リンク先のすべての記事を取得するウェブスクレイパー」を作る。
- 取得後、BeautifulSoupパッケージを使ってGoogleニュースのHTMLをパース（構文解析）する。

```scraper.py
import urllib.request
from bs4 import BeautifulSoup


class Scraper:
    # スクレイピング対象となるウェブサイトのURLを受け取る
    def __init__(self, site):
        self.site = site

    # スクレイピングしたいタイミングで呼び出す
    def scrape(self):
        # urlopenはHTMLと追加情報を格納したResponseオブジェクトを返す
        r = urllib.request.urlopen(self.site)
        html = r.read()
        # URLのウェブサイトから取得した全てのHTMLデータがhtml変数に入っている
        parser = "html.parser"
        sp = BeautifulSoup(html, parser) # パース
        for tag in sp.find_all("a"): # <a></a>タグを全て集めて返す
            url = tag.get("href")
            if url is None:
                continue
            if "html" in url:
                print("\n" + url)

news = "https://trendy.nikkeibp.co.jp/news/"
Scraper(news).scrape()
```

urllib組み込みモジュールを使い、URL先のサイトからHTMLデータを全て抜き出す
<a></a>タグを集め、hrefに与えられるURLを取得する
"html"が含まれるURLを標準出力する

といった手順で、スクレイピングを行うことができた。
私は本書で一番このプログラミングが楽しいと感じた。

- webスクレイピングができるようになったら、各記事の文章から感情を分析したり、株式市場との相関を観察したりできる。世界中の情報を扱うことができるので面白い。


感想
--

・軸・骨組み、中心部分の要約
　主要な内容だけをまとめ、他のことは必要なとき調べたり本を見直す。
　基本を忘れなければ大丈夫。全てを書き留める必要はないと思う。
　それなりに知っているが、知らないこともいくつか書かれてる本やサイト、その他勉強をしたとき、知らないことに絞ってアウトプットするのは効果的
・わかりやすい図やアルゴリズムやらを絵で描いて貼っつけるのもいいね、楽しいし理解進む

[第4部以降](https://qiita.com/giwasuke/items/dffde60d0b66a0001292)はこちら