Hatena::Groupnadesiko

そっとなでしこ RSSフィード


メインのブログに書くまでもない、なでしこ学習帳【記事一覧】 【このブログは何?】


特設!→【目次】なでしこ用Twitter 連携ライブラリ「なこったー」で遊ぶ


2010-06-20

グループの動的生成サンプル

| グループの動的生成サンプル - そっとなでしこ を含むブックマーク はてなブックマーク - グループの動的生成サンプル - そっとなでしこ

 今、twitterや、はてなハイク、はてなブックマークを引用するツールを作ってますが、それを意識して、グループを動的生成するサンプルを書いてみました。

■ソースコード

取得URLS=「http://b.hatena.ne.jp/mame-tanuki/20100619#bookmark-22338843
http://h.hatena.ne.jp/mame-tanuki/9236558820386233784
http://twitter.com/mametanuki/status/16532462281
http://hoge.cn/hoge/hoge
」

取得URLSを反復
  取得URLはそれ。
    取得URLをつぶやき仕分けして、つぶやきに代入。
    もし、つぶやき→サービス名が「対象外サービス」でないならば
    つぶやきをつぶやき整形出力。
    それを表示。
    ここまで。
ここまで


#-----------------------------------------------------------------------
# グループ定義
#-----------------------------------------------------------------------
■対象外サービスとは
  ・サービス名
  ・URL
  ・作る~
    サービス名は「対象外サービス」
#-----------------------------------------------------------------------
■ツイッターとは
  ・サービス名
  ・URL
  ・作る~
    サービス名は「ツイッター」
#-----------------------------------------------------------------------
■Hatenaハイクとは +ツイッター
  ・作る~
    サービス名は「はてなハイク」
#-----------------------------------------------------------------------
■Hatenaブックマークとは
  ・サービス名
  ・URL
  ・作る~
    サービス名は「はてなブックマーク」

#-----------------------------------------------------------------------
# 関数定義
#-----------------------------------------------------------------------
●つぶやき仕分け(URLを)
  URLからURLドメイン名抽出して、取得ドメインに代入。
  取得ドメインで条件分岐
    「twitter.com」ならば
      生成グループをツイッターとして作成。
    「h.hatena.ne.jp」ならば
      生成グループをHatenaハイクとして作成。
    「b.hatena.ne.jp」ならば
      生成グループをHatenaブックマークとして作成。
    違えば
      生成グループを対象外サービスとして作成。
  ここまで
  生成グループ→URLはURL。
  生成グループで戻る。

●つぶやき整形出力({グループ}対象グループを)
  出力TXTは、「・【{対象グループ→サービス名}】<{対象グループ→URL}」。
  出力TXTで戻る。

■コメント

■グループ定義

 作成中のツールでは、twitterや、はてなハイク、はてなブックマーク各々からログを取得する処理をグループで定義しようと考えています。はてなハイクのログ取得は、twitterAPI互換のはてなハイクAPIを使います。なので、はてなハイクのグループは、twitterグループをミックスし、共通化できる記述はまとめようと考えています。

 ちなみに、グループ名として「はてなハイク」とか「はてなブックマーク」が利用できなくて少し戸惑いました。日本語プログラミング言語であるなでしこでは、「は」は代入の演算子として使われるのでプログラム内の要素名に使えないみたいなんですね。で、泣く泣く「Hatena~」みたいな命名になっています。

■コンストラクター

 前回の記事に載せたソースコードでは、グループのメンバー関数として「定数値設定」なんてのを定義してましたが、これはコンストラクター「作る~」にやらせれば良いんですね…orz

■関数「つぶやき仕分け」

 この関数は、デザインパターンのFactoryパターンでのFactoryクラスっぽい機能をさせようと定義した関数です。あくまで「っぽい」ですが…orz

 引数として渡されたURLに応じて、twitterや、はてなハイク、はてなブックマークの各グループの内から適切なグループを選択し、そのグループを動的に生成。それを戻り値として返します。

 ちなみに、関数内でのクラス生成は動的生成となることを知らず、「【変数】とは【グループ】」と記述してしまい、しばらくの間「命令の未定義、プラグイン不足の可能性もあります」みたいな原因不明のエラーに苦しめられました…orz

 もし、関数内で動的に生成したい場合などは、『作成』命令を使います。そして、動的に生成したメンバにアクセスするには、『(変数名)→(メンバ名)』あるいは『(変数名)@「(メンバ名)」』のように、変数にメンバが属することを明示する必要があります。

●グループ分け(オブジェクト指向ライク)|日本語プログラミング言語なでしこ

http://nadesi.com/doc/syntax/1-5-group.htm


【関連記事】


【不具合あり】twitter引用HTMLを生成する、なでしこスクリプト

| 【不具合あり】twitter引用HTMLを生成する、なでしこスクリプト - そっとなでしこ を含むブックマーク はてなブックマーク - 【不具合あり】twitter引用HTMLを生成する、なでしこスクリプト - そっとなでしこ

 twitterの任意のツイートを引用するHTMLを生成する、サンプル的なでしこスクリプトを書きました。

 例えば、

http://twitter.com/mametanuki/status/16532462281

というツイートへの固定リンクURLを指定すると、


mametanuki

加えてtwitterAPIと、はてなハイクAPIに対応させれば個人的に重宝しそうな予感→ はてブのコメント引用HTMLを生成する、なでしこスクリプト - そっと×× http://htn.to/ffybMC
(2010/06/19 17:33:07)

link

のように表示できるHTMLが出力されます。

【追記】

以下のスクリプトには、協定世界時を日本標準時に変換する処理に不具合がありました…orz

【追記の追記】

 不具合が修正されたスクリプトを書きました。

■スクリプトのソースコード

テンプレートは「<table border="1" bgcolor="#FFFFFF"><tr>
<td width="32" height="32">
★ファビコン★<img src="★ユーザーアイコン★" width="32" height="32">
</td>
<td><a href="★サービスURL★★id★">★id★</a></td>
<td>
★コメント★
</td>
<td><a href="★つぶやきURL★">link</a></td>
</tr></table>」

■ツイッター
    ・{非公開}FURL
    ・サービス名
    ・サービスURL
    ・ファビコン
    ・ユーザーID
    ・ユーザーアイコン
    ・ステータスID
    ・データ文字列
    ・タグ
    ・コメント
    ・タイムスタンプ

    ・URL取得~それはFURL
    ・URL設定(V)~FURL=V。初期設定。
    ・{非公開}初期設定~
        定数値設定。
        ステータスID設定。
        データ文字列設定。
        ユーザーID設定。
        ユーザーアイコン設定。
        コメント設定。
        タイムスタンプ設定。
    ・{非公開}復号処理~システム:HTMLエンティティ復号
    ・{非公開}ステータスID設定~
        URLからURLファイル名抽出して、ステータスIDに代入。
    ・{非公開}定数値設定~
        ファビコン=「http://a1.twimg.com/a/1276896641/images/favicon.ico」。
        サービス名=「twitter」。
        サービスURL=「http://twitter.com/」。
    ・{非公開}ユーザーID設定~
        データ文字列から「user/screen_name」を階層タグ切り出してタグ削除。
        それをユーザーIDに代入。
    ・{非公開}ユーザーアイコン設定~
        データ文字列から「user/profile_image_url」を階層タグ切り出してタグ削除。
        それをユーザーアイコンに代入。
    ・{非公開}データ文字列設定~
        問合せURL=「http://twitter.com/statuses/show/{ステータスID}.xml」
        問合せURLからHTTPデータ取得して復号処理。
        それをデータ文字列に代入。
    ・{非公開}コメント設定~
        データ文字列から「status/text」を階層タグ切り出してタグ削除。
        それの「@([a-zA-Z0-9_-]+)」を「<a href="{サービスURL}$1">@$1</a>」へ正規表現置換。
        #IDコール抑止
        それの「id:([a-zA-Z][a-zA-Z0-9_-]{波カッコ}1,30{波カッコ閉じ}[a-zA-Z0-9])」を「<a href="http://b.hatena.ne.jp/$1">id:$1</a>」へ正規表現置換。
        それをコメントに代入。
    ・{非公開}タイムスタンプ設定~
        英語月@「Jan」=「01」
        英語月@「Feb」=「02」
        英語月@「Mar」=「03」
        英語月@「Apr」=「04」
        英語月@「May」=「05」
        英語月@「Jun」=「06」
        英語月@「Jul」=「07」
        英語月@「Aug」=「08」
        英語月@「Sep」=「09」
        英語月@「Oct」=「10」
        英語月@「Nov」=「11」
        英語月@「Dec」=「12」
        データ文字列から「status/created_at」を階層タグ切り出してタグ削除。
        取得日時はそれ[0]を「 」で区切る。
        英語月@「{取得日時[1]}」を取得月に代入する。
        取得日時[3]に「+09:00:00」を時間加算して取得時間に代入する。
        「{取得日時[5]}/{取得月}/{取得日時[2]} {取得時間}」をタイムスタンプに代入。

    ・URL    ←URL設定    →URL取得    デフォルト


#ここから、メイン処理
「URLは?」と尋ねて、入力URLに代入。
もし、入力URLが「」でないならば
    つぶやきとはツイッター。
    つぶやき=入力URL。
    ファビコンリンク=「<a href="http://{つぶやきのサービスURL}/">
<img src="{つぶやきのファビコン}">
</a><br>」。
    ファビコンリンクは、ファビコンリンクの「{改行}」を「」に置換。
    出力メモは、テンプレートの「★id★」を「{つぶやきのユーザーID}」に置換。
    出力メモは、出力メモの「★ファビコン★」をファビコンリンクに置換。
    出力メモは、出力メモの「★ユーザーアイコン★」を「{つぶやきのユーザーアイコン}」に置換。
    コメント=「{つぶやきのコメント}<br>({つぶやきのタイムスタンプ})」。
    出力メモは、出力メモの「★コメント★」をコメントに置換。
    出力メモは、出力メモの「★つぶやきURL★」を「{つぶやきのURL}」に置換。
    出力メモは、出力メモの「★サービスURL★」を「{つぶやきのサービスURL}」に置換。
    出力メモのメモ記入
ここまで。

母艦を閉じる。

■解説

■twitterAPI

 指定した任意のツイートを取得するために、twitterAPIの「statuses/show」を利用。このコマンドは、認証不要なのがありがたいです。xAuth認証とか、まだ手が出せないし。

■なでしこの「階層タグ切り出し」命令について

 自分の予想とは違った動きをしたのが「階層タグ切り出し」。

例えば、下のような場合、

ツイート=「
<status>
  <created_at>【タイムスタンプ1】</created_at>
  <user>
    <created_at>【タイムスタンプ2】</created_at>
  </user>
</status>」

ツイートから「status/created_at」を階層タグ切り出してタグ削除
それを表示

とした場合、予想した動きは

【タイムスタンプ1】

と表示されることだったのだけれど、実際は

【タイムスタンプ1】

【タイムスタンプ2】

と表示されてビックリ。

で、応急措置として

それ[0]を表示

という、なんだか格好悪い対応をしてます。他に「status/created_at」は取得しても「status/user/created_at」は取得しない方法が思いつかなかったので…orz

■タイムスタンプの文字列整形

 ここもなんだか格好悪い処理になってます。

 twitterのタイムスタンプは、

Sat Jun 19 01:40:08 +0000 2010

のような形式で、月は英語表記です。この月の英語表記を数字表記に変更する命令がレファレンスからは見つからなかったので、月の英語表記と数字表記の対照表をハッシュで書いておくというチカラ技で解決してます。もっとスマートなやり方がありそうな気も…orz


【参考記事】