echoのルーティング
echoのルーティングを試してみた。
と言ってもシンプルなので、特に迷うことはなかった。
実際にこれで何か作る時にはルーティング部分のみ、切り出して別関数化する感じになると思う。Railsで言うroute.rbの設定ファイルみたいな感じがイメージに近い。
プログラム
package main import ( "net/http" "github.com/labstack/echo" ) func main() { e := echo.New() e.GET("/users", getUsers) e.POST("/user", createUser) e.PUT("/user/:id", updateUser) e.DELETE("/user/:id", deleteUser) e.Logger.Fatal(e.Start(":1111")) } func getUsers(c echo.Context) error { return c.String(http.StatusOK, "GET Method") } func createUser(c echo.Context) error { return c.String(http.StatusOK, "POST Method") } func updateUser(c echo.Context) error { return c.String(http.StatusOK, "PUT Method") } func deleteUser(c echo.Context) error { return c.String(http.StatusOK, "DELETE Method") }
動作確認
go run main.goでサーバー起動後、別ターミナルを起動し、以下のコマンドで動作確認した。
curl localhost:1111/users > GET Method curl -X POST localhost:1111/user > POST Method curl -X PUT localhost:1111/user/1 > PUT Method curl -X DELETE localhost:1111/user/1 > DELETE Method
golangのechoフレームワークを試してみた
GoでAPIサーバを立てて何かしたい、って時に何か良いのはないかと思ったら、あった。
Rubyで言うところのsinatraあたりの位置づけなのかと思った。 APIとかに特化している感じ。 Railsに当たるのにはbeegoってのがあるようだけども、とりあえずAPIサーバで良かったので、今回はechoを試してみた。
インストール
Goはすでにインストールされている前提。 go getで簡単にインストールするだけ。
go get github.com/labstack/echo/v4
お試し前の前準備
試す用にディレクトリを作成して、moduleの指定をする。
mkdir intro go mod init intro
お試し(Hello World)プログラム作成
公式のガイドラインに載ってるサンプルそのまま。
package main import ( "net/http" "github.com/labstack/echo/v4" ) func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) e.Logger.Fatal(e.Start(":1323")) }
動作確認
以下のコマンドをターミナルで打ち込むと「Hello, World!」と表示されると思う。
go run main.go curl localhost:1323
感想
このサンプルだけでも気楽さがわかって良かった。 あと日本語ではないものの公式のドキュメントが大充実してるので、やりたいことはだいたい公式ドキュメントみるとわかるのもポイント高い。
vimでマークダウンファイルをリアルタイムプレビューする
これまで使っていたマークダウン関連のプラグインが何故か動作しなくなっていて、原因探るのも面倒くさかったので、何か新しいプラグインとか開発している人がいるんじゃないか、と思って探したら、いました。
starもいっぱい付いてるし、READMEも充実してるし、ということで試してみました。
インストール
プラグインの管理にはvim-plugを使っているので、設定ファイルに以下の記述を追加して、:PlugInstallします。
" markdown plugin Plug 'iamcco/markdown-preview.nvim', { 'for': ['markdown'], 'do': 'cd app & yarn install' }
注意事項
公式サイトにはインストール方法が2つ紹介されていて、1つは以下の記述。
Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() } }
こちらの方法だと自分の環境ではインストールに失敗しました。原因は不明。
仕方がないので上記のyarn installの手法でのインストールにしたところ、うまく動作するようになりました。
もちろん、こちらは予め、nodejs環境とyarnがインストールされていることが前提となります。
使い方
テキトーなマークダウンファイルを開いて編集後、:MarkdownPreviewコマンドを叩きます。
ブラウザのタブが開いてプレビュー開始。
毎回、MarkdownPreviewを打ち込むのはツライので、ノーマルモードで;;pと打ち込むとプレビューを開始するようにしました。
" --------------- " markdown-preview.vim setting " --------------- nnoremap <silent> ;;p :MarkdownPreview<CR> " ;;pでプレビュー
感想
編集位置に合わせてスクロールも追随してくれるし、GitHub Flavored Markdownのテーブル記法などにも対応していて、機能としては十分だと思いました。
試していませんがmermaid記法とか(試しました)、そのあたりの記法にもしっかり対応しているようで、starがたくさん付いてるのもうなづけます。
動作としては特にこれまで使っていたプラグインとは特に差はないんですが、プラグインだけインストールすれば、とりあえず動作する、とか導入が簡単なのは良いな、と思いました。
OpenAPI3の定義ファイルを元にモックサーバを起動する
OpenAPI3の定義ファイルを元にモックサーバを起動する
きっかけ
仕事でAPIドキュメントを記述する必要があったので、OpenAPI3.0の学習がてら、定義ファイルから簡単にモックサーバを起動することができないか、調べてみました。
前提条件
用意するもの
- OpenAPI 3に準拠したAPIの定義ファイル
- モックサーバソフトのAPIsprout
OpenAPI 3のAPI定義ファイルを作成する
どこか、適当なディレクトリにopenapi.ymlというファイルを作成し、以下のようなAPI定義ファイルを作成して下さい。 以下のAPI定義ファイルは個人な学習用に作成した、book storeというAPIで/booksにアクセスすると本の一覧が返却されることを定義しています(公式のサンプル pet storeを元に作りました。
openapi: "3.0.0" info: version: 1.0.3 title: ブックストアのAPI description: これはブックストアAPIの詳細となります。 servers: - url: http://develop.bookstore.com/api description: development paths: /books: get: description: 本の一覧取得 operationId: findBooks parameters: - name: name in: query description: 本の名称を指定してください required: false style: form schema: type: array items: type: string responses: '200': description: 本の一覧 content: application/json: schema: type: array items: required: - name price properties: name: type: string description: 本の名前 example: 'book name1' price: type: string description: 本の価格 example: 1000 example: - name: 'name1' price: 300 - name: 'name2' price: 500 - name: 'name3' price: 1000
APIsproutのインストール
以下のコマンドでインストールします。
go get github.com/danielgtaylor/apisprout
API mock server起動
API定義ファイルを指定してAPIsproutを起動することでAPIにアクセスできるようになります。
デフォルトは8000ポートで、-p 8001とか指定することで違うポートで起動することもできます。
apisprout openapi.yml
起動したあとはもう1つターミナルを開いて下のコマンドを打ち込んだり、ブラウザでアクセスすると本の名前と値段のJSON配列が返却されると思います。
この配列はopenapi.ymlの最後にある、exampleに記述されているものが返却されてきます。
curl http://localhost:8000/books
課題
APIsproutのhelpには--watchオプションで定義ファイルをreloadするみたいなことが記述されているのですが、実際にはreloadされないようでした。残念。
参考
こちらのサイトでyamlの基本的な構造などを解説されています。
https://techblog.zozo.com/entry/openapi3/go
APIsproutの紹介記事です。ここでAPIsproutの存在を知りました。
https://qiita.com/yoshi_detteiu/items/96b1a5698fecf8e0029e
neovimでcheckhealthした時にOKにならない時のメモ
neovimを普段使っているんですが、時々、何かが動作うまく動作しなくなる時があって、そんな時は:checkhealthとか打つと大抵、何かがNGになっている。 特にpython系でOKでない時に、いろいろと時間を食ってしまうので、メモしておきます。
pyenv、virtualenvは導入済みとします。
python2系がOKにならない
pyenv shell <環境名>
pyenv versionsで各環境名は確認できる。
~/.c/nvim ❯❯❯ pyenv versions system 2.7.15 2.7.15/envs/py2neovim * 3.7.1 (set by /Users/miyajimatakeshi/.pyenv/version) 3.7.1/envs/py3neovim py2neovim py3neovim
python2系の環境はpy2neovimなので、以下のコマンドで環境に入り込み、pipコマンドでpynvimをupdateする
pyenv shell py2neovim pip install --upgrade pynvim
python3系がOKにならない
python2系とほぼ同じ python3系の環境はpy3neovimなので、以下のコマンドで環境に入り込み、pipコマンドでpynvimをupdateする
pyenv shell py3neovim pip3 install --upgrade pynvim
rubyとnode
たいだい、checkhealthに親切にもコマンドが載っているので、それをそのまま叩く
vim内でターミナルを開く時、開いたターミナルだけ、編集中のバッファのカレントディレクトリに移動する方法
タイトルどおりです。
vim内でターミナル開いて作業する時にやりたいことは、僕の場合、ほとんどがファイル編集になります。 おまけにそのファイル編集はその時開いているバッファのディレクトリで作業したいことがほとんどだったりするので、ターミナルを開いた時にすでにそのディレクトリに移動しておいてほしい。
絶対、同じことを思ってる人がいると思ってネットを検索しているとやっぱりいました。
この中の以下の方法が筋が良さそうだったので、マネしました。
僕の場合はノーマルモードで;;tを連続入力するとターミナルが起動するようにしています。
下の設定だと起動後のターミナルの中でバッファのカレントディレクトリに移動します。
nnoremap <silent> ;;t :let $VIM_DIR=expand('%:p:h')<CR>:25Term<CR>cd $VIM_DIR<CR>
ちなみに:25Termというのは画面を分割してターミナルを表示するvim-plugin、split-termでのターミナルの起動コマンドになります。
このプラグインを使っているのでなければ、:terminalですれば、良いと思います。
vimは自分好みにカスタマイズできるのでやっぱり楽しいです。
vimで現在開いてるファイルのファイル名を変更する
プログラム書いてて、今編集中のファイルの名前を変更したい時、これまでは
- ctrl+zでvimを一旦停止して該当のディレクトリまで移動、mvコマンドでファイル名を変更後、fgでvimに復帰
- :terminalでターミナル開いて、該当ディレクトリまで移動後、mvコマンドでファイル名を変更
とかやってたんですが、ディレクトリ移動がかったるいので、最近は.vimrcあるいはinit.vimに以下のvim scriptを書くようにしました。
" --------------- " rename file script " --------------- function! RenameFile(...) let old_name = expand('%') if a:0 >= 1 let default_name = expand("%:h") . '/' . a:1 else let default_name = expand('%') endif let new_name = input('New current file name: ', default_name) if filereadable(new_name) redraw! echo "Can't rename : Already exists new filename." return end if new_name != '' && new_name != old_name exec ':f ' . new_name . '|call delete(expand("#"))' exec ':saveas ' . new_name redraw! endif endfunction command! -nargs=? Rename call RenameFile(<f-args>)
これで:Renameと打ち込むと新しいファイル名を聞かれるので、打ち込めばファイル名が変わります。
vimは不満があれば、自分好みに変更できるのが、やっぱいいですよね。