2017-04

Latest Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Twitterから日別のログを生成して日記に

まともに日記を付けなくなって1年半が経ってしまった。

1992年7月からノートに日記を付け始めた。
1997年2月からはモバイルギアMC-MK)で書いた。ウェブでの公開も開始。DOS化してhtermでLinuxマシンにkermit転送してからアップしてたりしたな。
その後、Palm(Workpad、Visor、m100)、りなざう(SL-B500、SL-C700)を使い、出先で自宅で書いては、編集してアップ、を行っていた。
2006年3月からは、FC2でブログを書き始める。時流に乗ることとブログパーツを開発したことが動機だが、これはウェブ系のネタに限定される。古い日記はてなダイアリーに移した。

そしてこの頃から本来の日記を付けることが滞ってしまった。オフラインで書くことが億劫になったのかな。日常の出来事や読後感想、なんか思索っぽいことを書き留めなくなってしまった。公開/非公開のやり方についても疑問が生じ、編集を挟むことが面倒になった。しかし表に出せない日記を書くことはやはり重要だとも思えて、非常に残念だ。

2007年4月からはTwitterを始めている。コミュニケーションは少ないけどウェブ上のネタは拾っており、携帯からも更新するので日常の行動もある程度カバーしている。入院中の日記も後でまとめたけど、Twitterの方がカバーできている。

しかしTwitterでは過去ログを辿るインターフェイスがない。permalinkはあるものの日時を指定して読むことができない。あの頃は何してたっけ?が分からないのだ。APIにそれっぽいのがあるけど、指定した日時以降で最新のものから20件を取得するので結局最新のものになる。
そこでスクリプト書いた。

http://d.hatena.ne.jp/nuttymenthol/

上記APIが直近24時間に制限されるので、楽に1日分が取れそうだけど、失敗したくないので1日2回実行する。仕様にあるページングを実装したつもりだが、API側に実装されていない! HTML構成は変わることがあるからスクレイピングはしたくないなぁ。あんまりupdateしていないので半日で20を超えなければ大丈夫なんだけど。7ヶ月で1,500updateほどだし。APIが完成するのを気長に待つか。
過去のログもTwitterからスクレイプしてインポートした。

これを自動で回しながら、技術ネタウェブネタはFC2(とはてなグループ)に、長文で書きたいときははてなダイアリー(メインアカウント)に付け足して行こうと思う。

はてなスターの引用機能で任意のメッセージを伝える

はてなスターには引用機能というのがあって、元のページにある文章の一部を☆に付随させることができる。
この文章を好きに入力できるブックマークレットを作ってみた。

HateStaMes
javascript:(function(){var s=document.createElement('script');s.innerHTML='Ten.DOM.getSelectedText='+function(){return prompt();}.toSource();document.body.appendChild(s);})();

これを実行してから、Add Starを押す。
promptをEnterで確定させるともう一回Add Starが走ってしまうんだけど、これって何故?
「OK」ボタンを押せば正しく動作する。

本来はコメント機能を使ってやるべきものだけど、Friendにならないとコメント機能は使えないので。
幸い、元の文章にない文言を☆に付けても、表示の際に障害は起こらなかった。
邪道かなぁ。
はてなスターコメントを用いて罵倒をするもう一つの方法ってことになるのだろうか。

(追記)
あれ? IEで動かない。
toSource()が駄目なようだが、そもそもtoSource()が何をしているのかよく理解していない。

(10/29追記)
日本語の一部の文字、というか大部分が通らないみたい。prompt()のせい?
star.add.jsonがエントリを取得して「同じ文字があるかどうか」をチェックしているとしか思えない。という結論になりました。

AmazonのHTMLが変わってる

ので、Amazon Kinokuniya Linkyを書き換え。今更だけど。
Amazon Kinonavi Linkyのみupdateします。
新規店も追加。

どう変わったかはここ参照。
<b class="sans">が書名以外のところにも使われるようになっていた。
mixiのデザインリニューアルに関して否定的な意見が多い中、HTMLソースはclassやidが指定されて良くなった、とのがあったが、Amazonは逆行してるんじゃないか。
というかXPathを勉強しろってことか?

もばいるじゃいく

携帯からTwitterにメール投稿するついったーもばいるをJaikuに移植した。

参考資料はtsupoさんの日本語訳(とオフィシャル「Twitter! Twitter APIガイドブック」)。
いろいろつまづいたね。
JSONが動かなくてXML-RPCの方を使ったり。Ruby1.8.5のバグなのかContent-Typeをヘッダに入れないと「XML-RPC server accepts POST requests only.」とか言われたり(これか?)。取得したRSSもそのままREXMLに食べさせるとiconvが文句言うのでnkf -Wwとか訳の分からんことしたり。
今後APIの仕様が変更になったりもするのかな。

まぁこれで一応の挙動は分かったけど、何かやろうかなぁ。
Inviteもできるようになっているので、Botを作ることもできるけど、Twitterと同じことやってても面白くない。
同じことをやるにしても、電車運行情報なら、train_kantoというChannelを作るといいかも。Botが投稿するだけでなく、ユーザーからの投稿も可能になって、情報が充実する。
とりあえずもう少し使いながら雰囲気を見極めてみるかな。


require 'nkf'
require 'net/http'
require 'cgi'
require "rexml/document"
require 'net/smtp'
Net::HTTP.version_1_2

id="xxxx"
api_key="xxxxxxxx"
from="(xxxx@xxxxxxxx\.ne\.jp|xxxx@xxxxxxxx\.co\.jp)"

mailserver="xxxx.xxxxxxxx.ne.jp"
maildomain="xxxx.xxxxxxxx.ne.jp"
mailid="jaikupost@xxxx.xxxxxxxx.ne.jp"
mailpass="xxxxxxxx"
mail="jaikupost@xxxx.xxxxxxxx.ne.jp"

status="Moving"
subject=""
address=""
response=""
mailbody=""

while line=gets
if line =~ /^Subject: (.*)$/
subject=$1
status=NKF.nkf('-mw',$1)
elsif line =~ /^From: (.*)$/
address=$1
end
end

if Regexp::new(from) =~ address

header = {'Content-Type' => 'text/xml; charset=utf-8'}
path="/xmlrpc" #?status="+status
data=<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>presence.send</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>user</name>
<value><string>#{id}</string></value>
</member>
<member>
<name>personal_key</name>
<value><string>#{api_key}</string></value>
</member>
<member>
<name>generated</name>
<value><boolean>0</boolean></value>
</member>
<member>
<name>message</name>
<value><string>#{status}</string></value>
</member>
<member>
<name>icon</name>
<value><int>325</int></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>
EOT
Net::HTTP.start(host="api.jaiku.com",80) {|http|
response=http.post( path, data ,header)
}

path = "/contacts/feed/atom?user="+id+"&personal_key="+api_key
Net::HTTP.start(host=id+".jaiku.com",80) {|http|
response=http.get( path )
}

statuses = REXML::Document.new(NKF.nkf('-Ww',response.body).gsub(/<img[^>]*\/>/,'')).elements.to_a("feed/entry")
statuses.each{|status|
text=status.elements.to_a("content/div/p").first.text.strip
/http:\/\/([^\.]+)\.jaiku\.com/=~status.elements.to_a("author/uri").first.text
author=$1
mailbody << NKF.nkf('-Wj', author.to_s+": "+text.to_s+"\n") if author!=id
}

#Net::SMTP.start( 'smtp01.itscom.net', 25, 'itscom.net') {|smtp|
Net::SMTP.start( mailserver, 25, maildomain, mailid, mailpass, :login ) {|smtp|
smtp.send_mail <<EndOfMail, mail, address
From: #{mail}
To: #{address}
Content-Transfer-Encoding: 7bit
Content-Type: Text/Plain; charset=iso-2022-jp
Subject: Re:#{subject}

#{mailbody.gsub("&gt;",">").gsub("&lt;","<").gsub("&amp;","&")}
EndOfMail
}

end

SETAKEの胸囲版

することもなくTwitterを眺めていたら@kotorikoがこんなことこんなことを言っていた。元ネタはこれなんだけど。
で、@hiramekiに投げて自分で消化。その間2時間弱。

http://worris3.sakura.ne.jp/kyoui/

めっちゃてきとう。
「名前 バスト センチ」で検索してsummaryから/\d+センチ/を抜いただけ。時間かからないように100件のみ。
例として出した分に関しては公表値や推定値がちゃんと取れている。
サイトデザインはSETAKEからほぼ丸パクリ。

«  | HOME |  »

移転しました。

ブログ引っ越しました。
無用の科学あるいは錬金術

 

株価情報

 

最近の記事

最近のコメント

 

最近のトラックバック

月別アーカイブ

カテゴリー

RSSフィード

ブログ内検索

 

なかのひと

 

ヘビーローテーション

 

 

リンク

広告

 

 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。