miyazi888の覚え書き日記

学習したことを書き留めてます。

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サーバを立てて何かしたい、って時に何か良いのはないかと思ったら、あった。

echo.labstack.com

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でマークダウンファイルをリアルタイムプレビューする

これまで使っていたマークダウン関連のプラグインが何故か動作しなくなっていて、原因探るのも面倒くさかったので、何か新しいプラグインとか開発している人がいるんじゃないか、と思って探したら、いました。

github.com

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内でターミナル開いて作業する時にやりたいことは、僕の場合、ほとんどがファイル編集になります。 おまけにそのファイル編集はその時開いているバッファのディレクトリで作業したいことがほとんどだったりするので、ターミナルを開いた時にすでにそのディレクトリに移動しておいてほしい。

絶対、同じことを思ってる人がいると思ってネットを検索しているとやっぱりいました。

vi.stackexchange.com

この中の以下の方法が筋が良さそうだったので、マネしました。

僕の場合はノーマルモードで;;tを連続入力するとターミナルが起動するようにしています。 下の設定だと起動後のターミナルの中でバッファのカレントディレクトリに移動します。

nnoremap <silent> ;;t :let $VIM_DIR=expand('%:p:h')<CR>:25Term<CR>cd $VIM_DIR<CR>

ちなみに:25Termというのは画面を分割してターミナルを表示するvim-plugin、split-termでのターミナルの起動コマンドになります。
このプラグインを使っているのでなければ、:terminalですれば、良いと思います。

github.com

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は不満があれば、自分好みに変更できるのが、やっぱいいですよね。