コサキン & カンコンキンシアター

ついに、昨日10年来念願だったカンコンキンシアターに行ってきました!
思えばコサキンを聞いてから数十年。
仕事でコサキンを聞けなくなり、いつの間にかコサキンが終了しており、コサキンが思い出の中だけに
生きていた時、ふとカンコンキンのことを思い出してネットで調べたら、運よく開催時期だったのが良かった。
最終公演はゲットできませんでしたが、土曜のチケットをゲットし、行くことが出来ました。
感想:
ヒィィィィィィ!(「酷い」の「ひ」を延ばす)
バカ過ぎる!(コサキン最上級の褒め言葉)

特に一番最後のウドちゃんの英会話には抱腹絶倒、いや抱腹絶笑。
コサキン聞けなくなって以来、久しぶりに大笑いしました。
いや〜、笑いって本当に素晴らしいですね。(水野晴郎ちゃん風)
公演時間は休憩含め、4時間でした。
絶対来年も行きます。狙うは最終日。

1997年頃〜2000年ちょっとまでコサキンを録音していたテープがあるのですが、
(ところどころ抜けはあるのと当時学生で金がなく、テープの購入に限度があった)
テープが劣化する前にMP3に変換しようと思います。
数えたらおおよそ180本くらいありました。
土日に1本ずつやるにしても、2年はかかりそうです。
この当時はウチエイさんのネタとか有周が遊園地行ったりしていて、自分の中では超面白い時期でした。

テープ変換がんばるぞ!


コサキンコント劇場(3) 代々木上原~南砂町

コサキンコント劇場(3) 代々木上原~南砂町

ショック!

2年前くらいから温めていたネタをいつ・どう開発しようかと悩んでいた矢先、
某サイトでそのサービス運用が始まったことをつい先ほど知りました。。
かなりのショックです。
我ながらいいアイディアが浮かんだと喜びつつも、
業務系Webアプリの仕事で時間が取れずにいたことが悔やまれる。

あーあ。orz
ITは日進月歩が早い。
ソーシャルネット系は特に。
また新しいアイディアを考えます。

YAMAHA or KAWASAKI

最近バイクに興味を持つようになってきた。
自動二輪取ってからというもの、まあマネーがなくて物が買えず、
そのまま頭の隅に放置していたのだが、ここ最近急にバイクが欲しいなと
思うようになってきた。
で、いざ調べてみると、僕の欲しい250ccタイプのフルカウルが1つしかない。
しかも欲しい赤が2011年度でもでない。kawasaki、赤忍出そうよ。。
ナイキの靴みたいに好きな色を選択できるようにならないかな。
色は会社が指定したもの以外ないって少々時代遅れのような気がする。

ガセネタか噂ではYAMAHAがyzf-250rを出すような話が出ているが、ぜひとも出して欲しい。
大型しか日本に需要がないからそっちのクラスしかメーカーが出していないとか色々書かれているが、ninja250rがヒットしたという事実がある以上、きちんと調べているのかしら?という疑問がある。
排ガス規制もあるし、車も燃費重視の昨今、排気量のある大型がそんなに需要あるとは思えんのですが。
教習所で400cc乗っていたけど、400でもかなり大きい。
hondaのcbrとかもカッコいい!と思ってみると600cc以上しかないし。

最近若者のバイク離れがあり、各会社は対策を練っているらしいが、乗りたいと思うものが出ていないというのも問題だと思う。
私みたいに、フルカウルのやつで税金対策も良い250ccが乗りたいと思っている人って結構いると思うのだけど、今のところninja250rしか選択肢がないというのが現実である。
別にninja250rが良くないと言っている訳ではないのであしからず。
yamahaやhondaにはフルカウル250ccを是非とも出して欲しいものです。
でも、出たら出たでどれ買うかめちゃくちゃ悩みそう。

かりんとう

パソコン以外の話を。。
最近なぜかかりんとうにハマっています。
かりんとうと言えば、小麦粉を練って揚げたものを黒糖で絡めたものが
一般的ですが、多少の違いはあれ、似たような商品がいくつかチョイスされて
店頭に並んでいます。

脳みそへエナジー送るための糖分補給として、
かりんとうはうってつけなのですが、絡まっている砂糖の量が意外と多い。
糖分の入ったものは多々あり、今のご時勢、それらを複数摂取するからトータル量が
かなり多いと思う。
単体の砂糖量をもう少し減らしたほうがいい様な気がするのだが、何処の店見ても
甘さ控えめの物が見つからない。

そんなときに見つけたのが、山脇製菓という菓子メーカーが出しているかりんとうである。
見た目それほど砂糖コーティングしていなかったので、いくつか購入。

普通のかりんとうの甘さを10とした場合、それぞれの甘さは、
ピーナッツかりんとう:甘さ-6
抹茶かりんとう:甘さ-3
レーズンかりんとう:甘さ-8
シナモンかりんとう:甘さ-5
かな。個人的な感想なのであしからず。

お茶好きな私としては抹茶かりんとうはベスト1で、
適度な甘さな上に抹茶の味まで楽しめるというまさに一石二鳥のお菓子。

ふと思ったが、かりんとうの素揚げとかって売っているのだろうか。
今度見つけたら試してみたい。

カリー化

カレーではありません。
なんか、数学用語っぽいです。
prototype.jsの中身を読んでいたら、このカリー化の関数が書かれており、気になったので調べてみました。
ウィキペディアより、

カリー化 (currying) とは、計算機科学分野の技法の一つ。
複数の引数をとる関数を、引数が「もとの関数の最初の引数」で
戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。

あとはURL行ってください。
http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96


で、とりあえずサンプルを書いてみる。by javascript

//カリー化にするための関数
function curry(func,x) {
	return function(y) {
		func(x,y);
	}
}
//func用関数
function add(x,y) {
	return x+y;
}
//func用関数
function reduce(x,y) {
	return x-y;
}

var dd5 = curry(add, 5);
//dd5(y)には{add(5+y)}が入っている
dd5(10);//実行すると15
curry(reduce,15)(5)//reduceを使ったら10

最初の関数で引数に入れた関数が実行後、結果を返すように、その関数をラップした無名関数を返す……ということでいいのかな。

引数がいくらかあるようなものを作るとしたらこんな感じかしら。

//func関数が引数3つもち、内部関数の引数が1つの場合
function curry2(func,x,y) {
	return function(z) {
		func(x,y,z);
	}
}

//func関数が引数3つもち、内部関数の引数が2つの場合
function curry3(func,x) {
	return function(y,z) {
		func(x,y,z);
	}
}

これもカリー化と呼んでいいのだろうか。。。。

最近アンドロイド勉強しています。
開発環境がwindows7 64bitで、javaもx64で、非公式eclipseを使ってます。
しかし、アンドロイドとの相性がものすごく悪い。
シュミレーターにソフトをアップロード出来ずにエラー連発。
偶然出来るか出来ないかのレベルで使い物にならず、少々悲しい。

仮想windows XPが使えるので、そっちにも環境構築して開発しています。
仮想なのでものすごく動作が鈍いですが。
XPだと全く問題がないです。
起動中のエミュレーターにもソフトアップできるし、googlemapものっそり動く。
サーバーとして潰す予定だった古いパソコンを引っ張り出してそっちでやろうかな。

map関数、reduce関数のメモ

現在Pythonお勉を少々中断し、Androidをいじくっていますが、とりあえずPython
むむむ、最近話題のHadoop技術であるmapreduceになんか通じそうな感じの関数名が
出てきたのでメモメモ。
そういや、Erlang本でも今止まっているところから30ページほど進んだ場所に
map関数をreduce関数のことが書いてあったなあ〜と思い出しました。

                                                                                                                                            • -

map関数:同じ関数をシーケンス中のすべての要素に対して実行する

reduce関数:まずシーケンスの1,2番目の要素を引数として関数を実行し、
次にその結果得られた値と3番目の要素を引数として、
同じ関数を実行する。。という具合に処理を進めていき、
最終的にひとつの値を得る

filter関数:シーケンスの要素から特定の条件に合うものを抽出する

                                                                                                                                              • -

さて、ここからHadoop mapreduceに繋がっていくかどうか....


本日見たもの。

HTML5のドラッグ&ドロップ

前回作成した物を利用してhtml5ドラッグアンドドロップの機能を追加してみたいと思います。
動作確認したところ、Firefoxでのみ作動しました。

ドラッグオーバーしている行にドロップするとその行の下に配置するようにしました。
同じテーブル内でも同様です。

古典的な手法かもしれませんが、ドラッグオーバーしている時、行の行数を調べるようにしています。
他の人はどのようにやっているのか。もっと良い方法を知りたいです。


前回のソースを改良、追加します。
行を移動させる際、追加するテーブルに行を作成し、値を全部コピー後、元の行を削除します。
コピーする際、イベントハンドラ、idもコピーすることを忘れないように。

イベントの詳細。
dragstart:ドラッグが開始される時に発生するイベント
dragenter:ドラッグしたものがドロップゾーンに入ったに発生するイベント
dragover:ドラッグしたものがドロップゾーン内に存在する時に発生するイベント
dragleave:ドラッグしたものがドロップゾーンから出た時に発生するイベント
drop:ドロップした時に発生するイベント


追加するソース。events.js

var com;
if(!com) {com={};};
if(!com.sample) {com.sample={};};
if(!com.sample.Class) {com.sample.Eventclass={};};

var ev;
if(!ev){ev=com.sample.Eventclass;};

function dragStartHandler(event) {
	ev.dragStartHandler(event, "td", "tr", "trid");
}

function dropHandler(event) {
	ev.dropHandler(event, "trid");
}

function dragOverHandler(event) {
	ev.dragOverHandler(event);
}

function dragOverHandlerForColn(event) {
	ev.dragOverHandlerForColn(event);
}

function dragEnterHandler(event) {
	ev.dragEnterHandler(event, "trid");
}


ev.dragStartHandler = function(event, targetTagName, pTagName, key) {
	var trtop=al.findParent(event.target, pTagName);
	if(!al.searchRemainTr(trtop)) {
		event.preventDefault();
		return;
	}
	
	if(event.target.tagName.toLowerCase() == targetTagName.toLowerCase()) {
		var tr = al.findParent(event.target, pTagName.toLowerCase());
		event.dataTransfer.setData(key, tr.id);
	}else {
		event.preventDefault();
	}
	
}


ev.dropHandler = function(event, key) {
	var id = event.dataTransfer.getData(key);
	var tagEle = document.getElementById(id);
	if(tagEle) {
		var t=event.currentTarget.insertRow(this.colnN.getColnNum()+1);
		t.id =id;
		t.ondragover=tagEle.ondragover; 
		var len=tagEle.cells.length;
		for(var i=0;i<len;i++) {
			var tdtop=tagEle.cells[i];
			var clonechild=tdtop.cloneNode(true);
			t.appendChild(clonechild);
		}
		tagEle.parentNode.removeChild(tagEle);
	}
	event.stopPropagation();
}


ev.dragOverHandler = function(event) {
	event.preventDefault();
}


ev.colnN={};
ev.dragoverColn = (function() {
	var colnNum = 0;
	var getColnNum = function() {
		return colnNum;
	};
	var setColnNum = function(num) {
		colnNum = num;
	};
	ev.colnN.getColnNum = getColnNum;
	ev.colnN.setColnNum = setColnNum;
})();

ev.dragOverHandlerForColn = function(event) {
	var tr = al.findParent(event.target,"tr");
	this.colnN.setColnNum(tr.sectionRowIndex);
	event.preventDefault();
}

ev.dragEnterHandler = function(event, key) {
	var types = event.dataTransfer.types;
	for(var i =0;types.length;i++) {
		if(types[i] == key) {
			event.preventDefault();
			return;
		}
	}
}

修正するソース。

al.addTableRow=function(target) {
	var trtop=this.findParent(target, "tr");
	if(trtop.tagName.toLowerCase() != "tr") {
		alert("親取得に失敗しました");
		return;
	}
	var trtopParent=trtop.parentNode;
	<!--対象行のインデックスを取得し、+1-->
	var newColN=trtop.sectionRowIndex+1;
	var tr=trtopParent.insertRow(newColN);
	
	tr.id = this.createSuffix();
	tr.ondragover=trtop.ondragover; 
	
	var len=trtop.cells.length;
	for(var i=0;i<len;i++) {
		var tdtop=trtop.cells[i];
		var clonechild=this.copyChild(tdtop);
		tr.appendChild(clonechild);
	}
}

htmlの修正箇所。html5形式にします。

<!DOCTYPE html>

<html>
<head>
<meta charset="UTF-8">
<link href="tests.js" rel="Javascript" type="text/javascript" media="all" />
<link href="eventss.js" rel="Javascript" type="text/javascript" media="all" />
<script src="tests.js" type="text/javascript"></script>
<script src="eventss.js" type="text/javascript"></script>

<title>samples</title>

</head>

<body>
<form id="form1">
<table border="1" id="tdata">
<thead></thead>
<tbody id="tbody1"    			ondragstart="dragStartHandler(event)" 
								ondragenter="dragEnterHandler(event)"
								ondragover="dragOverHandler(event)"
								ondrop="dropHandler(event)">
<tr id="ssddd" ondragover="dragOverHandlerForColn(event)">
	<td draggable="true" >
		<div>
			<input type="text" id="form1sendt1" name="form1:sendt1" value="xx" size="30"/>
			<input type="button" value=" add " onClick="addTableRow(this);"/>
			<input type="button" value=" rem " onClick="remTableRow(this);"/>
			
		</div>
	</td>
</tr>
<tr id="ssddd2" ondragover="dragOverHandlerForColn(event)">
	<td draggable="true" >
		<div>
			<input type="text" id="form1sendt2" name="form1:sendt2" value="" size="30"/>
			<input type="button" value=" add " onClick="addTableRow(this);"/>
			<input type="button" value=" rem " onClick="remTableRow(this);"/>
			
		</div>
	</td>
</tr>
</tbody>
<tfoot></tfoot>
</table>


<br>
<br>
<table border="1" id="tdata2">
<thead></thead>
<tbody id="tbody2"    			ondragstart="dragStartHandler(event)" 
								ondragenter="dragEnterHandler(event)"
								ondragover="dragOverHandler(event)"
								ondrop="dropHandler(event)">
<tr id="ssddd23" ondragover="dragOverHandlerForColn(event)">
	<td draggable="true" >
		<div>
			<input type="text" id="form1sendt21" name="form1:sendt21" value="xx" size="30"/>
			<input type="button" value=" add " onClick="addTableRow(this);"/>
			<input type="button" value=" rem " onClick="remTableRow(this);"/>
			
		</div>
	</td>
</tr>
<tr id="ss21d" ondragover="dragOverHandlerForColn(event)">
	<td draggable="true">
		<div>
			<input type="text" id="form1sendt22" name="form1:sendt22" value="" size="30"/>
			<input type="button" value=" add " onClick="addTableRow(this);"/>
			<input type="button" value=" rem " onClick="remTableRow(this);"/>
			
		</div>
	</td>
</tr>
</tbody>
<tfoot></tfoot>
</table>
</form>
</body>
</html>

イベントハンドラはテーブルに付けた方が楽なのでテーブルに。
列にはマウスが乗っている時に列番を知るためにイベントハンドラを付与しています。
セルにはクリックOKの属性を付与しています。何故列にしないのかというと、ツリーを想像すると分かりますが、セルが一番上にあるため、クリック出来ないというのが理由です。。
なので、セルでイベントを捕捉後、そのセルの親である列のidを探し、datatransferへセットしています。
あとはドロップハンドラ内で列をコピーして、元のテーブルから削除しています。


動作確認した図です。


fig.1 基本テーブル

fig.2 上の表から持ってきた行を

fig.3 下の表に入れる


fig.4 下の表から持ってきた行を

fig.5 上の表に入れる


fig.6 下の表2行目を

fig.7 3行目に変更する

一応、希望する動きになりました。
ちなみにドラッグ中に異なる画像を表示させたい場合、datatransferオブジェクトに下記のような
感じで入れてやると画面が表示されます。
dragstartハンドラ内でdatatransferへsetDataしているところとか。

var dragIcon = document.createElement('img');
dragIcon.src = "./sa.png";
event.dataTransfer.setDragImage(dragIcon, -10, -10);