シグナルを受け取ってgorutineの終了を待ってからプログラムを終了する

件名の通り。 DBアクセスなどプログラム終了前に走り切らせたい処理を定期起動するプログラムでは、終了のためのシグナルを受け取ったらその定期起動するためのgoroutineを終わらせてからプログラムを終了したい。 package main import ( "context" "log" "o…

OpenAPIとaxiosとgin

OpenAPIでインタフェースを定義し、axiosを使ったフロントエンドのコードと、ginを使ったバックエンドのコードを自動生成して、その中身を実装する、とやったら非常に作りやすかった。最高。

OpenAPIの定義を使ってTypeScript(axios)のクライアントコードを生成してsvelteで利用する

実験用APIサーバを作る FastAPIで作るのが一番簡単だと思うので、FastAPIを使う。 この後の環境構築まで一通り終わってからちゃんとコードを書くようにしたいので、まず公式のチュートリアルにあるコードをコピーしつつ、あとあとの事情により一箇所だけ書き…

openapi-generator-cli

openapi-generator-cliはJDKを利用するコマンドなのだが、JDKをインストールしたくないので、Dockerを使う。公式もわかっているのか、公式のdocker imageが存在する。生成したコードのビルドや実行にもDockerを使えるようにDockerfileもセットで生成されるの…

GoでSQL発行時に渡す変数を可変にする

Web画面に複数のチェックボックスが表示されていて、ユーザが自由に任意の数を選択してsubmitされたりした場合、IN句が可変になったりする場合がある。 どうやって可変長の変数を渡すのだろう?というのが気になった。 で、試行錯誤の末、以下のようにしたら…

SQLのEXISTS

WHERE句にEXISTSと書いてそれにつづけてサブクエリをかく。 各行について条件に一致するものがあるとEXISTSが真になるからその行が抽出される、みたいな感じ。 drop table if exists A; drop table if exists B; create table A (id integer, name text); cr…

elasticsearchを使って全文検索してみたい

elasticsearchは検索エンジンの一種。類似するものにApache Solrなどがある。 検索エンジンでは、文書登録時に単語を抽出(日本語の場合は形態素解析という技術を使用)し、各単語からその単語が含まれているドキュメントを示すIDをひけるようにする索引であ…

データベースからグループごとに最大値であったレコードを取得したい

データベースからグループごとに最大値であったレコードを取得したい。最大値そのものではなくて、あるカラムが最大値になっているレコードすべてを取得。 学校のテストのスコアを管理するDBを想定してみる。 まず生徒の情報を保存するテーブルを作る。 crea…

RockyLinuxにKeycloakをインストールした

全部rootで実施。 ポートを開ける firewall-cmd --add-port=8080/tcp --zone=public --permanent firewall-cmd --reload インストールする dnf -y install java-11-openjdk dnf -y install curl cd /tmp curl -OL https://github.com/keycloak/keycloak/rele…

Reactでログインしたら元々いたページに戻すやつ

useLocationで今いるページのパスを取得、useNavigateでページのパスを渡しながらログイン画面に飛ばして、ログインに成功したら先ほど渡されたパスに移動する。 具体的には、 npx create-react-app 云々 --template typescript をした直後の状態として、App…

ReactのContext

React内でグローバル変数的にアクセスできるContextを使い、ログインしたあとでそのユーザ名などを保持する機能を実現したかった。 ちなみにContextとは別にcookieなどにアクセストークンを管理し、本当に大事なデータはアクセストークンを使わないと取得で…

Goのinterface

Goで単体試験などをしたくなった場合、テスト対象となる機能が呼び出す関数を外から渡したくなる。 そんなときはinterfaceを使うことで実現できる。 こんな感じ package main import "fmt" // インタフェースとして、どんな関数を具備している必要があるかを…

Redmineを試したくなった

Dockerを使うのが簡単だ。 docker -p 3000:3000 redmine 管理者の初期アカウントはadmin、パスワードもadmin。 hub.docker.com 管理者権限のあるアカウントでログインして、以下の作業を実施していく。 ページ最上部の左寄りの場所に「管理」というリンクが…

ginを使って作成したWebアプリをsystemdを使ってデーモンとして動かす

ginを使って作成したWebアプリをデーモンとして動かす方法について、少し前の記事でsupervisordを用いる方法を延々書いてしまったが、ここではsystemdを使う方法を書いてみる。 1. ログをsyslogに吐くようにする。 デーモン化したらログは画面ではなくファイ…

Goで特定の環境向けのビルドのときだけ取り込むソースを指定する

goはビルド時の環境変数の設定で異なる環境向けのバイナリを生成できるのだが、開発環境ではWindowsやLinuxを使っていて、実行環境はLinuxということがあり、Linux向けのバイナリだけsyslogを使いたくなった。 そんなときはbuild constraintという機能を使う…

ginのログ出力先をsyslogにする

こんなかんじ package main import "github.com/gin-gonic/gin" import "log/syslog" func main() { logger, err := syslog.New( syslog.LOG_NOTICE|syslog.LOG_USER, "gin-test") if err != nil { panic(err) } gin.SetMode(gin.ReleaseMode) gin.DisableCo…

firewalldの設定を確認する方法

firewall-cmd --list-all それだけ。

ginでAPIサーバを作る

ディレクトリをほって初期化する。 モジュール名のところはリポジトリ名にするんだよ、とする情報が多くて、正しいのだけれど、公開しないものであれば別にそのフォルダ名とかでも特に支障はない(たぶん)。 mkdir XXXX cd XXXX go mod init モジュール名 D…

TypeScriptでexpressを使ってAPIサーバを作る

初期設定 とりえあえず、TypeScriptとexpressとexpressの型定義をインストールする。 npm i express npm i -D typescript npm i -D @types/express はじめの一歩 expressを用いたWebアプリでは、expressのオブジェクトを作り、そのオブジェクトにどのメソッ…

TypeScriptの基本

TypeScriptとは JavaScriptの世界に静的型付けを持ち込んだイメージ。JavaScriptのゆるふわ感を緩和してくれる。TypeScriptでかいたソースコードをコンパイラ(トランスパイラ)で変換するとJavaScriptのコードが生成されるので、そのソースコードをnode.js…

はじめてのJSX

ReactではHTMLを組み立てる上でJSXというJavaScriptの拡張構文を用いる。 関数コンポーネントを使う場合、そのコンポーネントを表す関数でJSXをreturnする。 例えばこんな感じ export const Abc = () => { return <p>abac</p>; } JSXのなかでは{と}でくくることでJa…

ReactRouterでSwitchが使えなくなった

react-router-domがバージョン6になってから従来のSwitchが使えなくなったが、代わりにRoutesを使えばよい。 function App() { return( <BrowserRouter> <Routes> <Route path="login" element={<Login />} /> <Route path="about" element={<About />} /> <Route path="/" element={<TopPage/>} /> </Routes> </BrowserRouter> ); } ちょっとの修正で対処できるのにあえてバージョン5を使…

TypeScriptを使うReactのプロジェクトを作る

事前にnpmのインストールが必要 npx create-react-app プロジェクト名 --template typescript あとから変更するのはめちゃくちゃ大変らしいのではじめっからTypeScriptを使うぞと心に誓っておいたほうがよさそうだ。