isyumi_netブログ

isyumi_netがプログラミングのこととかを書くブログ

常に最新のcreate table文を用意しておこう

create table文は現在のTableの状況を説明する最も大切なドキュメントだ。テーブルのスキーマがわかるだけではない。foreign key文からリレーション関係が読み取れる。index文からパフォーマンスの要所がわかる。 実際のシステムのDBはalter table文でどんど…

デプロイを自動化しよう

デプロイのミスは多い。 例えば PHPのアップロード先のディレクトリを間違える Java起動スクリプトを間違える 本番と開発で環境変数を分けていたが間違える などなど。 デプロイは必ず自動化しよう。デプロイのたびにFFFTPやTeraTermを立ち上げていてはいけ…

インフラの設定を自動化しよう

今日はインフラの設定を自動化しようという話だ。 インフラの設定とは例えば Apacheのconfigファイルの編集 PHPをインストールする PHPのスクリプトファイルを所定のディレクトリに配置する MySQLを起動する CRONを設定する などだ。 インフラの設定で大事な…

switch case文の後に処理を続けないで

switch case文の中で変数に代入すると、非常に読みづらいコードになる。そのSwitch文の目的がわかりづらいしこのSwitch文がどの変数を書き換える可能性があるかを把握しづらいからだ。しかし、結局Switch文は何か値を返すために書いてある場合がほとんどであ…

現在時刻を外から入れよう

時刻によって動作が変わるプログラムを書いた時、どうやってテストしているだろうか。手作業で書き換えているかもしれない。 String getAisatu() {// var date = new DateTime.now(); var date = new DateTime(2017, 10, 28, 18, 0); if (date.hour > 17) { …

書き込み系のREST APIは、URLとBodyに無いデータを書き込まないようにしよう

REST APIは、要求を受理するか判定する部分と、要求に従ってデータを返信したりDBに書き込んだりする部分に分かれる。前者の受理判定部分はあらゆる情報を使っていい。しかし、後者の処理部分はリクエストに明記されたもの以外を使ってはいけない。使ってい…

全体を集計した結果のキャッシュ

blog.isyumi.net 前回、元データとキャッシュが1:1で対応するときのコツを書いた。今回は全体を集計した結果のキャッシュの話をする。難易度が1段上がる。 まずどのようなキャッシュが該当するか考えよう。月ごとの売上を合計して画面に表示するプログラ…

元データとキャッシュデータが1:1で対応する時のコツ

元データとキャッシュデータが1:1で対応するとは、キャッシュ層に元データの一部を置いてある状態である。この場合、キャッシュのデータは元データのどの部分かはっきりしている。例えば、47都道府県の市町村リストがあり、その中で茨城と島根のデータをロー…

キャッシュを設計する時に考えること

キャッシュは難しい。そこで安全な設計ができるように考えるべきことをまとめた。 まず、キャッシュにはどのようなものがあるか。 前回のHTTPリクエストの結果をローカルに保存しておき、次回はそこから結果を返す HDDに書き込んだデータをメモリにも保存し…

バッチ処理には必ずドライラン機能をつけよう

バッチ処理の負債化は早い。理由はよくわからない。想像するに、普段ほとんど意識しないからどんな機能があるか忘れる、外部のシステムとつながっているので手動テストすらし辛い、処理が長い、などの理由がありそうだ。 バッチ処理は簡単に動作を再現できる…

複数の言語で開発する時は定数を一元管理できるようにしよう

一つのシステムを複数の言語で開発することがある。例えばサーバーをJavaで開発しクライアントをTypeScriptで開発する、などだ。こんな時、定数の一覧をYAMLなどでファイル化しよう。そして、YAMLから各言語の定数ファイルを自動生成するものも作ろう。する…

VからCにメッセージを送る時は最小限のデータにしよう

いろんなMVCがあると思う。特定の実装に依存する話じゃない。 RoR的なサーバー・クライアントモデル ReactやAngularを使ってクライアントサイドMVCを構築する CLI など、色々ある。大雑把に話の前提を揃えよう。Mは様々なデータを管理している。VはMを加工し…

急遽個別対応するときはコンパイルエラーを出しながら元に戻せるようにしよう

あなたはショッピングサイトを運営していたとする。ある日急に担当者から「来週からセールを始めるので13:00になったらこの告知バナーを表示してほしい」と依頼された。しかし、既存のシステムにはセール時にバナーを差し込むようなレイヤーは用意していない…

連想配列をclassでくるもう

連想配列を使う時の些細な一手間について。連想配列は自由度が高い機能だ。反面、その連想配列をどう使っているのかがコードを書いた本人にしかわからない。そこで、コードの中で連想配列の使い方を明示する方法を紹介する。 あなたは刻々と流れてくる売り上…

再代入は初期化の直後に限ろう

下のコードのように一度変数に値を代入した後に別の値を代入することを再代入という。 例: func main() { i := hoge() i = "iii" log.Print(i)} まず、極力再代入を減らすように心がけよう。再代入を減らすとバグが減るしデバッグの手間も減る。このブログ…

処理の流れを型で表現しよう

もしかしたらあなたは型をめんどくさいものだと感じているかもしれない。型宣言は動くようにするために仕方なくするものと思っていないだろうか。もしそうなら型を使って頭を整理する習慣について知ってほしい。きっとあなたは型を極力狭く定義したほうが捗…

コマンド化して副作用を追い出そう

多くのプログラムにはこのような外の世界にデータを書き込む処理が登場します。 メール送信 DBに保存 ファイルに書き込み HTTPリクエストにレスポンス このような処理をここではIOと呼びます。IOが混じるコードのテストは複雑です。多くの場合実機確認するこ…

正規化した状態変数を展開する関数を作ろう

blog.isyumi.net 前回、状態を管理する変数は正規化しようという話をした。これは状態を管理するうえで役に立つ。しかし、その変数を使うときにめんどくさくなる。そこで、正規化した変数を非正規化する専用の関数を一つ作ろう。状態変数を正規化することと…

状態を管理する変数は正規化しよう

先日のブログで「あなたの書いたプログラムには状態を保持した変数がある。そこが散らかるとめんどくさいことになるのできちっと管理しよう」という話をした。 blog.isyumi.net おさらいだが、状態変数というのはサイクルをまたぐ変数だ。博士のメモだ。管理…

ifの判定式に名前をつけよう

今日紹介するテクニックは実に些細なことだ。しかし、この習慣は有意義だと思う。だから、是非あなたのプログラミングに取り入れてほしい。 if(***ここ***){ が長すぎると読みづらいから気をつけよう。 if(aaa == bbb) { } このくらいならたいしたことにはな…

状態を管理しよう

プログラムには実行中にどんどん書き換わっていく変数と、使い捨てにされる変数がある。イメージしてほしいのは博士の愛した数式だ。あなたは日中に考えたことはすべて記憶しているが、毎晩寝る度に全部忘れてしまうとする。しかし、机にメモがおいてあり寝…

早期ReturnでIF文の組み合わせを見やすくしよう

IF文の中を整理する簡単な方法を紹介しよう。 こういう仕様を考えてほしい。 お客さんがある商品を購入可能か判定したい。購入可能の条件として ログインしているか 在庫があるか 在庫がないなら再入荷可能か お金は足りているか があったとする。購入可能な…

RESTful APIのエンドポイントを綺麗に設計しよう

ブラウザやスマホアプリがサーバーとデータをやり取りする際にHTTPが使われることが多い。今回はそのURLの話だ。まずなんでこの話をするかを聞いてほしい。 あなたが参加しているシステムのサーバーとクライアントのやり取りは全部で何種類あるだろうか? ユ…

For文を縦に分割する

他人にこの話をすることはほとんどない。自転車置き場のそしりは免れ得ないとおもう。とはいえもしあなたがプログラミング初心者で、僕に何かアドバイスできることがあるならちょっと見ていってほしい。へぼプログラマーの僕があなたにあげられるものはこん…

純粋関数の割合を最大化しよう

不勉強な僕ですが、僕が知っているいくつかの小手先のテクニックをまとめておこうと思う。 誤解しないで欲しいが僕は他人にこの話をすることはほとんど無い。僕があなたの同僚になったとして、いちいち突っ込んでめんどくさい思いをさせることはない。 単に…

はてなブログに移行することにした。

ブログを移行した。 今日まで、手作りブログエンジンをFirebase上においていた。Cloud FunctionsでReactをSSRしていた。しかし、Cloud Functionsがあまりにも遅い。そこで脱出することにした。 別の側面もある。手作りブログエンジンでブログを書くと、ブロ…