<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>ぷりどうぐ &#187; ruby</title>
	<atom:link href="http://prius.cc/d/tag/tag-ruby/feed" rel="self" type="application/rss+xml" />
	<link>http://prius.cc/d</link>
	<description>1981年生まれのITエンジニアがスノーボードや技術情報を書いているブログ。</description>
	<lastBuildDate>Mon, 30 Jan 2012 02:54:01 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/tag/tag-ruby/feed" />
		<item>
		<title>twitterに投稿されたゲレンデ写真を纏めたサイト＋その他の技術情報</title>
		<link>http://prius.cc/d/20091018_twitsnow2.html</link>
		<comments>http://prius.cc/d/20091018_twitsnow2.html#comments</comments>
		<pubDate>Sun, 18 Oct 2009 08:05:10 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[やったこと、行った所]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[スノーボード]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://prius.cc/d/?p=2177</guid>
		<description><![CDATA[				twitterに投稿された(略 をどうやって作成したかという技術メモ。
				
				作成手順
				
				以下の3ステップで作成しています。
				
				
				twitterAPIを利用して [...]]]></description>
			<content:encoded><![CDATA[				<p>twitterに投稿された(略 をどうやって作成したかという技術メモ。</p>
				
				<h3>作成手順</h3>
				
				<p>以下の3ステップで作成しています。</p>
				
				<ol>
				<li>twitterAPIを利用して#snowJPの検索結果を収集する。</li>
				<li>収集した検索結果を加工してRSS化する。</li>
				<li>指定したRSSを自動投稿するプラグインをwordpressに導入し、2で加工したRSSを登録する。</li>
				</ol>
				
				<p>1、2で使ってるプログラムは最後に紹介するとして。3はFeedWordPressというプラグインを利用します。</p>
				
				<p><a href="http://d.hatena.ne.jp/mitaina/20090711/1247273446">FeedWordPressでマルチブログする &#8211; [Mi]みたいなもの</a></p>
				
				<p>これでRSSさえ作ってしまえば、最後のアウトプット先をWordPressにすることができます。普通こういうWebサービスは自分で&#8221;ガワ&#8221;をデザインするのですが</p>
				
				<ul>
				<li>自分のデザイン能力の低さ</li>
				<li>wordpressの使いやすさ</li>
				<li>携帯やiPhone対応への手間(wordpressには携帯・iPhoneビュー用のプラグインもある)</li>
				</ul>
				
				<p>など考えると、wordpressを使うのがベストかな、と判断しました。</p>
				
				<p>ということで、後はRSSを作るだけ！スクレイピングもRSS作成も得意だからすぐだよね！…とはいかず。</p>
				
				<h3>苦労した点</h3>
				
				<h4>1. twitterAPIのパース</h4>
				
				<p>twitterではスクレイピングを規約で明示的に禁止しているので、APIを使って情報を取得します。提供形式はjson、atomの2種類で慣れているatomを選んでrubyのrssライブラリでパースしよー♪…と思いきや、なぜか対応できないと跳ねられる。しかたないのでREXMLを使ってXML文章としてパースしたんだけど、<strong>REXMLの使い方をすっかり忘れていて</strong>パースするだけなのにめちゃ苦労しました。</p>
				
				<h4>2. RSS1.0と2.0の仕様の違い</h4>
				
				<p>1.で情報は取得できたので、それをRSSに流し込むだけ。…流し込むまでは良かったのですが<strong>RSS1.0では画像の展開ができない</strong>という制限を知らなかったので、RSS1.0で作ってしまい画像が表示されませんでしたとさ</p>
				
				<h4>3. FeedWordPressとrubyのrss/makerの仕様制限</h4>
				
				<p>RSS2.0で作成してFeedWordPressに読み込ませた！…のだけど、今度は改行が反映されないorz 調べたところ、どうやらFeedWordPressがRSS2.0を読み込む場合、</p>
				
				<ol>
				<li>「content:encoded」があれば本文として使う。</li>
				<li>「content:encoded」がなければ「description」として使う。ただし改行は反映されない。</li>
				</ol>
				
				<p>仕様らしく、僕が作成したRSS2.0は「description」しか作ってなかったので改行コードが反映されなかったと。んじゃ「content:encoded」を作ればいいじゃん、というところですが、rss/makerライブラリの仕様でRSS2.0作成時には「content:encoded」を利用できない！</p>
				
				<p>仕方ないのでRSS2.0を作成し文字列として読み込んだ後、「description」の下に1行挿入し「content:encoded」とする超泥臭い作り方で乗り切りました。うーん、RSSライブラリは完璧じゃないよなぁ…。</p>
				
				<h3>ということでコード公開</h3>
				
				<p><span id="more-2177"></span></p>
				
				<p><pre class="brush: ruby; title: ;">
require 'kconv'
require 'open-uri'
require 'uri'
require 'kconv'
require 'cgi'
require 'rss/maker'
require 'rexml/document'
include REXML
 #
 # 0.初期設定
 #
 # プログラムルートパス
 #
path = Dir.pwd + '/'
 #
 # ----------------------------------------------------------------------------------------------
 # 1.twitterAPIを使用してRSS保存
 # ----------------------------------------------------------------------------------------------
 #
=begin
 # 検索例(twitter公式)
 # http://search.twitter.com/search.atom?q=%23snowJP&amp;amp;locale=ja
 # http://search.twitter.com/search.json?q=%23snowJP&amp;amp;locale=ja
 # 検索例(twitter検索)
 # http://pcod.no-ip.org/yats/search?query=%23snowJP&amp;amp;rss
 # http://pcod.no-ip.org/yats/search?query=%23snowJP&amp;amp;json
=end
 #
 # 検索語句を配列で指定
serachWord = ['スノーボード','イエティ','軽プリ']
 #
 # 全てをURLエンコード
serachWordTemp = Array.new
serachWord.each do |text|
  serachWordTemp &amp;lt;&amp;lt; CGI.escape(text)
end
serachWord = serachWordTemp
 #
 # ファイル保存。ファイル名は検索語句＋日時
 #
 #=begin
 # ★APIへのアクセス制限を回避するため必要な時だけコメントオフにする
time = Time.now.strftime(&amp;quot;%Y%m%d%H%M%S&amp;quot;) #=&amp;gt; 20091014204219
serachWord.each do |text|
  url = 'http://search.twitter.com/search.atom?q=' + text + '&amp;amp;locale=ja'
  filename = text + '&lt;em&gt;' + time + '.atom'
  File.open(path + filename, 'wb') do |f|
    f.write open(url).read
  end
end
 #=end
 #
 # ★検証用
 #time = '20091015223148'
 #
 # ----------------------------------------------------------------------------------------------
 # 2-1.保存したRSSを重複なしで一つのファイルに纏める(タブ区切り、先頭は日時)
 # ----------------------------------------------------------------------------------------------
 #
tempText = 'main_snow_text.txt'
File.open(path + tempText, 'wb') do |f|
  serachWord.each do |text|
    filename = text + '&lt;/em&gt;' + time + '.atom'
    doc = REXML::Document.new File.open(path + filename,&amp;quot;r&amp;quot;)
    entrySize = doc.root.elements[&amp;quot;openSearch:itemsPerPage&amp;quot;].text.to_i
    unless entrySize == &amp;quot;&amp;quot; or entrySize == 0
      1.upto(entrySize) do |i|
        entry = doc.root.elements[&amp;quot;entry[#{i}]&amp;quot;]
        # 指定した検索ヒット数よりヒットしたpostが少なかった場合対応
        break if entry == nil
     #  f.write entry.text(&amp;quot;id&amp;quot;)
     #  f.write entry.text(&amp;quot;title&amp;quot;)
     #  f.write entry.text(&amp;quot;updated&amp;quot;)
        f.write entry.text(&amp;quot;published&amp;quot;) + &amp;quot;\t&amp;quot;
        f.write entry.text(&amp;quot;content&amp;quot;).gsub(/\n/,&amp;quot;&amp;quot;) + &amp;quot;\t&amp;quot;
        f.write entry.text(&amp;quot;twitter:source&amp;quot;) + &amp;quot;\t&amp;quot;
        f.write entry.text(&amp;quot;author/name&amp;quot;) + &amp;quot;\t&amp;quot;
        f.write entry.text(&amp;quot;author/uri&amp;quot;) + &amp;quot;\t&amp;quot;
        entry.each_element_with_attribute(&amp;quot;type&amp;quot;,&amp;quot;text/html&amp;quot;) do |elem|
          f.write elem.to_s.gsub(/.&lt;em&gt;http/,'http').gsub(/' rel='.&lt;/em&gt;/,'') + &amp;quot;\t&amp;quot;
        end
        entry.each_element_with_attribute(&amp;quot;type&amp;quot;,&amp;quot;image/png&amp;quot;) do |elem|
          f.write elem.to_s.gsub(/.&lt;em&gt;http/,'http').gsub(/' rel='.&lt;/em&gt;/,'') + &amp;quot;\t&amp;quot;
        end
        f.write &amp;quot;\r\n&amp;quot;
      end
    end
  end
end
 #
 # ----------------------------------------------------------------------------------------------
 # 2-2.纏めたファイルから順番に読み出し配列に入れる＋フィルタリング
 # ----------------------------------------------------------------------------------------------
 #
margeArr = []
 #
File.open(path + tempText) do |f|
  while line = f.gets
    margeArr &amp;lt;&amp;lt; line
  end
end
 #
margeArr.sort!
margeArr.uniq!
 #
 # フィルタリング
=begin
margeArr.each do |line|
  case line 
  when %r[&amp;lt;a href=&amp;quot;http://movapic.com/pic/\w+]
    margeArrFilter &amp;lt;&amp;lt; line
  when %r[&amp;lt;a href=&amp;quot;http://twitpic.com/\w+]
    margeArrFilter &amp;lt;&amp;lt; line
  when %r[http://f.hatena.ne.jp/twitter/\w+]
    margeArrFilter &amp;lt;&amp;lt; line
  else
  end
end
=end
 #
 # 最新の15個を取り出し
rssNum = 200
margeArr.slice!(0, margeArr.size - rssNum) if margeArr.size - rssNum &amp;gt; 0
 # ----------------------------------------------------------------------------------------------
 # 2-3.画像のみのRSSを生成する。画像パスは展開する
 # ----------------------------------------------------------------------------------------------
 #
snowRssFile = 'snowJP_All.rss'
 #snowRssFile = 'snowJP_newComer.rss'
rssArr = margeArr
f_rss = File.open(path + snowRssFile, &amp;quot;wb&amp;quot;)
 #
 # RSSのバージョンを指定してRSSオブジェクトを生成します
rss = RSS::Maker.make(&amp;quot;2.0&amp;quot;) do |maker|
 #
  #適用するスタイルシートを指定します
  xss = maker.xml_stylesheets.new_xml_stylesheet
  xss.href = &amp;quot;./rdf.xsl&amp;quot;
 #
  # 記事を配信しているページに関する情報を設定します
  maker.channel.about = &amp;quot;http://prius.cc/twit_snow/&amp;quot;
  maker.channel.title = &amp;quot;snowJP&amp;quot;
  maker.channel.description = &amp;quot;snowJP&amp;quot;
  maker.channel.link = &amp;quot;http://prius.cc/twit_snow/&amp;quot;
 #
  # RSSのitemを更新日が新しい順番にソートする機能を有効にする
  maker.items.do_sort = true
 #
  # 以下では記事に関する情報を指定します
  rssArr.each do |elem|
    elemArr = elem.split(/\t/)
    item = maker.items.new_item
    # 各種形式変換ここから--------------------
    formatTime = elemArr[0].gsub('T',' ').gsub('Z','')
    # もし画像パスがあれば展開する。
    case elemArr[1]
    when %r[&amp;lt;a href=&amp;quot;http://movapic.com/pic/\w+]
      # パーマリンクへのURL取得
      parmlink = elemArr[1].slice(%r[http://movapic.com/pic/\w+])
      # サムネイル用URL生成
      thumnail = 'http://image.movapic.com/pic/s_' + parmlink.slice(%r[http://movapic.com/pic/(\w+)], 1) + '.jpeg'
    when %r[&amp;lt;a href=&amp;quot;http://twitpic.com/\w+]
      # パーマリンクへのURL取得
      parmlink = elemArr[1].slice(%r[http://twitpic.com/\w+])
      # サムネイル用URL生成
      thumnail = 'http://twitpic.com/show/thumb/' + parmlink.slice(%r[http://twitpic.com/(\w+)], 1)
    when %r[http://f.hatena.ne.jp/twitter/\w+]
      # パーマリンクへのURL取得
      parmlink = elemArr[1].slice(%r[http://f.hatena.ne.jp/twitter/\w+])
      # サムネイル用URL生成
      hatenaParmlink = parmlink.slice(%r[http://f.hatena.ne.jp/twitter/(\w+)], 1)
      hatenaDateTime = hatenaParmlink[0,8]
      thumnail = 'http://img.f.hatena.ne.jp/images/fotolife/t/twitter/' + hatenaDateTime + '/' + hatenaParmlink + '_120.jpg'
    else
      parmlink = &amp;quot;&amp;quot;
    end
    unless parmlink == &amp;quot;&amp;quot;
      descriptionStr = '&amp;lt;p&amp;gt;' + elemArr[1] + '&amp;lt;/p&amp;gt;' + '&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;' + parmlink + '&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;' + thumnail + '&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;'
    else
      descriptionStr = '&amp;lt;p&amp;gt;' + elemArr[1] + '&amp;lt;/p&amp;gt;'
    end
 #
    # 各種形式変換ここまで--------------------
    item.title = elemArr[3] + 'の' + formatTime + 'の投稿'
    item.link = elemArr[5]
    item.description = '&amp;lt;![CDATA[' + 
    descriptionStr + 
    '&amp;lt;p&amp;gt;' + '&amp;lt;img src=&amp;quot;' + elemArr[6] + '&amp;quot; /&amp;gt;' + '&amp;lt;a href=&amp;quot;' + elemArr[4] + '&amp;quot;&amp;gt;' + elemArr[3] + '&amp;lt;/a&amp;gt;の' + '&amp;lt;a href=&amp;quot;' + elemArr[5] + '&amp;quot;&amp;gt;' + formatTime + '&amp;lt;/a&amp;gt;の投稿' + '&amp;lt;/p&amp;gt;' + 
    ' ]]&amp;gt;'
    item.date = Time.parse(formatTime)
  end
end
 #
=begin
百景

http://movapic.com/pic/200910031352404ac6d8986af75


http://image.movapic.com/pic/s_200910031352404ac6d8986af75.jpeg

 #
twitpic

http://twitpic.com/k5boe


http://twitpic.com/show/thumb/k5boe

 #

http://f.hatena.ne.jp/twitter/20091011145112


http://img.f.hatena.ne.jp/images/fotolife/t/twitter/20091011/20091011145112_120.jpg

 #
20091011145112
20091011145112_120.jpg
 #
&amp;lt;a href=&amp;quot;http://f.hatena.ne.jp/twitter/20091017214947&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;http://img.f.hatena.ne.jp/images/fotolife/t/twitter/20091017/20091017214947_120.jpg&amp;quot; class=&amp;quot;tl-image&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;
 #
 #
=end
 #
 # RSSを出力します
f_rss.puts rss
f_rss.close
 # &amp;lt;![CDATA[の&amp;quot;&amp;lt;&amp;quot;を実態参照しないために変換
data = File.read(path + snowRssFile)
data2 = data.gsub('&amp;amp;lt;','&amp;lt;').gsub('&amp;amp;gt;','&amp;gt;').gsub('&amp;amp;quot;','&amp;quot;')
 #
f_rss = File.open(path + snowRssFile, &amp;quot;wb&amp;quot;)
 #
 # content:encodedを追加するため編集
 # ※descriptionでは改行や&amp;lt;p&amp;gt;コードなどがWordPress側で反映されない。
 # またrss/makerにはRSS2.0でcontent:encodedを追加する機能はない。
 # atomにはcontent:encodedを追加できるがそもそもバグがありatomを生成できない。
data2.each_line do |line|
  case line
=begin
★検証時はコメントオフ？
  when %r[rss version=&amp;quot;2.0&amp;quot;]
    f_rss.puts line
    f_rss.puts '  xmlns:content=&amp;quot;http://purl.org/rss/1.0/modules/content/&amp;quot;'
=end
  when %r[&amp;lt;description&amp;gt;] &amp;amp;&amp;amp; line !~ %r[&amp;lt;description&amp;gt;snowJP&amp;lt;/description&amp;gt;]
    f_rss.puts line
    f_rss.puts line.gsub('description','content:encoded')
  else
    f_rss.puts line
  end
end
 #
 # ★Todo：画像パスの展開
 # RSSもうちょい見やすくする
 # http://exco.sakura.ne.jp/twit_snow/
 #
 # 0:日時
 # 1:コメント
 # 2:soruce
 # 3:author
 # 4:author page
 # 5:perm link
 # 6:profile photo
</pre></p>
				
				<p>※ ファイルダウンロードは<a href="http://prius.cc/twit_snow_rss/main_snow.zip">こちら</a>。<br />
				※ wordpressのSyntaxHighlightには空行を含めない制約があるので、空行には先頭に&#8221;#&#8221;を入れてます。<br />
				※ 検索ワード指定部分は配列になっていて、自分の好きな言葉を指定するとその分APIを叩いてRSSを生成します。サーバに置いてcronで実行することで自家製RSS製造機に！</p>
				
				<h3>Q&amp;A</h3>
				
				<p>Q.こんなしょぼいプログラムを公開して恥ずかしくないのですか？<br />
				A.僕の本業はシステム管理。プログラマーではないので恥ずかしくありません＞＜</p>
				
				<p>Q.それにしても、あまりに保守性が低くありませんか？<br />
				A.さすがに自分でも見難いので、もうちょいきれいにします。</p>
]]></content:encoded>
			<wfw:commentRss>http://prius.cc/d/20091018_twitsnow2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/20091018_twitsnow2.html" />
	</item>
		<item>
		<title>twitterに投稿されたゲレンデ写真をまとめたサイト＋その他を作りました。</title>
		<link>http://prius.cc/d/20091018_twitsnow1.html</link>
		<comments>http://prius.cc/d/20091018_twitsnow1.html#comments</comments>
		<pubDate>Sun, 18 Oct 2009 08:01:25 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[やったこと、行った所]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[スノーボード]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://prius.cc/d/?p=2168</guid>
		<description><![CDATA[				タイトル通り、twitterに投稿されたゲレンデ写真を纏めるサイトを作りました。
				
				twitterゲレンデ写真まとめサイト(仮)
				
				※今は1つも写真投稿がないので、後述する「スノー [...]]]></description>
			<content:encoded><![CDATA[				<p>タイトル通り、twitterに投稿されたゲレンデ写真を纏めるサイトを作りました。</p>
				
				<p><a href="http://exco.sakura.ne.jp/twit_snow/">twitterゲレンデ写真まとめサイト(仮)</a></p>
				
				<p>※今は1つも写真投稿がないので、後述する「スノーボード関係の言葉が含まれた発言を検索しRSS」も合わせて投稿するようにしています。</p>
				
				<h4>どんなサイト？</h4>
				
				<p>以下の条件に引っかかる投稿を抽出し、画像サイトへのURLを変換し画像を直接表示します。</p>
				
				<ol>
				<li>ハッシュタグ「<a href="http://twitter.com/#search?q=%23snowJP">#snowJP</a>」を含む</li>
				<li>投稿内に「携帯百景」「はてなフォトライフ」「twitpic」のURLを含む</li>
				</ol>
				
				<p>wordpress使ってるので携帯・iPhoneからも見れます。ハッシュタグ「#snowJP」を使ってどんどん雪山写真を投稿しよー！</p>
				
				<h4>サイトを作成した経緯</h4>
				
				<blockquote>
				  <p>妄想開始。雪山好きのtwitterユーザーのためのポータルサイトがあればいいと思った。内容は雪山関係のpostをしているtwitterユーザー一覧(近々リリースされるtwitterのlist機能を使用)、ハッシュタグを利用したリアルタイム積雪＆渋滞情報。<a href="http://twitter.com/teraco/status/4526918331">12:22 AM Oct 2nd</a> Tweenで</p>
				  
				  <p>というか#09-10snowみたいなハッシュタグを流行らせたい。毎週土日に各地のゲレンデ写真が集まるだけで相当価値が出てくると思う。雪山ユーザーってゲレンデを略称で書いちゃっうから検索しにくい。それにmixiやら個人ブログやら情報が分散しすぎている。 <a href="http://twitter.com/teraco/status/4527001669" title="12:26 AM Oct 2nd">12:26 AM Oct 2nd</a> Tweenで</p>
				  
				  <p>これをハッシュタグ一つで纏められる。ハッシュタグで纏められたポータルサイトが知名度を持ち始めれば、非twitterユーザーも注目する→雪山好きのtwitterユーザーが増える→俺のTLが充実するという一石三鳥。妄想終了。<a href="http://twitter.com/teraco/status/4527003115">12:26 AM Oct 2nd</a> Tweenで</p>
				</blockquote>
				
				<p>毎週土日に最新の雪山写真がずらっと並んでるって最高じゃね！？</p>
				
				<h4>今後のロードマップなど</h4>
				
				<ol>
				<li>#snowJPまとめサイトを立ち上げる ←今ここ</li>
				<li>初期メンバーが#snowJPをつけてゲレンデ写真を投稿する</li>
				<li>twitterユーザーで雪山好きの人に#snowJPの存在を宣伝する</li>
				<li>徐々に#snowJPへのゲレンデ写真への投稿が増える</li>
				<li>毎週土日の朝は<a href="http://buzztter.com/ja">buzztter</a>で#snowJPがバズる</li>
				<li>「twittetってなんか雪山情報充実してるらしぜー」とmixiから人が流れてくる。</li>
				<li>ますます#snowJPへのゲレンデ写真の投稿が増える</li>
				<li>ゲレンデの中の人も#snowJPの影響力を無視できなくなり、twitterアカウントを作成して#snowJP宛に最新のゲレンデ写真を毎日投稿する</li>
				<li>なんかすごい事になる</li>
				</ol>
				
				<p>buzztterはともかく8が実現できたら最高ですよね。1つのサイト(ハッシュタグ)をチェックするだけで、例えば白馬エリア全ゲレンデのゲレンデ写真が確認できる。便利で楽しい！</p>
				
				<hr />
				
				<h3>これだけではしょぼいので。</h3>
				
				<p>ロードマップとか書いてみたけど、今は#snowJPの使用者が少ないので写真も少なくお寒い感じ。なので#snowJPが盛り上がるよういろいろ作ってみました。</p>
				
				<h4>1.#snowJPの全投稿をRSS配信</h4>
				
				<p><a href="http://prius.cc/twit_snow_rss/snowJP.rss">http://prius.cc/twit_snow_rss/snowJP.rss</a></p>
				
				<p>普通に<a href="http://twitter.com/#search?q=%23snowJP">#snowJP</a>でチェックすりゃいいじゃん、という話ですが、僕がRSSリーダー好きなので作ってみました。これはただのついで。重要なのは次から。</p>
				
				<h4>2.スノーボード関係の言葉が含まれた発言を検索しRSS配信(以下、雪山RSS)</h4>
				
				<p><a href="http://prius.cc/twit_snow_rss/snowJP_All.rss">http://prius.cc/twit_snow_rss/snowJP_All.rss</a></p>
				
				<p>twitterの全投稿の中からボード関係の言葉が含まれるものを検索し1日1回RSS配信します。今は「スノーボード、イエティ、かぐら」が含まれる投稿を検索し、配信します。</p>
				
				<h4>3.スノーボード関係の言葉が含まれた発言を検索しRSS配信(新規雪山好きユーザー発見専用)</h4>
				
				<p>これは作成予定。<br />
				雪山RSSから既に#snowJPの存在を知ってるっぽいユーザーの発言を省いたRSSです。例えば@teracoや@winter_fanはNGユーザーリストに入っておりこのRSSには表示されません。NGユーザーリストは最初手動更新でtwitterのlist機能が正式リリースされたら雪山ユーザーのlistを作成→含まれてないユーザーの発言のみ表示して精度を上げようと思います。</p>
				
				<p>2と3の雪山RSSはロードマップの3番<strong>「twitterユーザーで雪山好きの人に#snowJPの存在を宣伝する」ために作りました。</strong>今考えてるのは、</p>
				
				<ol>
				<li>この新規ユーザー発見専用RSSを購読する</li>
				<li>新規ユーザーを発見したら@teraco_snowからハッシュタグ「#snowJP」の案内postを送る。</li>
				<li>一度案内を送ったユーザーは3のリストから外す</li>
				</ol>
				
				<p>という方法で、漏れなく重複なく#snowJPの普及活動を進めていく予定です。…となると、3を読むのは僕だけでいいのかなー。複数のユーザーから案内行ってもウザいだけだし…。</p>
				
				<p>が、スキー・ボードの事について言及したユーザー全員に案内を送るべきかどうか？となると微妙。僕の本音としては<strong>#snowJPが有名になるとか投稿が増えるとかはどうでもよくて、#snowJPへの写真の投稿が増えてほしいだけなので、</strong>写真を投稿した人へは100%案内を送るけど、ただスキー・ボードの事について言及してるだけの人に案内送ってもなーと。当面は<strong>写真付きの投稿した人は案内送る・それ以外の人には送らない</strong>ことにします。それ以外の人にも#snowJP案内送るなら、重複しないように#snowJP使ってる人と相談かなぁ。</p>
				
				<p>とりあえず2のRSSは登録してみててください。読んでるだけでも楽しいと思うので。</p>
				
				<h4>Q&amp;A</h4>
				
				<p>Q.twitterゲレンデ写真まとめサイトのデザインがしょぼいのですが？<br />
				A.すいません。やっつけで作ったのでそのうち改善予定です。wordpressのデザインなら俺/私に任せろ！という方は@teracoまでご連絡ください。</p>
				
				<p>Q.雪山写真の地域別に表示を分けた方がいいのではないか？<br />
				A.今後投稿が多くなり、目的の地域を見つけにくくなれば考えます。</p>
				
				<p>Q.#snowJPと別のハッシュタグを使ったほうがいいのではないか？(例：#snowJPPhotoなど)<br />
				A.当初そう考えましたが、携帯端末からの入力のしやすさ、#snowJPの認知度を高めるという意味で#snowJPに相乗りさせてもらおうと思います。複数のハッシュタグに分散するより1つに統一した方が信頼度が高まると思うので。今後投稿が増えて問題が発生したら or #snowJPが十分に周知されたらハッシュタグの分離も考えます。</p>
				
				<p>Q.雪山RSSに、雪山と関係のない発言が含まれるのですが？<br />
				A.例えば「カムイ」で検索した場合、映画の「カムイ外伝」に関する発言も引っかかってしまいます。こういう場合は、以下のどちらかの対応を取ります。</p>
				
				<ol>
				<li>検索ワードの精度を高める：例 「カムイ御坂」「カムイ竜ヶ崎」を使う</li>
				<li>関係のないユーザーを非対象ユーザーとして今後発言を収集しない。</li>
				</ol>
				
				<p>なるべく1の対応を取りたいと思ってます。</p>
				
				<p>Q.雪山RSSに検索ワードを追加・削除してほしい<br />
				A.<a href="http://twitter.com/teraco">@teraco</a>までご連絡ください。</p>
				
				<p>その他、何かあれば<a href="http://twitter.com/teraco">@teraco</a>までお気軽に。
				最後に。何かと関東圏のユーザーが優遇されるtwitter界ですが、<strong>#snowJPでは日本全国の雪山ユーザーの投稿が集まるといいなーと思ってます！</strong></p>
				
				<p>技術情報に興味のある方は<a href="http://prius.cc/d/20091018_twitsnow2.html">こちら。</a></p>
]]></content:encoded>
			<wfw:commentRss>http://prius.cc/d/20091018_twitsnow1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/20091018_twitsnow1.html" />
	</item>
		<item>
		<title>RMagick 2.9.0 for Windows インストール時の注意点。</title>
		<link>http://prius.cc/d/20090130_rmagick_2_9_0_for_windows_insu.html</link>
		<comments>http://prius.cc/d/20090130_rmagick_2_9_0_for_windows_insu.html#comments</comments>
		<pubDate>Fri, 30 Jan 2009 13:36:23 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[勉強]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://prius.cc/d/rmagick-290-for-windows-%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%99%82%e3%81%ae%e6%b3%a8%e6%84%8f%e7%82%b9%e3%80%82.html</guid>
		<description><![CDATA[&#9632;結論RMagick 2.9.0(に同梱されているImageMagick)を使用するには、Visual C++ 2008のランタイムが必要である。ImageMagick本家のフォーラムVisual C++ 2008のダ...]]></description>
			<content:encoded><![CDATA[				<h3>&#9632;結論</h3>
				
				<p>RMagick 2.9.0(に同梱されているImageMagick)を使用するには、Visual C++ 2008のランタイムが必要である。</p>
				
				<ul>
				<li><a href="http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&amp;t=12972" target="_blank">ImageMagick本家のフォーラム</a></li>
				<li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&amp;displaylang=en" target="_blank">Visual C++ 2008のダウンロード先</a></li>
				</ul>
				
				<hr />
				
				<p>ということで、rubyで画像ファイルを生成できるRMagickというのがあるらしいので使ってみた。</p>
				
				<h3>&#9632;インストール</h3>
				
				<ol>
				<li><a href="http://rubyforge.org/projects/rmagick" target="_blank">RubyForge： RMagick： Project Info</a>からRmagickをダウンロード</li>
				<li>バイナリのImageMagickをインストール。ImageMagick-6.4.8-6-Q8-windows-dll.exeみたいなやつ。</li>
				<li>ダウンロードしたディレクトリに移動して、「gem install rmagick-2.9.0-x86-mswin32.gem」を実行。</li>
				</ol>
				
				<blockquote>
				<p>ERROR:  Error installing rmagick-2.9.0-x86-mswin32.gem:</p><p>        rmagick requires Ruby version &gt;= 1.8.5</p></blockquote>
				
				<p>おっと、rubyのバージョンが古かったようだw <a href="http://www.ruby-lang.org/ja/downloads/" target="_blank">本家</a>よりダウンロードしてアップデート。</p>
				
				<h3>&#9632;そして嵌った。</h3>
				
				<p>どうやらRmagickのインストールは結構難しいらしい。</p>
				
				<blockquote>
				<p><a href="http://d.hatena.ne.jp/hi_c_mayu/20080831/1220175808" target="_blank">RMagick のインストール &#8211; まゆの日記</a></p><p></p><p>インストールで失敗するという噂の RMagick を入れてみようと思います。</p></blockquote>
				
				<p>Windows版は比較的簡単らしいが、冒頭のようにVC++が入ってないとエラーになるとかいろいろ躓きポイントあり。</p>
				
				<p><a href="http://www.katawara.com/2008/01/rmagick/" target="_blank">RMagickをインストールしてみる（Windows）　|　Katawara.*</a></p>
				
				<p>あと一番嵌ったのが間違ったテストコードを使っていたこと。</p>
				
				<blockquote>
				<p>require &#8216;rubygems&#8217;</p><p>require &#8216;RMagick&#8217;</p></blockquote>
				
				<p>だけではダメで、3行目に</p>
				
				<blockquote>
				<p>include Magick</p></blockquote>
				
				<p>が必要だったんですね。どんなバージョン組み合わせてもエラーが出て半日くらい嵌ってました。</p>
				
				<p>※俺のruby知識のなさが証明された。</p>
				
				<h3>&#9632;使ってみる</h3>
				
				<p><a href="http://blog.longearth.net/2008/06/04/%E3%80%90ruby%E3%80%91%E3%80%90rmagick%E3%80%91web20%E7%9A%84%E3%81%AA%E3%83%AD%E3%82%B4%E3%82%92%E4%BD%9C%E3%82%8B/" target="_blank" class="broken_link">【ruby】【RMagick】WEB2.0的なロゴを作る | earth</a></p>
				
				<p>このページのテストコードが一番分かりやすかった。元ネタは<a href="http://doruby.kbmj.com/akio0911_on_rails/20090115/RMagick__" target="_blank">ここ</a>だと思いますが。その他、rubyで画像処理をするなら<a href="http://d.hatena.ne.jp/secondlife/20070612/1181618706" target="_blank">モテる Ruby! &#8211; Ruby会議 2007 &#8211; 川o・-・）＜2nd life</a>が詳しい。</p>
				
				<hr />
				
				<p>なぜこういう勉強をしているかというと、僕が重宝しているWebサービスのうちの一つ、<a href="http://thunder.tepco.co.jp/" target="_blank">雨量・雷観測情報</a>のデータを解析したいからである。<a href="http://thunder.tepco.co.jp/cgi-bin/main.cgi?area=9&amp;zoom=8&amp;type=1" target="_blank">このリンクが</a>東京都の雨量情報なのだが残念ながら携帯に対応していない。</p>
				
				<p>そこで画像データを取得して携帯で見れるくらいに変換してやる。雨が降っていると地図上に青や紫の点が表示され、その間隔は毎回同じ。つまり青や紫の点の位置を特定して位置と紐付けてやれば、「○○市で○mmの雨」というデータが取得できるわけだ。</p>
				
				<p>取りあえず今日はインストールだけで疲れたのでここまで。</p>
]]></content:encoded>
			<wfw:commentRss>http://prius.cc/d/20090130_rmagick_2_9_0_for_windows_insu.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/20090130_rmagick_2_9_0_for_windows_insu.html" />
	</item>
		<item>
		<title>なんか開発者になりそうなのでIDEに慣れてみる</title>
		<link>http://prius.cc/d/20081121_nankakaihatsushaninarisounanod.html</link>
		<comments>http://prius.cc/d/20081121_nankakaihatsushaninarisounanod.html#comments</comments>
		<pubDate>Fri, 21 Nov 2008 02:26:11 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[仕事全般]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://prius.cc/d/%e3%81%aa%e3%82%93%e3%81%8b%e9%96%8b%e7%99%ba%e8%80%85%e3%81%ab%e3%81%aa%e3%82%8a%e3%81%9d%e3%81%86%e3%81%aa%e3%81%ae%e3%81%a7ide%e3%81%ab%e6%85%a3%e3%82%8c%e3%81%a6%e3%81%bf%e3%82%8b.html</guid>
		<description><![CDATA[魔法戦士→魔法使い程度のちょっとした社内ジョブチェンジをするかもなので、IDEに慣れるためいろいろ調べてみた。&#9632;IDEとはプログラムを開...]]></description>
			<content:encoded><![CDATA[				<p>魔法戦士→魔法使い程度のちょっとした社内ジョブチェンジをするかもなので、IDEに慣れるためいろいろ調べてみた。</p>
				
				<h3>&#9632;IDEとは</h3>
				
				<p>プログラムを開発するための支援ソフトウェア。プログラムなんて手書きで書けばいーじゃん、と思うかもしれないが、数100行を超えてくると変数名やモジュール名を管理するにも一苦労だしロジック間違いも多くなる。そんな時IDEなら、今定義してる変数名一覧を表示してくれたり、文法間違いを指摘してくれたりするので使いこなすと便利。欠点は使うまでにいろいろ準備が必要な事。数10行レベルのスクリプトをIDEで書くのはアホ。</p>
				
				<h3>&#9632;今までのIDE使用経験</h3>
				
				<p>Ruby用IDEのRDEを使ったことはある…が、入力支援と即時実行しか使ってないのでIDEの真の力を引き出したとは言いがたい。この手のツールはWindowsのショートカットキーを知らなくても使えるのと同じで、<strong>がんばって覚えようと思わないと一切成長しない。</strong>折角の機会なので1つのIDEを選び覚える事にする。</p>
				
				<p>で、仕事で使うのはVisualStudioなのだが、僕の経験上、何かを学ぶには教科書だけでなく課題が必要である。プライベートでVBは書かないので、良く使うRuby用のIDEを習得する事にする。以下のページを参考。</p>
				
				<p><a href="http://codezine.jp/article/detail/2482?p=1" target="_blank">Ruby on Rails用 統合開発環境（IDE） 比較レポート：CodeZine</a></p>
				
				<p>汎用性が高く情報量が多そうなのでEclipse+RadRailsプラグインで開発してみる事にする。</p>
]]></content:encoded>
			<wfw:commentRss>http://prius.cc/d/20081121_nankakaihatsushaninarisounanod.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/20081121_nankakaihatsushaninarisounanod.html" />
	</item>
		<item>
		<title>[N★B]フィルタ機能をリリースしました。</title>
		<link>http://prius.cc/d/20070425_nhoshib_fuirutakinouoririsushi.html</link>
		<comments>http://prius.cc/d/20070425_nhoshib_fuirutakinouoririsushi.html#comments</comments>
		<pubDate>Wed, 25 Apr 2007 08:36:01 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[ウェブ全般]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://prius.cc/d/n%e2%98%85b%e3%83%95%e3%82%a3%e3%83%ab%e3%82%bf%e6%a9%9f%e8%83%bd%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%97%e3%81%be%e3%81%97%e3%81%9f%e3%80%82.html</guid>
		<description><![CDATA[NEWSING★BOOSTERnewsingの特定の記事をフィルタした上で新着記事を表示する機能をリリースしました。&#9632;残念ながらフィルタされちゃった人たち。...]]></description>
			<content:encoded><![CDATA[				<p>NEWSING★BOOSTER</p>
				
				<p>newsingの特定の記事をフィルタした上で新着記事を表示する機能をリリースしました。</p>
				
				<h3>&#9632;残念ながらフィルタされちゃった人たち。</h3>
				
				<p>まずは言わずと知れたOhmynews。最近ウザいAskビデオ。そして名誉セルピカーwのfuwarinzさん(※1)は他のセルピクさんとは別扱いとさせて頂きました(けどフィルタ対象w)。セルピクリストは気づき次第追加していきます(※2)。Ohmynewsなんかは善意の人がpickするときもあるので、sunagimoさんの場合だけ除外するのでもいいですかねー。セルコメさんは除外するか迷いましたが、これも自推に近いものがあるなぁ…と思い隔離。</p>
				
				<p>※1 いや…。記事の内容はいいと思うんですが。自推っていのうは俺の中で信頼性が低いんですよ(これについては別の機会に説明したい)<br />
				※2 そういや日常刺激ジャーナルの人、アカウント削除されちゃいましたね。</p>
				
				<h3>&#9632;困っていること</h3>
				
				<p>フィルタはフィルタでOKなのですが、当初は</p>
				
				<p><strong>「fuwaさんの記事はフィルタ。けど200pt以上の記事は表示」</strong></p>
				
				<p>みたいな事をやろうと思っていました。で、これは技術的にはできるのですが問題点があります。記事公開から時間が経って200ptを超えても表示されるのは後ろの位置なので結局気づかないのです。対策としては</p>
				
				<p><strong>「200ptを超えた時間を投稿時間とする」</strong></p>
				
				<p>ことで、擬似的に新着に表示させることはできますが、保存されているデータをいじらないといけないし今後の事を考えると付け焼き刃過ぎる対応かなぁと思いまして…。何か抜本的にな対策ないですかね？</p>
				
				<h3>&#9632;まぁ取りあえず</h3>
				
				<p>公言していた機能は全部実装しましたが、まだやりたいことあるので鋭意開発がんばりたいと思います。</p>
				
				<p>…つーか自宅のクライアントPCでデータ取得してるのでたまにデータ取得できてない時があります。てごめんなさい。</p>
				
				<h3>&#9632;独自ptについての補足</h3>
				
				<p>N★Bの独自ランキングに使っている独自ptですが、今のところ</p>
				
				<p><pre>pt = 100pt+newsingのpoint/3+○コメント×30+×コメント×20
pickerが1stコメントの場合-80
n = (60×60×24-投稿時刻から経過した秒数/60×60×24)^2</pre></p>
				
				<p>として</p>
				
				<p><pre>pt×n</pre></p>

<p>で出してます。nで使っている60×60×24というのは1日の秒数です。つまり記事が投稿してから1日経つと必ず人気エントリーから消えます。x軸を時間に取った1-x^2のグラフのイメージですね。</p>

<p>最初は48時間でやってたんですが同じ記事がTOPに残りすぎるので24時間にしました。ただ24時間だとnewsing側でコメントが伸びてるのにN★Bからは消えちゃうとかあるので、もうちょっと長いほうがいいかなぁ。今考えてるのはアクセスの少ない0時～8時は時間を進ませないようにすること。こうすれば24時間+8時間で32時間になるのでバランスがよくなりそうです。</p>
]]></content:encoded>
			<wfw:commentRss>http://prius.cc/d/20070425_nhoshib_fuirutakinouoririsushi.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/20070425_nhoshib_fuirutakinouoririsushi.html" />
	</item>
	</channel>
</rss>

