2012/08/25

JScriptをUTF-8で書きたい

コマンドラインで実行するJScriptをUTF-8で書きたいという、どうかしてる欲求が湧き上がりました。
とりあえずやってみようと、ファイルのエンコードをUTF-8にしてスクリプトを書いてみます。
test.js
WScript.Echo("ほげ");
実行結果:Microsoft JScript コンパイル エラー: 終了していない文字列型の定数です。
ダメです。マルチバイトを上手く解釈してくれません。弱った。

そういえば、wsfならエンコードを指定できます。試してみましょう。
test.wsf
<?xml version="1.0" encoding="utf-8" ?>
<package>
  <job>
  <?job error="True" debug="True" ?>
    <runtime/>
    <script language="JScript">
      <![CDATA[
      WScript.Echo("ほげ");
      ]]>
    </script>
  </job>
</package>
実行結果:ほげ
上手く行きました。

ちょっとしたスクリプトならこれでいいのですが、多少気合を入れる時には、ファイルを分割してインクルードしたくなるでしょう。
test.wsf
<?xml version="1.0" encoding="utf-8" ?>
<package>
  <job>
  <?job error="True" debug="True" ?>
    <runtime/>
    <script language="JScript" src="./test.js"/>
    <script language="JScript">
      <![CDATA[
      main();
      ]]>
    </script>
  </job>
</package>

test.js
function main()
{
    WScript.Echo("ほげ");
}
実行結果:Microsoft JScript コンパイル エラー: 終了していない文字列型の定数です。
ムキー、なんだよー、とならずに冷静に。
こういうこういう時は、ファイルに「BOM」をつけるといいですよ。

2009/12/01

PHP 5.3 の short_open_tag

やー、PHPに戻ってきたよ。いろんなところでdisられまくりのPHPですけど俺はお前の味方だぜ?

えっとですね、fedora 11 → 12 にアップグレードしました。そして yum upgrade したところ、PHPが5.3になりました。
そしたら急にPHPが動かない。HTMLに埋め込まれたPHPソースが丸見え・・・は、恥ずかしい。
俺はお前の味方なのにどうしてそういう、、、反抗期かい?

PHPとして認識されてないのは明らかなので、php.iniとhttpd.confあたりをチェックしてみよう。
似たような環境から php.ini を php.ini.sample なんて名前にして持ってきておもむろにdiffなんぞをやってみる。
diff /etc/php.ini.sample /etc/php.ini
< short_open_tag = On
---
> short_open_tag = Off

ああ、これか。
コア php.ini ディレクティブに関する説明 - Manual
PHP タグの短縮型 (<? ?>) を使用 可能にするかどうかを設定します。PHPをXMLと組み合わせて用いる 場合は、<?xml ?>をファイル中で用 いるためにこのオプションをオフにする必要があります。オンにし た場合にPHPでXMLを出力するには、例えば、次のようにします。 <?php echo '<?xml version="1.0"?>'; ?> これをオフにした場合、長い方の形式のタグ (<?php ?>)を使用する必要があります。


あれれ、いつからなんだろ。でもPHPはこういうものだからみんなも気にしないよね。
そんじゃーね。

2009/11/14

巨大なファイルとか大量のファイルをアーカイブしたり復元したり

gzipって、2GBまでっていうサイズの制限があるじゃないですか。
昔はそれでよかったかもしれないですが、今のご時世、そんなの余裕で超えちゃうことがあって困っちゃう。
そんなあなたに、今日ご紹介するのはこれ。
cpio - アーカイブファイルへのファイルのコピーや、アーカイブファイルからファイルへのコピーをおこなう

詳しいことはmanをみればいいんだけど、やたらといっぱいいろいろ書いてあってげっそりするので、超簡単に使い方を。

ファイルをアーカイブしたいときはファイル名のリストを渡してやります。
私の都合で恐縮ですが、hote.txtってファイルよりも新しいファイルだけをアーカイブしたいのでこんな感じで。
find ./* -cnewer hoge.txt | cpio -oa > backup.cpio


ほんでそれを復元するときは、
cpio -idm < backup.cpio


アーカイブした時のオプションの説明はこれ
-a, --reset-access-time
ファイルを読み込んだ後に、それらのファイルのアクセスタイムの再設定を行います。これは、これらのファイルがその時点で読み込まれたもののように見えないよ う
にするためです
-o, --create
コピーアウトモードで走行します。

復元した時のオプションの説明はこれ
-d, --make-directories
必要に応じてディレクトリを作成します。
-m, --preserve-modification-time
コピー先のファイル生成時に、コピー元のファイルの更新時刻を保持します。
-i, --extract
コピーインモードで走行します。

manからコピってきただけだよ!じゃあの。

2009/10/19

Pythonのスライス表記

こんばんはー、Pythonビギナーです。どうぞよろしく。

えーっと、Pythonでは foo[1:3] と書くと配列の一部とか文字列の一部が取り出せるそうです。
ただ、これがすごくわかりにくい。

Python リファレンスマニュアル
5.3.3 スライス表記 (slicing)
スライスは i および j をそれぞれ指定した下境界、上境界として、インデクス k が i <= k < j となる全ての要素を選択します。

ああ、もう何言ってるんだよ・・・わからないよ。もっとわかりやすく言って欲しい。

どうやら"境界"っていうので、
0  1  2  3  4  5
[a][b][c][d][e]
↑<-->↑
この間

の事を言うらしいんだ!だから「b,c」が取り出される。いやまぁ、ちゃんと「i <= k < j」っておっしゃられてるんですけどね。

でもね。多くの場合はさ、
 0  1  2  3  4  5
[a][b][c][d][e]
↑<--->↑
この間

って、思うよね?だから「b,c,d」が取り出されるって思うよね?よね?
僕ちんわかんないよ。できることなら図で示して、やさしく教えて欲しい。

ああ、この先入観でムダに時間を使っちゃったので、自分へ言い訳をして心を落ち着けてる次第です。

2009/10/14

PythonAutoReload On しても、リロードしてくれない

2009/12/5 追記
Djangoのマニュアルにちゃんと書いてあった・・・ orz
mod_python 上で開発用サーバを動かす
開発用サーバに mod_python を使う場合、コードを変更する度にサーバを再起動するようなやんちゃは避けられます。 MaxRequestsPerChild 1 をアパッチの httpd.conf ファイルに指定し、Apache にリクエストごとに全てをリロードさせてください。

というわけで、以下の文章は無視する方向でどうぞよろしく。
-------------------

Djangoハジメマシタ

それで、Apache mod_python っていう環境で開発してるわけですが、コードを修正しても、なんだかいつまでたっても反映されないことがある。
ブラウザをリロードする度に、エラー、正常、エラー、、、、みたいな。なに、もう、すごいストレス。

ググっても、なんかみんな「PythonAutoReload On」ってすればオッケーみたいに涼しい顔してるけど、ほんとにー?ならないよ!
もー、なんでだろ、もうあれだ、「MaxRequestsPerChild 1」ってして、1リクエストごとに子プロセスを再起動することにしよう。

もちろん、開発環境だけですよ。

2009/09/30

えっとですね、とりあえず余ってるDELLのデスクトップPCをサーバにしたてて運用してやろうと。
こんなご時勢なので新しい設備投資はなかなか厳しいですよね。あー世知辛い。

で、一通りセットアップしてからリブートして、自分の席からゴニョゴニョしてやろうかと思ったらSSHでつながらない・・・
あれれー、なんでなんでー?さっきまで上機嫌だったじゃん。ちょっと離れたらもうご機嫌ナナメ?
もーしょうがないなー、どうしたんだい?
Keyboard Failure

サーバ運用だから、ディスプレイだとかキーボードだとかいきなり引っこ抜いてごめんネ
でも、文句は言わせないゾ
  1. BIOS設定画面を表示
  2. Standard CMOS Features を選択
  3. Halt On の項目を、All,But Keyboard に設定

2009/09/17

Remember The Milk のタスクを Skype でリマインド

たいした仕事もしてないんですけど、Remember The MilkでToDo管理をしてたりします。
で、よくありがちなリマインド機能ですが、いちいちメールなんかでお知らせされるとうっとおしいんです。そのうち無視するようになっちゃって、あぁ、もう何がなんだか。
なので、Skypeに通知するようにしたんですけど、これがまた思うとおりに行かない。
なんでか、最初に、Remember The MilkのSkypeアカウントの「rtmremind」へなんかメッセージを送らないと、教えてくれないんですよ。
なので、毎朝メッセージを送ってたんですけど、そんなの当然、忘れちゃうよヽ(`Д´)ノ

ってことで、正しい対処法かわかんないですけど、起動時に自動でメッセージを送るようにしました。

SkypeTask.js
var rtmremind = 'rtmremind';
var body = 'task';
var trycount = 10;

//------------------------------------------------

var skype = new ActiveXObject("Skype4COM.Skype");
var user, chat;

WScript.ConnectObject(skype, 'Skype_');

var i = 1;
while(!skype.Client.IsRunning){
WScript.Sleep(20000);
if(i++ >= trycount) break;
}
skype.Attach();

user = skype.User(rtmremind);
chat = skype.CreateChatWith(user.Handle);

chat.SendMessage(body + "\n");

スタートアップにでも放り込んで下さい。
Skypeは起動に時間がかかるので、Sleepしながら10回頑張ります。
それでも起動してないと、Skype4COM.Skypeがエラーしますけど、そんときは今日は調子が悪いんだなとあきらめて下さい。

あ、あと、この部分を、
var body      = 'task';

var body      = '麗子君、今日の予定は?';

とかすると、なんだかちょっとえらくなった気分を味わえるかもしれません。

Google Analytics