2008年 07月 14日

CMS

なんか washer-in-the-rye.com を管理するにあたって簡単な CMS が欲しいので要件を整理しておく (theruck でつくる)

  • 簡単に編集できて管理できること
  • マルチリンガルであること
  • ERB をテンプレートに
  • HTML 直編集したい (あのページは実は microformats と RDF 埋め込みによる XSLT での RDF への変換をサポートしています)

思いついたこと

  • git 使いたい
    • git push すると本番に反映されるように
  • 別に本番環境で確認できる必要なくね?
    • ruby foobar.rb するとローカルウェブサーバが立ち上がって確認できればいい

ゆの まとめ用スクリプト

ブクマからキーワードページのテーブルにするやつ

require "rubygems"
require "mechanize"
require "active_support"
require "time"

@ua = WWW::Mechanize.new

puts "|*言語|*リンク|"
begin
	results = []

	uri = "http://b.hatena.ne.jp/cho45/atomfeed?tag=%E3%82%86%E3%81%AE%20in%20language"
	loop do
		begin
			warn uri
			@ua.get uri
			doc = XmlSimple.xml_in(@ua.page.body)
			raise "Bug?" unless doc["entry"]

			results.concat doc["entry"]

			next_link = doc["link"].find {|link| link["rel"] == "next" }
			break unless next_link
			uri = next_link["href"]
		rescue RuntimeError
			sleep 1
			retry
		end
	end

	results.map! {|entry|
		entry.update("lang" => entry["subject"] - ["ゆの", "language", "ゆの in language", "ひだまりスケッチ"])
	}

	results = results.sort_by {|entry| [entry["lang"], entry["issued"]] }.map { |entry|
		warn entry["subject"].inspect
		"|%s|[%s:title]|" % [
			entry["lang"],
			entry["link"].find {|link| link["rel"] == "related" }["href"],
		]
	}

	raise "Bug?" if results.uniq!
rescue RuntimeError
	sleep 1
	retry
end
puts results

なんかちゃんとフィードがとれないことがあるのでチェックかけてリトライしてる。

git でサイト管理する

とりいそぎ CMS 作るまでにあいだ git push で更新できるようにした

$ cat .git/hooks/post-receive
#!/bin/sh

cd ..
/virtual/lowreal/git/bin/git --git-dir=.git reset --hard

ってやると push したときに Working Copy が hard reset されて更新される。なんか PWD と --git-dir をうまいこと指定しないとダメだった…… (フックスクリプトの実行時の pwd は .git 以下)

常に reset がかかるのでリモートでファイル編集とかしちゃだめ。今まで rsync してたけど --delete が怖くてできなかったのでこれでスッキリ

2008年 07月 13日

ゆの in PHP4

<?php
function x ($buf) {
	return str_replace("X / _ / X <", "ひだまりスケッチ×365", $buf);
}

ob_start("x");
?>

X / _ / X < 来週も見てくださいね!


<?php ob_end_flush(); ?>

僕の PHP の知識は 4 で止まっています。

もっと短かくなるよ!

http://subtech.g.hatena.ne.jp/mayuki/20080713/1215952300

php -v したら 5 でした……

2008年 07月 12日

Re: ゆの in Ruby

「おまえのコードつまんねーんだよ!!11」ってゆわれた気がしたのでバリエーションつくってみました><

# *_missing
class Object
	def self.const_missing(n)n end
	def method_missing(n, *a)
		print (n == :<) ? a : ({
			[:_, $!] => "ひだまり",
			[:/, :_] => "スケッチ",
			[:/, :X] => "×365"
		}[[n, a[0]]] || " ")
		n
	end
end


X / _ / X < 来週も見てくださいね!
# 上のと同じのをちょっとゴルフぽく。(むずい)
class X;end
class Object
def method_missing(n,*a)print n==:<?a:({[:_,$!]=>:ひだまり,[:/,:_]=>:スケッチ,[:/,X]=>:×365}[[n,a[0]]]||" ");n end
end

X / _ / X < 来週も見てくださいね!
# ひたすらエラーハンドリング

begin

X / _ / X < 来週も見てくださいね!

rescue NoMethodError => e
	case e.message[/`(.+)'/, 1]
	when "/"
		print "×"
		Object.__send__(:define_method, :/) {|
			x| _ |x
		}
		Object.__send__(:public, :/)
		retry
	when "|"
		print "365 "
		Regexp.__send__(:define_method, :|) {
			(/ _ /x)
		}
		retry
	else
		puts Regexp.last_match[1]
	end
rescue NameError => e
	case e.message
	when /constant X/
		Kernel.const_set(:X, :X)
		print "ひだまり"
		retry
	when /variable or method `_'/
		Kernel.__send__(:define_method, :_) { (/ _ /x) }
		print "スケッチ"
		retry
	end
end

とてもねむい

ゆの in Lua

なんかまだないっぽい

X = setmetatable({ x = "" }, {
	__div = function (o1, o2)
		if o2 then
			X.x = X.x .. "スケッチ"
		else
			X.x = X.x .. "ひだまり"
		end
		return o1
	end,

	__lt  = function (o1, o2)
		print(X.x)
		return X
	end,

	__call = function (self, arg)
		X.x = X.x .. "×365 " .. arg
		return X
	end,
})


return
X / _ / X < X"来週も見てくださいね!"
  • 普通に演算子オーバーロード
  • return つけないと式とみなされなくて syntax error
  • print は改行が入ってしまうので最後に一度だけ
  • 連結演算子が .. であることをすっかり忘れていてハマった
  • 比較演算子はオペランドが両方とも同じ型でないとエラーになってしまうため、ラップしてる
  • X"foo" は X("foo") と同じ、でもって、関数呼びだしはメタテーブルの __call になる。
  • 宣言していない、一度も代入していない変数が普通に nil として使えてしまうので _ に定義はいらない
2008年 07月 10日

ゆの in shell

$ echo '#!/bin/sh\necho "ひだまりスケッチ×365 $(readlink $0)"' > 来週も見てくださいね\! 
$ ln -s 来週も見てくださいね\! X
$ ln -s /bin/cat _
$ PATH=.:/bin
$ chmod +x X| _ |X
ひだまりスケッチ×365 来週も見てくださいね!
$ X / _ / X < 来週も見てくださいね\! 
ひだまりスケッチ×365 来週も見てくださいね!

大事なことなので2度ずつ言いました。(環境壊れます)

2008年 07月 09日

~/ がうちにくい

MacBook だとやたら `/ と typo して悲しいので

expand-to-home-or-insert () {
	if [ "$LBUFFER" = "" -o "$LBUFFER[-1]" = " " ]; then
		LBUFFER+="~/"
	else
		zle self-insert
	fi
}

zle -N expand-to-home-or-insert
bindkey "\\"  expand-to-home-or-insert

というふうにしてみました。先頭とかで \ をうったりすると ~/ に展開されます。どうしても \ を入力したいときは C-v \ すればたぶん入力できます。できないなら

bindkey "^V" quoted-insert

reload

ujihisa さんの .zshrc みて alias reload="exec zsh" があったので真似したのですが、たまに C-z かけた vim が露頭に迷うので

# vim とかが露頭に迷わないように
function reload () {
	local j
	jobs > /tmp/$$-jobs
	j=$(</tmp/$$-jobs)
	if [ "$j" = "" ]; then
		exec zsh
	else
		fg
	fi
}

こうしました。job がのこってるなら「終了しろよ!!!」って感じで fg かかります。

2008年 07月 08日

ゆの in Ruby

#!ruby -Ku

class X
	attr_reader :a, :b

	def self./(a)
		new(a)
	end

	def self.to_s
		"×365"
	end

	def initialize(a)
		@a = a
	end

	def /(b)
		@b = b
		print self
		self
	end

	def <(o)
		puts " #{o}"
	end

	def to_s
		@a.a + "スケッチ" + b.to_s
	end

	class ::Object
		def _
			X.new("ひだまり")
		end
	end
end



X / _ / X < :来週も見てくださいね!

正式名称になるように一文字足しました