株式会社 MaaS Tech Japan に入社しました
あけましておめでとうございます。
年末に退職エントリを書きましたが、その続きというか無事に転職できましたという話です。
どこで働くの?
株式会社 MaaS Tech Japan という、交通系のデータ基盤を主軸に自治体や企業向けに技術支援やコンサルティングを行う会社に入社しました。
交通のドメイン知識豊富なビジネスパーソンや、地理情報システムつよつよなエンジニアを抱えていて、そういった方々に揉まれてきます。
入ってみての感想は?
まだ稼働1日目でなんもわからんといえばそれまでですが、面白いのが大企業出身の役員や社員が多いからか、スタートアップなのに社内制度がしっかりしていました。
前職とはまた違った空気感で、言語化しにくいですが働く場所は変わらずとも転職した実感が湧きました。
たぶん GeoJSON とか使い倒すことになるので、今年は趣味で地図関係のアプリ作るかもしれません。
引き続き頑張っていきます。
株式会社ガイアックスを退職しました
タイトルの通りで、2019年に新卒入社した株式会社ガイアックスを退職しました。
インターンを含めると2017年から色々経験させてもらいました。当時からのメンター、上長、同僚のみなさん、お世話になりました。
既に有給を消化しきって、年明けから別の会社で働く予定です。
何してたの?
ソーシャルメディアマーケティング事業部というところで、社内システムの開発と運用をしていました。
今の会社は Flutter を推してますが、自分がいた事業部では BtoC のプロダクトを扱っていたわけではなく、社内のコンサルタント向けにデータ基盤の整備を泥臭くやっておりました。
去年あたりから、事業部全般の技術的な課題から組織的な課題の解決に動いたり、全社のエンジニア組織の課題に向き合ったりしていました。
それと 会社主催の技術イベント のスタッフもやっていました。ご参加していただいた方はありがとうございました。
今年の頭からは経営陣に声を掛けてもらって、ガイアックス全社の経営会議に出させてもらいました。経営陣の日々の動きを肌で感じながら、現場のエンジニアの視点で意見を言わせてもらう貴重な機会でした。
どうしてやめるの?
色々理由は重なったのですが、(社としてはマネージャー期待されていたものの)プレイヤーとしての経験をもう少し積みたかったというのが一番大きな理由になります。
それ以外の理由も含めて長文書いて寝かしていたのですが、うまくまとめられなかったので割愛しました。気になる方は直接話しましょうw
次はどうするの?
これまでフルリモートワークで広島で働いていたんですが、転職後も広島にいる予定です。
引き続きよろしくお願いします。
ちなみに
例のアレです。退職を機に新調しました。よろしくお願いします。
Symmetric API Testing を Python で試す
Python Advent Calendar 2021 の16日目の記事です。
以前、外部 API のテスト手法 Symmetric API Testing に関しての記事を書きました。
この記事では、それを Python で実践する方法についてまとめてみます。
Symmetric API Testing とは?
改めて Symmetric API Testing とは
Symmetric API Testing は実際のリクエストとレスポンスを自動で保存しておいて、テスト実行時に保存したデータを参照する手法
Symmetric API Testing という、手間なく堅牢に外部 API Client をテストする手法 - ちゃんゆーのブログ
のことです。
完全なモックを実装すると、モックのメンテナンスコストがかかってきます。 かといってテスト実行時に都度 API を呼び出すと、テストの実行に時間がかかるだけでなく、レート制限や一時的なエラーでテストが失敗することがあります。もちろん API 側に不必要な負荷をかけてしまうので、できれば避けたいところです。
Symmetric API Testing の手法は、上記の中間を取るような方法になってきます。詳細については上記の記事をご参照ください。
Python で Symmetric API Testing をやるには?
リクエストとレスポンスを対応するように保存しておく仕組みを用意できれば、どういった言語、アーキテクチャでも Symmetric API Tesing を実践することは可能なはずです。
そういったことをやってくれるライブラリは各言語で公開されており、Python の場合は VCR.py というライブラリを使うのが便利です。
VCR.py の簡単な使い方
詳細の使い方は VCR.py 📼 — vcrpy 4.0.2 documentation をご覧いただくとして、本当に簡単な使い方だけご紹介します。
インストール
$ pip install vcrpy
with 句で使う
import vcr import requests with vcr.use_cassette("fixtures/sample.yaml"): response = requests.get("https://jsonplaceholder.typicode.com/todos/1") todo = response.json() assert todo["id"] == 1
$ python main.py
with 句で囲むだけで、あとは通常通りリクエストを投げれば OK。
実行後、use_cassette で指定したパスに yaml ファイルが保存されています。
interactions: - request: body: null headers: <省略> method: GET uri: https://jsonplaceholder.typicode.com/todos/1 response: body: string: !!binary | H4sIAAAAAAAAA6vmUlBQKi1OLfJMUbJSMNQBcTMRzJLMkpxUJSsFpZTUnNTkktJihcTSEhBOzVUC K0jOzy3ISS1JBWlJS8wpTuWqBQA33AG3UwAAAA== headers: <省略> status: code: 200 message: OK version: 1
これがレスポンスの実体になります。 VCR.py ではカセットファイルと呼ばれています。
2回目以降は自動的にカセットファイルを読み込んで実行してくれます。インターネットから切断しても、問題なく実行できます。
デコレータで使う
import vcr import requests @vcr.use_cassette("fixtures/test_todo.yaml") def test_todo(): response = requests.get("https://jsonplaceholder.typicode.com/todos/1") todo = response.json() assert todo["id"] == 1 if __name__ == "__main__": test_todo()
実際には unittest や pytest に統合して使うことになりますが、関数やメソッドにデコレータを加えるだけで、 Symmetric API Testing が実現できます。
カセットファイルのパスをベタ書きで指定していますが、 VCR の設定で関数名から自動で命名して指定したパスに保存することもできるので、最初の設定さえ済めばストレスなく利用することができます。
使用感
- 設定項目がそれほど多くなく、手軽に導入できる
- pytest や unittest の統合が手軽にできる
- リクエストヘッダやボディをマスクすることができて便利
pytest や unittest により手軽に導入するための vcrpy-unittest や pytest-vcr というパッケージが公開されていて、必要に応じて利用すると便利です。
そして特に便利なのが フィルタ機能 で、センシティブなデータを除いてカセットファイルに保存することができます。
with my_vcr.use_cassette('test.yml', filter_headers=['authorization']): # sensitive HTTP request goes here
https://vcrpy.readthedocs.io/en/latest/advanced.html#filter-information-from-http-headers より引用
この機能を使うと Bearer Token を XXXXXX
に置換してカセットファイルに保存するといったことが簡単に実現できます。便利です。
これによってカセットファイルをそのまま git リポジトリ管理下におくことができるので、よりテストが実行環境に依存しにくくなります。
どう運用していくか?
導入は簡単にできそうですが、どう運用していくのが良いのでしょうか。 カセットファイルは一度作成したらそのままで良いのでしょうか。
正直なところ自分も模索中ではあるのですが、何を重点的にテストしたいのかに依りそうです。
- アプリケーションの変更の影響をテストしたい
- 外部 API の変更をなるべく早く検知したい
前者は通常テストが担うべき領域だと思います。
一方で後者は、例えば外部 API の変更、特にドキュメンテーションされていないようなサイレントな変更がアプリケーションに影響を及ぼしていないか把握したいシチュエーションです。例えば Twitter の Bot など、外部 API に強く依存するアプリケーションの場合には、外部 API の変更による動作確認は行いたいはずです。
VCR.py でテストを行う場合、カセットファイルが古いままだと、テストは通るが本番で動作しない可能性があります。
カセットファイルを定期的に再生成する運用
外部 API の変更をなるべく早く検知したいのであれば、カセットファイルを定期的に再生成する運用が考えられます。
色々やり方はあるかと思いますが、 要件に応じて日次、週次、月次などのタイミングで CI/CD 起点に以下のフローを実行するのが良さそうです。
- カセットファイルを削除する
- テストを実行してカセットファイルを再生成する
- (テスト落ちたら)チケット切ったり、カセットファイルの差分を含めて PR 作成したりする
カセットファイルを作りっぱなしにする運用
逆に、依存している外部 API が安定していて、影響も限定的である場合は、コストかけずにカセットファイルを作りっぱなしにする運用がリーズナブルです。
まとめ
Symmetric API Testing を Python で実践するために、 VCR.py の導入と運用についてまとめました。
導入はともかく、運用についてまだまだ工夫できそうなので、うまいやり方あったら教えてほしいです。
おわり。
Symmetric API Testing という、手間なく堅牢に外部 API Client をテストする手法
もともと息抜きに社内向けに書いた記事ですが、外部向けにリライトしました。久々にはてなブログにポストしてみます。
さて、自分の仕事柄 API Client を実装する機会が多いのですが、改めて良い API Client ってどういうものなんだろうかと探っていました。
GolangでAPI Clientを実装する | Taichi Nakashima という記事が、 Golang に限らない汎用的な API Client の設計と実装についてわかりやすく述べられていてよかったです。
その記事の終わりに、 API Client のテスト手法として Symmetric API Testing が紹介されていて、大変興味深かったので記事としてまとめてみました。
Symmetric API Testing とは?
Symmetric API Testing という手法はこちらの記事で言及されていました。
Anaconda という Golang の Twitter API Client の課題を解決するために採用した API Client のテスト手法とのことでした。
めちゃくちゃ要約すると以下のような内容でした。
- API Client のテスト手法はいくつかあるがどれもつらい
- Symmetric API Testing は実際のリクエストとレスポンスを自動で保存しておいて、テスト実行時に保存したデータを参照する手法
Symmetric というのは、リクエストとレスポンスを保存しておくことで、モックサーバーとモッククライアントを対照的にテストできるというところからきているようですね。
とてもよさそう。
どうやって Symmetric API Testing をやっていくか
Symmetric API Testing 自体は Golang 界隈で2015年頃に盛り上がった手法のようですが、 Golang に限らず似たような手法は試されており、手軽に実現するライブラリもいくつかあるようでした。
Symmetric API Testing | Gopher Academy Blog では、直接 Golang の io 周りの API でゴリッとファイル書き出しする方法が取り上げられています。
Ruby では vcr というライブラリがあり、 VCR.py など各言語に派生したライブラリが多数存在しています。 みなさんお使いの言語でも手軽に試せるかもしれません。
ライブラリなくとも、JSON や YAML などでファイル書き出してテスト実行時に読み出せばよいだけなので、自前でもやりやすくはありますね。
まとめ
ふとしたきっかけで Symmetric API Testing について調べてみましたが、 API Client のテストのつらーいところをうまく解消した、斬新で面白いテスト手法でした。
自分は普段 Python 使うことが多いだけあるので VCR.py を触ってみたのですが、非常に使用感よかったです。
また追って体験記事も書いていきたいと思います。
2022-12-20 追記
新卒の私がどうして広島で暮らしながら東京で働こうと思ったのか
2019/08/21 追記
自分の働き方についてマイナビニュースに掲載されました! news.mynavi.jp
追記終わり
こんにちは、久々のポストです。 いろいろありましたが、無事に専攻科も卒業して、東京のガイアックスというIT企業に新卒入社しました。
社会人になって2ヶ月。4月はビジネス職の同期と合同でマナー研修など、5月はエンジニアの研修を終えました。 会社は永田町にあるのでその間は東京に滞在していたのですが、私の配属先はリモートワーク可能ということもあり、6月からは地元広島に戻って新たな挑戦を始めていきます。
そんな自分が広島で暮らしながら東京で働く理由について、良い節目なので書いていこうと思います。
会社との出会い
会社に出会う前
私は広島県出身で呉高専で7年間を過ごしました。7年って言う度に思うけど、小学校よりも長い期間、しかも人生で最も多感とも言える時期を高専に費やしてきました。 学生のときは、周りが技術屋さんばかりだったのもあって、あえて畑違いの建築系の空き家改修プロジェクトに参加するなど、技術にこだわらずに自分の住んでいる地域の問題に対して、真っ向から勝負しかけるようなチャレンジを続けていました。
ガイアックスとの出会い
今の就職先との出会いについて書くと、高専の専攻科に進学して1年目の授業のカリキュラムに「長期インターンシップ」が組み込まれていて、2ヶ月半実際に企業で働いて学ぶという機会がありました。ぼんやりと東京でガッツリインターンできないかなあと考えていたときに、空き家改修プロジェクトのときにお世話になっていた先生が「全国のコワーキングスペースを旅する」というチャレンジをしていて、そこで偶然うちの社員の方と先生が出会っていて、僕に紹介してくださったんですよね。それがきっかけでガイアックスと出会いました。
調べてみると、そのときの先生の挑戦がブログでまとまってました。笑
紹介された時は、事業が複数あってどんな会社なのかは正直よくわからなかったけど、会社の理念の「人と人をつなげる」に共感して、面談させてくださいとお願いしました。まさか建築系の先生にIT企業紹介してもらうなんて、それこそ人と人のつながりって強いなあと感じていたので。
インターン期間
なんとかスカイプ面談も通って、無事に東京でインターンさせてもらえることになりました。 やっぱりインターン中に感じたのは、東京のイベントの多さと質。「せっかく東京に来たから、できるだけのことを吸収しよう」という気持ちで、業務後のエンジニア向けイベントになるだけ参加していました。やっぱこう毎日広島でイベント開催されていないんですよね。
インターン行ってみてわかったのが、会社の人たちみんなが本当に楽しそうに仕事しているということ。インターンの期間が終わっても一緒に働けたらなーと思っていたら「広島に戻ってもリモートでやらない?」と声かけていただいて、広島に戻ってからも引き続きリモートでインターンを続けました。
迷いと決断
専攻科修了後は就職しようと思っていて、そろそろ就職先を決める時期になった頃、ありがたいことに通っていた高専の校長から「うちの学校で働くのはどうかね?」と声をかけてもらったんですよね。 聞いてみると、学校のシステムを統括する技術職の求人で、できることもテクノロジーと教育の分野で、タイミング的にもなかなか入ろうと思っても難しい。しかも自分がやりたいことと重なっている。呉か東京か。地方の学校教員か、東京のWebエンジニアか。なかなかない選択肢の狭間でいろいろ考え続けました。
そう思い悩んでいた時、所属している事業部の上司に「地元にいながら働くこともできるんじゃない?」と言ってもらったんです。 冷静に考えたら、場所で選択を狭めるのではなくて、自分で働き方をつくり出すこともできるよな、ガイアックスってそういう会社だよな、って思って。 ガイアックスという会社はいい意味でおかしくて、個人の人生を尊重しているところにめちゃくちゃ共感しているし、ガイアックスで働きながらでも地元で教育や地方創生に関わることができそうな気がするし、会社というよりコミュニティという側面が強くなってきていて、いっそガイアックスコミュニティに属して切磋琢磨する20代を過ごした方がいいことづくしなんじゃないかと思い、決断しました。
どうして広島なのか
そういえば、どうして地元に戻ろうとしているのか、あんまり書いていなかったですね。 結論から書くと、地方(まずは地元)の若者の将来の選択肢を広げられる活動をしたいから、地元に残りたいと思っています。
私が学生時代取り組んでいた空き家プロジェクトは、少し前まではなかった取り組みで、30代前半の経験積まれてきた方々がUターン的に学校の教育改革に関わって、その一環で生まれたプロジェクトでした。自分はそれにすごく刺激を受けたんですよね。なんというか、10歳くらい年上の先輩って、距離感は近いけど、ひと回りもふた回りも豊富な経験をされていて、学びになることが多かったように思います。
今の30代くらいの活発な方と出会えたことで、自分の人生の選択の幅が広がったのは確かで、それを自分だけで止めたくないという気持ちがあります。
では高専の就活事情ってどうなのかというと、多くの人が「学校宛に求人出してくれたメーカーに入る」という、一本道を走っていく感じなんですよね。もちろん、それ自体が悪いとかいう話ではなく、別の選択肢もあるよねという話で。
最近こそ「高専マガジン」のようなメディアも出てきて、少しずつ選択肢の広がりが感じられる世の中に移っていっているように感じます。
同じように私も、広島にいながら東京の会社に勤めるという、今まであまり見られなかった働き方を体現することで、いろんな選択肢があるってことを後輩たちが感じてくれて、一人ひとりの生き方を探していってくれたら嬉しいな、と思っています。 これからも定期的に地元に関わって、学生とななめの関係をつくっていくことで、教育面で貢献しながら学びを巻き起こすことができたらいいなと思っています。
というわけで、6月からは広島に戻り、広島を拠点に新しい活動を始めていきます!
早速、会社巻き込んで広島で「スタートアップ起業ワークショップ in Hiroshima」という学生向けのイベントを開催することになりました。
hiroshima2019.gaiaxstartup.studio
新しい未来を創りたい人が集まり、アイディア作りから事業化までを実現する起業ワークショップです。ガイアックスで新規事業創出のビジネスとエンジニアリングを担う社員がサポートするので、ビジネスとか起業とか、未経験でも大丈夫! 応募締め切りは2019/6/26(水)です! ぜひ気軽に応募してくださいね〜!
CyberRebeatCTFに参加したのでwrite-up
先日、SECCON Beginner Hiroshima に参加しまして、初めてCTFやってみたのですが、これが面白くってオンラインの大会に出てみたよ。という話です。 後輩のguriと出場しましたが、大半は彼が解いてくれました。すごい!
tl;dr
壊滅的でした。
Binary
SimpleBinary
SimpleBinaryファイルが配られる。 実行権限与えるも、
$ ./SimpleBinary
応答なし。 stringsかけてもヒントはなさそうだったので逆アセンブルかける。 それっぽい関数を見つけるも、そもそもアセンブリが読めず断念。
Binaryクリアするにはちゃんとアセンブリ読んで編集してってできないとダメだね。
crackme
未着手。
f31337
未着手。
Crypto
Rotation
P4P6S{9RN4RUNPXR45}
を解読する。
ローテーションというからrot13だったり、いろんな文字数ズラすも解読できずパス。
FLAG.encrypted
未着手。
Signature
未着手。
Exercise
Exercise
CRCTF{CyberRebeatCTF}
Misc
Readme
が配布される。
どっかで見たことあると思ったらこれか。 www.ebook5.net
一旦パスしてあとで解こうと思ったらチームメンバーに解かれてました。
Opening Movie
url先の動画を300回再生しろという問題。
startを押すと爆音でオープニングムービーが流れる。驚く。
動画再生中にstart押すと「Now Playing...」とalertかかって言うことを聞かない。
BeautifulSoupでスクレイピングしようかと思うも、これAjaxかなにかで動的に動画ファイル取得して埋め込んでいるから、BeautifulSoup使えないことが判明。 Selenium使ったことないけど1時間位格闘して諦めた。こりゃ悔しい。頑張って5回位手動でstart押したけど、悔しいこりゃ。
Programming
Calculation
ncコマンドで指定されたip叩くと計算式が返されるので答えていく。
$ nc 59.106.212.75 8080 69 - 98 + 34 - 65 - 88 0 Wrong!
これを30問くらい出題される。
Pythonで演算子をパースして計算するスクリプト書いたものの、ncコマンドからパイプで値渡せるわけじゃないのね。
しょうがなくコピペでPythonに投げる。
コマンドに直接流し込めば計算もしてくれるが、 pyperclip
モジュールを使えば、実行結果を自動的にクリップボードに保存するなんてこともできるので、ちょっとは楽になる。
後日談的な話ですが、Pythonでncコマンド叩けるスクリプトが公開されていました。
これ使えばよかった…
Prime Factor
Calculationと同様、ncコマンドで最大素因数を答える問題。 強引にPythonに投げましたが、単純なアルゴリズムだと桁数増えると計算に時間かかりすぎてしまうので、sympyを使う。
import sympy def max_prime(n): return max(sympy.factorint(n).keys()) max_prime(542778378564)
ちなみに実行するときはローカルでもよかったけど、Colaboratoryを使った。
https://colab.research.google.com/
最初っから数学系のパッケージがインストールされているのでimportするだけでいいし、手軽にGPU使えるのでスクラッチするのに良いと思ってる。
Visual Novels
余裕があれば解こうと思ったが結局パスした。
Recon
Tweet
未着手。
CyberRebeatScripts
未着手。
ChangeHistory
これに一番時間をかけたかもしれない。そして解けなかった問題。 GitHubのリポジトリ内にFLAGが隠されているらしい。
closedのissueを見ると、間違ってコミットしたとの記述があった。
コミット番号が書いてあるものの、git logで見れるわけでもない。 メルカリのエンジニアブログの記事を参考に、commit番号生成のロジックを学ぶ。
FLAGがどこに隠れているか、自分はコミットメッセージに含まれていると睨んだ(のが間違いだったか)。 ブルートフォースでコミット情報を復元できそうと思い、hashcat導入するも時間切れ。 hashcatも文字数が把握できてると効率よく当てれるらしいけど、今回は文字数不明だったのでうまくいかず、断念。
Stegano
Secret.pdf
コピペ
Alpha
未着手
Last 5 boxes
未着手
Trivia
Monero
未着手
Crossword
未着手。
Web
White page
http://hidden-field.cyberrebeat.adctf.online/index.php id:Hiro password:LittleGarden
とのことだた入力フォームは表示されず。styleでhiddenがかかってるので、インスペクターから直接styleを修正してあげて入力する。
<form action="index.php" method="post"> <input type="text" name="id" style="visibility:hidden"> <input type="text" name="password" style="visibility:hidden"> <button>LOGIN</button> </form>
これ最初どうやっても解けんなと思ったら、問題文のidがHeroになってました。いつの間にか訂正されたみたいです。ヒーロー。
Let's Tweet!
ハッシュタグ付きでツイートしたURLを送るフォームがあり、送信するもdbの権限周りで弾かれ断念。
Uploader
未着手
あとがき
Beginnerあがりたてにはちょっと難しかった。ただ時間はあるので、じっくり調査できて勉強になりました。
WindowsマシンとLinuxマシンもちゃんと用意するべきでしたね…
あと、write-up書くときのために、逐一キャプチャしておけばよかったですね。 次回からはそうしよう。
お疲れ様でした。
おにぎりくんbotの誕生、繁栄、そして死 その2
この記事は呉高専エンジニア勉強会 Advent Calendar 2017 25日目の記事になります。
🍙🍙🍙🍙🍙🍙🍙🍙🍙🍙🍙🍙🍙🍙🍙🍙🍘🍙🍙🍙🍙
こんにちは、ちゃんゆーです。
AdventCalendarの1日目でおにぎりくんbotの誕生、繁栄、そして死という記事を書きましたが、その後日談です。
稼働後のおにぎりくん
おにぎりくん死亡
しばらく無事にTrelloの通知を送ってくれていましたが、ある時から通知が送られなくなってしまっていました。
Herokuにデプロイしていたのですが、調べてみるとFreeの時間枠を消費しきっていたみたいです。
おにぎりくん復活
すぐにおにぎりくんをAWSに移行しました。これで無事に通知してくれるようになりました。
おにぎりくんゾンビ化
するとある時から二重で通知が!
どうやら月が変わってHerokuの制限が解除されて、おにぎりくんが復活したようです。HerokuとAWSの二重稼働になってしまっていて、2回もダブって発言していたようです。
ゾンビとなったHerokuのonigiriを殺して、解決しました。
LINEからSlackへの移行
ところがどっこい、2017/11/17にSlackが日本語対応したとのことで、チームのやり取りもSlackへ移行しました。
Trello関係はすべて Trello Alert
におまかせすることにしたので、おにぎりくんの役目は終わったのでした。
ただせっかくなので、デプロイ完了通知のWebhookに登録して、今も別の形で生きてくれています。
まとめ
ありがとうおにぎりくん。
これからもよろしくね。