Snow Leopardクリーンインストール時のメモ
ターミナル
ファイラ
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)
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
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日追記:
より精度良く動作するようにコードを修正