2011/07/22
chmod するときのパーミッション値を計算するツールを作成してみた

ファイルのパーミッションを変えるのに、chmod するとき、オーナーだけに実行権限を与えたいんだけど、パーミッションの値を考えるのが面倒でついchmod +x hogehoge とかやってしまいがちですよね。(僕だけ?)

で、ふと思いついてjavascriptでちょちょっと作ってみました。

http://www.easy-small-world.com/chmod.html

チェックボックスを入れていくと、000~777の8進数のパーミッション値を作ってくれます。
また、テキストボックスに直接数字を入れると、チェックボックスのほうをその値に合わせてつけたりはずしたりします。
FFFTPの属性変更するダイアログっぽいですが、それはそのダイアログを見ながら作ったからです(笑)

発表するほどのものでもないですが、せっかく作ったので後で自分で使えるように置いておくことにします。


2010/07/15
Thunderbirdのアドレス送信前確認プラグイン Confirm-Address のバグを勝手にFixしてみる。

注意:現在、このエントリーで書いた不具合は解消されています。 こちらから最新バージョンをダウンロードされることをおすすめします。


Thunderbirdのプラグインで、メールを送信する前に送信先を確認することができる、
Confirm-Addressというのがあるのですが、Thunderbird2で使っていたときは何も問題なく使えていたのが、Thunderbird3になっていくつか不具合があり、対応されるのを待っていたのですが、半年以上放置されているようなので、それならばと自分で不具合を修正してみました。

Thunderbirdのプラグインは全く作ったことがなかったのですが、xpiファイルがただのzipファイルらしいことと、動作の制御部分は全部javascriptで書かれてあるらしいということがドキュメントを読んでわかったので、ちゃちゃっと挑戦してみました。

※なお、以下の方法でご自分の環境に適用される場合は自己責任でお願いします。
 万が一Thunderbirdが壊れてしまっても責任は負えません。(ないとは思いますが)

■xpiファイルを解凍する

上に書いたように、xpiファイルはただのzipファイルなので、ダウンロードしたconfirm-address-1.2.3-tb.xpiを 適当なファイル圧縮・解凍ソフトで解凍します。 すると、以下のファイルとフォルダが現れます。

chrome
lisense
chrome.manifest
install.rdf

chromeフォルダの下にプラグインを制御するための各種UIのファイルとJavaScriptのファイルがあります。

■組織内へのメールに全部チェックを入れるチェックボックスが効かない不具合の修正

chromeフォルダの下のconfirm-address-dialog.jsの109行目を修正します。

修正前:
var isCheck = !checkAll.checked;

修正後:
var isCheck = checkAll.checked;

チェックボックスのonClickイベントを拾って、チェックされているかを取得しているようなのですが、クリックしたことによってチェック状態が反転しているため、元のコードだと、逆になってしまい、うまく動いていなかったようです。

■Ctrl + Enter でメールを送信しようとした場合に、メールが送信されない不具合を修正

chromeフォルダの下のconfirm-address-overlay.jsを修正します。 普段、Ctrl + Enterのショートカットキーでメールを送信していたので、このショートカットキーが使えないのは結構なストレスでした。

ここでは、既存のメール送信制御をオーバーライドしているようなのですが、Thunderbird2から3に変わったときにここの実装が変わってしまったようで、新しい実装が取り込めていないようなので、オーバーライド元のソースから実装をコピペしました。
confirm-address-overlay.jsのソースを全部載せます。

//overlay
//C:\Program Files\Mozilla Thunderbird\chrome\messenger\content\messenger\messengercompose\MsgComposeCommands.js
function SendMessage()
{
	//add start
	if(!ConfirmAddress.checkAddress()){
		return;
	}
	//add end
/* //ここをコメントアウト
  dump("SendMessage from XUL\n");
  GenericSendMessage(nsIMsgCompDeliverMode.Now);
*/
  //ここから下を追加
  let sendInBackground =
    Components.classes["@mozilla.org/preferences-service;1"]
              .getService(Components.interfaces.nsIPrefBranch)
              .getBoolPref("mailnews.sendInBackground");

GenericSendMessage(sendInBackground ?
nsIMsgCompDeliverMode.Background :
nsIMsgCompDeliverMode.Now);
//追加ここまで
}

//overlay
//C:\Program Files\Mozilla Thunderbird\chrome\messenger\content\messenger\messengercompose\MsgComposeCommands.js
function SendMessageWithCheck()
{
//add start
if(!ConfirmAddress.checkAddress()){
return;
}
//add end
/* //ここをコメントアウト
var warn = sPrefs.getBoolPref("mail.warn_on_send_accel_key");

if (warn) {
var checkValue = {value:false};
var buttonPressed = gPromptService.confirmEx(window,
sComposeMsgsBundle.getString('sendMessageCheckWindowTitle'),
sComposeMsgsBundle.getString('sendMessageCheckLabel'),
(gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) +
(gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1),
sComposeMsgsBundle.getString('sendMessageCheckSendButtonLabel'),
null, null,
sComposeMsgsBundle.getString('CheckMsg'),
checkValue);
if (buttonPressed != 0) {
return;
}
if (checkValue.value) {
sPrefs.setBoolPref("mail.warn_on_send_accel_key", false);
}
}

GenericSendMessage(gIsOffline ? nsIMsgCompDeliverMode.Later
: nsIMsgCompDeliverMode.Now);
*/
//ここから追加
var warn = getPref("mail.warn_on_send_accel_key");

if (warn) {
var checkValue = {value:false};
var bundle = document.getElementById("bundle_composeMsgs");
var buttonPressed = gPromptService.confirmEx(window,
bundle.getString('sendMessageCheckWindowTitle'),
bundle.getString('sendMessageCheckLabel'),
(gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) +
(gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1),
bundle.getString('sendMessageCheckSendButtonLabel'),
null, null,
bundle.getString('CheckMsg'),
checkValue);
if (buttonPressed != 0) {
return;
}
if (checkValue.value) {
var branch = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);

branch.setBoolPref("mail.warn_on_send_accel_key", false);
}
}

let sendInBackground =
Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch)
.getBoolPref("mailnews.sendInBackground");

GenericSendMessage(gIsOffline ? nsIMsgCompDeliverMode.Later :
(sendInBackground ?
nsIMsgCompDeliverMode.Background :
nsIMsgCompDeliverMode.Now));
//追加ここまで
}


■ついでにThunderbird3.1でも使えるようにする


最初に解凍して出てきた、install.rdfを修正します。

Confirm-Addressプラグインは3.0までの対応だったので、3.1でも使えるように互換情報を書き換えました。
互換情報を書き換えただけで、3.1に合わせてプログラムを変更したわけではないので、使えない可能性もありますが、今のところうまく動いているので良しとします。

13行目の、em:maxVersionのタグの3.0.*の部分を、3.1.*に変更します。

修正前:
<em:maxVersion>3.0.*</em:maxVersion>

修正後:
<em:maxVersion>3.1.*</em:maxVersion>


また、このプラグインのバージョンが1.2.3の改造版であることがわかるようにするため、
7行目の、em:versionのタグの1.2.3の部分を、1.2.3-altとしました。

修正前:
<em:version>1.2.3</em:version>

修正後:
<em:version>1.2.3-alt</em:version>


最後にもういちどzipファイルに圧縮する


プラグインの改造はこれで終了です。
修正したファイルをプラグインとして使用できるように、もう一度zipファイルに圧縮しなおします。
フォルダを作らずに、最初に解凍された構成のまま圧縮されるように注意してください。
圧縮ファイルをリネームして、confirm-address-1.2.3-alt-tb.xpiとでもすれば完成です。


confirm-address-1.2.3-alt-tb.xpi
配布してしまって良いものか若干迷いましたが、とりあえずファイルを置いておきます。
不適切な場合はinfo@easy-small-world.comまでご連絡ください。

不具合対応版のVersion1.2.4が本家からリリースされましたので、ファイルは削除しました。
本家からダウンロードされるようお願いします。


2010/07/08
続・サーバメンテナンスのお知らせ(完了しました)

サーバのメンテナンス、というか移設が終わったようです。
PHPのバージョンが4から強制的に5に変わるわ、.htaccessが使えなくなるわで
いろいろトラブルもありましたが、ひとまずブログもリマインダーも動くようになったようです。
先ほどまでPHPがSafeModeで動いていて、メールの送信が出来ていなかったようです。
おそらく7/7 14:00ごろ~7/8 1:00ごろのリマインダーが働いていないと思われます。
ご迷惑おかけしました。
先ほどテストしたところ、正常にメールが送れるようになっていましたので、もう大丈夫だと思います。
なにかお気づきの点がありましたら、info@easy-small-world.comまでご連絡ください。


2010/07/06
サーバーメンテナンスのお知らせ

このブログと、EasyReminderを運用しているレンタルサーバーの移設に伴い、一時EasyReminderが利用できなくなる可能性があります。
移設の完了後にこちらでいろいろ作業が発生するようで、もしかしたらちょっとの間利用できない日が続くかもしれません。
なるべく早く対応するつもりですのでご理解とご協力お願いいたします。

メンテナンス予定日時:
7/7(水) 9:00~18:00


2010/05/15
EclipseのようなIDEのように選択範囲をコメント化/解除する秀丸マクロ

なぜかちょっとだけマイブームの秀丸マクロで選択範囲を"//"でコメント化とコメント化解除するマクロを作ってみました。
探せばありそうな気がとてもしたけど、気にせず作っちゃいました。
タイトルはEclipseのようなと書きましたが、動きはZend Development Environmentに合わせました。
選択範囲の最初の行の先頭が"//"以外の場合は選択範囲全てをコメント化します。
選択範囲の最初の行の先頭が"//"の場合は、選択範囲の行の先頭の"//"を削除します。

マクロを登録し、Ctrl + / のショートカットキーを割り当てるとIDEと同じ操作でコメント化できます。

comment1.mac(1.8kb)

//EclipseなどのIDEのように、単一行もしくは複数行をコメント化・コメント解除するマクロ


//範囲選択中の場合は、選択範囲の行すべてコメント化する。
if(selecting) {
	//現在の選択範囲を退避
	#tmp_seltopx = seltopx;
	#tmp_seltopy = seltopy;
	#tmp_selendx = selendx;
	#tmp_selendy = selendy;
	
	//一旦選択範囲を解除
	escape;
	
	//選択範囲の開始行から終了行までコメントにしていく
	#i = #tmp_seltopy;
	
	//行の先頭へ移動
	moveto 0, #i;
	//先頭行がコメント("//")かどうかのフラグ
	#comment_flag = false;
	//選択範囲を再設定する際のカーソルオフセット
	#offset = 2;
	if(code == 0x2F) { //0x2Fは"/"の文字コード
		right;
		if(code == 0x2F) {
			#comment_flag = true;
			#offset = -2;
		}
	}
	while(#i <= #tmp_selendy) {
		moveto 0, #i;
		//先頭行がコメントの場合は、選択範囲のコメント行を解除していく。
		if(#comment_flag == true) {
			//先頭の文字が"/"の場合
			if(code == 0x2F) {
				//右へ1文字移動
				right;
				//次の文字も"/"の場合、BSを2回発行してコメント化を解除する。
				if(code == 0x2F) {
					right;
					backspace;
					backspace;
				}
			}
		//先頭行がコメントではない場合は、選択範囲の行すべてをコメント化していく。
		} else {
			insert "//";
		}
		#i = #i + 1;
	}
	
	//カーソルを選択範囲開始位置に移動
	moveto #tmp_seltopx + #offset, #tmp_seltopy;
	
	//選択範囲を元に戻す
	beginsel;
	moveto #tmp_selendx + #offset, #tmp_selendy;
	endsel;

//範囲選択中ではない場合
} else {
	//現在のカーソル位置を退避
	#tmp_x = x;
	#tmp_y = y;
	//行頭に移動
	golinetop2;
	//先頭の文字が"/"の場合
	if(code == 0x2F) {
		//右へ1文字移動
		right;
		//次の文字も"/"の場合、BSを2回発行してコメント化を解除する。
		if(code == 0x2F) {
			right;
			backspace;
			backspace;
		}
		#tmp_x = #tmp_x - 2;
		if(#tmp_x < 0) {
			#tmp_x = 0;
		}
	} else {
		insert "//";
		#tmp_x = #tmp_x + 2;
	}
	moveto #tmp_x, #tmp_y;
}

2010/05/09
日付と時間を挿入するショートカットキーを実現する秀丸マクロ

とってもいまさら感満載ですが・・・

エクセルで日付を入力をする際、『Ctrl + ;』、時間を入力する際は『 Ctrl + : 』のショートカットキーを多用するのですが、それを秀丸で出来ないものかとふと思って調べてみました。

①以下の一行マクロをそれぞれ適当なファイル名でマクロ用フォルダに保存します。

日付を挿入するマクロ: insertdate.mac(1kb)
insert year + "/" + month + "/" + day

時間を挿入するマクロ: inserttime.mac(1kb)
insert hour + ":" + minute

マクロ用フォルダはデフォルトでは秀丸をインストールしたフォルダですが、
その他>動作環境メニューの、「環境」の中のマクロファイル用のフォルダを変更することで
任意のフォルダにすることも可能です。

②マクロ>マクロ登録 メニューで作成したマクロを登録します。
例)
マクロ1: タイトル:日付挿入 ファイル名:insertdate.mac
マクロ2: タイトル:時間挿入 ファイル名:inserttime.mac

③ショートカットキーを割り当てる
その他>キー割り当て メニューでキー割り当ての画面を呼び出します。
そのままではCtrl + ; や Ctrl + : のショートカットキーを割り当てることができませんが、
「キー割り当て拡張」のチェックを入れると割り当てが出来るようになります。

Ctrlにチェックを入れて、キーで「 ; 」を選択(時間挿入の場合は「 : 」を選択)し、
コマンドで、プルダウンから「メニュー/マクロ」を選んで、
リストボックスで先ほど登録したマクロを指定してキーを割り当てます。

これで、エクセルと同じようにCtrl+;で日付、Ctrl+:で時間をカーソル位置に挿入できるようになります。


2010/03/07
リフレについての簡単なメモ

最近Twitterをやってて、リフレ派を自称する人が

①国債金利が上がったら⇒
②インフレになって⇒
③円安になるから⇒
④景気が回復する

みたいなことを言ってて、ちょっと違和感があったので、

①国債金利が上がったら⇒
②今の青色吐息の財政では利払いができず⇒
③今年度だけで102兆円もある借換え債も消化できず⇒
④国債がデフォルト(債務不履行)して⇒
⑤インフレになって(ハイパーかどうかは別として)⇒
⑥スタグフレーション(不況なのに物価だけ上がる)になるんじゃない?

って言ったら、ものすごい噛み付かれてちょっとだけ議論したんですが、
そのときは自分にも明確な主張がなかったので、「なるほどね~」って引き下がりました。

そもそもリフレって言葉の意味を知らなかったので、後でいろいろ調べてみました。
それでなんとなくわかってきたのですが、リフレ派っていうのは要はインフレターゲット論者で、
国が発行するお金の量を調整して意図的にインフレに誘導し、円安にして、その結果
輸出企業を儲けさせるなどして景気を良くしようと考えている、ということのようです。
(と少なくとも僕はそう理解しました。)


議論しているときはリフレの意味を知らなかったので、リフレ派でも反リフレ派でも
なかったのですが、調べてみてなんとなく最初に感じた違和感の原因がわかりました。

景気を良くするためにインフレに持っていこうというのは目的と手段を取り違えている
のではないかと思うのです。
デフレで不景気だけども、だからといって無理やりインフレに持っていけば景気が
よくなるとは思えません。
僕は経済学を本格的に勉強したわけではないので、よくこのあたりの議論を展開する
ブログに出てくるような難しい数式はわかりませんが、ただ単にお金の量を調整して
インフレに持っていったって、物価だけが上がって給与などの収入は上がらず、
今よりもっと生活が苦しくなるだけだと思うからです。

景気を良くするためにインフレに持っていくのではなく、景気がよくなった結果、
緩やかなインフレに向かうというのが正しいのではないでしょうか。
今、日本の株価はすごく低迷していて、逆に円は買われて円高になっています。
これは、世界のマーケットが日本株に投資する価値がないと考えて引き上げた資金で、
相対的にマシな円を買っているからだと思います。

世界のマーケットが日本の株に投資したいと思わせるようなイノベーションを企業が
起こしたり、そのように思わせるような良い政策を政治が行うなどの努力で日本の株価
が上がれば、為替に向かっていた資金が株式に向かい、景気が良くなって、
その結果円安の方向にも向かって、緩やかなインフレになるのではないでしょうか。

お金の価値を技術的に操作するよりも先にそういう努力を地道に行うのが先だと思っています。


         

EasySmallWorldで提供中のサービス

企画室

0000003007.png
Special thanx to DVMG 727

早起き推移

早起き生活
Powered by 早起き生活

タグ