GORM+GinでTODOリストを作ってみた」に続いて「GORM+Gin」でTODOリストのAPIを作ってみました。ソースコードは前回からの差分だけを記載しています。できたものは下記URLから確認できます。(https://gorm.io/docs)DB:MySQLルーティングは今回はAPIなので以下としました。モデルをtasksにすればよかったと思いましたが一旦このままにしておきます。router.gorouter.gorouter.goにr.Group("/api/v1")のAPI用のグループを追加してルーティングを追加しました。r.Run(":9000")}api/v1/todo.goJSONで受けた値を処理してJSONを返すように変更しました。})}動作確認ターミナルでjsonをみやすくするようにjsonppを入れておきます。GORMの使い方」に続いて「GORM+Gin」でTODOリストを作ってみました。使い方は「GitHubのREADME」を参考にしました。できたものは下記URLから確認できます。装飾は別途やれればと。(https://gorm.io/docs)DB:MySQLルーティングは通常のフォームだとPUT/DELETEが使えないので以下のようにしました。削除main.goだけで作成した場合main.goに全ての処理を記述しています。r.Run(":9000")}ファイルを分割した場合main.goだけだとちょっと味気ないのでWebフレームワークっぽい構成にしてみました。書き方は色々だと思うので「参考」としてみてもらえればと思います。ORMライブラリのGORMの簡単な使い方を確認してみました。公式ドキュメントにしっかりと使い方が書いてありますので基本的にはそちらを参考にしてもらえればと思います(すべてではないですが日本語訳もされています)。その上でクイックスタートを元に簡単な使い方と挙動を確認してみます。http://gorm.io/ja_JP/docs/インストール以下のコマンドでインストールできます。github.com/jinzhu/gormクイックスタート公式ドキュメントにあるクイックスタートを実行してみました。DBだけsqliteではなくmysqlに変更しています。db.Delete(&product)}実行してみるとproductsテーブルが作成され、以下のカラムとレコードができました。structでは宣言していない、id、created_at、updated_at、deleted_atカラムができ、deleted_atに日付が入りソフトデリートが行われています。main.gogorm.Modelgorm.Modelを宣言するとid、created_at、updated_at、deleted_atカラムが自動的に注入されます。deleted_atカラムがある場合、Deleteはソフトデリートになります。先ほど実行したプログラムでどんなSQLが実行されたか確認してみます。db.LogMode(true)を設定するとSQLの実行ログが確認できます。db.Delete(&product)}実行SQLや実行時間が確認できるようになりました。]created_at、updated_at、deleted_atが不要な場合テーブルによってはcreated_at、updated_at、deleted_atが不要な場合もあります。その時はgorm.Modelを使わなければカラムは作られません(IDだけはできるよう個別に記述しています)。uint}この場合、先ほどのSQL実行ログは下記のようになります。deleted_atカラムがないので今回のレコード削除はハードデリートになります。1の指定はなくなります。2と条件が変わってくれます。]テーブル名を単数形にする場合マイグレーションを実行すると生成されるテーブル名はproductsのように自動的に複数系になりますが、複数形にしたくない場合もあります。その時はdb.SingularTable(true)を宣言するとテーブルが単数形で生成されます。参考:http://gorm.io/ja_JP/docs/conventions.htmlGORM本体のテストカバレッジOSSライブラリを使う時、どのくらいテストが書かれているか気になったりするので確認してみました。GORM本体にはtest_all.shというテストすべてを実行するスクリプトが用意されているのでそれを元にカバレッジを出してみました。(初期実行時はライブラリが足りないなど出るので都度追加しました。)また、mysqlのテストをする為にmain_test.goに書かれている以下の記述に事前に設定を合わせておく必要があります。dbDSN)今回は、postgresとmssql環境がないのでmysqlとsqliteだけに限定しました。testのあとに-coverprofile=cover.outを追記してカバレッジを出力します。cover.htmlを実行してhtmlに変換しました。statementsとカバレッジが81.7%でファイル毎にみても以下のようになっていました。ソースhttps://github.com/taisa831/sandbox-gormまとめ非常に簡単なところだけを触っただけで分かりませんが、通して導入しやすく安定したライブラリだと思いました。個人的にORMはあまり積極的に使わない方ですが簡単に扱える、学習コストが低い、実行SQLを確認しながら扱える、などがあると導入障壁が低くてよいですね。Firestoreを扱う際、本家ドキュメントが充実していて検索すればすぐに出てくるのでそれほど困ることはありません。本家ドキュメントの中でも若干変数名の書き方が異なっていたりします。その為、慣れてくれば大丈夫ですが、慣れるまで毎回どう書くんだっけ?と検索することが多かったので、自分なりに解釈して整理してみました。Firestoreを扱える言語は様々用意されていますが、ここでは、JavaScript(Nuxt.js)を例に進めていきます。基本的な考え方は、正にこの図にあるように「フォルダ(collection)」「ドキュメント(document)」「データ」という構成になっています。参照元:https://firebase.google.com/docs/firestore/data-modelこれをFirestoreの管理画面でみるとこのようになります。これを「フォルダ(collection)」「ドキュメント(document)」「データ」に当てはめてみるとこのようになります。イメージとしては、本棚にフォルダが並んでいてフォルダを選択するとフォルダの中のファイル一覧がみることができ、あるファイルを選択するとそのファイルに書かれている内容をみることができるという感じです。◯◯Refとは本家ドキュメントをみると、◯◯Refという変数がよく出てきます。これはその名の通り「参照」です。本棚にあるフォルダ(collection)やフォルダ内のドキュメントを選択した状態です。この時点ではまだ参照なので取得はしていません。usersコレクションを選択した状態であればuserRef、usersコレクションのドキュメントを選択した状態であればuserDocRefといった変数をつけると分かりやすいと思います。(本家ドキュメントではそのようなルール決めはありません。コードを書いてみます。ここではあえて◯◯Refのように変数を使っています。コレクション配下のドキュメントデータをすべて取得するusersコレクションを参照した状態で、get().then()を呼び出すとその時点のドキュメント一覧(snapShot)が取得できます。ドキュメントは1つしか存在しない可能性もありますが、ドキュメント一覧なのでforEachでループすることで全データを取得することができます。ユーザIDはデフォルトでドキュメントに振られるIDです。参考:https://firebase.google.com/docs/firestore/query-data/get-data?hl=jaコレクション配下のドキュメントデータをフィルタして取得するフィルタするのにwhereを利用することができます。whereで対象を絞った後、同様にget().then()を呼び出すとフィルタしたドキュメント一覧が取得できます。参考:https://firebase.google.com/docs/firestore/query-data/get-data?hl=ja単一のドキュメントデータを取得する単一のドキュメントデータを取得するには、doc()にIDを渡し、get().then()を呼び出すと指定したドキュメントのデータが取得できます。この場合、doc()で単一のドキュメントを指定しているので、取得できるのは一覧ではなく指定したドキュメントの値となります。doc.id})これは以下のようにも書くことができます。参考:https://firebase.google.com/docs/firestore/query-data/get-data?hl=jaドキュメントを新規追加するドキュメントを新規追加するには、add()またはset()を使います。ドキュメントIDをランダムに完全に新規で作成する場合はadd()を利用します。ドキュメントIDを任意の値に指定したい場合はset()を指定します。set()は、既存のドキュメントIDを指定するとドキュメント全体を更新する処理となります。'sample3@sample.com'})参考:https://firebase.google.com/docs/firestore/manage-data/add-data?hl=jaドキュメントを更新するドキュメント全体を上書きせずにドキュメントの一部のフィールドを更新するには、update()を使います。'山田花子1'})参考:https://firebase.google.com/docs/firestore/manage-data/add-data?hl=jaドキュメントを削除するドキュメントを削除するには、特定のドキュメントIDをしていしてdelete()を呼び出します。db.collection('users')userRef.doc('2YkjKlEoEQtH0tBJnByr').delete()参考:https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=jaまとめある程度がっつり書いていけばすぐに慣れますが、ちょこちょこ書いていたので書くたびにドキュメントを参照するというのを何回もやっていたのでまとめてみました。自分なりにまとめたものなので誤っている解釈などがあれば指摘して頂ければ幸いです。taisa831小学校6年間の算数から中学3年間の数学までを復習してみたはずかしながら小学校算数から中学校数学までを復習してみたのでまとめておきます。動機もともとはこちらの「文系エンジニアが機械学習に入門するために小学校の算数から高校数学までを一気に復習してみました。」の記事を見たのがきっかけでした。復習しようにもどうアプローチしたらよいかわからなかったからです(私の場合は機械学習よりかはただの興味という感じです)。高校数学を少しやってみようかと思っていましたが、そもそも高校入ってからは真面目に授業を受けていなかったので高校数学などほとんど覚えていません(高校入るまではそれなりに勉強していましたが..)。それで高校数学をやるとすぐくじけそうなので、中学数学までをやってみることにしました。タイトルに時間があるのも心理的にとっつきやすくてよかったです。教材は記事にあった以下の教材を使いました。公立高校受験レベルですがとても分かりやすくまとまっていてよい本でした。ほとんど通勤時間にみていたのでかかった時間は分かりませんが、小学校算数は6時間もかからず、中学校数学は大体6時間くらいだったかと思います。公立高校入試[問題・正答]」を少し解いたりしました。三平方の定理おまけついでに暗算も少しは早くできるようになりたいということで検索して一番にヒットした「暗算を簡単にする10の方法」も少しやってみました。他にもよい暗算の方法があれば教えてほしいです。左から右に細かい文字をシンプルに分数、少数のきまりを覚えておく数字の「0」と「5」を利用する倍数を使いこなす大まかな数字を出す数字を”リフレーズ”と”リアレンジ”する答えが合えばそれでいい億単位の数字にも計算方法はあるチップを計算する簡単な方法まとめまだまだ先ですが子供らの高校受験まではある程度教えられるかなという気持ちになりました。実際にはちょっと問題を解いただけなので、またその頃になったら復習しているかもしれません。次は時間を見つけて高校数学で面白そうな分野(機会学習にも役立ちそうな?)を選択してやってみようと思います。taisa831私はこうしてGoogleに入社/退社しました系記事まとめここ最近少しブームになっていた、「私はこうしてGoogleに入社/退社しました」系の投稿が、どれも興味深い内容だったので、あとから見返しやすいようにまとめてみました。記事一覧Google退職します|eqsan|note2019/3/15が最終出社日でした。インターン期間も含めると4年ちょっと勤めたことになります。昇進してプロジェクトも一区切りついたタイミングで他にすごくやりたいことができたので転職という形です。素晴らしい環境なのに情報が少なくて、入ると良さそうなのに敬遠している人を何度か見たので、この記事が参考になれば幸いです。辞める人が言うのも変な話ですが。人にお願いするだけじゃなくて自分も貢献しろよということで昔話を書いてみました。聞こえたので書いてます。私は修士まで物理学を専攻していて、情報系の勉強は特にしていませんでした。書いたり(関数名の長さに制限ありました)はしていました。大学が開催しているキャリアイベントなどに参加する機会がおおかったので、そこで話したことをまとめて書いてみました。2017年4月入社なので、現在2年目が終わろうとしているところです。系企業の採用面接にも役立つかもしれません。参考にしていただければ幸いです。入社する準備として取り組んでいた事とそのレベルを紹介する。程度の低さに安心して欲しい。Googleの社員が選考過程についてブログを書いています。blog長い記事を書く人が多いので短くて簡潔なものをと思って書きました、が、思ったより長くなりました。小さい頃からやっていたところが強みです。大学で習う以上の強そうな知識とかはあまり無いです。研究室の先輩方がホームページに載せているものを参考にして書きました。