サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
ikawaha.hateblo.jp
概要 ホント誰得でもないのは重々承知していますが、思い立って 形態素解析器 kagome v2 をリリースしました。とはいっても、だいたいの機能は今ある kagome でも実装済みで、今さら変更してもどうよ・・・という感じではあります。 なので、モチベーションを維持するのが非常に難しくて、だらだらと時間だけがかかってしまいました。 折角作ったのでリリースノートです。 TL;DR; v2 で実現した事 辞書の分離 / バージョン管理 辞書毎に異なる素性項目の扱いの共通化 韓国語辞書対応 辞書の分離 辞書を別リポジトリに分離しました。これにより、長年(?)懸案だった辞書のバージョン管理が可能になりました。go.mod で指定すれば、どのバージョンの辞書を利用しているかがわかります。 また、これにより、これまで kagome.ipadic のような単独辞書を利用するだけのためのライブラリを別に切
概要 某フリマアプリの会社でクエリを分解するのに kagome を使っていたそうなのですが(今は知らない)、ときどき変な解析結果になるとレポートをいただきました。 なんか、最初は正しく動いているんだけど、しばらくしておかしくなり、まれにまた正常動作に戻る・・・と。 聞いただけでやっかいな類いのバグですが、原因が分かったので顛末を記録しておきます。 このバグは kagome v1.11.1 (kagome.ipadic は v1.1.1)で対応済みです。 tl;dr 形態素解析器 kagome では、形態素解析をおこなう際にラティスと呼ばれるグラフ構造を構築するのですが、 このグラフに使うデータ(ラティスの外枠とノード部分)を再利用するために sync.Pool を利用しています。 ラティスの外枠(ノードを格納するスライス)を戻すときに、ノードのポインタを握ったまま sync.Pool に戻
概要 作業に没頭してると slack のメッセージを取りこぼしてしまうことが多いんですが,これを読み上げてくれば便利だなと雑に作ってみました. ゲーム実況なんかで,来たメッセージを bot に読み上げさせて,プレイしながら回答してやつのイメージです. github.com 必要環境 mac というか say コマンドが必要です. インストール go get github.com/ikawaha/slacksay/... 使い方 slack トークンを用意して,手元の計算機で下記を実行すれば ok です. トークンの取得はとりあえずレガシートークン https://api.slack.com/custom-integrations/legacy-tokens を取得するか,過剰な権限が気になるなら https://api.slack.com/apps この辺で取得してください. slacks
はじめに Sudachi はワークスアプリケーションズが絶賛開発中の形態素解析器で,Java で書かれています. 今一番新しい注目すべき形態素解析器で,次のような機能が特徴としてあげられています. 複数の分割単位の併用 必要に応じて切り替え 形態素解析と固有表現抽出の融合 多数の収録語彙 UniDic と NEologd をベースに調整 機能のプラグイン化 文字正規化や未知語処理に機能追加が可能 同義語辞書との連携 (後日公開予定) github.com 開発のステータスは公式には発表されていない(?)ようですが,開発中で本リリースはこれからかな・・・と思います.(実際のところ,スケジュールなどはどうなんでしょうか?) 最近,Sudachi の辞書がレポジトリからダウンロードできるようになったので,kagome の辞書に加工して少し遊んでみました. 以下,公式情報ではない&開発で変更される
はじめに Payload の Member が必須要素でない場合,生成される対応するコードはポインタで表現されます. 文字列なら,string のポインタで表されるわけで,ポインタを渡すために変数を用意してポインタで渡してやるみたいなひと手間が必要になってきます. これはややめんどくさいので,要素がポインタになるのを避けよう・・・というものぐさな方針です. ※ もっといい方法があればしりたいです・・・ Payload や MediaType の要素がポインタになるのはどんなときか Payload や MediaType の要素が(生成されたコードで)ポインタで表現されるのは,要素が必須要素でないときです. たとえば,下記のような Payload では,bottleID と category は required ですが,comment は省略可能です. BottlePayload = Ty
はじめに goa のこと書くのずいぶん久しぶりになってしまいました. 仕事でも使ってて安定して動いていて,あんまり目新しいこともなくなってきて, API はこれで書くのが当たり前になりつつあり・・・. まぁ,そんな言い訳はどうでもいいんですが, うかうかしているうちに v1.3 がリリースされました! 🙌 goa v1.3.0 · goa :: Design-first API Generation v1.3 では,いくつか機能が追加されたんですが 密かに期待していた HashOf のバリデーションを設定する機能が追加されたのでこれを紹介しようと思います. HashOf の機能 HashOf は key と value からハッシュマップをつくる DSL です. 使い方とかはこの辺を参照してください http://ikawaha.hateblo.jp/?page=1473951553 た
概要 前回までのあらすじ: kagome を GAE で動かしたいという話があり,kagome.ipadic という IPA 辞書だけを収めたコンパクト版を用意して,GAE 上で動作させることに成功したわけですが,メモリの消費量が多くて B4インスタンス(メモリ 512MB)以上じゃないと動作しなかったわけです.正直,kagome を GAE で動かしたいという話をチラホラ聞くものの,それは「動くかどうか試してみたい」的なやつで,実際使ってらっしゃるという話は聞こえてこなかったわけです. ところが・・・ Javaだとgomoku使えばB1/F1でも余裕で動いたんだけど、中々上手くいかんなぁ。— かず@GAE/Goやってます (@Kazzz) 2017年5月22日 kagome はちと動作に敷居が高いとのご指摘を受け, 不幸にも黒塗りの高級車に追突してしまう後輩をかばいすべての責任を負った三
概要 ANTLR ってのは,いわゆるパーサジェネレーターです. 去年の年末に出たバージョン 4.6 からターゲットに Go が追加されました 🙌 . かなり昔に使ったことあったんですが,v4 になってだいぶ整理されて洗練された感じになってました. この記事は結構適当にやってしまっていると思うので,ちゃんとやりたいならリファレンスを読んだ方がよさそうです(ぉ. The Definitive ANTLR 4 Reference 作者: Terence Parr出版社/メーカー: Pragmatic Bookshelf発売日: 2013/01/22メディア: ペーパーバックこの商品を含むブログを見る ANTLR の簡単な紹介 入力のあるプログラム書いていると,入力が well-formed であるかどうかをチェックする必要があることがあります. 正規表現とか使って自分で入力が正しいかどうかチェ
goa はデフォルトで json / xml / gob を受け付けてデコードしてくれるようになっているので特に意識することないと思うのですが,'application/x-www-form-urlencoded' とか,独自のデコーダー作りたいときとかには,Consumes 関数を API の中に書いて指定する必要があります. たとえば,application/x-www-form-urlencoded をデコードするようにしたいときは,次のようにします. var _ = API("myapi", func() { Scheme("http") Host("localhost:8080") Consumes("application/x-www-form-urlencoded", func() { // ★ ← こんなかんじ Package("github.com/goadesign/g
概要 goa では レスポンスの形式を MediaType で定義します.一方,Type は Payload の形式などを定義します. MediaType は Type の特殊な形で,Veiw とか Link が増えたやつなので,Type の代わりに使えるんですけど, Type の代わりに使うと振る舞いが微妙に違うことから変なことになったりするので,代わりに使うのはやめておきたいところです. でも,Payload で使う要素とMediaTypeで使う要素は大体一緒のことが多く,同じ事を何度も書いたりするのはダルいこともありますし, Attribute を流用したいということも多いのではないでしょうか. Attribute を流用するいくつかの場面,方法について説明したいと思います. Reference 関数を使う Reference 関数を使うと,すでに定義済みの Type や Media
概要 この記事は Go(その3) Advent Calendar の19日目に間に合わなかった今更ながらの記事です。 goa の紹介のために,slack の Outgoing-Webhooks を使って mattn さんの書かれた 「deeeetさんの名前を間違えると指摘してくれるbot」を goa で書くつもりで, 去年のアドベントカレンダー用に進めてたネタだったんですが, slack が投げてくるデータの形式が分からなくて頓挫していたのを最近解決したので,今更ながらに書いてみました. slack で vaaaaanquish さんの名前を間違えると指摘してくれる bot を作ります. おことわり これはいわゆるネタですので,slack-bot を goa で作るのをおすすめしている訳ではないことにご注意ください. goa の機能の一端を例を通しながら見ていただければ幸いです. vaaa
map の key に interface{} を渡すパターン. こうしておくと key に型を含められるので,同じ文字列を突っ込んでも区別できます. 型のスコープもあるので,map 自体はをグローバルに公開していても中のデータを局所的に扱えていい感じです. golang は型を柔軟に付与できるので,臨機応変に型を追加したりしてうまく使っていきたいですね. 下の例は map[interface{}]string ですけど,map[interface{}]interface{} にしておけば何でも放り込んでおけて便利. https://play.golang.org/p/5hwq5E3do1 package main import "fmt" type apple string type orange string type zaku string func main() { basket
概要 goa は swagger ドキュメントを生成してくれるので,これを swagger-ui をつかってサービスしてやると API が分かりやすく,お試しも出来てかなりいいかんじになります.しかし,環境によってはサービスを立ち上げることが出来ないとか,ドキュメントを確認して欲しい人がサービスにアクセスできないとかいうことが結構あります.そんなとき swagger.(json|yaml) をそのまま渡して 「swagger editor でみてね!」が通じない場合の対処方法です. ブラウザで見れるように加工する bootprint を使う swagger.json を変換してブラウザで見れるように変換したものを用意します.利用するのは bootprint と bootprint-swagger です. これは npm で最初に一回インストールしておけばいいです. Makefile に入れ
概要 goa のデザインが出来たら goagen でコードを生成しましょう. コードが生成できたら,次にコントローラ部分を書いていく必要があります.これはビジネスロジックにあたる部分です. というか,goa はデザインを書いて,goagen してコード生成後は,ここしか編集する部分がないです.他の生成されたファイルには DO NOT MODIFY のコメントがヘッダについています. 準備:コントローラのコードはどこにある? コントローラーのコードがどのコマンドでどこに配置されるかについては, goa のインストールと実行 - 押してダメならふて寝しろ でまとめてありますので詳しくはこちらからあたってください. 以下では,おなじみの最小構成のデザインをサンプルにどのようにメディアタイプやペイロードを扱えばいいかを説明したいと思います. 最小構成のデザインサンプル: package desig
概要 kagome を GAE で動かしたいってのをチラホラ耳にしてたのですが,先日ついに issue が投げられたので対応してみました. 正確には UniDic をあきらめて IPADic だけ対応してる kagome.ipadic で動かせることを確認しました. 何が問題なのか? golang のプログラムを GAE で動かすには以下の2点の制限があります. GAE では unsafe, syscall, cgo を使ってると動かせない GAE では1ファイル32MBのサイズ制限がある kagome を最初に作ったときは辞書を有限状態トランスデューサー(fst)で構築してて,どうしてもこいつが unsafe 使う実装になってたので対応あきらめてたんですが,なんかの時に辞書を double array trie になおして,辞書からは殆ど unsafe をなくしていたので,今回は1カ所直
はじめに 折角 API を作ったら,簡単に試して,仕様も俯瞰的に確認したいものです. そんなわけで,今回は開発環境で使える swagger-ui の tips です. swagger-ui は swagger ドキュメントを閲覧するためのサービスを提供してくれます. しかも API コンソールがついているので,ドキュメントを確認しながらその場で API を試すことが出来ます. github.com これをサービスとして立ち上げて,goa で生成した swagger ドキュメントをセットするというのもまどろっこしいので, goa で生成したサービスを立ち上げると,swagger-ui も一緒にサービスするようにしてしまおう.というのが今回の目標です. swagger-ui を配置 swagger-ui の distフォルダをコピーしてきます. 以下の説明では,作業ディレクトリの swagge
はじめに MediaType と Type の意味を理解してを適切に使い分けましょう(自戒. よく間違えます.github の issue とか goa の slack channel にもよく質問が上がってます. MediaType はレスポンスの形式 MediaType は Type としても利用できますが,本来の意味的にはレスポンスデータです. Payload の要素に MediaType を利用することは可能ですが,MediaType で指定したいと思っているデータ形式と同等のものを Type で定義してそれで指定するのが無難でしょう.Payload の要素に MediaType を使って,これに Example を適用するとうまく設定できないケースがあるため(バグ?)その観点からも避けた方がよさそうです. また,MediaType の定義には,MediaType を利用することは
はじめに API デザインの書き方を一通り説明したので,コントローラーの実装の説明する前に, goa の tips をいくつか取り上げたいと思います. という訳で,Attribute も Param も Member も,すべて Attribute のエイリアス関数で同じものなんです.というお話. 使い分け Attribute と Param と Member 同じものといっても,使う場面が切り分けられています. ちゃんと使うべきところで使うと読みやすいデザインになるようになっているはずです(たぶん). 使う場面 説明 Attribute MediaType定義の Attributes のなか レスポンスデータの要素の定義として Param Resource定義の Action の Params のなか endpoint にアクセスする際のパスパラメータやフォームパラメータの要素の定義とし
概要 goa の API デザインについて,デザインを定義する4つの要素の概要説明の後半です. ✓ API … API サーバの定義 ✓ MediaType … レスポンスデータの定義 Resource … APIが管理するデータへのアクセス方法 / エンドポイントなどを定義 Payload … API に送信するデータの定義 今回は残りの Resource と Payload の説明です. 準備:API サンプル おなじみの最小構成サンプル.全体の把握のために貼っておきます. package design // The convention consists of naming the design // package "design" import ( . "github.com/goadesign/goa/design" // Use . imports to enable the
はじめに goa の API デザインについて,デザインを定義する4つの要素について概要を説明します. API … API サーバの定義 MediaType … レスポンスデータの定義 Resource … APIが管理するデータへのアクセス方法 / エンドポイントなどを定義 Payload … API に送信するデータの定義 とりあえずこれらを押さえておけば一通りのAPIは書けるはず!(たぶん) 今回は4つのうちの API と MediaType を説明します. 準備:API サンプル おなじみの最小構成サンプル. デザインのパッケージ名は design.あと,goa のライブラリを dot インポートしてますが,これはそういう流儀なので呪文だと思って許して下さい.以下に出てくる API とか Resource とか MediaType といった関数は,これらのライブラリの中で定義されて
概要 goa は DSL で書かれた API デザインを goa のツールで変換してコードを生成します. そのコード生成ツールは goagen です.まずはこれをインストールして,実際に動かしてみるところまで説明します. 生成されるファイルとか,利用する API デザインについてはここでは触れませんが,おいおい説明していきたいと思います. 今回は,goagen のインストールと使い方の概要までです. インストール $ go install github.com/goadesign/goa/goagen でインストールできます.vendoring する場合は vendor フォルダに github.com/goadesign/goa を配置してください. vendor 以下の goagen フォルダまで降りていってビルドしておきます. $ cd ./vendor/github.com/goa
はじめに goa ってのは golang で APIデザインを書くと,そこから API サーバのモックとかクライアントとかドキュメントとか一通り生成してくれるマイクロサービス用のフレームワークのことです. とてもすばらしいプロダクトなのですが,goa という名前のググラビリティが非常に悪く,日本語の情報もほとんどありません. そんなこともあり,すこしでも goa の良さが伝わればと先日『 golang: goa勉強会』を開催しましたが,かなり駆け足になってしまったので,何回かに分けて goa 情報をまとめていきたいと思います. 今回は goa に関する情報のまとめ. goa 情報源 本家 goa :: Design-first API Generation このサイトの The goa API Design Language Working with Data Types Security
connpass.com goa って何? goa ってのは golang で APIデザインを書くと,そこから API サーバのモックとかクライアントとかドキュメントとか一通り生成してくれるマイクロサービス用のフレームワークのことです. goa は golang のソースとして DSL が書けて,そいつを goa にかけてやることでコードを生成します.ぱっと聞いた感じ,最初に抱く印象は「キモい」だと思うんですが,json や yaml を書いてコードを生成するよりかなり見通しよくAPIがデザインできると思いますし,なにより,goa の生成するコードがすごく読みやすいコードで,使ってるウチにだんだん「goa (キモ)かわいいな」と思うようになってきました.goa 自体のコードも変態的(コード生成プログラムなのでしょうがない)でありながら読みやすいコードで書かれているのも好印象です. Web
概要 形態素解析してテキストの中から名詞っぽいところだけを抜き出したい.ってのはよくある話だと思うのですが,単純にやるといろいろ混じってます. ( '-`).oO( そもそも抜き出してるのは名詞の形態素であって,名詞句じゃないもんな・・・. 名詞を抜き出す kagome の単純なサンプル package main import ( "fmt" "github.com/ikawaha/kagome/tokenizer" ) func main() { t := tokenizer.New() tokens := t.Tokenize("寿司が食べたい。") for _, token := range tokens { if token.Pos() == "名詞" { fmt.Printf("%s\n", token.Surface) } } } output $ go run main.go
概要 サポートしてるわけでもないし,テストしてるわけでもないんだけど,Hackしてくれるひとがいるみたいだからメモ.なにかあったらフィードバックしてくれるとうれしいです. 個人的な考えですけど,今時点でneologdをサポートするのはちょっと躊躇してます. 理由は Neologdに含まれてるエントリーは英アルファベットがいわゆる半角に寄せられてて mecab 用の辞書と統一が取れてない 短めのエントリーが割とあって,精度に影響が出そうな気がする.適当な長さで切った方がよさそうだけど実験出来てないし,よくわからない カテゴリ分けされてないので地名だけ加えるとかできない めっちゃ長いエントリーとか,断片的な年月日とか不要そうなエントリーが結構ある(解析的な悪さはしないかもだけど といったところです.でも世の中的には使いたい人も結構いるみたいだからやっぱり対応は考えていきたい. いいかげんな手順
はじめに きっかけは形態素解析器 kagome にいただいた Issue です. github.com 端的に言うと, 入力文字列に対して,前から1文字ずつずらしながら辞書引きを繰り返して,可能性のある形態素をすべて洗い出すんですが,その際に辞書を CommonPrefixSearch するメソッドでメモリをアロケートしすぎじゃないか? というお問い合わせです. たしかに 800MB くらいアロケートしてるように見えます.ひえー というわけで調査. 道具は揃っている golang では pprof が使えます.これで速度パフォーマンスとメモリ使用状況が確認できます. 使い方は,KLabGames Tech さんがまとめてくださっているすばらしい記事がありますので,こちらを参照ください. Go pprof 入門編 (CPU Profile とコマンドラインツール) : KLabGames T
はじめに kagome は goroutine セーフに作ってあるんですが,あんまり並列実行的なサンプルとか書いてないなと思って並列実行でテキストに出てくる名詞を引っこ抜いて数えるサンプルを作りました. あと,昨日 suzuken =san が 形態素解析をした後の品詞が取り出しにくいよという Issue を上げてくださって,Token に Pos() という品詞を取り出すメソッド追加しました.今までは, if t := tok.Features(); len(t) > 0 && t[0] == "名詞" { // 名詞の時の処理 } と書いていたのを if tok.Pos() == "名詞" { // 名詞の時の処理 } と書けるようになりました.suzuken = san ありがとうございます. ( '-`).oO( 品詞以外も便利関数欲しいところですが,辞書によって辞書内容がかなり自
TL;DR neologd を使う前にしておいた方がいい入力の前処理があります. 今回はこれを golang でささっと書いてみようと思ってはまって投げ出した話です. neologd の wiki を参考に必要とされている正規化処理を順に見ていきます. Regexp.ja · neologd/mecab-ipadic-neologd Wiki · GitHub 基本的には,英数記号は半角にするようになってます. 失敗したコードはこちらにあります. https://github.com/ikawaha/chits/blob/master/neologd/neologd.go 1. 全角英数字は半角に置換 これは golang の strings.Replacer を定義するだけでささっと書けます. Replacer のいいところは文字列から文字列の変換をただただ書いていくだけでよくて, 濁点
はじめに とりあえずやってみたという内容です.heroku 使うのも初めてなので,用語とか理解とかが違うところもあるかもしれませんが,作業ログがなにかの役に立てば幸いです.ツッコミあればお願いします! 前準備 heroku のアカウントをつくっておく必要があります.なんかずいぶん昔にアカウントだけ作ってあったので,ここの手順は思い出せませんでした. (herokuのトップページ)https://signup.heroku.com/identityから特に詰まるところなく登録できたと思います. heroku の初期設定 heroku が Toolbelt というユーティリティを用意してくれています.アカウントを作ったら,これを手元にインストールしましょう. インストールできたらコンソールで下記を実行してログインできるか確かめましょう. $ heroku login Enter your He
次のページ
このページを最初にブックマークしてみませんか?
『押してダメならふて寝しろ』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く