技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

AmazonLinux2 に ansible 2.7 で JDK11 をぶち込む

qiita.com

VM 作ったらまずは署名認証

VM を立ち上げて、 ssh を確認(今回は 192.168.56.2 にした)したら、署名で SSH できるようにする。
とりあえず mac 側で署名署名などを作る

$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096 -C "hoge@example.com" -f ~/.ssh/virtualbox
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/xxxx/.ssh/virtualbox.
Your public key has been saved in /Users/xxxx/.ssh/virtualbox.pub.
The key fingerprint is:
SHA256:eKnjs4jiHsEktydZ7McMGULVDBQ/Wg3kHpeewVfGVmc hoge@example.com
The key's randomart image is:
+---[RSA 4096]----+
| .oo**o    .o.. E|
|   o =o+ . oo  o |
|... = * * ..     |
|+. = B * =       |
| o+ + * S        |
|  .o . o         |
| .    o          |
|. .. o..         |
|o+. . oo         |
+----[SHA256]-----+
$ ls 
known_hosts   virtualbox  virtualbox.pub

したら公開鍵を転送

$ scp virtualbox.pub ec2-user@192.168.56.2:~/
ec2-user@192.168.56.2's password: 
virtualbox.pub 
$ ssh ec2-user@192.168.56.2                            

authorized_keys に登録する

$ ssh ec2-user@192.168.56.2 
$ cd .ssh/
[ec2-user@amazonlinux .ssh]$ ls -l
合計 0
-rw------- 1 ec2-user ec2-user 0  319 21:22 authorized_keys
[ec2-user@amazonlinux .ssh]$ cat ~/virtualbox.pub >> authorized_keys 

ansible 設定

適当に ansible.cfg を作る。
曰く、ローカルディレクトリにおいとけば効くのだそうだ

[defaults]
host_key_checking=False
inventory=/Users/xxxx/workspace/VirtualBox/hosts
private_key_file=/Users/xxxx/workspace/VirtualBox/virtualbox

なんか勢いでディレクトリ作っちゃったので、署名の類も移動するか

mv ~/.ssh/virtualbox* /Users/xxxx/workspace/VirtualBox/

hosts も作って

[develop-server]
192.168.56.2

これでもうコマンドは通るはずなので

$ ansible all -u ec2-user -m ping
Enter passphrase for key '/Users/xxxx/workspace/VirtualBox/virtualbox': 
192.168.56.2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

OK通ったね。

Amazon Corretto11 を DL させてインストールする

といっても、単純に Playbook を書くだけ。

- hosts:  develop-server
  user:   ec2-user
  sudo:   yes
  vars:
    corretto: https://d3pxv6yz143wms.cloudfront.net/11.0.2.9.3/java-11-amazon-corretto-devel-11.0.2.9-3.x86_64.rpm
    java_home: /usr/lib/jvm/java-11-amazon-corretto
  tasks:
    - name: Update all package
      yum:
        name: '*'
        state: latest
    - name: Install wget.
      yum:
        name: wget
        state: latest
    - name: Install corret.
      yum:
        name: '{{ corretto }}'
        state: present
    - name: Alternatives.
      alternatives:
        name: '{{ item }}'
        link: "/usr/bin/{{ item }}"
        path: "{{ java_home }}/bin/{{ item }}"
      with_items:
        - java
        - javac

実行すると

$ ansible-playbook java11.yml 
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default). This feature will be removed in version 2.9. Deprecation 
warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

PLAY [develop-server] ******************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************
Enter passphrase for key '/Users/xxxx/workspace/VirtualBox/virtualbox': 
ok: [192.168.56.2]

TASK [Update all package] **************************************************************************************************************************************************************
ok: [192.168.56.2]

TASK [Install wget.] *******************************************************************************************************************************************************************
ok: [192.168.56.2]

TASK [Install corret.] *****************************************************************************************************************************************************************
ok: [192.168.56.2]

TASK [Alternatives.] *******************************************************************************************************************************************************************
ok: [192.168.56.2] => (item=java)
ok: [192.168.56.2] => (item=javac)

PLAY RECAP *****************************************************************************************************************************************************************************
192.168.56.2               : ok=5    changed=0    unreachable=0    failed=0   

問題なく終了し、

$ ssh ec2-user@192.168.56.2
ec2-user@192.168.56.2's password: 
Last login: Tue Mar 19 23:55:37 2019 from 192.168.56.1

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@amazonlinux ~]$ java --version
openjdk 11.0.2 2019-01-15 LTS
OpenJDK Runtime Environment Corretto-11.0.2.9.3 (build 11.0.2+9-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.2.9.3 (build 11.0.2+9-LTS, mixed mode)

完了。
調べながらでも 2h で済むか…

Compass から勉強会情報を拾う

Compass から勉強会名と参加率を拾ってみる

まず何がしたかったかというと、勉強会のタイトルを形態素解析して、その募集人数と参加者(+参加待ち)の統計とったら、勉強会界隈のトレンドが追いやすくなるんじゃね?と思ったのが始まり。
で、その為の第一歩として、Compass から勉強会情報を拾ってくる処理をまずは考えた。

まずは requests でAPIを叩いてみる

COMPASSAPI仕様 が公開されているので、そこから拾ってみる。

import requests

パラメータ組み立てて

compass_rest_api = 'https://connpass.com/api/v1/event/'
params = {"ym":"201904", "count":100, "order":3,"start":1}  # 4 月、100 件(max)、着信順、先頭から

query = '&'.join([f'{key}={params[key]}' for key in params.keys()])

投げてみる。

r_get = requests.get(compass_rest_api + '?' + query)
r_get.status_code

200

OKOK
中身を拾うと

r_get.json()

応答が

    {'results_returned': 100,
     'events': [{'event_url': 'https://aaa.connpass.com/event/124784/',
       'event_type': 'participation',
       'owner_nickname': 'Wakamatz',
       'series': {'url': 'https://aaa.connpass.com/',
        'id': 1886,
        'title': 'Mathematik und Programmierung'},
       'updated_at': '2019-03-19T00:04:09+09:00',
       'lat': '34.775820300000',
       'started_at': '2019-04-14T13:30:00+09:00',
       'hash_tag': 'functional_programming, data_structures',
       'title': '純粋関数型データ構造読書会 第23回',
       'event_id': 124784,
       'lon': '135.544884900000',
       /* 中略 */
       'accepted': 4,
       'ended_at': '2019-04-14T18:00:00+09:00',
       'place': 'FG-Space'}],
     'results_start': 1,
     'results_available': 511}

一度に 100 件縛りがあるので、そこだけが問題だろうか?
とりあえず 100 件でリクエストしてみて、100 件未満になるまでループしてリクエストしてみる。

実際に勉強会データ(名前と参加者数)を拾ってみた

尚、やってみてわかったのだけど、ソート順がデフォルト以外だと、タイムアウトでコケるようだ。
多分インデックスが不足してるか何かしてるんだろうなーと思いつつ。
(いや、それ以外はそこそこ高速で返ってくる事を考えれば、RDB じゃなくて Mongo とか Cassandra とか使ってそう)

class ClassRoom:
    def __init__(self, title, limit, accepted, waiting):
        def or_zero(v):
            if isinstance(v, int):
                return v
            return 0
        self.title = title
        self.limit = or_zero(limit)
        self.joins = or_zero(accepted) + or_zero(waiting)
        self.score = self.joins / self.limit if self.limit != 0 else 1
        
    def __str__(self):
        return f'ClassRoom({self.title}, {self.limit}, {self.joins}, {self.score})'

def convert(event):
    return ClassRoom(event['title'], event['limit'], event['accepted'], event['waiting'])


def request_to_compass(start):
    params = {"ym":"201904", "count":WANT_EVENT, "order":1,"start":start}
    query = '&'.join([f'{key}={params[key]}' for key in params.keys()])
    return requests.get(compass_rest_api + '?' + query)


WANT_EVENT = 100
getted = WANT_EVENT
current_start = 1
class_rooms = []

while getted == WANT_EVENT:
    r_get = request_to_compass(current_start)
    respond_json = r_get.json()

    getted = respond_json['results_returned']
    current_start += WANT_EVENT
    print(f'{getted}, {current_start}')

    for ev in respond_json['events']:
        class_rooms.append(convert(ev))

# least 100
r_get = r_get = request_to_compass(current_start)
respond_json = r_get.json()
for ev in respond_json['events']:
    class_rooms.append(convert(ev))
100, 101
100, 201
100, 301
100, 401
100, 501
14, 601
[str(s) for s in class_rooms]
続きを読む

教師あり学習アルゴリズム

pandas とか matplotlib とか色々弄っていく。
インプットはコレ

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

全部は書かない。

先ずは必要なライブラリのインポート

Python で始める機械学習 という本の第二章先頭なのだけど、いきなり暗黙 import じみた事やってて初見殺しにも程があんだろ(汗

%matplotlib inline
from IPython.display import set_matplotlib_formats, display
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mglearn

データの種類別散布図

で、改めてデータロード

X, y = mglearn.datasets.make_forge()
print(f"X.shape: {X.shape}")
X.shape: (26, 2)

そしてグラフ化
ちなみに、mglearn.discrete_scatter は、どうも pyplot の scartter を第3引数のデータごとに記号を変えて呼び出してくれるものらしい。

参考: テラテイルでの質問

mglearn.discrete_scatter(X[:, 0], X[:, 1], y)

plt.legend(["Class 0", "Class 1"], loc=4)
plt.xlabel("First feature")
plt.ylabel("Second feature")
Text(0, 0.5, 'Second feature')

[f:id:white-azalea:20190318232637p:plain]

それぞれのデータの中身を見ていく。
y はデータの種類を表して

y
array([1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0,
       0, 0, 1, 0])

X は、その座標を示してる。
こっちは x, y 座標のペアだ。

X

array([[ 9.96346605, 4.59676542], [11.0329545 , -0.16816717], [11.54155807, 5.21116083], [ 8.69289001, 1.54322016], [ 8.1062269 , 4.28695977], 中略 [11.563957 , 1.3389402 ]])

もっと他にも散布図

wave データセットというらしい。

他の散布図も作画してみる。
単純に x, y の配列だけを指定すると、データ分類のないシンプルな散布図ができる。

X, y = mglearn.datasets.make_wave(n_samples = 40)

plt.plot(X, y, 'o')
plt.ylim(-3, 3)
plt.xlabel('Feature')
plt.ylabel('Target')
Text(0, 0.5, 'Target')

[f:id:white-azalea:20190318232752p:plain]

y
array([-0.44822073,  0.33122576,  0.77932073,  0.03497884, -1.38773632,
       -2.47196233, -1.52730805,  1.49417157,  1.00032374,  0.22956153,
       -1.05979555,  0.7789638 ,  0.75418806, -1.51369739, -1.67303415,
       -0.90496988,  0.08448544, -0.52734666, -0.54114599, -0.3409073 ,
        0.21778193, -1.12469096,  0.37299129,  0.09756349, -0.98618122,
        0.96695428, -1.13455014,  0.69798591,  0.43655826, -0.95652133,
        0.03527881, -2.08581717, -0.47411033,  1.53708251,  0.86893293,
        1.87664889,  0.0945257 , -1.41502356,  0.25438895,  0.09398858])
X
array([[-0.75275929],
       [ 2.70428584],
       [ 1.39196365],
       [ 0.59195091],
       [-2.06388816],
       [-2.06403288],
       [-2.65149833],
       [ 2.19705687],
       [ 0.60669007],
       [ 1.24843547],
       /* 中略 */
       [ 1.10539816],
       [-0.35908504]])

乳癌データセット

恐ろしいなまえだなおい…マジか O'Reily 先生よ

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
print(f"Cancer keys: {cancer.keys()}")
Cancer keys: dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
cancer.data.shape
(569, 30)
[f'{n}: {v}' for n, v in zip(cancer.target_names, np.bincount(cancer.target))]
['malignant: 212', 'benign: 357']
cancer.feature_names
array(['mean radius', 'mean texture', 'mean perimeter', 'mean area',
       'mean smoothness', 'mean compactness', 'mean concavity',
       'mean concave points', 'mean symmetry', 'mean fractal dimension',
       'radius error', 'texture error', 'perimeter error', 'area error',
       'smoothness error', 'compactness error', 'concavity error',
       'concave points error', 'symmetry error',
       'fractal dimension error', 'worst radius', 'worst texture',
       'worst perimeter', 'worst area', 'worst smoothness',
       'worst compactness', 'worst concavity', 'worst concave points',
       'worst symmetry', 'worst fractal dimension'], dtype='<U23')

ボストンデータセット

1970 年代のボストン郊外の住宅価格の中央値、犯罪率、チャールズ川からの距離、高速道路への利便性。

from sklearn.datasets import load_boston

boston = load_boston()
boston.data.shape
(506, 13)

さらにこのデータをオライリー先生は拡張し、特徴量を 104 まで増やしたデータセットを作ったという。
13 の 2 組み合わせで、重複ありの 91 種類が追加されてるらしい。

X, y = mglearn.datasets.load_extended_boston()
X.shape
(506, 104)

K-NN アルゴリズム

これは不明なデータ(図では ☆)を、そこから「最も近いデータと多分同じ仲間なのだろう」とか、その捜索範囲で近い点 N 個の平均で、「多分○○の仲間なのだろう」という様な推測をするアルゴリズム
直近1個で決めるとこんな感じ。

尚、星の分類は色で示してる。

mglearn.plots.plot_knn_classification(n_neighbors=1)

f:id:white-azalea:20190318232934p:plain

これを直近3点で考えた時の分類。

mglearn.plots.plot_knn_classification(n_neighbors=3)

f:id:white-azalea:20190318233000p:plain

この様なアルゴリズムを scikit-learn でやってみる。
先ずはデータの読み込みと、学習/試験データへの分離。

from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.make_forge()

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)

そして、K 近傍法アルゴリズムの設定と学習。

from sklearn.neighbors import KNeighborsClassifier

clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train, y_train)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=3, p=2,
           weights='uniform')

さて、正答率は?

clf.score(X_test, y_test)
0.8571428571428571
続きを読む

日本のITにもの申す

techplay.jp

youtu.be

Togetter: 「日本のITに物申す・比較できる立場にいる外国人から」まとめ - Togetter

コメントが乱暴なのは、パネリストの言葉が乱暴だったのではなくて、私が乱暴な方がメモが早いからです

パネリストと自己紹介

  • KANI
    WFが主流すぎる…スピードなさすぎだろ。国際社会と戦うならスピードがないとヤられるぞ。
    コミュニケーション力:チーム、コード、知識、発送のコミュニケーションを会社にもプロダクトにも必要だろ
    英語:日本のマーケットだけて戦ってたら防戦一方だ。英語に進めば新しい事が全部できる様になるんだぜ?
    ダイバーシティがなぁ。男性、女性とか年齢とかごちゃ混ぜのダイバースなチームでないといいのができないぞ?
    世界にアピールするならそうでもないとダメじゃないのか?
  • MIKE
    開発古過ぎだろ、WF を使うべき場所はあるけど、なんでもWFし過ぎw
    英語力なさ過ぎだろwww
    新しい方法をほとんど取り入れない。
    どんどん取り入れて、役員の説得がひつようなんだよね。
    シリコンバレーと違って、日本のエンジニアは、自分の仕事に高い意識を持ってない気がする。
    意思決定が遅い。大きい組織ほど、責任を分別して、小さな自己組織化を進めて、意思決定を早くすべきだ。
  • ROOMELELE
    投資がへぼい。レガシー使い過ぎだ。
    人事でみると、ソフト開発者が評価されてない。企業に対して需要なのになんで?
    ソフト開発者の給与が低すぎる。シリコンバレーからみて低すぎる
    最近サンフランシスコ住みにくいw
  • DANIEL
    全然 SaaS とかの活用が進んでない。
    なんか自分たちでどうにかつくりがち。
    保守とかで結局足引っ張られるから、自分で作ってメンテナンスするというのが効率が悪い。
    クラウドが普及してて、サーバ持たなくていいので、どんどんクラウド使って、インフラ維持とか保守やめようぜ。
    職人文化が足引っ張ってないか?最初から一筆書きに完璧を求めすぎだと思う。ちょっとスピード感が厳しい。 日本で一番びっくりするのは開口一番「納豆食べますか』って聞かれる。ちなみに納豆は大好きだw

質問とコメント

  • 失われた20年…この成長のなさの問題。
    なんか高度経済成長期に貯めた貯金で、年金生活になってる感が強い。
    変化できなかった理由はなんだろう?
    • R: 要素が大きいのは労働市場の特別さ。終身雇用のせいで、人を上手に生かされてないきがする。
      転職もしにくいし…同じ企業で転々と移動してて、専門性もつかない。
      専門性が求められてるのに、転々と移動しているとどこ行っても初心者なんだよね。
      人が同じ会社にいて、流動性がないと、成長してる中小が育たないとか、古くて成長しない大企業が人ばっかプールしてたり、日本が弱る。
      Happy でなくてもだらだら会社にしがみつく…体壊してやってるし…
      日本の最大の資源は勤勉さだぞ。そんな貴重な資源が無駄塚おされてる
    • K: 20年前に日本がシリコンバレーになってる事もあり得たんだ。
      日本はハードウェアがうま過ぎて、ソフトが軽視されちゃったんだ。
      起業しにくすぎる。法律として、従業員の作業時間を記録しないとダメ?
      効率化とか考えるなら、働き方自由にしたいのに…。
      もっと働き方というのを法制度も含めて考えないとだめじゃね?
  • 日本がAIで戦うにはどうすればいいだろう?遅れ過ぎてるんだよね
    • D: ダイバーシティとかやり方とか、英語とか、たくさんやることはある。
    • K: 一つ思ったのは、AI ってブームなんだけどさ、逆にどんな問題を解決すべきなのかって方から考えたらいんでない?
      中小企業みると、プロセスが統一化と最適化がすでにされてる。町工場の職人的経験で、最適化されてんじゃん。
      そういう意味ではAIのニーズがなくないかって話。
    • D: バッチファイルでどうこうってのはよくあるんだけど、日本は三人くらいで綺麗に回せちゃってたりする。
      海外だとそれはない。でもこれスケールしない(汗
  • 日本のエンジニアの待遇が悪いのはなんでだろうね?
    • R: 一つは従業員の流動性の問題で、海外だとより良い給料を出せば集まる。こうした人集めの競争によって待遇はよくなる。
      特に優秀なエンジニアだとねぇ。シリコンバレーだと、ビジネスの成功は有能な開発者を確保できるからだ。
      だが、日本はそういう意識がない上に、労働市場もそうではないので、市場原理的にも待遇が上がらない。
      しかも専門性が育たない上に、レガシーシステムのスキルばかり貯めてたらね…。
    • D: 大企業で昔ながらの仕事やってるとこなんだけど、エンジニアがいないと連携できない、SIer にかけると金がかかる。
      で、保守だけのメンバーをアサインしたら、そいつらは楽しそうだった。
      優秀なのはいる。要するに使われ方が悪い。
    • M: シリコンバレーと日本のエンジニアのスキルはそんな変わらん。
      シリコンバレーは、エンジニアのやりたいことってのを突き進められる。
      日本はそれがない。エンジニアから会社の為に提案するという働きもない、環境としてそれも受け入れないから立場もあげにくい。
    • K: そのトーリ
      下請けだらけで、だから3K,5K なんだよね
      シリコンバレーだとエンジニアは貴重なリソースなんだけどね(汗
      Gmail とか Calendar 連携とかもエンジニアが案を出して走ってるんだぜ
      内製すればみんなハッピーになれるんだよ。
  • SIer に丸投げが起きちゃってね…発注する側もそう考えてそうなんだよね。
    発注する側が変わらないとダメなんじゃね疑惑がある、それはどう思う?
    • M: 国内意識が強いよね、賭け事とかしない国だから。強いやつが内製して成功すれば後に続くんじゃないかな(汗
  • 日本とアメリカのいいどこどりできるとしたらどこ?
    • M: シリコンバレーも日本も理想郷ってわけではない。
      これはエンジニア同士が話し合って、コミュニティを作って、情報を共有しながらやってみるしかない。
      それも国際的にコミュニティを持ちたいよね。
  • 日本のこの流動性のなさって、終身雇用や人材プール、総合職問題もそうだけど、高度経済成長期の「人月を増やせば儲かる」のビジネスモデルに法律も含めて過剰な最適化がされすぎた結果だと分析できるんだけど、この流れや法を変えようと思ったら、どういうアプローチをすればいいのだろう?(私の質問)
    • R: 会社に任せちゃうってマインドがよくないよね。
      そういうのをどうにかしないと、法整備しても結果はでない。
    • K: こういう勉強会の場を増やして啓蒙していかないとね。
  • スタートアップでも古臭いと思うことってない?
    • R: ルールとか習慣とかが古臭い。上場準備すると、へんなコンサルとルールがあって、働き方が固定化されちゃうんだよね。
      過剰なお役所体質がだめなんだよね。
    • D: 上場企業が目的になってたりするよね。上場しなくていいんじゃない(笑
      お役所仕事に巻き込まれるよ?WWW
  • WFから変わるにはどうすればいい?
    • R: もちろん方法やプラクティスは必要だけど、マインドセットが重要で、それがないとうまくいかない。
      生産性と8つの習慣、これが重要。検索すればブログ出るので、これは参考になる。
  • 今日は大変な日。日本の確定申告。これレガシーそのもの(笑)。
    累計で 3000 億とかメンテナンス費用かかってるんだよね(汗)。
    レガシーすぎて、アーキテクチャを選んじゃう。今時 JRE6 とかね…。
    なんかこういうのに問題を定義する法律とかってない?
    • M: 米の政府機能も日本と似たり寄ったりでクソですwww
    • K: バックエンドの古いのに対応たラッパー作っちゃう。そのユーザビリティで利用料を取るのが一つのビジネスだよね。
    • M: 最近はよくなってきてるものもある。オバマケアのサイトとか。
  • 今の日本の若い世代、ウキウキワクワクしててほしい。
    こういうアイディアはビジョンがないと生まれない。こういうワクワク感を醸し出すにはどうしたらいい?
    • M: 日本で戦う夢じゃなくて、世界で戦う夢が必要。そういうビジョンがほしいんだと思う。

最後に

  • D: 自分の良さを知る。自分を客観して、世界に挑むべきだ。
  • R: 日本人はみんな弱みは言える、強みは言えない。この強みを意識してくれ。強みを伸ばした方がペイできる。
  • M: 日本はものづくりの歴史がある。それをソフトウェアに向けてくれ。
  • K: 日本がエンジニアリーダーになるには、英語とソフトウェアだ。今やれば来年の今頃にはできるようになってる。まずはやるんだ!

【3/14】アプリからドライバまで現役エンジニアの濃い話#8

sciencepark.connpass.com

このイベント行ってみました。

  • 最初はExcelでいけると思ってたけど途中からしんどくなってきたデータのためのPython Pandas (複数インデックス編):サイエンスパーク株式会社 西村さん
  • WinDbg Previewについて: 日本マイクロソフト株式会社 大橋さん
  • git初心者からgit-flowを使えるレベルになって、リリースとレビューを効率化しよう:サイエンスパーク 須藤さん

公式にある程度資料は乗ってるけど、これら内容のダイジェスト!

最初は Excel でいけると思ってたけど…

西村さん

Excel 使ってたけど、pandas に乗り換えたという話。

四人の頭の位置座標データを認識、線を引くのだけど、リアルタイムだと CSV でもしんどい。
データの種類が増えたとき、二次元表では、横に長く、Excelシートだとシートが増えすぎる。
1シートでマージするとなると、ピボットテーブルするとめんどくせえ(汗

なので pandas 使った。
データの取り回しが楽。そのままバイナリで共有もできるwww

dataFrame.assign でカラムが増やせて、concat で結合していける。
setIndex, sortIndex ソートもできる。いいよね。

WinDbg Preview

大橋さん

WinDbg は新しい Windows 向けデバッガ。
ビジュアライズが非常に強くなった他、速度が早くなった。
Windows StoreからDLできる。

Win10 で搭載された機能でスクリプティングというものがある。

Scripting は、厳密には Store アプリではない。
WindowsApps 配下に exe が置いてある。
コイツの引数でアプリケーションを起動すると、しれっとデバッグコンソールがいじれる。

-c コマンドを突っ込むと、スクリプトとして実行できるようになる。

こいつは、デバッグ実行のインスペクションとインジェクションをスクリプトとして記述しておける。
定型の動作検証が非常にやりやすくなる。

Debug Extension : WinDbg の拡張なのだけど、これまで C/C++ だったものが JavaScript で書ける様になった。
これにより、解析/デバッグスクリプトが、素早く作成/デバッグできる様になった。

現在フィードバックを集めている最中で、日本語でもいいので言えば追加されるかも?

所感

これぞ濃い話!
スクリプト化の何がいいかというと、デバッグに「このスクリプトやってみてー」とか指示できたり、よく詰まる所を自動検証/デバッグできる。

解析がめちゃめちゃ早くなる可能性がある。
ただし、アンドキュメント。

git初心者から...

須藤さん

git は非常に強力な一方で、使い方を決めていかないと、非常に混乱を招く。
このセッションでは、Subversion と比較しながらどういったところが違うのか?どういうメリットがそこにあるのか?などを話されてました。

また、チーム運用の為の、Git-Flow モデル、Hit-HubFlow モデルの運用方法説明も入ってました。

すみません、このブログ書いてる私が構成管理をやる派なので、途中からメモが途切れている…

単なるメモ

qiita.com

長い間 iOS 開発から離れてたけどなかなかええもんできてる。
というか浦島太郎状態。

でもなぁ Ruby Gems なんだよな(汗
OSS あるあるだけど、Gem はバージョン依存地獄をよく味わう印象が…

scikit-lern 練習

ついでに

今回の日記は実は全部 jupitor notebook からのコピペなんだ…すまない。
やばすぎるわこれ(汗

まずは使うライブラリを取り込んでみる

  • numpy : 行列演算ライブラリ
  • scipy : 科学技術計算ライブラリ
  • matplotlib : グラフ作画ライブラリ
  • pandas : データ加工とか表示とか…なんか使った印象でこれ matplot 要るのか?(汗
  • IPython : python シェルの強化拡張ライブラリ
  • mglearn : https://github.com/amueller/mglearn オライリー先生の書籍専属ライブラリ。ヘルパー扱い。
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
from scipy import sparse
import pandas as pd
from IPython import display
import mglearn

疎行列を作る

numpy で単位行列を作ってみる

eye = np.eye(4)
print(f"Numpy array\n{eye}")
Numpy array
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

Numpy 圧縮行格納形式(CSR)変換

numpy 行列は、sciPy 行列に変換可能

sparse_matrix = sparse.csr_matrix(eye)

print(f"CSR matrix\n {sparse_matrix}")
CSR matrix
   (0, 0)   1.0
  (1, 1)    1.0
  (2, 2)    1.0
  (3, 3)    1.0

行リスト(COO)変換

data = np.ones(4)
row_indicates = np.arange(4)
col_indicates = np.arange(4)
print(col_indicates)
[0 1 2 3]
eye_coo = sparse.coo_matrix((data, (row_indicates, col_indicates)))
print(f"COO \n {eye_coo}")
COO 
   (0, 0)   1.0
  (1, 1)    1.0
  (2, 2)    1.0
  (3, 3)    1.0

Matplot で適当なグラフ作画

x = np.linspace(-10, 10, 100)
y = np.sin(x)

plt.plot(x, y, marker="x")

f:id:white-azalea:20190304231927p:plain

Pandas を使ってみる

data = {
    'Name': ['John', 'Anna', 'Peter', 'Linda'],
    'Location': ['NY', 'Paris', 'Berlin', 'London'],
    'Age': [24, 13, 53, 33]
}
data_pandas = pd.DataFrame(data)

data_pandas
Name Location Age
0 John NY 24
1 Anna Paris 13
2 Peter Berlin 53
3 Linda London 33
data_pandas[data_pandas.Age > 30]
Name Location Age
2 Peter Berlin 53
3 Linda London 33

Iris データを読み込んでみる

from sklearn.datasets import load_iris
iris_dataset = load_iris()

iris_dataset.keys()
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

詳細を読み取ってみる。

print(iris_dataset['DESCR'])
.. _iris_dataset:

Iris plants dataset
--------------------

**Data Set Characteristics:**

    :Number of Instances: 150 (50 in each of three classes)
    :Number of Attributes: 4 numeric, predictive attributes and the class
    :Attribute Information:
        - sepal length in cm
        - sepal width in cm
        - petal length in cm
        - petal width in cm
        - class:
                - Iris-Setosa
                - Iris-Versicolour
                - Iris-Virginica

    :Summary Statistics:

    ============== ==== ==== ======= ===== ====================
                    Min  Max   Mean    SD   Class Correlation
    ============== ==== ==== ======= ===== ====================
    sepal length:   4.3  7.9   5.84   0.83    0.7826
    sepal width:    2.0  4.4   3.05   0.43   -0.4194
    petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)
    petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)
    ============== ==== ==== ======= ===== ====================

    :Missing Attribute Values: None
    :Class Distribution: 33.3% for each of 3 classes.
    :Creator: R.A. Fisher
    :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
    :Date: July, 1988

The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken
from Fisher's paper. Note that it's the same as in R, but not as in the UCI
Machine Learning Repository, which has two wrong data points.

This is perhaps the best known database to be found in the
pattern recognition literature.  Fisher's paper is a classic in the field and
is referenced frequently to this day.  (See Duda & Hart, for example.)  The
data set contains 3 classes of 50 instances each, where each class refers to a
type of iris plant.  One class is linearly separable from the other 2; the
latter are NOT linearly separable from each other.

.. topic:: References

   - Fisher, R.A. "The use of multiple measurements in taxonomic problems"
     Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions to
     Mathematical Statistics" (John Wiley, NY, 1950).
   - Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.
     (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.
   - Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New System
     Structure and Classification Rule for Recognition in Partially Exposed
     Environments".  IEEE Transactions on Pattern Analysis and Machine
     Intelligence, Vol. PAMI-2, No. 1, 67-71.
   - Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule".  IEEE Transactions
     on Information Theory, May 1972, 431-433.
   - See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al"s AUTOCLASS II
     conceptual clustering system finds 3 classes in the data.
   - Many, many more ...
print(iris_dataset['target_names'])
['setosa' 'versicolor' 'virginica']
print(iris_dataset['feature_names'])
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
print(iris_dataset['data'][:5])
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]
print(type(iris_dataset['target']))
<class 'numpy.ndarray'>
print(iris_dataset['target'].shape)
(150,)
iris_dataset['target']
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

データを学習用と検証用に分離

train_test_split を利用すると、デフォルトで 75% を学習用、25% をテスト用に分離してくれる。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)

最初にデータを観察

pd.DataFrame から pd.scatter_matrix をしてやると、任意の二組の相関図を出してくれる。
やっべなんだこれ…データ解析捗りすぎんだろ…(汗

iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
grr = pd.scatter_matrix(iris_dataframe, c=y_train, figsize=(15,15), marker='o', hist_kwds={'bins': 20}, s=60, alpha=0.8, cmap=mglearn.cm3)

f:id:white-azalea:20190304232009p:plain

The機械学習

K-最近傍法で処理してみる…むかしやったなーこんなやつ。

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=1, p=2,
           weights='uniform')

…めっちゃ簡単になっとる…機械学習本見て根性で実装してたのになぁ(汗
まずは適当なデータで特徴量を表示

X_new = np.array([[5, 2.9, 1, 0.2]])
X_new.shape
(1, 4)
prediction = knn.predict(X_new)
prediction
array([0])
print(iris_dataset['target_names'][prediction])
['setosa']

なんかそれっぽい。

早速確認用データを食わせる。

y_pred = knn.predict(X_test)
y_pred
array([2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 1, 0, 0, 2, 1,
       0, 0, 2, 0, 0, 1, 1, 0, 2, 1, 0, 2, 2, 1, 0, 2])

なんか出てきた。 結果を比較

np.mean(y_pred == y_test)
0.9736842105263158

は…(゚o゚;;
これだけでこんな行くんかい…