「sirogane」2013年春アニメ時報(仮)とGoogleのRSS(subscriptions.xml)をLTSVにするツール試作
フレア「siroganeのおかげで少なくとも年に4回はブログ更新のきっかけになって助かる(でもブロマガをどうしよう)。」
ミユ「ダイアリーの方は量的に月1ペースは保ってるはず。こんな時RSSっぽいものリーダーが普及できてればいいんですけどね(遠い目)。
というわけでクォーター(1年の4分の1、四半期、1クール)名物sirogane時報の更新(仮)
[signal| open(valvrave,urllist) 日00:00 @Wj@0h:@0n // 革命機ヴァルヴレイヴ 04月14日 open(date-a-live,urllist) 日00:00 @Wj@0h:@0n // デート・ア・ライブ 生 open(utapri2,urllist) 日01:30 @Wj@0h:@0n // うたプリ2000% open(takanotsume_max,urllist) 月00:00 @Wj@0h:@0n // 秘密結社 鷹の爪 MAX open(ds2,urllist) 月00:00 @Wj@0h:@0n // DEVIL SURVIVOR2 04月15日 open(ch7,urllist) 月12:00 @Wj@0h:@0n // DD北斗の拳 open(ketsuekigata,urllist) 月13:00 @Wj@0h:@0n // 血液型くん! 04月08日 open(hetalia-bfw,urllist) 月21:00 @Wj@0h:@0n // ヘタリア open(mjp,urllist) 月22:30 @Wj@0h:@0n // マジェスティックプリンス open(vanguard-lj,urllist) 火19:30 @Wj@0h:@0n // カードファイトヴァンガードリンクジョーカー open(nyaruko-w,urllist) 水00:30 @Wj@0h:@0n // 這いよれ!ニャル子さんW 04月10日 open(akunohana,urllist) 水01:00 @Wj@0h:@0n // 惡の華 04月10日 open(aiura,urllist) 水01:40 @Wj@0h:@0n // あいうら 04月10日 open(shingeki,urllist) 水22:30 @Wj@0h:@0n // 進撃の巨人 04月10日 open(gargantia,urllist) 水23:00 @Wj@0h:@0n // 翠星のガルガンティア 04月10日生 open(robotanime,urllist) 木00:15 @Wj@0h:@0n // 直球表題ロボットアニメ open(ch291,urllist) 木19:00 @Wj@0h:@0n // 秘密結社 鷹の爪 .jp open(oreimo2,urllist) 金00:00 @Wj@0h:@0n // 俺妹 04月12日 open(yuyushiki,urllist) 金00:30 @Wj@0h:@0n // ゆゆ式 04月12日 open(sparrows,urllist) 金01:00 @Wj@0h:@0n // スパロウズホテル 04月12日 open(hyakka-ryoran2,urllist) 金01:00 @Wj@0h:@0n // 百花繚乱 サムライブライド04月12日 open(ch7,urllist) 金12:00 @Wj@0h:@0n // 超速変形ジャイロゼッター 週 open(prettyrhythm_rl,urllist) 金19:30 @Wj@0h:@0n // プリティーリズム・レインボーライブ 04月19日 open(maousama,urllist) 金22:30 @Wj@0h:@0n // はたらく魔王さま! 04月12日 open(railgun-s,urllist) 金23:00 @Wj@0h:@0n // とある科学の超電磁砲S 04月19日 open(azazel_z,urllist) 土00:45 @Wj@0h:@0n // アザゼルさん。Z 04月13日 open(muromisan,urllist) 土01:00 @Wj@0h:@0n // 波打際のむろみさん 04月13日 open(hayate-cuties,urllist) 土22:30 @Wj@0h:@0n // ハヤテのごとく! Cuties 04月13日 open(rdg,urllist) 土23:30 @Wj@0h:@0n // RDG レッドデータガール 生 |signal] [urllist| valvrave http://ch.nicovideo.jp/valvrave // 革命機ヴァルヴレイヴ date-a-live http://ch.nicovideo.jp/date-a-live // デート・ア・ライブ hetalia-bfw http://ch.nicovideo.jp/hetalia-thebeautifulworld // ヘタリア vanguard-lj http://ch.nicovideo.jp/vanguard-lj // カードファイトヴァンガードリンクジョーカー ch7 http://ch.nicovideo.jp/ch7 // テレ東あにてれちゃんねる robotanime http://ch.nicovideo.jp/robotanime // 直球表題ロボットアニメ ch291 http://ch.nicovideo.jp/ch291 // 鷹の爪ちゃんねる takanotsume_max http://ch.nicovideo.jp/takanotsume_max // 秘密結社 鷹の爪 MAX rdg http://ch.nicovideo.jp/rdg // RDG レッドデータガール utapri2 http://ch.nicovideo.jp/utapri2 // うたプリ2000% ds2 http://ch.nicovideo.jp/ds2 // DEVIL SURVIVOR2 the ANIMATION ketsuekigata http://ch.nicovideo.jp/ketsuekigata-kun // 血液型くん! mjp http://ch.nicovideo.jp/mjp // マジェスティックプリンス nyaruko-w http://ch.nicovideo.jp/nyaruko-w // 這いよれ!ニャル子さんW akunohana http://ch.nicovideo.jp/akunohana // 惡の華 aiura http://ch.nicovideo.jp/aiura // あいうら shingeki http://ch.nicovideo.jp/shingeki // 進撃の巨人 gargantia http://ch.nicovideo.jp/gargantia // 翠星のガルガンティア oreimo2 http://ch.nicovideo.jp/oreimo2 // 俺の妹がこんなに可愛いわけがない。 yuyushiki http://ch.nicovideo.jp/yuyushiki // ゆゆ式 sparrows http://ch.nicovideo.jp/sparrows // スパロウズホテル hyakka-ryoran2 http://ch.nicovideo.jp/hyakka-ryoran2 // 百花繚乱 サムライブライド prettyrhythm_rl http://ch.nicovideo.jp/prettyrhythm_rl // プリティーリズム・レインボーライブ maousama http://ch.nicovideo.jp/maousama // はたらく魔王さま! railgun-s http://ch.nicovideo.jp/railgun-s // とある科学の超電磁砲S azazel_z http://ch.nicovideo.jp/azazel_z // よんでますよ、アザゼルさん。Z muromisan http://ch.nicovideo.jp/muromisan // 波打際のむろみさん hayate-cuties http://ch.nicovideo.jp/hayate-cuties // ハヤテのごとく! Cuties |urllist]
生→生放送のみ。
週→一週間とか期間限定。
有→だいたい2話以降有料。
うたプリ2000%→うたの☆プリンスさまっ♪ マジLOVE2000%
ヘタリア→ヘタリア The Beautiful World
俺妹→俺の妹がこんなに可愛いわけがない。
DEVIL SURVIVOR2→DEVIL SURVIVOR2 the ANIMATION
マジェスティックプリンス→銀河機攻隊 マジェスティックプリンス
プリティーリズム・レインボーライブ→プリティーリズム・レインボーライブ
カードファイトヴァンガードリンクジョーカー→カードファイト!! ヴァンガード リンクジョーカー編
アザゼルさん。Z→よんでますよ、アザゼルさん。Z
」
レクィド「追加で来そうなの鷹の爪(ガラスの仮面とみにヴぁんは不明)ぐらいだし"(仮)"とかいらなくね?
注意、2013年春アニメチャンネルに載ってない、ニコ動で配信するアニメもあるから気を付けるべし
2013年春アニメとは ニセンジュウサンネンハルアニメとは [単語記事] - ニコニコ大百科
ニコ生の配信情報発表はいつも第二段とかあるからまだ追加がある可能性高いな←追加ある時はあるけど、もっと抑えめの印象がある 今回ほとんど全部出し切ってるよね
ニコニコチャンネルで配信される2013年春アニメ決定!:なんだかおもしろい
*1
」
ミユ「"(仮)"はsiroganeのバージョンアップが具体的な視野に入ってきたのでsiroganeの時報の.tsvの仕様が変わるかもですから(そもそもWeb巡回は時報枠から外す事も検討)。
Labeled Tab-separated Values (LTSV) format is a variant of Tab-separated Values (TSV). Each record in a LTSV file is represented as a single line. Each field is separated by TAB and has a label and a value. The label and the value have been separated by ':'. With the LTSV format, you can parse each line by spliting with TAB (like original TSV format) easily, and extend any fields with unique labels in no particular order.
Labeled Tab-separated Values LTSV
Labeled Tab Separated Values (LTSV) というのは、はてなで使っているログフォーマットのことで、広く使われているTSV(Tab Separated Value)フォーマットにラベルを付けて扱い易くしたものです。
Labeled Tab Separated Values LTSV ノススメ - stanakas blog
サービスごとの要求に応じて、どんどん独自拡張していると個別にParserの定義を書かないといけなくなったり、fluentdで扱う際にも頑張ってサービスごとの定義を正規表現で書かないといけない羽目になって、どんどん辛くなります。
ログフォーマットに期待されることは、
・フォーマットが統一されている → 共通のツールで集計し易い
・新しいフィールドの追加が容易 → サービス固有のデータをログに残したいことはよくある。かつ、複数サービスに渡って、別々のエンジニアが触っても混乱しない
・one linerで操作しやすい → grepした後でsortなり、uniqなりで集計するのはよくあること
の3点だと考えています。
Labeled Tab Separeted Valueフォーマットのメリットは、まずログを定義する時に各フィールドの順序を意識しなくてよく、各プロダクトで容易に独自拡張できる、ということにあります。
LTSV については、ラベルをつけることで柔軟に拡張できるという点が、その特徴として取り上げられますが、もう一点、タブをセパレータに使うことでログのパースが簡単になった、という点を忘れるべきではないでしょう。
LTSV のもうひとつのメリット、あるいは、プログラムでログを出力する際に気をつけるべきこと - kazuhoのメモ置き場
タブがログの、User-Agent 等の文字列中に現れることはないのかって? ありません。というのは、かつて、Apacheに送信するHTTPリクエストに制御文字を含めることでサーバ運用者に対して攻撃が可能になるという脆弱性が発見され、
結果として Apache のログにおいては制御文字が全てエスケープされるようになったという経緯があるのです。
概要としては「サイトからRSS(無きゃ無いでWebスクレイピング)をローカルに読み込みLTSVに一本化計画(仮)。」
「sirofeed.ltsv」でタイミングを図って読み込んだブロマガとかマイリスとかの更新履歴を「yyyy-mm-dd.ltsv」に保存する仕組みをsiroganeに搭載したいなーと。
// sirofeed.ltsv(仮)
title:大風呂ダ敷 feed:http://d.hatena.ne.jp/ooblog/rss html:http://d.hatena.ne.jp/ooblog/ crawl:yyyy-mm-ddWhh:nn:ss+09:00
// yyyy-mm-dd.ltsv(仮)
date:yyyy- m- dWhh:nn:ss+09:00 quote:2013年春アニメ時報(真)+siroganeがRSSリーダーっぽくなりました。 link:http://d.hatena.ne.jp/ooblog/yyyymmdd/tttttttttt icon:base128
ちなみにdとhの間にあるTポジションのWは「UMTWRFS(SMTWTFS)」。一週間をアルファベット一文字で表現みたいな。
「crawl:」ラベルはsirogane用の拡張。読み込み高速化のため"アニメ時報(真)"では先頭に持ってくるかも。
」
フレア「20世紀にあったホームページ更新チェッカーの予感。」
ミユ「当時のソフトはサイト毎に更新のタイミングをずらすなんて親切機能は無かった気がします。
とりあえずGoogleリーダーの「subscriptions.xml」をLTSVに変換した気分になるツールは作ってあるのでここに。別途「nkf32.dll」が必要。
Google リーダーは 2013 年 7 月 1 日をもって廃止します。その前に Google リーダーのすべてのデータのコピーをダウンロードする場合は、Google データエクスポートで行えます。登録データは XML ファイルとして取得できます。
Google リーダーのデータをダウンロードする方法 - Google リーダー ヘルプ
nkf.exe nkf32.dll Windows用 ソースファイル ネットワーク用漢字コード変換フィルタ シフトJIS,EUC-JP,ISO-2022-JP,UTF-8,UTF-16
VA007219 ソフトウェアの配布 dfd64, diskmap, dkclear, SDFMach
// siroR2T.hsp(仮)
#define EXENAME "siroR2T" #packopt name EXENAME #define VERSION strf(__date__+" "+__time__) #define APINAME strf("「"+EXENAME+"」 varsion "+VERSION) #uselib "nkf32.dll" #func global GetNkfVersion "GetNkfVersion" sptr #func global SetNkfOption "SetNkfOption" sptr #func global NkfConvert "NkfConvert" var,sptr #uselib "shell32.dll" #func global DragAcceptFiles "DragAcceptFiles" int,int #func global DragQueryFile "DragQueryFileA" int,int,int,int #func global DragQueryPoint "DragQueryPoint" int,int #func global DragFinish "DragFinish" int #const global WM_DROPFILES 0x0233 #const TRUE (1+1=2) #const FALSE (2+2=5) #enum OUTLINE_TEXT =0 #enum OUTLINE_XML #enum OUTLINE_HTML #enum OUTLINE_MAX sdim outline_label,16,OUTLINE_MAX outline_label(0)="title","feed","html" sdim outline_name,16,OUTLINE_MAX outline_name(0)="outline text","xmlUrl","htmlUrl" sdim outline_find,16,OUTLINE_MAX: dim outline_findlen,16,OUTLINE_MAX repeat OUTLINE_MAX outline_find(cnt)=strf("%s=\"",outline_name(cnt)) outline_findlen(cnt)=strlen(outline_find(cnt)) loop sdim xml_html_url,1024 sdim rsslistpath,260: rsslistpath="subscriptions.xml" sdim rsslistUTF,32000: sdim rsslistnote,32000 sdim ltsvlistpath,260: sdim ltsvlistnote,32000 sdim cmdlinebuf,1024: cmdlinebuf=dir_cmdline sdim filedrop,1600: sdim filedropline,260 exist cmdlinebuf: if( strsize>0 ){ rsslistpath=cmdlinebuf } screen WINID_MAIN,512,256: title APINAME mes {" about:GoogleReaderのXMLをsiroganeのLTSVに変換するツールです。 use:subscriptions.xmlをDropするとsubscriptions.ltsvを作成。 "} oncmd gosub *OnDropFiles,WM_DROPFILES: DragAcceptFiles hwnd,1 *main exist rsslistpath: if( strsize>0 ){ goto *OnDropSkip } stop *OnDropFiles handle_drop=wParam: DragQueryFile handle_drop,-1,0,0: droplen=stat filedrop="" repeat droplen DragQueryFile handle_drop,cnt,varptr(filedropline),260 filedrop+=filedrop+filedropline+"\n" loop DragFinish handle_drop rsslistpath=filedropline *OnDropSkip mes strf("load:%s",rsslistpath) notesel rsslistUTF: noteload rsslistpath: noteunsel memexpand rsslistnote,strlen(rsslistUTF)*2 SetNkfOption "-s": NkfConvert rsslistnote,rsslistUTF ptL=0: ptR=0: outlinecnt=0: redraw 0 *outline repeat OUTLINE_MAX ptR=instr(rsslistnote,ptL,strf("%s=\"",outline_name(cnt))) ptL+=ptR: if( ptR<0 ){ break } ptR=instr(rsslistnote,ptL+outline_findlen(cnt),"\"") if( ptR<0 ){ break } xml_html_url=strmid(rsslistnote,ptL+outline_findlen(cnt),ptR) ltsvlistnote+=strf("%s:%s\t",outline_label(cnt),xml_html_url) loop if( ptR>=0 ){ ltsvlistnote+="crawl:\n": outlinecnt++ title strf("%s:%d",EXENAME,outlinecnt): await 1 goto *outline } ltsvlistpath=getpath(rsslistpath,1)+".ltsv" notesel ltsvlistnote: notesave ltsvlistpath: noteunsel mes strf("saved:%s",ltsvlistpath): redraw 1 stop
※XMLのタグを雑に読み飛ばすので、タグの配置などが変更されると読み込めなくなる場合があります。
」
レクィド「エイプリルフールな御時世に報告って事はエターナる(未完)への保険じゃねーだろなw」
ミユ「RSSの構文が複雑に入り組んでるのが悪いのだっ。」
*1:2013-04-08:「革命機ヴァルヴレイヴ」「秘密結社 鷹の爪 MAX」「DD北斗の拳」追加。その他修正。