spacemacs を辞めた理由

はじめに spacemacs を使い半年、限界を感じたので emacs の設定を 0 から行ないました。 その移植に思い立った理由を述べていきたいと思います。 嫌なとこたち master の更新が止まっている デフォルトのインストール先が master になっていましたが(現在は devleop になっていました)、最終更新は 2018 年であり、最新の機能が欲しい場合は devlop ブランチにする必要がありました。 spacemacs を使っている人はみなさん develop を使用していたようで、issueでも問題になっていました。 ですが、develop の問題もあります。 spacemacs の変更に振り回される 上記のことから、develop を使用していたのですが、いかんせん更新に振り回されます。develop を更新したらキーバインドが変わった、パッケージでエラーが出たなんてよくあります。 修正の PR がマージされるまで動かないので、しょうがないから PR の変更をローカルに反映したりしたりと、色々と更新時の面倒が多いです。 原因特定が面倒 どのレイヤーが原因なのか、どの設定値が原因なのか調べるのが難しいというのがあります。mac であまりにもフリーズするので調べてみたら、dotspacemacs-mode-line-unicode-symbols を nil にしたら直るという解決策だったことがあります。spacemacs 固有の問題なのか、それとも拡張側の問題なのか、これの線引きが難しく調べるのに難航するというのが結構しんどいです。 重い なんか重いです。結局原因は不明でしたが、特定のモードによってはフリーズすることがよくあり、issue でも似たような報告がちらほらあります。 spacemacs は所謂おらおら設定集なので、余計な設定も結構入っています。そのため、自分が必要なものだけ入れたときに比べ、余計な処理が走りやすいんだと重います。 ですが、滅茶ストレスです。 拡張性 spacemacs には様々なオプションが用意されており、自由に拡張することができます。 しかし、拡張するといっても spacemacs の範囲という感覚です。もう一歩先に行こうとするとかなりつまずきます。 せっかく設定しても spacemacs によって上書きされたりして反映されなかったり、オプションが効かなかったりと、できないことが多いです。 僕はこれが嫌で乗り替えました。オラオラ設定は楽しかったですが、何でもできるという emacs らしさが spacemacs の上でしか成り立たなかったので、嫌になりました。 よかった所 ファイルから自動で適した layer(簡単にいうと設定集)をダウンロードしてくるのには痺れました。これは本当に素晴らしいと重います。 新しい拡張子を開くたびに、拡張を調べてインストールするというのが面倒な人、初めて emacs を触る人、emacs の設定をするのが面倒な人は、spacemacs がとても刺さると思います。 また、オラオラ設定のため、いきなり emacs が vscode になったかのような錯覚を受けるぐらい初期設定が充実しています。 あまり、設定を凝ったことがない人は是非とも試してみてほしいです。...

2020/12/08(作成日) · 2022/09/26(更新日)

入力されたテキストを入れかえる

はじめに 簡単に形態素解析やりたいなーって探していたら、kagomeというものを見つけたので、それでちょっと遊んだ話です。 形態素解析とは まずは、形態素解析とは何ぞやという人もいるかと思います。wiki には以下のように記述されています。 形態素解析(けいたいそかいせき、Morphological Analysis)とは、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である。 簡単に言うと、文章を「単語」や「助詞」などに分割して解析することを形態素解析といいます。 日本語は英語と違い単語や助詞で区切られていないため、日本語に特化した形態素解析の研究が行なわれており、様々なツールが存在します。 代表的なもので mecabというものがあります。 ですが、今回は go 謹製の kagome を使用します。 kagome の使い方 公式ドキュメントにざっくりと書いてあるのは以下のコードです。 package main import ( "fmt" "strings" "github.com/ikawaha/kagome-dict/ipa" "github.com/ikawaha/kagome/v2/tokenizer" ) func main() { t, err := tokenizer.New(ipa.Dict(), tokenizer.OmitBosEos()) if err != nil { panic(err) } // wakati fmt.Println("---wakati---") seg := t.Wakati("すもももももももものうち") fmt.Println(seg) // tokenize fmt.Println("---tokenize---") tokens := t.Tokenize("すもももももももものうち") for _, token := range tokens { features := strings.Join(token.Features(), ",") fmt.Printf("%s\t%v\n", token.Surface, features) } } 上記の出力は以下です。...

2020/11/27(作成日) · 2022/09/26(更新日)

構造体をjsonに変換するツール

作成したツール 今回作成したツールは以下です。 https://github.com/komem3/stout モチベーション 作成したモチベーションとしては、「構造体を適当に定義したけど json の出力が気になる。」、「この構造体に対する json リクエス トをぱっぱと作成したい」という状況と、僕の ast の練習も含めて作成しました。 思ってた以上に面倒な作業でした…。 使用方法 雑に現在の help コマンドの出力は以下のようになっています。 $ stout -h usage: stout -path $struct_path [-no-format] $struct_name options: -path string File path of defined struct. (required) -no-format bool Not format the output json. インストール インストールの仕方は go のツールらしく以下です。 go get github.com/komem3/stout 実例 実際の使い方は以下のように、-path オプションでファイルパスを指定して、その後に対象のオブジェクトを指定して実行を行ないます。 type PtrSamePkg struct { Content string Next string } 上記のようなオブジェクトを持つ define_test.go に対して実行する場合は以下のように実行すると json の出力が得られます。 $ stout -path ./define_test.go PtrSamePkg { "Content": "string", "Next": "string" } おわりに このブログを見る人も少ないと思いますが、よかったら試しに使ってみてもらえると嬉しいです。

2020/11/05(作成日) · 2022/09/26(更新日)

log.Fatalとt.Fatalの違い

どう違うか 結論からいうと、以下のような違いがあります。 log.Fatal: os.Exit(1) を呼び出して強制終了。defer などは呼ばれず、その場でプログラムが終了する。 t.Fatal : runtime.Goexit() を呼び出して終了。defer 処理を行い、その goroutine を終了。 最後に呼び出しているプログラムが違うわけですから、全く違う挙動になるのは当たり前なんですが、いかんせん名前が紛らわしいですよね。。。 詳しい挙動 次にそれぞれの詳しい挙動を確認してきます。 log.Fatal この関数で呼ばれる os.Exit のドキュメントは以下です。 Exit causes the current program to exit with the given status code. Conventionally, code zero indicates success, non-zero an error. The program terminates immediately; deferred functions are not run. For portability, the status code should be in the range [0, 125]. defer も呼ばれないでその場でプログラムを終了すると書いてあります。なので defer などを使わない main 関数ぐらいでしか使いみちがないですね。 一応挙動が分かりやすいように以下のようなコードを書いてみました。 package main import ( "log" ) func main() { defer log....

2020/10/15(作成日) · 2022/09/26(更新日)

型付nilについて

はじめに 今回は go 言語の型付 nil の直感的でない挙動について説明します。 まずは、次のコードを実行してみてください。 playground package main import "fmt" func main() { var x *int var y *int = nil var z error fmt.Printf("x -> %#10v; x is nil -> %v\n", x, x == nil) fmt.Printf("y -> %#10v; y is nil -> %v\n", y, y == nil) fmt.Printf("z -> %#10v; z is nil -> %v\n", z, z == nil) fmt.Printf("x isNil -> %v\n", isNil("x", x)) fmt.Printf("y isNil -> %v\n", isNil("y", y)) fmt....

2020/09/28(作成日) · 2022/09/26(更新日)

Cloud Run への IAP 追加手順

はじめに 現在(2020 年 9 月 14 日) cloud run には Identity-Aware Proxy(以後 IAP)が google cloud の機能として追加されていません。IAP を使いたいけど使えない、cloud run を使っている人なら一度は思ったことがあるはずです。 しかし、先日 pomerium というオープンソースの IAP プロバイダーを使い cloud run で IAP を使う記事が公開されました。試してみて思ったより詰まったので、知見として記事を書いて行きます。 Pomerium とは Pomerium is an identity-aware proxy that enables secure access to internal applications. Pomerium provides a standardized interface to add access control to applications regardless of whether the application itself has authorization or authentication baked-in. Pomerium gateways both internal and external requests, and can be used in situations where you’d typically reach for a VPN....

2020/09/14(作成日) · 2022/09/26(更新日)