技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

ページング関連のクエリとUI設計【MySQL】

Limit Offsetは遅い MySQLを用いてページネーションを作成する際、はじめに遭遇するのが「Limit Offset」構文かもしれません。 MySQLに用意されている、ページングを実現するには便利な機能です。 SELECT * FROM tableA LIMIT 10 OFFSET 250 OFFSETに指定さ…

セレクトボックスの初期表示【Vue.js】

セレクトボックスの初期表示をする場合、hidden属性を持つoptionタグを最初に記載します。 pugとTypeScriptを使用しています。 <template lang="pug"> select(v-model="selectedPtn") option(value="" hidden) Choose // 初期状態で表示されるが、選択肢には表示されない option(v</template>…

エラー解消法_Property '…' has no initializer and is not definitely assigned in the constructor【TypeScript】

TypeScriptで、Property '…' has no initializer and is not definitely assigned in the constructorのエラー、つまり初期化されていない、というエラーが発生する場合、tsconfig.jsonに下記を記述をするとエラーが解消されます。 "strictPropertyInitializ…

Docker-Compose【Docker】

Docker-Composeは、複数のコンテナを管理する仕組みです。 いくつかのファイルにコンテナにまつわる設定を記述することで、コンテナのコマンド実行時にその内容を基にして処理されます。この仕組みがないと、各コンテナの設定をコマンド実行の都度指定する必…

SQLのタイムゾーンを設定する【Go】

SQLの時刻がUTC時刻になってしまう問題を解決します。 sql, err := sql.Open("mysql", "user:passward@/dbname?parseTime=true&loc=Asia%2FTokyo") このようにparseTime=trueに併せてlocを指定しないと、例えソースコード側でJST時刻を指定しても、sql接続時…

脱構造化【TypeScript】

構造化された内容を変数に展開します。 let person = { nickname: "Mike", like: "Cat" }; let {nickname, like} = person; console.log(nickname, like) // Mike, Cat 配列を展開することもできます。 let array = [1, 2]; let [numA, numB] = array; conso…

最後にInsertまたはUpdateしたレコードのIDを取得する【MySQL】

InsertまたはUpdateした後に、他の関連テーブルを操作するため、処理したレコードのIDを使いたい場合があるかと思います。そんな時は、LAST_INSERT_IDを利用します。 Upsert時に、UpdateしたレコードのIDを取得したい場合は、LAST_INSERT_IDを併せて更新する…

Upsert【MySQL】

なければInsertあればUpdateする、通称Upsert命令文です。Primary Keyの他、Unique Keyも考慮するので、事前にどのカラムにKeyを設定するか検討、対処しておく必要があります。 INSERT INTO stock( book_id, status, created_at, updated_at ) VALUES( 1, 1,…

アロー関数式とthis【TypeScript】

TypeScriptでもアロー関数式を使うことができます。 function helloA(): () => string { return () => {return "Hello, world"}; } function helloA(): () => string { return () => "Hello, world"; } class定義のメンバメソッドについて、アロー関数式と通…

namespace【TypeScrypt】

名前空間を区切ることができます。namespace内で定義したものは、exportを記述しない限り、外部から参照することができません。また、必ずnamespace名を経由する必要があります。 namespace sampleA { export var str = "string"; } console.log(sampleA.str…

構造的部分型【TypeScript】

ダックタイピングのようなものです。構造が一致するならば、異なる型であっても同じようなものとして扱うことができます。 class Options { sync: boolean; constructor(){ this.sync = true; } } class Options2 { constructor(public sync?: boolean, name…

引数【TypeScript】

可変長引数 スプレッド演算子を使って表現します。型は要素の型(stringなど)の配列型([])を記述します。 function hello(...words: string[]): string { return "Hello, " + words.join(" and "); } console.log(hello("Mike", "Chang", "Bob"); // Hell…

SQLによる取得結果をHas Manyの形で格納する方法【Go】

SQLの取得結果をHas Manyの形で格納したいことがあるかもしれません。しかし、SQLでのSELECTの結果は階層化されていないので、ソースコードでロジックを組んで組み立てる必要があります。 Goの場合、SQLの取得結果を1行ずつ処理できるrow.Next()があるので、…

SQLのNULL値に対応する(JSON定義の変更まで)【Go】

SQLのSELECTの結果がNULLを返し、それを何らかのデータに格納する場合、格納先のデータの型を特別なものに指定する必要があります。 NULLを返すSQLを使用する場合、次のコードはエラーになります。 type someModel struct { code int name string } func mai…

SquirrelでネストクエリをLEFT JOIN【Go】

Go

SQLビルダーのライブラリSquirrelです。SQL文の命令を、SQLの構文のようにGo言語によって記述することができます。 GitHub - Masterminds/squirrel: Fluent SQL generation for golang 使用方法は下記公式の案内に記載されていますが、 squirrel - GoDoc sou…

ジェネリクス(総称型)【TypeScript】

TypeScriptは、型をパラメータ化するジェネリクスをサポートしています。 下記は型変数Tを使ってジェネリクスを表現した関数です。引数と返り値にTが適用されます。 function identity<T>(arg: T): T { return arg; } 引数だけを考えれば、any型と同じですが、</t>…

型【TypeScript】

TypeScriptの基本型には次の3つがあります。 number string boolean 型宣言をするときは「: 型名」というように型アノテーションを用います。 変数 var 変数名: 型名 関数 function 関数名(引数名: 引数の型): 関数の返り値の型{} 返り値を持たない関数は、…

TypeScriptとは【TypeScript】

TypeScriptはMycroSoftによって開発・メンテナンスされるオープンソースののプログラミング言語です。その特徴は次の3点で表されます。 Javascriptと互換性のあるスーパーセット 静的型付け クラスベースオブジェクト指向 TypeScriptによるソースコードは、…

Workflows【CircleCI】

workflowsを用いると、jobsの実行順を制御することができます。また、workflows内のjobの実行が失敗すれば直ちに通知されるため、無駄に待つ必要がありません。 versionとworkflow名を指定し、workflow内に、jobs内に指定したjob名を連ねます。 version: 2 j…

Image【CircleCI】

Imageとは、ファイルやディレクトリなどプログラムを実行する上での環境を保存したものですが、CircleCIではjobごとに、Imageを使って環境を構築するexecutorを、Docker、Machine、macOSの中から選択する必要があります。 最初に、CircleCIが管理している、…

Steps【CircleCI】

概略 CircleCIの.ymlファイルに記述されるコードには、jobsという、どんな命令を実行させたいかを羅列するブロックがあります。jobsに記載される一つひとつのjobは、どのような処理をどの順番で処理させたいかをstepsに定義します。 version: 2 jobs: build:…

イメージ【Docker】

イメージレイヤ Dockerにおけるイメージとは、動作に必要なファイルとアプリケーション、ミドルウェア、実行時パラメータから構成される、Dockerコンテナのファイルシステムです。イメージは読み込み専用であるレイヤのセットで、実現したい環境に必要なレイ…

Hello World!【CircleCI】

アカウント作成 Sign-upページにアクセスし、GithubかBitbucketを通してアカウントを作成します。 Sign Up and Try CircleCI - CircleCI Hello World CircleCIを導入するリポジトリのルートディレクトリで、.circleciディレクトリを作成します(コマンド) .…

データベースの監視

データベースを監視することで、障害の発生を回避したり、リスクを低減させるよう事前に策を打つことができるでしょう。 異常を知るためには、正常を知る・正常を定義する必要があります。 そのために「ベースライン情報」を収集します。UNIX系OSであれば、…

データベースの障害復旧の基礎

データベースの障害は、下記の状況で発生する可能性があります。 サーバー障害によるメモリ上のデータ損失 ネットワーク障害によるトランザクションの異常終了 ユーザーの誤操作によるデータ損失 自然災害などによる物理的破壊 データベースの障害が発生し、…

CI(継続的インテグレーション)

CIとは ソフトウェア開発プロセスの自動化により、チーム開発のスピード向上と品質の安定化を試みる手法のことです。 チーム内で共有するリポジトリにコミットされることをトリガーに、予め定めたビルドとテストが自動実行されます。 なお、ステージング環境…

SQLのデータアクセス

OracleDBやMySQLなどのRDBMSは、どのようにデータにアクセス(SQLをどのように処理するか)するか、いくつか選択肢を持っています。 その中で代表的なのが「全表スキャン」と「索引スキャン」です。 全表スキャンは、SQLで指定された表のすべてのデータにア…

データベース構築とData Oriented Architecture

データベースの設計に焦点を当てます。 データベース構築 データベースを実際に作成してデータを投入する前に、データモデルを作成します。 データモデルの作成には、「ERモデル」を利用することが多いかもしれません。 ERモデルでは、「Entity(実体)」、…

RDBの構成要素

リレーショナルデータベース(RDB)は大きく次の3つから構成されます。 データベース プロセス 共有メモリ データベース データベースは、ディスク領域のOSファイルによって構成されています。 つまり、アクセスするたびにディスクI/Oによるコストがかかりま…

明示的なメソッド群によるパラメータの置き換え【リファクタリング】

状況 パラメータの値によって、異なる処理を実行するメソッドがある 対処 異なるメソッドに分割する ただし、設計後にパラメータの値が変更される可能性が高いのであれば、このリファクタリングが適用されるべきではありません。 メリット メソッドの責務が…