GUI-less XMMS

xmmsからGUIを取り除いたプログラムがある。いつかconfigure optionで設定できるように本家に取り込まれるといいかもしれない。

http://radioqualia.va.com.au/guile

http://xmmsd.sourceforge.net/noxmms

でもratpoison的には
unmanage XMMS
しているからGUI-lessにしたって数MBのメモリが浮くだけだろう。

てかguileってScheme処理系の名前とかぶってるじゃん。

グループに登録・はてダラの設定

http://www.hyuki.com/techinfo/hatena_diary_writer.html#faq_groupdiary

せっかくグループに加入したので、はてダラ側の設定もやる。 けどほぼ同じ内容の設定ファイルを蒔き散らかすのはDRYに反してて好きではない。 config.txt一括生成スクリプトmake-group-config.rbを書いた。

俺の設定では ~/memo/hatena にはてな日記を置いているので、make-group-config.rbもそこに置く。

require 'fileutils'

TEMPLATE = <<'XXX'
id:USERNAME
password:PASSWORD
cookie:~/memo/hatena/cookie.txt
filter:nkf -w %s
g:__GROUP__
XXX

for group in ARGV
  config = "#{group}/config.txt"
  puts "Writing #{config}"
  FileUtils.mkdir_p group
  open(config, "w") do |f|
    f.print TEMPLATE.sub(/__GROUP__/, group)
  end
end

ruby make-group-config.rb ruby rubyist

のようにグループ名を引数にして実行〜

Emacs側にはこれを加えておいた。

(defvar hatena-groups '("dprogramming" "lisp" "ruby" "rubyist"))

(defun hatena-group (group)
  "Open today's hatena group diary file."
  (interactive
   (list (completing-read "Group: " (mapcar 'list hatena-groups) nil t)))
  (find-file
   (concatenate 'string hatena-dir "/" group "/"
                (format-time-string "%Y-%m-%d.txt" (current-time)))))

On LispのmemoizeをRubyに翻訳してみる

# (defun memoize (fn)
#   (let ((cache (make-hash-table :test #'equal)))
#     #'(lambda (&rest args)
#         (multiple-value-bind (val win) (gethash args cache)
#           (if win
#               val
#               (setf (gethash args cache)
#                     (apply fn args)))))))

module Memoize
  def memoize(fn)
    cache = {}
    lambda{|*args|
      val = cache[args]
      if cache.has_key?(args)
        val
      else
        cache[args] = __send__(fn, *args)
      end
    }
  end
end

def f(x)
  sleep 0.2
  x*10
end

require 'benchmark'
include Benchmark

def real(&block)
  measure(&block).real
end

include Memoize
memf = memoize(:f)
real{ memf[100] }                # => 0.197517156600952
real{ memf[100] }                # => 1.81198120117188e-05
real{ memf[100] }                # => 1.38282775878906e-05
memf[100]                        # => 1000

Kernel.module_eval { define_method(:mf, &memf) }
real{ mf(7) }                   # => 0.199476003646851
real{ mf(7) }                   # => 1.69277191162109e-05
mf(7)                           # => 70

class Hoge
  def f(x)
    sleep 0.2
    x*100
  end

  module_eval do
    extend Memoize
    define_method(:mf, &memoize(:f))
  end
end

h = Hoge.new
real { h.mf(99) }                # => 0.199654817581177
real { h.mf(99) }                # => 1.59740447998047e-05