<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xml:lang="ja">
  <channel rdf:about="http://shinshu.fm/MHz/48.59/index.rss10">
    <title>徒然日記</title>
    <link>http://shinshu.fm/MHz/48.59/</link>
    <description>日常の出来事、鉄ネタ、語学ネタなどを徒然なるままに綴っています。</description>
    <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
    <admin:generatorAgent rdf:resource="http://www.raelity.org/computers/internet/weblogs/blosxom/plugins/rss10.html"/>
    <admin:errorReportsTo rdf:resource="mailto:blog@shinshu.fm"/>
        <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000318535.html" />
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000314348.html" />
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000311756.html" />
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000311754.html" />
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000311481.html" />
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000310219.html" />
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000308145.html" />
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000307543.html" />
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000305905.html" />
        <rdf:li rdf:resource="http://shinshu.fm/MHz/48.59/archives/0000300189.html" />

      </rdf:Seq>
    </items>

  </channel>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000318535.html">
  <title>他愛ない日常</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000318535.html</link>
  <description>今日は「白い日（直訳）」だと言うが私には関係がなかった。
そして某イベントは行ってない。交通費ないし。
しかし最近よく悪夢を見るような気がする。精神が不安定なのか。
ある程度なら瞑想でコントロールできるのだが。

タイトルは特に意味はないですが、ちょうど...</description>
  <dc:subject>日記</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2010-03-14T21:58:00+09:00</dc:date>
  <content:encoded><![CDATA[
今日は「白い日（直訳）」だと言うが私には関係がなかった。<br />
そして某イベントは行ってない。交通費ないし。<br />
しかし最近よく悪夢を見るような気がする。精神が不安定なのか。<br />
ある程度なら瞑想でコントロールできるのだが。<br />
<br />
タイトルは特に意味はないですが、ちょうどダブルクロス3rdEditionのオンセをやっているところなので。<br />
<br />
Twitterやってるとこっちが疎かになってきてるような。<br />
<br />
あと最近、Wikipediaに<a href="http://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AD%E3%83%B3%E3%83%88%E8%AA%9E" target="_blank">こんなページ</a>が出来ていることを知った。<br /><br />
  ]]>
  </content:encoded>
</item>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000314348.html">
  <title>新しいPCに</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000314348.html</link>
  <description>先週から新しいPCになりました。今まで使ってたのが電源点かなくなって（点く時は点く）買い換えることになったのです。
実はデュアルブートにしようとしてUbuntuも入れようとしたんですが無線LANがつながらなくて断念、Cygwinで我慢しました…
あと無線LANなんですが前...</description>
  <dc:subject>日記</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2010-02-06T09:41:00+09:00</dc:date>
  <content:encoded><![CDATA[
先週から新しいPCになりました。今まで使ってたのが電源点かなくなって（点く時は点く）買い換えることになったのです。<br />
実はデュアルブートにしようとしてUbuntuも入れようとしたんですが無線LANがつながらなくて断念、Cygwinで我慢しました…<br />
あと無線LANなんですが前のアダプタ（PCI接続）が認識しないのでUSB接続のやつを買うはめになっています。<br />
<br />
うちのPCのスペック<br />
・OS…Windows 7 Home Premium 32bit<br />
・CPU…Core i5 750 2.67GHz<br />
・RAM…2GB<br />
・HDD…512GB<br />
・GPU…GeForce GT 240<br />
・モニタ…FLATRON W2243T (LG電子)、<br />
・解像度…1920×1080 (フルHDサイズ)<br />
・マウス…USB接続の光学マウス<br />
・キーボード…日本語配列<br />
・無線子機…Buffalo WLI-UC-G301N<br />
・スピーカー…なし<br />
・ヘッドセット…ELECOM MS-HS58V<br />
PCの評価は5.5でした（RAMの成績）。<br />
<br /><br />新しいPCの環境を整えるにあたって導入したソフト<br />
・<a href="http://www.free-av.com/jp" target="_blank">Avira AntiVir Personal 日本語版</a> (前のPCでは英語版だったのだがこの機会に日本語版にしてみた)<br />
・<a href="http://limechat.net/" target="_blank">LimeChat</a> (TRPGのオンラインセッションをするため)<br />
・<a href="http://www.misuzilla.org/dist/net/twitterircgateway/" target="_blank">TwitterIrcGateway</a> (<a href="http://codetta.seesaa.net/article/140225370.html" target="_blank">自作パッチ</a>適用)<br />
・<a href="http://mozilla.jp/firefox/" target="_blank">Firefox</a> (メインブラウザに設定、適用アドオンは後述)<br />
・<a href="http://jp.opera.com/" target="_blank">Opera</a><br />
・<a href="http://www.google.com/chrome/intl/ja/landing.html?hl=ja&hl=ja" target="_blank">Google Chrome</a> (適用拡張機能は後述)<br />
・<a href="http://homepage3.nifty.com/Tatsu_syo/MySoft/BookSync/index.html" target="_blank">BookSync</a><br />
・<a href="http://www.adobe.com/jp/products/reader/" target="_blank">Adobe Reader</a><br />
・<a href="http://get.adobe.com/jp/flashplayer/" target="_blank">Adobe Flash Player</a><br />
・<a href="http://www.google.com/intl/ja/ime/" target="_blank">Google 日本語入力</a> (前のPCでは何故かインストールでエラーが出た。麻雀用語と東方の辞書を入れた)<br />
・<a href="http://mozilla.jp/thunderbird/" target="_blank">Thunderbird</a> (既定のメーラーに設定)<br />
・<a href="http://mana.ikuto.com/" target="_blank">真魚</a> (「まな」と読む。テキストエディタ)<br />
・<a href="http://www.skype.com/intl/ja/" target="_blank">Skype</a> (前のPCではVer3.8をずるずる使い続けていた)<br />
・<a href="http://ja.openoffice.org/" target="_blank">OpenOffice.org</a> (MS OfficeなしのPCを購入した)<br />
・<a href="http://www.gimp.org/" target="_blank">GIMP</a> (前のPCでは廉価なやつを使っていたがWindows7で動くか試してない)<br />
・<a href="http://www.cygwin.com/" target="_blank">Cygwin</a> (Ver1.7.1が出てました。デュアルブート環境の構築に失敗したのでこれで)<br />
・<a href="http://sourceforge.jp/projects/ttssh2/" target="_blank">Tera Term</a> (サーバーを動かしているとかではないのでこれはCygwin用)<br />
・<a href="http://www.microsoft.com/japan/msdn/vstudio/Express/" target="_blank">Visual Studio 2008 Express Edition</a> (元は自作パッチのビルドのため)<br />
・<a href="http://www.videolan.org/vlc/" target="_blank">VLC Media Player</a><br />
・<a href="http://hsp.tv/" target="_blank">Hot Soup Processor</a><br />
・<a href="http://twsynth.sourceforge.jp/" target="_blank">Timidity++</a> (一応DTMとかもやるので…シーケンサーの類はまだ入れてないですが)<br />
・<a href="http://www.stereopsis.com/flux/" target="_blank">f.lux</a><br />
・<a href="http://chi.usamimi.info/Program/Application/BouyomiChan/" target="_blank">棒読みちゃん</a> (SkypeやIRCの読み上げ用)<br />
・<a href="http://bnassoft.s35.xrea.com/" target="_blank">TaskTrayPlus</a> (ウィンドウが邪魔なので)<br />
<br />
現在入れてるFirefoxのアドオン<br />
・<a href="https://addons.mozilla.jp/firefox/details/1865" target="_blank">Adblock Plus</a><br />
・<a href="https://addons.mozilla.org/ja/firefox/addon/10909" target="_blank">Coral IE Tab</a> (オリジナルのIETabがVer3.6に対応していないため)<br />
・<a href="https://addons.mozilla.jp/firefox/details/26" target="_blank">Download Statusbar</a><br />
・<a href="https://addons.mozilla.jp/firefox/details/5081" target="_blank">Echofon</a> (Twitterのクライアント。前述のIRCがあるので、これは無くても困らない)<br />
・<a href="https://addons.mozilla.jp/firefox/details/5791" target="_blank">Flagfox</a> (あると便利)<br />
・<a href="https://addons.mozilla.jp/firefox/details/1117" target="_blank">FoxClocks</a> (JST、PST、UTCを表示する設定)<br />
・<a href="https://addons.mozilla.org/ja/firefox/addon/748" target="_blank">Greasemonkey</a> (<a href="http://userscripts.org/scripts/show/8551" target="_blank">AutoPagerize</a>、<a href="http://userscripts.org/scripts/show/11759" target="_blank">Minibuffer</a>、<a href="http://userscripts.org/scripts/show/11562" target="_blank">LDRize</a>)<br />
・<a href="https://addons.mozilla.jp/firefox/details/1122" target="_blank">Tab Mix Plus</a> (挙動をチューニングしているため無いと困る)<br />
・<a href="http://wiki.github.com/to/tombloo/" target="_blank">Tombloo</a><br />
<br />
Tab Mix Plusの設定<br />
・リンク-ファイルをダウンロードするときに空白タブが開かないようにする をオンに<br />
・イベント-タブを開く-新しいタブを現在のタブの直後に開く をオンに<br />
・イベント-タブを開く-Open other tabs next to current one をオンに<br />
・イベント-タブを開く-開くタブの並び順を変更 をオンに<br />
・イベント-タブを開く-最後のタブを閉じたとき、ウィンドウ自体は閉じない をオンに<br />
・マウス-マウスクリック-ダブルクリック-タブ を タブを保護＆ロック に<br />
・マウス-マウスクリック-Shift+クリック-タブ を 何もしない に<br />
・マウス-マウスクリック-Alt+クリック-タブ を 何もしない に<br />
・メニュー-タブのコンテキストメニュー-タブを閉じる をオンに<br />
・メニュー-タブのコンテキストメニュー-すべてのタブを閉じる をオンに<br />
・メニュー-タブのコンテキストメニュー-他のタブをすべて閉じる をオンに<br />
・メニュー-タブのコンテキストメニュー-左側のタブをすべて閉じる をオンに<br />
・メニュー-タブのコンテキストメニュー-右側のタブをすべて閉じる をオンに<br />
・セッション-Firefox内蔵のセッション復元機能を使用する をオフに<br />
・セッション-セッションマネージャを有効にする をオンに<br />
・セッション-起動/終了時-ブラウザ起動時 を 復元する前にたずねる に<br />
(前のPCでは復元しない設定にしていたが、余裕のあるPCになったので変えた)<br />
<br />
現在入れてる Google Chrome の拡張機能<br />
・<a href="https://chrome.google.com/extensions/detail/gighmmpiobklfepjocnamgkkbiglidom" target="_blank">AdBlock</a><br />
・<a href="https://chrome.google.com/extensions/detail/jhejngphiacapbgllhagbpdkkdieeaej" target="_blank">Chrome Flags</a><br />
・<a href="https://chrome.google.com/extensions/detail/hehijbfgiekmjfkfjpbkbammjbdenadd" target="_blank">IE Tab</a><br />
・<a href="https://chrome.google.com/extensions/detail/ldcnohnnlpgglecmkldelbmiokgmikno" target="_blank">Taberareloo</a><br />
<br />
今のところこんな感じ。<br />
Geekの必需品って他にあるかな
  ]]>
  </content:encoded>
</item>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000311756.html">
  <title>IRCクライアントからちゅいったーを使う</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000311756.html</link>
  <description>rubyで何をしていたのかと言うと、「ちゅいったー」と言うサービスにIRCクライアントからつなぐための中継ツールを作っていたんです。hig.rbを元にして作ったんで名前もchig.rbとかそんなんで。

ソースコード一応ここに書いておきますがちゃんとした場所にアップしたほ...</description>
  <dc:subject>雑記</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2010-01-19T22:12:00+09:00</dc:date>
  <content:encoded><![CDATA[
rubyで何をしていたのかと言うと、「<a href="http://chuitter.jp/" target="_blank">ちゅいったー</a>」と言うサービスにIRCクライアントからつなぐための中継ツールを作っていたんです。hig.rbを元にして作ったんで名前もchig.rbとかそんなんで。<br />
<br />
ソースコード一応ここに書いておきますがちゃんとした場所にアップしたほうがいいのかなぁ。<br /><br /><blockquote><pre>#!/usr/bin/env ruby<br />
# vim:fileencoding=UTF-8:<br />
=begin<br />
# chig.rb<br />
<br />
## Launch<br />
<br />
	$ ruby chig.rb<br />
<br />
If you want to help:<br />
<br />
	$ ruby chig.rb --help<br />
<br />
## Configuration<br />
<br />
Options specified by after irc realname.<br />
<br />
Configuration example for Tiarra ( http://coderepos.org/share/wiki/Tiarra ).<br />
<br />
	chuitter {<br />
		host: localhost<br />
		port: 16688<br />
		name: username@example.com athack jabber=username@example.com:jabberpasswd tid=10 ratio=10:3:5<br />
		password: password on Chuitter<br />
		in-encoding: utf8<br />
		out-encoding: utf8<br />
	}<br />
<br />
### athack<br />
<br />
If `athack` client option specified,<br />
all nick in join message is leading with @.<br />
<br />
So if you complemente nicks (e.g. Irssi),<br />
it's good for Twitter like reply command (@nick).<br />
<br />
In this case, you will see torrent of join messages after connected,<br />
because NAMES list can't send @ leading nick (it interpreted op.)<br />
<br />
### tid=<color><br />
<br />
Apply id to each message for make favorites by CTCP ACTION.<br />
<br />
	/me fav id<br />
<br />
<color> can be<br />
<br />
	0  => white<br />
	1  => black<br />
	2  => blue         navy<br />
	3  => green<br />
	4  => red<br />
	5  => brown        maroon<br />
	6  => purple<br />
	7  => orange       olive<br />
	8  => yellow<br />
	9  => lightgreen   lime<br />
	10 => teal<br />
	11 => lightcyan    cyan aqua<br />
	12 => lightblue    royal<br />
	13 => pink         lightpurple fuchsia<br />
	14 => grey<br />
	15 => lightgrey    silver<br />
<br />
<br />
### jabber=<jid>:<pass><br />
<br />
If `jabber=<jid>:<pass>` option specified,<br />
use jabber to get friends timeline.<br />
<br />
You must setup im notifing settings in the site and<br />
install "xmpp4r-simple" gem.<br />
<br />
	$ sudo gem install xmpp4r-simple<br />
<br />
Be careful for managing password.<br />
<br />
### alwaysim<br />
<br />
Use IM instead of any APIs (e.g. post)<br />
<br />
### ratio=<timeline>:<friends>:<channel><br />
<br />
## License<br />
<br />
Ruby's by cho45<br />
<br />
Based on hig.rb, adapted by MihailJP<br />
(@mh on Chuitter, @MihailJP on Twitter)<br />
<br />
=end<br />
<br />
$LOAD_PATH << "lib"<br />
$LOAD_PATH << "../lib"<br />
<br />
$KCODE = "u" unless defined? ::Encoding # json use this<br />
<br />
require "rubygems"<br />
require "net/irc"<br />
require "net/http"<br />
require "uri"<br />
require "json"<br />
require "socket"<br />
require "time"<br />
require "logger"<br />
require "yaml"<br />
require "pathname"<br />
require "cgi"<br />
require "digest/md5"<br />
<br />
Net::HTTP.version_1_2<br />
<br />
class ChuitterIrcGateway < Net::IRC::Server::Session<br />
	def server_name<br />
		"chuittergw"<br />
	end<br />
<br />
	def server_version<br />
		"0.0.0"<br />
	end<br />
<br />
	def main_channel<br />
		"#chuitter"<br />
	end<br />
<br />
	def api_base<br />
		URI(ENV["CHUITTER_BASE"] || "http://chuitter.jp/api/")<br />
	end<br />
<br />
	def api_source<br />
		"chig.rb"<br />
	end<br />
<br />
	def jabber_bot_id<br />
		nil<br />
	end<br />
<br />
	def hourly_limit<br />
		60<br />
	end<br />
<br />
	class ApiFailed < StandardError; end<br />
<br />
	def initialize(*args)<br />
		super<br />
		@channels   = {}<br />
		@user_agent = "#{self.class}/#{server_version} (chig.rb)"<br />
		@counters   = {} # for jabber fav<br />
	end<br />
<br />
	def on_user(m)<br />
		super<br />
		post @prefix, JOIN, main_channel<br />
		post server_name, MODE, main_channel, "+o", @prefix.nick<br />
<br />
		@real, *@opts = @opts.name || @real.split(/\s+/)<br />
		@opts = @opts.inject({}) {|r,i|<br />
			key, value = i.split("=")<br />
			r.update(key => value)<br />
		}<br />
		@tmap = TypableMap.new<br />
<br />
		if @opts["jabber"]<br />
			jid, pass = @opts["jabber"].split(":", 2)<br />
			@opts["jabber"].replace("jabber=#{jid}:********")<br />
			if jabber_bot_id<br />
				begin<br />
					require "xmpp4r-simple"<br />
					start_jabber(jid, pass)<br />
				rescue LoadError<br />
					log "Failed to start Jabber."<br />
					log 'Installl "xmpp4r-simple" gem or check your id/pass.'<br />
					finish<br />
				end<br />
			else<br />
				@opts.delete("jabber")<br />
				log "This gateway does not support Jabber bot."<br />
			end<br />
		end<br />
<br />
		log "Client Options: #{@opts.inspect}"<br />
		@log.info "Client Options: #{@opts.inspect}"<br />
<br />
		timeline_ratio, friends_ratio, channel_ratio = (@opts["ratio"] || "10:3:5").split(":").map {|ratio| ratio.to_i }<br />
		footing = (timeline_ratio + friends_ratio + channel_ratio).to_f<br />
<br />
		@timeline = []<br />
		@check_follows_thread = Thread.start do<br />
			loop do<br />
				begin<br />
					check_friends<br />
				rescue ApiFailed => e<br />
					@log.error e.inspect<br />
				rescue Exception => e<br />
					@log.error e.inspect<br />
					e.backtrace.each do |l|<br />
						@log.error "\t#{l}"<br />
					end<br />
				end<br />
				sleep freq(friends_ratio / footing)<br />
			end<br />
		end<br />
<br />
		return if @opts["jabber"]<br />
<br />
		@check_timeline_thread = Thread.start do<br />
			sleep 10<br />
			loop do<br />
				begin<br />
					check_timeline<br />
				rescue ApiFailed => e<br />
					@log.error e.inspect<br />
				rescue Exception => e<br />
					@log.error e.inspect<br />
					e.backtrace.each do |l|<br />
						@log.error "\t#{l}"<br />
					end<br />
				end<br />
				sleep freq(timeline_ratio / footing)<br />
			end<br />
		end<br />
	end<br />
<br />
	def on_disconnected<br />
		@check_follows_thread.kill  rescue nil<br />
		@check_timeline_thread.kill rescue nil<br />
		@im_thread.kill             rescue nil<br />
		@im.disconnect              rescue nil<br />
	end<br />
<br />
	def on_privmsg(m)<br />
		return m.ctcps.each {|ctcp| on_ctcp(m[0], ctcp) } if m.ctcp?<br />
		retry_count = 3<br />
		ret = nil<br />
		target, message = *m.params<br />
		begin<br />
			channel = target.sub(/^#/, "")<br />
			reply   = message[/\s+>(.+)$/, 1]<br />
			if !reply && @opts.key?("alwaysim") && @im && @im.connected? # in jabber mode, using jabber post<br />
				message = "##{channel} #{message}" unless "##{channel}" == main_channel<br />
				ret = @im.deliver(jabber_bot_id, message)<br />
				post "#{nick}!#{nick}@#{api_base.host}", TOPIC, channel, message<br />
			else<br />
				channel = "" if "##{channel}" == main_channel<br />
				rid = rid_for(reply) if reply<br />
				ret = api("statuses/update", {"status" => message, "in_reply_to_status_id" => rid, "keyword" => channel})<br />
				log "Status Updated via API"<br />
			end<br />
			raise ApiFailed, "API failed" unless ret<br />
			check_timeline<br />
		rescue => e<br />
			@log.error [retry_count, e.message, e.inspect, e.backtrace].inspect<br />
			if retry_count > 0<br />
				retry_count -= 1<br />
				@log.debug "Retry to setting status..."<br />
				# retry<br />
			else<br />
				log "Some Error Happened on Sending #{message}. #{e}"<br />
			end<br />
		end<br />
	end<br />
<br />
	def on_ctcp(target, message)<br />
		_, command, *args = message.split(/\s+/)<br />
		case command<br />
		when "list"<br />
			nick = args[0]<br />
			@log.debug([ nick, message ])<br />
			res = api("statuses/user_timeline", { "id" => nick }).reverse_each do |s|<br />
				@log.debug(s)<br />
				post nick, NOTICE, main_channel, s<br />
			end<br />
<br />
			unless res<br />
				post nil, ERR_NOSUCHNICK, nick, "No such nick/channel"<br />
			end<br />
		when "fav"<br />
			target = args[0]<br />
			st  = @tmap[target]<br />
			id  = rid_for(target)<br />
			if st || id<br />
				unless id<br />
					if @im && @im.connected?<br />
						# IM のときはいろいろめんどうなことする<br />
						nick, count = *st<br />
						pos = @counters[nick] - count<br />
						@log.debug "%p %s %d/%d => %d" % [<br />
							st,<br />
							nick,<br />
							count,<br />
							@counters[nick],<br />
							pos<br />
						]<br />
						res = api("statuses/user_timeline", { "id" => nick })<br />
						raise ApiFailed, "#{nick} may be private mode" if res.empty?<br />
						if res[pos]<br />
							id = res[pos]["id"]<br />
						else<br />
							raise ApiFailed, "#{pos} of #{nick} is not found."<br />
						end<br />
					else<br />
						id = st["id"]<br />
					end<br />
				end<br />
				res = api("favorites/create/#{id}", {})<br />
				post nil, NOTICE, main_channel, "Fav: #{res["screen_name"]}: #{res["text"].gsub(URI.regexp(%w|http https|), "http...")}"<br />
			else<br />
				post nil, NOTICE, main_channel, "No such id or status #{target}"<br />
			end<br />
		when "link"<br />
			tid = args[0]<br />
			st  = @tmap[tid]<br />
			if st<br />
				st["link"] = (api_base + "/#{st["user"]["screen_name"]}/#{st["id"]}").to_s unless st["link"]<br />
				post nil, NOTICE, main_channel, st["link"]<br />
			else<br />
				post nil, NOTICE, main_channel, "No such id #{tid}"<br />
			end<br />
		end<br />
	rescue ApiFailed => e<br />
		log e.inspect<br />
	end; private :on_ctcp<br />
<br />
	def on_whois(m)<br />
		nick = m.params[0]<br />
		f = (@friends || []).find {|i| i["screen_name"] == nick }<br />
		if f<br />
			post nil, RPL_WHOISUSER,   @nick, nick, nick, api_base.host, "*", "#{f["name"]} / #{f["description"]}"<br />
			post nil, RPL_WHOISSERVER, @nick, nick, api_base.host, api_base.to_s<br />
			post nil, RPL_WHOISIDLE,   @nick, nick, "0", "seconds idle"<br />
			post nil, RPL_ENDOFWHOIS,  @nick, nick, "End of WHOIS list"<br />
		else<br />
			post nil, ERR_NOSUCHNICK, nick, "No such nick/channel"<br />
		end<br />
	end<br />
<br />
	def on_join(m)<br />
		return ### なんかしらんけど何度も入ってしまってうざいので……<br />
		channels = m.params[0].split(/\s*,\s*/)<br />
		channels.each do |channel|<br />
			next if channel == main_channel<br />
			begin<br />
				api("keywords/create/#{URI.escape(channel.sub(/^#/, ""))}")<br />
				@channels[channel] = {<br />
					:read => []<br />
				}<br />
				post "#{@nick}!#{@nick}@#{api_base.host}", JOIN, channel<br />
			rescue => e<br />
				@log.debug e.inspect<br />
				post nil, ERR_NOSUCHNICK, nick, "No such nick/channel"<br />
			end<br />
		end<br />
	end<br />
<br />
	def on_part(m)<br />
		channel = m.params[0]<br />
		return if channel == main_channel<br />
		@channels.delete(channel)<br />
		api("keywords/destroy/#{URI.escape(channel.sub(/^#/, ""))}")<br />
		post "#{@nick}!#{@nick}@#{api_base.host}", PART, channel<br />
	end<br />
<br />
	def on_who(m)<br />
		channel = m.params[0]<br />
		case<br />
		when channel == main_channel<br />
			#     "<channel> <user> <host> <server> <nick><br />
			#         ( "H" / "G" > ["*"] [ ( "@" / "+" ) ]<br />
			#             :<hopcount> <real name>"<br />
			@friends.each do |f|<br />
				user = nick = f["screen_name"]<br />
				host = serv = api_base.host<br />
				real = f["name"]<br />
				post nil, RPL_WHOREPLY, @nick, channel, user, host, serv, nick, "H*@", "0 #{real}"<br />
			end<br />
			post nil, RPL_ENDOFWHO, @nick, channel<br />
		when @groups.key?(channel)<br />
			@groups[channel].each do |name|<br />
				f = @friends.find {|i| i["screen_name"] == name }<br />
				user = nick = f["screen_name"]<br />
				host = serv = api_base.host<br />
				real = f["name"]<br />
				post nil, RPL_WHOREPLY, @nick, channel, user, host, serv, nick, "H*@", "0 #{real}"<br />
			end<br />
			post nil, RPL_ENDOFWHO, @nick, channel<br />
		else<br />
			post nil, ERR_NOSUCHNICK, @nick, nick, "No such nick/channel"<br />
		end<br />
	end<br />
<br />
	private<br />
	def check_timeline<br />
		api("statuses/friends_timeline").reverse_each do |s|<br />
			begin<br />
				id = s["id"]<br />
				next if id.nil? || @timeline.include?(id)<br />
				@timeline << id<br />
				nick = s["user"]["screen_name"]<br />
				mesg = generate_status_message(s)<br />
<br />
				tid = @tmap.push(s)<br />
<br />
				@log.debug [id, nick, mesg]<br />
<br />
				channel = main_channel<br />
<br />
				if nick == @nick # 自分のときは topic に<br />
					post "#{nick}!#{nick}@#{api_base.host}", TOPIC, channel, mesg<br />
				else<br />
					message(nick, channel, "%s" % [mesg])<br />
<br />
					if @opts.key?("metadata")<br />
						post "metadata", NOTICE, channel,  JSON.generate({ "uri" => (api_base + "/#{s["user"]["screen_name"]}/#{s["id"]}").to_s })<br />
					end<br />
				end<br />
			rescue => e<br />
				@log.debug "Error: %p" % e<br />
			end<br />
		end<br />
		@log.debug "@timeline.size = #{@timeline.size}"<br />
		@timeline  = @timeline.last(100)<br />
	end<br />
<br />
	def generate_status_message(s)<br />
		mesg = s["text"]<br />
		mesg.sub!("#{s["keyword"]}=", "") unless s["keyword"] =~ /^id:/<br />
		#mesg << " > #{s["in_reply_to_user_id"]}" unless s["in_reply_to_user_id"].empty?<br />
<br />
		@log.debug(mesg)<br />
		mesg<br />
	end<br />
<br />
	def check_friends<br />
		first = true unless @friends<br />
		@friends ||= []<br />
		friends = api("statuses/friends")<br />
		if first && !@opts.key?("athack")<br />
			@friends = friends<br />
			post nil, RPL_NAMREPLY,   @nick, "=", main_channel, @friends.map{|i| "@#{i["screen_name"]}" }.join(" ")<br />
			post nil, RPL_ENDOFNAMES, @nick, main_channel, "End of NAMES list"<br />
		else<br />
			prv_friends = @friends.map {|i| i["screen_name"] }<br />
			now_friends = friends.map {|i| i["screen_name"] }<br />
<br />
			# Twitter API bug?<br />
			return if !first && (now_friends.length - prv_friends.length).abs > 10<br />
<br />
			(now_friends - prv_friends).each do |join|<br />
				join = "@#{join}" if @opts.key?("athack")<br />
				post "#{join}!#{join}@#{api_base.host}", JOIN, main_channel<br />
			end<br />
			(prv_friends - now_friends).each do |part|<br />
				part = "@#{part}" if @opts.key?("athack")<br />
				post "#{part}!#{part}@#{api_base.host}", PART, main_channel, ""<br />
			end<br />
			@friends = friends<br />
		end<br />
	end<br />
<br />
	def freq(ratio)<br />
		ret = 3600 / (hourly_limit * ratio).round<br />
		@log.debug "Frequency: #{ret}"<br />
		ret<br />
	end<br />
<br />
	def start_jabber(jid, pass)<br />
		@log.info "Logging-in with #{jid} -> jabber_bot_id: #{jabber_bot_id}"<br />
		@im = Jabber::Simple.new(jid, pass)<br />
		@im.add(jabber_bot_id)<br />
		@im_thread = Thread.start do<br />
			loop do<br />
				begin<br />
					@im.received_messages.each do |msg|<br />
						@log.debug [msg.from, msg.body]<br />
						if msg.from.strip == jabber_bot_id<br />
							# Chuitter -> 'nick(id): msg'<br />
							body = msg.body.sub(/^(.+?)(?:\((.+?)\))?: /, "")<br />
							if Regexp.last_match<br />
								nick, id = Regexp.last_match.captures<br />
								body = CGI.unescapeHTML(body)<br />
<br />
								case<br />
								when nick == "投稿完了"<br />
									log "#{nick}: #{body}"<br />
								when nick == "チャンネル投稿完了"<br />
									log "#{nick}: #{body}"<br />
								when body =~ /^#([a-z_]+)\s+(.+)$/i<br />
									# channel message or not<br />
									message(id || nick, "##{Regexp.last_match[1]}", Regexp.last_match[2])<br />
								else<br />
									@counters[nick] ||= 0<br />
									@counters[nick] += 1<br />
									tid = @tmap.push([nick, @counters[nick]])<br />
									message(nick, main_channel, "%s \x03%s [%s]" % [body, @opts["tid"], tid])<br />
								end<br />
							end<br />
						end<br />
					end<br />
				rescue Exception => e<br />
					@log.error "Error on Jabber loop: #{e.inspect}"<br />
					e.backtrace.each do |l|<br />
						@log.error "\t#{l}"<br />
					end<br />
				end<br />
				sleep 1<br />
			end<br />
		end<br />
	end<br />
<br />
	def require_post?(path)<br />
		[<br />
			%r|/update|,<br />
			%r|/create|,<br />
			%r|/destroy|,<br />
		].any? {|i| i === path }<br />
	end<br />
<br />
	def api(path, q={})<br />
		ret           = {}<br />
		q["source"] ||= api_source<br />
<br />
		uri = api_base.dup<br />
		uri.path  = "/api/#{path}.json"<br />
		uri.query = q.inject([]) {|r,(k,v)| v ? r << "#{k}=#{URI.escape(v, /[^:,-.!~*'()\w]/n)}" : r }.join("&")<br />
<br />
<br />
		req = nil<br />
		if require_post?(path)<br />
			req = Net::HTTP::Post.new(uri.path)<br />
			if q["file"]<br />
				boundary = (rand(0x1_00_00_00_00_00) + 0x1_00_00_00_00_00).to_s(16)<br />
				@log.info boundary<br />
				req["content-type"] = "multipart/form-data; boundary=#{boundary}"<br />
<br />
				body = ""<br />
				q.each do |k, v|<br />
					body << "--#{boundary}\r\n"<br />
					if k == "file"<br />
						body << "Content-Disposition: form-data; name=\"#{k}\"; filename=\"temp.png\";\r\n"<br />
						body << "Content-Transfer-Encoding: binary\r\n"<br />
						body << "Content-Type: image/png\r\n"<br />
					else<br />
						body << "Content-Disposition: form-data; name=\"#{k}\";\r\n"<br />
					end<br />
					body << "\r\n"<br />
					body << v.to_s<br />
					body << "\r\n"<br />
				end<br />
				body << "--#{boundary}--\r\n"<br />
<br />
				req.body = body<br />
				uri.query = ""<br />
			else<br />
				req.body = uri.query<br />
			end<br />
		else<br />
			req = Net::HTTP::Get.new(uri.request_uri)<br />
		end<br />
		req.basic_auth(@real, @pass)<br />
		req["User-Agent"]        = @user_agent<br />
		req["If-Modified-Since"] = q["since"] if q.key?("since")<br />
<br />
		@log.debug uri.inspect<br />
		ret = Net::HTTP.start(uri.host, uri.port) { |http| http.request(req) }<br />
<br />
		case ret<br />
		when Net::HTTPOK # 200<br />
			ret = JSON.parse(ret.body)<br />
			raise ApiFailed, "Server Returned Error: #{ret["error"]}" if ret.kind_of?(Hash) && ret["error"]<br />
			ret<br />
		when Net::HTTPNotModified # 304<br />
			[]<br />
		when Net::HTTPBadRequest # 400<br />
			# exceeded the rate limitation<br />
			raise ApiFailed, "#{ret.code}: #{ret.message}"<br />
		else<br />
			raise ApiFailed, "Server Returned #{ret.code} #{ret.message}"<br />
		end<br />
	rescue Errno::ETIMEDOUT, JSON::ParserError, IOError, Timeout::Error, Errno::ECONNRESET => e<br />
		raise ApiFailed, e.inspect<br />
	end<br />
<br />
	def message(sender, target, str)<br />
		sender = "#{sender}!#{sender}@#{api_base.host}"<br />
		post sender, PRIVMSG, target, str.gsub(/\s+/, " ")<br />
	end<br />
<br />
	def log(str)<br />
		str.gsub!(/\n/, " ")<br />
		post server_name, NOTICE, main_channel, str<br />
	end<br />
<br />
	# return rid of most recent matched status with text<br />
	def rid_for(text)<br />
		target = Regexp.new(Regexp.quote(text.strip), "i")<br />
		status = api("statuses/friends_timeline").find {|i|<br />
			next false if i["user"]["name"] == @nick # 自分は除外<br />
			i["text"] =~ target<br />
		}<br />
<br />
		@log.debug "Looking up status contains #{text.inspect} -> #{status.inspect}"<br />
		status ? status["id"] : nil<br />
	end<br />
<br />
	class TypableMap < Hash<br />
		Roman = %w[<br />
			k g ky gy s z sh j t d ch n ny h b p hy by py m my y r ry w v q<br />
		].unshift("").map do |consonant|<br />
			case consonant<br />
			when "y", /\A.{2}/ then %w|a u o|<br />
			when "q"           then %w|a i e o|<br />
			else                    %w|a i u e o|<br />
			end.map {|vowel| "#{consonant}#{vowel}" }<br />
		end.flatten<br />
<br />
		def initialize(size = 1)<br />
			@seq  = Roman<br />
			@n    = 0<br />
			@size = size<br />
		end<br />
<br />
		def generate(n)<br />
			ret = []<br />
			begin<br />
				n, r = n.divmod(@seq.size)<br />
				ret << @seq[r]<br />
			end while n > 0<br />
			ret.reverse.join<br />
		end<br />
<br />
		def push(obj)<br />
			id = generate(@n)<br />
			self[id] = obj<br />
			@n += 1<br />
			@n %= @seq.size ** @size<br />
			id<br />
		end<br />
		alias << push<br />
<br />
		def clear<br />
			@n = 0<br />
			super<br />
		end<br />
<br />
		private :[]=<br />
		undef update, merge, merge!, replace<br />
	end<br />
<br />
<br />
end<br />
<br />
if __FILE__ == $0<br />
	require "optparse"<br />
<br />
	opts = {<br />
		:port  => 16688,<br />
		:host  => "localhost",<br />
		:log   => nil,<br />
		:debug => false,<br />
		:foreground => false,<br />
	}<br />
<br />
	OptionParser.new do |parser|<br />
		parser.instance_eval do<br />
			self.banner = <<-EOB.gsub(/^\t+/, "")<br />
				Usage: #{$0} [opts]<br />
<br />
			EOB<br />
<br />
			separator ""<br />
<br />
			separator "Options:"<br />
			on("-p", "--port [PORT=#{opts[:port]}]", "port number to listen") do |port|<br />
				opts[:port] = port<br />
			end<br />
<br />
			on("-h", "--host [HOST=#{opts[:host]}]", "host name or IP address to listen") do |host|<br />
				opts[:host] = host<br />
			end<br />
<br />
			on("-l", "--log LOG", "log file") do |log|<br />
				opts[:log] = log<br />
			end<br />
<br />
			on("--debug", "Enable debug mode") do |debug|<br />
				opts[:log]   = $stdout<br />
				opts[:debug] = true<br />
			end<br />
<br />
			on("-f", "--foreground", "run foreground") do |foreground|<br />
				opts[:log]        = $stdout<br />
				opts[:foreground] = true<br />
			end<br />
<br />
			on("-n", "--name [user name or email address]") do |name|<br />
				opts[:name] = name<br />
			end<br />
<br />
			parse!(ARGV)<br />
		end<br />
	end<br />
<br />
	opts[:logger] = Logger.new(opts[:log], "daily")<br />
	opts[:logger].level = opts[:debug] ? Logger::DEBUG : Logger::INFO<br />
<br />
#	def daemonize(foreground=false)<br />
#		trap("SIGINT")  { exit! 0 }<br />
#		trap("SIGTERM") { exit! 0 }<br />
#		trap("SIGHUP")  { exit! 0 }<br />
#		return yield if $DEBUG || foreground<br />
#		Process.fork do<br />
#			Process.setsid<br />
#			Dir.chdir "/"<br />
#			File.open("/dev/null") {|f|<br />
#				STDIN.reopen  f<br />
#				STDOUT.reopen f<br />
#				STDERR.reopen f<br />
#			}<br />
#			yield<br />
#		end<br />
#		exit! 0<br />
#	end<br />
<br />
#	daemonize(opts[:debug] || opts[:foreground]) do<br />
		Net::IRC::Server.new(opts[:host], opts[:port], ChuitterIrcGateway, opts).start<br />
#	end<br />
end<br />
<br />
# Local Variables:<br />
# coding: utf-8<br />
# End:<br />
</pre></blockquote>
  ]]>
  </content:encoded>
</item>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000311754.html">
  <title>rubyでハマった事</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000311754.html</link>
  <description>ある目的のため、rubyで遊んでいたりしていました。perlの経験はあるのですが何せrubyはド素人でして。

rubyどころかPOSIX環境すらない状況なのでまずは環境の構築から。Windowsネイティブで動作するActiveScriptRubyを入れる。インストーラが付いているので指示に従っ...</description>
  <dc:subject>雑記</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2010-01-19T21:54:00+09:00</dc:date>
  <content:encoded><![CDATA[
ある目的のため、rubyで遊んでいたりしていました。perlの経験はあるのですが何せrubyはド素人でして。<br />
<br />
rubyどころかPOSIX環境すらない状況なのでまずは環境の構築から。Windowsネイティブで動作する<a href="http://arton.hp.infoseek.co.jp/indexj.html" target="_blank">ActiveScriptRuby</a>を入れる。インストーラが付いているので指示に従って操作。スタートメニューからruby consoleを起動すると、rubyにパスが通っているのでそのまま操作できます。あとはgemで必要なものを入れたりと。<br />
ActiveScriptRubyにはexerbが付属しているのですがうまく変換できない（実行時にエラーが出る。ruby scriptをそのまま実行した場合は正常なので明らかにexerbの問題）ようなので<a href="http://www.erikveen.dds.nl/rubyscript2exe/" target="_blank">rubyscript2exe</a>を入れます。…が、「Can't modifyなにがし」と言われたので<a href="http://d.hatena.ne.jp/grandVin/20090806/1249549802" target="_blank">これ</a>を参考に修正。どうやらVer1.8.7での変更の影響でおかしくなってしまったらしい。<br />
で、今度は「Uninitialized constantなにがし」と怒られたのでRUBYOPTをいじったりしたのですが一向に直らないので、どうしたものかと情報を探していたらどうやら「Gem Ver1.2.0以降のバグ」と言うことらしいのでVer1.1.1にダウングレードしたら直った。<br />
ただ、このままだとgem installとかがリモートにつながらなくなるので終わったら最新版に戻しておく必要がある。<br />
<br />
私の文章が読みにくいのは仕様（仕様とは便利な言葉だと思う）<br /><br />
  ]]>
  </content:encoded>
</item>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000311481.html">
  <title>あれから15年</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000311481.html</link>
  <description>当時まだ私は小学生だったんですね…早いものです。大地震から今日で15年。
当時から大阪に住んでいましたがあれはびっくりしたなぁ。大阪は震度4。
テレビで見た、バスが高速道路から落ちそうになっている光景は衝撃的でした。
震災との因果関係は分からないのですが、...</description>
  <dc:subject>雑記</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2010-01-17T08:18:00+09:00</dc:date>
  <content:encoded><![CDATA[
当時まだ私は小学生だったんですね…早いものです。大地震から今日で15年。<br />
当時から大阪に住んでいましたがあれはびっくりしたなぁ。大阪は震度4。<br />
テレビで見た、バスが高速道路から落ちそうになっている光景は衝撃的でした。<br />
震災との因果関係は分からないのですが、私は揺れに敏感になっているのです。仕事中とか緊張状態なら平気なのですが…<br />
<br />
ちょっと調べてみた：<br />
・JR神戸線が全線復旧したのは4月1日、住吉〜灘間が最後に復旧<br />
・新幹線の全線運行再開は4月8日、新大阪〜姫路間が復旧<br />
・阪急電車が全線復旧したのは6月12日、西宮北口〜夙川間が最後に復旧<br />
・阪神電車が全線復旧したのは6月26日、御影〜西灘間が最後に復旧<br />
・3号神戸線の全線復旧は1996年9月30日<br />
<br />
被害状況などの詳細は<a href="http://ja.wikipedia.org/wiki/%E9%98%AA%E7%A5%9E%E3%83%BB%E6%B7%A1%E8%B7%AF%E5%A4%A7%E9%9C%87%E7%81%BD" target="_blank">ここに</a><br /><br />
  ]]>
  </content:encoded>
</item>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000310219.html">
  <title>PCを買うためいざバイト</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000310219.html</link>
  <description>私のPCが壊れました…電源が点くまでに異常に時間がかかる、というか点かない。
なので今は親のPCを借りているわけですけど、ほぼ「一般ユーザーのデフォルト環境」のようなものなので（XPですが）使いづらいんです…
あまりシステムをいじらないように言われてるのでUS...</description>
  <dc:subject>日記</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2010-01-05T17:47:00+09:00</dc:date>
  <content:encoded><![CDATA[
私のPCが壊れました…電源が点くまでに異常に時間がかかる、というか点かない。<br />
なので今は親のPCを借りているわけですけど、ほぼ「一般ユーザーのデフォルト環境」のようなものなので（XPですが）使いづらいんです…<br />
あまりシステムをいじらないように言われてるのでUSBメモリにいくつかプログラムを入れてたりします。<br />
どう不便かというと、ですね。<br />
- ブラウザがIE7しかない（FirefoxやOperaを常用してましたがこれに関しては困ることが少ない、ただし文字選択が空気を読まない、というかお節介。さらにJWordとかGoogleツールバーとか入ってる）。<br />
- 7z書庫（一応実行ファイル群はUSBメモリに入れています）。<br />
- OGG Vorbis（VLCメディアプレイヤーをUSBメモリに入れて使ってます。VLCはOGGなどもネイティブサポートしています）。<br />
- Open Document Format（中身はXMLなので力技で読めなくもないが、あまり使っていないのでいいかこれは）。<br />
- IRC（LimeChat2をUSBメモリに入れて接続しています）。<br />
- Skype（これはちょっとどうしようもない）。<br />
- Liveメッセンジャー（一応システムに入ってはいるけど無くても困らない）。<br />
- Twitter（USBメモリにTwitを入れています）。<br />
- メーラー（今のところHTTP経由での閲覧しかできない状態）。<br />
- RSSリーダー（Livedoor Readerを使っているので影響なし）。<br />
- ダウンローダー（これは最近無くても困らないようになってきている）。<br />
- POSIX環境（coLinuxもCygwinもUSBメモリの容量が足りないので無理）。<br />
- 開発環境（今は使うことも無い）。<br />
- DTM環境（今は使わない。Timidity入れるのはいいが、サウンドフォントのための容量が無い）。<br />
- 通信対戦麻雀（一応天鳳のIDは控えてあるのですが…）<br />
まとめると、「Geekのための環境ではない」ということ。<br />
<br />
とりあえず予算を15万円ほど見て…バイト代2か月分ほどですかね…<br />
パーツで買ってWin7入れてのデュアルブートですかねぇ…<br />
<br /><br />
  ]]>
  </content:encoded>
</item>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000308145.html">
  <title>Google日本語入力をインストールしようとした</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000308145.html</link>
  <description>なぜタイトルが「インストールした」ではなく「インストールしようとした」となっているのかはお察しの通りです。
実は、0x80070005というエラーが出まして、心当たりのあるアプリケーション（セキュリティーソフトとか）を終了したのですがインストールに失敗します。
...</description>
  <dc:subject>日記</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2009-12-18T04:27:00+09:00</dc:date>
  <content:encoded><![CDATA[
なぜタイトルが「インストールした」ではなく「インストールしようとした」となっているのかはお察しの通りです。<br />
実は、0x80070005というエラーが出まして、心当たりのあるアプリケーション（セキュリティーソフトとか）を終了したのですがインストールに失敗します。<br />
Baiduの日本語入力はインストールに成功したのですが使ってみたところ入力にやや難があるんですよね…カナとローマ字の混在入力ができないとか、入力字数が短いとか。文単位での連文節入力に慣れきってしまった私には予測変換など無用の長物、なのですがこの私の入力スタイルからすると一度に変換できる文字数が少ないというのはいただけませんね。変換精度は高いに越したことはないのですが。<br />
<br />
「俺、バイト代入ったらATOK買うんだ…」(死亡フラグ)<br />
<br />
<br />
関係ないですがOperaの設定がぶっ飛びました。どういうことだか説明していただこうか(何)<br />
検索エンジンの設定やブックマークは無事でしたが…<br /><br />
  ]]>
  </content:encoded>
</item>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000307543.html">
  <title>お知らせ</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000307543.html</link>
  <description>Vectorで公開しっぱなしになっていた私の旧作品を公開停止する手続きを取りました。</description>
  <dc:subject>雑記</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2009-12-13T03:47:00+09:00</dc:date>
  <content:encoded><![CDATA[
Vectorで公開しっぱなしになっていた私の旧作品を公開停止する手続きを取りました。<br /><br />
  ]]>
  </content:encoded>
</item>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000305905.html">
  <title>自転車直してきた</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000305905.html</link>
  <description>昨日、自転車のパンクを修理しに行った。はずなのだが。
思ったより状況がひどく、前輪のチューブが擦り切れていた。
翌日には空気が抜けるなーと思ったらこういうことだったらしい。
タイヤチューブの交換に1890円かかった。結構な出費。
普通のパンクなら500円。

昨...</description>
  <dc:subject>日記</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2009-11-30T05:03:00+09:00</dc:date>
  <content:encoded><![CDATA[
昨日、自転車のパンクを修理しに行った。はずなのだが。<br />
思ったより状況がひどく、前輪のチューブが擦り切れていた。<br />
翌日には空気が抜けるなーと思ったらこういうことだったらしい。<br />
タイヤチューブの交換に1890円かかった。結構な出費。<br />
普通のパンクなら500円。<br />
<br />
昨日は早めの時間に就寝。昨日のTwitterのログによれば10:00UTCなので日本時間に直すと午後7時。早すぎだ。ネットが混む時間帯より前に寝てる。<br />
で、起きたのが午前5時。良いのか悪いのか。寝る時間が安定しない体質だからよくはないのだろう。なんとか安定できればいいのだが。<br />
<br /><br />
  ]]>
  </content:encoded>
</item>
<item rdf:about="http://shinshu.fm/MHz/48.59/archives/0000300189.html">
  <title>OOo Calcでハングルを分解する関数</title>
  <link>http://shinshu.fm/MHz/48.59/archives/0000300189.html</link>
  <description>…というのを自作してみました(Unicode前提)。一体いつ使うんだか；

解説：ワークシートに =HANGDECOMPOSE(&amp;quot;?????? ??????&amp;quot;)と書けばハングル(U+AC00〜U+D7A3)を分解して表示します。ハングル音節以外の文字はそのまま出力します。

導入：ツール→マクロ→...</description>
  <dc:subject>OpenOffice.org</dc:subject>
  <dc:creator>芙蓉美晴 (MihailJP)</dc:creator>
  <dc:date>2009-10-20T04:21:00+09:00</dc:date>
  <content:encoded><![CDATA[
…というのを自作してみました(Unicode前提)。一体いつ使うんだか；<br>
<br>
<strong>解説：</strong>ワークシートに <blockquote>=HANGDECOMPOSE(&quot;한국어 문자열&quot;)</blockquote>と書けばハングル(U+AC00〜U+D7A3)を分解して表示します。ハングル音節以外の文字はそのまま出力します。<br>
<br>
<strong>導入：</strong>ツール→マクロ→マクロの管理→OpenOffice.org Basicから「編集」を押して出るウィンドウに次のソースをコピペすれば使えるはずです。<br>
<blockquote><pre>Function HANGDECOMPOSE(HangStr As String) As String
&#32;&#32;HangLen = Len(HangStr$)
&#32;&#32;TempStr$ = &quot;&quot;
&#32;&#32;For I = 1 To HangLen
&#32;&#32;&#32;&#32;TempCode = Asc(Mid(HangStr, I, 1))
&#32;&#32;&#32;&#32;If (TempCode &gt;= 44032) And (TempCode &lt;= 55203) Then
&#32;&#32;&#32;&#32;&#32;&#32;SyllableCode = TempCode - 44032
&#32;&#32;&#32;&#32;&#32;&#32;ChoseongCode = Fix(SyllableCode / 588)
&#32;&#32;&#32;&#32;&#32;&#32;MoeumCode = Fix((SyllableCode mod 588) / 28)
&#32;&#32;&#32;&#32;&#32;&#32;PatchimCode = (SyllableCode mod 28)
&#32;&#32;&#32;&#32;&#32;&#32;TempStr = TempStr &amp; Chr$(ChoseongCode + 4352) &amp; Chr$(MoeumCode + 4449)
&#32;&#32;&#32;&#32;&#32;&#32;If (PatchimCode &gt; 0) Then
&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;TempStr = TempStr &amp; Chr$(PatchimCode + 4519)
&#32;&#32;&#32;&#32;&#32;&#32;End If
&#32;&#32;&#32;&#32;Else
&#32;&#32;&#32;&#32;&#32;&#32;TempStr = TempStr &amp; Mid(HangStr, I, 1)
&#32;&#32;&#32;&#32;End If<br>&#32;&#32;Next
&#32;&#32;HANGDECOMPOSE = TempStr
End Function</pre></blockquote><br /><br />
  ]]>
  </content:encoded>
</item>
</rdf:RDF>