さわらブログ

さわら(@xhiroga)の技術ブログ

弊社推しのPython for Data Scienceオンラインコースやってみた

勤務先が推してるオンラインコースがあるらしいことを最近知り、やってみたら結構学びがあった!

きっかけ

最近IBMでは社員にオンラインコースの受講を勧めていて、 クリアするとバッジがもらえる。 「そんなん効果あるのか?」って懐疑派だったんだけど、同期がすごい推してくるのでやったら良かった!

やったこと

最近Kaggleに出るのを目標にしているので、Pythonの基礎をやってみた!
Python 101 for Data Science

中身はCourseraとかUdacityとかとそんなに変わらない。ちゃんとテストもあるよ!
教師が出てきて教えるんじゃないのがちょっと残念かな。(CourseraとかUdacityとかはその辺でやる気を引き出すのがうまい)

学んだこと

特にデータ構造体について発見があった!
行き当たりばったりで勉強してきたのでset型を知らなかった。

>>> s = {1,2,3,}
>>>s
{1,2,3}
>>> e = set([1,2,4,5,5]) # List, Tuple, Setはそれぞれコンストラクタがあり、お互いを引数に取れる。 
>>> e
{1,2,4,5} #重複を許さない

スライスもようやく理解した!

>>> li = [2,4,6,0,1,]
>>> li[0:4:2] # 0番目の要素から4番目の要素に触れるまでを2づつインクリメントして取得
[2,6]
>> li[-5:-1:2] #上記と同じ
[2,6] 

講義とは関係ないけど、help() コマンドが便利だと思った!

>>> a = 1
>>> help(a)
class int(object)
 |  int(x=0) -> integer
 |  int(x, base=10) -> integer
...(以下続く)

>>> b = [1,2,3]
>>> help(b.append) # ここで()をつけない!
Help on built-in function append:

append(...) method of builtins.list instance
    L.append(object) -> None -- append object to end
(END)

世界中のUFO目撃情報をk-mean法でクラスタリング

先に言うとデータの外れ値が邪魔で思ったような結果にはなりませんでした。

やりたかったこと

KaggleにUFOの目撃情報の自由に使えるデータセットがある!

やったこと

使って何かしたかったので、機械学習で教師なし学習をさせてみた。
k-mean法というクラスタリングの手法を使った。

やり方

pandasでKaggle上のcsvを読み込んで、pandasで整形して、sklearnで学習させた。
データは80000件ほどあったのに、読み込みは一瞬で終わった!

結果

gist.github.com

f:id:hiroga_cc:20171209223720p:plain
UFO目撃情報(緯度、経度、継続目撃時間)

グラフ中の緑色の点はゴミデータ。参ったな...。

分かったこと

  • データの正規化が大事。(ここでの正規化はゴミデータを除外する、の意)
    例えば今回は、80000件のデータの中に3件数字列に文字が入っているものがあり、それが邪魔になった。
  • まずはプロットしないと始まらない。
  • k-meanは外れ値にすこぶる弱い。標準偏差とか使って外れ値をどかす方法があるっぽい。

CourseraのMachine LearningをPythonでやり直す #1

そろそろ機械学習に再チャレンジする時が来た!と思い立ち、CourseraのMachine Learningをやり直しています。

背景

実は2016年前半にCourseraのMachine Learningを完走した。当時は業務でプログラミングをした経験がなかったのを考えると我ながらスゴイ。
それ以降何もしてなかったんだけど、Webアプリとか作れるようになって来たし、いよいよ機械学習を組み込みたい!

CourseraではOctaveというMatlab互換のプログラミング言語でやったので、同じ教材を今度はPythonでやる。
目標は...
1. MNIST(手書き数字の画像認識)くらいは手組みで作れるようになる。
2. ニューラルネットワークが出てくるようになったらライブラリを使いこなして頑張る。
3. 上記を踏まえ、Kaggleでコンテスト参加できるようになる!

初回の感想

全8回のうち1回目をやり直した!初回は線形回帰(ある変数とそれによって変化する変数の関係をy=ax+bに落とし込むこと)
楽しいけど本筋関係ないところでつまづきがちなのがいただけない。でもPythonの方がOctaveよりドキュメントは多いね〜!

成果物!

f:id:hiroga_cc:20171209080609p:plain
最小二乗法!

やった内容はどんどん追記していくよ。
github.com

つまづきどころ

  • numpy.ndarrayの.transpose() が、一行の配列には対応していないこと!reshape()っての代わりに使うといいらしい。
  • グラフを出力するときは、一次関数の傾きと切片だけでは出力してくれない(matplotlibの話)。代わりに、x,yの組み合わせの配列を作って渡す。
  • numpy.sum()を多次元配列に対して使うと、全要素を合計してしまう!行毎の合計ならsum(axis=0)とか、指定する必要あり。

楽しくやってます( ´ ▽ ` )ノ

Eclipseは使わない!Mavenでサンドボックス作るよー!

これがめちゃめちゃ躓いたので備忘録。

きっかけ

Javaでライブラリ調査しようと思ったら、クラスパスの指定がめんどくさいってことに気が付いた。
サンドボックスのプロジェクトを作るのがいいらしいのでやってみた。

流れはこんな感じ
1. サンドボックスプロジェクトの構築
2. ライブラリを取得
3. プラグイン "exec:java" で実行

ちなみにMavenを使わないと...

$ javac -classpath commons-csv-1.5/commons-csv-1.5.jar Csv.java
  • 実行!コンパイル時とクラスパスの指定方法が違うの毎回戸惑うんだけど!
java -classpath .:commons-csv-1.5/commons-csv-1.5.jar Csv

Mavenを使うと...

1. サンドボックスプロジェクトの構築

mvn archetype:generate

2. 依存ライブラリの記述

Maven のセントラルリポジトリからpom.xmlにコピペする記述を持ってきて...コピペ! The Central Repository Search Engine

3. プラグイン "exec:java" で実行

そもそもMaven単体だとプログラムの実行はできないらしい。テストはできるけど... pom.xmlプラグインを追加します。

  <build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <configuration>
                <mainClass>Csv</mainClass>
            </configuration>
        </plugin>
    </plugins>
  </build>

にmain持ちの実行したいプログラムを記述します。そしたら

mvn exec:java

雑感

なんか細かい計算はPythonとかの方が楽だな〜と思いつつ、Java9の対話実行はとっとと導入しようと思った。

Javaでフォーク/ジョインやったらReal時間 < CPU時間になった

現場でマルチスレッド処理を手がけており、それ関係のFWを触っていたら面白いことを知ったのでメモ。

Javaのマルチスレッド FWとは

Javaでは昔からマルチスレッドでプログラミングするためのクラスが用意されていたが、Java5とJava7から新しいFWが出てきた。

f:id:hiroga_cc:20171129221704j:plain

整理すると...
Java5で実装
- タスクの非同期処理周りを隠蔽するExecutorService
- ↑のインターフェースの実装クラスを生成するExecutorsクラスとnew***(); メソッド
Java7で実装
- ExecutorServiceインターフェースを実装したForkJoinPoolなどのクラス。newで生成可能。

トランザクションを非同期で発行するだけならJava5までのやり方のほうが(オーバーヘッドがなくて)よく、 再帰的な(=スレッドを無数に生成する)処理ならフォーク/ジョインを使うのがよいらしい。

参考:
multithreading - Java's Fork/Join vs ExecutorService - when to use which? - Stack Overflow

今回はJava7で追加された前者でいきます。

パフォーマンス測定手法

マルチスレッドのプログラムのCPU時間の測り方を見るのが目的!
フィボナッチ数列をシングルスレッド/マルチスレッドでそれぞれ計算するプログラムを作りました。
これらをターミナルから実行し、timeコマンドで測定します。
シングルスレッドとマルチスレッドの性能比較ではないので悪しからず

作ったプログラム

シングルスレッド版
gist.github.com

マルチスレッド版
gist.github.com

計測結果

$ time java Fib
1134903170(←注:計算結果)

real    0m7.859s
user    0m7.429s
sys 0m0.167s

$ time java Fib7
1134903170

real    0m30.679s
user    1m40.597s
sys 0m0.863s

シングルスレッドではreal ≒ user + sys なのに対し、マルチスレッドでは real > user + sys である。これはどういうことか。

なぜReal時間 < CPU時間なのか

要するに各スレッドで使用したCPU時間の合計が表示されるらしい。

参考にさせていただいた記事。
real time/user CPU time/system CPU timeの違いをメモ | Siguniang's Blog

参考資料

Oracleさんのドキュメント

Executors (Java Platform SE 7)

ExecutorService (Java Platform SE 7)

ForkJoinPool (Java Platform SE 8)

実装の参考にさせていただいたブログ記事

ExecutorServiceを使って、Javaでマルチスレッド処理 - Qiita

Java で簡単マルチスレッドプログラミング - にょきにょきブログ

Fork/Join Frameworkでフィボナッチ数を求める - Qiita

JJUG CCC 2017 Fall初参加&ボランティアレポート

JJUG CCC(ジェイジャグ シーシーシー=日本 JavaUserGroup クロスコミュニティカンファレンス)に参加してJavaの見方が変わった( ´ ▽ ` )ノ
実はJavaってダサいイメージがあったけど、JJUGから一夜明けて「Javaもすごいんだな〜」と思ってます。

きっかけ

職場でモックプログラムの新規作成を担当したのがきっかけ。 現在SIerで入社3年目、開発にアサインされたのが2年目の半ばなのでエンジニア歴は正味1年ちょいくらい。
しかも去年までは既存プログラムの改修をやっていて、そんなにプログラミングの能力が必要なかった。
(既存の改修なので、分からない事があっても近くのコードに合わせて書けば何とかなる)

ところがいざ新規作成となって、3年目なのに分からなくなっていて恥ずかしい事が大量に出てきた。
Javaのmainクラスの作り方、コマンドラインからコンパイルして実行する方法、JDBCドライバの使い方...etc。

そういう状況になって、これまでJavaの勉強をダサいと敬遠していた*1 のが恥ずかしくなり、「いっちょ勉強会とか出てみるか」と思ったのがきっかけ。

参加するまで

ぶっちゃけ行っても話の内容が分かんなくて(´・ω・`)になりそうだったので、ボランティア枠は速攻申し込んだ。
JJUG CCCのメンバー登録したら、たまたま数日後にJJUG CCC 2017 Fallのボランティアの通知が来た。
イベントスタッフとか好きなのもあって速攻登録。その後すぐ満員になってしまった(ただし繰り上がりはあったぽい)

ボランティアスタッフの説明会とかその後の飲み会とか行ったりした。
(これは正解だった。初めてのカンファレンスで、顔を知っている人がいるのは嬉しい!)

公式サイトのタイムスケジュールも見て、参加したいセッションがないかチェックした。
正直半分くらいしかタイトルの意味が分からなかったけど、 「あっ、Spring Bootって先輩が言ってた」とか「KotlinってAndroidの開発言語になったやつだっけ?サーバサイドで使えるの?」とかで申し込んだ。

参加してみて

JavaとかJVM言語を使っているかっこいい大人がたくさんいてイメージが変わった!
ほんと恥ずかしいんだけどJavaってSIの現場で使っているイメージしかなくて、かつSIの現場って「プログラミング大好き!」って人ばっかりでもないからイメージ悪かった。

でも登壇者さんの所属とか協賛企業とか見てみて、「えっ!こんなベンチャー企業が?」みたいにびっくりした。
例えばSmartNewsさんやビズリーチさん、サイバーエージェントさんなど。

ちなみにその感想をJJUGの偉い人に(ボランティアスタッフの打ち上げで)正直に言ったら、優しく笑いながら「やっぱり?」って言われた。

ボランティアスタッフはやっぱり正解だった!
ボランティアとはいえ午前の担当だったから午後はほぼ自由にセッション参加できたし、一緒のシフトの人と仲良くなれた!(セッションも一緒に見に行った)
懇親会とかも、知らない人に話しかけるのも楽しかったけど、顔を知ってる人がいた方が安心するよね〜😊

あとはいつものようにTwitter実況してた。#jjug_ccc でたくさん出てくるよ。

f:id:hiroga_cc:20171119164438j:plain
お絵かきとかもしてた

セッションから

サーバサイドKotlin はKotlinの話だった!
JVM言語ではScalaとKotlinの二つがよく話題に上っていたけど、KotinはScalaほど尖っておらず、でもJavaよりイケてるらしい。
家で実際にやってみたら確かに文法は楽チンだった。

ゴールドマン・サックスにおけるCamundaを用いたビジネスプロセスの可視化とワークフローの自動化 で何が驚いたって、副社長さんが出てきたところ!
GSの技術チームは何と全社員の25%以上らしい。力を入れてるのねえ。
あとはCamundaというワークフローシステムをGUIベースのダッシュボードから自動生成するソフトウェアの紹介。
ワークフローをバージョン管理ツールで管理できるのは綺麗でいいな〜。もっとも、普通の日本企業がそういうの導入するのって想像が難しいけど。

オレオレJVM言語を作ってみる(四則演算するだけだけど)では言語の仕組みがちょいわかった。

Spring BootとKafkaでCQRSなアプリを動かしてみる は登壇者さんの話し方のせいかすごいホッコリした。
その登壇者さんがこんなことを言ってました。

その通りだな〜。心がけよう。

まとめ

Javaでもいろんな新しい動きがあり、世の中でこれからも使われていく言語なんだな〜ということが分かって良かった。
現場で普通にシステム開発しているだけだと視点が下がってしまうと思った。
次回の2018 Springも楽しみ!

*1 「家でJavaとか書きませんよ〜笑」 とか言ってた。代わりにアプリ作ったりハッカソン出たりしてた(それでプログラミングが身についたかは怪しい)

First Aidがクリックできない場合(Macbook起動時に「?」マークの対応)

Macbookを起動したら「?」マークのついたフォルダのイラストが点滅しており、起動できなかった時の対策です。

f:id:hiroga_cc:20171119093655j:plain

基本的にはAppleのウェブサイトの手順通りに対応します。 support.apple.com

First Aidがクリックできない

ディスクユーティリティからFIrst Aidがクリックできない場合、「View > Show All Divices」(日本語版だとなんて書いてあるかは知りません)を選択。
そうするとディスクユーティリティ左側の内臓デバイスに「Macintosh HD」がツリー上に表示されます。
クリックすると暗号化されたディスクのロックを解除するように指示されるので、その通り操作するとFirst Aidがクリックできるようになります。