<?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; プログラミング</title>
	<atom:link href="http://prius.cc/d/tag/tag-prog/feed" rel="self" type="application/rss+xml" />
	<link>http://prius.cc/d</link>
	<description>1981年生まれのITエンジニアが成長日記や技術情報やスノーボードのことを書いているブログ。</description>
	<lastBuildDate>Thu, 29 Jul 2010 00:38:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/tag/tag-prog/feed" />
		<item>
		<title>[memo]twitter上での継続目標管理ツールを作りたい</title>
		<link>http://prius.cc/d/20100523_twitterapl.html</link>
		<comments>http://prius.cc/d/20100523_twitterapl.html#comments</comments>
		<pubDate>Sun, 23 May 2010 04:23:39 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[思ったこと、考えたこと]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://prius.cc/d/?p=2738</guid>
		<description><![CDATA[				こういうtwitterアプリを作りたいと思った。
				
				継続目標管理ツール
				
				
				毎日5kmジョギングする
				1週間に1冊本を読む
				3日に1回ジムに行く
				
 [...]]]></description>
			<content:encoded><![CDATA[				<p>こういうtwitterアプリを作りたいと思った。</p>
				
				<h3>継続目標管理ツール</h3>
				
				<ul>
				<li>毎日5kmジョギングする</li>
				<li>1週間に1冊本を読む</li>
				<li>3日に1回ジムに行く</li>
				</ul>
				
				<p>などの継続目標を支援するアプリ。「体重を○kg落とす」などの最終目標は知らない。最終目標に向かって各自が設定する日々のマイルストーンを支援する。</p>
				
				<h3>使い方</h3>
				
				<ul>
				<li>twitterアプリのポータルサイトより利用登録をする。アプリと利用者のtwitterアカウントが連動する</li>
				<li>目標とその内容・間隔(24時間・168時間(1週間))・継続期間を登録する
				
				<ul>
				<li>例：腕立て伏せを毎日30回・二の腕の筋肉をつけるため、腕立て伏せをがんばる！・24時間・30日</li>
				</ul></li>
				<li>twitterアプリのアカウント宛てに@を飛ばし『「目標」を実行した』と投稿する。
				
				<ul>
				<li>例：@mokuhyoapli 「腕立て伏せを毎日30回」を実行した</li>
				</ul></li>
				<li>仮に指定間隔内に投稿がなかった場合、<strong>ユーザーのTLに目標を達成できなかった旨を投稿する</strong>
				
				<ul>
				<li>例：@user は「腕立て伏せを毎日30回」を実行しませんでした。</li>
				<li>目標を実行しなかった意志の弱いカス野郎とか書くようなオプションを用意してもいいかもしれない。</li>
				</ul></li>
				<li>継続期間に休みなく目標を達成した場合、@mokuhyoapiiアカウント上で表彰する
				
				<ul>
				<li>例：. @userは「腕立て伏せを毎日30回」を24時間間隔で30日間実行した神！</li>
				<li>アプリのポータルサイトに過去に達成された目標一覧ページとかつくってもいいかもしれない。</li>
				</ul></li>
				</ul>
				
				<h4>その他案(追記予定)</h4>
				
				<ul>
				<li>継続期間があまりに短いと意味がないので、7日以上しばりにするといいかもしれない
				
				<ul>
				<li>けどここらへんはユーザーが考える事だからまぁいいか。</li>
				</ul></li>
				<li>1人あたりの目標数の制限を導入する?
				
				<ul>
				<li>少数の目標に全力投球して欲しい、という意味で</li>
				<li>まぁこれも最初は制限しなくていいかもしれない</li>
				</ul></li>
				</ul>
				
				<h3>Q&amp;A</h3>
				
				<ul>
				<li>別に嘘つけますよね？
				
				<ul>
				<li>嘘をつけますが、毎日意識させるだけで全然違うし、目標を達成した！と毎日嘘をつく自分に空しくなってくるはずです。</li>
				</ul></li>
				<li>途中で目標達成が困難になった場合はどうするのですか?
				
				<ul>
				<li>継続目標とは「がんばれば達成できるレベル」のものを設定するべきなので、達成困難になったのもユーザーの責任です。</li>
				<li>よって目標を断念するときは1200字(原稿用紙3枚分)の反省文を提出し、その上で目標断念ボタンを押せるようにします。</li>
				<li>反省文はポータルサイトに公開されます。</li>
				</ul></li>
				<li>冠婚葬祭など公にし辛い理由の場合は?
				
				<ul>
				<li>それ用に緊急停止ボタンをつくります。ただし緊急停止ボタンを使いすぎると強制的に登録解除され、一定期間経たないと再登録できないようにします。おばあちゃんの急病が何回も使えないのと同じです。</li>
				</ul></li>
				</ul>
				
				<h3>登録解除周りの話</h3>
				
				<ul>
				<li>OAuth周りの事とか調べてないけど、目標実行中にいきなり登録解除はできないようにしたい。</li>
				<li>登録解除するには今実行中の目標を達成・断念・緊急停止してから登録解除できるようにしたい</li>
				<li>最悪、「不正なルートで登録を解除しました」とか投稿できるように。</li>
				<li>まぁここらへんはそういうユーザーが増え始めてから考えればいい話か。</li>
				</ul>
				
				<h3>まとめ</h3>
				
				<p>何事も継続しないと意味がない。諸行無常なtwitterでは「このpostがRTされただけ腹筋する」などというものがあるが、本来なら毎日継続して・集中して腹筋するのが一番効果的。継続を支援するアプリ。</p>
]]></content:encoded>
			<wfw:commentRss>http://prius.cc/d/20100523_twitterapl.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/20100523_twitterapl.html" />
	</item>
		<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;">
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>GJ!の新着拍手を表示するRSSを作成する。</title>
		<link>http://prius.cc/d/20090630_gjrss.html</link>
		<comments>http://prius.cc/d/20090630_gjrss.html#comments</comments>
		<pubDate>Tue, 30 Jun 2009 06:36:58 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[BlogやSNS]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://prius.cc/d/?p=1819</guid>
		<description><![CDATA[				先日導入したWeb拍手&#8221;GJ!&#8221;し、結構気に入って使ってるのですが欠点が一つ。拍手されたかどうかはGJ!の管理者ページを見に行かないと分からない。ということで、GJ!の新着拍手があればRS [...]]]></description>
			<content:encoded><![CDATA[				<p>先日導入したWeb拍手&#8221;GJ!&#8221;し、結構気に入って使ってるのですが欠点が一つ。<strong>拍手されたかどうかはGJ!の管理者ページを見に行かないと分からない。</strong>ということで、GJ!の新着拍手があればRSSを更新するスクリプトを作成してみました。PHPできないのでrubyで作成。</p>
				
				<p><a href="http://prius.cc/d/20090510_wp_gj.html" title="WordPressにWeb拍手”GJ!”を導入してみた。">WordPressにWeb拍手”GJ!”を導入してみた。</a></p>
				
				<p><pre class="brush: ruby;">
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'kconv'
 # 出力するRSSファイル名決定
fname = &amp;quot;gj_new.rss&amp;quot;
f = File.open(fname, &amp;quot;w&amp;quot;)
 # GJ!の管理者ページ設定
url = 'http://prius.cc/gj/gj.php?mode=show&amp;amp;[GJ!で設定したパスワード]&amp;amp;new'
#
elemarr = Array.new
doc = Hpricot(open(url))
(doc/%Q[//tr]).each do |elem|
  elemarr &amp;lt;&amp;lt; elem
end
#
arr1 = Array.new
arr2 = Array.new
2.upto(21) do |i|
  (elemarr[i]/%Q[//td]).each do |elem|
    arr2 &amp;lt;&amp;lt; elem.inner_text
  end
  arr1 &amp;lt;&amp;lt; arr2
  arr2 = Array.new
end
arr1.transpose
 # RSS作成
 # 「rss/maker」ライブラリを利用します
require 'rss/maker'
 # RSSのバージョンを指定してRSSオブジェクトを生成します
rss = RSS::Maker.make(&amp;quot;1.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/&amp;quot;
  maker.channel.title = &amp;quot;GJ_RSS&amp;quot;
  maker.channel.description = &amp;quot;GJ_RSS&amp;quot;
  maker.channel.link = &amp;quot;http://prius.cc/&amp;quot;
  # RSSのitemを更新日が新しい順番にソートする機能を有効にする
  maker.items.do_sort = true
  # 以下では記事に関する情報を指定します
  arr1.each do |elem|
    item = maker.items.new_item
    item.title = elem[3]
    item.link = &amp;quot;http://prius.cc/gj/&amp;quot;
    item.dc_subject = elem[3]
    item.description = elem[2] + &amp;quot;からのコメント：&amp;quot; +elem[1]
    item.date = Time.parse(elem[0])&lt;br /&gt;
  end
end
 # RSSを出力します
f.puts rss
</pre></p>
				
				<p>作成時間は40分です。。。</p>
				
				<p>参考：<a href="http://kazuhiro.ty.land.to/blog/2007/01/rubyrss.html">Kazuhiro&#8217;s Weblog: RubyでRSSを自作してみよう</a></p>
				
				<p>で、これを運用するにはcronの動かせるサーバを立てなければいけない。やっぱ拍手をトリガーにしてサーバサイドでRSS作る仕組みの方が(構成的に)簡単だなぁ。GJ!の次バージョンで導入されればいいなぁ…。</p>
]]></content:encoded>
			<wfw:commentRss>http://prius.cc/d/20090630_gjrss.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/20090630_gjrss.html" />
	</item>
		<item>
		<title>OpenSocial周りのWebの盛り上がりについて。</title>
		<link>http://prius.cc/d/20090627_opensocial.html</link>
		<comments>http://prius.cc/d/20090627_opensocial.html#comments</comments>
		<pubDate>Sat, 27 Jun 2009 05:46:48 +0000</pubDate>
		<dc:creator>tera</dc:creator>
				<category><![CDATA[勉強]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://prius.cc/d/?p=1794</guid>
		<description><![CDATA[				前エントリで
				
				
				  正直、参加者の大半が課題作れなかったのは意外だった。…と他人事のように書いて俺も出来なかったわけだがw、おそらく主催者のwillnetさんはこれくらい簡単にできると思 [...]]]></description>
			<content:encoded><![CDATA[				<p><a href="http://prius.cc/d/20090627_opensocial-host.html">前エントリ</a>で</p>
				
				<blockquote>
				  <p>正直、参加者の大半が課題作れなかったのは意外だった。…と他人事のように書いて俺も出来なかったわけだがw、おそらく主催者のwillnetさんはこれくらい簡単にできると思ってたんじゃないかな？</p>
				</blockquote>
				
				<p>と書いたわけだけど、これはマジで意外だった。</p>
				
				<p>実は俺が思ってるより課題(<a href="http://d.hatena.ne.jp/willnet/20090626">こちら</a>を参照)が難しかったのかもしれないけど、やる事と言えば</p>
				
				<ol>
				<li>Todoリストの完了ボタンにユニークなid属性を付与する</li>
				<li>完了ボタンを押すとid情報をJavaScript APIに渡し、Todo情報を削除するようにする</li>
				</ol>
				
				<p>くらいだから、やはりこれくらいは簡単にできる想定だったんだろう。つまり<strong>昨日の参加者はJavaScriptに不慣れだった</strong>と勝手に決め付けて話を進めるが、俺は勉強会＝ある程度は出来る人の集まりというイメージを持ってたし参加者もWeb系の人がほとんど(だったと思う)ので、この結果には驚いてしまったのである。という事で考察。</p>
				
				<h4>1. 普段JavaScriptを書いてない人が興味を持ってる</h4>
				
				<p>まぁ俺ですが、普段Webアプリも作らないくせにmixiアプリに興味を持ってOpenSocial勉強会に参加した人。けどこれは少数派。会場に来てたと思われるWeb系の人はどうなの？となるが、Web系だからと言ってJavaScript書いてるとは限らないのである(学生時代のWeb系会社バイト経験より)。</p>
				
				<p>参加者の中にドリコムの人がいて彼はバリバリmixiアプリ作ってそうだったけど、ドリコムは「なるべくJavaScriptを書かずmixiあぷりを作れるような」フレームワークを構築してるらしい。</p>
				
				<p>実際俺も<strong>「JavaScriptって書くの面倒っぽくてクライアント環境に依存する割に大したことできねーし」</strong>と思って今まで勉強しなかったわけだし、Web系会社に勤めていても「毎日JS書いてます！」という人は少ないのかもしれない。</p>
				
				<h4>2. 普段JavaScriptを書いている人が興味を持っていない</h4>
				
				<p>ポイントはこっちかな。毎日JS書いてそうなWeb上での有名人がOpenSocialに食いついてない気がする。これも勝手に考えると、</p>
				
				<ol>
				<li>技術的には面白くない</li>
				<li>ソーシャルってのが気に喰わない</li>
				<li>検証環境を作るのが面倒。</li>
				</ol>
				
				<p>のかなぁと。OpenSocialといってもmixiの情報使えるだけで後はJavaScriptで書くだけ。普段からJS使ってる人はあまり目新しいと思わないのかも。もう一つが、mixiアプリ作ってもmixiの中でしか使えないこと。俺は<a href="http://prius.cc/d/20090515_mixiapp.html">このエントリ</a>で書いたとおり<strong>友達が使ってくれるだけでもいいじゃん</strong>と思うんだけど、Webアプリを作ってURL一発でリーチしてる人なら、mixiだけのためにアプリ作るなんてアホらしいのかもしれない。会員制サイト否定派も多いしねー。</p>
				
				<p>最後はおまけだけど、いちいちファイルアップしてmixiアプリにアクセスするのが面倒という説。普段使ってる環境使えないとストレス溜まります。<a href="http://mixiapp.rash.jp/wp/?p=15">OpenSocial Development Environment</a>は使えるけど、eclipseインストールするのめんどいという人もいる。</p>
				
				<p>以上3つの理由で食いつきが悪いのかな、と思います。</p>
				
				<hr />
				
				<p>そう考えると、mixiアプリの作成者属性ってiPhoneアプリ作成者と被るところはあるのかも。面白半分、利益半分。普通のWebアプリに比べて法人割合が高い。</p>
				
				<p>ただ言えることは、現時点で<strong>mixiアプリを自在に作れる人は少数</strong>だということ。勉強会に来るメンバーがこのくらいの習熟度ということは、今のうちにノウハウ積み上げれば正式版スタートしてから手をつける人に差をつけることができるかも…！</p>
				
				<h3>とはいえ</h3>
				
				<p>前途多難だなー。プラットフォームが不安定で検証もままならねーし、JavaScriptっていっても昔流行ったステータスバーの表示をちょろっと変えるレベルじゃないからね。実際、<a href="http://www.amazon.co.jp/JavaScript-%E4%B8%AD%E7%B4%9A%E8%AC%9B%E5%BA%A7-~Ajax%E3%82%92%E5%AD%A6%E3%81%B6%E5%89%8D%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E8%97%A4%E6%9C%AC-%E5%A3%B1/dp/4774132349/ref=pd_sim_b_6">この本</a>を120ページくらいまで読んだけど、mixiアプリのコード例で使われてる書式なんて全然出てきませんからね＞＜　Web2.0時代のJavaScriptにはまだ遠いわー。</p>
]]></content:encoded>
			<wfw:commentRss>http://prius.cc/d/20090627_opensocial.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://prius.cc/d/20090627_opensocial.html" />
	</item>
	</channel>
</rss>
