Githubにある 「for Humans」 プロジェクト


# Githubにある 「for Humans」 プロジェクト

githubにあるリポジトリには、そのdescriptionに **「for Humans」** が入っているものがあります。
Pythonの **[requests](https://github.com/requests/requests)** というライブラリのdescriptionは **「python HTTP Requests for Humans™」** と書かれており、urllibなどのHTTP Requestを人間が使いやすいように設計されたものです。

つまり **「for Humans」** と書かれたライブラリなどのプロジェクトは、標準ライブラリなどを **人間が使いやすいように設計されたもの** であるため、有用なものが多くあります。

この記事ではPythonを使った「for Humans」プロジェクトを紹介したいと思います。

## 1. [keras-team/keras](https://github.com/keras-team/keras)

***Deep Learning for humans***

Kerasは、TensorFlowなどで実行可能なディープラーニングライブラリ。
人間に使いやすい設計で、kerasで深層学習を始める初心者も多いようです。
[日本語ドキュメント](https://keras.io/ja/)が充実してるので参照してください。



## 2. [pypa/pipenv](https://github.com/pypa/pipenv)

***Python Development Workflow for Humans***

nodeは `package.json` 、rubyは `Gemfile` でパッケージを管理しています。
Pythonは `pip` や `requirements.txt` を使ってパッケージ管理をしていますが、Gemfileなどに比べて機能が十分ではありません。

そこでpythonのパッケージ管理の機能を向上させるのがpipenvです。
[日本語ドキュメント](http://pipenv-ja.readthedocs.io/ja/translate-ja/)もありますし、qiitaにも様々な記事があります。

## 3. [kennethreitz/records](https://github.com/kennethreitz/records)

***SQL for Humans***

recordsはSQLを書くためだけに作られたライブラリで、`RedShift`, `Postgres` , `MySQL`, `SQLite`などのDBをサポートしています。

```python
import records

db = records.Database('postgres://...')
rows = db.query('select * from active_users')    # or db.query_file('sqls/active-users.sql')

for r in rows:
    print(r.name, r.user_email)
```

## 4. [kennethreitz/delegator.py](https://github.com/kennethreitz/delegator.py)

***Subprocesses for Humans 2.0***

delegatorはpythonの `subprocess` を人間が使いやすいように設計されたライブラリで、[envoy](https://github.com/kennethreitz/envoy)と[pexpect](http://pexpect.readthedocs.io/en/stable/)というライブラリからインスパイアされたものです。

```python
>>> c = delegator.run('ls')
>>> print c.out
README.rst   delegator.py

>>> c = delegator.run('long-running-process', block=False)
>>> c.pid
35199
>>> c.block()
>>> c.return_code
0
```

個人的にすごく便利だなと思うのは、 **パイプを使ったコマンド** を簡単に使えるとこです。

```python
>>> c = delegator.chain('fortune | cowsay')
>>> print c.out
  _______________________________________
 / Our swords shall play the orators for \
 | us.                                   |
 |                                       |
 \ -- Christopher Marlowe                /
  ---------------------------------------
         \   ^__^
          \  (oo)\\_______
             (__)\       )\\/\
                 ||----w |
                 ||     ||
```

これをsubprocessでやると、

```python
>>> from subprocess import Popen
>>> proc1 = Popen("fortune", stdin=-1, stdout=-1, stderr=-1)
>>> proc2 = Popen("cowsay", stdin=proc1.stdout, stdout=-1, stderr=-1)
>>> print proc2.communicate()[0]
   _______________________________________
 / Our swords shall play the orators for \
 | us.                                   |
 |                                       |
 \ -- Christopher Marlowe                /
  ---------------------------------------
         \   ^__^
          \  (oo)\\_______
             (__)\       )\\/\
                 ||----w |
                 ||     || 
```

このようにプロセスを２つ作らないとできません。

## 5. [kennethreitz/maya](https://github.com/kennethreitz/maya)

***Datetimes for Humans***

mayaはpythonの `datetime` を使いやすくしたライブラリです。
通常のdatetimeでは、タイムゾーンを設定するには `pytz` という専用のライブラリを使って以下のように設定します。

```python
>>> from pytz import timezone
>>> from datetime import datetime
>>> jst_now = datetime.now().astimezone(timezone('Asia/Tokyo'))
>>> print(jst_now)
2016-03-20 10:07:29.056724+09:00
```

しかし、mayaを使うと…

```python
>>> import maya
>>> now = maya.now()
>>> now.datetime(to_timezone="Asia/Tokyo")
datetime.datetime(2018, 3, 24, 17, 55, 10, 578125, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)
```

## 6. [kvesteri/validators](https://github.com/kvesteri/validators)

***Python Data Validation for Humans***

validatorsは様々な種類のデータをvaliateしてくれるライブラリです。

```python
>>> import validators
>>> validators.email("sample@gmail.com")
True
>>> validators.between(5, min=2)
True
>>> validators.between(500, max=400)
ValidationFailure(func=between, args=...)
>>> validators.domain('example.com')
True
>>> validators.ipv4("192.168.33.10")
True
>>> validators.url('http://foobar.dk')
True
```

## 7. [cypreess/python-rex](https://github.com/cypreess/python-rex)

***Python Regular Expressions for Humans***

rexは、pythonの正規表現ライブラリ `re` を使いやすくしたもので、 非常に使いやすくなっています。

reを使うと:

```python
import re
regex = re.compile("\[a-z\]{3}-(\\d{4})", flags=re.IGNORECASE)
m = regex.search("Your ticket number: XyZ-1047. Have fun!")

if m is not None:
   print m.group(1)
else:
   print None
```

rexを使うと:

```python
from rex import rex
print ("Your ticket number: XyZ-1047. Have fun!" == rex("/\[a-z\]{3}-(\\d{4})/i"))\[1\]
```

## 8. [dbader/schedule](https://github.com/dbader/schedule)

***Python job scheduling for humans***

scheduleは名前の通り、定義したジョブを定期的に実行するためのライブラリです。
scheduleはその定期実行の書き方が面白くて、 *10分ごとにジョブを実行* するには、

```python
import schedule

def job():
    print("I'm working...")

schedule.every(10).minutes.do(job)
```

このように書きます。他にも

```python
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).minutes.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
```

これらの書き方があります。スケジューリングしたジョブを実行するためには、

```python
import time
while True:
    schedule.run_pending()
    time.sleep(1)
```

このように書きます。


# まとめ

以上、Pythonを使った「for Humans」プロジェクトの一部を紹介しました。
Githubで *"for Humans"* と検索すると、python以外にもいろんな言語で書かれたプロジェクトが出てきますので、試しにやってみて下さい。