proglog

主にプログラミングに関する断片的メモ

[devel][haskell] はじめてのH

askellのプログラム。

razie.hs

モナドなにそれ状態。
「やさしい Haskell 入門」は正直な話、根本的に意味が判らない状態。
意味不明のエラーに悩まされつつ、迷宮に入り込んでアドホックなことを繰り返した結果。

今後のために敢て恥を晒してみる。

処理系はThe Haskell PlatformDownload Haskell

参考にしたのは以下のサイト。

「やさしい Haskell 入門」で挫折して、だいたいこの順で読んだ。

その後、"HaskellUNIX コマンドを書こうシリーズ"(Haskell)のソースをいくつか読んだ。


型クラスはjavaのinterfaceかc++の抽象基底クラス。

dataは、列挙型か抽象データ型。

モナドはまったく判らないけど、なんか高度な制御に使われる、なんかタグの付いたデータか、カプセル化されたデータで、専用の関数を使ったり、割って取り出したりしないといけない。
とりあえず避けておきたいけど、schemeの継続と違ってこっちはある程度扱えないとデスクトップで使えるプログラムは書けないっぽい。

構築子ってなんだよって思ったら、コンストラクタか。

ループは全て再帰。変数値の破壊操作は完全にないので状態的なものは再帰の仮引数で。

だいたいこんな認識。

判らない キーワードはHoogleでフグる?

emacsのmelpaで入るhaskell-modeとかghc-mod(ghc)で、hlintを掛けると、文法チェックというより若干リファクタリング的なサジェスチョンをくれるのに驚いた。


あと参考資料的に

冒頭のプログラムは、windowsのiniファイルのような形式の設定ファイルの若干のフォーマット変更。

[nameA]
optX=valXA
optY=valYA
[nameB]
optX=valXB
optY=valYB

という形のものを

optX1=TvalXA
optY1=valYA
optX2=KvalXB
optY2=valYB

こんな感じに変更するもの。

pythonのConfigParser的なもののhasukell版がData.ConfigFileで、これを使って読み込んで、あとは書くだけのはずが。
"caval install Data.ConfigFile"とかする。

pythonで英語学習

前置き

とりあえずなんか一冊英語の原書を読めば単語力とか付くんじゃないだろうか。
そんなわけで、それにpythonを使う。

ここでは次の本を選んだとする。
Amazon.co.jp: 不思議な少年 (岩波文庫): マーク トウェイン, Mark Twain, 中野 好夫: 本

16世紀のオーストリアの小村に,ある日忽然と美少年が現れた.名をサタンといった.村の3人の少年は,彼の巧みな語り口にのせられて不思議な世界へ入りこむ…作者は,アメリカの楽天主義を代表する作家だといわれるが,この作品は彼の全く別の一面-人間不信とペシミズムに彩られ,奇妙に人を惹きつける.(解説=亀井俊介)(改版)

Amazon.co.jp: 不思議な少年 (岩波文庫): マーク トウェイン, Mark Twain, 中野 好夫: 本

サタンは不思議な力をテオドール達に次々と見せる。そこにピーター神父が通り、財布を落とす。サタンはその中に大量の金貨を入れて返すが、同じころに占星術師の金貨がなくなっていたため、ピーター神父は窃盗の罪で投獄されてしまう。

不思議な少年 (小説) - Wikipedia

随分前に日本語で読んだけど、ぐうっとはまった。
という記憶がある。

Amazon.co.jp: 人間とは何か (岩波文庫): マーク トウェイン, Mark Twain, 中野 好夫: 本

老人と青年の対話の形で書かれたマーク・トウェイン晩年の著作.人生に幻滅している老人は,青年に向かって,人間の自由意志を否定し,人間は完全に環境に支配されながら自己中心の欲望で動く機械にすぎないことを論証する.

Amazon.co.jp: 人間とは何か (岩波文庫): マーク トウェイン, Mark Twain, 中野 好夫: 本

これと合せて読むと凄くいい。
確かそうした。

ホッブスも真っ青の人間機械論。
いや、どうだったか。

両方とも短編の部類

で、この"不思議な少年"はThe Mysterious Stranger, and Other Stories by Mark Twain - Free Ebookに原文のテキストがあり、LibriVoxに朗読の音声ファイルがmp3で存在する。
だから、耳からも刺激を入れることができる。

どの程度の難易度か、どの程度の単語を勉強することになるか。それをちょと調べたい。リストかなんか作ることができれば、あらかじめ記憶しておくことも出来るだろう。

で、映画「The Social Network」の脚本をNLTKで解析して遊んでみた - ぬいぐるみライフ(仮)に従って、原文テキストをいじる。

本題

windws、cygwin, python2.7で、ntlkはpipで素直に入った。
ついでにipythonもインストールしてみる。これも、pipで。
これらの使いかたの練習も兼ねる。

In [1]: import nltk
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-b06499430ee0> in <module>()
----> 1 import nltk

ImportError: No module named nltk

ここでwindowsにほうにインストール済みのnltkに検索パスを通す

In [1]: %doctest_mode
Exception reporting mode: Plain
Doctest mode is: ON
>>> import nltk
>>> raw = open('THE MYSTERIOUS STRANGER.txt').read()
>>> tokens = nltk.word_tokenize(raw)
>>> text = nltk.Text(tokens)
>>> len(tokens)
50809

付帯情報的な部分も入っているけど、大体5万語。
世界的に有名な、某魔法少年物語の第1巻は大体7〜8万語らしい。
英語の多読に。レベル別 洋書ファンタジー小説いろいろ

>>> tokens_l = [w.lower() for w in tokens]
>>> tokens_set = set(tokens_l)
>>> len(tokens_set)
6151

重複のない語数は6千強。
ただ、これは、語形変化や、数字なんかも入ったもの。だからこれをもう少し実体に即したものにしたい。

nltk.corpus.reader package — NLTK 3.0 documentationを見ると"morphy"という関数が、wordnetと突き合わせて、原型やら単数形やらに直してくれるっぽい。
wordnetに無いものや、判別できないものはスルーされるらしいけど、細かいのは切り捨てで構わない。

>>> from nltk.corpus import wordnet as wn
>>> print(wn.morphy('copied'))
Traceback (most recent call last):
  File "<ipython-input-13-896ef84543c7>", line 1, in <module>
    print(wn.morphy('copied'))
  File "/c/lang/Python27/Lib/site-packages/nltk/corpus/util.py", line 68, in __getattr__
    self.__load()
  File "/c/lang/Python27/Lib/site-packages/nltk/corpus/util.py", line 56, in __load
    except LookupError: raise e
LookupError: 
**********************************************************************
  Resource 'corpora/wordnet' not found.  Please use the NLTK
  Downloader to obtain the resource:  >>> nltk.download()
  Searched in:

どうやら特定の場所にwordnetを置いておく必要があるらしい。
で、指示に従う

>>> nltk.download()
NLTK Downloader
---------------------------------------------------------------------------
    d) Download   l) List    u) Update   c) Config   h) Help   q) Quit
---------------------------------------------------------------------------
Downloader> d

Download which package (l=list; x=cancel)?
  Identifier> wordnet
    Downloading package 'wordnet' to /XXXX/XXXXX/nltk_data...
      Unzipping corpora/wordnet.zip.

---------------------------------------------------------------------------
    d) Download   l) List    u) Update   c) Config   h) Help   q) Quit
---------------------------------------------------------------------------
Downloader> q
True
>>> print(wn.morphy('copied'))
copy

これでインストール完了

>>> print(wn.morphy('copied'))
copy

原形になってる。

>>> rtokens = []
>>> for wd in tokens_set:
... mtemp = wn.morphy(wd) and rtokens.append(mtemp)

>>> len(rtokens)
4771

4千7百語になった。

で、この4千7百語が、一体どんなレベルのものなのか。それが知りたい。
そこでPDIC Users Page 電子辞書と英語学習のページの英単語リストを使わせてもらうことにした。
ここの100語から6千語までのリストにある単語を、この4千7百語から削除してみる。

>>> temp_l = []
>>> with open('lv6000.txt', 'r') as f:
... for line in f.readlines():
... temp_l.append(line.strip())

>>> wtemp_l = []
>>> with open('words.txt', 'r') as f:
... for line in f.readlines():
... wtemp_l.append(line.strip())

>>> temp_s = set(temp_l)
>>> with open('words2mem.txt', 'w') as f:
... for wd in wtemp_l:
... if wd in temp_s:
... f.write(wd + "\n")

こんな感じで作ったリスト、"words2mem.txt"の単語の中身は534語
僕に6千語レベルの語彙力があれば、500回ほど英和辞典・和英辞典 - Weblio辞書のお世話になれば、読めるってことになる。

GSL(日常会話の80%をカバーするGeneral Service Listとは - もりぐち!!!!)のリストと比べるのもいいかも。

Weblioで英単語記憶

単語は一度耳から聴いて、15秒後にもう一度聴きなおすと定着がいいらしい。

15秒で訓練なしにできる記憶力を倍増させる方法 読書猿Classic: between / beyond readers

で、普段よく利用させてもらってる英和辞典・和英辞典 - Weblio辞書でこれをやってみようと思った。
ここは、単語の音声が聴けるから。

ブックマークレットを使う。
これ。
weblio再生

どうも、hatenaで変換されてしまう? ようなのでソース

javascript:(function(){setTimeout(function(){document.getElementById("ePsdDl").click();},15*1000);})();

firefox25では動いた。
単純に「ダウンロード再生」のポップアップをsetTimeoutでクリックしてるだけ。

例えば、aboundの意味 - 英和辞典 Weblio辞書を調べて「クイック再生」で発音を聴いておく。

で、さきのブックマークレットを起動して、別のことを始める。
もちろん元の辞書ページは閉じない。

15秒すると、"ポップアップウインドウ"で、発音ファイルが再生される。

あとは、元のページに戻って確認するなり、ほっとくなり、そのままタブを閉じるなり。

この手のものを前にも作ったような気がするがあれはなんだったか。

windows環境のMecabとPython

windows環境でMecabPythonから使いたい。
python 2.75
Downloads - mecab - Japanese morphological analyzer - Google Project Hostingにある。
最新の"0.996"を選ぶ。
本体はexeでインストール、言語バインドは、minGWでビルドしてみる。
mecab0.996は、pythonバインディングのビルドがうまくいかない。
"undefined reference to"なんとかいうエラーが大量に出る。
libmecabは読んでるっぽいけど。

で、cygwinで試す。
結局、"0.994"を、* Cygwin - 形態素解析 MeCab をインストール! - mk-mode BLOGの手順でインストールするけど、CygwinでのMeCab-0.994のビルド - ツール群 - Tokoro's Tech-Noteのように本体にパッチを当てて、pythonバインドインストールまでがうまくいった。

test.pyも正常に動く。

となると、mecabを使う時だけcygwin pyhtonに切り換えないといけないか。結局mecabバインド以外win、cygwin同等の環境が必要に。
いっそ、全面的にcygwinに?
いや、gaeも使ってるし。

あるいは、PythonでMeCabを使うと - tomoemonの日記にあるように、ctypesというのを使ってアクセスするか。

いや、python2.5の時はwindowsで使ってたような。
とすると、windows環境でもビルド可能なpythonバインドのバージョンがあるのか。

その後

0.994のpythonバインドがVC++10expressでビルドできた。
手順はMeCab Python導入で詰まったこと - データマイニング・機械学習事始め
最後にlibmecab.dllをコピーするまで。

ひょっとしたら最新版でもいけるのかな。

InoReaderでTombfixを使う時の二つのスクリプト

InoReader閲覧中に、マウスやキーでTombfixを呼びだすために。

Extractor

最初は、InoReaderで記事を閲覧してる時に、''マウス''でTombfixを呼び出す用。
つまり右クリックのコンテキストメニューから。
これは、tombfixのパッチ。

tombfix, tombloo, InoReader, Firefox

Tombfix(tombloo)のscriptフォルダに入れる。

LDRのものの必要なところを書き換えただけだから、おかしなところはあると思う。
動けばいい人向け。
だから、ちゃんとしたのが出るか、直してくれる人待ち。

今のところは、''リンク''、''引用''、''画像''は動く気がする。

update
  • フォルダ一括閲覧時にフィードタイトルが取得できなくてエラーになっていたのを修正

UserScript

ショートカットキーで呼び出す。
ここでは、記事閲覧中に''Shift+t''で、''リンク''でTombfixが起動する。
これは、firefoxのuserscript。

tombfix, tombloo, InoReader, Firefox, userscript

これも、既存の''googlereader+tombloo''の分るとこだけ書き換えて、いらなそうなところを削除しただけだから、おかしなところはあると思う。
だから、(略)

動作確認はUserScriptLoader.uc.js 0.1.8.2のみ。

準備

このショートカットバージョンを動かすには、
TombfixとUserScriptLoader.uc.jsに、tombfixに移行して、userscript絡みの細かい修正など - うぇぶとらばぁすで書いた変更が必要。

Tombfixの方は、パッチが一つと、内部の書き換え。
UserScriptLoader.uc.jsも内部の書き換え。

余談

IRは日本語の検索も効くようだ。

LDRは、新しいフィードを追加した時、既に他に読んでる人がいると、ずっと以前の記事も表示してくれるけど、IRのほうはそういうのは無いのかな。
それとも単に、まだ絶対数が少ないから、既存フィードもないってだけ?

動作の小気味良さとフィードの蓄積はLDR、フォルダ一括閲覧とか、個別既読とか、検索を取るならIR。

full feedの作者の方がkeycustomizeの方も対応してくれたようだ。が、僕の場合、cookieswapを使う関係で、ローカルストレージじゃなくてクッキー使用に書き換えないといけないんだった。
ああfull feedの方も同じだった。

tombfixに移行して、userscript絡みの細かい修正など

RSSリーダーFeedlyにも、InoReaderにもFull Feedが作られたり、Feedly Full Feedを作ってみた - Firefox更新情報WikiブログInoReader Full Feed 0.20 - Firefox更新情報Wikiブログ、特に後者にはデフォルトで記事検索が付いてたりで、随分と状況が変わってきた。ただ、Inoの検索はなんだか日本語だとまだ上手くいかないみたいだけど。
こうなるとlivedoor Readerにこだわる理由も薄くなりつつあるけど、まだ急いで引っ越す段階でもなさそうだし、軽快な動作は魅力なので使い続けてる。

この間、tomblooも更新が止まってメインストリームはtombfixというフォーク版に移行したらしい。
で、そのための修正などをいくつか。

まず、UserScriptLoaderに追加する文は

          var tombloo = Cc['@tombfix.github.io/tombfix-service;1'].getService().wrappedJSObject.Tombfix.Service;
          sandbox.Tombloo = tombloo;

Tombfix.Serive.patch.jsくらいの適当な名前で。

Tombfix.Service.__exposedProps__ = {check: "r", share: "r"};

あと、tombfix本体の方にも。
utility.jsの$x関数内の1827行目付近

	var exp = doc.createExpression(exp, {

	var exp = doc.createExpression(exp, doc, {

に。
これは一般的に必要なのかどうか判らない。僕の環境ではこうすることで上手くいくスクリプトがあった。

TypeError: Value does not implement interface XPathNSResolver

というエラーがなくなった。

これらでldrtombloo.user.jsみたいなスクリプトは動いた。


deliciousは、tombfixの方で対応されたみたい。だけど僕はcookieswapを使うのでlocalstorageを使う現行のdeliciousの方式だとちょっと都合が悪い。
で、まだprevious.deliciousが効くみたいなのでhttps://gist.github.com/serian/4508601を使うことに。
ただ、エラー処理が上手くいかないので32-33行目は削除。