Snow Leopardクリーンインストール時のメモ

ウェブブラウザ

Firefox(http://mozilla.jp/firefox/)
拡張機能

ターミナル

iTerm(http://iterm.sourceforge.net/)

ファイラ

TotalFinder(http://totalfinder.binaryage.com/)

FTP/SFTPクライアント

Transmit(http://www.panic.com/jp/transmit/)

Tex環境

以下のページを参考にインストール
(http://www.geocities.jp/ball_rw/tex/install_snowleopard_new.html)

MacPorts

http://www.macports.org/install.php
インストール後に、

sudo port selfupdate

zsh

zshはバージョンは4.3.*でないと日本語入力が文字化けするみたいなのでdev版をインストール

% sudo port install zsh-devel

インストール後に/etc/shellsに下記を追加

/opt/local/bin/zsh

最後に通常使用するシェルをzshに変更

% chsh -s /opt/local/bin/zsh  

MySQL+Senna

こちらの記事を参考にインストール
http://www.rottel.net/kuwa/book/12/34123

zlibのインストールではまった場合は、

% sudo port clear --dist zlib
% sudo port install zlib +universal

その後

% sudo port install mysql5-server 
% sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist

MySQLの初期設定は、

% sudo -u _mysql mysql_install_db5
% /opt/local/bin/mysqladmin5 -u root password 'newpassword'

Python

MacPortsでインストール後に /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/sitecustomize.py を作成し

import sys
sys.setdefaultencoding('utf-8')

を記述してデフォルトのエンコーディングを指定しておく

MySQL-Python

py26-mysqlだとデフォルトのmysql5をインストールしてしまうので,http://sourceforge.net/projects/mysql-python/ からmysql-pythonをダウンロード

インストール時に,
site.cfgの[option]タブに

 mysql_config = /opt/local/lib/mysql5/bin/mysql_config

を追加して

% python setup.py build
% sudo python setup.py install 

その他

apache2
pTex +utf8+no_x11

Firefox拡張機能作成のためのtips

Firefox拡張機能を作成する際に,意外とサンプルコードが少なくてちょっと戸惑った機能に関するメモ.
ちなみにバージョンは3.5.5

設定をabout:configに保存

FUELを利用.

var Application = Components.classes["@mozilla.org/fuel/application;1"].getService(Components.interfaces.fuelIApplication);
var value = Application.prefs.getValue("extensions.hoge.key",null); //データの取得
Application.prefs.setValue("extensions.hoge.key",value); //データの保存

複雑なデータはtoSource()などを用いて文字列化し,eval()して利用するのが簡単.
(もちろんセキュリティのチェックが必要)

JavaScriptからlocale内の文字列を扱う

.propertiesファイルを用意し,スクリプトから読み込む.

1. hoge/locale/ja-JP/hoge.properties を用意
用意する.propertiesファイルはこんな形式

HELLO=こんにちは
QUIT=終了

2. スクリプト内からhoge.propertiesを読み込み,使用したい文字列をGetStringFromNameを使用して取得

var bundle = srGetStrBundle("chrome://hoge/locale/hoge.properties");
alert(bundle.GetStringFromName("HELLO"));

実際にはもっと高機能な関数がいろいろと存在.
書式付き文字列や,引数の値によって出力を変えることなどもできる.

現在ユーザが閲覧しているアクティブなページのdocumentオブジェクトを取得

var Application = Components.classes["@mozilla.org/fuel/application;1"].getService(Components.interfaces.fuelIApplication);
var activeDocument = Application.activeWindow.activeTab.document;

リンクテキスト中の文字列を選択するGreasemonkey Script

最近開発の関係上アンカーテキスト中の文字列を選択する必要が増えてきました.
ところが,Firefoxではアンカーテキスト中の文字列を選択するには,

  • Altキーを押しながら選択
  • キャレットブラウズモード

の2種類しか(僕の知る限り)方法が無く,
ただ単にリンク中の文字列を選択するだけなのですが,これが意外とストレスのたまる作業だったりします.

そのためのGreasemonkeyスクリプトを探してみたのですが,
あまりこれだというscriptが無いようなので作成してみました.

インストール
anchor text selector (userscrits.org)

インストールすると,こんな文字列がこんな感じに選択できるようになります.

ソース
ざっと作成したので不具合等ありましたらコメントお願いいたします.
初めてのグリモンなのでソースはかなり汚いと思います….

// ==UserScript==
// @name           anchor text selector
// @namespace      http://rerank.jp
// @author         Takehiro Yamamoto <tyamamot at dl.kuis.kyoto-u.ac.jp>
// @description    This script enables user to select some text from a link 
// @include        *
// ==/UserScript==

(function(){

X = 0;
Y = 0;

//thresholds
offsetX = 5;
offsetY = 3;
function removeAnchor(anchor){
	if (anchor && anchor.tagName && anchor.tagName.toLowerCase() == "a"
				&& anchor.getAttribute('href')) {
		anchorNode = anchor;
		anchorHref = anchor.getAttribute('href');
		anchor.removeAttribute('href');
		anchorNode.addEventListener("mousemove",onAnchorMove,true);
		anchorNode.addEventListener("click",onAnchorClick,true);
	}		
}

function restoreAnchor(){
	if(anchorNode){
		anchorNode.setAttribute("href",anchorHref);
		anchorNode.removeEventListener('mousemove',onAnchorMove,true);
		anchorNode = null;
		anchorHref = null;
	}
}

function onMouseDown(event){
	if(event.which != 1) return;
	var sel = window.getSelection().toString();
	if(sel && sel.length > 0){
		return;
	}
	var element = event.target;
	var anchor = getAnchorNode(element,0);
	if(anchor){
		removeAnchor(anchor)
	}
	X = event.screenX;
	Y = event.screenY;
}

function onAnchorMove(event){
	if(event.which != 1) return;
	restoreAnchor();
}

function onAnchorClick(event){
	if(event.which != 1) return;
	var sel = window.getSelection().toString();
	restoreAnchor();
	if(sel && sel.length > 0){
		moveX = Math.abs(event.screenX - X);
		moveY = Math.abs(event.screenY - Y);
		if(moveX > offsetX || moveY > offsetY){
			event.target.removeEventListener('click',onAnchorClick,true);
			event.preventDefault();
		}
	}
}

function getAnchorNode(element,depth){
	if (depth > 5) return null;
	if(element && element.tagName && element.tagName.toLowerCase() == "a"){
		return element;
	}
	if(element.parentNode){
		return getAnchorNode(element.parentNode,depth + 1);
	}
	else{
		return null;
	}
}


window.addEventListener('load', function(event){
	document.body.addEventListener('mousedown',onMouseDown,true);
},true);
}());

2009年7月25日追記:
より精度良く動作するようにコードを修正