Home > ソフトウェア

ソフトウェア アーカイブス

Firefox3からFirefox4への移行

先日,待望のFirefox4が登場しました.主な変更点としてはHTML5対応,Jaeger MonkeyによるJavaScriptの高速化などがあげられると思います.革新的なUIは別にどうでもいいです.そんなFirefox4はbeta12あたりからちらちらと確認はしていましたが,アドオンが正式対応ではなかったので,移行はしていませんでした.このたび,どうやら大半のアドオンが対応し,移行しても問題ない状況になったようなので,勢い勇んでFirefox3からFirefox4へ移行しました.ただし,アップグレードではUIがおかしくなった(カスタマイズしすぎている所為だと思うけどどれが原因か特定できなかった)ので,新規のFirefox4を入れて,環境を再構築しました.なお,導入したのは,普通のFirefox4ではなく,Firefox4のPortable Editionです.環境が固まったら,ディレクトリごと丸々コピーで職場も自宅も安心ね!

まっさらなFirefox4

何もカスタマイズしていないまっさらなFirefox4はこのような感じです.良く覚えておいて下さい.これが原形をとどめないくらいにカスタマイズされちゃいますから!

アドオン

まずは,何はなくとも素のFirefoxなんて使えませんので,アドオンを投入しまくります.

Tomblooは最新の0.4.22を入れてます.GreasemonkeyはFirefox4対応が0.9.1になっているので,渋々0.9.1を導入しました.これは後述します.Proxy Selectorはなんでも良かったのですが,1番最初に目に付いたので.userChromeJSはv1.3がFirefox4対応になっています.これも後述します.Organize Status BarはFirefox4未対応になっているので,互換性チェックを回避して動かしています.方法は以下の通り.

379 名前:名無しさん@涙目です。(神奈川県)[sage] 投稿日:2011/03/23(水) 02:00:32.47 ID:vMmsrVAf0
about:configでextensions.checkCompatibility.4.0をつくってfalseにすればアドオン入れなくても
過去のアドオンほとんど使える

秒速ニューろぐ Firefox4ゴミ過ぎわろたwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwうぇ

なお,Sxipperは互換性チェックを回避しても動きません.困りましたね.

userChromeJS

userChromeJSは強力なカスタマイズ環境を提供します.これが使えると,アドオンを入れなくても色々なことができます.導入しているスクリプトは以下の通り.

うーん.リンク切れで見つからないスクリプトがありますね・・・.大事に保存していかなければ.LaunchIE.uc.jsはIE viewと同等の機能を持つものです.MouseGesture2.uc.jsはいわゆるマウスジェスチャーです.必要なら声をかけて頂ければ.

Stylish

cssで見た目などを大きく変更することが可能になるStylishです.userchrome.cssも同じ役割ですが,まぁその辺は深く考えずに・・・.

Google Reader メニュー消しはたぶんオリジナルです.以下のようなコードです.

@-moz-document url-prefix(https://www.google.com/reader),
url-prefix(https://www.google.co.jp/reader),
url-prefix(http://www.google.com/reader) {
#overview-selector,??????? /*ホーム*/
#trends-selector,????????? /*トレンド*/
#your-items-tree-container,/*コンテンツ*/
#directory-selector,
#friends-tree-container,?? /*友だちの共有アイテム*/
.s                         /*スペーサ*/
{display:none !important;}
}

userchrome.css

うーん.よく考えるとuserchrome.cssに書かなくてもStylishに書けばいいような気もしますが,絶対的に適用させたいので,ここに書いておきましょう.書いたのはメニューバーを移動させた後の微調整として,これの6番を書いてあります.

#main-window[sizemode=normal][tabsontop]
#appmenu-button-container {
  position: fixed !important;
  z-index: 2 !important;
}
#main-window[sizemode=normal][tabsontop]
#toolbar-menubar[autohide="true"]{
  margin-top:-14px;
  -moz-padding-start:70px!important;
  margin-left:-100px !important;
}
#main-window[sizemode=normal]
#navigator-toolbox[tabsontop] > #toolbar-menubar[autohide] ~ #TabsToolbar {
  -moz-padding-start:85px!important;
  -moz-padding-end:110px!important;
  margin-left:-85px !important;
}

『Firefox 4』のインターフェイスにまつわる7つのイライラとその修正方法 : ライフハッカー[日本版]

Greasemonkey

さて,ここがFirefox4最大の難関でした.主にはFirefox4対応のGreasemonkey0.9.1がやっかいで,いくつかのGreasemonkeyスクリプトが動かなくなっています.その問題を解決する手段がありますので,後述します.まずは,導入しているスクリプトは以下の通り.

ここで,Greasemonkey0.9.1上では,MinibufferとLDRizeが正しく機能しないはずです.そこで,対策パッチを当てます.Greasemonkey0.9.1にパッチを当てます.常識なので知っていると思いますが,xpiファイルは単なるzipファイルですので,greasemonkey-0.9.1-fx.xpiをダウンロードして,それを拡張子を変えるなりなんなりして,とにかく解凍します.解凍されたフォルダ内のcomponents/greasemonkey.jsを以下のように修正します.

--- a/components/greasemonkey.js
+++ b/components/greasemonkey.js
@@ -255,6 +255,9 @@ GM_GreasemonkeyService.prototype = {
     var xmlhttpRequester;
     var resources;
     var unsafeContentWin = wrappedContentWin.wrappedJSObject;
+    var sharedWindow = {};
+    sharedWindow.window = sharedWindow;
+    sharedWindow.__proto__ = new XPCNativeWrapper(unsafeContentWin);

     // detect and grab reference to firebug console and context, if it exists
     var firebugConsole = this.getFirebugConsole(unsafeContentWin, chromeWin);
@@ -297,6 +300,7 @@ GM_GreasemonkeyService.prototype = {
                                                 "registerMenuCommand",
                                                 unsafeContentWin);

+      sandbox.window = sharedWindow;
       // Re-wrap the window before assigning it to the sandbox.__proto__
       // This is a workaround for a bug in which the Security Manager
       // vetoes the use of eval.

Firefox 4.0b10でGreasemonkey 0.9.1のユーザスクリプトのwindowを共通にする改造(開発者orVimper向け) – wltの日記

修正したら,全ファイルとフォルダを選択し,zipで圧縮します.ここで,上位階層のフォルダを圧縮してもダメです.カレントフォルダにファイルが置いてある階層で圧縮して下さい.出来上がったら拡張子をxpiに変更して余裕です.簡単です.

続いて,Minibufferを修正しましょう.Minibufferの2009.12.06版に対して,以下のパッチを当てます.

@@ -815,7 +815,7 @@
 // http://userscripts.org/scripts/show/11996
 // slightly modified.
 var FlashMessage = new function(){
-       GM_addStyle(<><![CDATA[
+       GM_addStyle((<><![CDATA[
                #FLASH_MESSAGE{
                        position : fixed;
                        font-size : 500%;
@@ -833,7 +833,7 @@
                        min-width : 1em;
                        text-align : center;
                }
-       ]]></>)
+       ]]></>).toString());
        var opacity = 0.9;
        var flash = $N('div',{id:'FLASH_MESSAGE'});
        hide(flash);

Firefox 4.0b8~b9 でLDRize (Minibufferの修正) – wltの日記

これで完璧です.

201103291243追記

pしたものがoで複数開けない問題(主にgoogleなど)は以下のパッチで余裕の模様.オリジナルのMinibufferは2009.12.06版

--- 11759.user.js       Tue Mar 29 12:42:48 2011
+++ 11759_2.user.js     Tue Mar 29 12:44:37 2011
@@ -1645,7 +1645,7 @@
        if(target){
                window.open(url, target);
        }else{
-               GM_openInTab(url);
+               window.open(url);
        }
 });
 return stdin;

Commit dab8e5a44a71eba69630d08499ebc52d51b1fcf4 to swirhen/config – GitHub via Firefox 4時代のVimperator – retletのvimperator – vimperatorグループ

フルカスタマイズされたFirefox4

そしてフルカスタマイズされてしまったFirefox4はこんな感じです.

関連

イサム開発で使ったプログラミング等のTips

イサムの開発にあたって,いくつかの新しいテクニックを用いたので,新旧あわせて使ったテクニックを紹介したいと思います.

mod_rewriteでGETパラメータを変換

例えば,以下のようなURLを考えます.

http://4403.biz/ISAM/organization/NEC/

なんとなくパーマリンクっぽくて素敵ですよね.でも,この実体は以下のように処理したいと考えます.

http://4403.biz/ISAM/hoge.php?mode=organization&query=NEC

この変換をmod_rewriteで実現します.まぁ,Wordpressとかで使われている常套句ですね.mod_rewriteが有効な状態で,.htaccessに以下のように書きます.

RewriteEngine on
RewriteBase /ISAM/
RewriteRule "^(.*)/(.*)/$" "hoge.php?mode=$1&query=$2" [L]

簡単ね!ご存じだとは思いますが,これにGETパラメータがさらにくっつくような状況下では,QSAフラグも付けましょう.

hoge.phpでは受け取ったGETパラメータによって処理を振り分けたらいいと思います.これで実体を隠蔽しつつ,パーマリンクっぽいURLも提供できて,なんだかすごくいい感じです.クールURI!

mod_rewriteのBフラグ

上記の設定の後に,以下のようなアクセスを想定しましょう.

http://4403.biz/ISAM/organization/KDDI R&D Labs./

なんとなく上手くいかなさそうな気配がぷんぷんしますよね?実際にやってみると,このように展開されます.

http://4403.biz/ISAM/hoge.php?mode=organization&query=KDDI R&D_Labs_=

なんだか変なことになっている.紐解きましょう.GETパラメータがどうなっているかというと以下の通りです.

mode=organization
query=KDDI R
D_Labs_=

おい!って話ですね.問題点はR&Dの&をGETパラメータの接続詞と解釈してしまっています.解釈してしまっていますというか,それで正しいわけですが・・・.単純な解決策はURLエンコードです.しかし,そのためには,以下のようなアクセスを想定することになります.

http://4403.biz/ISAM/organization/KDDI%20R%26D%20Labs%2e/

こんなの恥ずかしくて見せられない!ということで,これをmod_rewrite中に実現したいわけですね.で,調べてみるとあるんですよ,これが.apache2.2.6以降らしいですが,Bフラグというものがあります.以下,引用.

B‘ (escape backreferences)
Apache has to unescape URLs before mapping them, so backreferences will be unescaped at the time they are applied. Using the B flag, non-alphanumeric characters in backreferences will be escaped. For example, consider the rule:
RewriteRule ^(.*)$ index.php?show=$1
This will map /C++ to index.php?show=/C++. But it will also map /C%2b%2b to index.php?show=/C++, because the %2b has been unescaped. With the B flag, it will instead map to index.php?show=/C%2b%2b.
This escaping is particularly necessary in a proxy situation, when the backend may break if presented with an unescaped URL.

mod_rewrite – Apache HTTP Server

簡単ね!というわけで,先ほどのRewriteRuleにBフラグを追加すると,こんなアクセスが来ても,

http://4403.biz/ISAM/organization/KDDI R&D Labs./

こんな風に渡されるので,

http://4403.biz/ISAM/hoge.php?mode=organization&query=KDDI%20R%26D%20Labs%2e

hoge.php側では$_GET[‘query’]をurldecodeしておけばいいですね.いい時代だね~.

memcachedの導入

インクリメンタルサーチでゴリゴリ検索させています.基本的にかなりの力業実装です.ですので,負荷を減らすためにキャッシュは重要になります.当初はMySQLのキャッシュ機能とAPCに丸投げしていたのですが,DBの更新が無ければ結果は不変なので,まるっとキャッシュしてしまえばいいのではないかと思ったので,memcachedしました.初挑戦です.

そもそもmemcachedとは何かといえば,以下のようなものだそうです.

Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.

memcached – a distributed memory object caching system

ということで目的にピッタリです.で.基本的な使い方を確認しましょう.PHPではpecl::memcacheを使うのがいいのかな?似たものにpecl::memcachedもあります.よくわかりません.今回はmemcacheを使います.基本的な使い方は以下の通りです.

$mem = new Memcache;
$mem->addServer('localhost', 11211);
$val = $mem->get($key);
if(!$val) {
  //$valを作る作業
  $mem->add($key, $val, MEMCACHE_COMPRESSED, 3600);
}
$mem->close();

簡単ですね.これを応用して,イサムをキャッシュしまくります.方針としては,$keyをSQLクエリにして,$valをHTML出力文字列としています.つまりは,SQLクエリをキーにしてページフルキャッシュとほぼ同等です.これでキャッシュにヒットすればサックサクのはずです.

これをよくよく考えると,実行時間命なシステムでDBへの書き込みや更新がボトルネックになっている場合,とりまmemcachedにはき出しておいて,別プロセスで非同期にmemcachedから取り出してDBに格納するとかしてレイテンシを隠蔽できそう.そんなクリティカルなシステムを作ったことないですけどね.

エスケープとか

エスケープも別に珍しいことはしてなくて,strip_tagsやらmysql_escape_stringやらhtmlentitiesやらを使ってます.「エスケープは出力時に」という基本に忠実です.SQL文の構築はプレースホルダーを用いているので,そんなに変なことは起きないはずだと信じてます.攻撃しないで!

PHPの小ネタ

PHPはHTMLの中に直接スクリプトが書けるという実に変態な言語なので,様々な変態テクニックが駆使可能です.例えば,if文の途中でphp終了タグでぶった切って,HTMLを出力(というかそのまま表示)して,php開始タグで再びif文に復帰するとかいう常識的に考えられないような変態スーパーテクニックが利用可能です.可読性?なにそれ?誰が読むの?

それはそれとして,多少便利なものとしては,includeを用いたページ分割です.include命令によって別のphpファイルを読み込む(C言語の#includeのように)ことができるので,共通であるヘッダ部とフッタ部を別ファイルに分割することで,コード修正時の修正範囲を限定的にすることができます.ちなみに,これはHTMLヘッダ部でもできますので,かなり応用が利きますよ.

スーパーテクではありませんが,jQueryと組み合わせてajaxでインクリメンタルサーチやサジェストを実現しています.

拡張子を残してファイル名をSHA1ハッシュ値に置き換えるワンライナー

どうでもいいことといえば,どうでもいいことなのですが.ダウンロードしたデータが破損していないかどうかチェックしたいなぁと思ったとき,ハッシュ値でチェックしますよね.一般的にはチェック用のSHA1SUMファイルが置いてあったりしますが,1ファイルでそんなに厳密になんだかんだっていうか,どうしても1ファイルにしたいの!っていうときに,ファイル名をハッシュ値にしちゃえばいいじゃんって安易に思うわけです.そんなときに使うワンライナーです.検証側はまだ書いてないw.オレが検証するわけじゃないので・・・.

sha1sum $1 |
awk '{
  fn=$2;
  gsub(/^([^\.]*)/,$1,$2);
  printf ("mv %s %s\n",fn,$2);
}' |
sh

簡単ね!

Adobe Reader X対応のpdfopenとpdfclose

先日,Adobe Reader XとDDE通信できない旨のエントリを書きました.我々dvipdfmx使いとしては狂気の沙汰であり,論文を書く気力が5000分の1まで急落しました.渋々Adobe Reader 9に戻すことで対応していたのですが,この度,解決方法が判明したので,解決策を公開します.ぶっちゃけ,タイトルは半分合ってて半分釣りです.厳密にはAdobe Reader X専用のpdfopen/pdfcloseを作ったが正解です.

解決手段

Please change your application to use following servername for Acrobat/Reader instead of “acroview” try the following:

For Reader X Use DDE_SERVERNAME = acroviewR10

For Acrobat X Use DDE_SERVERNAME = acroviewA10

Adobe Forums: Reader X: DDE Open command can open…

というわけで,まさにこのまんまなのですが,DDE通信できなかったのは,DDEサーバ名が変更になったからです.単純な話です.ですので,DDEサーバ名を変更すればokです.

え?pdfopen/pdfcloseにそんな設定項目はないですよね?ということは・・・.ソースを弄るしかないです.ではソースはどこにあるのか?探しました.見つかりました.オリジナルソースは同梱されていますが,ウェブ上にソースを頼るなら,これでしょうか?どちらでも構いませんが.

対処方法

対処方法も何も明らかなので,サクッと説明します.36行目を以下のように書き換えます.

変更前:

#define ACROBAT	"acroview"

変更後:

#define ACROBAT	"acroviewR10"

簡単ね!あとは,同梱されているbuild.batを実行してpdfopen.exeとpdfclose.exeを作成して,既存のpdfopen/pdfcloseと置き換えればオッケー牧場.なお,build.batはclコマンドを使っていますので,Microsoft Cコンパイラ想定です.VC2010Express辺りを使ったらいいんじゃないでしょうか.わかる人は他のコンパイラでも良いと思います.

配布

ライセンスにはAcrobat (r) Plug-ins Software Development Kit License Agreementと書かれているのですが,同名のライセンスが見つかりません.Adobe Acrobat SDK License Agreementでいいですかね?わかりません.よく解ってませんが,元に倣って,ソースとバイナリを一式公開します.コンパイル環境はWindows 7 x64のVisual Studio 2008です.対象はAdobe Reader Xです.Adobe Reader 9以前では動きません.

Adobe Reader X対応pdfopen/pdfclose ソースファイルおよびバイナリ一式元ソース

201012151750追記
2010年12月7日付けの更新で,pdfopen/pdfcloseが更新され,Adobe Reader Xに対応しました.ソースはW32TeXのChangeLog.というわけで,私の活動は役割を終えました.

Adobe Reader XとDDE通信できない件

Adobe Reader Xが登場したわけですが,dvipdfmxを駆使しまくって論文を書く人はアップデートすると「むぎゃ!」ってなります.Adobe Reader 9を使い続けた方がいい気がします.

発生する問題

Adobe Readerは開いているpdfをロックするので,dvipdfmxで確認して,編集して,platexからdvipdfmxしようとすると失敗します.そのため,dvipdfmx前にpdfを閉じる必要があります.従来ではpdfopen/pdfcloseを利用して実現できていましたが,Reader XとDDE通信ができず,pdfファイルを開いたり閉じたりできなくなっていて,「むぎゃ!」ってなります.論文を書く気力が8割減です.

関係する情報

推奨される対策

Adobe Reader 9を使い続ける.

201011281415追記:

Please change your application to use following servername for Acrobat/Reader instead of “acroview” try the following:

For Reader X Use DDE_SERVERNAME = acroviewR10

For Acrobat X Use DDE_SERVERNAME = acroviewA10

Adobe Forums: Reader X: DDE Open command can open…

5 / 512345

ホーム > ソフトウェア

アフィリエイト

Return to page top