GPT-4のスクリプト実行したら記事全部消えた

昨日に引き続きなんかGPT-4で遊ぼうとしたのですが、Wordpressにおいてソースコードが綺麗に表示されていないのがとても気になっていました。 WordPressでPrism.jsを使ってシンタックスハイライトを行う方法 これでやっていたのですが、クラスをいちいち指定するのがめんどくさいのです。 そこで、いい感じのプラグインないか聞いてみました。これは普通にGoogleに聞きました。ノウハウではなくこういった拾いものを探す時はやっぱりネットサーフィン。以下のサイトで https://re-inx.com/syntax-highlighter こやつに出会いました。 https://ja.wordpress.org/plugins/code-block-pro/ シンプルできれい 楽。 こやつに決めた。 が、全ての記事1つ1つこいつを当てていくのは大変。そこでChatGPT。 それは誰でも思いつくねんな〜 ほう。 おー、なんかいけそ〜〜〜 ここでGPT-4ちゃん召喚。 このスクリプトを実行する前に、以下の手順に従ってください。 1. このスクリプトをテキストエディタに貼り付け、`convert_code_blocks.sh`のような名前で保存します。 2. ターミナルを開き、スクリプトの保存場所に移動します。 3. `chmod +x convert_code_blocks.sh`を実行して、スクリプトに実行権限を付与します。 4. スクリプトを実行する前に、WordPressサイトのバックアップを作成します。 5. `./convert_code_blocks.sh`を実行して、スクリプトを実行します。 よーわからんけどいけるっしょ! と思って実行したら全部記事消えました。そこからはもうGPT-4の言うことは何も信じれず…全部Googleで調べてバックアップを復元しました。。。 まとめ 生成したコードを実行するときは気をつけましょう!!! ## USER ちなみにさっきのスクリプトで記事全部消えたからおこです ## ASSISTANT 大変申し訳ございません。指示されたスクリプトが問題を引き起こしたことをお詫び申し上げます。この状況を解決するために、以下のステップを試してみてください。 1. **バックアップから復元**: WordPressのバックアップがある場合は、バックアップから記事を復元することができます。これには、データベースのバックアップと、`wp-content`ディレクトリのバックアップが必要です。バックアップがある場合は、データベースとファイルを復元して、記事を回復することができます。 2. **リビジョンをチェック**: WordPressは、記事の各バージョンをリビジョンとして保存しています。記事が完全に削除されていない場合、以前のリビジョンを使用して記事を復元できることがあります。これには、WordPressの管理画面から、編集画面にアクセスし、「リビジョン」ボックスをチェックして、以前のバージョンを選択する必要があります。 3. **キャッシュやバックアッププラグインを確認**: キャッシュプラグインやバックアッププラグインを使用している場合は、これらのプラグインが保存しているデータを確認して、記事を復元できるかどうかを確認してください。 今後のトラブルを避けるために、以下の注意点をお勧めします。 - 実行する前に、スクリプトやコマンドの内容をよく理解しておくことが重要です。 - 開発環境やステージング環境でスクリプトやコマンドをテストしてから本番環境で実行することをお勧めします。 - 定期的にバックアップを取得し、適切な場所に保管しておくことが重要です。これにより、データが失われた場合でも復元できるようになります。 再度、問題が発生したことに対してお詫び申し上げます。今後のトラブルを避けるために、これらのアドバイスに従っていただければと思います。 だそうです😠

April 17, 2023 · 1 min

ChatGPTでテトリス作ってみた

お久しぶりです。前回投稿が2022-08-15なので、サボりすぎですね… 情報のインプットは好奇心から頑張れるというか知識を得るのが楽しいのでやるんですが、情報のアウトプットって既に知っている知識を使うことなので気が進まないものですよね…定着させるには大事なんですが、特に定着させるモチベーションもなく… ただ、やっとそのアウトプットを勝手にやってくれる時代がやってきました。そうChatGPTです。こやつにコンテンツを作ってもらう取り組みがどれくらい続くかチャレンジをやってみようと思い、ChatGTP Plus課金しちゃいました! こやつを使って今日はテトリス作っちゃいます! 完成形 テトリスって、どんなブロックがあってどういうふうに回転してどこで壁にぶつかってとか、まじめに実装すると考えることいっぱいあるのですが、そんなことを考えずに一瞬で作ってくれました。天才です。 が、それを作ってから手直ししていく過程が大変だったので、会話の過程をご覧いただけたらと思います。 会話highlight 一瞬でコード書けるスーパーエンジニア ## USER # 命令書: あなたはフロントエンドエンジニアです。 以下の制約条件と入力文をもとにゲームのソースコードを出力してください。 # 制約条件: * HTML、CSS、Javascriptのみで動く # 入力文: テトリス # 出力文: 深津式プロンプト(https://chatgpt-lab.com/n/ne1643b7f10e6)を使ってみようとしたのですが、大して制約条件を書くことなく出力しちゃいました。 index.html を作って動かしたらこれ もうエンジニアいらんやん… すぐ解決策に走る初心者エンジニア なんか右の画面いっぱいまでブロックが動かせなくて質問するのですが… これやっても直りませんでした。どこが問題かを分析せず解決策に走る初心者エンジニアみたいです。でも、根気よく質問すると… ちゃんとうごきました! 「コード見せて」といってくるベテランエンジニア 「次のブロックを表示」という機能追加もちょっとバグっていて、いろいろ質問して直そうとしたのですが なかなか直らないとみたやコード全体を要求してきました。今度はこっちがなかなかバグを治せない初心者エンジニアみたいです… かわいい 最後にお礼にコードレビューしてみると…? GPT-4の使用上限にひっかかって、GPT-3.5になりました。。。コンテキストをちゃんと解釈してくれてない回答感ありますよね…KY… ChatGPTと喋った内容 Takaaki # 命令書: あなたはフロントエンドエンジニアです。 以下の制約条件と入力文をもとにゲームのソースコードを出力してください。 # 制約条件: * HTML、CSS、Javascriptのみで動く # 入力文: テトリス # 出力文: ChatGPT 以下は、HTML、CSS、Javascriptを使用してテトリスゲームを実装するための簡単なソースコードです。このコードをhtmlファイルにコピーして実行することができます。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>テトリス</title> <style> body { font-family: Arial, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; } canvas { border: 1px solid #000; } </style> </head> <body> <canvas id="game" width="320" height="640"></canvas> <script> const canvas = document.getElementById("game"); const context = canvas.getContext("2d"); const scale = 20; context.scale(scale, scale); const arenaSweep = () => { outer: for (let y = arena.length - 1; y > 0; y--) { for (let x = 0; x < arena[y].length; x++) { if (!arena[y][x]) { continue outer; } } const row = arena.splice(y, 1)[0].fill(0); arena.unshift(row); ++y; } }; const collide = (arena, player) => { const [m, o] = [player.matrix, player.pos]; for (let y = 0; y < m.length; ++y) { for (let x = 0; x < m[y].length; ++x) { if (m[y][x] && (arena[y + o.y] && arena[y + o.y][x + o.x]) !== 0) { return true; } } } return false; }; const createMatrix = (w, h) => { const matrix = []; while (h--) { matrix.push(new Array(w).fill(0)); } return matrix; }; const draw = () => { context.fillStyle = "#000"; context.fillRect(0, 0, canvas.width, canvas.height); drawMatrix(arena, { x: 0, y: 0 }); drawMatrix(player.matrix, player.pos); }; const drawMatrix = (matrix, offset) => { matrix.forEach((row, y) => { row.forEach((value, x) => { if (value) { context.fillStyle = "red"; context.fillRect(x + offset.x, y + offset.y, 1, 1); } }); }); }; const merge = (arena, player) => { player.matrix.forEach((row, y) => { row.forEach((value, x) => { if (value) { arena[y + player.pos.y][x + player.pos.x] = value; } }); }); }; const playerDrop = () => { player.pos.y++; if (collide(arena, player)) { player.pos.y--; merge(arena, player); playerReset(); arenaSweep(); } dropCounter = 0; }; const playerMove = (offset) => { player.pos.x += offset; if (collide( #### Takaaki 続けてください #### ChatGPT arena, player)) { player.pos.x -= offset; } }; const playerReset = () => { const pieces = "TJLOSZI"; player.matrix = createPiece(pieces[(pieces.length * Math.random()) | 0]); player.pos.y = 0; player.pos.x = ((arena[0].length / 2) | 0) - ((player.matrix[0].length / 2) | 0); if (collide(arena, player)) { arena.forEach(row => row.fill(0)); alert("ゲームオーバー"); } }; const playerRotate = (dir) => { const pos = player.pos.x; let offset = 1; rotate(player.matrix, dir); while (collide(arena, player)) { player.pos.x += offset; offset = -(offset + (offset > 0 ? 1 : -1)); if (offset > player.matrix[0].length) { rotate(player.matrix, -dir); player.pos.x = pos; return; } } }; const rotate = (matrix, dir) => { for (let y = 0; y < matrix.length; ++y) { for (let x = 0; x < y; ++x) { [matrix[x][y], matrix[y][x]] = [matrix[y][x], matrix[x][y]]; } } if (dir > 0) { matrix.forEach(row => row.reverse()); } else { matrix.reverse(); } }; const createPiece = (type) => { if (type === "T") { return [ [1, 1, 1], [0, 1, 0], [0, 0, 0] ]; } else if (type === "J") { return [ [0, 1, 0], [0, 1, 0], [1, 1, 0] ]; } else if (type === "L") { return [ [0, 1, 0], [0, 1, 0], [0, 1, 1] ]; } else if (type === "O") { return [ [1, 1], [1, 1] ]; } else if (type === "S") { return [ [0, 1, 1], [1, 1, 0], [0, 0, 0] ]; } else if (type === "Z") { return [ [1, 1, 0], [0, 1, 1], [0, 0, 0] ]; } else if (type === "I") { return [ [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0] ]; } }; let dropCounter = 0; let dropInterval = 1000; let lastTime = 0; const update = (time = 0) => { const deltaTime = time - lastTime; lastTime = time; dropCounter += deltaTime; if (dropCounter > dropInterval) { playerDrop(); } draw(); requestAnimationFrame(update); }; #### Takaaki 続けてください #### ChatGPT const arena = createMatrix(10, 20); const player = { pos: { x: 0, y: 0 }, matrix: null }; document.addEventListener("keydown", event => { if (event.keyCode === 37) { playerMove(-1); } else if (event.keyCode === 39) { playerMove(1); } else if (event.keyCode === 40) { playerDrop(); } else if (event.keyCode === 81) { playerRotate(-1); } else if (event.keyCode === 87 || event.keyCode === 38) { playerRotate(1); } }); playerReset(); update(); </script> </body> </html> このコードは、テトリスゲームの基本的な機能を実装しています。プレイヤーは矢印キーを使ってピースを操作し、Qキーで反時計回りに回転、Wキーまたは上矢印キーで時計回りに回転させることができます。行が埋まると消え、ゲームが続行します。ピースがスタックして画面上部に達すると、ゲームオーバーになります。このコードを自由にカスタマイズして、さらに機能を追加したり、見た目を改善したりすることができます。 ...

April 16, 2023 · 15 min

Makefileで改行文字を扱う

最近、Github CLIの存在を知って使いこなそうと頑張っている。 その中のコマンドの1つとしてPRを作成するコマンド gh pr create がある。 https://cli.github.com/manual/gh_pr_create オプションの1つである --body を使えば、PRのbodyもコマンドラインから渡せてしまう。 gh pr create --web --body " ### What プルリクエストをコマンドラインから作成してみた " ただし、これをMakefileの中でやろうとすると以下のようなエラーになる。 # Makefile create-pr: gh pr create --web --body " ### What プルリクエストをコマンドラインから作成してみた " # execute `make create-pr` gh pr create --web --body " /bin/sh: -c: line 0: unexpected EOF while looking for matching `"' /bin/sh: -c: line 1: syntax error: unexpected end of file make: *** [create-pr] Error 2 Makefileの中では1行1コマンドとして解釈されてしまうため、ダブルクオーテーションの終わりを探してくれない。 ...

August 15, 2022 · 1 min

Vimのヤンクレジスタを使いこなしたい

大学4回生からプログラミングを始めて、Atoms、Sublime Text、VS Code、IntelliJといろんなエディタを触ってきましたが、社会人になってからVimをずっと使い続けています。 最初は慣れないキーストロークでノロノロコーディングするのが苦痛でしたが、今ではVim以外でトラックパッドを触るのがめんどくさいと感じるようになってきました。 といってもまだまだVimを使いこなせておらず、工夫すれば簡単に終わりそうな操作があってもコーディングに集中したく、Vimの使い方を調べることは少ないです。 しかし、よくある操作でいつもうまくできない「単語をコピーして入れ替える」についてやっとちゃんと調べることにしてみました。 参考 この本の抜粋になります。 https://www.amazon.co.jp/dp/4048916599/ よくある間違い キーストロークバッファの内容yiwcollection = getCollection();process(somethingInTheWay, target);jwwcollection = getCollection();process(somethingInTheWay, target);diwcollection = getCollection();process(, target);Pcollection = getCollection();process(somethingInTheWay, target); 初期の頃にやっていたとてもあるあるの行動です。ただ単語を削除してヤンク(コピー)した単語をはりつけたいだけなのですが、単語を削除した際に無名レジスタに削除した単語が格納されてしまうため、そのままPut操作を行うと、削除した単語が貼り付けられてしまいます。 Visual modeを使った回避策 いままでよくやっていたのがこの方法です。 キーストロークバッファの内容yiwcollection = getCollection();process(somethingInTheWay, target);jwwcollection = getCollection();process(somethingInTheWay, target);vecollection = getCollection();process(somethingInTheWay, target);pcollection = getCollection();process(collection, target); こうすると選択対象と削除とヤンクした単語の貼り付けが同時に行われるので、削除した単語がはりつけられることはなくなります。しかし、入れ替えたい対象が2箇所以上あった時に、この操作をした後にはすでに無名レジスタには somethingInTheWay が格納されてしまっています。 ブラックホールレジスタを使った回避策 Vimには "_ というブラックホールレジスタ(消去専用レジスタ)が用意されています。保存したいわけではなくただ削除したのであれば、このレジスタにつっこめばいいわけです。これを使うと、先ほどの問題が解決します。 キーストロークバッファの内容yiwcollection = getCollection();process(somethingInTheWay, target);jwwcollection = getCollection();process(somethingInTheWay, target);"_diwcollection = getCollection();process(, target);Pcollection = getCollection();process(collection, target); ただちょっとめんどくさいですよね? いちいち単語を削除するときはブラックホールレジスタに入れんとあかんから "_ を削除前に指定して…と考えることが多くなります。 ヤンクレジスタを使った回避策 おそらくこれが正解です。 キーストロークバッファの内容yiwcollection = getCollection();process(somethingInTheWay, target);jwwcollection = getCollection();process(somethingInTheWay, target);diwcollection = getCollection();process(, target);“0Pcollection = getCollection();process(collection, target); ...

August 13, 2022 · 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

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

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