日記

更新頻度はあまり高くはありませんがネタがあったら書いていこうと思います。

プログラミング言語パラダイムを調査するソフトウェアを作った。

f:id:PeeeeRON:20160114225752p:plain

下記サイトで幾つかの言語のパラダイムツリーを見ることができます。

paradigm

github.com

このサイトではJavaScriptgithub APIを呼び出して、下記リポジトリにある各言語のツリーのJSONデータを取得し、それをD3.jsで描画しています。

github.com

このリポジトリにあるソフトウェアは、Wikipediaスクレイピングして、右カラムのInfluencedの影響を与えた言語を再帰的に取得していきます。

f:id:PeeeeRON:20160114230331p:plain

Github APIを使用すると、データストアのようににGithubを活用できるので便利ですね。こちらのQiitaでも活用事例が紹介されていますが、可能性が広がります。

あれでも今回の場合だと、直接Ajaxで取得したほうがよかったか。

プログラミングコンテスト用のダミーデータ生成コマンドを作った。

最近暇な時にプログラミングコンテストの過去問を解くようになりました。ただし、実際に出たことはありません。
そこでよくあるのが、コードを書いてすべてのサンプルインプットで動くのに提出するとランタイムエラーや間違えになることがあります。このようなときに物量作戦であらゆるデータを試してみてどこが違っているのかを試したくなります。しかし、自分でデータを考えるのは面倒。そこでこのコマンドを使えば、データをJSONで定義するだけで、任意個数のサンプルデータを作成できます。

github.com

例えば、

{
  "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での設定方法

この前の記事でコマンドラインで使用できる辞書を紹介しました。

peeeeron.hatenablog.com

今回はあの辞書に更に1つの言語だけではなく複数の言語に同時翻訳する機能を追加しました。 言語ごとにGoroutineを立てて非同期に結果を取得します。CPU数-1で並列化しています。並列化しているので、あまり通信のレイテンシによる遅延を感じずに多言語への翻訳を実現しました。

gyazo.com

github.com

それにしてもこのGlosbeとかいうAPI、存在しない言語を送った時HTMLを返してきたり、数字がJsonのキーになっていたり、設計がガバガバすぎる。。。

コマンドライン引数を複数取ることができるようにgo-flagsというライブラリを使って引数をパースしました。
また、引き続きdrone.ioでバイナリファイルを配布しているので、下記リンクからダウンロードできます。

ダウンロードリンク

Windowsでの設定方法

  1. 上記ダウンロードリンクからWindows用バイナリをダウンロードする。
    1番上の拡張子.exeになっている奴がWindows用バイナリです。

    f:id:PeeeeRON:20160102113339p:plain

  2. 適当な場所にフォルダを作る。今回はユーザフォルダにbinというフォルダを作成しました。

    f:id:PeeeeRON:20160102113317p:plain

  3. 先ほど作成したフォルダ(今回の場合はbinフォルダ)にdict.exeを移動する。

    f:id:PeeeeRON:20160102113343p:plain

  4. 左のメニューからPCを右クリックし、プロパティを左クリックする。

    f:id:PeeeeRON:20160102113355p:plain

  5. 新しく開いたWindowの左メニューのシステムの詳細設定を左クリックする。

    f:id:PeeeeRON:20160102113357p:plain

  6. 環境変数を左クリックする。

    f:id:PeeeeRON:20160102113347p:plain

  7. ユーザ環境変数PATHを選択し、編集をクリックする。

    f:id:PeeeeRON:20160102113350p:plain

  8. 右のメニューから新規を選択し、先ほどdict.exeを保存したフォルダのパスを入力しOKを左クリック。追加できたらすべてのWindowを閉じる。

    f:id:PeeeeRON:20160102113352p:plain

  9. コマンドプロンプトを開いてdictを入力するとコマンドを入力できるようになっている。ここでできなければ環境変数の設定が間違っているため、もう1度8で入力したフォルダのパスがdict.exeを保存した場所のパスと同じか確かめる。

    f:id:PeeeeRON:20160102113345p:plain

Windowsの場合だとタイ語が表示されなくなっています。これを表示できるようにするにはコマンドプロンプトのフォントをタイ語に対応したものにかえる必要があります。
また、Windowsでもコマンドにエイリアスを設定できるらしいので、特定言語しか使わない場合は設定したほうが便利だと思います。

bakunyo.hatenablog.com

Twitterにアニソンを歌わせてみた。

あけましておめでとうございます。

今回は複数のTwitterBotを使ってアニメソングを歌わせてみました。曲はご注文はうさぎですか??オープニングテーマ、Pettit Rabbit'sでノーポイッ!です。

gyazo.com

ちゃんとTwitterにも投稿されています。

gyazo.com

裏側

このプロジェクトを行うために下記ソフトウェアを作成しました。

github.com

このソフトウェアではボットを登録して、好きなツイートをさせることができます。また同時ツイートにも対応しているので、上の画像のようににコーラス部分にも対応できます。更にリプライを利用することでアニメや映画もTwitter上で再現することができます。ただ、Twitterの制限で同じツイートは連続でできない仕様になっているので同じセリフをしゃべらせるには若干変更しなければなりません。
設定画面はWebUIを採用しています。

f:id:PeeeeRON:20160101165851p:plain

そもそも、このソフトウェアはサーバ上で常駐することを前提としているので操作はすべてWebインタフェースを通して行うことができます。ただ、Twitterのアクセストークン等を保存するので公開サーバには置かないでください。あくまでローカルでの運用を想定しています。
また、REST APIを通じて会話をスタートさせることもできるので、サーバを起動しcron等のスケジューリングソフトウェアでHTTPリクエストを送るようにしておけば特定の会話を時間をしていして自動的にスタートすることもできます。

会話ボットなどにも活用できるのでぜひ使ってみてください。ZIPで配布したかったのですが、go-sqliteがgoxでビルドできなかったので、まだ出来ていません。Source Forgeを使いたいのですが、使い方がよくわかってません。

それでは2016年もよろしくお願い致します。

gyazo.com

コマンドラインで翻訳できるツールを作った。(バイナリ配布)

roomba.hatenablog.com

こちらの記事でGlosbeの翻訳APIをしったので、このツールのGo実装を作成してみました。さらに、いろいろな言語に対応できるようにしました。

github.com

ソースコードです

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の環境を作らなくてもお気軽に試すことができるのでぜひ導入してみてください。

バイナリダウンロードリンク

Downloads | dict

良いお年を〜