Hatena::Groupnadesiko

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


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


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


2010-06-30

Operaの右クリックメニューを編集(2)

| Operaの右クリックメニューを編集(2) - そっとなでしこ を含むブックマーク はてなブックマーク - Operaの右クリックメニューを編集(2) - そっとなでしこ

 前回の記事では、右クリックメニューの設定INIファイルを編集するスクリプトを書いてみました。

 しかし、Operaを新規インストールした直後の状態では、この右クリックメニューの設定INIファイル(通称"menu.ini")は存在していません。このINIファイルは、[設定]メニュー>[詳細設定]>[ツールバー]>[メニュー]からメニューの編集・複製を行った時に自動生成されます。

 そこでさらに、この右クリックメニューの設定INIファイルの作成と、作成されたINIファイルをOperaが起動時に読み込むように設定することもスクリプト化してみたいと思います。

■自動化する処理内容の整理

■右クリックメニューの設定INIファイルの作成

 右クリックメニューの設定INIファイルは、次の場所に格納された初期設定のINIファイルをコピーして自動生成されているようです。

C:\Program Files\【インストールフォルダ】\ui\standard_menu.ini

 この初期設定のINIファイルが以下の場所にコピーされるわけです(windows2000での例)。

C:\Documents and Settings\【ユーザー名】\Application Data\Opera\【インストールフォルダ】\menu\standard_menu (1).ini
■Operaが起動時に読み込むINIファイルの指定

 Operaが起動時に読み込む右クリックメニューの設定INIファイルの指定は「operaprefs.ini」で行っています。

 このファイルは以下の場所にあります(windows2000での例)。

C:\Documents and Settings\【ユーザー名】\Application Data\Opera\【インストールフォルダ】\operaprefs.ini

INIファイル「operaprefs.ini」の「User Prefs」セクションにあるキー「Menu Configuration」の値を「{SmallPreferences}menu\standard_menu (1).ini」と指定することで、上記のコピーされた右クリックメニューの設定INIファイルをOperaが起動時に読み込んでくれるようです。

■ソースコード

 上記の処理を自動化しようとすると、こんな感じ。

#-----------------------------------------------------------------------
# 定数の定義
#-----------------------------------------------------------------------
!インストールフォルダは「Opera_1060_3444」。
!Menuパスは「{アプリ設定フォルダ}Opera\{インストールフォルダ}\menu\」。
!Menuファイル名は「standard_menu (1).ini」。
#-----------------------------------------------------------------------
# メイン処理
#-----------------------------------------------------------------------
Menuパスにフォルダ作成。
「{PROGRAMFILESパス}{インストールフォルダ}\ui\standard_menu.ini」から「{Menuパス}{Menuファイル名}」へファイルコピー。

ハンドルは「{アプリ設定フォルダ}Opera\{インストールフォルダ}\operaprefs.ini」のINI開く。
ハンドルで「User Prefs」の「Menu Configuration」に「{波カッコ}SmallPreferences{波カッコ閉じ}menu\standard_menu (1).ini」をINI書く。
ハンドルのINI閉じる。

「完了しました」と言う。
母艦を閉じる。


【参考リンク】

■更に楽ちんなOperaバージョンアップ作業を求めて

 さて、次は更に、Operaを上書きせずクリーンインストールする際に毎回設定ダイアログから手動設定している以下の作業を自動化してみたい。

 「operaprefs.ini」を編集するだけなので、今回のスクリプトと同じことをすれば良い。ただ、今度はINIファイルに設定する値をスクリプト内で固定的に記述するのではなく、外部ファイルに記述し、それをスクリプトが読み込むようにし、スクリプトの汎用性を高めてみたい。

Operaの右クリックメニューを編集

| Operaの右クリックメニューを編集 - そっとなでしこ を含むブックマーク はてなブックマーク - Operaの右クリックメニューを編集 - そっとなでしこ

 Operaの右クリックメニューに項目を追加するカスタマイズを施す場合は、iniファイルを手動で編集します。この編集作業をスクリプト化し、少しでも楽をしたいと思います。

■Operaのmenu.iniに書き込む

 右クリックメニューの設定INIファイルについては、次のリンク先記事にまとめられている通り。

 例えば、Operaのインストール先が

C:\Program Files\【インストールフォルダ】\

の場合、[設定]メニュー>[詳細設定]>[ツールバー]>[メニュー]から編集・複製して右クリックメニューの設定INIファイルが自動設定されるのは、以下の場所です(windows2000の例)。

C:\Documents and Settings\【ユーザー名】\Application Data\Opera\【インストールフォルダ】\menu\standard_menu (1).ini

 このINIファイルの「Document Popup Menu」セクションに、次のような3項目を追加する作業を、スクリプト化してみようと思います。

[Document Popup Menu]
Item, "Sleipnirで開く" = Execute program, "C:\tools\Sleipnir\bin\Sleipnir.exe","%u"
Item, "Firefoxで開く" = Execute program, "C:\Program Files\Mozilla Firefox\firefox.exe","%u"
Item, "Chromeで開く" = Execute program, "C:\tools\ChromePlus1.3.2.0\chrome.exe","%u"

そこで、以下のようなスクリプトを書いてみました。

インストールフォルダ=「Opera_1060_3444」。
ハンドルは「{アプリ設定フォルダ}Opera\{インストールフォルダ}\menu\standard_menu (1).ini」のINI開く。
ハンドルで「Document Popup Menu」の「Item, "Sleipnirで開く"」に「Execute program, "C:\tools\Sleipnir\bin\Sleipnir.exe","%u"」をINI書く
ハンドルで「Document Popup Menu」の「Item, "Firefoxで開く"」に「Execute program, "C:\Program Files\Mozilla Firefox\firefox.exe","%u"」をINI書く
ハンドルで「Document Popup Menu」の「Item, "Chromeで開く"」に「Execute program, "C:\tools\ChromePlus1.3.2.0\chrome.exe","%u"」をINI書く
ハンドルのINI閉じる
「編集終了」と言う。
母艦を閉じる。

■右クリックメニューを表示してみると文字化けが!

 上記のソースコードで確かにINIファイルに3項目が追加されました。

 ところが、Operaを起動して右クリックメニューを表示してみると、追加した項目の「~で開く」というマルチバイトな日本語の部分が文字化けしてしまいました…orz

 どうやら、Operaの設定ファイルの文字コードはUTF8と決められていたようなのです。ということで、追加する項目をUTF8に文字コード変換してから、INIファイルを書き込むように、次のようなソースコードに変更しました。また、編集した右クリックメニューの設定INIファイルが見分けがつくように、設定名称を「俺メニュー」にするINI書き込み処理も追加しました。

インストールフォルダは「Opera_1060_3444」。
Menuファイル名は「standard_menu (1).ini」
ハンドルは「{アプリ設定フォルダ}Opera\{インストールフォルダ}\menu\{Menuファイル名}」のINI開く
「Item, "Sleipnirで開く"」をUTF8変換
ハンドルで「Document Popup Menu」の「{それ}」に「Execute program, "C:\tools\Sleipnir\bin\Sleipnir.exe","%u"」をINI書く
「Item, "Firefoxで開く"」をUTF8変換
ハンドルで「Document Popup Menu」の「{それ}」に「Execute program, "C:\Program Files\Mozilla Firefox\firefox.exe","%u"」をINI書く
「Item, "Chromeで開く"」をUTF8変換
ハンドルで「Document Popup Menu」の「{それ}」に「Execute program, "C:\tools\ChromePlus1.3.2.0\chrome.exe","%u"」をINI書く
「俺メニュー」をUTF8変換。
ハンドルで「Info」の「NAME」に「{それ}」をINI書く。
ハンドルのINI閉じる。
「編集終了」と言う。
母艦を閉じる。

当然のことながら、このスクリプトは、対象となるOperaを終了してから実行します。


【参考記事】

2010-06-29

今後の学習予定

| 今後の学習予定 - そっとなでしこ を含むブックマーク はてなブックマーク - 今後の学習予定 - そっとなでしこ

■「はてなブックマークユーザーが注目するYYYY年xx期アニメ」記事用、自動集計スクリプト

 これは前回の学習予定でも書いた通り。そろそろ2010年の夏アニメが始まるし、集計しないと。

 各アニメ公式サイトの「被ブックマーク合計数」の取得は、今回もまた、はてなのAPIを利用。

「公式サイトURL、アニメタイトル、被ブックマーク合計数」のような二次元配列でデータを保持し、「表数値ソート」。

 配列使用版の他に、データベース使用版も作ってみたい気も

■はてなAPIの呼び出しサンプル

 せっかく はてなAPIに手を出したので、この際一通り はてなAPIを動かして遊んでみたい。

■はてなダイアリーのエクスポートデータから画像をバックアップ

 はてなダイアリーというサービスが未来永劫続くとは限らない。はてなダイアリーから他のブログサービスへお引越しする日が自分にも訪れるかもしれない。

 文字データは簡単にエクスポートが可能。

 問題は画像データ。はてなフォトライフに投稿した画像データを、ブログのエクスポートデータとの関連付けを保持しつつ、他の写真共有サービスへ移行するには、どうすれば楽ちんなのか。

 想定しているのは、次のような作業を自動化してくれるツール

  • はてなダイアリーのバックアップデータから、画像リンクを抽出
  • 抽出した画像リンク先から画像データをダウンロード
  • ダウンロードした画像データを移行先の写真共有サービスへ投稿
  • 投稿した画像データへのリンクを、バックアップデータに反映

 例えば、画像投稿&投稿画像へのリンク取得が出来るAPIを持つ写真共有サイト「フォト蔵」を移行先とすれば、上記のスクリプトは書けそう。

■2ちゃんねるスレまとめツール

 2ちゃんねるのスレを、はてなダイアリーや@wikiで引用する文字列を生成するツール。たぶん、なでしこ学習で、初めてGUIに挑戦することになりそう。

 想定しているのは、次のような機能を持つツール

  • ツール起動時に、変換形式を、はてな記法と@wiki記法から選択できる
  • 選択した文字列をデコレーション(太文字、文字サイズ、文字色)できる
  • 変換形式先の記法で誤動作する文字列(はてな記法のid記法とか、@wiki記法の引用記法とか)のエスケープ

 変換元の文字列データは、愛用している2ちゃんねる専用ブラウザのJaneからのコピペ。

 もちろん、2ちゃんねる形式のログファイルは読み易い。

  • 「<>」区切り
name<>mail<>date<>msg<>subject
  • メッセージ内の改行は「<br>」
  • Janeから取得した場合、改行コードはLF
  • 文字コードはSJIS

 問題なのは、スレッドログよりインポートした1000件のレスデータを一覧し、引用したいレスを抽出するGUIを実装すること。実用的なGUIを作れる自信が無い。それなら当面は、レスの抽出作業は、専ブラ&テキストエディタ上でやった方が効率が良さそう。

 ↓こんなGUIが自分で作れれば話は別だけど

■Operaバージョンアップ用ツール

 Operaのバージョンアップでは、旧バージョンに上書きではなく、別フォルダにクリーンインストールすることが多い。

 その時、前バージョンの設定を、設定ファイルを上書きコピーするのではなく、新バージョンの設定ファイルを編集する形で設定を引き継ぎたい。これは、新旧で設定ファイルの内容が異なっている可能性があり、単純に旧設定ファイルを新設定ファイルに上書きコピーできないため。

 この面倒臭い手作業を自動化したいw

■なでしこから別のスクリプト言語を呼び出す

 なでしこよりもJavaScriptが使いたい場面があるかどうかは分からないけれど。

 高速スクリプト言語「Lua」。全く触れたことが無い言語だけれど、Luaを経由してなでしこからWindowsAPIを呼ぶとか面白そう。

2010-06-27

twitter&はてなハイク/ブックマーク引用HTMLを生成する、なでしこスクリプト

| twitter&はてなハイク/ブックマーク引用HTMLを生成する、なでしこスクリプト - そっとなでしこ を含むブックマーク はてなブックマーク - twitter&はてなハイク/ブックマーク引用HTMLを生成する、なでしこスクリプト - そっとなでしこ

 とりあえず、当初の目標であるtwitter、はてなハイク、はてなブックマークという3つのつぶやきサービスからつぶやきを引用するHTMLを生成するスクリプトが形になりました(やっぱり色々不具合が残っている悪寒がしますが…)。

■使い方

 スクリプトを起動すると表示されるメモ欄に、引用したいtwitterや、はてなハイクのステータスURLを改行区切りで入力して「決定」ボタンを押します。

 例えば、以下のURLを入力すると、

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

http://h.hatena.ne.jp/mame-tanuki/9236538674340364601

http://b.hatena.ne.jp/mame-tanuki/20100529#bookmark-21909447

下のような表示をするHTML文が出力されます。

  


mametanuki

はてなのサービスが盛大に落ちまくってる。メンテナンスの犬画面すら出ず、「Internal Server Error」になるのは久々に見た http://i.hatena.ne.jp/idea/27496
(2010/06/17 07:41:35)

link


mame-tanuki

三文字

(2007/12/21 21:29:44)

link


mame-tanuki

/
サンプル→b:id:entry:21909451
(2010/05/29 )

link

■ソースコード

#-----------------------------------------------------------------------
# 出力HTMLテンプレート
#-----------------------------------------------------------------------
テンプレートヘッダーは「<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>」。
#-----------------------------------------------------------------------
# メイン処理
#-----------------------------------------------------------------------

「」をメモ記入して、取得URLSに代入。

もし取得URLSが「」でないならば
  出力HTMLは「」。
  取得URLSを反復
    取得URLはそれ。
    取得URLをつぶやき仕分けして、つぶやきに代入。
    もし、つぶやき→サービス名が「対象外サービス」でないならば
      つぶやきをつぶやき整形出力。
      出力HTMLは、「{出力HTML}{それ}{改行}」。
    ここまで。
  ここまで
  出力HTMLは、「{テンプレートヘッダー}
  {出力HTML}</table>」
  出力HTMLをメモ記入。
ここまで
母艦を閉じる。

出力TXTをメモ記入。
#-----------------------------------------------------------------------
# グループ定義
#-----------------------------------------------------------------------
■対象外サービスとは
  ・サービス名
  ・URL
  ・作る~
    サービス名は「対象外サービス」
#-----------------------------------------------------------------------
■ツイッターとは
  ・{非公開}FURL
  ・サービス名
  ・サービスURL
  ・ファビコン
  ・ユーザーID
  ・ユーザーアイコン
  ・ステータスID
  ・データ文字列
  ・リプライ
  ・タグ
  ・コメント
  ・タイムスタンプ

  ・URL取得~それはFURL
  ・URL設定(V)~
    FURL=V。
    自身→初期設定。
  ・初期設定~
    自身→ステータスID設定。
    自身→データ文字列設定。
    自身→ユーザーID設定。
    自身→ユーザーアイコン設定。
    自身→コメント設定。
    自身→タイムスタンプ設定。
  ・ステータスID設定~
    自身→URLからURLファイル名抽出して、自身→ステータスIDに代入。
  ・作る~
    サービス名=「twitter」。
    ファビコン=「http://a1.twimg.com/a/1276896641/images/favicon.ico」。
    サービスURL=「http://twitter.com/」。
    APIURL=「http://twitter.com/statuses/show/」
  ・ユーザーID設定~
    自身→データ文字列から「user/screen_name」を階層タグ切り出してタグ削除。
    それを自身→ユーザーIDに代入。
  ・ユーザーアイコン設定~
    自身→データ文字列から「user/profile_image_url」を階層タグ切り出してタグ削除。
    それ[0]を自身→ユーザーアイコンに代入。
  ・復号処理~システム:HTMLエンティティ復号
  ・リプライ抽出(抽出対象)~
    自身→リプライは、抽出対象から「replies」をタグ切り出し。
    抽出対象の「{自身→リプライ}」を「」に置換。
    それで戻る。
  ・データ文字列設定~
    問合せURL=「{APIURL}{ステータスID}.xml」
    問合せURLからHTTPデータ取得して自身→復号処理。
    リプライ抽出(それ)。
    それを自身→データ文字列に代入。
  ・タグ抽出処理(抽出対象)~
    #ハッシュタグ抽出機能を実装予定
    抽出対象で戻る。
  ・特殊記法置換(置換対象)~
    置換対象の「@([a-zA-Z0-9_-]+)」を「<a href="{サービスURL}$1">@$1</a>」へ正規表現置換。
    それで戻る。
  ・コメント設定~
    自身→データ文字列から「status/text」を階層タグ切り出してタグ削除。
    自身→タグ抽出処理(それ)。
    自身→特殊記法置換(それ)。
    #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>」へ正規表現置換。
    それを自身→コメントに代入。
  ・地域標準時変換(UTC日付、UTC時刻、加減算演算子、加減算時間)~
    加減算日数は0。
    地域標準時刻は、UTC時刻に「{加減算演算子}{加減算時間}」を時間加算。
    UTC時刻を「:」で区切り、UTC時刻配列に代入。
    加減算時間を「:」で区切り、加減算時間配列に代入。
    もし、加減算演算子が「+」ならば
      秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))+
      ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
      もし、秒換算が(24×60×60)以上ならば
        加減算日数は1。
    違えば
      秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))-
      ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
      もし、秒換算が0未満ならば
        加減算日数は1。
    地域標準日時は、UTC日付に「{加減算演算子}0/0/{加減算日数}」を日付加算。
    「{地域標準日時} {地域標準時刻}」で戻る。
  ・タイムスタンプ設定~
    英語月@「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]}」を取得月に代入する。
    取得JST日付は「{取得日時[5]}/{取得月}/{取得日時[2]}」。
    自身→地域標準時変換(取得JST日付、取得日時[3]、「+」、「09:00:00」)。
    それをタイムスタンプに代入。

  ・URL  ←URL設定  →URL取得

#-----------------------------------------------------------------------
■Hatenaハイクとは +ツイッター
  ・作る~
    サービス名は「はてなハイク」
    ファビコン=「http://favicon.hatena.ne.jp/?url=http://h.hatena.ne.jp/」。
    サービスURL=「http://h.hatena.ne.jp/」。
    APIURL=「http://h.hatena.ne.jp/api/statuses/show/」
  ・復号処理~システム:SJIS変換
  ・タグ抽出処理(抽出対象)~
    抽出対象を「^.*=」で正規表現マッチ。
    それの「=」を「」に置換してタグTXTに代入。
    「<a href="http://h.hatena.ne.jp/{タグTXTをURLエンコード}">{タグTXT}</a>」を自身→タグに代入。
    抽出対象の「^.*=」を「」へ正規表現置換。
    それで戻る。
  ・特殊記法置換(置換対象)~ 
    正規表現修飾子バックアップは正規表現修飾子。
    正規表現修飾子は正規表現修飾子&「i」。
    置換対象の「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換。
    正規表現修飾子は正規表現修飾子バックアップ。
    それで戻る。
  ・タイムスタンプ設定~
    自身→データ文字列から「status/created_at」を階層タグ切り出してタグ削除。
    タイムスタンプ配列は、それ[0]を「T」で区切る。
    取得JST日付は、タイムスタンプ配列[0]の「-」を「/」に置換。
    取得JST時刻は、タイムスタンプ配列[1]の「Z」を「」に置換。
    「取得JST日付{取得JST日付}取得JST時刻{取得JST時刻}」を表示。
    自身→地域標準時変換(取得JST日付、取得JST時刻、「+」、「09:00:00」)。
    それをタイムスタンプに代入。

#-----------------------------------------------------------------------
■Hatenaブックマークとは +ツイッター
  ・作る~
    サービス名は「はてなブックマーク」
    ファビコン=「http://favicon.hatena.ne.jp/?url=http://b.hatena.ne.jp/」。
    サービスURL=「http://b.hatena.ne.jp/」。
  ・初期設定~
    自身→ステータスID設定。
    自身→ユーザーID設定。 #はてブ独特
    自身→データ文字列設定。
    自身→ユーザーアイコン設定。
    自身→コメント設定。
    自身→タグ抽出処理。
    自身→タイムスタンプ設定。
  ・ステータスID設定~
    自身→URLを「#bookmark-(\d+)」で正規表現マッチ。
    自身→ステータスIDは抽出文字列[0]。
  ・ユーザーID設定~
    自身→URLからURL基本パス抽出。
    それの「{自身→URLからURLドメイン名抽出}」を「」に置換。
    それの「/」を「」に置換。
    それの「http:」を「」に置換。
    自身→ユーザーIDは、それ。
  ・ユーザーアイコン設定~
    id頭2桁は、自身→ユーザーIDから2文字左部分。
    自身→ユーザーアイコンは、「http://www.st-hatena.com/users/{id頭2桁}/{自身→ユーザーID}/profile.gif」
  ・復号処理~システム:SJIS変換
  ・データ文字列設定~
    検索文字列は、自身→URLからHTTPデータ取得して自身→復号処理。
    正規表現命令文は「<a class="username" href="/{自身→ユーザーID}/{自身→URLからURLファイル名抽出}">.*[\r\n]+(.*[\r\n]+){波カッコ}1,4{波カッコ閉じ}」。
    検索文字列を正規表現命令文で正規表現マッチ。
    自身→データ文字列は、それ。
  ・タグ抽出処理~
    自身→データ文字列を「<span class="tags">.*」で正規表現マッチ。
    それから「span/a」の階層タグ切り出す。
    それの「href="」を「href="http://b.hatena.ne.jp」に置換。
    それの「{改行}」を「/」に置換。
    自身→タグは、それ。
  ・特殊記法置換(置換対象)~
    それの「((b:)*?)id:entry:([0-9]+)」を「<a href="http://b.hatena.ne.jp/entry/$3">$2id:entry:$3</a>」へ正規表現置換。
    それで戻る。
  ・コメント設定~
    自身→データ文字列を「<span class="comment">.*」で正規表現マッチしてタグ削除。
    自身→特殊記法置換(それ)。
    #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>」へ正規表現置換。
    自身→コメントは、それ。
  ・タイムスタンプ設定~
    自身→データ文字列を「<span class="timestamp">.*」で正規表現マッチしてタグ削除。
    自身→タイムスタンプは、それ。

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

●つぶやき整形出力({グループ}対象グループを)
  ファビコンリンク=「<a href="{対象グループ→サービスURL}">
<img src="{対象グループ→ファビコン}">
</a><br>」。
  ファビコンリンクは、ファビコンリンクの「{改行}」を「」に置換。
  
  タグリンク=「」。
  もし対象グループ→タグが「」でないならば
    タグリンク=「<span style="font-style:italic;">{対象グループ→タグ}</span><br>」。
  出力TXTは、テンプレートの「★id★」を「{対象グループ→ユーザーID}」に置換。
  出力TXTは、出力TXTの「★ファビコン★」をファビコンリンクに置換。

  出力TXTは、出力TXTの「★ユーザーアイコン★」を「{対象グループ→ユーザーアイコン}」に置換。
  コメント=「{タグリンク}{対象グループ→コメント}<br>({対象グループ→タイムスタンプ})」。
  出力TXTは、出力TXTの「★コメント★」をコメントに置換。
  出力TXTは、出力TXTの「★つぶやきURL★」を「{対象グループ→URL}」に置換。
  出力TXTは、出力TXTの「★サービスURL★」を「{対象グループ→サービスURL}」に置換。
  出力TXTで戻る。

■ちょっとコメント

 ツールを書いてみて実感したけれど、twitterAPI互換な はてなハイクAPIは、もっと評価されても良い気がする。

 と言うか、いっそのこと、はてなブックマークAPIも、twitterAPI互換なヤツを作っちゃいなよ、長いものには巻かれちまえよ、はてな!とか思ったりw

 …ということで、上記ソースで「Hatenaブックマーク」グループの定義でやや強引に「twitter」グループをミックスしているのは、まぁ、そういう願いを込めてです。

■現在分かっている問題点

 基本的に自分が使う個人ツールとして書いたので、自分が使わない機能や許容できる問題点については投げっぱなし感が…

  • エラー処理系
    • 入力されたステータスURLのチェック
    • twitterのサービスが過負荷で、クジラの絵の「Over capacity」画面が表示された場合に、なでしこの実行エラーに
      • たぶん、はてなハイク/ブックマークが犬絵の「メンテナンス中」画面が表示された場合も、恐らく実行エラーに
  • 一部はてな記法がHTML化できていない
    • URL(http:~)のリンク化(←自分が、はてなダイアリーに貼り付ける使い方なので必要性を感じなかった)
    • 商品(asin:~)のリンク化(←同上)
    • YouTube/ニコニコ動画のプレイヤー表示
  • 一部twitter記法がHTML化できていない
    • ハッシュタグのリンク化


【関連記事】これまでの道のり

2010-06-25

カレンダーGUI部品の月変更ボタンで「クリックした時」イベントが発生する件

| カレンダーGUI部品の月変更ボタンで「クリックした時」イベントが発生する件 - そっとなでしこ を含むブックマーク はてなブックマーク - カレンダーGUI部品の月変更ボタンで「クリックした時」イベントが発生する件 - そっとなでしこ

 なでしこのGUI部品、カレンダーは手軽に使えて重宝しています。

 自分は、自宅でパソコン作業をしている時は常にテキストファイルを開き、都度の作業をメモしています。調べ物の内容だったり、投稿するブログ記事だったり(もちろん、この記事もそのテキストファイル上で書いています)をメモしています。そしてそのメモは、その日の日付をファイル名として保存します。この日次メモは、短期的には作業中のバッファであり、長期的には日次単位の作業ログとなります。

 そういう日次メモを新規作成したり、過去に作成した日次メモを開くツールに、カレンダーGUI部品は役に立ちました。

■予期せぬ動作~月を移動するだけでメモが起動or作成されてしまう~

 ところがこのカレンダーGUI部品は、自分にとっては予期していなかった&望まない動作をしてしまうのです。それは、前の月/次の月に移動するために、GUI部品の上部左右についた矢印ボタンを押下しただけで、メモが起動or作成されてしまうのです。

 例えば、次のようなサンプルソースの場合、

Myカレとはカレンダー。
そのクリックした時は~
 MyデートはMyカレのテキスト。
 Myデートを言う。

日付をクリックした時だけでなく、GUI部品の上部左右についた矢印ボタンを押下した時も、ダイアログがポップアップしてしまうのです。

月変更ボタンでクリックするとイベントが発生するのは

あのボタンを押すと、日付が1ヶ月動いてしまうからです。

発想を転換して、決定ボタンを表示するようにしてみてはどうでしょう。

●日本語プログラミング言語なでしこ プログラム掲示板 [One Message View / 月変更ボタンでクリックした時が発生する訳]

http://www.himanavi.net/cgi/nade-bbs/cbbs.cgi?mode=one&number=1477&type=1469&space=15&no=0&KLOG=1

■「月移動」矢印ボタンを押下した時と、日付をクリックした時とで動作を変えるには

 これに関しては、この質問掲示板のhy-hiro さんの返答に共感を覚えました。

決定ボタンの件は、私も考えたのですが操作が1つ増えてしまうので質問させてもらいました。

結果的には、クリックとダブルクリックを切り分けて使うことにしました。

●日本語プログラミング言語なでしこ プログラム掲示板 [One Message View / Re[3]: ありがとうございます]

http://www.himanavi.net/cgi/nade-bbs/cbbs.cgi?mode=one&number=1482&type=1469&space=30&no=0&KLOG=1

 私も、日付と決定ボタンと、ポインティング操作が2回に増えるのは嫌です*1。日付と決定ボタンとの二箇所をクリックしなければならないぐらいなら、日付選択はダブルクリックで、「月移動」矢印ボタンはクリックで、と使い分ける方を選びます。

 つまり上記のサンプルコードならば、こう変えます。

Myカレとはカレンダー。
そのダブルクリックした時は~
 MyデートはMyカレのテキスト。
 Myデートを言う。

■「日次メモ作成/起動ツール」のソースコード

 ちなみに、現在使っている「日次メモ作成/起動ツール」のソースは、こうです。

テンプレファイルは「D:\data\dailytool\template.txt」。
パスは「D:\data\dailytool\」。

Myカレとはカレンダー。
そのダブルクリックした時は~
 MyデートはMyカレのテキスト。
 ファイル名はMyデートを「yyyymmdd」に日時形式変換&「.txt」。
 日次メモはパス&ファイル名。
 もし、(日次メモの存在=はい)ならば、
  日次メモを起動する。
  母艦を閉じる
 違えば、
  日次メモ新規作成処理。

●日次メモ新規作成処理
 「日次メモファイルはありません。作成しますか?」で二択。
 もしそれがはいならば
  テンプレファイルを開いてテンプレに代入する。
  テンプレを日次メモに保存。
  日次メモを起動する。
  母艦を閉じる


*1:パソコン操作において、ポインティング操作はストレスであり、その回数を極力少なく抑えることが、より快適にパソコン作業を行うコツである、というのが持論です

2010-06-23

協定世界時を日本標準時に変換

| 協定世界時を日本標準時に変換 - そっとなでしこ を含むブックマーク はてなブックマーク - 協定世界時を日本標準時に変換 - そっとなでしこ

 先日書いたスクリプトの「協定世界時(UTC)を日本標準時(JST)に変換」処理に初歩的なミスが…orz

取得日時[3]に「+09:00:00」を時間加算して取得時間に代入する。

●twitter引用HTMLを生成する、なでしこスクリプト - そっとなでしこ - なでしこ学習帳@はてな

http://nadesiko.g.hatena.ne.jp/mame-tanuki/20100620/twitter2html

日付変更が考慮されてませんね、これ…orz

…ということで、協定世界時から地域標準時を取得するサンプルを書きました。

■ソースコード

取得UTC日付は「2010/06/16」。
取得UTC時刻は「22:48:08」。
「UTC:{取得UTC日付} {取得UTC時刻}」を表示。

地域標準時変換(取得UTC日付、取得UTC時刻、「+」、「09:00:00」)
「日本標準時→{それ}」を表示。
地域標準時変換(取得UTC日付、取得UTC時刻、「-」、「10:00:00」)
「ハワイ・アリューシャン標準時→{それ}」を表示。


#-----------------------------------------------------------------------
●地域標準時変換(UTC日付、UTC時刻、加減算演算子、加減算時間)
  加減算日数は0。
  
  地域標準時刻は、UTC時刻に「{加減算演算子}{加減算時間}」を時間加算。
  UTC時刻を「:」で区切り、UTC時刻配列に代入。
  加減算時間を「:」で区切り、加減算時間配列に代入。
  
  もし、加減算演算子が「+」ならば
    秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))+
    ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
    もし、秒換算が(24×60×60)以上ならば
      加減算日数は1。
    ここまで。
  違えば
    秒換算は((UTC時刻配列[0]×60×60)+(UTC時刻配列[1]×60)+(UTC時刻配列[2]))-
    ((加減算時間配列[0]×60×60)+(加減算時間配列[1]×60)+(加減算時間配列[2]))
    もし、秒換算が0未満ならば
      加減算日数は1。
    ここまで。
  ここまで
  地域標準日時は、UTC日付に「{加減算演算子}0/0/{加減算日数}」を日付加算。
  「{地域標準日時} {地域標準時刻}」で戻る。

 ちなみに、はてなハイクもAPIで取得できる投稿日付も協定世界時。ただ、日付フォーマットが「ISO 8601形式」でtwitterとは違います。

 とは言え、協定世界時を日本標準時に変換する処理は共通化できそう。つまり、この処理を「ツイッター」グループで内部関数として定義し、「ツイッター」グループをミックスした「Hatenaハイク」グループではこれを呼び出して使うわけです。


■関連リンク

2010-06-22

大文字小文字を無視して正規表現サンプル

| 大文字小文字を無視して正規表現サンプル - そっとなでしこ を含むブックマーク はてなブックマーク - 大文字小文字を無視して正規表現サンプル - そっとなでしこ

 文字列の中に画像ファイルへリンクするURLがあった場合、HTMLのIMGタグに変換したいと考えました。正規表現で。

画像を貼り付けるには、URLの最後が「.gif, .jpg, .jpeg, .png, .bmp」のいずれかで終わるURLを本文欄に記入してください。自動的にその画像が展開されて表示されます。

●はてなハイク - Help

http://h.hatena.ne.jp/help

 そのURLが画像ファイルへのリンクか否かは、拡張子で見分けます。ただ、拡張子は小文字の場合もあれば大文字の場合もあります。たとえば拡張子「jpg」の場合、

\.[jJ][pP][gG]

のような書き方をして、大文字小文字のどちらでもヒットするようにすることになります。これは面倒臭いw

■正規表現修飾子で大文字小文字の違いを無視

 ということで、大文字小文字の違いを無視する正規表現修飾子を設定してみようと思います。

i 大小文字の違いを無視する

●正規表現メモ

http://www.kt.rim.or.jp/~kbk/regex/regex.html

■サンプルコード

つぶやき=「三文字
小文字拡張子→http://f.hatena.ne.jp/images/fotolife/m/mame-tanuki/20071221/20071221212939.png
大文字拡張子→http://f.hatena.ne.jp/images/fotolife/m/mame-tanuki/20071221/20071221212939.PNG
http://h.hatena.ne.jp/mame-tanuki/
」。

正規表現修飾子を表示。
つぶやきの「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換
それを表示

正規表現修飾子バックアップは正規表現修飾子。
正規表現修飾子は正規表現修飾子&「i」。
正規表現修飾子を表示。

つぶやきの「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換
それを表示

正規表現修飾子は正規表現修飾子バックアップ。
正規表現修飾子を表示。

つぶやきの「(https?://[-_.!~*'()a-z0-9;/?:@&=+$,%#]+\.(jpg|jpeg|png|gif|bmp))」を「<img src="$1">」へ正規表現置換
それを表示

■これをツールに実装すると…

 ということで、上記の置換処理を「つぶやき引用ツール」に組み込めば、例えば、

http://h.hatena.ne.jp/Siesta/9259270396070822636

とURLを指定すると、次のように表示されるHTMLが出力される…ようになるはずw

  


Siesta

大嫌いな人が家に来た時の対応を考える

(2010/06/22 05:15:27)

link

2010-06-21

グループのミックスで、予想外の動作が

| グループのミックスで、予想外の動作が - そっとなでしこ を含むブックマーク はてなブックマーク - グループのミックスで、予想外の動作が - そっとなでしこ

グループを宣言するとき、他のグループをミックスすることができます。オブジェクト指向で言えば継承に当たりますが、それほど高度な機能ではなく、ただ単に、グループ内の項目をコピーしているだけです。グループ内に変数名の衝突があれば上書きしてしまいます。

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

で、次のようなサンプルコードを書いてみた所、自分の予想とは違った動きが。

■ソースコード

つぶやきとはHatenaハイク。
「{つぶやき→サービス名}」を言う。   #予想通り「はてなハイク」と言う
つぶやき→サービス名表示。        #予想通り「はてなハイク」と言う
つぶやき→概要表示。           #予想外に「ツイッター」と言う

#-----------------------------------------------------------------------
# グループ定義
#-----------------------------------------------------------------------
■ツイッターとは
  ・サービス名
  ・作る~
    サービス名は「ツイッター」
  ・サービス名表示~
    「ツイッター」と言う。
  ・概要表示~
    サービス名表示。
#-----------------------------------------------------------------------
■Hatenaハイクとは +ツイッター
  ・作る~
    サービス名は「はてなハイク」
  ・サービス名表示~
    「はてなハイク」と言う。

■「つぶやき→概要表示」が予想外の動きを

 上のサンプルでは、「ツイッター」グループをミックスする形で「Hatenaハイク」グループを定義しています。そうすることで、2つのグループで共通する部分は、「Hatenaハイク」グループでは省略しようという魂胆です。

 で、「Hatenaハイク」グループでは、「概要表示」というグループ内関数を省略しています。ですから、「Hatenaハイク」グループの「概要表示」を呼ぶと、ミックスした「ツイッター」グループの「概要表示」が呼ばれます。

 それは意図通りなのですが、この時、「概要表示」から呼ばれるグループ内関数「サービス名表示」は、「Hatenaハイク」グループで定義された「サービス名表示」が呼ばれるものと思っていました。ところが動かしてみると、予想に反して「ツイッター」グループの「サービス名表示」が呼ばれました。

■グループ内で自分自身を表す「自身」変数を使え

 どうも調べてみると、自分が意図したような動きをさせるためには、「ツイッター」グループの「概要表示」の定義を次のように記述しなければならないようです。

  ・概要表示~
    自身→サービス名表示。

 このようにして、生成されたインスタンスそれ自身の「サービス名表示」を呼び出すのだと明示することで、「Hatenaハイク」グループで呼ばれた「概要表示」は、「Hatenaハイク」グループの「サービス名表示」を呼び出すようになりました。

グループ内で自分自身を指定したい場合があります。そのときは、『自身』変数を使います。『自身』は常にグループ内で自分自身のインスタンスへのエイリアス変数です。『自身』は動的に設定されていますので、自身のメンバへアクセスするときは、『自身→メンバ名』または『自身@「メンバ名」』の形式で指定します。

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

 なるほど~

2010-06-20

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

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

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

続きを読む

【不具合あり】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

【追記の追記】

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

続きを読む

2010-06-19

「なでしこ学習帳」グループに日記作成

| 「なでしこ学習帳」グループに日記作成 - そっとなでしこ を含むブックマーク はてなブックマーク - 「なでしこ学習帳」グループに日記作成 - そっとなでしこ

 これ↓を書いて以降、なでしこにハマり始めた。

 ので、なでしこ関連の記事は、今後、この日記に集約しようと思う。

 細々としたメモは、引き続き「チラシの裏」に。

■当面の学習目標

 とりあえず、今自分が欲しいスクリプトは2つ。

出力イメージは、こんな感じで。


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

(2010/06/19 17:33:07)

link


mame-tanuki

//

続きは、こちらで書く予定→ http://nadesiko.g.hatena.ne.jp/mame-tanuki/

(2010/06/19 )

link


mame-tanuki

はてなハイクを、はてなダイアリー等で引用しやすくHTML出力するツールが欲しいとふと思った今日この頃

http://nadesiko.g.hatena.ne.jp/mame-tanuki/20100619/hellow_world

(2010/06/19 17:21:15)

link

【追記】


mr-80bmr-80b2010/06/19 22:37なでしこ学習帳@はてなへようこそいらっしゃいませ。
なでしこはゆるくちまちま遊ぶのに手頃で遊びやすい道具だと思うので、そうぞよろしくお願いします。

mame-tanukimame-tanuki2010/06/20 00:36こちらこそ、よろしくお願いします。
標準装備の開発環境である「なでしこエディタ」が非常に使いやすいので、確かに、手ごろに遊べますね。