Just another Ruby porter,

〜2010年1月中旬〜


<Prev(,) | Next(.)> | Recent(/)>> | RDF

2010-01-11 (Mon)

[Fedora] NetworkManagerでdnsmasqの設定

DNS serversにカンマ区切りでサーバを並べられるので、127.0.0.1を先頭に置く。
/etc/resolv.confを直接いじらない。

この設定は固定IPのときにしか使えない。DHCPだとDNS serverも配っちゃうので。
そんときは安易ではあるが、NetworkManagerをアンインストールするのが簡単。
まあ、なくても困るようなもんでもないしねえ。


2010-01-12 (Tue)

[markdown] kramdownのfenced code block

3つ以上チルダで前後を囲めばcode blockとして扱われる。
markdownのインデントは結構面倒だったが、これはいいね。

[CMS] nanoc3でkramdownを使う

lib/kd.rb(名前は適当)に

Class.new(Nanoc3::Filter) do
  identifier :kramdown
  def run(content, params={})
    require 'kramdown'
    Kramdown::Document.new(content).to_html
  end
end

てな感じで書いて、Rulesに

compile '/' do
  filter :erb
  filter :kramdown
  layout 'default'
end

と書けば使える。


2010-01-13 (Wed)

[Linux] ext4へ移行

外付けのHDDをext3からext4へ移行させた。
単にext4でmountするだけで勝手にext4になるらしい。
と言ってもつなぐと/media/*にext3で勝手にmountされちゃうので、
適当に手動でmountしていじってみることにした。
これでほんとにext4になるのか?


2010-01-14 (Thu)

[Tips] More precise BASH debugging

これはなかなか素晴しい。

% PS4=' ${BASH_SOURCE}:${LINENO}(${FUNCNAME[0]}) ' sh -x /etc/profile |&head -n5
 /etc/profile:22() '[' -z 500 -a -x /usr/bin/id ']'
 /etc/profile:28() '[' 500 = 0 ']'
 /etc/profile:33() pathmunge /usr/local/sbin after
 /etc/profile:12(pathmunge) echo /usr/bin:/usr/local/bin:/bin:/home/eban/bin
 /etc/profile:12(pathmunge) /bin/egrep -q '(^|:)/usr/local/sbin($|:)'

2010-01-15 (Fri)

[Fedora] Dropbox

すっかり忘れていたDropboxをインストール。
なぜか最新はF10用だがまあ問題なく動く。

クライアントを動かしとけば3ヶ月ルールは大丈夫らしい。


2010-01-16 (Sat)

[Fedora] Development Libraries

なんかいろいろmakeするたびにヘッダがないだのライブラリがないだの言われる。
LiveCDが元だしな。
もう面倒臭いのでgroupinstallでDevelopment Librariesをインストール。
これで少しはましになるか。


2010-01-17 (Sun)

[RSS] newsbeuter

CUIなRSSリーダ。なかなかいいんだけど、日本語泣き別れ問題があってちょっと残念。
あとキーバインドもあまり好みじゃない。

[RSS] Canto

残念ながら何をやってもSEGV。よさげなんだけどね。

もうちょっと探してみるか。


2010-01-18 (Mon)

[RSS] rsstail

今日はなぜかFLDRが更新されなかったので、rsstailを使ってみた。
だいたいいいんだけど、たまにeuc-jpなfeedがあったりするのでnkfを通したほうが無難。
これくらいならRubyでも書けるか。

[RSS] rsstailもどき

かなりいいかげんではあるがこんな感じであとは新エントリだけ表示すればいいんだな。

require 'rss'
require 'cgi'

class String
  def norm
    CGI::unescapeHTML(self).
      gsub("&nbsp;", " ").gsub(/<.+?>/m,"").gsub(/\n{2,}/, "\n\n").strip
  end
end

ARGV.each do |url|
  feed = RSS::Parser.parse(url, false)
  feed.output_encoding = "utf-8"
  feed = feed.to_rss("1.0") do |maker|
    maker.channel.about ||= maker.channel.link
    maker.channel.description ||= "No description"
    maker.items.each do |item|
      item.title ||= "No title"
      item.link ||= "UNKNOWN"
    end
  end

  feed.items.each do |item|
    puts "title: " + item.title.norm
    desc = (item.content_encoded || item.description).to_s.norm
    puts "desc: " + desc unless desc.empty?
    puts "date: " + (item.date || item.dc_date).to_s
    puts "link: " + item.link
    puts
  end
end

% ruby feeds.rb http://feed.natalie.mu/rss/natalie/news|tail -n5
title: L'Arc-en-Cielテキストブック第2弾で作品への思いを語る
desc: L'Arc-en-Cielのオフィシャルテキストブック「WORDS II」が、3月31日に刊行される。
date: 2010-01-17T13:24:00+09:00
link: http://natalie.mu/news/show/id/26433

2010-01-19 (Tue)

[RSS] rsstailもどきの続き

前回の更新から変更のあったものだけを取り出したいわけなんだけど、
item.dateやitem.dc_dateが両方ともnilになるfeedがあったりでちょっと困った。
labaqなんだけど。これだと比較できない。
しょうがないので最初のエントリのタイトルを覚えておいて、
これが前回と違ったら更新されているとみなすことにした。
あとIf-Modified-Sinceヘッダもつけてみた。

~/.feedmon/urlsにフィードのurlを1行に1個ずつ書く。

require 'rss'
require 'cgi'
require 'digest'
require 'fileutils'

class String
  def norm
    CGI::unescapeHTML(self).
      gsub("&nbsp;", " ").gsub(/<.+?>/m,"").gsub(/\n{2,}/, "\n\n").strip
  end
end

feedmondir = File.expand_path("~/.feedmon")
lastdir = File.join(feedmondir, "last")
FileUtils.mkdir_p lastdir

loop do
  urls = File.readlines(File.join(feedmondir, "urls")).map(&:chomp) rescue []
  begin
    urls.each do |url|
      urlfile = File.join(lastdir, Digest::MD5.hexdigest(url))
      last_time, last_title = File.readlines(urlfile).map(&:chomp) rescue []
      puts Time.now.strftime("%Y-%m-%d %X") + " " + url
      begin
        string = open(url, "If-Modified-Since" => last_time){|f|f.read}
      rescue => e
        puts "  " + e
        next
      end
      last_time = Time.parse(last_time)
      feed = RSS::Parser.parse(string, false)
      feed.output_encoding = "utf-8"
      feed = feed.to_rss("1.0") do |maker|
        maker.channel.about ||= maker.channel.link
        maker.channel.description ||= "No description"
        maker.items.each do |item|
          item.title ||= "No title"
          item.link ||= "UNKNOWN"
        end
      end

      title0 = feed.items[0].title
      feed.items.each do |item|
        date = item.date || item.dc_date

        if last_time and date
          next if last_time >= date
        else
          next if title0 == last_title
        end

        desc = (item.content_encoded || item.description).to_s.norm
        puts "title: " + item.title.norm
        puts "desc: " + desc unless desc.empty?
        puts "date: " + date.to_s if date
        puts "link: " + item.link
        puts
      end
      open(urlfile, "w") do |f|
        f.puts Time.now.utc.rfc822.sub(/[-+]?0000/,"GMT")
        f.puts title0
      end
    end
  rescue
    puts $@
  ensure
    puts Time.now.to_s + ", updated\n\n"
    $stdout.flush
    sleep 15*60
  end
end

utc.rfc822はなんで-0000になるんだろう?

[Golf] 369

.*?は気づかなかったなあ。それにしても nnさんのawkの解 にはまいった。!gsubで必ず0になるからprint $0ってことなんだよなあ。
すばらしい。


2010-01-20 (Wed)

[Golf] 昨日の369.awkの説明の訂正

昨日の説明は間違ってた。
3,6,9を含まないときは当然gsubは0を返すので、結局!gsubは0か1を返すことになる。
フィールドは1個だけなので$0でも$1でも結果は同じ。というのがミソなんだな。


<Prev(,) | Next(.)> | Recent(/)>> | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!