プログラミングと絵と音楽

コンピューター科学を専攻し、絵と音楽を趣味とするエンジニアのブログです。

統計学とプログラミング:1次元データの可視化

ヒストグラムを作成します。

環境

ヒストグラムの作成

ヒストグラム(棒グラフ)を作成します。

まず、必要なライブラリを読み込みます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

scikit learn にサンプルデータがあるので、それを使います。今回はwineのデータを読み込みます。

from sklearn.datasets import load_wine
wine = load_wine()

pandasのDataFrameに変換します。

wine_df = pd.DataFrame(wine.data, columns=wine.feature_names)

中味を見てみます。

wine_df.head()

alcoholというカラムがアルコール度数のことでしょう。これをヒストグラムで表示します。

rwidthを1から減らして、棒グラフに隙間ができるようにして表示しました。

plt.hist(wine_df["alcohol"], rwidth=0.9)

f:id:tfull:20190424122122p:plain
wine - alcohol

Ubuntuで行う自己流の環境設定集

Virtual Box や、最近はやっていないですがOSをブートするときにUbuntuを選択することが多く、いくつも設定してきたため、いつもやる操作、近頃の 18.04 LTS の例で挙げます。

適宜、更新する可能性があります。

shell$ # 適当なディレクトリで実行
shell ~/dir$ # ~/dir 下で実行

名前変更

Ubuntuを日本語でインストールすると、ディレクトリが日本語になっているため、ターミナルで操作するときに煩わしい。これを回避するために、ディレクトリ名を英語にします。

shell$ LANG=C xdg-user-dirs-gtk-update

確認画面が出てくるので良しなに進める。

ブラウザ

Firefox が最初から使えますが、 Chrome をよく使っているので、入れます。

  1. Google Chrome で検索し、ダウンロード。
  2. Ubuntu ソフトウェアが表示されるので、インストールボタンを押下。

サーバー化

sshでアクセスできるようにする。

shell$ sudo apt install openssh-server

sshの設定

GitHubレンタルサーバーなどへのアクセスに使用。

shell ~$ mkdir .ssh
shell ~$ chmod 700 .ssh

id_rsassh-keygen か既にあるものを用意。

shell ~/.ssh$ chmod 600 id_rsa
shell ~/.ssh$ chmod 600 authorized_keys # あれば

各種ソフトウェア

apt update

新しいパッケージを入れるため。aptをアップデート。

shell$ sudo apt update

その他必要なソフトウェア

shell$ sudo apt install gcc make zlib1g-dev libssl-dev libffi-dev libbz2-dev libreadline-dev libsqlite3-dev

Git

shell$ sudo apt install git

Pythonとpyenv

まずpyenvをインストール。以下リンクから手順に従う。
GitHub - pyenv/pyenv: Simple Python version management

新しいバージョンのpythonをpyenvを使って入れる。

shell$ pyenv install 3.7.3
shell$ pyenv global 3.7.3

エンジニアとして働きはじめて3年経った

次のような投稿をしておきながら、エンジニアとしての私について何も発信していなかったなと思いつつ、最近になって発信欲がでているので。

tfull.hatenablog.jp

社会に向いていない私がIT企業でエンジニアとして働き始めて3年が経過したので、振り返りを記します。(退職したとかではない。)

直接的に名前などを出すことはせず、少し抽象的な表現になるかもしれませんが、ご了承ください。

就職活動について

かなり苦戦しました。が、20社程度受けて2社内定を貰いました。面談などをする側になって思ったことですが、私自身の就活のやり方はあまり良くなかったと思っています。プログラミングに関して、色んな分野に手を出していたので、幅広くできるということをアピールしていましたが、何をやりたいかが明確でなかったことが致命的だったと思います。就活をする際には、自分が何をやりたいかをしっかり伝えるのが大事だったなと思います。(個人の感想です。)

外資系はリストラとかが怖そうなイメージだったので、受けた多くは日本の企業です。日本の企業ではコーディング面接のような、「実力見せてみろ」的なイベントは全然行われませんでした。今はどうかあまりわかりませんが、少しずつ変わっているかもしれません。基本的に会社独自の履歴書のような書類に色々書いた上で、社員の方と話をする形式でした。あまり話をするのが上手でないので、伝えたいことが伝わりきらず、評価も良くなかったのではないかと思います。
加えて、大学生時代が(話すのも嫌になるほど不幸な)暗黒の6年間だったので、陰気臭い空気が漂っていたのかもしれません。

そういうわけで貰ったうちの1社の内定を受諾する運びになりました。

業務内容

1年目

大学院を卒業して、2016年4月からIT企業でエンジニアとして働き始めました。ゲーム関連をメインで扱っているところです。

最初の1ヶ月はビジネス的な研修、次の1ヶ月でエンジニアとしてのプログラミング研修をやっていました。

研修が終わってから少しの間、各ゲームPJ(プロジェクト)について業務改善などを行っていました。例えば、人数がやたら多いPJで、データ管理のブラウザツールを作って工数を削減するといったような感じです。業務は順調に行っていたと思いますが、ここで目の病気になってしまい、有給もないまま1ヶ月休むことになりました。

退院してからデータ分析の部署に配属されました。ここでやっていたのは、各ゲームにおいて、ユーザーのログイン状況や課金に関するデータをSQLで集計し、PJの健康状態を把握するといった業務です。途中で、売上を予測するプログラムを書くことにもなり、慣れないまま機械学習プログラムを組んでいた記憶があります。

2年目

新設されたAI部署で業務をすることになりました。主にやっていたのは様々な業務の自動化です。これに続けて、AIを導入するための基盤を作成するといったことも行っていました。自動化についてですが、あまりうまくはいかなかったと感じています。理由が二つあって、一つは、自分が求めているものと、今までゲームPJがやってきた考え方などが合わない部分がいくつかあったこと。もう一つは、PJについて詳細までしっかりと理解できていなかったこと。結果として、想定していたものをうまく構築できなかったと思っています。職業としてのエンジニアは、ただコードを書くだけではなく、しっかりと話し合って着地点を見つけたり、対象をよく知ることがとても大切だと痛感しました。

冬頃はゲームをプレイするAIを作っていました。ゲームのシミュレータ実装からKerasによる機械学習まで、このあたりは本格的なAI実装・実験をやっていたと思います。こちらはそれなりに学習はできたものの、見込める利益などと想定して、技術検証に落ち着きました。機械学習やAIについて実践してかなり学べたと思います。

3年目

春夏は、顧客の流動を予測するAIを作っており、1PJに特化しない汎用的なAIでどれだけの精度で予測できるのかを検証していました。データ分析的なことは相談しながら、あとはエンジニア力でどうにかしました。秋は、2年目でやった自動化の延長みたいなことをやっていて、独自システムから各サービスとの連携、そしてそれらのプロセス管理などを実装しました。冬以降は、AI開発のための発展的なデータ集計基盤を構築しています。

全体的に

見ての通り、フロントエンド、サーバーサイド、インフラからデータ集計にAIまで色々なことを任されていて、業務内容的には充実しています。大学や独学で幅広く学んできたことが生きているように思えます。強いて言えば、知識を身につけて様々な問題に対処するという内容が多く、数学などの能力はあまり求められたことがないので、そのあたりは挑戦したいという思いがあります。

その他

何かについて自分より詳しい人がいる、一緒に取り組める人がいるなど、周りに相談できる人がいるのはとても重要なことだと思いました。その点はとても恵まれていたと思います。


定量的な評価を受けるとやる気が出ます。貴方のおかげで月A円のコスト圧縮ができたよ、みたいなやつです。きちんと出してくださったのでそこは良かったです。

待遇

最初は年364万円でした。ネットでいくらか調べたところ、同年齢の平均年収とほぼ同じで、学部と修士ともにコンピュータについて専攻し、東大の大学院を出たにしては少なめの額だったと思います。大学の学科、専攻の同期は、年600万円~800万円あたりがボリュームゾーンと推測しています。年900万円以上の人もいました。

しかし、病気で休んだとき以外は半年ごとに毎回昇給し、2年目の初めには442万円、3年目の初めには513万円、3年目の終わりには578万円と増えていきました。感謝。

退職金とかは積み上がっていないです。大企業だと結構大きい金額が貰えたりするみたいなので、羨ましいと思うことはあります。

身についたこと

様々なライブラリやフレームワークについて学べました。例えばPHPフレームワークであるsmartyや、Pythonのデータを扱うライブラリであるpandas、さらにRuby on Railsなどが挙げられます。

インフラ環境も色々学べました。例えばdockerはよく使用しています。AWSGCPも、個人では全然使ったことが無かったので、良い経験になっています。

整備されていないドキュメントを読んだり、OSSを読んで動作を理解する習慣も身についていっています。

あとは単純に昔より口数が増え、それに乗じて喋る能力が向上したようにも思えます。

対人関係について

働く理由として、私は大事なことが2つだと考えていて、一つは当然ですが生活するお金、そしてもう一つは、人間関係を構築していくことだと考えています。

エンジニアの新卒同期(2人)とはそれなりに仲がよく、また年齢が近いエンジニアの先輩とも仲良くできています。先輩や同期と一緒に同期の家に遊びに行って、鍋を囲ったり、スニッパーズというゲームで責任を擦り付け合ったり、スマブラをやったり、マリオテニスで11連敗するなどして楽しんでいます。

また、会社には、エンジニアが集まって、雑談(銀座で寿司食いたいとか)やら最近のPJの動向などを話したり、ライブコーディングや勉強会的なことなどをする会(毎週1時間程度)があるのですが、そこで割と仲良く色々なエンジニアの方と話しています。

就活時にはそこまで気が回りませんでしたが、結果的に、対人関係の視点ではかなり良い環境ではないかと思います。

家での活動

毎日定時で退勤しています。帰宅後はギターの練習をしたり、音楽を作ったり、絵を描いたり。
休日は音楽教室でギターのレッスンを受ける日もあります。そのうち、音楽で何かしらの活動ができればいいなと漠然と考えています。

YouTubeチャンネル↓

www.youtube.com

プログラミングの勉強は、学生時代に比べて量がガクッと落ち、少々焦ってはいますが、業務である程度カバーできていると思いたい。

学生時代と変わったこと

金銭的に余裕が出てくることで、精神的にも余裕が出てきました。学生の頃は精神衛生があまり良いものではありませんでしたが、あれは金銭的な不自由に依るところも大きかったと感じています。

任天堂Switchの欲しいソフトを全部買ったり、Louis Vuitton の財布を買ったり、パソコンや液晶タブレットを買ったり、結構自由ができています。今は実家住まいなので、これに加えて貯金までできています。

tfull.hatenablog.jp

あとは朝起きるのが辛いですね。8時代に起きるのも辛いですが、なんとかやっています。

病気について

2016年6月に右眼が網膜剥離を起こしました。その2年前である2014年に、同じく右眼にて白内障により手術を行っていたので、追い打ちをかけるような形になり、相当ショックでした。更に、成功率が95%程度と言われているらしい手術が失敗して、2回目の手術でなんとか回復しました。しかし、右眼の視力が急激に変化したことで、左眼に負荷がかかり、2017年8月には左眼に白内障の兆候が見られるようになりました。今のところは目薬で食い止めていますが、そのうち手術することになりそうです。

また、自律神経を少し乱していて、体調に波があるのですが、悪くなってくるとかなり体がしんどい状態になります。

目の病気は、日々パソコンに向かうエンジニアにとってクリティカルですし、(今は)自律神経のことで体調も悪くなりやすいということから、他の人以上に最適な働き方を探す努力が必要な状態になっていると考えています。

今後

業務自体は問題ないのですが、会社員は向いていないとつくづく思います。人混みが嫌いで、例えば電車でも体力を消耗しますし、オフィスでの雑音も気になったりします。あとは単純に朝が弱い。

加えて、時間が制限されるのにストレスを感じているのもあると思っています。学生時代は大量の課題が出されて大変でしたが、授業の数は少なめで、時間の使い方に自由がありました。気がつけばそれを懐かしんでいることがあります。時間が決められていると、やる気が出ないときに無為に時間が過ぎていってしまうので、それはストレスになります。朝やる気が出ない時は夜中に働ければ良いのに、と思います。

以上のことから、フレックスタイム、リモートワーク、裁量労働などには魅力を感じています。勿論、楽ができるというわけではないと思いますが、病気の状態や自分の性格を考慮したときに、これらが合っているかもしれません。リモートワークであれば住む場所をあまり限定されないというのも、今後実家を出ていくときには重要だと思います。


将来の話ですが、正直なところ、定年になるまで会社員をやりたくはないです。十分なお金を稼いで早期に辞めるか、何か別の事で収入が得たりなどして、もっと自由に生きたいと漠然と考えています。


とりあえずはもう少しエンジニアを頑張るつもりです。

以上。

AppleのMagic Keyboard, Magic Mouse 2, Magic Trackpad(黒)の使い心地

f:id:tfull:20190326003103j:plain
Macの入力デバイス

主に iMac で使っていたワイヤレスキーボードを交換したあとの記録です。

今まで、テンキーなしのワイヤレスキーボード、マウス、トラックパッドについて、いずれも電池式のものを使っていました。いくつかの欠点のため、数ヶ月前に交換して使っていましたが、結構気に入っています。

前デバイスの欠点

キーボード (Wireless Keyboard)

  • 表面がゴワゴワしている。

マウス (Magic Mouse)

  • 裏側の電池部分のカバーが取れやすい。

トラックパッド (Magic Trackpad)

  • 特になし。

これに加えて、電池式なので、電池がないときに切れると困る、残量が少ないときにたまに切断するという短所があります。

購入

いずれも黒です。キーボードとトラックパッドが15000円ほど、マウスが10000円ほどでした。黒は2000円ほど高かったので悩みましたが、見た目が気に入ってこちらにしました。

不要なものを売却

  • Wireless Keyboard 1400円 * 2
  • Magic Mouse 1000円
  • Magic Trackpad 1400円

合計5200円。ビックカメラで買い取ってもらいました。

購入品の長所

Magic Keyboard

  • 押し心地が丁度よい。

Magic Mouse 2

  • 変化なし。

Magic Trackpad 2

  • クリックが静電式になった。気持ちいい。

購入品の欠点

Magic Keyboard

  • 特になし。

Magic Mouse 2

  • 充電ケーブルを指す部分が裏にあるので、充電中にマウスを使えない。

Magic Trackpad 2

  • 特になし。

その他、全部に共通していますが、充電が結構もち、頻繁に充電する必要がないです。おそらく1ヶ月くらい充電無しで使えてます。電池を管理しないで良いのがとてもよく、夜にコンビニに電池を買いに行かなくて済むようになりました。

気になる点は、充電ケーブルがLightningであるということです。おそらくこれからUSB Type-Cが主流になると読んでいるので、ケーブルが壊れたときにいつまで入手できるのかが問題です。

雑感

色違いというだけで各デバイス2000円も高いのがやはり納得いかないですが、買ってよかったと思います。

ポインティングデバイスMagic Mouse 2 と Magic Trackpad 2 を併用しています。 iMac 27inch で使っていますが、画面移動などのメインではマウスを使っています。MacBook系(ノートPC)ではトラックパッドがとても好きで、マウスは使わないのですが、iMacのようなデスクトップだとマウスが使いやすいです。iMacでは、トラックパッドはスクロールを沢山するような箇所でマウスより使いやすく、重宝しています。正直なところ、どちらかだけでも十分かもしれません。

機械学習用のGPU環境を用意するのが難しい...

良いGPU環境をいろいろ探しています。

動かしたいもの

趣味で書いているリバーシAIプログラムがあります。

github.com

このAIに学習をさせようとしているのですが、これに手こずっています。

まだ最善手を見つけられていませんが、色々調べましたので、それらを列挙していきます。

選択肢

何個か選択肢があります。

GPUを使わない。

GPUを使わずにCPUで全部済ませてしまうという方法もあります。長所は動作環境が限定されず、私が使っているさくらVPSでも実行することができます。

短所は、当然ですが時間がかかりすぎてしまうことです。リバーシのAIを10万回学習させるだけでも、多少複雑なモデルを使えば1日半くらいかかってしまいました。数百万回の学習をさせたい場合は現実的ではありません。

Colaboratory を使う。

別の記事で Colaboratory を挙げました。Jupyter環境が使えます。Googleアカウントさえあれば無料で使えますし、GPUも使用可能ですから、簡単な機械学習にはうってつけだと思います。

しかし、ファイルを分割している場合は読み込みをさせるのが大変です。ドライブのマウントとシンボリックリンクを用いて無理やり複数ファイルを読み込ませました。

また、ランタイムがタイムアウトしたときにおかしな動作になります。学習中にタイムアウト → 勝手に再実行 → ブラウザごとフリーズが何回か起こりました。

クラウドコンピューティングを使う。

AWS の EC2 や GCP の GCE の選択肢も挙がると思います。時間課金なので、少々使う分ならPCを買ったりするよりも安く済む可能性が高いです。また、家に物が増えないのも長所になります。

ただ、短時間で割安なのと同時に、使用時間が長いと大金を請求される可能性もあります。インスタンスを止め忘れたり、不正アクセスされた場合のリスクが大きいです。個人の趣味でやるには敷居が高いかもしれません。

機械学習用PCを買う。

機械学習ができるPCを一度買ってしまえば、あとは電気代しかかかりません。計算資源の利用に制限がなく、自宅サーバーとして勉強用に使用することができます。

しかし、Webで調べたところ、機械学習ができるPCは結構高く、最初から機械学習ができるようにセットアップされた i7 (6core 12 thread), 64GB memory, RTX 2080 graphics でも、50万円以上かかるようです。(私のクレジットカードでは上限超えてしまいます。)自分でOSやドライバを設定すればもう少し安く(25万円程度)になるようですが、ドライバを設定するのは難しいようで、失敗すると画面がつかなくなったりする例もあるらしく、かなりリスクのある買い物になるでしょう。

最後に

未だ選択できていませんが、色々な選択肢はあります。 悩んでる間にもっと良い選択肢が出ることを期待します。

【Colaboratory】Googleアカウント1つでPythonを始める

Googleアカウント1つでPythonの実行環境を用意できる Colaboratory を最近 (2018 ~ 2019) 使っています。

環境構築をする必要がないことに加え、手元のCPU資源を消費せずに使えます。

GPUを使えるようにもなっているので、機械学習のプログラムも動作させることができます。

始め方

まず Google Drive を始めます。Google DriveGoogle 検索するか、Google Chrome のメニュー欄にドライブとあるので起動し、 Google Drive を始めるというボタンがあるので押下すると始まります。

f:id:tfull:20190323154004p:plain
Colaboratoryの起動

ドライブ内で[右クリック] > [その他] > [アプリを追加] で Colaboratory と検索し、入手をクリックすると、[右クリック] > [その他] の欄で Colaboratory が選択できます。

f:id:tfull:20190323160106p:plain
実行例

Python コードを書いて Shift + Enter を押下することで、コードが実行されます。

メモリ約13GBで動作できるので、比較的大きなデータも読み込めます。

Pythonでfalconを用いて簡易APIサーバーを作る。

Python 3.6 です。

falcon を使った簡易APIサーバーです。自然言語処理のブラウザインターフェースを作ろうとして必要になったので、メモとして残します。

構成要素

実装

falcon をインストールします。

pip install falcon

コードは以下。

import falcon
import json
import sys
from wsgiref import simple_server

class Number(object):
    def on_get(self, req, resp):
        result = req.params
        values = [int(v) for v in result["values"].split("_")]
        resp.body = json.dumps({ "answer": sum(values) })

if __name__ == '__main__':
    app = falcon.API()
    app.add_route("/", Number())
    httpd = simple_server.make_server("127.0.0.1", int(sys.argv[1]), app)
    httpd.serve_forever()

req でディクショナリを受け取るので、json文字列を返します。

この例だと足し算を行うプログラムです。

実行

以下でサーバーを起動します。例として port 13337 で起動します。

python server.py 13337

そしてブラウザで

localhost:13337?values=1_2_3_4_5

と入力すると、足し算が行われて、ブラウザに

{ "answer": 15 }

と表示されます。

エラー処理をきちんと追加すれば使用できそうです。