ゆるめ

ゆるめなのは公開範囲です。

近況

最近久しぶりに Hatena::Let に行ってちょこちょこ書きました。

発言小町で曜日確認するもの

すこし前の人気エントリー経由で発言小町を見たのですが、話者が当然のように曜日で日時を表現しているにもかかわらず日付に曜日が付いてなくて、途方に暮れて書いたものです。

義母と話し合えと言われますが : 家族・友人・人間関係 : 発言小町 : 大手小町 : YOMIURI ONLINE(読売新聞)
こういう感じのページに使うと曜日が出てきて時間感覚がつかみやすくなります。

小町ヘビーユーザの方は多分ツェラーの公式とか脳内でバンバン回して暗算できるので、曜日が付いていないのかなと思いました。

はてな匿名ダイアリーでブックマーク数を確認するもの

トップページとかの記事がずらっと並んでるとこでブックマークがあれば便利なんじゃないかと思いついて書きました。

オートページャのこととか全然考えずに書いたので、そういうの導入してる場合は 50 件毎に切って送らないと API が困っちゃうと思います。

はてなブックマークのコメント一覧ページへの道筋が絶たれてる時のもの

ブックマークレットというかユーザスクリプトとして書いて、ついでにこちらにも書きました。

普段は AndroidFirefox でインタネッティンするのですが、同じタブでブックマークページを読み込むにはコメント一覧ページへのリンクが必要になるんです。

ブックマークがめっちゃ使いづらいのでブックマークレットlocation.href = "http://b.hatena.ne.jp/entry/" + location.href とかするわけにもいかず。

大体自分が見るページにははてなブックマークへのリンクが有るのでそれを有効活用しているのですが、それが時々コメント一覧ページじゃなく追加用ページヘのリンクになってるんですよ。

そんなリンクを開いたら、一抹の寂しさを感じた後に、同じタブで開くのを諦めてはてブコメント表示というアプリでコメントページを呼び出すのですが、これまた時々閲覧してたページが実は Canonical じゃない URL でコメントが閑古鳥だったりして、寂しさに拍車がかかります。

そういう寂しさを事前に回避するために書きました。

はてなブログで datetime を挿入するもの

はてなブログに移行したら ins, del 要素に自動的に datetime がついてくれなくなってて、でも手書きで ISO8601 を間違わずに書ける自信がないので、書きました。

f:id:pacochi:20160526235032p:plain

そもそも移行したのは久々に日記をつけようと思ったからで、どうして思ったかというと Hatena::Let が荒野になっててその悲しみをどこかに書き残そうと思ったからで、書き残そうとしたことによってさらなる悲しみが生まれて、悲しみを和らげるためにまた悲しみの Hatena::Let に書きに行くのが悲しみエコシステムみたいでむしろ面白くなってきました。

はてなブログで q 要素の cite 属性を展開するもの

なんかダイアリーだと展開してくれてたのですが、してくれなくなったので自分でしました。

はてなブログの 設定>詳細設定>head に要素を追加 あたりに下記をコピペするとはてなダイアリーっぽく展開するようになります。

<script type="text/javascript" src="https://cdn.rawgit.com/pacochi/dc32751856514ec4bf40d44e6abf2050/raw/hatenablog_q_cite_expander.js"></script>

はてなブログで MML を鳴らすもの

なんかメロディ記法もなかったことにされてたのでなんとかしてみました。鳴らない環境も多々あると思いますが、多分対応できません。

ダイアリーから移行して鳴らなくなった MML の記事内に下記をコピペするとプレイヤーが復活します。
はてな記法での書き方なので、別の編集方法を採用している場合は別途読み替えてください。)

><script type="text/javascript" src="https://cdn.rawgit.com/pacochi/44442c2279cfb2ae0cff3893a4158f57/raw/hb_mml_player.js"></script><

ここに動作確認用サンプルを書いておきます。元ネタは消えてるみたいですがうまいこと辿って行ったらまだ聞けると思います。

t125;
l8 o5 r1r1ar<c+r>ar<c+r>arb<c+f+ec+>bar<er>arbr<c+4r4>br4.ar<c+r>ar<c+r>arb<c+f+ec+>bar<er>arbra4r2.brbrbr<c+rdrc+r>br<c+rdrdddddf+e4r2.f+rf+rf+rerdrdrdrc+r>ar4.ar<c+re4r2.>aaaaaaab<e4r2.>ar<er>ar<er>ararbr<er>aa<ee>ar<ee>ararb2ar1;
l4 o2 aeaeaeaeaaaaaaaaaaaa<c+c+>bbaaaaaaaaaaaaaaa2bbbb<c+c+c+c+ddddeee2f+f+f+edddc+>aaaa<eee2>a2ab<er>eraaaaaab<e>aaaaaab2aeaea

お題「シンタックス・ハイライト機能で対応してほしい言語」というのをさっき見かけたのですが、個人的には MML がまたプレイヤー付きで復活してくれると嬉しいです。

はてなブログに移りました

はてな事を書くつもりでいたらはてなポイントが数か月前に尽きていたのを思い出して、まあ良い機会だしということではてなブログに移行しました。*1

今までだったらポイントが尽きた頃に人力検索に出稼ぎに行ってたのですが、ポイントシステム自体がもう無くなるらしいので、じゃあもうなすがままなくなるがままでいこうと思いました。人力検索に行かないとなると、質問にトラックバックでアクロバティック回答することもなくなるだろうと思い、心置きなくトラックバックを飛ばせないはてなブログに移行しました。

移行した後で メロディ再生記法非対応だと知ってがっかりしたので、その辺はなんとかしたいと思います。しました。ついでに修正時刻の挿入も半自動にしました。

と書いてるそばから q 要素の cite 属性展開もされなくなってることに気づいたので、それもまたなんとかします。しました。そしたら今度は修正時刻保存機能が機能してなくて、泣く泣く手動で時刻を入れました。

はてな事を主に書きますが、公開範囲が「はてなにログインしてる人」という、自分にしてはかなりゆるめに保たれてる状態を活用して !はてな事を書くかもしれません。書かないかもしれません。

関連記事

*1:移転前のはてなダイアリーはポイントを払わないとブログが書けないシステムでした。

question:1335280813

解けたものの諸事情で忍ばせた回答です。

http://h.hatena.ne.jp/keyword/%E6%A0%97%E3%81%BE%E3%82%93%E3%81%BE%E3%80%80%E5%8F%A3%E3%81%AB%E3%81%97%E3%81%9F%E3%81%BE%E3%81%BE%E3%80%80%E5%8F%A3%E8%AA%AC%E3%81%8F%E3%81%95%E3%81%BE
ひらがなかカタカナか分からなかったので、用心してどっちも取りました。

UNIX time で言うと 1335287046 頃に忍ばせたみたいです。

今年のはてなエイプリルフールは影が薄め

2012年 4月 2日 12:00 時点で question:1333231682 の質問文にあるサイトおよび回答に載っていなかったので、挙げておきます。
B!KUMA フールズ - ネットで話題のウソっぽい記事を素早くチェック!

フォトライフの画像は割と丸見え

question:1332381053 での回答コメントに関する補足です。


補足の前に前置きから。
フォトライフの認証周りはとってもカジュアルなつくりになっているため、公開範囲を狭めに設定したフォトライフ画像でも、画像 URL (http://〜.png など) を直接開けば誰でも閲覧可能な状態になっています。
加えて、画像表示ページ (http://f.hatena.ne.jp/pacochi/20120324195100 など) から画像 URL を推測することも容易に可能です。
たとえば、http://f.hatena.ne.jp/pacochi/20120324195100 なら、http://f.hatena.ne.jp/images/fotolife/p/pacochi/20120324/20120324195100.png になります。
細かく分けて説明するとこんな感じです。

http://f.hatena.ne.jp/ images/fotolife/ p/ pacochi/ 20120324/ 20120324195100 .png   
現在フォトライフで表示される画像のドメインは cdn-ak.f.st-hatena.com ですが、f.hatena.ne.jp でも同じ画像が表示されます。   はてな ID の一文字目 はてな ID 画像 ID の先頭から八文字分 画像 ID .jpg, .png, gif のどれかです。勘で探ります。.jpg の場合、本体 (.flv) が存在する可能性もあります。


また、上記のような URL をぽちぽち打たなくても、自分のダイアリーの記事を書くページを開いて、以下のように加工した文字を貼り付けて、「確認する」ボタンを押してプレビューすれば、さっくり閲覧できます。

[f:id:pacochi:20120324195100p:image]
[f:id:pacochi:20120324195100j:image]
[f:id:pacochi:20120324195100g:image]
[f:id:pacochi:20120324195100f:movie]

四行のうちどれかが展開されて、画像もしくは動画が表示されるはずです。ちなみに [f:id:pacochi:20120324195100f:movie] が展開される場合、 [f:id:pacochi:20120324195100f:image] で画像ファイルが出てきます。 (今回の例では出てきません。)
ダイアリーを開設していなくても、フォトライフ記法が展開されるところならどこでも可能です。
そんな感じなので、フォトライフに正真正銘ひみつ画像を置くと後で恥ずかしいことになるかもしれません。


その辺の恥ずかしさはさておき、ここからが本題です。私が数日前に書いた以下のコメントについてです。

フォトライフのトップから辿れないよう非公開フォルダに回答画像を置いていて、3月26日 10:50 の少し前くらいに別フォルダに移そうと考えているので、実は忘れてちゃいけないんですけどね。

http://q.hatena.ne.jp/1332381053#ac21249

前置きの通り、非公開フォルダに入れてもフォトライフ記法や個別ページを伝えた時点で見ようと思えば見ることができる状態になるので、実のとこフォルダ移動なんて忘れてても平気だったりします。
しかし、これも前置きの通り、そのままだと閲覧の手間が微妙にかかるので (そしてその辺の仕組みを知らない人はお手上げ状態になってしまうので)、皆様の手を煩わせるつもりはないよ、という意味で「忘れてちゃいけない」と発言しました。
が、これだと「非公開フォルダに画像を置いておけば、表示ページの URL やフォトライフ記法が知られても見られちゃうことはないんだ、安心だね」という誤解を与えかねないことに気付いたので、このエントリを書きました。
若干繰り返しになりますが、フォトライフは色々と油断ならないので、公開範囲を設定したからといって安心せず慎重に使って下さい。


せっかくこの辺に触れたので、似たような事例のこともおまけで書いておきます。
はてなダイアリーで「Twitter上でのツイートまとめを定期的にブログに投稿」する設定にしているアカウントのツイートは、ID や URL が分かれば、 twitter 上で鍵付きだろうとダイアリーがプライベートモードだろうとお構いなしに見ることができます。
フォトライフの時と同じように、twitter 記法が有効なところでプレビューするだけです。

[twitter:171084712608145408:detail]

私のはてなダイアリーtwitter のアカウントもプライベートモードですが、上記のような指定であっさり発言が出てきます。

フォロワーさんからのリプライなどで ID が分かっちゃうこともあると思うので、ダイアリーと連携している鍵付きアカウントは、ちょっと控えめな公開アカウントみたいなものだと思っておいた方が良いかもしれません。


あともうちょいおまけで書きますが、hatena code petit はその辺を活用したショートカットをしても最終解答に辿り着けないようになっています。
フォトライフ + なぞなぞ認証を使った問題を出す際は、この問題のようになぞなぞ認証のフレーズを再利用するか、画像表示ページのタイトル欄も併せて見ないと分からないような画像にした方が堅実だと思います。

HideMyAnswer で隠された回答を見るユーザスクリプト 1.2

1.1 からのバージョンアップです。コメント欄に書かれた回答も見るようにしました。
Firefox 用アドオンができるまで個人的に使うつもりのつなぎをご近所さんにおすそ分けしてるような気持ちなので、どっかに登録したりずっと更新し続けたりはしないと思います。

// ==UserScript==
// @id          ShowOurAnswer
// @name        ShowOurAnswer
// @version     1.2
// @namespace   id:pacochi
// @author      pacochi
// @description HideMyAnswer を見るだけ
// @include     http://q.hatena.ne.jp/*
// @run-at      document-end
// ==/UserScript==

(function() {

if (!document.URL.match(/q\.hatena\.ne\.jp\/\d+(#|$)/)) return;

var url = 'http://hidemyans.appspot.com/getAnswer';
var hma = {};
var pick = function(ansXpath, timeXpath) {

	var ans = document.evaluate(ansXpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

	for(var i = 0; i < ans.snapshotLength; i++) {

		var ap = ans.snapshotItem(i);

		if(ap.nodeType == 3 && ap.nodeValue.match(/HideMyAnswer:(\d{13})/)) {

			var id = RegExp.$1;
			var timestamp = document.evaluate(timeXpath, ap, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
			var atime = Date.parse(timestamp.singleNodeValue.nodeValue);

			// 早く回答した方だけ変換
			if (typeof(hma[id]) == 'undefined' || hma[id].atime > atime) hma[id] = { atime: atime, ap: ap };

		}

	}

};
var req = function(id) {

	GM_xmlhttpRequest({
		method: 'POST',
		headers: { 'Content-type': 'application/x-www-form-urlencoded' },
		url: url,
		data: 'hidemyansid=' + id,
		onload: function(res) {

			var txt = document.createElement('span');
			txt.style.cssText = 'display:block; padding:1em; border:1px solid #F6AC5A;';
			var lines = res.responseText.split('\n');

			for (var i = 0; i < lines.length; i++) {

				if (i > 0) txt.appendChild(document.createElement('br'));
				txt.appendChild(document.createTextNode(lines[i]));

			}

			hma[id].ap.parentNode.insertBefore(txt, hma[id].ap);

		}
	});

};

// 回答欄
pick("id('read_answer_list')//div[@class='answer-detail clearfix']/div[@class='section clearfix']/p/text()",
 "ancestor::div[@class='answer' or @class='answer reply_content']/h3/span[@class='timestamp']/a/text()");
// 回答コメント欄
pick("id('read_answer_list')//div[@class='answer-comment-detail']/div[@class='section']/p/text()",
 "ancestor::div[@class='section']/span[@class='timestamp']/text()");
// 質問コメント欄
pick("id('comment-section')//div[@class='comment-content clearfix']/text()",
 "ancestor::li/div/span[@class='comment-time']/a/text()");

for(var id in hma) req(id);

})();