flutterで遷移後のページから値を渡す
flutterで簡単なサンプルを書いていて、遷移後のページから遷移前のページに値を渡したいなーと思って調べたら割と簡単にできました。本来であればdb使ったりしたほうがいいと思うんですが、そうするほどでもなかったので雑な感じで。
遷移先のページで値を渡します。
onPressed: () { Navigator.pop(context, "値"); }
後は遷移元の方で値を受け取るだけ。
onPressed: () { Navigator.push( context, new MaterialPageRoute(builder: (context) => new SamplePage()) ).then((result) { setState(() { // 何かの処理 }); }); }
久しぶりにflutter触ってますが、やはり色々簡単にできてよいですね。
tslintの"interface name must start with a capitalized I (interface-name)"を消す
ReactをTypeScriptで書いているなかで今までtslintなどを特に使っていなかったので入れてみた所、上記のinterface name must start with a capitalized I (interface-name)
で怒られた。interface名の先頭にIをつけろとのことだがあまり好きではないのでtslint側で怒られないように設定した。
tslint.jsonのrulesに以下を記載すればいい。
"interface-name": [false]
これで怒られなくなった。
go-playground/validatorでomitemptyを使う
go-playground/validatorを使って、空の値を許容するクエリパラメータのvalidationをしようとして微妙にハマったのでメモ。
go-playground/validatorのリポジトリは以下。
https://github.com/go-playground/validator
go-playground/validatorを使う場合、まずクエリパラメータに対応する構造体を定義して、validationをかけたい要素に対して、validateタグを付加する形になります。
validatorのexampleにもありますが、だいたいこんな感じ。
type QueryParam struct { A string `json:"a" validate:"required"` B string `json:"b" validate:"max=10"` }
このときに、required
をvalidateタグに使わなくても基本的にrequired
になるので、例えばクエリパラメータとして投げられたときはvalidationしたいけど、空のときはそのまま通したいという場合があって微妙に困りました。そんななかdocumentを漁った結果よさそうなものを発見。
https://godoc.org/gopkg.in/go-playground/validator.v9#hdr-Omit_Empty
ドキュメントにそのまま書かれている通り、validateタグにomitemptyを付加すれば、値がセットされていないときはvalidationが走らないようになりました。
エラーの分岐にpkg/errorsを使う
modelのロジックが複数の種類のエラーを返す想定で出力を変えたいなーと思っていろいろ調べたのでメモ。
どうやったらシンプルにできるかなーと考えてたんですが、pkg/errorsを使う形に落ち着きました。
だいたい以下のような感じで、独自のエラー用の構造体を作って、pkg/errors
のCauseを使って分岐するだけです。このやり方自体もpkg/errors/errors.go
のコメントにかかれています。
errors/errors.go at master · pkg/errors · GitHub
package main import ( "log" "github.com/pkg/errors" ) type SampleError struct{} func (e *SampleError) Error() string { return "sample error" } func main() { err := &SampleError{} switch errors.Cause(err).(type) { case *SampleError: log.Println("sample") default: log.Println("default") } }
シンプルですが、APIでレスポンスを出し分けたいとかに便利だと思います。
echoでmiddlewareを挟もうとしてハマった話
echoでエンドポイントにmiddlewareをはさもうとしていろいろハマったのでメモ。
echoでルーティングする場合は以下のようにecho.Echo
のGET、POSTであったり、Addだったりを呼ぶわけなんですが、それとは別に直接echo.Router
のAddを使ってルーティングしたりもできます。
echo.Echoを使う場合
e.GET("/", func (c echo.Context) error { return c.String(http.StatusOK, "HelloWorld") })
echo.Routerを使う場合
r := e.Router() r.Add("GET", "/", func(c echo.Context) error { return c.String(http.StatusOK, "HelloWorld") })
私の場合はecho.Router
を使っていてmiddlewareをどうやって挟もうかと考えていたのですが、ドキュメントを見ても見てもやり方が分からず諦めてソースを眺めていたら面倒くさくなりそうなことが発覚。以下がそのソース。
// Add registers a new route for an HTTP method and path with matching handler // in the router with optional route-level middleware. func (e *Echo) Add(method, path string, handler HandlerFunc, middleware ...MiddlewareFunc) *Route { name := handlerName(handler) e.router.Add(method, path, func(c Context) error { h := handler // Chain middleware for i := len(middleware) - 1; i >= 0; i-- { h = middleware[i](h) } return h(c) }) r := &Route{ Method: method, Path: path, Name: name, } e.router.routes[method+path] = r return r }
単純な話、echo.Echo
を使ってルーティングをする際にecho.Router
を内部で使っていて、そこのHandleFuncにmiddlewareを挟む処理を入れているようでした。さすがにライブラリで隠蔽されている部分を自分で実装する気にはならないので諦めてecho.Echo
を使うようにしました。。。
haskellでfizzbuzz
だいぶ昔に少しだけhaskellで遊んでたけど、すでに文法すら頭から消し飛んでたので最初からやり直してて、復習にちょうどいいかと思いfizzbuzzをサクッと書いてみました。
ソースは以下。Integerを引数にStringで返す関数を作って、mapでリストの値を適用してるだけです。普通だと配列ごと渡してやろうのだろうけど、めんどくさかったのでこんな感じ。
fizzbuzz :: Integer -> String fizzbuzz n | n `mod` 15 == 0 = "fizzbuzz" | n `mod` 5 == 0 = "buzz" | n `mod` 3 == 0 = "fizz" fizzbuzz n = show n main :: IO() main = do print $ map fizzbuzz [1..10]
haskellで数値から文字列へのcastがよくわからなかったけど、普通にshowを使えばよかったっぽい。showってもっとごちゃごちゃしてた気がするけど、今はとりあえずcastってことだけ覚えとく。
http://hackage.haskell.org/package/base-4.0.0.0/docs/Prelude.html#22
Google SpreadSheetからGASでSlackに定期的に投稿する
ちょっとしたことを勉強している時に、単語とかすぐ忘れるので単語帳代わりにSpreadSheetに書いてたまに見たりしてるのですが、それでも忘れるのでGASでslackに定期的に投稿するようにしました。
やったことは以下。
- slackのアプリ登録
- GASでslackに投稿するようにする
- トリガーの登録
slackのアプリ登録
他のアプリ連携でもそうですが、Slackに投稿するためのアプリケーションを作成します。
Slack API: Applications | Slack
Create NewAppからアプリケーションを作成して、Bot Userに追加します。
GASでslackに投稿するようにする
GASからslackに投稿するためのライブラリみたいなのは多いと思いますが、やりたいことは定期的に投稿するだけなので、incoming webhookを使ってpostリクエストを投げるだけにします。
slackで作成したアプリケーションの画面でFeatures > Incoming Webhooks
に行って、webhookを使えるようにします。
webhookを使えるようにすると、Workspaceに追加できるようになるので追加します。追加すると、webhookのURLが表示されるので、そちらにpostリクエストを送ればslackに投稿できるようになります。
GASからhttpリクエストを送るためには、UrlFetchAppのfetchを使えばいいです。
Class UrlFetchApp | Apps Script | Google Developers
トリガーの登録
あとは定期的に実行するために、トリガーに登録します。
編集 > 現状のプロジェクトのトリガー
を選択して、トリガーを追加します。分単位・時間単位などで指定できるので大変便利です。
まとめ
さっくりGASを使って、slackに定期的に投稿できるようにしました。GAS自体はjavascriptとほとんど同じでかつ、googleのアプリケーションに接続するライブラリが内包されていてすぐに呼べるので実際ほとんど処理を書く必要がなくて大変楽です。ただ、ブラウザでコード書くのは大変なので、githubにpushしたら反映されるようにしたいなーと思ったので、次回はそのへんをやりましょうかね。