CUI超お手軽英語辞書

巷で「すごいH本」と話題の「すごいHaskell楽しく学ぼう」をAmazonで購入しようと思ったのですが、思いの外人気らしくて、入手に時間がかかりそうでした。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

そんなわけで、思い切って原書を買ってしまったのです。

Learn You a Haskell for Great Good!: A Beginner's Guide

Learn You a Haskell for Great Good!: A Beginner's Guide

どもども、英語が読めないのに洋書に手をつけ始めたちゅーんです。
今のところ5章の高階関数まで読み進めたところです。まだサンプルコードが単純なので、なんとなーく、何が書いてあるのか解る気がします。気がするだけです。はい。

まぁ、とにかく、この後FunctorとかApplicativeとかMonadとかの説明も出てくるようなので、わりとワクワクしながら読み進めてる所です。
ちゃんとした感想は、読み終わったらいずれ。



さて、そんなこんなで、この頃英語辞書のお世話になる事が多くなりました。
和英/英和サイトなんかもあちこちありますし、翻訳サイトも便利なのですが、どうも手軽に使える英語辞書ソフトって、ありそうで無いんですよね。
CUI画面で、単語を入力したらその訳をペロンと表示してくれるようなのが理想です。

見つから無いので、作ります。

APIを公開してるような辞書サイトがあれば、それを使ってなんかの言語で作っちゃうのが手っ取り早いかなぁと思ったのですが、それも見当たらないのでcURLweblioのHTMLを取得して、その内容を読みに行くようにしましょう。

weblio和英英和事典のHTMLの中を覗いてみます。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>learnの意味 - 英和辞典 Weblio辞書</title>
<meta name="description" content="learnの意味や和訳。 【動詞】 (音節learned 発音記号/l&#720;nd,l&#720;nt|l&#720;nd,l&#720;nt/,音節learnt 発音記号/l&#720;nt|l&#720;nt/) 音声を聞く→《★【語形】 《主に米国で用いられる》 では lea... - 約891万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。">
<meta name="keywords" content="learn,意味,辞書,英和,とは,和訳,翻訳,用例,発音,英和辞典">
<link rel="stylesheet" type="text/css" href="http://www.westatic.com/css/ejje/content.css?sd=ejje&amp;tst=2012060912"><link rel="stylesheet" type="text/css" href="http://www.westatic.com/css/dict.css?tst=2012060912" title="Main">
<link rel="shortcut icon" href="http://www.westatic.com/img/favicon/ejje.ico" type="image/x-icon">
<link rel="alternate" media="handheld" href="http://m.weblio.jp/e/c/learn">

...

実際にHTMLを読むのはHaskellを使います。

最初はParsecモナドでHTMLを解析して・・・とか色々こむずかしく考えていたのですが、見てのとおり、weblioの最初の方にメタタグとして簡単な内容が埋めこまれているんですね。
簡単な単語について簡単に意味を知りたいだけならこれを取得するだけで良さそうですし、詳細が見たければ取得したファイルをw3mでも使って開けば良いでしょう。

「name="description"」を探し、その直後の「content="」から「"」までの文字列を取得すれば良いので、ちょっとした文字列操作ですみそうです。
こういう処理を手続き言語で書くとループを回しつつ文字のインデックスを保持しながら書かなきゃいけないので、わりと頭を使うんですが、関数型言語なら再帰処理を使って簡単に書けます。

JaEg.hs:

module Main where
import System

--argからmatchを検索して、見つかった所から後ろを返す
matchToDrop :: String -> String -> String
matchToDrop match arg 
  | arg `leftMatch` match = drop (length match) arg
  | otherwise = matchToDrop match (tail arg) 
  where  
    --(´・ω・`)似たようなのあったかな?
    leftMatch :: Eq a => [a] -> [a] -> Bool
    leftMatch s1 s2 = take (length s2) s1 == s2

takeToEnd :: String -> String
takeToEnd ('"':xs) = "" 
takeToEnd (x:xs) = x : (takeToEnd xs)

-------------------------------------------------

main :: IO ()
main = do
  fname <- getArgs
  readFile (head fname) >>= putStrLn.discription
  where
    discription :: String -> String
    discription = 
      takeToEnd . matchToDrop "content=\"" . matchToDrop "name=\"description\""

これで全部です。



Haskellのプログラムについては、コンパイルして実行ファイルにするほどでも無いでしょうからrunghcで走らせてやります。(配布するわけでも、そんなに重い処理でも無いですし)
あとはbashcURLでHTMLを取得して、runghcで実行してやればOKです。取得したファイルは /tmp 直下にでも放りこんでおけば良いでしょう。

je.sh:

#!/bin/bash

WEBLIO_URL="http://ejje.weblio.jp/content/$1"
TMP_FILENAME="/tmp/cuijaegdect.html"

echo "${WEBLIO_URL//' '/%20} から取得中..."
curl ${WEBLIO_URL//' '/%20} > $TMP_FILENAME
echo "------------------------------------------------------------------------------------------"
runghc JaEg.hs $TMP_FILENAME
echo "------------------------------------------------------------------------------------------"

試してみます。

$ ./je.sh "learn"
http://ejje.weblio.jp/content/learn から取得中...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  152k    0  152k    0     0  85633      0 --:--:--  0:00:01 --:--:--  101k
------------------------------------------------------------------------------------------
learnの意味や和訳。 【動詞】 (音節learned 発音記号/l&#720;nd,l&#720;nt|l&#720;nd,l&#720;nt/,音節learnt 発音記号/l&#720;nt|l&#720;nt/) 音声を聞く→《★【語形】 《主に米国で用いられる》 では lea... - 約891万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。
------------------------------------------------------------------------------------------
$ ./je.sh "you"
http://ejje.weblio.jp/content/you から取得中...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  208k    0  208k    0     0  88066      0 --:--:--  0:00:02 --:--:-- 98191
------------------------------------------------------------------------------------------
youの意味や和訳。 【代名詞】 《★【語形】 所有格 your,目的格 you,所有代名詞 yours,複合人称代名詞 yourself; 《複数形》 所有格 your,目的格 you,所有代名詞 yours,複合人称代... - 約891万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。
------------------------------------------------------------------------------------------

肝心の和訳がブツ切れてますやん。
(´・ω・`)<サンプルが悪かった・・・

えっと・・・
大抵の単語はちゃんと意味まで入ってます。入ってますから大丈夫です、そんな目で見ないでください。

$ ./je.sh "delete"
http://ejje.weblio.jp/content/delete から取得中...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  126k    0  126k    0     0  81878      0 --:--:--  0:00:01 --:--:-- 96757
------------------------------------------------------------------------------------------
deleteの意味や和訳。 【動詞】 【他動詞】〈…を〉〔…から〕削除する,消す 〔from〕《★【用法】 校正用語として del. または と略す; cf. dele》.[ラテン語「消す」の意; 【名詞】 deletion] - 約891万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。
------------------------------------------------------------------------------------------
$ ./je.sh "group"
http://ejje.weblio.jp/content/group から取得中...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  220k    0  220k    0     0  61594      0 --:--:--  0:00:03 --:--:-- 66596
------------------------------------------------------------------------------------------
groupの意味や和訳。 【名詞】【可算名詞】1[集合的に] 群れ 《★【用法】 集合体と考える時には単数,構成要素を考える時には複数扱い; 【類語】 group は動物や物の群れ・集まりの最も一般的な語; herd は一緒に... - 約891万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。
------------------------------------------------------------------------------------------
$ ./je.sh "smile"
http://ejje.weblio.jp/content/smile から取得中...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  140k    0  140k    0     0  95352      0 --:--:--  0:00:01 --:--:--  116k
------------------------------------------------------------------------------------------
smileの意味や和訳。 【動詞】 【自動詞】1(声をたてないで)笑う 《★【類語】 ⇒laugh》:a〈人・顔・目などが〉微笑する,ほほえむ,にっこりする.用例smile sweetly [bitterly, cynical... - 約891万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。
------------------------------------------------------------------------------------------
$ ./je.sh "haskell"
http://ejje.weblio.jp/content/haskell から取得中...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 58036    0 58036    0     0  57509      0 --:--:--  0:00:01 --:--:-- 85347
------------------------------------------------------------------------------------------
haskellの意味や和訳。 人名苗字 ハスキル;ハスケル - 約891万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。
------------------------------------------------------------------------------------------
$ ./je.sh "すごい"
http://ejje.weblio.jp/content/すごい から取得中...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  130k    0  130k    0     0    99k      0 --:--:--  0:00:01 --:--:--  133k
------------------------------------------------------------------------------------------
すごいを英語に訳すと 1〈恐ろしい〉terrible; dreadful; horrible〈気味悪い〉uncanny; unearthly; weird; ghastly; gruesome; grim用例あれはすごい事... - 約891万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。
------------------------------------------------------------------------------------------
$ ./je.sh "ハスケル"
http://ejje.weblio.jp/content/ハスケル から取得中...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 50341    0 50341    0     0  27117      0 --:--:--  0:00:01 --:--:-- 37595
------------------------------------------------------------------------------------------
ハスケルを英語に訳すと 人名苗字 Haskell - 約891万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。
------------------------------------------------------------------------------------------

うん、こう見えてわりと便利ですよ、はい。


Twitterで言われて知ったのですが、Bing TranslateがAPIを提供しているそーです。
「辞書」サイトのAPIは見当たらないですけど、「翻訳」サイトのAPIはあるみたい・・・

今回の目的とはちょっと違う気もしますが後々役に立ちそうです。