プログラミング言語パラダイムを調査するソフトウェアを作った。
下記サイトで幾つかの言語のパラダイムツリーを見ることができます。
このサイトではJavaScriptでgithub APIを呼び出して、下記リポジトリにある各言語のツリーのJSONデータを取得し、それをD3.jsで描画しています。
このリポジトリにあるソフトウェアは、Wikipediaをスクレイピングして、右カラムのInfluenced
の影響を与えた言語を再帰的に取得していきます。
Github APIを使用すると、データストアのようににGithubを活用できるので便利ですね。こちらのQiitaでも活用事例が紹介されていますが、可能性が広がります。
あれでも今回の場合だと、直接Ajaxで取得したほうがよかったか。
プログラミングコンテスト用のダミーデータ生成コマンドを作った。
最近暇な時にプログラミングコンテストの過去問を解くようになりました。ただし、実際に出たことはありません。
そこでよくあるのが、コードを書いてすべてのサンプルインプットで動くのに提出するとランタイムエラーや間違えになることがあります。このようなときに物量作戦であらゆるデータを試してみてどこが違っているのかを試したくなります。しかし、自分でデータを考えるのは面倒。そこでこのコマンドを使えば、データをJSONで定義するだけで、任意個数のサンプルデータを作成できます。
例えば、
{ "set": 2, // The number of data sets. "sep":"EOF", // Separator of the data sets. "templates":[ // Data set templates. { "min":1, // Min value of the data. "max":4, // Max value of the data. "minRows": 1, // Min rows. "maxRows": 9, // Max rows. "minCols": 2, // Min clos. "maxCols": 2, // Max cols. "sep": " ", // Separator of cols. "rowSize": true, // If we write this field, row size is written in front of the data. "colSize": false } ] }
このようにJSONファイルを用意して、
$ mkinput -f "input.txt" < src.json
コマンドを実行すると、
8 1 2 3 4 3 2 1 3 4 4 1 4 3 4 2 1 EOF 9 2 2 3 4 4 3 3 3 3 3 4 2 2 3 3 2 4 2 EOF
このようなファイルができます。
書いてて思ったんですがリダイレクトで直接プログラムに食わせられるからこれ標準出力に出力したほうが便利ですね。TODOにしたいと思いま。
またバイナリをダウンロードできるので、下記リンクからどうぞ。
コマンドライン辞書に多言語同時翻訳機能を実装した。+Windowsでの設定方法
この前の記事でコマンドラインで使用できる辞書を紹介しました。
今回はあの辞書に更に1つの言語だけではなく複数の言語に同時翻訳する機能を追加しました。 言語ごとにGoroutineを立てて非同期に結果を取得します。CPU数-1で並列化しています。並列化しているので、あまり通信のレイテンシによる遅延を感じずに多言語への翻訳を実現しました。
それにしてもこのGlosbeとかいうAPI、存在しない言語を送った時HTMLを返してきたり、数字がJsonのキーになっていたり、設計がガバガバすぎる。。。
コマンドライン引数を複数取ることができるようにgo-flagsというライブラリを使って引数をパースしました。
また、引き続きdrone.ioでバイナリファイルを配布しているので、下記リンクからダウンロードできます。
Windowsでの設定方法
上記ダウンロードリンクからWindows用バイナリをダウンロードする。
1番上の拡張子が.exe
になっている奴がWindows用バイナリです。適当な場所にフォルダを作る。今回はユーザフォルダに
bin
というフォルダを作成しました。先ほど作成したフォルダ(今回の場合は
bin
フォルダ)にdict.exe
を移動する。左のメニューからPCを右クリックし、プロパティを左クリックする。
新しく開いたWindowの左メニューのシステムの詳細設定を左クリックする。
環境変数を左クリックする。
ユーザ環境変数の
PATH
を選択し、編集をクリックする。右のメニューから新規を選択し、先ほど
dict.exe
を保存したフォルダのパスを入力しOKを左クリック。追加できたらすべてのWindowを閉じる。コマンドプロンプトを開いて
dict
を入力するとコマンドを入力できるようになっている。ここでできなければ環境変数の設定が間違っているため、もう1度8で入力したフォルダのパスがdict.exe
を保存した場所のパスと同じか確かめる。
Windowsの場合だとタイ語が表示されなくなっています。これを表示できるようにするにはコマンドプロンプトのフォントをタイ語に対応したものにかえる必要があります。
また、Windowsでもコマンドにエイリアスを設定できるらしいので、特定言語しか使わない場合は設定したほうが便利だと思います。
Twitterにアニソンを歌わせてみた。
あけましておめでとうございます。
今回は複数のTwitterBotを使ってアニメソングを歌わせてみました。曲はご注文はうさぎですか??オープニングテーマ、Pettit Rabbit'sでノーポイッ!です。
ちゃんとTwitterにも投稿されています。
裏側
このプロジェクトを行うために下記ソフトウェアを作成しました。
このソフトウェアではボットを登録して、好きなツイートをさせることができます。また同時ツイートにも対応しているので、上の画像のようににコーラス部分にも対応できます。更にリプライを利用することでアニメや映画もTwitter上で再現することができます。ただ、Twitterの制限で同じツイートは連続でできない仕様になっているので同じセリフをしゃべらせるには若干変更しなければなりません。
設定画面はWebUIを採用しています。
そもそも、このソフトウェアはサーバ上で常駐することを前提としているので操作はすべてWebインタフェースを通して行うことができます。ただ、Twitterのアクセストークン等を保存するので公開サーバには置かないでください。あくまでローカルでの運用を想定しています。
また、REST APIを通じて会話をスタートさせることもできるので、サーバを起動しcron等のスケジューリングソフトウェアでHTTPリクエストを送るようにしておけば特定の会話を時間をしていして自動的にスタートすることもできます。
会話ボットなどにも活用できるのでぜひ使ってみてください。ZIPで配布したかったのですが、go-sqliteがgoxでビルドできなかったので、まだ出来ていません。Source Forgeを使いたいのですが、使い方がよくわかってません。
それでは2016年もよろしくお願い致します。
コマンドラインで翻訳できるツールを作った。(バイナリ配布)
こちらの記事でGlosbeの翻訳APIをしったので、このツールのGo実装を作成してみました。さらに、いろいろな言語に対応できるようにしました。
ソースコードです
package main import ( "encoding/json" "flag" "fmt" "io/ioutil" "net/http" "net/url" "os" "strings" ) // URL of api const URL = "https://glosbe.com/gapi/translate" func makeURL(src, srcLang, destLang string) string { v := url.Values{} v.Add("from", srcLang) v.Add("dest", destLang) v.Add("format", "json") v.Add("phrase", src) return URL + "?" + v.Encode() } // Send request. func request(url string) (result string, err error) { resp, err := http.Get(url) if err != nil { return } defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) if err != nil { return } var response Response err = json.Unmarshal(b, &response) if err != nil { return } res := make([]string, len(response.Tuc)) count := 0 for i, v := range response.Tuc { if v.Phrase.Text != "" { res[i] = v.Phrase.Text count = i } } result = strings.Join(res[:count+1], ",") return } func main() { // Setting help message. flag.Usage = func() { fmt.Fprintf(os.Stderr, `dict [OPTIONS] <src> Options `) flag.PrintDefaults() } // If this option is exist, translate to Japanese from English. from := flag.String("f", "", "From") to := flag.String("t", "", "To") flag.Parse() args := flag.Args() if *to == "" || *from == "" || args == nil || len(args) != 1 { flag.Usage() os.Exit(1) } result, err := request(makeURL(args[0], *from, *to)) if err != nil { fmt.Println("Not found.") } else { fmt.Println(result) } } // Response object. type Response struct { Result string `json:"result"` Tuc []Tuc `json:"tuc"` Phrase string `json:"phrase"` From string `json:"from"` Dest string `json:"dest"` } // Tuc object. type Tuc struct { Phrase Phrase `json:"phrase"` Meanings []Meaning `json:"meanings"` MeaningID int64 `json:"meaningId"` Authors []int64 `json:"authors"` } // Phrase object. type Phrase struct { Text string `json:"text"` Language string `json:"language"` } // Meaning object. type Meaning struct { Language string `json:"language"` Text string `json:"text"` }
使い方はGithubにも書いてありますが。例えば
$ dict -f en -t ja cat $ 猫,ネコ,ねこ,にゃあにゃあ,neko,にゃにゃ,にゃんにゃん,ぬこ,カト,キャット
みたいな感じで実行します。
マークダウンとか英語で書いてる時この日本語英語でなんて言うんだろうって時にさっと検索できるのでいいと思います。
うえで上げたブログにかかれているようにaliasを好きな(自然)言語で設定するといいです。
バイナリも配布しているのでGoの環境を作らなくてもお気軽に試すことができるのでぜひ導入してみてください。
バイナリダウンロードリンク
良いお年を〜