Ankiのカードをブラウザから追加したかった。

決して後退しない学習ーAnkiを使うとどうして一生忘れないのか? 読書猿Classic: between / beyond readers

Ankiの記事を見たので便乗。
最近Ankiを使い始めてて、効果のほどはまだ分からないけどまあ楽しく使っている。用途としては英単語を覚えるのがメイン。んでWebを見ていて知らない英単語があると、調べては手作業で追加していたのだけど、これがだるいなーと思ったので自動化した。ブラウザ上で単語を範囲選択、右クリックのメニューからAnkiへの単語追加コマンドを実行するだけで、追加がすむ様になった。ただしMacに限る。仕組みに使ったパーツは、

  • 辞書引きプログラム

false-git/dict · GitHub
コマンドラインからMac標準の辞書を引くプログラム。コンパイルして~/dict/dictに設置。

  • Run External Commands

Anki - friendly, intelligent flashcards
ソケットを使って外部からAnkiへの単語追加を可能にするAnkiのaddon。追加情報の書かれたxmlへのpathを入力とする。インストールするだけ。

単語を標準入力から受け取って、辞書引きプログラムで調べて、xmlつくって、上記addonにわたすスクリプト。どっか適当なところに保存。

require 'socket'

word = ARGF.read
tmp = `dict/dict #{word}`
res = tmp.lines.to_a[2,20].join

unless res.empty?
  open("/tmp/anki.xml", "w"){|f|
    xml = "<command name='add-notes' version='1.0'>                                                     
  <models>                                                                                              
  </models>                                                                                             
  <notes>                                                                                               
    <note>                                                                                              
      <model>Basic</model>                                                                              
      <tags>                                                                                            
      </tags>                                                                                           
      <fields>                                                                                          
        <field>                                                                                         
            <name>Front</name>                                                                          
            <content>#{word}</content>                                                                  
        </field>                                                                                        
        <field>                                                                                         
            <name>Back</name>                                                                           
            <content>#{res}</content>                                                                   
        </field>                                                                                        
      </fields>                                                                                         
    </note>                                                                                             
  </notes>                                                                                              
</command>                                                                                              
"

    f.write(xml)
  }
  s = TCPSocket.new("localhost", 49666)
  s.write('/tmp/anki.xml')
  s.close
end

以上を準備した後、範囲選択した単語を自作スクリプトに渡す様に設定。使用方法はここを参考にした。Mac を使っているなら必ず使うべき2つの機能 "Automator" と "サービス" - kurainの壺

これで単語登録が楽になった。

楽器.meを移調できるようにした。

ChordWikiは移調(keyの変更)の仕組みがあってアコギ+カポで楽しみやすいです。同じように楽器.meで移調が出来るスクリプトを作りました。便利。

インストールはまず、FirefoxならGreasemonkey :: Add-ons for Firefox入れて、chrome/safariならNinjaKit - os0x.blog入れます。

次に、transposeMe for Greasemonkeyに行って右上のinstallすれば準備は完了。

その後はどれでも良いんで楽器.meのコード譜見てもらうと、移調用のフォームが追加されてるんで、これで数字選べば、さっと移調がなされるはずです。

史上がなんとかの面妖な問題といた。

makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定 (1/2) - ITmedia エンタープライズ

ニコニコ市場をついついシジョウと読んじゃう派です。そのおかげか3時間以内にはできました。

class Tehai
  attr_reader :hai, :red

  def initialize(hai)
    @hai = hai.gsub(/\s/, "").each_char.map(&:to_i).sort
    @red = []
  end

  def yaku(type)
    a = {:koku=>[1,1,1],:jun=>[1,2,3],:zu=>[1,1],
      :toi=>[1,1],:ryan=>[1,2],:kan=>[1,3],:tan=>[1]}[type]

    (9-(a[-1]-a[0])).times{|i|
      hai = @hai.dup
      b = a.map{|e|e+i}.each{|e|
        if i = hai.index(e)
          hai.delete_at(i)
        end
      }

      if hai.size == @hai.size - a.size
        @hai = hai
        @red << [type, b]
        return b
      end
    }
    nil
  end

  def reduce(syms)
    syms.each{|s| yaku(s)}
    @red
  end
end

def all_syms
  return @all_syms if @all_syms

  ret = []
  [:toi,:ryan,:kan].each{|e|
    a = [:zu,e] + [:jun]*3 + [:koku]*3
    ret += a.permutation(5).to_a
  }
  a = [:tan] + [:jun]*4 + [:koku]*4
  ret += a.permutation(5).to_a

  @all_syms = ret.uniq
end

def mati(s)
  ret = []

  all_syms.each{|syms|
    hai = Tehai.new(s)
    next unless (r = hai.reduce(syms)).size == 5
    mt = r.select{|e|
      [:toi,:ryan,:kan,:tan].include?(e[0])
    }
    raise unless mt.size == 1
    mt = mt[0]
    r.delete(mt)
    te = r.transpose[1]
    ret << te.sort.map{|e|"(#{e.join})"}.join+" [#{mt[1].join}]"
  }
  ret.uniq
end

require 'pp'

pp mati("1112224588899"), ""
pp mati("1122335556799"), ""
pp mati("1112223335559"), ""
pp mati("1223344888999"), ""
pp mati("1112345678999"), ""

Firefox3.6のブックマークのスムーズスクロールを切りたい。

スムーズスクロールって奴の中途半端さ、煮え切らなさ、どっちつかずさ、やりきれなさがとても嫌いです。

ところが先日Firefoxを3.6にしたところ、ブックマークのリストに、なぜかスムーズスクロールが適応されるようになっていたのです。その後スクロールしないですむよう、ブックマークリストが一画面に収まるよう整理したのですが、それも限界を迎えました。なのでいい加減、憎きスムーズスクロールの奴に三行半つきつける覚悟を決めたのです。

URLにabout:configと入力
フィルタにtoolkit.scrollbox.smoothScroll
ダブルクリックでfalseに

意外と簡単にスムーススクロール切れました。意外とあとくされない奴でした。

radikoを録音する方法。

radiko.jpというサービスが開始になりました。現存のラジオ放送をそのままネットで配信してしまえ(地域限定ですが)というなかなか男前な試みです。

これを保存できたらなーと思ったので、その方法を紹介したいと思います。

スピーカーの前にラジカセを置いて録音

昔ながらの方法です。トイレに響が入ってないか要注意。

専用ソフトradikaを使う

つくったもの公開所: radiko録音ソフト radika
素晴らしい事にすでに専用の録音ソフトが存在します。ちゃんとFLVで保存されますので無劣化です。Windowsな方はこれが手っ取り早いかもしれません。

rtmpdumpを使う

RTMPDump
radikoのクライアントはFlashで作られており、その通信にはrtmpというプロトコルが使われています。rtmpdumpはこれを保存することが出来るツールです。この方法も生データがFLVとして保存されます。
以下実行例。

rtmpdump --rtmp "rtmp://radiko.smartstream.ne.jp:1935"\
 --playpath "simul-stream" --app "TBS/_defInst_" --live --flv TBS.flv

TBS/_defInst_のTBSの部分が局の指定となります。radikoプレイヤーのURLのhttp://radiko.jp/player/player.html#TBS の#の部分を指定します。最後のTBS.flvは保存するファイル名です。

コマンドラインゆえ面倒ですが柔軟性は高いです。予約録音なんてことも比較的容易に出来ますね。またオープンソースプロダクトなので組み込んで凝ったことを、なんていうのも出来ましょう。

TokyoTyrantを試す。

NoSQLという言葉があるそうです。リレーショナルじゃないDB群を指す言葉だそうな。その中にTokyoTyrantというDBがあることを知りました。名前がカッコイイので試すことにしました。
TokyoTyrantTokyoCabinetというDBMをネットワーク越しに使えるようにした物だそうです。なのでまずTokyoCabinetをインストールします。



ソース落としてconfigure && make && make installです。TokyoTyrantも同様にインストール。

次にtokyotyrant-1.1.40/exampleディレクトリにサンプルがあるので実行してみたいと思います。make。
まずハッシュデータベースのサーバーを立ち上げます。

ttserver ex.tch

ここでファイルの拡張子にtchを指定することによりハッシュタイプのデータベースになります。
サンプルを実行します。

./tcrdbex

hopって出たらたぶん成功です。
つぎにテーブルデータベース。さっきのサーバーをなんとか落としてから。

ttserver ex.tct

ここでファイルの拡張子に"tct"を指定することによりテーブルタイプのデータベースになります。わかりにくい。

./tcrdbtblex

実行結果。

12345   name    falcon  age     31      lang    ja
1       name    mikio   age     30      lang    ja,en,c

たぶん成功です。