2009年4月30日木曜日

Modokiの開発で思った事。

このエントリーをはてなブックマークに追加
結論から言うと、JavaScriptとCSSがあればかなりやりたい事が出来るようになりましたねーって話。

今、TwitterのWebベースのクライアントを作っているんですが、画像なし&サーバサイド技術ゼロで作っています。
そもそも、Webでサービス展開してるTwitterのクライアントをWebベースで開発するとかどんだけお前はアホなんだみたいに突っ込まれる事間違いなしなのですが、ともあれ色々作っています。
インスパイアを受けたのはTweenというTwitter専用クライアントなのですが、どうやら僕の環境の問題らしく結構、変なタイミングでメモリエラー吐いて落ちるんですね。
共有メモリのロックに失敗したとかどーのこーの。これだから.NETは……。
#つーか、そろそろ環境再構築しろ、俺
閑話休題。
Tweenめっちゃ便利なんですよ。
クライアントとしての完成度は非常に高いです。
キーボードショートカットとかもうキュンキュンするし、タブ機能とか未読管理機能とかもう至れり尽くせり。
ここまでされちゃうと後はもうやる事無いんじゃない? みたいな感じになっちゃうんですが、先にあげたように自分の環境ではエラー吐きまくる。
後は結構メモリ食うんですよ、Tween。
そりゃ、メモリなんて最近安くなったし、がんがん使っても問題ないくらい積んでいますけど、使っている人が馬鹿だから、Operaで100~200タブくらい常時開いているので、当然ながらメモリもがっつり食われているわけでして(Operaが2G消費とかザラ)、なるべくOperaにメモリを割り振りたいんですよ。
「それ、Operaで実現すればよくね?」みたいに考えて、Tween Modokiってのを作り始めました。
まず、一番重要なのはキーボードショートカット。
Tweenがとても気持ちよく使えるのは、キーボードによる全面的な操作。
もうこれが気持ちよくて気持ちよくて。
ってことで、documentのkeypressイベントにaddEventListenerするいつものパターン的なコードで実現。
後はTimeLine(以下、TL)の表示。Tweenは色とテキストデコレーションでTLを表現しているので、TwicliとかTwitterの表現よりずっと分かりやすいと思っています。
って事でゴリゴリそれっぽい表現をしたのですが、ここで活躍するのがCSS。
CSSで複数のクラスを作成してそれをJavaScriptで書き換えるといういわゆるAjax(笑)的な対応をする事で動的にページを書き換えるというとってもアレゲな動きをするようになっています。
タブの表示とか、入力部分の表示とか兎に角I/Fの表現はCSSで、動作部分はJavaScriptでみたいにする事で、Tweenっぽい動きをさせる事が出来るようになってきました。
これはちょっとした恐怖ですよ?(ナニが恐怖だ)
別に恐怖でも何でもないですが、Webアプリもここまで出来るのかーみたいな感じで、本人的には超頑張ったなーって感じです。
ま、でも、まだまだ機能的にはTweenに追いついていませんし、Modokiを使うメリットみたいなのがまだありません。
なので、今後ゴリゴリ機能追加していって、Modokiを使うメリットみたいなのが出せるようになれば良いなーって思っています。
はい、駄文でした!
さあて、仕事いてきます!

2009年4月29日水曜日

偽術者として

このエントリーをはてなブックマークに追加
以前から何度か書いているように、僕は技術者と呼ぶにはおこがましい程度の能力の持ち主です。
世間一般から見ると相当なコンピュータオタク=Geekに見えるらしいのですが、残念ながらGeekと呼ばれる方々とは天と地の差があるほど僕の能力は低能力です。
弁解するのが面倒なので、特に説明していませんけどね。
偽術者って書くくらいなので、それなりの技術は持っていますが、間違いなく本物ではない。
自分で考えたコードなんて皆無です。
ま、それは僕が今までこのページで公開してきたUserJSとか見ると分かるとおりですね(笑)
コピペの嵐で本当にレベルの低さを露呈している訳ですが、ま、それはそれでいいやと最近思うようにしました。
変に気にしてもしょうがないし、気にしたところで何が改善するのかって訳でもないし。
本物の技術屋さんだったら、その辺キチンと考えるんだろうけど、残念ながら僕は偽術者なので、キチンと考えません。
色々とごめんなさい。
生きててごめんなさい。
そんな軽い鬱(それでもテンションはアッパーだけど)状態でお送りしました。
さあて、今日もいっぱい嘘コード書くぞー!

2009年4月24日金曜日

IT業界(web系)の人間だけど、非常識

このエントリーをはてなブックマークに追加
元ネタは増田

・HTML、CSSを理解している。無料ブログのテンプレートぐらいなら2時間程度で3つは作れるか
→無理ぽです。2時間で1つ作れるかどうかも怪しいです><

・携帯サイトの運営経験。テンプレートも作れるか
→運営経験ありません>< テンプレートも作れません><

・1万ヒット/日 程度のサイトなら簡単に作れるか
→無理ぽです。このブログだってせいぜい80ヒット/日です><


・オフ会はよく行く。年10回は行く
→ミステリアスあーくって呼ばれていませんが、オフには滅多に行きません><

・私生活はアクティブ。ネットでは喪男・喪女を演じても実際はリア充
→私生活もディアクティブです。絵に描いたような非リアです><

・ヨイショができる。twitterの馴れ合いなど、本音を隠して一応こなせる
→ヨイショなんて無理です。twitterでも本気で馴れ合います>< 本音なんて隠せません><

・SBM、RSSを使いこなせている。自信をもってそう言える
→SBMはLDCとdeliciousしか使っていません>< RSSはLDRとFastladderとGoogleReaderとOperaのRSSリーダーしか使っていません>< 使いこなせていません><

・ブログを書いている。常に自分の考えを発信できている
→ブログ書いていますが、自分の考えは発信できていません>< ほとんどどこかのコピペ(ソースコード的な意味で)です>< コピペじゃないのは大体痛い言葉です><

・エロサイト、エログの運営経験。このジャンルを運営するか否かで大違い
→経験皆無です><

・サーバー、独自ドメインの運用経験。序にMT、WPくらいは使えて欲しい
→独自ドメインもサーバも運用経験ありますが、超微妙です>< MTもWPも使った事ありません><

・mixi他SNSでのコミュニティ経験。コミュ主になったことがあるか
→SNSは登録した後特に積極的に活動していません>< コミュ主ってなんですか><

・掲示板、BBSの運用。2ちゃんねるにスレッドを立てたことあるか
→掲示板、BBSの運用はした事がありません>< 2ちゃんねるには割と舵スレ立ててます>< ごめんなさい><


最後に
全部ネタだぜ?
エロサイトだけは本当で後は割りと嘘。

2009年4月22日水曜日

Outputz for opera iframe ver

このエントリーをはてなブックマークに追加
Outputz for operaのiframe verを作成しました。
githubにてけとーにうpしたので、欲しい方はどうぞ。

http://github.com/ArcCosine/userscript/blob/80b38473487b1433aa6786706561eb3473e7999f/outputz_for_opera_iframe_ver.user.js

Opera10で動作確認してるけど、多分Opera9.X系でも動くと思います。
実験してないから分かりません。
元ネタはmallowlabさんのUserJSです。
基本的にはmallowlabさんのUserJSで問題ないと思いますが、僕みたいにOpera10を使っていてなぜかpostMessage効かなくてイライラしていた人にお勧め。
居ないか……orz

またニコニコ動画見てる for iframe version

このエントリーをはてなブックマークに追加
またニコニコ動画見てるのiframeバージョンというか、昨日作ったコードを俺俺から単発で抜き取った感じです。はい。

こちらで公開してます

ライセンスはPublic Domainです。
無保証。Own your risk.

コードはこんな感じ。
追記 一部コード差し替えました。

// ==UserScript==
// @name mata nico watch
// @namespace http://looxu.blogspot.com/
// @include http://www.nicovideo.jp/watch/*
// @author Arc Cosine
// @version 1.0
// ==/UserScript==
// License Public Domain
(function(){
var MataNico = {
send : function(){
var bg = document.getElementById('mata_nico').style.backgroundColor;
if( bg == "#fc9988" ){
return;
}
var text = document.getElementById('mata_nico').value;
text = (text.length>60) ? text.substring(0,60) : text;
text = (text.length == 0) ? text : '「' + text + '」';

var iframe = document.createElement('iframe');
iframe.name = 'mata_nico_miteru';
iframe.style.display = 'none';

var url = 'http://twitter.com/statuses/update.xml?status=またニコニコ動画見てる:' + text + location.href;

var form = document.createElement('form');
form.action = url;
form.target = 'mata_nico_miteru';
form.method = 'POST';
form.style.display = 'none';
document.body.appendChild(form);

var cnt = 0;
var onload = iframe.onload = function(){
if( cnt++ == 0 ){
setTimeout( function(){ form.submit(); }, 0 );
}else{
iframe.parentNode.removeChild(iframe);
form.parentNode.removeChild(form);
var mn = document.getElementById('mata_nico');
mn.value = '送信完了';
mn.readOnly = true;
mn.style.backgroundColor = '#fc9988';
}
};
document.body.appendChild(iframe);
},
init : function(){
var head = document.getElementsByTagName('h1')[0]
//mata nico
var input = document.createElement('input');
input.id = 'mata_nico';
input.autocomplete = 'off';
input.style.backgroundColor = '#f6f6f6';

head.parentNode.insertBefore(input, head);

var btn = document.createElement('input');
btn.type = 'button';
btn.value = 'またニコ';
btn.addEventListener('click',this.send, false);

head.parentNode.insertBefore(btn, head);

}
};

MataNico.init();

})();

またニコニコ動画見てる機能とかいろいろ追加。

このエントリーをはてなブックマークに追加
俺俺ニコニコ動画用UserJSになにやら色々くっつけた。
スペースキーを押すとキーボード操作できるようになります。
miya2000さんが書かれたコードをぱく(ry
あと、またニコニコ動画見てる機能も追加。
灰色っぽいところにコメントを書くとコメント付きでPost出来ます。多分。
無保証です。おうんゆありすく。

投稿が終わると文字入力を受付なくなるけどまあ、いいよね。


// ==UserScript==
// @name nico description
// @namespace http://looxu.blogspot.com/
// @include http://www.nicovideo.jp/watch/*
// @author Arc Cosine
// @version 1.5
// ==/UserScript==
(function(){
/** simple version of $X
* $X(exp);
* $X(exp, context);
* @source http://gist.github.com/3242.txt
*/
var $X = function (exp, context) {
context || (context = document);
var expr = (context.ownerDocument || context).createExpression(exp, function (prefix) {
return document.createNSResolver(context.documentElement || context).lookupNamespaceURI(prefix) ||
context.namespaceURI || document.documentElement.namespaceURI || "";
});

var result = expr.evaluate(context, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
// not ensure the order.
var ret = [], i = null;
while (i = result.iterateNext()) ret.push(i);
return ret;
}
return null;
}

//無駄なオブジェクト指向www
var NDesc = function(){

this.com_style = {
'color' : '#1259C7',
'text-decoration' : 'underline',
'margin-right' : '5px'
};

this.options = [
{ 'text' : 'Video詳細', 'func' : function(){ NDesc.prototype.description_toggle(); } },
{ 'text' : 'mitter', 'func' : function(){ NDesc.prototype.popup(); } },
{ 'text' : '広告表示', 'func' : function(){ NDesc.prototype.advert_toggle(); } }
];

this.mitter = false;

//fire!
this.init();
}

NDesc.prototype.init= function(){
//add input box
this.createInput();

//hide parts
this.description_toggle();
this.advert_toggle();

//add focus key event
document.addEventListener( 'keypress', function(e){
if (e.target.tagName == 'INPUT') return;
if (e.keyCode == 32) {
NDesc.prototype.use_hotkey();
e.preventDefault();
}
}, false );

//create parts
this.pos = $X('//div[@id="des_2"]/p[@class="TXT12"]/a')[0];
for( var i=0; i<this.options.length; i++ ){
this.createParts( this.options[i] );
}
}

NDesc.prototype.createParts = function( data ){
var node = document.createElement('span');
node.innerText = data['text'];
this.setCSS(node,this.com_style);
this.pos.parentNode.insertBefore( node, this.pos );
node.addEventListener( 'click', function(){ data['func'].apply(); }, false );
}

NDesc.prototype.setCSS =function( node, options ){
for( var option in options ){
//It's cooooool css setting code! I think so... :)
var st_op = option.replace( /-([a-zA-Z])/, function(m){ return m[1].toUpperCase(); });
node.style[st_op] = options[option];
}
}

NDesc.prototype.toggleObject = function(xpath){
var t= $X(xpath)[0];
t.style.display = ( t.style.display == 'none' ) ? 'block' : 'none';
}

NDesc.prototype.description_toggle = function(){
this.toggleObject('//p[@class="video_description"]');
}

NDesc.prototype.advert_toggle = function(){
this.toggleObject('//div[@id="WATCHFOOTER"]');
this.toggleObject('//div[@id="PAGEFOOTER"]');
}


NDesc.prototype.popup = function() {
var autoclose = (!this.isMitter)? '&autoclose=true' : '';
this.isMitter = true;
// For eyevio
var normalized_url = location.href;
var url = "http://mitter.jp/bookmarklet/popup", v = "0";
url += '?v=' + v + '&url=' + encodeURIComponent(normalized_url) + '&title=' + encodeURIComponent(document.title)+ autoclose;
var options = 'toolbar=0,resizable=1,scrollbars=1,status=1,width=450,height=230';
var open_func = function() {
var w = window.open(url, 'mitter', options);
if (!w) {
alert('Popup window from Mitter seems to be blocked. Please allow popup window to post on Mitter.');
} else {
w.focus();
}
};
open_func();
}

NDesc.prototype.createInput = function(){
if (window.parent != window) return;
NDesc.prototype.input = document.createElement('input');
NDesc.prototype.input.readOnly = true;
NDesc.prototype.input.autocomplete = 'off';
NDesc.prototype.input.addEventListener('focus', function() {
NDesc.prototype.input.style.backgroundColor = '#fcc';
NDesc.prototype.input.value = 'Hotkey available.'
}, false);
NDesc.prototype.input.addEventListener('blur', function() {
NDesc.prototype.input.style.backgroundColor = '#9D9';
NDesc.prototype.input.value = 'Hotkey unavailable.'
}, false);
NDesc.prototype.input.addEventListener('keypress', NDesc.prototype.key_event, false);
NDesc.prototype.input.style.margin = '0px 0px 5px 10px';
var head = document.getElementsByTagName('h1')[0]
head.appendChild(NDesc.prototype.input);

//mata nico
var input = document.createElement('input');
input.id = 'mata_nico';
input.autocomplete = 'off';
input.style.backgroundColor = "#f6f6f6";
input.style.margin = '0px 0px 5px 10px';

head.appendChild(input);

var btn = document.createElement('button');
btn.type = "button";
btn.value = "またニコ";
btn.appendChild(document.createTextNode("またニコ"));
btn.addEventListener("click",NDesc.prototype.mata_nico, false);

head.appendChild(btn);
}

NDesc.prototype.use_hotkey = function(){
NDesc.prototype.input.focus();
}

NDesc.prototype.play_pause = function(){
var flvplayer = document.getElementById('flvplayer');
if (!flvplayer) return;
if (flvplayer.ext_getStatus() == 'playing') {
flvplayer.ext_play(0);
}
else {
flvplayer.ext_play(1);
}
}

NDesc.prototype.volumeup = function(){
this.volume(5);
}

NDesc.prototype.volumedown = function(){
this.volume(-5);
}

NDesc.prototype.seekleft = function(){
this.seek(-10);
}

NDesc.prototype.seekright = function(){
this.seek(10);
}

NDesc.prototype.seek2top = function(){
this.seek(Number.NEGATIVE_INFINITY);
}

NDesc.prototype.volume = function(vol){
var flvplayer = document.getElementById('flvplayer');
if (!flvplayer) return;
var cur = Number(flvplayer.ext_getVolume());
var to = cur + Number(vol);
if (to > 100) to = 100;
if (to < 0 ) to = 0;
flvplayer.ext_setVolume(to);
}

NDesc.prototype.seek = function(time) {
var flvplayer = document.getElementById('flvplayer');
if (!flvplayer) return;
var len = Number(flvplayer.ext_getTotalTime());
var cur = Number(flvplayer.ext_getPlayheadTime());
var to = cur + Number(time);
if (to > len) to = len;
if (to < 0 ) to = 0;
flvplayer.ext_setPlayheadTime(to);
// for shotage of backward seek.
var cur = Number(flvplayer.ext_getPlayheadTime());
if (time < 0 && cur - to > 5 && to > 10) {
flvplayer.ext_setPlayheadTime(to - 10);
}
}


NDesc.prototype.key_event = function(e){
var handler = {
'o' : function(){ NDesc.prototype.description_toggle(); },
'm' : function(){ NDesc.prototype.popup(); },
'a' : function(){ NDesc.prototype.advert_toggle(); },
' ' : function(){ NDesc.prototype.play_pause(); if( !NDesc.prototype.isMitter ){ NDesc.prototype.popup(); } },
'k' : function(){ NDesc.prototype.volumeup(); },
'j' : function(){ NDesc.prototype.volumedown(); },
'h' : function(){ NDesc.prototype.seekleft(); },
'l' : function(){ NDesc.prototype.seekright(); },
'H' : function(){ NDesc.prototype.seek2top(); } //Shift+H
};
var t = e.target;
if( t.nodeType == 1 ){
var pressKey = String.fromCharCode(e.which);
if( typeof handler[pressKey] == "function" ){
e.preventDefault(); //Stop Default Event
handler[pressKey].apply();
}
}
}

NDesc.prototype.mata_nico = function(){
var text = document.getElementById('mata_nico').value;
text = (text.length>60) ? text.substring(0,60) : text;
text = (text.length == 0 ) ? text : '「' + text + '」';
var iframe = document.createElement('iframe');
iframe.name = 'mata_nico_miteru';
iframe.style.display = 'none';
var url = "http://twitter.com/statuses/update.xml";
var form = document.createElement('form');
form.action = url;
form.target = 'mata_nico_miteru';
form.method = 'POST';
var status_input = document.createElement('input');
status_input.value = 'またニコニコ動画見てる:' + text + location.href;
status_input.name = 'status';
form.appendChild(status_input);
form.style.display = 'none';
document.body.appendChild(form);
var cnt = 0;
var onload = iframe.onload = function(){
if( cnt++ == 0 ){
setTimeout( function(){ form.submit(); }, 0 );
}else{
iframe.parentNode.removeChild(iframe);
form.parentNode.removeChild(form);
var mn = document.getElementById('mata_nico');
mn.readOnly = true;
mn.style.backgroundColor = '#fc9988';
}
}
document.body.appendChild(iframe);
}


var o = new NDesc();

})();

2009年4月21日火曜日

広告の色を変えてみた。

このエントリーをはてなブックマークに追加
妙に広告が浮いていたので、変えてみた。
自然になじんだような気がしてやっぱり微妙に浮いている感じがするのはACさんのセンスだね!
#嫌なセンスだなぁ、オイ

ま、Operaユーザなら迷わず広告ブロック使っているだろうから、全然関係無い話だけどね……orz

2009年4月20日月曜日

Hit a HintのClick Key変更しました。

このエントリーをはてなブックマークに追加
今まで、Hit a HintのClick Keyは;にしてたんだけど、エンターに切り替えた。
そしたら超快適!
今のところ問題なし。
問題が見つかったらその時考えよう。
いーやっほぅ!

2009年4月18日土曜日

恋愛とか

このエントリーをはてなブックマークに追加
恋愛は結構好きな方というか、とても惚れっぽい体質です。
ですが、一方的に惚れて一方的に見切りをつけるという宮○一郎顔負けのGUN&RUNを実現しています。
してねーよ。

ま、それはともかく。
おにゃのこ結構簡単に好きになっちゃいますねー、僕は。
本質的に女性が好きなんだと思う。
ふつーの人よりもそれが強すぎて結構困った事になる事もしばしば。
(ま、博愛主義者だしね)
その原因としては恋愛なのか、親愛なのかその辺の区別がキチンとついていないからじゃねーかーとか勝手に想像つけてます。
んで、好きで好きでどうしょうもないかどうかを2~3ヶ月試してそれからようやく行動開始みたいなそんな保守的な人です。
で、今まで実際に行動したのは実に5回。5回中2回は成功したと思う。
もっとも、成功した後破局みたいな楽しい状態なので、ああああああああああああああああああああああああああああっっっ!!!


ぜぇ、はぁ、ぜぇ、はぁ。い、いや、いいんですよ、恋愛なんかいくら失敗したって。
人間の価値は恋愛が上手いか下手かとか関係無いからね。
明らかに僕は恋愛下手だし、自分の感情に任せて突っ走ると大変な事になるのを良く分かっているので、相当にブレーキを踏まないと駄目。
なので、GUN&RUNは僕にとってはとても大切。
近寄らず、遠からずの距離感をキープしないととてもじゃないけれどコントロールできません。
もう少し若くて物分りが悪ければその辺でもっと踏み込んで別の道が開けたんだろうけど、もう年を取りすぎてしまったし、物の理が分からないほど馬鹿じゃないし(ある意味馬鹿だけど)、何より過去の傷が全然癒えていないからね。

このエントリ書いていて思い出したんだけど、、アタックした子全員のイニシャルにMが含まれていたのは公然の秘密。
別に名前で選んでる訳ではないんだけどね、Mが苗字or名前の先頭に含まれる子が最終的に候補に残るみたい。おっかしいなぁ。
本人的には全然そんな事意識してないんだけどね。
今現在僕の心にときめきを与えてくれる彼女のイニシャルにもMが含まれている。
うーーーーーん、これは偶然であって欲しいなぁ。
偶然と嘘とネタと戯言と詭弁と必然と自然と泰然が綯い交ぜになっているので、このエントリを頭から全部信じちゃ駄目だよ。

では♪

2009年4月16日木曜日

Gitメモ

このエントリーをはてなブックマークに追加
GitHubへ久々にOpera Keyboardをpushしようとしたら、以下のようなエラーが出た。

error: failed to push some refs to 'git@github.com:ArcCosine/operakeyboard.git'


環境はmsysGit。git push origin masterとコマンドするとエラーが出た。
良く分からなかったけど、ぐぐる先生は--forceオプションつけれって言ってたから、つけてpushしたら成功した。

git push origin master --force


追記
なんか結局上手くpushできてなかった。つーか、コミットが失敗してた。
あっれー?

2009年4月14日火曜日

僕がIEを毛嫌いする理由

このエントリーをはてなブックマークに追加
IEつまり、(Windows|Microsoft) Intenet Explorerですが、これを僕が毛嫌いしているのは、ついったら&おぺらー&くりっぱーの間では周知の事実です。
このブログの熱心ではない読者も、いくつかの(酷い)記事を読むと、僕が異常なまでにIEを嫌っているのが分かると思います。
なんで、IEが嫌いなのか。

僕は一応Web関連の仕事をしています。
Web関連をお仕事にしている人の99%はクロスブラウザ対策に頭を悩ませた事があるはずです。
もし、無いというならば、その人は幸せなお仕事をしていると信じて良いでしょう。
Web標準のCSSやJavascriptを使って完成させたWebページをIE対応させるためには、ページを作成したのとほぼ同程度の労力がかかります。
(僕に技術力が無いというのを差し引いても、IE対応には時間がかかると思います)
IEは(一応)最大勢力のブラウザですので、見れるように対応しなければいけないのですが、余りにもHTMLやCSSの独自解釈が多すぎて嫌になります。
僕がIEを嫌いな最大の理由はそれ、つまりWeb標準に対応していないという点です。

Webの事を良く知らない人の大多数は所詮ブラウザなので、Web標準準拠なんてしなくても良いんじゃないかと考えるかもしれませんが、そのせいでどれだけの人が血を吐いているのか知って欲しいと思います。
ざまあwwwって思う人もいるかもしれませんが、それはそれ。
だって、それで飯食っている訳ですから、文句を垂れ流しつつもキチンと対応するのがプロってもんです。
どんなに酷いIEのバグがあったとしても、気合と根性と専用コードで乗り切ります。
(専用コードを書くあたりが偽術者っぽいですよね。本物は、共通コードだけで対応する)

IE対応を考えないと、単純に労力が1/2になる上、IEでは表現できない事が表現できるようになるんです。
IEのせいで表現できない不自由に苦痛を感じます。
ただ、IEのおかげでそれまで表現できなかった事が表現できるようになったという歴史もまた事実です。
ですから、IEが全て悪い訳じゃないんです。IEの功績は事実ですし、素晴らしいものです。
同時に、IEの功罪もまた事実ですし、今に至るまでそれは引きずられています。

一部の人は勘違いしているようですが、僕はIEを嫌っていますし、IEの存在なんか無くなっちゃえって思っていますけど、他人にまでそれは強要していません。
あくまでも、disるかdisらないかの判断は、使っている人本人がすべきなのですから。
ただ、disらない理由で「他のを使った事が無いから」というのはちょっと意見として弱いかなと思うんですね。
他のブラウザを試してみて、色々操作してみて、それでもやはりIEが良いというなら、それはそれで良いと思うんですよ。
だから、IEから(Opera|Firefox|Safari|Google Chrome)へ乗り換えましたという報告はとても嬉しいですし、(その人の)視点が少し広がったって事で喜ばしい事だと思います。
IEだけしか知らないのは良くないですし、Operaだけしか知らないというのもやっぱり良くないと思います。
(最も、Operaだけしか知らないというユーザはかなり少ないはず。なぜならば、この世の中IEでないと見れないというアホサイトが腐るほどあるからだ。しかもIE5.5じゃないと駄目とかね。そーゆーのに限って公共機関だったりするからもうね。Macユーザさんの事馬鹿にしてるでしょ。後、Linuxユーザも。後(以下略))
仮に、IEがWeb標準に準拠するようになれば僕自身そうIEを嫌ったりはしないと思います。
そんな日はそう簡単には来ないと思いますが、一日も早くその日が実現して欲しいですね。

終わり。

どうでも良い蛇足。
IE8になってもaddEventListenerに対応していないIE君を誰かどうにかしてください。

ふぁぼったのステータスページにふぁぼりすたー(?)を追加するuserscript書いた。

このエントリーをはてなブックマークに追加


Twitterでたまにふぁぼったのステータス画面へのリンクが張られるのですが、そこからすぐふぁぼりたい時があるじゃないですか。
ユーザページとトップページにはすぐにふぁぼるためのふぁぼりすたー(?)があるのですが、ステータス画面ではない。
なので、それを表示するuserscriptを書いて、codereposへうpしました。
http://coderepos.org/share/browser/lang/javascript/userscripts/favotter_star.user.js

追記
CodeReposだとインストールしにくいんだよ、F*ck!という天の声が聞こえたので、Userscripts.orgにもアップしておきました。
http://userscripts.org/scripts/show/46655



Firefox3とOpera10で確認済。変なコードは書いていないので、IEとかいう駄目ブラウザ以外では大抵動くと思う。
ちなみに、ふぁぼりすたー(?)をクリックするとBasic認証ダイアログが出ますので、自分のIDとパスワードを入力してください。
これはTwitterの仕様なので仕方が無いですね。
お前クローキングしてねーだろーなーと疑われる方は下のソースコードをじっくり眺めてください。

// ==UserScript==
// @name favotter star
// @namespace http://looxu.blogspot.com/
// @description fav on favotter status page
// @include http://favotter.matope.com/status*
// @author Arc Cosine
// @version 1.0
// ==/UserScript==
// License : Public Domain
(function(){
var d = document;
var fav = {
_url_full : 'url("http://favotter.matope.com/icon_star_full.gif") no-repeat',
_url_empty : 'url("http://favotter.matope.com/icon_star_empty.gif") no-repeat',
_is_favoted : false,

_pushFav : function(){
var id=location.search.match(/\d+/);
var api = !fav._is_favoted ? 'create' : 'destroy';
var iframe = d.createElement('iframe');
iframe.name = 'fav_' + id;
fav._setCSS( iframe, { 'display' : 'none' });
d.body.appendChild(iframe);
var url = "http://twitter.com/favourings/" + api + "/" + id + ".xml";
var form = d.createElement('form');
form.action = url;
form.target = 'fav_' + id;
form.method = 'POST';
d.body.appendChild(form);
iframe.contentDocument.onload = fav._changeStar();
form.submit();
},
_changeStar : function(){
var star = d.getElementById('userjs_star');
if( !fav._is_favoted ){
fav._setCSS( star, { 'background' : fav._url_full } );
fav._is_favoted = true;
}else{
fav._setCSS( star, { 'background' : fav._url_empty} );
fav._is_favoted = false;
}
},
_setCSS : function(node, options){
for( var option in options ){
var st_op = option.replace( /-([a-zA-Z])/, function(m){ return m[1].toUpperCase(); });
node.style[st_op] = options[option];
}
},
init : function(){
fav._is_favoted =false;
var star = d.createElement('span');
star.id = 'userjs_star';
fav._setCSS( star, {
'background': fav._url_empty,
'width' : '16px',
'height' : '16px',
'text-align' : 'right',
'padding-left' : '20px',
'padding-bottom' : '20px'
});
star.addEventListener( 'click', fav._pushFav, false );
//insert
var target = d.getElementsByClassName('info')[0];
target.insertBefore( star, target.firstChild );
}
};
fav.init();
})();


ライセンスはpublic domainです。

2009年4月13日月曜日

ネタですよ

このエントリーをはてなブックマークに追加
ぜのさんのブログを読んでふと思いついて書いてみた。

Browser.js 「無断リンク禁止」問題についてちょっと本気だして考えてみた
http://browserjs.blog102.fc2.com/blog-entry-947.html

無断リンク禁止がイヤーって人は以下のブックマークレットを使えばいいじゃない。


javascript:(function(){ var t=document.body.innerHTML; document.body.innerHTML = t.replace(/(無断|無断で|承諾なく)リンク|禁止/g, "" ); })();


偽術者思考ばんじゃい<アホか

2009年4月12日日曜日

酔いながら書く!

このエントリーをはてなブックマークに追加
今、ACさんは相当に酔ってます。この文字列もまともに追えません。
ってことで、この文章は相当に真実です。
rancorcoolさんとkotaro_wizardさんの文書はマジで価値があります。
最低限でもACという駄目人間は胸キュンしながらwktkしながら次のPostを待っています。
それくらい素晴らしい文章をPostされています。
ACさんの文書の価値はゼロでも二人の文章は無限大です。
それくらい、素晴らしいです。
ごめん、説得力ないね。酔いに任せたPostって事で。
削除するなよ>俺。

2009年4月8日水曜日

Mitterツールバー無くても自動保存したいぢゃない

このエントリーをはてなブックマークに追加
つーことで、変なコード書いた。
Mitter kbd rating changerに機能を追加した。
リクエストパラメタにautoclose=trueがあったらレーティング/コメント無しで保存できるようにした。
後は俺俺ニコニコ動画UserJSのpopupのURLの所にautoclose=trueを追加してポップアップウインドウを出すようにすれば完璧っ!
ナニを言っているか分からないって?
コード見てね(^^;;;

// ==UserScript==
// @name Mitter kbd rating changer
// @namespace http://d.hatena.ne.jp/janus_wel/
// @description change video rating in Mitter with keyboard operation
// @include http://mitter.jp/*/videos
// @include http://mitter.jp/bookmarklet/*
// ==/UserScript==

( function () {
const imgPath = '/images/rating/edit/';
const ext = '.gif';
const max = 5;
const min = 0;
const doc = window.content.document;

doc.addEventListener(
'keypress',
function (event) {
switch (event.which) {
case 119: // w
if (doc.activeElement.localName !== 'INPUT') { event.preventDefault(); raiseRating();}
break;
case 113: // q
if (doc.activeElement.localName !== 'INPUT') { event.preventDefault(); cutRating(); }
break;
case 103: //g
if (doc.activeElement.localName !== 'INPUT') { event.preventDefault(); goSubmit(); }
break;
default:
break;
}
},
false
);

chkParam();

// stuff
function raiseRating() {
var rating = doc.getElementById('rating_star');
if (!rating) return;
var p = parseInt(rating.value, 10);

if (p >= max) return;
rating.value = ++p;
doc.getElementById('rating-star-img').src = imgPath + p + ext;
}
function cutRating() {
var rating = doc.getElementById('rating_star');
if (!rating) return;
var p = parseInt(rating.value, 10);

if (p <= min) return;
rating.value = --p;
doc.getElementById('rating-star-img').src = imgPath + p + ext;
}
function goSubmit() {
var form = doc.getElementsByTagName("form");
form[0].submit();
}


function chkParam(){
var qs = location.search;
var m=qs.match(/autoclose=true/)
if( m ) goSubmit();
}


} )();
// vim:sw=4 ts=4 et:

俺俺ニコニコ動画UserJSをさらに改造

このエントリーをはてなブックマークに追加
なんだか色々実験的なことをしています。
Operaでしか動作確認していませんが、多分FirefoxやChromeでも動くと思う。
追記
FirefoxとGoogleChromeでも動いたのを確認しますた。


// ==UserScript==
// @name nico description
// @namespace http://looxu.blogspot.com/
// @include http://www.nicovideo.jp/watch/*
// @author Arc Cosine
// @version 1.3
// ==/UserScript==
(function(){
/** simple version of $X
* $X(exp);
* $X(exp, context);
* @source http://gist.github.com/3242.txt
*/
var $X = function (exp, context) {
context || (context = document);
var expr = (context.ownerDocument || context).createExpression(exp, function (prefix) {
return document.createNSResolver(context.documentElement || context).lookupNamespaceURI(prefix) ||
context.namespaceURI || document.documentElement.namespaceURI || "";
});

var result = expr.evaluate(context, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
// not ensure the order.
var ret = [], i = null;
while (i = result.iterateNext()) ret.push(i);
return ret;
}
return null;
}

//無駄なオブジェクト指向www
var NDesc = function(){

this.com_style = {
'color' : '#1259C7',
'text-decoration' : 'underline',
'margin-right' : '5px'
};

this.options = [
{ 'text' : 'Video詳細', 'func' : function(){ NDesc.prototype.description_toggle(); } },
{ 'text' : 'mitter', 'func' : function(){ NDesc.prototype.popup(); } },
{ 'text' : '広告表示', 'func' : function(){ NDesc.prototype.advert_toggle(); } }
];

//fire!
this.init();
}

NDesc.prototype.init= function(){
//hide parts
this.description_toggle();
this.advert_toggle();

//add key event
document.addEventListener( 'keypress', this.key_event, false );

//create parts
this.pos = $X('//div[@id="des_2"]/p[@class="TXT12"]/a')[0];
for( var i=0; i<this.options.length; i++ ){
this.createParts( this.options[i] );
}
}

NDesc.prototype.createParts = function( data ){
var node = document.createElement('span');
node.innerText = data['text'];
this.setCSS(node,this.com_style);
this.pos.parentNode.insertBefore( node, this.pos );
node.addEventListener( 'click', function(){ data['func'].apply(); }, false );
}

NDesc.prototype.setCSS =function( node, options ){
for( var option in options ){
//It's cooooool css setting code! I think so... :)
var st_op = option.replace( /-([a-zA-Z])/, function(m){ return m[1].toUpperCase(); });
node.style[st_op] = options[option];
}
}

NDesc.prototype.toggleObject = function(xpath){
var t= $X(xpath)[0];
t.style.display = ( t.style.display == 'none' ) ? 'block' : 'none';
}

NDesc.prototype.description_toggle = function(){
this.toggleObject('//p[@class="video_description"]');
}

NDesc.prototype.advert_toggle = function(){
this.toggleObject('//div[@id="WATCHFOOTER"]');
this.toggleObject('//div[@id="PAGEFOOTER"]');
}


NDesc.prototype.popup = function() {
// For eyevio
var normalized_url = location.href;
var url = "http://mitter.jp/bookmarklet/popup", v = "0";
url += '?v=' + v + '&url=' + encodeURIComponent(normalized_url) + '&title=' + encodeURIComponent(document.title);
var options = 'toolbar=0,resizable=1,scrollbars=1,status=1,width=450,height=430';
var open_func = function() {
var w = window.open(url, 'mitter', options);
if (!w) {
alert('Popup window from Mitter seems to be blocked. Please allow popup window to post on Mitter.');
} else {
w.focus();
}
};
open_func();
}

NDesc.prototype.key_event = function(e){
var handler = {
'o' : function(){ NDesc.prototype.description_toggle(); },
'm' : function(){ NDesc.prototype.popup(); },
'a' : function(){ NDesc.prototype.advert_toggle(); }
};
var t = e.target;
if( t.nodeType == 1 ){
var tn = t.tagName.toLowerCase();
if( tn == 'input' || tn == 'textarea' ){
return;
}
var pressKey = String.fromCharCode(e.which);
if( typeof handler[pressKey] == "function" ){
e.preventDefault(); //Stop Default Event
handler[pressKey].apply();
}
}
}


var o = new NDesc();

})();

2009年4月5日日曜日

俺俺ニコニコ動画UserJSとUserCSS

このエントリーをはてなブックマークに追加
ニコ動の仕様が変わったので、以前に公開したUserJSとUserCSSをちょろっと変更。
いや、あんま変わってないけどさぁ。

UserJS


// ==UserScript==
// @name nico description
// @namespace http://looxu.blogspot.com/
// @include http://www.nicovideo.jp/watch/*
// @author Arc Cosine
// @version 1.2
// ==/UserScript==
(function(){
/** simple version of $X
* $X(exp);
* $X(exp, context);
* @source http://gist.github.com/3242.txt
*/
var $X = function (exp, context) {
context || (context = document);
var expr = (context.ownerDocument || context).createExpression(exp, function (prefix) {
return document.createNSResolver(context.documentElement || context).lookupNamespaceURI(prefix) ||
context.namespaceURI || document.documentElement.namespaceURI || "";
});

var result = expr.evaluate(context, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:
// not ensure the order.
var ret = [], i = null;
while (i = result.iterateNext()) ret.push(i);
return ret;
}
return null;
}

var load_event = function(){
description_clear();
var iDiv = document.createElement('span');
iDiv.id = 'view_video_description';
iDiv.innerText = 'Video詳細';
iDiv.style.color = '#1259C7';
iDiv.style.textDecoration = 'underline';
iDiv.style.marginRight = '5px';
var p = '//div[@id="des_2"]/p[@class="TXT12"]/a';
var pos = $X(p)[0];
pos.parentNode.insertBefore( iDiv, pos);
iDiv.addEventListener( 'click', description_clear, false );

var mDiv = document.createElement('span');
mDiv.id= 'mitter_button';
mDiv.innerText = 'mitter';
mDiv.style.color = '#1259C7';
mDiv.style.textDecoration = 'underline';
mDiv.style.marginRight = '5px';
pos.parentNode.insertBefore( mDiv, pos );
mDiv.addEventListener( 'click', popup, false );
}

var popup = function() {
// For eyevio
var normalized_url = location.href;
var url = "http://mitter.jp/bookmarklet/popup", v = "0";
url += '?v=' + v + '&url=' + encodeURIComponent(normalized_url) + '&title=' + encodeURIComponent(document.title);
var options = 'toolbar=0,resizable=1,scrollbars=1,status=1,width=450,height=430';
var open_func = function() {
var w = window.open(url, 'mitter', options);
if (!w) {
alert('Popup window from Mitter seems to be blocked. Please allow popup window to post on Mitter.');
} else {
w.focus();
}
};
open_func();
}

var description_clear = function(){
var p = '//p[@class="video_description"]';
var desc = $X(p)[0];
var disp = desc.style.display;
if( disp == 'none' ){
desc.style.display = 'block';
}else{
desc.style.display = 'none';
}
}

var key_event = function(e){
var handler = {
'o' : description_clear,
'm' : popup
};
var t = e.target;
if( t.nodeType == 1 ){
var tn = t.tagName.toLowerCase();
if( tn == 'input' || tn == 'textarea' ){
return;
}
var pressKey = String.fromCharCode(e.which);
if( typeof handler[pressKey] == "function" ){
e.preventDefault(); //Stop Default Event
handler[pressKey].apply();
}
}
}

document.addEventListener( 'keypress', key_event, false );
load_event();
})();


User CSS

@charset "UTF-8";

div#des_2 table:last-child{ float:right !important; margin-top: -30px !important; }
div#WATCHFOOTER{ display: none !important; }
div#PAGEFOOTER{ display: none !important; }


両方適用すると幸せになれる。多分。

2009年4月1日水曜日

さてさて

このエントリーをはてなブックマークに追加
偽術者である僕としましては、4月1日ですので本当の事を書くのが一番嘘っぽくなるんじゃないかなぁと思いまして、それっぽく書きたいと思います。

・開発の傾向
 IDEが大嫌いなタイプです。エディタでゴリゴリコードを書いていくタイプです。
 IDEは確かに便利なんですけど、重いのが嫌という非常に我侭な考えの持ち主。
 なので、開発はエディタ+コンパイラ(orブラウザ)みたいな傾向が強いです。
 メインのエディタはVimですが、サブとしてサクラエディタを愛用しています。
 サクラエディタはVimではもたつくものすごく大きなデータを開くときに便利です。
 Vimは高機能ですが、少しメモリを食いすぎですね。Firefoxよりはずっとマシですけれど。

・経歴
 高専という非常にアレゲな学校を卒業した後、某中小企業にもぐりこみ、某都市銀行の中のシステム開発に携わっていました。
 当時はオープン系システムの開発でしたので、VBがメインでしたし、ほとんどコードを書いていませんでした。
 いわゆる社内SEと呼ばれるものですね、やってたのは。社内SEの受託開発ってなんかとっても……。
 そこで四年ほど働き辞めました、自己都合で。
 もっとコードが書きたかったものでして……。
 そして、二社目ではゴリゴリコードを書く仕事をしてましたが、やっぱり自己都合で辞めました。
 二社目もやはり中小企業と呼ばれるものでしたが、大変素晴らしい会社で、常識的に考えたら辞めるのは馬鹿の極みかと。
 ま、自分にとってやりたい事を優先させる人生を歩んでいますので仕方がありません。
 んで、このお馬鹿さんは個人事業主として税務署に届けをして、晴れてフリープログラマーへと成り下がりました。
 今はpopInというベンチャー企業にてアルバイトしつつ、自分の開発鯖でなにやら変なものを作っている最中です。
 FirefoxおよびIEユーザ様、popInというアドオンがありますので、是非ご利用ください。
 IE8で搭載されたWebスライスアクセラレータ(4/4訂正)遥かに凌駕するアドオンです。
 IE6でも、IE7でも、IE8でも動きますので、是非是非導入してみてください。
 http://popin.cc/ja/home.html

・思想
 基本的に人間に対しては博愛主義者です。そして、プログラムに対する徹底的な差別主義者です。
 ArcCosine IEで検索すると壮絶な言葉を見ることが出来ます。TwitterではArcCosineというIDで色々Postしていますが、どれもこれも酷い内容です。
 面白キャラというより、痛いキャラですね、この人。

・最後に
 まじめに書いているつもりですが、常にネタと同居しているので、こんなエントリしかかけませんでした。

特注:なお、このエントリに嘘は全く含まれて居ません。期待してしまった方ごめんなさい。