miyasakura’s diary

日記です。

CourseraのMachine LearningコースWeek 1

機械学習で調べるとよくおすすめされているやつですが、一念発起して始めてみました。日本語字幕もありますが英語の勉強も兼ねて英語字幕にて。

Week 1では大きく4つのセクション。

  • Introduction
    • コースの概要
    • Supervised LearningとUnsupervised Learningについて
  • Model and Cost Function
    • Machine LearningをModel化して定義
  • Parameter Learning
  • Linear Algebra Review
    • 線形代数の復習(四則演算やIdentity Matrixなど)

ほぼ数学を忘れていてもできるレベルでした。このくらいはInformation Scienceの修士卒で出来ないとは言えないレベルだけど実際にはかなり忘れてて最急降下法で出てくる偏微分とかで戸惑ってました。

線形代数のところはビデオほぼ飛ばしてたぶん合計4~5時間くらいで完了。

Week12まであるけどそこまで続く気が全くしない。

何でもやる系フリーランスエンジニアがお金を払って利用しているもの

出費を振り返る意味も込めてフリーのソフトウェアエンジニアとしてお金払って{購入|利用}している{物|サービス|ソフトウェア}のまとめ。

Macbook Pro 15"

となるとこれ一択に。XcodeとかAndroid Studioとか立ち上げてビルドするには13"だと非力。

Jetbrains All Products Pack

仕事でよく使う言語がRuby/Scala/Java/PHP/Swift/Node.jsなどですが開発環境が揃っていた方が良いなと思い利用。IntelliJプラグイン入れるよりは個別のプロダクトの方が使用感が良い。

ちなみにSwiftはXcode派。

Photoshop CC

Webサイトを作っていると画像を加工したりの機会がよくあるので。

デザイナーさんから貰ったファイルを自分で切り出すことも多いので意外と出番が多い。

通常のCreative Cloudのプランは高いので自分ではそこまでの価値は出しきれないですが、Photoshopだけであれば1,058円なのでこれくらいはギリギリ必要経費かなと。

Sketch

最近はアプリ作ってないのであまり利用する機会は無い。。

Parallels Desktop for Mac & Windows 10

IE/Edgeでの動作検証とかe-Tax/eLTAXとかでWindowsはどうしても必要に。Macで頑張る方法もありそうですが、素直にWindows入れちゃうのが苦労もしないので良いかなと。

月一も使わないので起動する度にアップデートしがちなのつらいところ。

Microsoft Office

結局365を契約。。最近地味に使う機会が多い。

Norton Internet Security

案件によりますが、自分のPCを持ち込んで作業させてと主張するとポリシー上セキュリティソフトが必要と言われることがある。

Charles

https://www.charlesproxy.com/

いきなり入った案件でドキュメントがしっかりしていないケースはままあって、そんな時には外部動作から内部仕様を推測して理解していくのが最速。

新しい案件に携わった時に最初にキャッチアップする速度が早いだけで一目置かれるので、個人的には最重要なソフト。

Safari Books Online

年間$400で英語の技術系書籍/動画が見放題のやつ。(実際にはキャンペーンで加入したので$300)

新しい技術/フレームワークなどをキャッチアップしないといけないときはこれで探して勉強している。

特に動画はかなり利用している。オススメ。

Github 有料プラン

Private リポジトリは必要よね。

BEKANT (電気昇降式デスク)

http://www.ikea.com/jp/ja/catalog/products/S59187840/

家で作業をする場合は座ってばかりになるので立って作業ができるように。

こういうものを買っても3週間で結局は座りっぱなしになるという統計もあるものの、Apple Watchに立ちましょうと言われたタイミングで3分だけ立ち上がって作業というだけでもだいぶ違うなという印象。

MFクラウド

freeeでもなんでも良いけど今のところは税理士に頼まなくて良いかなというレベルなので利用中。

1password

あまりフリーランスとか関係ないものの、色々な企業と関わると自分自身のセキュリティは考えるようになるので、より強固なパスワードしたいという思いもあり利用中。

感想

あんまりフリーランスがとか関係ないのも多いですが、こうやってみると月または年で払っているものがそれなりにありますね。お金もっと稼がないとなぁ。。

2017年の振り返り

2017年は大きな変革のない年だったと反省していたのですが、改めて振り返ると意外と大きなイベントもありました。

まずは新しい仲間との出会い。

前年から一緒に事業をゆるゆるとやっていこうと言っていた友人が別の会社にコミットすることになったので、一人でやっていかざるをえない状況になりました。

その中でフリーランス仲間で一緒に何かしていこうという仲間を見つけることができました。

そしてセブへ行った一ヶ月も大きな一ヶ月でした。

英語力も身に付きつつ、そのタイミングで苦手な単価交渉もうまいことできたり、仕事につながる出会いもありました。

一年を通しての反省点としては、どれも中途半端になってしまったので来年は選択と集中をして、やりたいことをやれる年にしていかないとなぁと思っています。

仕事的には種まきをしていた部分もあるので、来年はしっかりと売上を上げるフェーズにしていくことが目標です。

振り返りメモ

技術

  • 一応使えるようになった
  • 自信を持って使えるようになってきた

仕事

  • 前年からの継続的な仕事が多かった
  • 一緒に事業を作ろうと言っていた友人が就職していった
  • 別の仲間と一緒にやるようになった
  • やる気の有り無しで生産性に大きく違いが出た一年
  • 周りを見ると面白そうなベンチャーは多かった

プライベート

  • 旅行
    • 箱根、沖縄、大分、仙台、熱海
  • 英語
    • セブに行った一ヶ月でTOEIC900超えたし出会いもあったし良かった
  • 運動
    • 続かず
    • 飲みすぎる回数は減らせた
  • 友人
    • 数年会っていなかった何人かに会いに行けた

エンタメ周り

  • ゲーム
    • やったのはゼルダbotw、マリオオデッセイ、サマーレッスン(psvr)、ポケgo、ポケ森
    • 一番楽しんだのはオデッセイ。ゼルダを楽しみ切るには時間が足りない
  • 映画
  • TV/動画

投資

来年の抱負

  • 人とのつながりを大切に
  • 選択と集中
  • やるべきことをやりきる

メモ:2017年に読んだ本

今年も備忘録。

マンガ

今年は400冊くらい購入してた。全部bookliveで買ってるからサービス終了とかになったら死ねる。今年新しく読んだマンガで印象に残ったものの感想をメモ。

  • キングダム
    • 今更読んだけど面白かった
  • かなたかける
    • この作者はマラソン/駅伝を書かせたら最強
  • 響~小説家になる方法~
  • 賭ケグルイ
    • 結構好き。スピンオフ系が色々出てるけどそれは練り込まれてないから面白くない
  • 能面女子の花子さん
    • 周りの視線を気にしない花子さんがかっこいい。自分も精神的に強くなりたい
  • 久住くん、空気読めてますか?
  • ショートケーキケーキ
    • 王道少女漫画系の中では一番好きな作者

マンガ以外

技術書含め思った以上に読んでなかった。。2~3章だけ読んだ本は他にも色々あるのとSafari Books Onlineで動画は結構みた気がするけどもうちょっと勉強しろよという…。

  • 英語耳
    • セブ行く前にやっといてよかったと思った本
  • 結婚式・二次会 友人・同僚のスピーチ for Men
    • そういえば3月に挨拶したなぁ
  • インフラエンジニアの教科書/インフラエンジニアの教科書2
  • スタンフォード式最高の睡眠
  • 人生の勝算
    • 人となりを知ってる人の本は面白い。この人は凄い人
  • ビジネスモデル症候群 ~なぜ、スタートアップの失敗は繰り返されるのか?
    • 和波さんの本。良い本。
  • 「東京DEEP案内」が選ぶ 首都圏住みたくない街
    • 引越しの参考に
  • エラスティックリーダーシップ ―自己組織化チームの育て方
    • 英語で読んだので理解度半分
  • 浪費図鑑―悪友たちのないしょ話―
    • 知り合いが作者だったので購入。同人誌の延長で本が出るって凄い。

見た:「悲しみの忘れ方 Documentary of 乃木坂46」

あまり使っていないnasneの容量がついに一杯になってきていたので年末の特番を取るために整理していたらなぜか乃木坂46の映画「悲しみの忘れ方 Documentary of 乃木坂46」が録画してあったので見てみました。

乃木坂46はそれほど詳しくないんですがソニーミュージックの人とほんの少し仕事のやり取りがあった中で話題が出て興味を持ったのもあり全く知らないわけでもないグループです。

映画の上映は2015年で紅白出場を惜しくも逃した翌年の春くらいまでの話でした。何人かの中心メンバーに焦点を当てて、それぞれの母親からの手紙のような形でナレーションが解説しながら進んでいきます。

乃木坂46のそれぞれのメンバーが悩みを抱えていながらも努力して乗り越えていく姿を追っています。

30代にもなると若者が頑張ってる姿を見ると無条件で応援しちゃいますね。

映画を見てあらためて思ったのは成長っていかに自分の今のコンフォートゾーンの外に出るかが大事だなぁということです。自分の能力以上のことを無理にやってやっぱり失敗してでも努力して成長してっていうのを繰り返して、それをどれだけ繰り返せるか。

それを本人の意志と関係ないレベルでやらされているのが多分アイドル達で、映画の中でもみんな精神的にすごく成長しているのがわかります。その意味でああやって無茶ぶりがある環境ってすごく羨ましいなぁと思ってしまいました。たぶん自分が入ったら耐えられなくてやめちゃうんですが。

翻って最近の自分はフリーランスになって1年半くらい経つのですが、気づいたらストレスのかからない状態になりがちなんですよね。怒られることも無いですし会社勤めみたいに責任ある業務を無茶振りをされることも無いのでプレッシャーみたいなのがありません。

最近はストレスの中で働くのはダメみたいな風潮はあってそれは同意なんですが、自分が仕事の幅を広げるときに発生するストレスは常にあって然るべきだと思います。ちょっと今が快適すぎるので2018年はもうちょっとストレスを感じる仕事に取り組んでいかないと。。

ということで乃木坂46の頑張ってる姿を見たらおじさんももうちょっと頑張ろうと思ったという話でした。

振り返り:2017年の仕事

使った技術とか振り返る。12月は(飲み会で)忙しくて書くの忘れがちなので思いったった今のうちに簡単にまとめる。

やったこと

  • 会計システムを作ってるところで常駐
    • 去年から引き続き
    • 使った技術: AWS全般, Docker, Scala, Java
  • スタートアップでiOSアプリ開発
    • 週2で2ヶ月という内容だったのであまり価値を残せなかった
    • Swift
  • Web系のインフラ構築
    • サーバ周りの知識やAWSの導入サポートなど
    • AWSとかXAMPPとか
  • Web系のアプリ開発
    • 緊急とのことで頼まれたので
    • PHP
  • なんかセブ島に語学留学に行ったらそこで知り合った人と組むことになった案件
    • 会社と絡んで進めている
    • Rails使ったり営業先についていったり
  • その他個人/チームで作っているもの
    • 2~3個
    • Rails, Node.js, Reactあたり

技術について

  • アプリ開発で言うと今までBtoCなものをやってきたせいもあり、設計とかどうでも良いと思ってた派なんですが、会計システムをいじってるとどうしてもビジネスロジックは複雑化するので設計とか大事だなとあらためて気付かされた
  • 言語としては Rails, Node, Java, Scala, PHP まで色々と触れたのは良かった
  • インフラ周りというかAWSはそれなりにわかってきた
  • フリーランス2年目でやっと技術について少し詳しくなってきた気がする
  • とはいえDDDもクリーンアーキテクチャ関数型プログラミングも自分の中であまり消化できていないので色々と課題がある

これから

少しずつ自分の向き/不向き・やりたい/やりたくないがわかってきたので、そろそろ何でもやってみるではなくて自分の方向性を決めていきたい。

Spring SecurityでAES暗号化された文字列をRubyで復号してみた

AESで暗号化されたテキストを手元で復号しようと思ったけど意外とAESのことを知らなくて苦労したので簡単にメモ。(勉強を兼ねて無理矢理RubyでやっただけでSpringで普通に復号すれば良いだけなので実用性は無いと思う。)

Spring Securityでの暗号化

こんな感じで暗号化されたもの。

package com.example.security;

import org.springframework.security.crypto.encrypt.Encryptors;
import org.springframework.security.crypto.encrypt.TextEncryptor;
import org.springframework.stereotype.Component;

@Component
public class Encryption {
    public String encrypt(String password, String plainText) {
        String salt = "0123456789abcdef"
        TextEncryptor encrypt = Encryptors.text(password, salt);
        return encrypt.encrypt(plainText);
    }
}

詳細な暗号化方式はと言うと、下記がドキュメントに書いてあった。

Spring Securityでは、共通鍵暗号化方式を使用した暗号化および復号の機能を提供している。
暗号化アルゴリズムは256-bit AES using PKCS #5’s PBKDF2 (Password-Based Key Derivation Function #2) である。
暗号利用モードはCBC、パディング方式はPKCS5Paddingである。

なるほど、わからん。Wikipediaとかみつつ方式について理解してみる。

  • 256は鍵の長さで、128, 196, 256から選べるうち256bitのものを使っている。鍵の長さが長いほうが(計算量が多くなるので)セキュリティ的に良い
  • 暗号利用モードとはブロック暗号化のメカニズムのことでCBC(Cipher Block Chaining)は前のブロックのXORを取ることでブロック単位での一致を判定することをできなくする
    • CBCの初期ブロックはIV(Initialization Vector:初期化ベクトル)を用いることでメッセージごとのユニーク性を確保する
  • PKCS #5は[暗号化]ブロック暗号とは(AES/DES/Blowfish PKCS5Padding ECB/CBC IV) - [技術資料 + 技術資料] ぺんたん info によると余ったブロックをどう埋めるかという方式
  • PBKDF2というのはパスワードから何かしらの鍵を生成するときに計算量を増やして総当りをしづらくする方式とのこと。パスワードとソルトを使ったハッシュ化を複数回イテレーションすることで実現する。
    • ハッシュ化の繰り返し回数はパラメータぽい

それぞれはわかったので全体の処理の流れを調べると Closure Library の暗号化モジュールの使い方 - WebOS Goodies この図がわかりやすかった。

saltとpasswordからpbkdf2を使ってkeyを生成 → 平文データをIVとkeyを使ってCBC方式によりブロック単位にAES暗号化 という流れ。

復号化にあたっては暗号化の方式がわかった上で、

  • 復号対象のテキスト
  • PBKDF2の
    • 繰り返し回数
    • Salt
    • Password
  • CBCのIV

がわかれば良さそう。上記の内、Spring Securityで外側から指定しないのは繰り返し回数とIVなのでこれが分かれば他の環境でも復号はできるはず。

Spring Securityのパラメータを調べてみる

Ruby で復号する

これらを踏まえてRubyで復号してみる。 class OpenSSL::Cipher (Ruby 2.6.0) を見つつ実装すると下記のようになった。

pack関数でバイト列に変換してあげないとダメだったところでややハマった。

require 'openssl'

salt = ['0123456789abcdef'].pack('H*') # 8バイト
password = 'somepassword'  # 暗号化時に入力したパスワード
cipher = '7bc2a6f8e684a2963285064524a0f85fb3b47bc6300c699699fe99387a9f7b10' # Spring Securityから出力された文字列

# PBKDF2によるkeyの作成。256は鍵の長さ。
key = OpenSSL::PKCS5.pbkdf2_hmac_sha1(password, salt, 1024, 256)

# IVを取り出す(16バイトだがhex文字列になっているので32文字)
iv = [cipher[0, 32]].pack('H*')

# AESによる暗号文本体
encrypted = [cipher[32, cipher.length]].pack('H*')

dec = OpenSSL::Cipher.new("AES-256-CBC")
dec.decrypt
dec.key = key
dec.iv = iv

decrypted = dec.update(encrypted) + dec.final

puts(decrypted)

ちなみにSpring Securityと同等の暗号化をRubyでしたい場合はこんな感じ。

require 'openssl'
require 'securerandom'

salt = ['0123456789abcdef'].pack('H*')
password = 'somepassword'
text = 'hirabun'

key = OpenSSL::PKCS5.pbkdf2_hmac_sha1(password, salt, 1024, 256)
iv = SecureRandom.random_bytes(16)

enc = OpenSSL::Cipher.new("AES-256-CBC")
enc.encrypt
enc.key = key
enc.iv = iv

encrypted = enc.update(text) + enc.final
cipher = (iv + encrypted).unpack('H*').first

puts(cipher)

感想

AES本体のアルゴリズムには踏み込んでいないものの、それでも結構知らない部分が多かったので勉強になった。ちなみにSpring SecurityのAES暗号時にはstrongという指定できるようでそちらだと AES with GCMとなって今回のCBC方式とは違うらしい。

何となくわかったつもりでブログにまとめようとしたら意外と理解していない部分が多かったので調べ直した部分も多く、やはりこういうアウトプットは大事だなぁと改めて思った次第です。