これはすごい。

SeaHorse スクリプト配布 - Fenrir User Community

プヨぷよ氏がテキストエリアの入力保護機能をSeahorse&UserActionスクリプトで実装されました。

僕の環境ではしっかり動作しています。



個人的にすごいと思ったのが、2点あります。

  • ページ上のボタンにイベント追加

attachEvent()でできるのですが、たぶんSleipnirScriptで実行したSeahorseではできないはず。しかし、プヨぷよ氏はattachしたいfunctionをscriptタグとしてページに埋め込んでいるようです。たしかにこれならイベントを追加できます。

  • ページ上に追加したボタンからsleipnir.Databaseが使える

_windowオブジェクトにsleipnir.Databaseを渡してるのかなぁ?よくわかりません。
ただ、この技はいろいろと今後に使えそうなので参考にさせていただきます。

最後に気づいた点
  • このスクリプトが実行されているときはマウスでテキストエリア内の任意の箇所をクリックできない。(カーソル移動がマウスでできない)
  • スクロールバーをマウスでドラッグしてのスクロールができない。



そんな気がしますが、過去になんどもエントリをパーにしてるものとしてはテキストエリアの自動保存は非常に助かります。
プヨぷよ氏に感謝です。

任意のURIのタブをアクティブにするスクリプト

くだらないスクリプトを書いてみました。

スクリプト中のコメントと完全にかぶりますが、説明。

  • 作ろうと思ったのは

個人的にSleipnirのお気に入りはお気に入り検索が使いにくいと思ってて、
それに輪をかけて自分のは全く整理されていないなので最近は”はてブ”を主に使ってます。
そうすると大量のタブを開いているときに”はてブ”を開いたタブを見失ってしまって
非効率と思ったのでショートカット一発でタブをアクティブにしたかったのです。

  • 使い方

16行目のpage変数にアクティブにしたいURIを代入しておいてください。

	var page = "http://b.hatena.ne.jp/griffin-stewie/"; 

↑をGoogleのトップにしたい場合は ↓こう書き換えてください。

	var page = "http://www.google.co.jp/"; 

スクリプトを起動すると設定されたURIとマッチするタブを全タブの中から探してアクティブにします。
なかった場合は新規タブで開きます。


汚くてごめんなさい。

/**********************************************************

	「任意のURIのタブをアクティブ」 2007/04/20
					Written by stewie
<簡単な説明>
	任意のURIのタブをアクティブにします。
	スクリプトをマウスジェスチャやショートカット等に登録して
	自分のSMBを設定しておくと簡易お気に入り的に使えるかと。

**********************************************************/

(function()
{
	//設定ここから
	//ここにURLを入力
	var page = "http://b.hatena.ne.jp/griffin-stewie/"; 
	//設定ここまで
	
	var pnir     = new ActiveXObject("Sleipnir.API");
	var id       = pnir.GetDocumentID(pnir.ActiveIndex);
	var document = pnir.GetDocumentObject(id)
	var tabs = pnir.GetCount;
	for(i=0;i<tabs;i++){
		var tid = pnir.GetDocumentID(i);
		var tdoc = pnir.GetDocumentObject(tid);
		if(tdoc.location.href.match(page)){
			var ind = pnir.GetIndex(tid);
			pnir.ActiveIndex = ind;
			return
		}else if(i==tabs-1){
			pnir.NewWindow(page,true);
			return
		}
	}
})();

Snippetを書いてみた

また、書きかけのエントリが消えたので投げやりモード。
TextmateのBundleと互換性がある程度あるってみたのでやってみた。

拡張子を”.itSnippet”にして、C:\Program Files\Intype\bundles\JavaScript.itBundle\snippets以下に保存。
まず、for文を移植。

{
	content	:
    'for (var ${20:i} = ${1:Things}.length - 1; ${20:i} >= 0; ${20:i}--){
           ${100:${1:Things}[${20:i}]}$0
    };'

	title			: "for (…) {…}"
	tab_trigger	: 'for'
	scope			: 'source.js'
	
}

個人的に欲しかったので
alert 『al』と打ってTABキーを押すと出ます。

{
	content	:
     'alert(${1:Things});'

	title			: "alert"
	tab_trigger	: 'al'
	scope			: 'source.js'
	
}

status 『st』と打ってTABキーを押すと出ます。

{
	content	:
     'window.status = ${1:Things};'

	title			: "status"
	tab_trigger	: 'st'
	scope			: 'source.js'
	
}

iTunesで洋楽と邦楽を分けるWindows版

ほとんど使い回しですが・・


Windows版iTunesではCOMオブジェクトを使ってやるといいみたいです。
ほとんどドキュメントを読んでなくてサンプルスクリプトから使えそうなメソッドとか
適当に使って”動けばOK”ってスタンスで作りました。


動作検証もそんなにやってません。
基本的にはiTunesで洋楽と邦楽を分けるちょっと改良してみた
の動作と同じになってるはずです。


選択トラックに対して歌詞中のアルファベット率が65%以上だと”洋楽”と判定します。
事前に歌詞を取得していてください。

var iTunesApp = WScript.CreateObject("iTunes.Application");

var S_Tracks = iTunesApp.SelectedTracks;
var S_tracks_length = S_Tracks.Count;

for(i=1;i<=S_tracks_length;i++){
	var pre_comment = S_Tracks.Item(i).comment;
	if(!pre_comment.match(/\[English\]|\[Japanese\]/)){
		var track_name = S_Tracks.Item(i).name;
		var kashi = S_Tracks.Item(i).Lyrics;
		if(kashi.length == 0){
			WScript.Echo(track_name+"  歌詞がありません");
		}else{
			var moji = 0;
			var alphabet = kashi.match(/[\w']/ig);
//			WScript.Echo(track_name+" は "+kashi.length+" 文字中 "+alphabet.length);
			var par = (parseFloat(alphabet.length) / parseFloat(kashi.length)) * parseFloat(100);
			WScript.Echo(track_name+" は 洋楽度"+Math.round(par)+"%");
			if(Math.round(par) >= 65){
				S_Tracks.Item(i).comment = "[English]" + "\r\n" +pre_comment;
				WScript.Echo(track_name+"  を洋楽に設定");
			}else{
				S_Tracks.Item(i).comment = "[Japanese]" + "\r\n" +pre_comment;
				WScript.Echo(track_name+"  を邦楽に設定");
			}
		}
	}else{
		WScript.Echo(track_name+"  は分類済み");
	}
}

前回のエントリのつづき

iTunesのスクリプトメニューから実行したいってやつですが、
rbスクリプトを起動するためのAppleScriptを書いて入れても
Launcher.Appを使ってもスクリプトメニューからだとエラーが出てしまいます。


とりあえず、ターミナルにぶち込むスタイルで行きますorz


動作中のメッセージをテキストファイルとして出力してログをとったり
Growlに出力するのも考え中。

やっとの更新です(汗)


汚いサンプルですが、こんな感じです。

これはe-honで”JavaScript”をタイトルに含む書籍を検索した上位20位
のリストです。

▼▲をクリックすると昇順、降順って感じでソートがかかるはずです。

テーブルの左端のカラム【No】の部分だけ単純に文字列としてソートを
かけると1の次に11とかが並んでおかしくなります。

ですのでそこだけ文字列を数字に変換してソートをかけるようにしています。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1-strict.dtd">
<html xhtmlns="http://www.w.org/1999/xhtml"xml:lang="ja">
<head>
<title>テーブルのソートサンプル</title>
<script type="text/javascript">
<!--
var cell = new Array();
var row = new Array();
var i, n_rows;
// ページのロード時に呼び出される関数initをセット
window.onload = init;
// ページのロード時に呼び出される関数
function init(){
  // tr要素
  var tr = document.getElementsByTagName("tr");
  // 見出し行を除く行の数
  n_rows = tr.length-1;
  // 見出し行を除くテーブルの行を配列rowに代入
  for( i=0; i<n_rows; i++ ){
    row[i] = tr[i+1];
  }
}
// col→列の番号、asc→昇順:true 降順:false
function sortTable(col, asc){
	if(col == 0){
		// ソート対象の列を配列cellに代入
		for( i=0; i<n_rows; i++ ){
			num = row[i].childNodes[col].firstChild.nodeValue;
			cell[i] = parseInt(num, 10);
		}
	}else{
		// ソート対象の列を配列cellに代入
		for( i=0; i<n_rows; i++ ){
			cell[i] = row[i].childNodes[col].firstChild.nodeValue;
		}
	}
	// 配列cellの順に配列rowをソート
	sortData(asc);
	// テーブルの書き換え
	replaceTable();
	SetStyle();
}
// 配列cellの順に配列rowをソート
function sortData(asc){
  var tmp;
  var finish_sort = false;// 交換をしなければソート終了
  while(!finish_sort){
    finish_sort = true;
    for( i=0; i<n_rows-1; i++ ){
      if( (asc && cell[i]>cell[i+1]) ||     // 昇順
          (!asc && cell[i]<cell[i+1])  ){   // 降順
        // cellの交換
        tmp = cell[i]; cell[i] = cell[i+1]; cell[i+1] = tmp;
        // rowの交換
        tmp = row[i]; row[i] = row[i+1]; row[i+1] = tmp;
        // 交換をしたのでソート終了ではない
        finish_sort = false;
      }
    }
  }
}
// テーブルの書き換え
function replaceTable(){
  // tbody要素
  var tbdy = document.getElementById("tbdy");
  // tbody要素の行を削除
  for( i=0; i<n_rows; i++ ){
    tbdy.removeChild(row[i]);
  }
  // tbody要素の行を追加
  for( i=0; i<n_rows; i++ ){
    tbdy.appendChild(row[i]);
  }
}
function SetStyle(){
	var TRS = document.getElementsByTagName("tr");
	
	for(i=1; i<TRS.length; i++){
		var number = i;
		if(number%2 == 1){
			//listN = 0;
			TRS[i].className = "list0";
		}else{
			//listN = 1;
			TRS[i].className = "list1";
		}
	}
}
// -->
</script>
</head>
<style type="text/css">
BODY,DIV,TABLE,THEAD,TBODY,TFOOT,TR,TH,TD,P { 
	font-family:"MS P ゴシック"; font-size:x-small
}
TR,TH,TD { border: 1px ridge; border-collapse: collapse;}
tr.list  {
	background-color:#ccccff;
	padding-left:3px;
	padding-right:3px;
	white-space:nowrap;
	font-weight:bold;
}
tr.list0 {
	background-color:#ffffff;padding-left:3px;font-size:x-small
}
tr.list1 {
	background-color:#ccffcc;padding-left:3px;font-size:x-small
}
</style>
<body>
<body text="#000000">
<table frame=box cellspacing=0 cols=6 rules=groups border=1>
<colgroup><col width=86></colgroup>
<colgroup><col width=86></colgroup>
<colgroup><col width=334></colgroup>
<colgroup><col width=86></colgroup>
<colgroup><col width=143></colgroup>
<colgroup><col width=85></colgroup>
<colgroup><col width=30></colgroup>
<thead>
<tr class='list'>
<th rowspan=2 width=15 height=34 align=center valign=middle>No
<span onclick='sortTable(0,true)'>▲</span>
<span onclick='sortTable(0,false)'>▼</span></th>
<th rowspan=2 width=65 align=center valign=middle> ISBN 
<span onclick='sortTable(1,true)'>▲</span>
<span onclick='sortTable(1,false)'>▼</span></th>
<th rowspan=2 width=270 align=center valign=middle> 書名 
<span onclick='sortTable(2,true)'>▲</span>
<span onclick='sortTable(2,false)'>▼</span></th>
<th rowspan=2 width=130 align=center valign=middle> 著訳者名 
<span onclick='sortTable(3,true)'>▲</span>
<span onclick='sortTable(3,false)'>▼</span></th>
<th rowspan=2 width=85 align=center valign=middle> 出版社名 
<span onclick='sortTable(4,true)'>▲</span>
<span onclick='sortTable(4,false)'>▼</span></th>
</tr>
</thead>
<tbody id="tbdy">

<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">1</td>
	<td align=middle valign=middle>4893116487</td>
	<td align=left valign=middle>ゼロからはじめるJavaScript</td>
	<td align=left valign=middle>&nbsp;</td>
	<td align=center valign=middle>富士通オフィス</td>
</tr>

<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">2</td>
	<td align=middle valign=middle>4798013919</td>
	<td align=left valign=middle>JavaScriptリファレンス&逆引き</td>
	<td align=left valign=middle>井上 健語 著</td>
	<td align=center valign=middle>秀和システム</td>
</tr>

<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">3</td>
	<td align=middle valign=middle>4777512193</td>
	<td align=left valign=middle>基礎からのJava Script 第3版</td>
	<td align=left valign=middle>岡田 克司 著</td>
	<td align=center valign=middle>工学社</td>
</tr>
<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">4</td>
	<td align=middle valign=middle>4872836111</td>
	<td align=left valign=middle>HTMLとスタイルシートと少しだけJav</td>
	<td align=left valign=middle>&nbsp;</td>
	<td align=center valign=middle>エクスメディア</td>
</tr>
<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">5</td>
	<td align=middle valign=middle>487783818X</td>
	<td align=left valign=middle>JavaScriptワークブック</td>
	<td align=left valign=middle>相沢 裕介 著</td>
	<td align=center valign=middle>日教販</td>
</tr>
<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">6</td>
	<td align=middle valign=middle>4896272862</td>
	<td align=left valign=middle>JavaScriptハッカーズ・プログラ</td>
	<td align=left valign=middle>佐久嶋 ひろみ 著</td>
	<td align=center valign=middle>メディア・テッ</td>
</tr>
<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">7</td>
	<td align=middle valign=middle>483991740X</td>
	<td align=left valign=middle>JavaScript逆引きクイックリファ</td>
	<td align=left valign=middle>古籏 一浩 著</td>
	<td align=center valign=middle>毎日コミュニケ</td>
</tr>
<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">8</td>
	<td align=middle valign=middle>4839918724</td>
	<td align=left valign=middle>JavaScriptコンパクトリファレン</td>
	<td align=left valign=middle>蔵守 伸一 著</td>
	<td align=center valign=middle>毎日コミュニケ</td>
</tr>
<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">9</td>
	<td align=middle valign=middle>483991902X</td>
	<td align=left valign=middle>JScriptハンドブック</td>
	<td align=left valign=middle>佐藤 信正 著</td>
	<td align=center valign=middle>毎日コミュニケ</td>
</tr>
<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">10</td>
	<td align=middle valign=middle>4798010057</td>
	<td align=left valign=middle>HTML&CSS&JavaScri 改訂</td>
	<td align=left valign=middle>大藤 幹 著</td>
	<td align=center valign=middle>秀和システム</td>
</tr>
<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">11</td>
	<td align=middle valign=middle>4902444070</td>
	<td align=left valign=middle>null</td>
	<td align=left valign=middle>null</td>
	<td align=center valign=middle>null</td>
</tr>
<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">12</td>
	<td align=middle valign=middle>4798010049</td>
	<td align=left valign=middle>詳解 Java Script辞典 改訂版</td>
	<td align=left valign=middle>半場 方人 著</td>
	<td align=center valign=middle>秀和システム</td>
</tr>
<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">13</td>
	<td align=middle valign=middle>4844357808</td>
	<td align=left valign=middle>JavaScriptビジュアル・リファレ</td>
	<td align=left valign=middle>シーズ 編著</td>
	<td align=center valign=middle>インプレスコミ</td>
</tr>
<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">14</td>
	<td align=middle valign=middle>4883374033</td>
	<td align=left valign=middle>JavaScript&CGIレッスンブッ</td>
	<td align=left valign=middle>エビスコム 著</td>
	<td align=center valign=middle>ソシム</td>
</tr>
<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">15
	<td align=middle valign=middle>4902444046</td>
	<td align=left valign=middle>プログラミング問題集 1</td>
	<td align=left valign=middle>オープンナレッジ 著</td>
	<td align=center valign=middle>オープンナレッジ</td>
</tr>

<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">16</td>
	<td align=middle valign=middle>488309264X</td>
	<td align=left valign=middle>いますぐスタイルシート&JavaScri</td>
	<td align=left valign=middle>井上 健語 著	</td>
	<td align=center valign=middle>ジャストシステ</td>
</tr>
<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">17</td>
	<td align=middle valign=middle>4898145213</td>
	<td align=left valign=middle>コピーするだけですぐに使えるJavaSc</td>
	<td align=left valign=middle>立山 秀利 著</td>
	<td align=center valign=middle>ローカス</td>
</tr>
<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">18</td>
	<td align=middle valign=middle>4877830987</td>
	<td align=left valign=middle>JavaScriptはじめの一歩</td>
	<td align=left valign=middle>堀内 明 著</td>
	<td align=center valign=middle>日教販</td>
</tr>
<tr class="list0">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">19	</td>
	<td align=middle valign=middle>4886476708</td>
	<td align=left valign=middle>HTML演習</td>
	<td align=left valign=middle>SCCライブラリーズ</td>
	<td align=center valign=middle>エスシーシー</td>
</tr>
<tr class="list1">
	<td height=17 align=center valign=middle sdval="1" sdnum="1041;">20</td>
	<td align=middle valign=middle>4883993302</td>
	<td align=left valign=middle>Java Script入門</td>
	<td align=left valign=middle>斉木 勝信 著</td>
	<td align=center valign=middle>すばる舎</td>
</tr>
<!-- ********************************************************************** -->
</body>
</html>

しつこくテーブルのソート

今回は前回書いたソートのコードですが、本に載ってたコードにちょこちょこと書き足しただけなので著作権って大丈夫なのかなぁ? 一応サンプル集だったのでたぶん大丈夫かな?


<script type="text/javascript">
<!--
var cell = new Array();
var row = new Array();
var i, n_rows;

// ページのロード時に呼び出される関数initをセット

window.onload = init;

// ページのロード時に呼び出される関数
function init(){
  // tr要素
  var tr = document.getElementsByTagName('tr');
  // 見出し行を除く行の数
  n_rows = tr.length-1;
  // 見出し行を除くテーブルの行を配列rowに代入
  for( i=0; i<n_rows; i++ ){
    row[i] = tr[i+1];
  }
}
// col→列の番号、asc→昇順:true 降順:false
function sortTable(col, asc){
	if(col == 0){
		  
		  // ソート対象の列を配列cellに代入
		  for( i=0; i<n_rows; i++ ){
		    num = row[i].childNodes[col].firstChild.nodeValue;
		  	cell[i] = parseInt(num, 10);
		  
		  }
	}else{
	  // ソート対象の列を配列cellに代入
	  for( i=0; i<n_rows; i++ ){
	    cell[i] = row[i].childNodes[col].firstChild.nodeValue;
	  }
	}  
  // 配列cellの順に配列rowをソート
  sortData(asc);
  // テーブルの書き換え
  replaceTable();
  SetStyle();
}
// 配列cellの順に配列rowをソート
function sortData(asc){
  var tmp;
  var finish_sort = false;// 交換をしなければソート終了
  while(!finish_sort){
    finish_sort = true;
    for( i=0; i<n_rows-1; i++ ){
      if( (asc && cell[i]>cell[i+1]) ||     // 昇順
          (!asc && cell[i]<cell[i+1])  ){   // 降順
        // cellの交換
        tmp = cell[i]; cell[i] = cell[i+1]; cell[i+1] = tmp;
        // rowの交換
        tmp = row[i]; row[i] = row[i+1]; row[i+1] = tmp;
        // 交換をしたのでソート終了ではない
        finish_sort = false;
      }
    }
  }
}
// テーブルの書き換え
function replaceTable(){
  // tbody要素
  var tbdy = document.getElementById('tbdy');
  // tbody要素の行を削除
  for( i=0; i<n_rows; i++ ){
    tbdy.removeChild(row[i]);
  }
  // tbody要素の行を追加
  for( i=0; i<n_rows; i++ ){
    tbdy.appendChild(row[i]);
  }
}
function SetStyle(){
	var TRS = document.getElementsByTagName("tr");
	
	for(i=1; i<TRS.length; i++){
		var number = i;
		if(number%2 == 1){
			//listN = 0;
			TRS[i].className = "list0";
		}else{
			//listN = 1;
			TRS[i].className = "list1";
		}
	}
}	

// -->

サンプルHTMLを付ければいいのですが、
今日はちょっと眠いのでJavaScript部分のみです。