エンジニアの仕事をなるべくわかりやすく書いてみる

自分は2018年から2020年3月まで大学院で2年間情報学を勉強・研究してエンジニアリングに触れ、2020年4月からはヤフー株式会社で新卒として企業でのエンジニアリングを学びました。2021年5月から株式会社グラファーに転職して、今現在”スマート申請”という製品のエンジニアとして働いています。 しかし、一口にエンジニアといってもやってていることはバラバラで、エンジニア同士であっても何してるかは見えてこないのに、ましてやエンジニアでない人は本当に何してるか想像もつかないと思います。 そこで、なるべくエンジニアでない人でもわかるように自分が毎日どんな仕事をしているか説明してみようと思います。 ちなみにスマート申請って何 オンラインで行政手続きが完結できるようにする製品です。一般的なwebフォームに必要な情報を入力して送信するだけで申請が完結します。 ざっくり何してるの 基本的にはユーザーがかかえている課題に対して、課題を解決する方法を提供することが自分の仕事です。こんなもの作って欲しいみたいな設計書が上司から渡されて、スケジュールに間に合うようにそれ通りになんか作っているわけではないです。 最初にすること まず、ユーザーがどんな課題を持っているのかを特定します。 過去に自分が取り組んだ内容を噛み砕いたものが、”申請者に必要な入力項目だけ表示してほしい”というものでした。 しかし、”必要な入力項目だけ表示してほしい”というのは機能要望であって、課題ではありません。 “なぜ必要な入力項目だけ表示したいのか?”という問いから、”項目いっぱいあったら読むのに負担がかかるから”のように課題の形に変換し、”なぜいっぱいあったら負担がかかるのか?”のように課題をどんどん深掘っていきます。 その過程で、エンジニアの自分がユーザーにインタビューすることもありますし、ユーザーに近いビジネスのメンバーとディスカッションすることもあります。 結論、”必要かどうか判断する認知コストがかかる”というのが課題と判断しました。 課題の深掘り 課題を深堀りして特定できれば、それが解決できる方法を考えて、その課題を解決できるような機能要求に落とし込んでいきます。 先程の”必要かどうか判断する認知コストがかかる”の課題に対する要求としては、”不必要な入力項目は隠せるようにすること”のような形になります。 この機能要求で課題が解決されるかを確認します。 必要かどうかの判断を申請フォームが行って不必要なものを隠してくれたら、認知コストの課題は解決されそうですね。 いざ開発 要求を洗い出して要求を満たすことで課題が解決できると確認できたら、実際に開発を行って行きます。ここからがエンジニア以外の方に説明するのが難しいのですが。。。 エクセルで関数を使ったことがある方ならば、”SUMというエクセルの関数を使って、複数のセルの合計する”という要求を満たすことができると思います。 SUMの使用例 そんな感じで、”JavaScriptというプログラミング言語を使って、その項目が不必要であれば隠す”という要求を満たします。 エクセルだと最終的に式が出来上がりますが、プログラミングだと最終的にソースコードが出来上がります。 開発できたことをテストで証明 まだまだやることはたくさんあります。次にテストを書きます。 エクセルでsumを使って合計を計算するときも、ちゃんと合計が計算されるようになっているか確かめるために、セルにいろんな数字を入力すると思います。 300から100に変更 合計が800から600に変わる 同じことをエンジニアも行います。フォームにいろんな入力をしてみて、不必要と判断される場合にちゃんと隠れるのを確認します。 しかし、エンジニアはここで飽き足らずこれが自動的に確かめられるようにします。それがテストコードと呼ばれるものです。 テストコードを作ってそのコードを実行すると、必要な項目は表示されるし不必要な項目は表示されないことが自動的に確かめられます。ソースコードがちゃんと動く証明書がテストコードです。 ソースコードを組み合わせる 手元のPCで作って正しく動くことが確かめられても、ユーザーの課題は解決されません。ユーザーの方が触る申請フォームにこの機能を取り入れねばなりません。 パワポを複数人で編集したことがある人はわかると思うのですが、最新版だと思って自分の編集を取り入れてみたら、実は古いバージョンで、他の人の変更が反映されてなかった!みたいなことがあると思います。 エンジニアも複数人でソースコードを編集するのでこれが起こることは必死です。 そこでエンジニアはgitというバージョン管理ツールを使って、間違って古いバージョンが入らないようにします。 いざユーザーの手に 最後にユーザーに手が届くところにソースコードを持っていきます。 サーバーと言ってどんなふうに解釈されるか想像もつかないのですが、みなさんがスマートフォンでアクセスする先には必ずサーバーがあります。ここにアクセスしてもらってユーザーは申請フォームを見ることができます。 ですので、そのサーバーにあったソースコードを最新版のソースコードに入れ替えてあげることでやっとユーザーに機能が届きました🎉 ユーザーに機能を届けることを私たちはリリースと呼びます。 機能のリリース≠課題の解決 課題が解決されるように機能要求を考えて開発はしたのですが、実際に機能をリリースすることで課題が必ず解決されるとは限りません。実際にリリースした機能を使ってもらったユーザーの課題が解決されることを確認するまでがエンジニアの仕事です。課題が解決されていなければ、なぜ解決されていないかさらなる深掘りを行って、製品で解決できるものでれば改善を行いつづけます。 まとめ 自分も大学院に入るまではエンジニアリングの仕事が実際何をするのか全く分かっていなかったのですが、4年たってやっと1人前のエンジニアとして働けるようになってきたと感じています。 製品を作るエンジニアリングはこのような仕事かなと思うのですが、それ以外にもやらなければいけないことはたくさんあって、詳しくなった時に紹介できるような記事を書こうと思います!

March 22, 2022 · 1 min

2021年4月をもって転職する話

会社を評価するものではなく, 自分がどういう状況なのかを説明するためのものです。 マネジメントコンソールの開発 2020年4月から入社して研修が終わった後, 6月中旬から社内ツール開発のチームに配属されました。 社内ツールと言っても100以上のツールがあります。しかし, 各ツールのチームがそれぞれにUIを開発するため, サービスを開発するエンジニアは使いたいツールに辿り着くことが難しく, また横断的に使えないことが問題でした。 そこで, 社内のあらゆるツールを簡単に横断的に使えるUIを提供するのが我々のチームのミッションです。大袈裟に言ってみればAWSマネジメントコンソールの社内版を作るようなもので, 非常にやりがいのあるプロジェクトです。 幅広いスキルの獲得 このチームでの開発を通して非常に多くのスキルを身につけることができました。 Angular + TypescriptでのUI開発 Node + Express + TypescriptでのAPI開発 Nginxを使ったProxyの設定 ChefやKubernetesを使った構成管理 Open IDを使った認証周りの設計 スクラムやLeanでの開発 Unit, Integration, E2Eテストの作成 システム監視の設定 デザインシステムを使ったWD こんなにも多くの技術スタックに触れるのは本当に幸運だと思います。 Gov-techへの興味 いま思い返せば, 自分はWebサービスによって便利になることに目がありませんでした。高校のころは, リリース当初のLINEを使って夏休みの課題を共有したり, iPod touchを使って漫画を読むのにDropboxを活用していました。他にも, 自分たちの代の文化祭のソーラン動画をYoutubeにアップロードしたりもしていて, 毎年再生回数を稼がせていただいております。 そんな性だからこそ, 行政サービスが不便なことに対して不満を抱いてしまいます…マイナンバーカードが発行された当時, このカードでいろんな手続きが簡単にできるようになる未来にわくわくしていたのですが, 生憎コロナ禍での給付金の手続きすら電子署名の失効によりできませんでした。 前回のブログでエストニアに関する本をいくつか挙げました。日本がエストニアのように個人情報を安全にかつ使いやすい形で管理して, 民間企業がそれを活かせる様になって欲しいと思っています。 偶然の出逢い ここから前々回のブログの続きになります。 threeで出会った方がVCで働いておられたのでGov-tech領域の会社がないか聞いたところ, あるスタートアップ企業を紹介していただきました。 総務省で働いている先輩がいたので, 先輩にその会社のことを聞いてみたところ, タイミングよくその会社の方とお会いする機会に同席させていただきました。 その方にいろんなお話を伺っていくうちに仕事に魅力を感じて, 副業として働かせてもらえないかとお願いしたところ, 面接を経てインターンという形でお仕事をさせていただくことになりました。 転職を決心 インターンを終えてオファーをいただきたくさんの方と相談させていただいた結果, 4月末をもって今の会社を退職し, 5月から新しい会社で働くことに決めました。 今の会社はエンジニアを大事にする会社ですし, 最近盛り上がっていますし, 働き方も柔軟で, プロダクトも好きで, 楽しいチームだったので正直かなり迷いました。新卒1年目でまだまだ修行するつもりだったという思いもありました。 いろんな要素を比較検討しましたが, 最終的に自分がやりたいことかつ自分がやったほうがいいことという基準で判断しました。 関わってくださった方へ 今回の転職するにあたってたくさんの人にお世話になりました。 ...

April 1, 2021 · 1 min

2020年度に読んだ本のまとめ

今年度はたくさん本を読んだので学生時代に読んだものも含めてまとめておく。 お金 改訂版 金持ち父さん 貧乏父さん:アメリカの金持ちが教えてくれるお金の哲学 金持ち父さんのキャッシュフロー・クワドラント : 経済的自由があなたのものになる 改訂版 金持ち父さんの若くして豊かに引退する方法 人助けが好きなあなたに贈る金持ち父さんのビジネススクールセカンドエディション 改訂版 金持ち父さんの起業する前に読む本: ビッグビジネスで成功するための10のレッスン 世の中には"金持ち"がいることはなんとなくわかっていたが, 金持ちがなぜ金持ちなのかがとてもよくわかる。ロバート・キヨサキほど貪欲に金持ちになりたいという思いはないけれど, お金の心配をしない自由な生活がしたいと思った。 みんなが欲しかった! FPの教科書 2級・AFP 2020-2021年 (みんなが欲しかった! シリーズ) みんなが欲しかった! FPの問題集 2級・AFP 2020-2021年 (みんなが欲しかった! シリーズ) 資金計画, 金融資産運用, タックスプランニング, 保険, 不動産, 相続・事業承継という分野に関して幅広くわかる。気がする。もともと疎い人が触りを学ぶ分にはちょうどよかった。次は簿記の勉強でもしようと思う。 生き方 LIFE SHIFT(ライフ・シフト) 人生100年時代において, 有形資産だけでなく無形資産の形成にも力を入れるべきだと主張している。 ワーク・シフト ─孤独と貧困から自由になる働き方の未来図<2025> 9年前の2012年に描かれているあと4年後の未来がとてもリアルで, “働く"ということについてとても考えさせられる。 ノマドライフ 好きな場所に住んで自由に働くために、やっておくべきこと 学生の頃からたくさん海外に行って社会人になってフルリモートで働いている自分にとっては、共感できるというか既に実践している部分が多かった。時間や場所の制約を取り払ってやりたいことに集中できる状態を常に意識したい。 下流老人 一億総老後崩壊の衝撃 社会保障や社会システムにより日本人の約9割が生活保護基準相当で暮らす高齢者になるという話。経済的に豊かで健康であることはもちろん大事だが、人間関係を大切にすることを見失わないようにしたい。 完訳 7つの習慣 人格主義の回復 非常に共感できる習慣だった。また読み直したい。 2022――これから10年、活躍できる人の条件 8年前にかかれたとは思えないほど世の中の流れを正確に言い当てている。2024年に会社という存在が形骸化するという話は、出社せず仕事をしている今とても納得感があり、枠組みに囚われない考え方を大事にしたい。日本の未来に期待を持たせてくれる内容で嬉しい。 ハイ・コンセプト「新しいこと」を考え出す人の時代 デザイン・物語・調和・共感・遊び心・生きがいの6つの感性に新しい時代を生きる鍵が隠されているという。2006年に出版された本でありながら情報化社会の次の時代に対する考え方として共感できる部分がたくさんあった。 君に友だちはいらない 京都大学産官学連携本部イノベーションマネジメントサイエンス研究部門客員准教授だった人の本。切磋琢磨は本当に大事だと思っているのですごく共感できた。 学びを結果に変えるアウトプット大全 ノウハウ本はあまり頭に入ってこない… ハック思考〜最短最速で世界が変わる方法論〜 もうちょっと深い話が欲しかった… IT みずほ銀行システム統合、苦闘の19年史 史上最大のITプロジェクト「3度目の正直」 自分の職業柄こんなプロジェクトよくやり遂げたなと思ってたのに, 最近また障害を起こしてて目眩がしそう。 シン・ニホン AI×データ時代における日本の再生と人材育成 お気に入りの本。自分は日本が好きなので死ぬまでにこういったビジョンが実現できていたらいいなと思う。 ...

March 23, 2021 · 2 min

コロナ第1世代入社からADDress生活を始めた流れ

しばらくブログを更新していなかったですが, エンジニアリング以外のことでちょっと書いてみます。非常に真面目なブログです。 社会人になる前の志 大学院を卒業してから早1年が経とうとしています。 私は大学時代6年間たくさんの出逢いに恵まれたおかげもありまして, 学問に注力することを怠ってたくさんの人と遊ぶことに全力を注いでいました。(遊ぶの定義は難しいのですが, 会話なり旅行なりテニスなり誰かと一緒に何かを楽しむことだと思っています) そんな身ですので, 2020年4月から社会人になった暁には東京に出て身を粉にして働くつもりでした。私はIT企業にエンジニアとして就職したので, 師匠とも呼べる様なエンジニアの方を見つけて模倣して1人前のエンジニアになることと, 同期の人と知り合って多くのコネクションを作ることが目標でした。 コロナ第1世代としてのスタート しかしいざ入社した最初の試練は仕事が忙しいとか難易度が高いなどではなく, コロナ第1世代としてリモートネイティブで働くことでした。 リモートワークのメリットデメリットは他のいろんなサイトにまとまっているので割愛するのですが, 自分としては前に述べた2つの目標がほぼ達成できない状態となってしまいました。質問したりレビューしてもらったりするもののペアプロなんかの共同作業は1画面でないと厳しいですし, 同期の友達でコミュニケーションを取るのは学生時代からの知り合いに止まっています。 と言いましてもご時世がご時世ですし嘆いていても仕方がないので, このフルリモート状況を逆手にとって何かできることはないかといろんなことを試しました。 いったん真面目に勉強 まずシンプルに勉学に励むことです。スキルアップに関することに関して会社から半年で6万円の手当がもらえたので, 技術書をたくさん読みました。詳しくは, 読書メーターにまとめていますのでよかったら見てください。 また, FP2級の試験を受けました。正直これを暗記しているだけでは何の役にも立たないと思うのですが, 将来不動産を運用したいだとか事業を持ってみたいという考えて勉強すると割と面白かったです。ゆっくり解いてたら6問くらい解く時間なかったのですが… あと漢検2級をいつか取ろうとしてます。漢字が割と好きです。 ここまで勉学に関しては1人で黙々とできるのでリモートワークとは非常に相性がいいのですが, 問題なのは人との出逢いです。そこで研究室の先輩から紹介してもらったthreeというこれは同世代3人でリモートランチするアプリを使ってみることにしました。 このサービスは1回だけしか利用していないのですが, ここで出会った2人に多大なる影響を受けました。 お金と人生に対する理解 まず, 出会った1人の方に読書会というものに招待していただきました。たぶんコロナが流行っていなかったら読書会って胡散臭そうとか思って敬遠したのですが, 興味本位で参加させてもらったところ案外ハマってしまいました。 その中でたくさんの面白い本を紹介していただいて, 今年度は技術書も合わせて50冊くらい本を読みました。こちらも読書メーターにまとめていますのでよかったら見てください。 読書会のほかにも, お金や経済に関する勉強会なんかにも参加させてもらいました。FPを勉強していた時期と重なっていたこともあってとても刺激を受けて, 将来生活費を賄えるだけの収入を得つつ自分がやりたいかつ自分がやるべきことをやりたいと思える様になりました。 キャッシュフローゲームという不労所得を作り上げるゲームをプレイする勉強会もとても面白くて, 安く手に入ったらまた知り合いとやりたいなーと思っています。 ADDress生活のスタート ここから話は分岐してこれもまた巡り合わせなのですが, threeで出会ったもう1人に紹介していただいてADDressというサービスに出逢いました。 どんなサービスかはサイトをみてもらえばわかると思いますが, 要するに定額全国住み放題のサービスです。住む場所というのはその人にかなり大きな影響を与えると思っていて, いろんな場所に住む経験をしてみたいというのが大きな動機です。 今日始めたばかりで仕事が成り立つかどうかわからないのでいざという時に東京に戻れる様に, 第1週は北鎌倉, 第2週は習志野に住んでみてみよと思います。 以下, 今日から住む北鎌倉の拠点の様子です。 部屋の様子。koalaマットレス。 共用スペース。ここで仕事します。 第3週は卒業生に会えるかなという狙いもあって京都に行こうと思っています。Social Distanceを保ちつつ是非お会いしましょう。 最後に こんなに書いたのですが, threeで出会ったもう1人の方から受けたもう1つの大きな変化もありまして, またの機会に書かせていただこうと思います。最後まで読んでくださってありがとうございました!

February 28, 2021 · 1 min

マイクロサービスアーキテクチャ

O`REILLY発行の マイクロサービスアーキテクチャ を読んだのでその内容を軽くまとめる。 以下の記事を参考にした。 書籍「マイクロサービスアーキテクチャ」まとめ(前編) 書籍「マイクロサービスアーキテクチャ」まとめ(後編) 要点 1章 マイクロサービス マイクロサービスとは マイクロサービスとは, 協調して動作する小規模で自律的なサービス。DDD(ドメイン駆動設計), CI・CD(継続的インテグレーション・デリバリ), インフラ仮想化, 自動化, アジャイル開発といったさまざまな分野から生まれたものでありこれらを総合的に実践する必要がある。 以下がマイクロサービスの利点である。 技術異質性…サービスごとに異なる技術を使うことができる 回復性(レジリエンス)…障害のあるコンポーネントを切り離せる スケーリング…必要なサービスのみスケーリング デプロイの容易性…必要なサービスのみデプロイ 組織面の一致…アーキテクチャと組織を一致させる 合成可能性…再利用することができる 交換可能にするための最適化…2週間程度で作り直せる マイクロサービス以外の分解テクニック 共有ライブラリ モジュール 2章 進化的アーキテクト マイクロサービスのアーキテクトは建築士(アーキテクト)というより都市計画家(アーバンプランナー)であり, あらゆる不測の事態に備えて計画するのではなく, 可能性が低いことを必要以上に指定したい衝動を避けて, 変化を許容するように計画する。 以下が進化的アーキテクトの主な責務とされている。 ビジョン…システムが顧客や組織の要件を満たすのを助けるシステムの技術ビジョンを, 明確に伝えるようにする 共感…顧客や同僚に対する自分の判断の影響を理解する 協調…できるだけ多くの仲間や同僚と関わり, ビジョンの定義, 改良, 実行に役立てる 適応性…顧客や組織の要求により技術ビジョンを変更する 自律性…チームに対して標準化と自律性の実現との間の適切なバランスを見出す ガバナンス…実装しているシステムを技術ビジョンに合わせる 3章 サービスのモデル化方法 以下が優れたマイクロサービスを設計するのに必要な性質 疎結合性…連携するサービスに関して必要最低限のことだけしか把握しないようにする 高凝縮性…関連する振る舞いを1箇所にまとめておく 4章 統合 データベースの共有によるサービスの連携は, かんたんではあるが疎結合性と高凝縮性の両方を失うことになり, マイクロサービスを採用する意味がなくなる。 コレオグラフィ サービス間の通信プロトコルとしては, リクエスト/レスポンスとイベントベースがある。前者では, HTTP + RESTをデフォルトの選択肢とする。後者では, あるサービスがイベントを発行して他のサービスが受信するための基板が必要になる。 複数のサービスによって一つの処理が構成される場合の制御方法としては, オーケストレーションとコレオグラフィがある。前者は基点となるサービスが他のサービスをリクエスト/レスポンスで呼び出し, 処理全体のフローを制御する。コレオグラフィでは, 基点となるサービスがイベントベースでイベントを発行して, 他のサービスがそれを受信して個々に処理を行う。 マイクロサービスの原則を満たすためには, コレオグラフィによる連携を模索すべき。 そのためには, 一連のイベントの最初にユニークな相関IDを発番して, イベントに乗せて伝搬させなければならない。 ...

December 10, 2020 · 2 min

認証・認可のしくみとフロー(FIDO, OAuth, SAML)

業務にてOpen ID Connect(OIDC)を使った認証の仕組みを作ったが, いまだにOIDCがどういったものであるかを理解しないままだった。 そんな中, Software Design 2020年11月号にて認証・認可が取り上げられていたので, その中でOIDCについて詳しく書かれていた第2章ついてまとめる。 第2章 認証・認可のしくみとフロー ~ FIDOからOAuth, SAMLまで一挙に解説 ~ ソーシャルログイン 外部のソーシャルネットワークサービス(Facebook, Twitterなど)を使って認証を行い, その結果をもって対象のWebサービスの認可を行う仕組み。対象のWebサービス側のID管理データベースへの新規登録を大幅に簡素化することができる。 Fast IDentity Online (FIDO) 生体認証を中心とする新しいオンライン認証技術。その名のとおり, 高速なオンライン認証を実現する。WebサービスではなくFIDO認証サーバで認証処理を行う。 Open Authorization (OAuth) アプリ(Oauthクライアント)がユーザーの代わりにAPI(リソース)にアクセスすることを許す(権限移譲する)認可フレームワーク。これによって, Facebookにログイン(認証)したあとは, Instagramも利用(APIアクセスを認可)できるようになり, パスワードをサービスごとに設定・送信する手間から開放される。 OAuth 2.0 以下の点がOAuth 1.0と異なる。 Webサービスだけでなくスマホアプリも対象 アクセストークンを受け渡す仕組みを改善 HTTPSが必須 以下の4種類の認可フローが用意されている。比較的よく使われるのがAuthorization Code Grant。 以下がOAuth 2.0の仕組みである。スマホアプリは, 認可サーバの「認可エンドポイント」から認可コードを発行してもらう。次に, スマホアプリはアクセストークンを発行してもらうために, HTTPリクエストのペイロード部分に「grant_type=authorization_code&code=<認可コード>」という形で認可コードを入れ, 認可サーバの「トークンエンドポイント」に提出する。こうして取得したアクセストークンをHTTPリクエストのヘッダ部分などに「Authorization: Bearer <アクセストークン>」のように入れ, APIに提出する。 あくまで認可のしくみであり, 認証のしくみについては定義されていない。 リフレッシュトークン アクセストークンを更新するためのトークン。 Webサービスは認証・認可のあと, HTTP Cookieによってユーザーを特定しているが, APIはトークンによって実行権限の有無を判定する。このトークンに, アクセストークンとリフレッシュトークンが含まれている。 OpenID Connect (OIDC) 認証結果を含むアイデンティティ情報も受け渡しできるようにOAuth 2.0を拡張したプロトコル。認証結果を含むアイデンティティ情報を「IDトークン」に入れて受け渡す。 アイデンティティ情報とはユーザーの属性情報や認証した日時などの情報であり, これをAPI側が確認できるようになる。 ...

November 24, 2020 · 1 min

AWS認定 ソリューションアーキテクト[アソシエイト]

会社での社内ツールを開発する際にAWSを参考にすることが多いので, AWS認定 ソリューションアーキテクト[アソシエイト] という本を使って一通り勉強してみた。 内容 VPC (Virtual Private Cloud) 利用者ごとのプライベートなネットワークを作成できる。セキュリティグループやネットワークACL(Access Control List)を使って通信制御を行う。 CloundFront HTMLファイルやCSS, 画像, 動画といった静的コンテンツをキャッシュし, オリジンサーバーの代わりに配信するCDN(Contents Delivery Network)サービス。ELBやEC2だけでなくS3をオリジンサーバにすることもできる。 Route53 ドメイン管理機能と権威DNS機能を持つサービス。以下のような自由なトラフィックルーティングが可能 シンプルルーティング フェイルオーバールーティング 位置情報ルーティング 地理的近接性ルーティング レイテンシールーティング 複数値回答ルーティング 加重ルーティング EC2 (Elastic Compute Cloud) 仮想サーバーを必要な数だけすぐに立てることができるIaaS型サービス。AMI(Amazon Machine Image)を選んでインスタンスを生成する。スポットインスタンスというAWSが余らせているEC2リソースを入札形式で安く利用する方式なんかもある。 ELB (Elastic Load Balancing) ロードバランサーを提供するサービス。Auto Scalingという, システムの利用状況に応じて自動的にELBに紐づくインスタンスの台数を増減させる機能がある。 ECS (Elastic Container Service) Dockerコンテナの実行環境を提供するサービス。 AWS Fargate ECSのCluster用のEC2インスタンスを使わずにコンテナを動かすことのできるサービス。 EKS (Elastic Container Service for Kubernetes) Kubernetesを利用する際のmasterを提供するサービス。 ECR (Elastic Container Registry) コンテナイメージを管理するレジストリを提供するサービス。 Lambda サーバーを用意しなくてもプログラムを実行できる環境を提供するサービス。 CloudWatch 定期的にAWSリソースの状態を取得し, 問題がある場合はそれを運用者に通知するサービス。CPU使用率などの基本的なログをモニタリングするだけでなく, CloudWatch Logsを使ってアプリケーションログをモニタリングしたり, CloudWatch Eventsを使って独自のトリガーと何かしらの後続のアクションとの組み合わせを定義したりできる。 ...

November 15, 2020 · 1 min

競プロ勉強会 第2回

今回から新たに電電時代の学友Rくんも参加してくれました! 何回も一緒に定期テスト解いてるので知っていたのですが, さすがの賢さでした… CODE FESTIVAL 2015 予選A D 壊れた電車 今までと同じようにチェック関数を用意してから二分探索を行う問題。p = max(minute - dist *2, (minute - dist)/2) + x[i] + 1;のところで詰まってました… int n, m; int x[100010]; bool isCheck(LL minute) { LL p = 0; REP(i, m) { int dist = x[i] - p; if (dist > minute) { return false; } else if (dist> 0) { p = max(minute - dist *2, (minute - dist)/2) + x[i] + 1; } else { p = max(p, x[i] + minute + 1); } } return p >= n; } int main(int argc, char *argv[]) { cin >> n >> m; REP(i, m) { cin >> x[i]; x[i]--; } LL left = 0; LL right = n * 2; LL mid; while (right - left > 1) { mid = (right + left) / 2; if (isCheck(mid)) { right = mid; } else { left = mid; } } if (isCheck(left)) { cout << left << endl; } else { cout << right << endl; } return 0; } ```cpp ### [ARC 060 C 高橋君とカード](https://atcoder.jp/contests/arc060/tasks/arc060_a) 全探索すればいけた問題。いろいろ小難しいことを考えがちだが, まず全探索や貪欲法を考えてそっからチューニングしていくべきだと思った。けど、これ一瞬で書いてるFさんには一生届かない気もしてます。 ```cpp int n, a; int x[51]; int main(int argc, const char *argv[]) { cin >> n >> a; REP(i, n) { cin >> x[i]; x[i] -= a; } map<LL, LL> m; m[0] = 1; REP(i, n) { map<LL, LL> mTmp = m; REPI(it, mTmp) { m[it->first + x[i]] += it->second; } } cout << m[0] - 1 << endl; return 0; } ```cpp

May 29, 2020 · 2 min

競プロ勉強会 第1回

先週やった第1回のことをメモっときます。 JOI 2007 本選 C ダーツ ダーツやのに4回投げる問題。ここで2回なげる結果を全て記録して, その要素の組み合わせを二分探索で考えて3回っぽくする感動的な解法。 upper_boundとlower_boundの違いを履き違えていたが, upper_boundは探索したいkeyより大きいイテレータを返し, lower_boundは探索したいkey以上のイテレータを返す。 int n, m; int p[100000002]; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> p[i]; } vector<int> v; for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { v.push_back(p[i] + p[j]); } } int ans = 0; sort(v.begin(), v.end()); int vMax = *(v.end() - 1); for (int i = 0; i < v.size(); i++) { int nokori = min(m - v[i], vMax); if(nokori < 0) break; auto it = upper_bound(v.begin(), v.end(), nokori); int sum = *(it - 1) + v[i]; ans = max(ans, sum); } cout << ans << endl; return 0; } ```cpp ### [ABC 023 D 射撃王](https://atcoder.jp/contests/abc023/tasks/abc023_d) いける高度を二分探索する。mid, left, rightを使って二分探索を書く方法でバグらせまくったので, `while(right - left) { mid = (right + left) / 2; ...`をテンプレとして使っていきたい。 ```cpp LL n; LL h[100001], s[100001]; bool isok(LL x) { VI count(n); REP(i, n) { if (h[i] > x) { return false; } else { count[min(n - 1, (x - h[i]) / s[i])]++; } } REP(j, n - 1) { count[j + 1] += count[j]; } REP(j, n) { if (count[j] > j + 1) return false; } return true; } int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> h[i] >> s[i]; } LL inf = 1e18; LL right = inf; LL left = 0; LL middle; while (right - left > 1) { middle = (right + left) / 2; if (isok(middle)) { right = middle; } else { left = middle; } } if (isok(right)) { cout << right << endl; } else { cout << left << endl; } return 0; } ```cpp

May 27, 2020 · 2 min

SECCON beginners CTF 2020

研究室の人たちを誘って出場したんですが, 自分は一問も解けずにチームの人らがめっちゃ解いてくれました… 自分が解けなかった問題を先輩の解説やふるつきさんとやっていく気持ちさんのwriteupをみて, 復習します。 [Web] Spy # auth.calc_password_hash(salt, password) adds salt and performs stretching so many times. # You know, it's really secure... isn't it? :-) hashed_password = auth.calc_password_hash(app.SALT, password) if hashed_password != account.password: return render_template("index.html", message="Login failed, try again.", sec="{:.7f}".format(time.perf_counter()-t)) この最後の"{:.7f}".format(time.perf_counter()-t)がみそ。ハッシュ化は時間のかかる処理なので, 実行時間の違いによってDBにレコードが存在するかがわかる。 [Web] Tweetstore limit, ok := r.URL.Query()["limit"] if ok && (limit[0] != "") { sql += " limit " + strings.Split(limit[0], ";")[0] } SQLインジェクションってことはわかっただけで時間が解けた問題。最初UNION ALL句でpg_userを覗けば終わりだと思ったのだが, limit句の後ろでUNION ALL句をつけるにはselect文全体に()が必要らしい… 答えはlimit句内でサブクエリを使う方法。limitのクエリパラメータを(select ascii(substr(usename,1,1)) from pg_user limit 1 offset 1)みたいにすれば表示された件数がusenameの1文字目のasciiコードになる。めちゃCTFっぽい。 ...

May 25, 2020 · 1 min