ボンジニアの備忘録

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

暗号化の話が全然わからずに悔しい

はじめに

暗号化技術の話がいっちょんわからんとです。
いや、勉強しろよって話だとは思うんですが、ここまであまり暗号化技術に対して、あまり意識していなかったのが行けなかったようです。

事の始まりはこのAWS Cognitoです。
docs.aws.amazon.com

ここであるユーザでログインするAPIを叩こうと思ったらSRPで行えと書いてあるじゃないですか。

SRP???

まぁ言うてもSDKとかライブラリでそういうやつ作れるんでしょ?って思ったらSDKたちは良さそうだけど、自分はElixirで組む必要があったので、APIリファレンスを見ながら組むことになりました。

暗号化技術の知識の無さに絶望

SRPを色々見てもよくわからず、とりあえずPythonで同じようなことをしている人がいたので実装を試みて見ました。

github.com

PythonからElixirなら簡単に書き換えできると思ったんですが、上手くいかず。。。

ヘルプ!

もしElixirが得意で暗号化技術も長けている方がいましたら、このPythonのコードを紐解いて、Elixirにおこしていただけると助かります。
自分でも挑戦して見たんですが、上手く認証できない状態です。
ソースコードはこちらです。
github.com

引き続き自分の方でも解析を続けていきます!

PythonのNumpyのパクリNumexyのお披露目

はじめに

昨日はfukuoka.ex #4というElixirイベントがありました。

techjin.connpass.com


@piacereさんを中心としたElixirのLTイベントでした。
Elixirについては@piacereさんの下記の資料が参考になります。

www.slideshare.net

自分のちょこちょこ開発をしていたNumexyちゃんをついにfukuoka.ex #4でお披露目できました。


Numexy(ナメクシー)って?

はい、こちらはカタカナ表記はすごくダサいんですがPythonのNumpyをElixirに書いたライブラリーになります。


まだまだNumpyの充実さには及びませんが、少しずつ便利にしていこうと思っております。


発表スライドはこちらです。
speakerdeck.com

ソースコード

ライブラリのソースコードはこちらです。

github.com

ドキュメント

API Reference – numexy v0.1.8

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で書いて勉強しようというざっくりとした目標で開発を進めています。第一回は下記にまとめています。

プログラム開発

転置の作成

行列には転置という処理があります。行と列を入れ替えるあれです。
処理としては最初に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)

まとめ

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

次はこちらです。
- numpyライクなElixirのライブラリー開発日誌(2) - ボンジニアの備忘録


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