メメメモモ

プログラミング備忘録、リモートワーク生活、筋トレ、etc

CQRSとDynamoDBのデータ構造設計

概要 最近DynamoDBで設計を行っています。DynamoDBは、NoSQLであり様々な制約があります。ですので、RDBの設計とは異なる考え方をしなければなりません。 四苦八苦しながら、設計をしていて、何とか形になってきています。そんな中、CQRSという考え方がある…

型付きダックタイピング

概要 Go言語のinterfaceとダックタイピングについてまとめました。 ダックタイピングとは もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである。 ダック・タイピング - Wikipedia オブジェクト指向の話に置き換えると、 それが「…

Go言語でAWS ElasticSearchを操作する

package main import ( "bytes" "context" "encoding/json" "fmt" "io" "log" "net/http" "time" ) type User struct { Name string `json:"name"` Age int `json:"age"` Note string `json:"note"` CreatedAt time.Time `json:"created_at"` UpdatedAt time…

glogでDebug用ログ出力の関数を作るときの注意点

結論 以下のように、DEBUG環境変数が設定されているときに、ログ出力するような関数を定義した場合は、glog.XxxDepth(例ではglog.InfoDepth)を使いましょう。 package main import ( "flag" "fmt" "github.com/golang/glog" "os" ) func DebugLog(v interfac…

コマンドラインの引数ではなくプログラムでglogの設定を行う方法

結論 flag.Setを使います。 例えば、stderrthresholdで、ログレベルの閾値を設定したい場合は、以下のようになります。 func main() { flag.Set("stderrthreshold", "INFO") flag.Parse() glog.Info("Hoge") } 参照 godoc.org

Goのfor rangeでのポインタでハマったこと

概要 以下のプログラムの出力結果はどうなるでしょうか? package main import "fmt" func main() { a := []string{"A", "B", "C"} var b []*string for _, str := range a { b = append(b, &str) } for _, str := range b { fmt.Println(*str) } } 出力結果…

実感した筋トレの効果について

概要 ここ2年くらいは筋トレを継続的にやっています。 筋トレを始めてから、色々なことが前よりも上手く回り始めたような気がしています。 筋トレの何が良いのか、まとめてみました。 重力に負けなくなる 冗談のようなことですが、筋トレをする前は重力に負…

1年間で体重が13kg減った(79kg→66kg)ので、これまでの生活を振り返る

概要 高校生から約20年ほど単調増加し続けた体重でしたが、ここ一年で高校生の頃の体重(66kg)に戻りました。 比較的普通の生活をしていたので、急激な変化は起こってません。○○週間で○○kg減量!みたいな話ではないので、インパクトはないですね。 標準体重ま…

SAML / OAuth2.0 / OpenID Connect / SSOの関係(細かい仕組みの話は無し)

概要 SAML / OAuth2.0 / OpenID Connect / SSO など、認証認可周りで色々な用語が出てきて、それぞれの関係性がよく分からなかったので、調べてざっくりとまとめてみました。 「認証」と「認可」 まず、「認証」と「認可」という概念を簡単におさえておきま…

DynamoDBlocalでDynamoDBをひとまず触れるようにする

目次 目次 概要 DynamoDBLocalを手元のPCに入れる aws-cliで操作する テーブルを作成する テーブル一覧を表示する テーブルにデータを挿入する データを取得する データをスキャンする Go言語で操作する ダミーのCredentialsを用意しておく SDKの導入 ひとま…

IntelliJが重くなったときに試すこと

結論 File > Invalidate Caches & Restart を試してみる。 参考 matome.naver.jp

IntelliJ上でFlowチェックとESLintチェックを実行して修正する

Analyze -> Run Inspection by Name... または Ctrl+Shift+Option+I を実行 flowを実行する場合はflow errors ESLintを実行する場合はESLint F2を押すと順番にエラー該当箇所にジャンプできます。

import自動挿入時にfromの文字列をシングルクォーテーション囲うように設定する

Editor > Code Style > Javascript > Punctuationタブ で設定を変更できます。 文字列を二重クォートで囲うと、ESlintで引っかかっていたので、変更しました。

mochaとSequelizeでテストをするときにmochaが終わらない現象

結論 --exitオプションを付けてmochaを実行すると、テストがすべて実行された後にプロセスが終了します。 stackoverflow.com 終わらない原因 SequelizeでDBへのコネクションが残っていると、mochaが終了しません。 だからといって、afterなどでsequlize.clos…

import/exportとmodule.exports/require

概要 Node.jsのモジュール読み込み ES6(ECMAScript2015)のモジュール読み込み Typescriptのモジュール読み込み ES6と同じexport/import export =とimport = require() /// reference path まとめ 概要 Node.js、ES6、Typescriptを一気に調べていたせいで、い…

RESTful API設計をする際に考慮する点

認証API Cookie実装 Bearer Token(https://tools.ietf.org/html/rfc6750) 一覧取得API 以下のパラメータをリクエストパラメータとして指定できるようにしておく。 ページネーション系パラメータ per_page (1ページごとの件数) page (何ページ目のリストを取…

Ruby on Rails チュートリアルを完走した

memememomo.hatenablog.com 1日2時間くらいで17日間かかりました。長かった。 演習も全てやりましたが、読み飛ばした文章も割とあっても結構時間がかかりましたね。 内容のクオリティはすごく高くて、初心者が何周かすれば、一通りの基礎知識は身につけられ…

2017年の振り返り

概要 今更ながら2017年の振り返り、というか気づきや思ったことをまとめておきます。 ビジョンを持つ必要性 自分や周りの人たちのモチベーションの持ち方を見ていて、 熱意を持って幸せに働くためにはビジョンが必要だということに気がつきました。 ビジョン…

Ruby on Rails チュートリアル 第4版 メモ

railstutorial.jp 第1章 railstutorial.jp チュートリアルでは、helloアプリ(1.3)、toyアプリ(第2章)、sampleアプリ(第3章から第14章まで)を作る。 Railsをインストールする https://railstutorial.jp/chapters/beginning?version=5.1#sec-installing_rails …

各種プログラミング言語に対する個人的雑感2017

C# Unityで使えるし、サーバサイドも書けるし、XamarinでiOSとAndroidのアプリが作れるし、Windowsアプリが作れるし、コスパが良い。 変な文法がない。 柔軟なこともできる。 Javascript Chrome拡張かけたり、サーバサイド書けたり、Googleスプレッドシート…

仕事で必要な技術力を高めるための活動

概要 仕事で必要になってくる技術力は、本を読んだりするだけでは高まらないものです。 どのようなことをすれば 実践的な技術力を高めていけるのかを考えてみました。 仕事で必要な技術力とは 仕事で必要な技術力とは以下のようなものです。 作るべきモノ(ゴ…

「まんがでわかる自律神経の整え方」を読んだ

最近、自分にとって向いていないことを仕事でやることが多くなりました。 気持ち自体は前向きに頑張って行こうと思っているのですが、 喉のつまりを感じたり心臓がバクバクしたりすることが増えました。 こういった症状を解消したいと思い軽くググったところ…

Promiseの利点を手っ取り早く説明する

Promiseの細かい説明は以下のドキュメントに譲ります。 azu.github.io この記事では、Promiseを使うとどのような嬉しいことがあるのかを簡単に説明します。 setTimeoutを使って、1秒ごとに「1」「2」「3」「4」と表示するプログラムを書く場合を考えます。 P…

Node.jsのツール周りのメモ

概要 Node.js + Gulp + Typescript + Babel で、プログラミング環境構築した時のメモです。 Node.js Node.js ウェブブラウザChromeのV8 JavaScriptエンジンで動作するJavascript環境です。 MacでのインストールはHomebrewを使います。 $ brew install node n…

ScalaからRedmineを操作する

概要 Redmine API http://www.redmine.org/projects/redmine/wiki/Rest_api ScalaからRedmineのAPIを使って、チケットを取得したり操作したりするための設定を行います。 RedmineのAPIキーを取得 以下のページを参考に、RedmineのAPIキーを取得します。 http…

素数判定

概要 素数判定のプログラムを書くことを考えます。 素朴な実装をするとO(n)の計算量になってしまうので、 高速化することを考える必要があります。 素朴な実装 素朴な実装では、与えられた整数xが2からx-1までの数で割り切れるかどうかを順番に調べます。 in…

SQL_MakerをComposerでインストールできるようにした

PerlのSQL::MakerをPHPに移植して作ったSQL_Makerを、 書き直してPackagistにアップロードしてみました。https://packagist.org/packages/uchiko/sql-makerこれでComposerからインストールすることができます。 導入手順 以下のコマンドでcomposer.pharをイ…

!!1する意味が分からない

1と!!1の違いが分からない。 !!'test' ならやりたいことは分かる。 !!1はやりたいことが分からない。ひとまずDumpしてみた。 use strict; use warnings; use Devel::Peek; # SV = IV(0xdf12788) at 0xdf12798 # REFCNT = 1 # FLAGS = (IOK,READONLY,pIOK) # …

ルーティング設定に名前をつける

以下のようにルートに名前をつけることが出来ます。 # Mojolicious::Liteの場合 get '/hoge/detail/:id' => sub { ... } => 'hoge/detail'; # Mojoliciousの場合 $r->get('/hoge/detail/:id')->to('hoge#detail')->name('hoge/detail'); このようにしておく…