「class」を含む日記 RSS

はてなキーワード: classとは

2007-04-20

俺ぐらいのレベルになるとエポック病が意味わからん

LiveDoor認証がでたらしいので、とりあえず寝際にちゃちゃっと書こうとしたのだけどなんかうまくいかない。

ログインURLの有効期限が切れています」とかでちゃうんだ。

なにか間違ってるかな?

phpで書いてみたのだけど、エロイ人アドバイスにょろり。

<?php 
// LiveDoor認証に必要なリンクの生成
// 定数がクラス内に切ってあるので環境にあわせ変更してください
	include_once('authlivedoor.class.php');	// Livedoor認証用クラス
	$obj_auth = new AuthLiveDoor(LIVEDOOR_APIKEY, LIVEDOOR_SECRET);
	$livedoorloginurl = $obj_auth->getLoginUrl();

?>
<div style="border:solid 1px #666666;">
<a href="<?= $livedoorloginurl ?>">ライブドア認証を利用してログインする<br />
<img src="http://auth.livedoor.com/img/cmn/head_livedoor.gif" border="0">
<img src="http://auth.livedoor.com/img/cmn/head_logo.gif" border="0">
</a><br />


authlivedoor.class.php

<?php
// this code is writen by utf-8 &amp; lf 

//http://auth.livedoor.com/login/?app_key=<app_key>&amp;perms=<perms>&amp;t=<time>&amp;v=1.0&amp;userdata=<userdata>&amp;sig=<sig>

// LiveDoor外部認証APIを利用する
// キーは各開発者ごとに取得が必要です。 http://auth.livedoor.com/ ここより取得できます。
// コールバックURLには authlivedoor.php を指定してください

// --- 下記宣言を環境に合わせて変更してください。 ---
define("LIVEDOOR_APIKEY" ,"");	// アプリケーションキー
define("LIVEDOOR_SECRET" ,"");	// LiveDoor認証秘密キー
// --- ここまで ---


class AuthLiveDoor {

    const LIVEDOOR_AUTH_PORT = 80;		// ポート
    const LIVEDOOR_AUTH_TIMEOUT  = 10;	// タイムアウト
    const LIVEDOOR_AUTH_VERSION  = '1.0';	// 認証APIプロトコルバージョン
    const LIVEDOOR_AUTH_PERMS  = 'id';	// 認証APIアクセスconst LIVEDOOR_AUTH_FORMAT  = 'xml';	// 認証APIの取得フォーマット



	const LIVEDOOR_AUTHURL = "auth.livedoor.com";	// LiveDoor認証URL

	private $login_state = false;
	private $login_id = "";
	private $err_msg = "";

	private $apikey = "";
	private $secret = "";

	public function __construct($apikey, $secret) {
		$this->apikey = $apikey;
		$this->secret = $secret;
	}

	// 
	// $cert = $_GET['token'];
    public function getAuth($token) {
		if ($token == "" ) {
			return;
		}

		$api_time = date('U');	// エポック秒で
		$param_ary = array($this->apikey
						,AuthLiveDoor::LIVEDOOR_AUTH_FORMAT
						,$token
						,api_time
						,AuthLiveDoor::LIVEDOOR_AUTH_VERSION
						);
		sort($param_ary);
		$api_sig = hash_hmac('sha1',implode('',$param_ary),$this->secret);


		$param = "app_key=".$this->apikey
			."&amp;format=".AuthLiveDoor::LIVEDOOR_AUTH_FORMAT
			."&amp;token=".$token
			."&amp;t=".$api_time
			."&amp;v=".AuthLiveDoor::LIVEDOOR_AUTH_VERSION
			."&amp;sig=".$api_sig;

		$fp = fsockopen(AuthLiveDoor::LIVEDOOR_AUTHURL
				, AuthLiveDoor::LIVEDOOR_AUTH_PORT
				, $errno
				, $errstr
				, AuthLiveDoor::LIVEDOOR_AUTH_TIMEOUT);
		if (!$fp) {
			$this->err_msg = "$errstr ($errno)<br />\n";
		} else {
			$out = "POST /rpc/auth?$param HTTP/1.1\r\n";
			$out .= "Host: auth.livedoor.com\r\n";
			$out .= "Connection: Close\r\n\r\n";

			fwrite($fp, $out);
			$ret = "";
			while (!feof($fp)) {
				$ret .= fgets($fp, 2048);
			}
			fclose($fp);
		}

		// LiveDoorの認証XMLパターン
		$pattern = '/(\s*<livedoor_id>)(.*)(<\/livedoor_id>)/';
		preg_match_all($pattern,$ret,$getAry);
		$livedooruserid = $getAry[2][0];

		// ユーザーIDを取得できた場合
		if ($livedooruserid != "") {
			// ログイン成功
			$this->login_state = true;
			$this->login_id = $livedooruserid;
			return ture;
		} 
	}

	public function getLoginState(){
			return $this->login_state;
	}

	public function getLoginId(){
			return $this->login_id;
	}

	public function getLoginUrl() {
		# http://auth.livedoor.com/guide/
		# http://auth.livedoor.com/login/?app_key=<app_key>&amp;perms=<perms>&amp;t=<time>&amp;v=1.0&amp;userdata=<userdata>&amp;sig=<sig>
		# app_key 必須 登録時に発行されたアプリケーションキー 
		# perms 必須 要求するアクセス権、現状userhashとidの2種類がある 
		# t 必須 URLが生成された時間をエポック秒で表したもの 
		# v 必須 プロトコルバージョン現在は1.0で固定 
		# userdata 任意 コールバックURLに引き継ぎたい値を255バイトまで自由に設定できる 
		# sig 必須 このURLの正当性を確認するためのシグネチャ 


	// ログインURLの有効期限が切れています
	// ヾ(。o、゜)ノ ここらへんがわからん!! 
//		$api_time = time()+32400;	// エポック秒で
		$api_time = date('U')+32400;	// エポック秒で
//		$api_time = date('U');	// エポック秒??もしかして、それはポエティック病ではありませんか?
		$param_ary = array($this->apikey
						,AuthLiveDoor::LIVEDOOR_AUTH_PERMS
						,api_time
						,AuthLiveDoor::LIVEDOOR_AUTH_VERSION
//						,data
						);
		sort($param_ary);
		$api_sig = hash_hmac('sha1',implode('',$param_ary),$this->secret);
		$loginurl = "http://auth.livedoor.com/login/"
			."?app_key=".$this->apikey
			."&amp;perms=".AuthLiveDoor::LIVEDOOR_AUTH_PERMS
			."&amp;t=".$api_time
			."&amp;v=".AuthLiveDoor::LIVEDOOR_AUTH_VERSION
//			."&amp;userdata="
			."&amp;sig=".$api_sig;

		return $loginurl;
	}


}

もう疲れたので寝る。ライブドアなんてーーーー!!!

訂正。

秘密キーとか、そのままのっけちゃった (ーωー|||)

そしてなかなか訂正できなくてあせった。。

2007-02-17

rimo.tv.screensaver

>http://www.geocities.co.jp/SiliconValley/8916/Macintosh/rimo.tv.screensaver.html>

rimo.tv.screensaverは、YouTube に掲載されている人気の動画から約1日おきに新しい番組プログラムを生成・配信する はてなサービスである http://rimo.tvを表示するMacOSXスクリーンセーバです。

<<

勝手class-dumpとstringsとotoolで調べたよ。概ね間違っていないと思う。

  • 単一のクラスrimo_tv_screensaverViewで構成され、それをPrincipalClassとするバンドル
  • rimo_tv_screensaverViewはScreenSaverView(/System/Library/Frameworks/ScreenSaver.framework/Headers/ScreenSaverView.h)のサブクラス
  • rimo_tv_screensaverViewは一つのWebView(/System/Library/Frameworks/WebKit.framework/Headers/WebView.h)オブジェクトインスタンス変数に(そしておそらくsubviewとしても)持つ。
  • ページの読み込みはWebFrameクラスの-loadHTMLString:baseURL:で実行。URLは固定(http://rimo.tv/)
  • rimo_tv_screensaverViewは上のWebViewオブジェクトのframeLoadDelegateになっていて、ロード時に-webView:didFinishLoadForFrame:が呼ばれるようになっている(おそらくscale設定をおこなうため)
  • -awakefromNibって何やってるんだろう。

URLとかチャンネルオプション設定で変えられると便利そうだけど、今の超シンプルの方がカッコイイかも。

2007-02-06

古いブラウザで透過PNGを表示させるJavascriptの比較検証

取り上げるのは下の3つ。便宜的に上からapng、alphafilter、ie6pngとする。

IT戦記 - 僕も半透明 png を使うためのライブラリ作った!

アルファ画像を扱うalphafilter.jsライブラリ-とあるWEBクリエイターのblog

ウノウラボ Unoh Labs: IE6でアルファチャンネルを含むPNGを表示する

apng

特長
萌えポイント
好みがわかれるところ
  • 対象PNGの直後にscriptロードするだけで使える / 何度もロードしなきゃいけないのが嫌
びみょうなところ
  • imgにwidthとheightを指定しなきゃいけない(詳細不明)
簡単カスタマイズ
  • elmScript.src.replaceのとこをいじって好きなファイル名(/blank.gifとか)に置換する
想定される用途

alphafilter

特長
好みがわかれるところ
  • classを使って処理を適用するかどうか決める / class指定しなきゃいけないのが面倒
  • Event.observeが組み込まれてる
萌えポイント
びみょうなところ
  • prototype.jsが必要
  • どうせEvent.observe使うなら無名関数にしてほしい
  • window.onload時に実行されるので若干ラグ
簡単カスタマイズ
  • 複雑なことはしてない(Event.observeとdocument.getElementsByClassNameだけ)のでprototype.jsレスにするのが容易
  • document.getElementsByClassNameの第二引数を指定できるようにしたり、対象エレメントの配列ダイレクト引数で受け取れるようにしたり
想定される用途
  • 複数PNGに適用したいとき
  • 透過PNGを背景に使いたいとき

ie6png

特長
  • 代替GIFを指定できる
萌えポイント

特になし。ごめんなさい。

びみょうなところ
簡単カスタマイズ
  • AlphaChanneledPNG.initializeのEvent.observeを消して、実行コードを以下のようにして、HTMLの最後に書けばすっきりしていいとおもう
new AlphaChanneledPNG("imageId1","/blank.gif").show();
new AlphaChanneledPNG("imageId2","/blank.gif").show();
...
想定される用途
  • うーん……。

結論

  • 手っ取り早く使うならapng、CSSbackgroundに使うとか、PNGの数が多いならalphafilter
  • jQueryと衝突するのでprototype.jsはカンベンしてください
  • 欲を言えばIE7が出る前に開発してほしかったです

2007-01-29

haXeでFlash Lite 2のSharedObjectを使う

MTASCFlash Lite 2のSharedObjectを使う

http://anond.hatelabo.jp/20070118224057

↑に「リスナーを設定する必要があります。」とあるのでhaXeの↓に

(インストールフォルダ)\std\flash\SharedObject.hx

↓を追加する

#if flash
static function addListener(objectName:String, notifyFunction:Dynamic) :Void;
static function removeListener(objectName:String):Void;
#end

サンプルの内容は1でカウントアップ、3でカウントの表示。

でサンプル↓をSharedObjectHaxeRei.hxと名前をつけて保存。

import flash.MovieClip;
import flash.SharedObject;
import flash.Stage;
import flash.Key;

class SharedObjectHaxeRei
{
	static function main ()
	{
		var sor : SharedObjectHaxeRei = new SharedObjectHaxeRei (flash.Lib._root);
	}

	var Prefs : SharedObject;

	public function new (mc: MovieClip)
	{
		mc.createTextField ("tf", mc.getNextHighestDepth () , 0, 0, Stage.width, Stage.height);
		mc.tf.text = "SharedObjectHaxeRei\r";

		SharedObject.addListener ("Prefs",  loadCompletePrefs );

		// 共有オブジェクトを作成することができる
		Prefs  = SharedObject.getLocal ("Prefs");
		
		//キーリスナーの指定
		Key.addListener (this);
	}
	
	//キーアップイベントの処理
	public function onKeyUp () : Void
	{
		switch (Key.getCode ())
		{
			case 49 ://1 セーブ
			if (Prefs.getSize() == 0)  {
				Prefs.data.count = 0;
			} else {
				Prefs.data.count++;
			}

			case 51 ://3 ロード
				 if (Prefs.getSize() == 0) return;

				flash.Lib._root.tf.text = Prefs.data.count + "\r" + flash.Lib._root.tf.text;
			default :

		}
	}
	
	function loadCompletePrefs (mySO : SharedObject)
	{
		flash.Lib._root.tf.text = "call loadCompletePrefs: " + "\r" + flash.Lib._root.tf.text;
	}
}

コンパイルするにはSharedObjectHaxeRei.hxmlを作成して↓を記述

# SharedObjectHaxeReiのコンパイル用
-swf SharedObjectHaxeRei.swf
-swf-header 240:320:10
-swf-version 7
-main SharedObjectHaxeRei

上記を↓でコンパイルする。

haxe SharedObjectHaxeRei.hxml

2007-01-27

Re: テスト乙

ま、そういう事なんだけどね。

で、なんで直さないかというと原因が特定されてなかったからじゃないかな?

バグフィクスでめんどくさい事の1つがバグの位置の特定なんだよな。どのくらい時間がかかるかわからないし、わからない時はわからない。生産的でもないから食手が伸びないんだよ。ま、私はパズルを解くみたいで好きだけど。

で、不具合カテゴリのやつはほとんどが同じ根をもってるっぽい。以下憶測なんだけど増田の投稿処理フロー。

  1. Text::Hatena みたいなやつで各記法を変換(この時 anond 記法リンクに変換)
  2. はてなダイアリーキーワード自動リンクAPIかなにかでキーワードリンク生成(この時キーワードリンクはd.hatena.ne.jpを向いている)
  3. アンカー文字列がキーワードだったらリンクurlを「/keyword/〜」に変更(はてなキーワードAPIでも使ってるのかな?)
  4. リンクurlを抽出して、それがanond記事ならトラックバック登録

ってながれかなと。で3番でアンカー文字列がキーワードだとキーワードリンク(2で作られたリンク)ではなくても書き換えちゃうと。たぶんそんな所かと思った。

あと、キーワードに記号が含まれているとうまくマッチしないで d.hatena.ne.jp を向いたキーワードリンクが残るとか、こけて500を返すとかも起こってるんじゃないかな。

で、対策としてはキーワードリンク生成時にあらかじめclass属性を付加して、それを3のキーワードリンク書き換え条件にすればよいんじゃないかと思った。

という推測をしたんですが、あってますでしょうか?>わんぱーく先生

そうそう、やっぱり

- <a>キーワード</a>
- <a name="keyword>>キーワード</a>

ってのもありみたいで。

あと、まさかとは思うけど

http://anond.hatelabo.jp/20070127170633

ではトラックバックとんだりしないよねー。でも

- <span title="http://anond.hatelabo.jp/20060924031809">_</span>
  • _

はどうかなー?

2007-01-21

[]idea:13737

HTMLタグで遊び放題!

かと思ったけど、あんまりやってる人いないね。

ってか、ぼくだけ><

ところで、class="hatena-bcomment-view"が、display:noneだね。

display:noneそのままだと使えないから、これは便利。

ソース見ないと見れないように書くときに使えそう。

2007-01-18

MTASCFlash Lite 2のSharedObjectを使う

Flash Lite 2.x ActionScript Language Reference > ActionScript classes > SharedObject

http://livedocs.macromedia.com/flashlite/2/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000749.html

Flash Lite 2.x ActionScript リファレンスガイド > ActionScript クラス > SharedObject

http://livedocs.macromedia.com/flashlite/2_jp/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts_wEcute&file=00000749.html

アプリケーションが要求したときに、データをすぐにデバイスから利用できるようにするため、

Flash Lite 2.0 では、リスナーを設定する必要があります。

との事なのでMTASCの↓に

(インストールフォルダ)\std\SharedObject.as

↓の行を追加する

static function addListener(objectName:String, notifyFunction:Function) :Void;

でサンプル

class SharedObjectRei
{
	static function main ()
	{
		var sor : SharedObjectRei = new SharedObjectRei (_root);
	}
	public function SharedObjectRei (mc: MovieClip)
	{
		mc.createTextField ("tf", mc.getNextHighestDepth () , 0, 0, Stage.width, Stage.height);
		mc.tf.text = "SharedObjectRei\r";
		
		SharedObject.addListener ("Prefs", loadCompletePrefs );
		// 共有オブジェクトを作成することができる
		var Prefs : SharedObject = SharedObject.getLocal ("Prefs");
	}
	function loadCompletePrefs (mySO : SharedObject)
	{
		if (0 == mySO.getSize ())
		{
			// サイズが 0 の場合、データ初期化する必要がある
			mySO.data.name = "Sigismund";
			mySO.data.email = "siggy@macromedia.com";
		} 
		else
		{
			// mySO のすべてのデータトレースする
			_root.tf.text+= "Prefs: " + "\r";
			for (var idx in mySO.data)
			{
				_root.tf.text+= " " + idx + ": " + mySO.data [idx] + "\r";
			}
		}
	}
}

コンパイルは↓を参考に

ActionScript 2.0メモ

http://www.saturn.dti.ne.jp/~npaka/flash/as20/index.html

2007-01-09

http://anond.hatelabo.jp/20070109073629

ウェブで長文書いて議論してるのを見ると  改行Ver.

いや、本人同士がそれでいいならいいんですけどね、どっちかが長文うぜーなーとか思ってたりする場合も多いわけじゃないですか。ただの野次馬である傍観者にとっては特にそうだと思うんですけど。

はてブに「長い」とかコメントされてるエントリとかを想起していただけるとありがたいんですけど。

どうもそういうのを見るとついついフォード・ピント事件なんかを思い出してしまうわけですよ。

知らない人はググって下さいね。一応映画にもなってたりするんでお暇なら観てみるのもいいんじゃないかとオススメしますですよ、ハイ。(邦題『訴訟』原題『The Class Action』)そんなのめんどくせーよーという人の為には解説してるアドレス貼っときますね。(http://www.fps.chuo-u.ac.jp/~cyberian/Ford_Pinto.html) んでリンク踏むのさえめんどくせーとかacドメインとか読んでもわかんねーよという先入観をお持ちのあなたの為に適当に解説しちゃいますと、フォード日本車に押され始めた時代にこれじゃいかんってわけでコンパクト・カーを売り出したの、ピントっていう。しかしまぁリーズナブルなだけあって結構売れちゃったりしたんだけども安全設計もリーズナブルだったのが問題になって訴訟起こされちゃいました。

ちなみにアメリカ訴訟制度ってのはなかなか面白いもので、この手の訴訟だとあの有名な懲罰的損害賠償(企業が痛いな、と思う範囲まで賠償金額上げちゃっていいよ制度)と、Class Action 制度(同様の被害を受けた人は先人の訴訟結果にタダ乗り出来ちゃう制度、日本だと訴訟提起後結審前までは参加が許されたんだっけ、詳しくは知らないんでゴメンネ)のおかげで絶対負けられないんよね。

損して得取れなんて無理無理無理無理かたつむり松下幸之助中内功ビックリな制度。

ここら辺はまぁどうでもいいんで次行きますけど、訴訟開始前にディスカバリーって制度があるんですよ。

この手の訴訟の場合被告の企業側に証拠ってあるもんですしね。それを原告側が請求できる制度なんですよ。

といっても原告側もそんなに詳しく企業内事情を知ってるわけじゃあないんで請求内容がある程度曖昧にならざるを得ないわけでね、それを逆手に利用して、被告企業がそれこそ倉庫が一杯になる位の量の内部文書を送りつけるって行動に出るわけです。

そんなことされたら困るよねー。

原告側は何と言っても少数者であるわけだし、精査しようにも人件費が酷いことになっちゃうし、いかんともし難い状況になったよってお話(この先は映画見てね)。

ちなみにこのテクニック割とメジャーなようで僕が講義を受けた国際取引法の先生商社出身)もやったことあるって言ってたよ。

んでこれを最初の話に無理矢理つなげると、長々と文章書いて相手に対応してる人って、誠実に答えてるようでいて実は単に目晦まししてるんじゃないの?って疑問が湧いたよってお話。

2chでよく言われるように3行までしか読めない、ってのは少々極端に過ぎると思うのだけれど、しかしそうそう長い文章を時間コストをかけて読めるわけではないよね、ってところはなんとなく理解してもらえるんじゃないかなぁ。

世の中には楽しい事やしたい事ってのが一杯あって(セックル恋人とならタダだと思ってても多分風俗の方が安くて気持ちいいよ、次々入れ替わるから新鮮だし)とか食べ歩き(ってよりこんなところで食事してる俺/私って素敵欲望ドライブなんじゃないの)とかもっと寝たい(偽装請負ご苦労様です。所得隠ししなけりゃ設備投資費用も捻出できない世界有数の好景気大企業の下請じゃポイズン)とかデイトレード(まだやってる人いるの?)とか自己啓発はてなとFPNってこういう腐臭がするよね、どうでもいいけど。Lifehuckだってw)とか宗教儀式明治天皇の声が聞こえる!!とかグーグルの狂気とか)とかさ)、ネットで議論なんてモノはそのうちの一つでしかないわけだし。

しかもディスプレイとかブログっていうアーキテクチャはほんと長文読むのに適さない環境なんじゃないかとオールタイプな僕は思ってしまうわけですけども。

A4一枚分以上は紙で読みたい。

こういう人って結構いるんじゃないかなぁと思うわけですよ。

そういう人に対して誠実にあるにはどうしたらいいのかねぇって所はこの発達した世の中でも解決されてないんじゃなかろーか。

これってビジネスチャンス?ニートのボクでも起業してお金持ちになってセックル三昧(ここまでjkondo)、金で女は買えると豪語した挙句に証券取引法違反国策捜査の上つかまってあれやこれや的展開が期待できるかもーうはーすげー。

あ、ごめん妄想入った。

文章なんてのは長くしようとすればどこまででも長く出来るし、短くしようと思えば結構な割合で短くなるものだと思うんですよ。

それこそ昨年末K-1みたいな。

お前2時間でいいじゃんみたいな。

ただ、短く書く時には削ぎ落とされた部分を読む側が理解してないといけないという条件は付きますが。

ってことは長々と文章書いてる人ってのは読み手の力量を信用してない、ってことになるんですかね。

まぁはてブ衆愚とかネットイナゴなんてのが流行ってる昨今さもありなんな発想ではあるわけですが、エントリ書く奴が偉くて読み手は衆愚だからこんなことまでわざわざ書いてやらねばならん、みたいな。

そんな目で見ないでお願い。

それならいっそやde√blog終風先生みたいにわからん奴はもういいよ的に放置されるほうがまだマシじゃね? ってか終風先生紫式部か。

終風日記極東ブログは省略省略で貴族たり得ない衆愚である受験生を困惑させる源氏物語か。

挙句にシステムスルーカですか、イナゴはイナゴらしくオマニーでも見てればいいですかそうですか。

切ないなぁ、ああ切ない。

大島弓子ばりに切ないよ。

伝われこの思いの8頭身の心境ですよ。

大体あれだ、平野啓一郎もあれだよな、『日触』しか読んだことないけど漢字難しいよな、初手からお前ら文学イナゴは寄ってくんなオーラ全開だよな。

昔の日本文学読んでりゃ理解出来るとか言われてもそりゃ無理っすよ、旧字体で読んでる人っているのかね。

あんなのに造詣が深いのってめっちゃレアモンスターだと思うんですけど。

なんかはてな内には散見されるのが面白いといえば面白いのかもしれないが。

しかしまぁあんな小難しい本読むくらいならあれだね、同じ京大出身でも森見登美彦の方が全然面白いと感じちゃうね。

非モテでわーわー言ってる人は『太陽の塔』でも読むといいよ。

あ、ここでいう「非モテ」っていうのはある程度の文化資本をもった、顔面や身体に不都合があったり拗れた精神構造持ってる人ね。

PCなんて気にしねぇ)だってボクの後ろでウメダモチオとかessaがグーグルとか権力論とかビジネスモデルとかを語れない期間工みたいな奴ははてなーではない、って囁いて来るんだもん。ここはてなだし仕方ないよね。

しかしまぁスルーってのも寂しいもんだよね。

皆が皆スルーし合って出来上がる世界ってアレだよね、なんつーかちょっとつまらんよね。

ってかこれって物象化じゃないのか。

マルクスの亡霊は未だ徘徊してるのか。

ごめんちょっと難しい言葉使ってみたかった。

中二病といいたければ言うがいいさ。

でも心の隙間に大阪のおばちゃんを忘れないでいて欲しいなぁと。

さてもう収拾がつかなくなったのでこの辺で終わりにするけど、長文批判のためにはじめたこのエントリがやたら長くなった事を心より詫びる。

どうせスルーされるんだろうなぁ。

ウェブで長文書いて議論してるのを見ると

いや、本人同士がそれでいいならいいんですけどね、どっちかが長文うぜーなーとか思ってたりする場合も多いわけじゃないですか。ただの野次馬である傍観者にとっては特にそうだと思うんですけど。はてブに「長い」とかコメントされてるエントリとかを想起していただけるとありがたいんですけど。どうもそういうのを見るとついついフォード・ピント事件なんかを思い出してしまうわけですよ。知らない人はググって下さいね。一応映画にもなってたりするんでお暇なら観てみるのもいいんじゃないかとオススメしますですよ、ハイ。(邦題『訴訟』原題『The Class Action』)そんなのめんどくせーよーという人の為には解説してるアドレス貼っときますね。(http://www.fps.chuo-u.ac.jp/~cyberian/Ford_Pinto.html) んでリンク踏むのさえめんどくせーとかacドメインとか読んでもわかんねーよという先入観をお持ちのあなたの為に適当に解説しちゃいますと、フォード日本車に押され始めた時代にこれじゃいかんってわけでコンパクト・カーを売り出したの、ピントっていう。しかしまぁリーズナブルなだけあって結構売れちゃったりしたんだけども安全設計もリーズナブルだったのが問題になって訴訟起こされちゃいました。ちなみにアメリカ訴訟制度ってのはなかなか面白いもので、この手の訴訟だとあの有名な懲罰的損害賠償(企業が痛いな、と思う範囲まで賠償金額上げちゃっていいよ制度)と、Class Action 制度(同様の被害を受けた人は先人の訴訟結果にタダ乗り出来ちゃう制度、日本だと訴訟提起後結審前までは参加が許されたんだっけ、詳しくは知らないんでゴメンネ)のおかげで絶対負けられないんよね。損して得取れなんて無理無理無理無理かたつむり松下幸之助中内功ビックリな制度。ここら辺はまぁどうでもいいんで次行きますけど、訴訟開始前にディスカバリーって制度があるんですよ。この手の訴訟の場合被告の企業側に証拠ってあるもんですしね。それを原告側が請求できる制度なんですよ。といっても原告側もそんなに詳しく企業内事情を知ってるわけじゃあないんで請求内容がある程度曖昧にならざるを得ないわけでね、それを逆手に利用して、被告企業がそれこそ倉庫が一杯になる位の量の内部文書を送りつけるって行動に出るわけです。そんなことされたら困るよねー。原告側は何と言っても少数者であるわけだし、精査しようにも人件費が酷いことになっちゃうし、いかんともし難い状況になったよってお話(この先は映画見てね)。ちなみにこのテクニック割とメジャーなようで僕が講義を受けた国際取引法の先生商社出身)もやったことあるって言ってたよ。んでこれを最初の話に無理矢理つなげると、長々と文章書いて相手に対応してる人って、誠実に答えてるようでいて実は単に目晦まししてるんじゃないの?って疑問が湧いたよってお話。2chでよく言われるように3行までしか読めない、ってのは少々極端に過ぎると思うのだけれど、しかしそうそう長い文章を時間コストをかけて読めるわけではないよね、ってところはなんとなく理解してもらえるんじゃないかなぁ。世の中には楽しい事やしたい事ってのが一杯あって(セックル恋人とならタダだと思ってても多分風俗の方が安くて気持ちいいよ、次々入れ替わるから新鮮だし)とか食べ歩き(ってよりこんなところで食事してる俺/私って素敵欲望ドライブなんじゃないの)とかもっと寝たい(偽装請負ご苦労様です。所得隠ししなけりゃ設備投資費用も捻出できない世界有数の好景気大企業の下請じゃポイズン)とかデイトレード(まだやってる人いるの?)とか自己啓発はてなとFPNってこういう腐臭がするよね、どうでもいいけど。Lifehackだってw)とか宗教儀式明治天皇の声が聞こえる!!とかグーグルの狂気とか)とかさ)、ネットで議論なんてモノはそのうちの一つでしかないわけだし。しかもディスプレイとかブログっていうアーキテクチャはほんと長文読むのに適さない環境なんじゃないかとオールタイプな僕は思ってしまうわけですけども。A4一枚分以上は紙で読みたい。こういう人って結構いるんじゃないかなぁと思うわけですよ。そういう人に対して誠実にあるにはどうしたらいいのかねぇって所はこの発達した世の中でも解決されてないんじゃなかろーか。これってビジネスチャンス?ニートのボクでも起業してお金持ちになってセックル三昧(ここまでjkondo)、金で女は買えると豪語した挙句に証券取引法違反国策捜査の上つかまってあれやこれや的展開が期待できるかもーうはーすげー。あ、ごめん妄想入った。文章なんてのは長くしようとすればどこまででも長く出来るし、短くしようと思えば結構な割合で短くなるものだと思うんですよ。それこそ昨年末K-1みたいな。お前2時間でいいじゃんみたいな。ただ、短く書く時には削ぎ落とされた部分を読む側が理解してないといけないという条件は付きますが。ってことは長々と文章書いてる人ってのは読み手の力量を信用してない、ってことになるんですかね。まぁはてブ衆愚とかネットイナゴなんてのが流行ってる昨今さもありなんな発想ではあるわけですが、エントリ書く奴が偉くて読み手は衆愚だからこんなことまでわざわざ書いてやらねばならん、みたいな。そんな目で見ないでお願い。それならいっそやde√blog終風先生みたいにわからん奴はもういいよ的に放置されるほうがまだマシじゃね? ってか終風先生紫式部か。終風日記極東ブログは省略省略で貴族たり得ない衆愚である受験生を困惑させる源氏物語か。挙句にシステムスルーカですか、イナゴはイナゴらしくオマニーでも見てればいいですかそうですか。切ないなぁ、ああ切ない。大島弓子ばりに切ないよ。伝われこの思いの8頭身の心境ですよ。大体あれだ、平野啓一郎もあれだよな、『日触』しか読んだことないけど漢字難しいよな、初手からお前ら文学イナゴは寄ってくんなオーラ全開だよな。昔の日本文学読んでりゃ理解出来るとか言われてもそりゃ無理っすよ、旧字体で読んでる人っているのかね。あんなのに造詣が深いのってめっちゃレアモンスターだと思うんですけど。なんかはてな内には散見されるのが面白いといえば面白いのかもしれないが。しかしまぁあんな小難しい本読むくらいならあれだね、同じ京大出身でも森見登美彦の方が全然面白いと感じちゃうね。非モテでわーわー言ってる人は『太陽の塔』でも読むといいよ。あ、ここでいう「非モテ」っていうのはある程度の文化資本をもった、顔面や身体に不都合があったり拗れた精神構造持ってる人ね。(PCなんて気にしねぇ)だってボクの後ろでウメダモチオとかessaがグーグルとか権力論とかビジネスモデルとかを語れない期間工みたいな奴ははてなーではない、って囁いて来るんだもん。ここはてなだし仕方ないよね。しかしまぁスルーってのも寂しいもんだよね。皆が皆スルーし合って出来上がる世界ってアレだよね、なんつーかちょっとつまらんよね。ってかこれって物象化じゃないのか。マルクスの亡霊は未だ徘徊してるのか。ごめんちょっと難しい言葉使ってみたかった。中二病といいたければ言うがいいさ。でも心の隙間に大阪のおばちゃんを忘れないでいて欲しいなぁと。さてもう収拾がつかなくなったのでこの辺で終わりにするけど、長文批判のためにはじめたこのエントリがやたら長くなった事を心より詫びる。どうせスルーされるんだろうなぁ。

2006-11-21

anond pickup of the day

以下の二つに留意、つまり乱用禁止。

取説未満

// ==UserScript==
// @name	anond pickup of the day
// @namespace	http://anond.hatelabo.jp/
// @description	pickup section of the day at Hatelabo::AnonymousDiary
// @include	http://anond.hatelabo.jp/2*
// ==/UserScript==
(function(){
	var trackbackThreshold = 10;
	var ignoreList = {
		"/20070801172335": 33,
		"/20070806163721": 10,
	};

	// only section of the day
	if (! location.pathname.match(/^\/\d{8}$/)) {
		return;
	}

	// regist ancher that kick main routine
	var a = document.createElement("a");
	a.href = "#";
	a.innerHTML = "pickup of the day";
	a.addEventListener("click", grab, false);
	var firstPager_l = document.evaluate("//div[@class='pager-l']",document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;
	firstPager_l.appendChild(a);

	function Outline() {
		this.outline = document.createElement("ul");
		this.text = document.createElement("textarea");
		this.text.style.overflow = "auto";
		this.text.style.width = "100%";
		this.text.style.height = "15em";
		this.text.innerHTML = "</ul><\n><ul>\n";
		this.list = new Array();
	}
	Outline.prototype.setup = function() {
		var parent = document.getElementById("body");
		parent.insertBefore(this.outline, parent.firstChild);
		parent.insertBefore(this.text, parent.firstChild);
	}
	Outline.prototype.append = function(section) {
		var h3 = section.getElementsByTagName("h3")[0];
		var sectionName = h3.firstChild.pathname.replace(/\//,"");
		var sectionText = h3.textContent.replace(/\s*$/,"");
		if (sectionText == "\u25a0") {
			sectionText = sectionName;
		}
		this.text.innerHTML +=
			'<h2>[http://anond.hatelabo.jp/'+sectionName+
			":title="+sectionText.replace(/^\u25a0/,"").replace(/]/g,"&amp;#93;")+"] "+
			'<a href="http://b.hatena.ne.jp/entry/http://anond.hatelabo.jp/'+sectionName+'">'+
			'<img src="http://b.hatena.ne.jp/entry/image/http://anond.hatelabo.jp/'+sectionName+'">'+
			"</a></h2>\n";
		h3.firstChild.name = sectionName;
		var li = document.createElement("li");
		li.innerHTML =
			'<a href="#'+sectionName+'">' +
			sectionText.replace(/&amp;/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;") +
			"</a>";
		var nextSibling = 0;
		for (var i in this.list) {
			if (nextSibling < i &amp;&amp; i < sectionName) {
				nextSibling = i;
			}
		}
		if (nextSibling) {
			this.outline.insertBefore(li, this.list[nextSibling]);
		} else {
			this.outline.appendChild(li);
		}
		this.list[sectionName] = li;
	}
	var outline = new Outline();

	function CC(day) {
		this.li = document.createElement("li");
		this.li.innerHTML = '<a href="/'+day+'" target="_blank">' + day + "</a>";
		this.day = day;
		this.n = new Array();
	}
	CC.prototype.pp = function(id) {
		this.n.push(id);
		if (this.n.length > 10) {
			this.li.innerHTML = '<a href="/'+this.day+'" target="_blank">' + this.day + "</a> " + this.n.length;
		} else {
			this.li.innerHTML += ' <a href="/'+id+'" target="_blank">*</a>';
		}
	}

	function Count() {
		this.count = document.createElement("ul");
		this.list = new Array();
	}
	Count.prototype.setup = function() {
		var parent = document.getElementById("body");
		parent.insertBefore(this.count, parent.firstChild);
	}
	Count.prototype.append = function(day, id) {
		var nextSibling = 0;
		for (var i in this.list) {
			if (nextSibling < i &amp;&amp; i <= day) {
				nextSibling = i;
			}
		}
		if (nextSibling == day) {
			this.list[nextSibling].pp(id);
		} else {
			var cc = new CC(day);
			if (nextSibling) {
				this.count.insertBefore(cc.li, this.list[nextSibling].li);
			} else {
				this.count.appendChild(cc.li);
			}
			this.list[day] = cc;
			cc.pp(id);
		}
	}
	Count.prototype.appendSection = function(section) {
		var id = section.getElementsByTagName("h3")[0].firstChild.pathname.replace(/\//,"");
		var today = id.match(/\d{8}/)[0];
		var anchors = section.getElementsByTagName("a");
		for (var i=0; i<anchors.length; i++) {
			if (anchors[i].href &amp;&amp; anchors[i].host == "anond.hatelabo.jp" &amp;&amp; anchors[i].pathname.match(/\/(\d{8})\d{6}/) &amp;&amp; RegExp.$1 != today) {
				this.append(RegExp.$1, id);
			}
		}
	}
	var count = new Count();

	function Hide(){}
	Hide.prototype.setup = function() {
		this.style = document.createElement("style");
		this.style.id = "hide";
		this.style.type = "text/css";
		document.getElementsByTagName("head")[0].appendChild(this.style);
		var self = this;
		this.a = new Object();
		this.a.visible = document.createElement("a");
		this.a.visible.id = "visible";
		this.a.visible.href = "#";
		this.a.visible.innerHTML = "visible hide section";
//		this.a.visible.setAttribute("onclick","document.getElementById('hide').innerHTML = 'div.hide {display: block}';document.getElementById('visible').style.display = 'none';document.getElementById('unvisible').style.display = 'inline';");
		this.a.visible.addEventListener("click", function(){self.visible()}, false);
		firstPager_l.parentNode.insertBefore(this.a.visible, firstPager_l);
		this.a.unvisible = document.createElement("a");
		this.a.unvisible.id = "unvisible";
		this.a.unvisible.href = "#";
		this.a.unvisible.innerHTML = "unvisible hide section";
//		this.a.visible.setAttribute("onclick","document.getElementById('hide').innerHTML = 'div.hide {display: none}';document.getElementById('visible').style.display = 'inline';document.getElementById('unvisible').style.display = 'none';");
		this.a.unvisible.addEventListener("click", function(){self.unvisible()}, false);
		firstPager_l.parentNode.insertBefore(this.a.unvisible, firstPager_l);
		this.unvisible();
	}
	Hide.prototype.visible = function() {
		this.style.innerHTML = "div.hide {display: block}";
		this.a.visible.style.display = "none";
		this.a.unvisible.style.display = "inline";
	}
	Hide.prototype.unvisible = function() {
		this.style.innerHTML = "div.hide {display: none}";
		this.a.visible.style.display = "inline";
		this.a.unvisible.style.display = "none";
	}
	Hide.prototype.append = function(section) {
		if (section.className.match(/hide/)) {
			return;
		}
		section.className += " hide";
		count.appendSection(section);
	}
	Hide.prototype.is = function(section) {
		return section.className.match(/hide/);
	}
	var hide = new Hide();

	// main routine
	function grab(){
		if (! document.body.innerHTML.match(/<div class="pager-r">(\d+)/)) {
			return;
		}
		var pages = RegExp.$1 -0;
		if (pages <= 0 || pages > 40) { // check error and limit 1000 entry
			return;
		}
//pages = 2;

		firstPager_l.style.display = "none";
		outline.setup();
		hide.setup();
		count.setup();

		var mainbody = document.evaluate("//div[@class='body']", document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;
		mainbody.innerHTML = "\n";
		for (var i=1; i<=pages; i++) {
			cat(mainbody, i);
		}
	}

	// page load and concatenate
	function cat(container, page) {
		container.innerHTML += "<!-- page " + page + " -->\n";
		GM_xmlhttpRequest({
			method: "GET",
			url: "http://anond.hatelabo.jp" + location.pathname + "?page=" + page,
			onload: function(result) {
				result.responseText.match(/<div class="body">((.|\s)*?)\s*<\/div>\s*<\/div>\s*<div class="pager-l">/);
				container.innerHTML = container.innerHTML.replace("<!-- page " + page + " -->", RegExp.$1);
				if (! container.innerHTML.match(/<!-- page \d+ -->/)) {
//					document.documentElement.innerHTML = document.documentElement.innerHTML.replace(/(src|href)=\"\//mg, "$1=\"http://anond.hatelabo.jp/");
					pickup();
				}
			}
		});
	}

	// pickup section at last cat() concatenate after
	function pickup() {
		var target = document.evaluate(
			"//div[@class='section' and child::*[not(@class='sectionfooter') and descendant::a[starts-with(@href,'http://anond.hatelabo.jp/2') or starts-with(@href,'/2') and not(child::span[@class='sanchor'])]]]",
			document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
		for (var i=0; i<target.snapshotLength; i++) {
			hide.append(target.snapshotItem(i));
		}

		var tbs = document.evaluate(
			"//p[@class='sectionfooter']/a[2]",
			document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
		for (var i=0; i<tbs.snapshotLength; i++) {
			var tb = tbs.snapshotItem(i);
			if (tb.innerHTML == "\u30c8\u30e9\u30c3\u30af\u30d0\u30c3\u30af(0)") {
				hide.append(tb.parentNode.parentNode);
			} else if (! hide.is(tb.parentNode.parentNode)) {
				trackback(tb);
			}
		}
	}

	// count trackbacks
	function trackback(tb) {
		GM_xmlhttpRequest({
			method: "GET",
			url: "http://anond.hatelabo.jp/" + tb.pathname.match(/\d{14}/),
			onload: function(result) {
				var link = result.responseText.match(/<a name="tb">(.|\s)*/)[0].match(/<li>\s*<a href="http:\/\/anond.hatelabo.jp\/\d{14}"/g);
				var n = link.length;
				for (var l in link) {
					var m = "/" + link[l].match(/\d{14}/);
					if (m in ignoreList) {
						n -= ignoreList[m];
					}
				}
				if (n < trackbackThreshold) {
					hide.append(tb.parentNode.parentNode);
				} else {
					tb.innerHTML = tb.innerHTML.replace(/\)$/, "/"+n+")");
					outline.append(tb.parentNode.parentNode);
				}
			}
		});
	}

})();

ログイン ユーザー登録
ようこそ ゲスト さん