ボンジニアの備忘録

中小SIerからWeb系のベンチャーに企業に転職。基本的にはごく普通の平凡なエンジニアです。思ったことをつらつら書いていきます。

numpyライクなElixirのライブラリー開発日誌(5)

プログラム開発

今回は今まで作ったNumexyライブラリで論理ゲートのXORを作成します。XORはAND、OR、 NANDを組み合わせて作れますのでそのパーツをまず作成します。

出力層の作成

  def output(x) when x <= 0, do: 0
  def output(x) when x > 0, do: 1

ANDの作成

  def lgAND(x1,x2) do
    x = Numexy.new([x1, x2])
    w = Numexy.new([0.5, 0.5])
    b = -0.7
    Numexy.mul(x, w) |> Numexy.sum |> Kernel.+(b) |> output
  end

NANDの作成

  def lgNAND(x1,x2) do
    x = Numexy.new([x1, x2])
    w = Numexy.new([-0.5, -0.5])
    b = 0.7
    Numexy.mul(x, w) |> Numexy.sum |> Kernel.+(b) |> output
  end

ORの作成

  def lgOR(x1,x2) do
    x = Numexy.new([x1, x2])
    w = Numexy.new([0.5, 0.5])
    b = -0.2
    Numexy.mul(x, w) |> Numexy.sum |> Kernel.+(b) |> output
  end

XORの作成

  def lgXOR(x1,x2) do
    lgAND(lgNAND(x1, x2), lgOR(x1, x2))
  end

実行

iex> lgXOR(0,0)
0
iex> lgXOR(1,0)
1
iex> lgXOR(0,1)
1
iex> lgXOR(1,1)
0

まとめ

Numexyを使うことで論理ゲートを実装することができました。ただ計算式部分がどうしても関数の組み合わせになり見づらいところがあるのが今後の改善ポイントになります。
とはいうものしっかりとXORは書けたのは嬉しい!!

ツイッターもやっていますのでよかったらフォローをしていただけると嬉しいです。
twitter.com

numpyライクなElixirのライブラリー開発日誌(4)

プログラム開発

今回はsum関数を実装します。

sumの作成

sum関数はみなさん通常でもよく使っていると思いますが、全ての値を合計するものです。プログラム的にはベクトルの場合はEnum.reduceを1回使って、行列の時は2回使っています。

iex> Numexy.new([[1,2,3],[4,5,6]]) |> Numexy.sum
21

Pythonで言う所のこれ

In [1]: x = numpy.array([[1,2,3],[4,5,6]])
In [2]: numpy.sum(x)
Out[2]: 21

まとめ

まだまだ関数型には不慣れなので、つくり込むときに時間が掛かりますが、作りたいものができた時はかなり「快・感」です!

ツイッターもやっていますのでよかったらフォローをしていただけると嬉しいです。
twitter.com

numpyライクなElixirのライブラリー開発日誌(3)

はじめに

PythonのnumpyをElixirで書いて勉強しようというざっくりとした目標で開発を進めています。これまでの日誌は下記です。

プログラム開発

今回は初期化に使うonesとzerosを実装します。

onesの作成

ones関数は与えられた行と列から全て値が1の行列やベクトルを生成するための関数です。よく初期化に用いられます。

iex> Numexy.ones({3,2}) 
%Array{array: [[1, 1], [1, 1], [1, 1]], shape: {3, 2}}

Pythonで言う所のこれ

In [1]: numpy.ones((3,2))
Out[1]: 
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

zerosの作成

zeros関数は与えられた行と列から全て値が0の行列やベクトルを生成するための関数です。

iex> Numexy.zeros({3,2}) 
%Array{array: [[0, 0], [0, 0], [0, 0]], shape: {3, 2}}

Pythonで言う所のこれ

In [1]: numpy.zeros((3,2))
Out[1]: 
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

onesもzerosもElixirのList.duplicate関数を使って実装しています。

まとめ

これを作って何?って思う方もいらっしゃるかもしれませんが、完全に自己満足ですw

ツイッターもやっていますのでよかったらフォローをしていただけると嬉しいです。
twitter.com

numpyライクなElixirのライブラリー開発日誌(2)

はじめに

PythonのnumpyをElixirで書いて勉強しようというざっくりとした目標で開発を進めています。第一回は下記にまとめています。

yujikawa11.hatenablog.com

プログラム開発

転置の作成

行列には転置という処理があります。行と列を入れ替えるあれです。
処理としては最初にzipでまとめた後にタプルからリストに変換しています。

iex> Numexy.new([[4,3],[7,5],[2,7]]) |> Numexy.transpose
%Array{array: [[4, 7, 2], [3, 5, 7]], shape: {2, 3}}

Pythonで言う所のこれ

In [1]: numpy.array([[4,3],[7,5],[2,7]]).T

まとめ

コードの更新にブログの更新が追いついていないのが申し訳ないです・・

ツイッターもやっていますのでよかったらフォローをしていただけると嬉しいです。
twitter.com

numpyライクなElixirのライブラリー開発日誌(1)

はじめに

みなさん、こんにちはyujikawaです。
普段業務ではPythonをメインに使ったお仕事をこなしているのですが、とある方からの勧めでElixirを学ぶようになりました。
自分自身これまで色々なシステムに関わってきて、耐障害性に強くスケールしやすいという特徴を持ったElixirに大きく興味を持ちました。
Elixirのことを知りたい方はこのあたりのスライドをご確認いただけると色々わかると思います。

www.slideshare.net
かなりお世話になっている@piacereさんのスライドを引用させていただきます。

本題に入りますが、今はElixir初心者なのですがこれからもっと学びたいので自分なりのテーマを決めました。それがnumpyライクなElixirライブラリー開発です。

numpyというとPythonの行列計算ができるライブラリーですね。最近の機械学習の分野でもかなり使われているライブラリーです。ElixirにもMatrixのライブラリーはちらほら見かけます。

ひょっとしたら天才がすごく良いライブラリーをElixirで作っているかもしれませんが、僕は気にせずに車輪の再発明します。個人的には勉強がてら車輪の再発明するのは良いことだと思っています。

プログラム開発

構造体の作成

まずはnumpy.arrayのようなオリジナルの型を使いたかったので、defstructを使って構造体にしました。

iex> x = Numexy.new([1,2,3])
%Array{array: [1, 2, 3], shape: {3, nil}}

Pythonで言う所のこれ

In [1]: numpy.array([1,2,3])

ベクトル間の内積

次はベクトル間の内積です。何となく内積求めたいと思ったので先に作り始めました。

iex> x = Numexy.new([1,2,3])
%Array{array: [1, 2, 3], shape: {3, nil}}

iex> y = Numexy.new([1,2,3])
%Array{array: [1, 2, 3], shape: {3, nil}}

iex> Numexy.dot(x, y)
14

Pythonで言う所のこれ

In [1]: numpy.dot(x, y)

まとめ

ひとまず、ベクトルの内積までできたが行列の計算どうしようと頭悩ませています。
でも新しい言語を触って、知らないことに触れるのはすごく楽しいですよね!
逐一機能を追加していきますので、興味がある方は見守ってください(笑)

ツイッターもやっていますのでよかったらフォローをしていただけると嬉しいです。
twitter.com

中小SIerからWeb系に転職して思ったこと

はじめに

中小のSIerから転職し、気づけば1年以上たっていたので振り返りも込めてブログに書きたいと思いました。
同じように中小SIerにいて、これから転職しようと思っている方々の少しでも参考になれば思います。

中小SIer

そもそもSIerって何?という方は下記をご覧になったら良いと思います。
www.it-career-navi.com

私は所謂ユーザー系子会社のSIerにおりました。ユーザ系子会社とは非IT企業を親会社に持って、その親会社のシステム部門が子会社化したところですね。

仕事内容というと、新卒で入社したからしばらくは既存ソフト(医療系ソフト)のカスタマイズがメインでした。

基本的に商売自体がピラミッド構造になっていて、トップに有名な大手IT企業がいて、そこにぶら下がる感じのSIerのあるあるパターンですね。

仕事では、ある機能の一部を作ることはあっても、システム全体を作ることは無かったので、時間がたつにつれ自分自身に焦りが出て来ました。

そこで新卒から3年が経とうとした時に、転職を決意しもっとクリエティブな仕事ができる現場に行こうと思いました。

転職活動編

さて、転職活動しようと決心したのは良いものの、クリエイティブなことをやりたいと思っているだけでは絶対に採用されないと思ったので、適当なアプリを作りながら転職活動しておりました。もちろん平日は仕事をしていたので、基本土日と空いた時間でやってました。

ただ1から作ることは難しくて全くうまく作れなかったんですが、それでも作ったアプリが下記のスマホアプリです。

play.google.com

まじでUIはクソだし、機能もクソの黒歴史何ですがとりあえずポートフォリオはできたかなぁとその時は思っていました。

最近何気にネットで調べたら週刊アスキーのネット記事に取り上げられていたので、正直黒歴史が晒された感ありましたw
weekly.ascii.jp

それは置いといて、話は戻りますが

その後もクオリティはとりあえず置いといて、とにかくプライベートではプロダクトのためにプログラムを書きまくってました。

転職活動しているときに使っていたサイトは下記です。

とりあえず色々と登録してみて、使ったんですが一番良かったのは「Wantedly」です。次にGreenが良かったです。

Wantedlyで求人を探していると本当にワクワクしました。いろんな会社があって、いろんな面白いことやってるんだ!って。

リモートOKもあるやん!と胸躍らせていましたw
ちなみに今もWantedlyみてワクワクしてまいます。

気軽に会社に訪問できて、色々と話ができるため個人的にはWantedlyをお勧めします!

Wantedlyを使うまでは会社に訪問せずにネットの情報だけで、就職活動してましたがやはり会社訪問するのは一番良いです。そこの雰囲気がわかります。

転職後から今まで編

ちなみに前職は400人ぐらいのユー子でグループ全体では3万人ぐらいの会社でした。
転職後はその時8人ぐらいしかいないベンチャー企業でしたが、何となく雰囲気が合いそうだったので入社しました。

転職後はスーツから私服に変わり、PCもWindowsからMacに変わり、朝も9時出社が9時半から10時ぐらいの出社など今までの生活とはだいぶ変わりました。またリモートワークもできるので、非常に自由な時間が増えました。

ただ良いことばかりではなく、今までは組織として成熟していた企業だったので、一気に色々と制度がなくなり、また一人当たりの責任も増した感じがします。

また、Web系はSIerにいた頃と比べ、周りの方が勉強会に参加したり、また主催するなど社外の活動をよくしている印象を持っていたので、自分自身も常にアンテナをはって勉強し社外へアウトプットすることに努めていました。社内のチームメンバーともずっとあーだこーだ色々悩みながら勉強したり登壇したり、本当に充実した1年だった気がします。(まだ1ヶ月ほどありますがw)

この1年でやってきたことをとりあえず列挙します。

コミュニティの運営

PyFukuokaというコミュニティを立ち上げて運営しております。
fukuoka-python.connpass.com

もうすぐでコミュニティ人数が100人いきそうなので嬉しいです!

さいごに

私は転職してよかったと思っています。一番よかったのは技術をもっと身に付けたい勉強したい!という気持ちが強いメンバーと社内外関係なく人脈が増えたことです。
どうしても社内だけですと、井の中の蛙のような状態になるので、常に外を見ていることが大事だなぁと感じました。
来年ももっとブログの執筆活動も頑張りますw

今転職を悩んでいるSIerの方々、ぜひ行動を起こしてみてください。

最近はQiitaの方に投稿していることも多いのでURL貼っておきます。
qiita.com

PyFukuoka#2のイベントをやりました!

PyFukuokaとは...

PyFukuokaとは福岡におけるPythonエンジニアとの交流を目的としたちっちゃなコミュニティです。

イベントの内容

第一回に引き続き、LT大会です。内容はPythonに関することであればなんでもOKです。
fukuoka-python.connpass.com

1人目: ゆじかわ (@yujikawa_py) | Twitter

はい、自分です。今回は特殊メソッドを使ったプログラムの書き方的なお話をしました。
speakerdeck.com

2人目: massyuuさん

massyuuさんはPythonとElectronを使ったデスクトップアプリを作り紹介されました。
そのほかにも色々な技術を組み合わせて作られており、非常に興味深い内容でした。
PythonでデスクトップアプリというとKivyなどが思いつきますが、別のアプローチというところが良いですよね!
speakerdeck.com

3人目: piacereさん

piacereさんはElixirが詳しく、今回はElixirとPythonとの連携するお話でした。複数の言語同士の連携っていいですよね。
今回の資料はLT版ということで、続きはfukuoka.ex #4でのお楽しみのようです。クゥ〜〜気になる〜〜〜!
自分はElixirの勉強をものすごくスローペースでやっているんですが俄然やる気が出ました。もっと勉強します!

www.slideshare.net

4人目: hakata_oyukiさん

hakata_oyukiさんのスライドは上がっていないので載せられないのですが、PyConの九州版の立ち上げを計画中であり
サポートメンバーを募集されておりました。興味がある方はぜひ!(自分は参加予定です)

5人目: tomtoruさん

tomtoruさんはOpenCVについてのお話でした。
OpenCVというと顔認識によく使われている印象なんですが、実際に顔認証の技術の説明や作ってやってみた内容を発表されていました。
speakerdeck.com

6人目: tsurubeeさん

tsurubeeさんはPyPIに自作ライブラリー作る、その作り方を発表していました。
自分のつくったライブラリーがpip installで落とせるのは感動しますね。
また異常検知のライブラリーということでこれもまた面白いライブラリーですので是非皆さん使ってみてください!

speakerdeck.com

以上イベントレポートでした!