さわらブログ

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

ようやくプロダクションコード書いたエンジニア3年目を振り返っていく🐘

2年目まではなんだったのか...!!!

2016年までのまとめ

文系新卒からのド大手SIerに就職したら、配属は分析ツールの導入案件だった!
人には恵まれたけどプログラミングしたかった新卒1年目~2年目。
残業も多くて勉強時間があんまり取れなかった...。

そして2年目夏、念願叶ってフルスクラッチの開発案件に配属される...しかし大量のExcel設計書と手動UTが待っていたのだ! 3年目はそんな開発案件の単体テストフェーズから始まります。

そして2017年...

プログラミングしてない焦り+キャリアを重ねる同期SE/コンサルへの劣等感に悩まされた1月
何かやらねばと思ってチャットボット作ったりしてみた。が、特に解消はされなかった。
github.com 今思うとこの時期に必要だったのはモノを作ることじゃなくてひたすらプログラミングの練習だった気もするな...。

引越しでドタバタした2月が過ぎ、3月クーリエジャポンハッカソンに参加。結果まさかの優勝。なぜならチーム組んだ坂本さんがアプリ全部作ったから。
ここで思う。アプリもやらねばハッカソンに勝てない...!!!

一旦置いて、4月ポプテピピックの通知bot作ったりしてた。あとSpace Apps Challengeに出てIBM社員なのにIBM賞をもらったりした。
github.com

5月、現場が落ち着いて定時で上がれるようになり、プライベートでReact-Native ※1 に着手する。
※1...JavaScriptiOS/Androidアプリが作成できるフレームワーク。つまり普通のWebページ作れる人ならアプリが作れるようになる。

というのもSPAJAM予選参加することになっちゃったからである。スマホアプリ開発経験者のいないメンバーでよく申し込んだわ...。

これでちょっと自信をつけ、6月にReact-Nativeで自作アプリに挑戦する。7月頃できたのがこれ。 appetize.io シビックテック的なのに憧れて地元感のあるアプリを作ってみた。でも三鷹市に許可取らなきゃな〜とか面倒でリリースはしてないぞ。

8月、Unityで遊びはじめる。 hiroga.hatenablog.com
福島Game Jamとかショッカソンとか参加してみた。ショッカソンでは自分のUnityアプリが足を引っ張ったのが悔やまれる...。

秋ごろから現場での案件が変わり、サンプルのWebアプリをいちから作りはじめる。
ここで簡単なテストコードさえググらなければ書けないことに気がつく...。半年くらいモノつくりに励んできたけど、エンジニアとしての実力っていうか、プログラミングを道具として使うためのスキルが全然伸びてなくて辛さを感じる。

いちからのWebアプリ作成は勉強することがめっちゃあり、9月10月はプライベートで調べて現場で書いての往復だった。そんなわけでブログ記事調べ物が多い。楽しい!

11月にはJJUG CCC ※2 に参加した。これがめっちゃ良かった!それまで現場で使うものだったJavaが好きになった。 ※2 Javaユーザーの勉強会。
今後もずっとJavaを使うかは分からないけど、使っている言語のカンファレンスは絶対参加したいな〜。

そして12月。お勉強的にはPythonで機械学習の復習をしつつ、練習てきなプログラミングをちょくちょくしている。現場でちょっとしたコード書いたりとか、競プロとか。
Python機械学習もいいけど、ちょっとしたコードをささっと書けるようになりたいな〜。

振り返って

現場でプログラミングをするようになったこと、ちょっとしたことでもコード書く癖がつくようになったのが一番嬉しい!
モノつくりも楽しいけど、ググって必死に作るんじゃなくて、普段のちょっとしたコードの延長線上でモノつくりができるようになりたいな〜と思います。
来年はちょっとしたプログラミングでできることを広げつつ、現場ではもっとお客さん目線でシステム作る経験を積みたいな〜と思いました。おしまい。

2017年に買って人生が良くなったものベスト5

一人暮らし→実家暮らしに逆戻りし、プロジェクトも安定で生活にゆとりができた2017年。
とはいえむやみに買い物したわけではなく、最低限買ったものの中でよかったものをランキング。

5位

ボンタンアメ
信者なので職場のお菓子バッグに常に2箱入れてる(片方は予備)
何気なくお菓子をあげる時、微妙な話題作りに役立ったりして良い。

4位

REYLEO バックパック
通勤用リュック。ビジネスすぎないのが良い。

3位

TaoTronics Bluetoothヘッドホン
それまでiPhone標準のイヤホンを使ってたけど、やっぱBluetoothはいい!イヤホンの紐がそこらに引っかからないように気をつけるのがストレスになってたことに気がついた。

2位

エレコム ワイヤレスマウス
夏にUnityで遊び始めて、3D空間を操作するのにマウスなしでやってられなくなった。
いざ使うと普段のウェブサーフィンやらなんやらにも便利で手放せない!

1位

UNIQLO カシミアクルーネックセーター 長袖 紫
www.uniqlo.com ほとんどこれを書きたいがために今回のエントリ書いた。この色で廉価なのが店で見つからなくて買ったけど、カシミアめっちゃいい。
10000円近くしたけど一冬ずっと着てるので元は取ったはず!

おしまい。

Javaのマルチスレッド処理を比較!ExecutorServiceとForkJoinPoolで計測した

今度のJJUG ナイトセミナーで人生初LTするのでその準備をしている〜!
現場でマルチスレッド処理を書いたので、その時のフレームワーク選定の話にしようかと。

概要

Javaでマルチスレッド処理をするためには何通りがやり方があるんだけど、自分の仮説ではこう使い分ける!
- トランザクションとか複数裏で走らせたい → ExecutorServiceにRunnableやCallableインスタンスを渡す。
- 再帰的に処理したい → ForkJoinPoolにRecursiveTaskを渡す。

スタックオーバーフローも見た。
stackoverflow.com

でもこれって本当なの?ということで計測した。そしたら新たな疑問が出てきた(後述)

計測

マルチスレッドが必要なので、AWS上にcloud9でvCPU=4の実行環境を用意。
ローカル機だと他にも起動しているアプリが多すぎて計測に向かないかなーと思ったので...

f:id:hiroga_cc:20171223160048p:plain
cloud9は便利だった!
関係ないけどcloud9のjavaのバージョン7だったんですがそれは

計測する処理は次の二つ!
1. フィボナッチ数列の任意の項を求める!nが2よりも大きかったらn-1とn-2の合計として求めることで、再帰的にする。
2. 任意の文字数のファイルを作ってみる!

結果がこちら。めっちゃ適当だって?すまんね。
f:id:hiroga_cc:20171223161206p:plain

でもこの計測結果も今ひとつ信じられない。なぜなら...
- 今回はSystem.nanoTime()で測ったけど、ファイル作成はなぜか計測後もなかなかJavaプロセスが終わらなかった→ロジック変だった?
- ファイル作成の速度が文字数に全然依存していないようにみえる?

結論

再帰的な処理についてはForkJoinPoolに対してRecursiveTaskでよくて、それ以外の処理はどっちでも変わらない...?
そんなわけあるのかしら。どっちでも変わらないならExecutorServiceをそのまま使った方がいいのかな?

ともあれおしまい。LTが楽しみ!

ビットコインノードをMacbookで立てた

ビットコインについて人に説明する機会ができたので、せっかくなので手元でノードを立ててみた。

インストール

githubビットコインソースコードosx向けのドキュメントがあるので、それに従えばOK!
なのだけど、僕の場合は autogen.sh コマンドで引っかかってしまった。パスを書き換えてpkgコマンドが成功するようにしたら上手くいったよ!

$ git clone https://github.com/bitcoin/bitcoin
$ cd bitcoin

$ ./autogen.sh
$ ./configure
configure: error: PKG_PROG_PKG_CONFIG macro not found. Please install pkg-config and re-run autogen.sh.
# autotoolで参照しているツールのパスが期待と異っている結果のエラーらしい。

$ find /usr -name "pkg.m4"
/usr/local/share/aclocal/pkg.m4

$ ACLOCAL_PATH = /usr/local/share/aclocal/pkg.m4
$ ./autogen.sh
$ ./configure
$ make

このmakeが1時間近くかかった気がする。

動かす

普通に動かすと取引履歴をダウンロードしてめっちゃ重いらしい(100GBくらいあるトランザクションを数時間かけて落とすのだとか)ので
物理的にネットを切断してダウンロードを阻止します笑

$ bitcoind -testnet # このオプションでテスト環境につながる。

いや確かに動くけど...何がしたかったんだっけ...?

参考

Bitcoinプログラミングの入り口 – blockchain

macos - pkg-config: PKG_PROG_PKG_CONFIG: command not found - Stack Overflow

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

復習した内容+それをどうやってハンド&skleanで実装したかのまとめ

f:id:hiroga_cc:20171221231706p:plain
今回はロジスティック回帰

実装したファイル
github.com

参考資料
qiita.com

ロジスティック回帰

目的変数Yを説明変数Xで説明する回帰分析の手法を分類でも使うための手法。
目的変数Yを 0 ≦ Y ≦ 1 の範囲に収めるため、シグモイド関数を用いて計算結果を変換する。

# シグモイド関数
import math
def sigmoid(z):
    return 1/(1+math.e**(-z))

正則化

説明変数をX2, X3...と増やすことで、100%に近い予測ができるがオーバーフィッティングしてしまう。
オーバーフィットとは説明変数が余分な影響力を持ってしまうことだから、θの値が大きくなりすぎないように工夫すればよい。
そのためには、目的関数でコストを算出する際に、θの2乗を足してしまう。

実装

scikit-learnだとものすごくお手軽。
Pythonに興味ある方はGithub見てください。(正則化サボったけど)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model

# import datasets
df = pd.read_csv("ex2data1.txt", sep=",", header=None) # 説明変数が0,1列目、目的変数が2列目にあるcsvファイル
X = df.values[:,:2]
Y = df.values[:,2:]

logreg = linear_model.LogisticRegression(C=1)
logreg.fit(X,Y)
# 本来なら目的関数の定義と最急降下法のための準備が必要
# fitメソッドを呼ぶだけで良い。

# 予測モデルを用いて散布図の背景に色を塗る。
# メッシュを作成して各点ごとに予測を適用すればよい。
x_min, x_max = X[:,0].min(), X[:,0].max()
y_min, y_max = X[:,1].min(), X[:,1].max()
xx, yy = np.meshgrid(np.arange(x_min,x_max,.02), np.arange(y_min, y_max, .02))

Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4,3))
plt.pcolormesh(xx,yy,Z,cmap=plt.cm.Paired) # カラーメッシュ=要するにモザイク画みたいなもの

plt.scatter(X[:,0], X[:,1], c=Y.ravel(), edgecolors='k', cmap=plt.cm.Paired)
plt.show()

今回はおしまい!次回はいよいよ多クラス分類とニューラルネットワーク

Tech Deep Dive#0でデータグリッドについてお勉強してきた #oratdd

Oracleさんが主催のTech Deep Diveに参加した。次回は未定とのことで、まずは第0回らしい。
connpass.com

ざっくり内容

Oracle技術者のいとうちひろさんが主にクラウド上のアプリケーションで低遅延なアーキテクチャについてプレゼンしてくれた。
大変わかりやすく、結論としては「データへのアクセスをいかに高速化するか。アプリ上の制約(データ整合性の担保・行ロックとか)があるならデータグリッドをどうぞ。なければ単にKVSでもOK」って感じだったと思う。
実測値がたくさん入ったプレゼンで、アプリケーションエンジニアの僕でも理解しやすかった!

Twitter実況も賑わっており、いろんな人に質問に答えてもらってありがたかった。 twitter.com

データグリッドとは

インメモリーの分散KVSかつ式を受け取って実行することもできるものを指すよう。

これはOracle Coherenceではないけど、データグリッドの内部のことが書いてある!
要するにJavaのでっかいプロセスがマップを保持しつつラムダ式を受け取るのを待ち構えてると思えばいいのかな。

www.slideshare.net

Oracle Coherence以外にもOSSを含めていろんな選択肢があるみたいで、まとめてくださってるスライドもあった!(上と同じエンジニアの方のスライド)

www.slideshare.net

スライドによるとこの辺が競合製品らしい。
- Apache GEODO(ジオード) - Apache Ignite(イグナイト) - Oracle Coherence(コヒーレンス) - hazelcast(ヘーゼルキャスト) - Infinispan(インフィニスパン)

でもG2 CROWD(ソフトウェア比較サービス)の評価はOracle Coherenceが一番高いね!(というか他のレビュー件数が少ない)
データグリッドのカテゴリがなくて単にKVSで括られているのを見ると、盛んになるのはこれからのジャンルなのかな?

ともあれ勉強になった!ありがとうございました!

FESTA 2017 by Mashup Awards 参加レポート! #MA_2017

12/16(土)にFESTA 2017に参加したよ!今回は設営/Twitterのボランティア🕊 mashupawards.connpass.com

きっかけ

運営のまなみんさん・伴野さんにTwitter実況ボランティア入りませんか?って誘ってもらったのがきっかけ!
それまでFESTAのことは何となくしか知らなかったけど、Twitter実況楽しそう〜と思って参加することに。

イベントの様子

PRO決勝は空飛ぶ箒がめっちゃかっこよかった

一般決勝で一番記憶に残ったのは個人的にはこれ

プレゼンで発電はじめて爆笑した!

プレゼン眉毛描いた人、プロダクトも普通にすごかった

総評

来年はまなみんさんがリーダー予定の一般社団法人がMAの運営主体になるそうです

そして審査員さんのブログ

参加して

機械学習とハードウェアのプロトタイピングが普通になってきてる流れは開発現場にも来ると思った。

大手ベンダーは機械学習をサービスとして提供することに勤しんでるけど、(まさにWatsonとか)
それより先に自社のエンジニアに機械学習ライブラリの使い方と統計の基礎を学び直させた方がいいんじゃないかな。

ハードウェア製作をSIerみたいな業態でやってる会社さんには明るくないけど、大手ベンダーがそういう会社を取得してもおかしくない流れだと思う。
個人的にもなんか挑戦したいな〜。また一人暮らし始める予定だから、おうちハックを皮切りにハードウェア作ってみよう。

Twitter実況では反省することが多い...座ってツイートするより、(それはもう一人の方が自分より上手だったので)
もっといい写真を体を動かして撮りに行かねばならなかった。

あとは仕組み的なところで、公式アカウントが複数人ログインに厳しかったのも辛かったな...。
複数人が公式アカウントにログインするより、MA公式ツイッタラーを定めてその人がツイート→公式垢はメイン実況+公式ツイッタラーをRT,という構成がいいかもしれないと思う。作品実況なんかは公式ツイッタラーであることがわかる腕章とかあるとやりやすかった...?

ともあれ最高に楽しかったので来年もなんらかの形(願わくば出場者)で参加したい!おしまい。