Windows 10で.ssnファイルをxyzzyのload-sessionで開く
すごく昔のエントリに、Windows 7で.ssnファイルをxyzzyのセッションファイルとして開く手順を書いたんですが、さっきWindows 10で同じ手順をたどったらうまくいかず、Windows 10でうまくいく方法を調べたのでメモ。
やりたいことは、特定の拡張子のファイルを開くときに、特定のアプリケーションの“コマンドラインオプション付きで”開くような関連付け、です。xyzzyセッションの場合は、拡張子.ssnのファイルを開くときに、xyzzy.exeに"-s"オプションを付けて開く関連付けができればOK。
Windows VistaやWindows 7では、関連付けダイアログで.ssnにxyzzyを関連付けた後、レジストリエディタで
HKCU\Software\Classes\.ssn\shell\command\open
とかにできるREG_SZタイプのエントリを編集して
"C:\xyzzy\xyzzy.exe" "-s" "%1"
なんて文字列を指定してやれば良かった、というのは
923110.hateblo.jpに書いた通りなのですが、どうもWindows10では同じようには動かないらしい。
「Windows」「関連付け」「コマンドラインオプション」辺りでGoogle先生に尋ねて調べて試したところ、以下の手順でWindows 10でもコマンドラインオプション付きの関連付けができました。
(1)レジストリに
HKCU\Software\Classes\.ssn
の設定があればまるっと削除
(2)コマンドプロンプトを「管理者として実行」で起動して以下のコマンドを実行
assoc .ssn=xyzzysesseion
ftype xyzzysession=C:\xyzzy\xyzzy.exe -s %1
※xyzzysessionは既存の名前(assocコマンドをオプションなしで起動すれば一覧を見られます)とかぶらなければなんでも良い。
(3)エクスプローラで適当な.ssnファイルをダブルクリック
⇒ファイルの関連付けダイアログが開くので、そこでxyzzy.exeを使うように指定
全く新規の環境なら(1)は不要で、レジストリの直接操作をしなくて済むようになったぶん安心感があります。
追記:上記設定のエントリはHKCUじゃなくてHKCRに作られるようになったみたいですね。
フゼムウエア、ソフゼ
「ファームウエア」が「フゼムウエア」といった具合に、“ァー”が“ゼ”に化ける、という話を耳にしたのでちょっと調べてみました。実際、「フゼムウエア」や「フゼムウェア」でGoogle検索をすると結構引っかかります。
どうやらEUCの日本語2バイトコードのハンドリングで下手を打つと発生するみたい。追記:で、そういう下手を打つ不具合が一時期のPHPにあったらしい。
EUC-JPの「ァ」(カタカナの小さいア)はA5A1、「ー」(音引き)はA1BCで、「ァー」はA5A1A1BC。中にあるA1A1はEUC-JPの空白文字に当たり、どこかの処理でここを1文字と認識して空白を詰める処理を行ってしまうとA5BCが残ります。このA5BCが「ゼ」で、めでたくフゼムウエアの完成、と言うことらしいです。この理屈で行くとたぶん「ぁー」(A4A1A1BC)も「ぜ」(A4BC)に化けますね。
ThinkPad X201sの再セットアップ覚え書き
何度もやって不吉なにおいがプンプンするので次回のためにメモ。
システム(Home Premium)をリカバリメディアから復元する
- 普通に復元
システムの保護設定変更
- Windows+Pauseでコントロールパネルのシステムを開き、左ペインの「システムの保護」クリック
- ダイアログで、
- 保護設定の「利用できるドライブ」から、デフォルトで有効になっている「(不明)」と付いたドライブの保護を外す(これを外さないと、次項の保護設定ができない)。
- SYSDRVとC:(システム)をそれぞれ保護下に設定し直す
101キーボード用にレジストリ書き換える
- レジストリエディタで\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parametersの中の
- LayerDriver JPNをkbd101.dllに(既定でkbd106.dll)
- OverrideKeyboardIdentifierをPCAT_101KEYに(同PCAT_106KEY)
- OverrideKeyboardSubtypeを0に(同2)
- レジストリエディタを終了し再起動
Anytime UpgradeでシステムをProfessional化
Windows Updateを正常に動かす設定
- コマンドプロンプトを「管理者として実行」で開き、以下を順に実行
- net stop wuauserv
- cd %systemroot%
- ren SoftwareDistribution SoftwareDistributionold
- net start wuauserv
- net stop bits
- net start bits
- net stop cryptsvc
- cd %systemroot%\system32
- ren catroot2 catroot2old
- net start cryptsvc
パッチ類適用
- Service Packの新しいのを先に入れる
- Windows Update
Rakeを触ってみました
似通ったファイル群を多量に作成する必要に駆られてRakeを触ってみました。「言語内DSL?なにそれ?」レベルからのスタート。途中、Rubyを書いてるんだかRakefileを書いているんだかわからなくなって「素のRubyでいいんじゃね?」と方針を変更してみたものの、ファイルを所定のフォルダに打ち込む作業などを考えるとやっぱりRakeのほうがいいやと思い直して、あれこれ調べて何とか形になりました。
コマンド一発で1セット200本のファイルがどばーっと生成され、所定のフォルダに次々に打ち込まれていくのが快感。30セットほど作らなきゃならないのでだいぶ効率化できたはず。
やりたいことを解決する手段がほどよい難易度で用意されていて、Rubyは楽しい。
さくらインターネットでRuby 1.9
さくらインターネットに標準で用意されているRubyは1.8.xなので、~配下にRuby 1.9.1をインストールして、CGIで使おうとしたがInternal Server Errorになる。
んで、ずいぶん時間を費やした結果、シーバン行に-Kxオプションつけなきゃいけないとやっと気づいた。Ruby 1.9はマジックコメントでエンコードを指定すれば-Kオプションは不要だと思いこんでいたのがあだに。
ようするに
#! /home/username/env/bin/ruby -Ku # -*- coding:utf-8 -*-
などとしなければならないってことでした(UTF-8の場合)。てか、マジックコメントの方はいらないのかな。
くたびれたけど一応前進。すみませんレベル低くて。
史上最大のコーディングスキル判定(Cでも書いた)
Cでも書いてみた。ロジックがわかってるのに正味80分くらいかかった。
配列をなんやかやするのが面倒そうだったので数牌を個数で管理する方法に変更。
Cで書いたけどアセンブリですねこれは。
まだCのほうが楽に書けるけど、Rubyのほうがきっとずっと楽に楽しく書けそう。
#include <stdio.h> void slice_melds(char* uniq, char* form, int restofform) { int i; if(restofform == 23) puts(form); else { i=0; while( uniq[i]==0) i++; /* 一番小さい牌がコーツを構成していると仮定して探索 */ if(uniq[i]>=3) { sprintf(form + restofform, "(%d%d%d)", i+1, i+1, i+1); uniq[i] -= 3; slice_melds(uniq, form, restofform+5); uniq[i] += 3; } /* 一番小さい牌がシュンツを構成していると仮定して探索 */ if(i<7 && uniq[i] > 0 && uniq[i+1] > 0 && uniq[i+2] > 0) { uniq[i]--; uniq[i+1]--; uniq[i+2]--; sprintf(form + restofform, "(%d%d%d)", i+1, i+2, i+3); slice_melds(uniq, form, restofform+5); uniq[i]++; uniq[i+1]++; uniq[i+2]++; } } } int main(int argc, char* argv[]) { char tehai[14]; char uniq[9] = { 0 }; /* 数牌の個数 */ char form[24] = { 0 }; /*テンパイ形の文字列*/ int restofform = 0; /*テンパイ形の未確定部分のトップ*/ int i,j; sprintf( tehai, "%.13s", argv[1]); for( i = 0; i < 13; i++ ) uniq[tehai[i]-'1']++; /* 雀頭なし(つまり単騎待ち) */ /* ・1個取り除いて、残り12個が4メンツ構成するパターンを探索 */ for( i=0; i<9; i++) { if(uniq[i] == 0) continue; sprintf(form+restofform, "[%d]", i+1); uniq[i]--; slice_melds(uniq, form, restofform+3); uniq[i]++; } /* 雀頭あり */ /* ・雀頭を取り除いた後、任意にトイツやターツを取り除き、残り9個が3メンツを構成するパターンを探索 */ for( i=0; i<9; i++) { if(uniq[i] < 2) continue; /* 雀頭を取り除く */ sprintf(form+restofform, "(%d%d)", i+1, i+1); uniq[i] -= 2; restofform += 4; for( j=0; j<9; j++) { if(uniq[j] == 0) continue; /* トイツを見つけたらそれを待ち(シャボ)として残り9枚で3メンツを構成するパターンを探索する */ if(uniq[j] >= 2) { sprintf(form+restofform, "[%d%d]", j+1, j+1); uniq[j] -= 2; slice_melds(uniq, form, restofform+4); uniq[j] += 2; } /* 2枚連番を見つけたらそれを待ち(ペンチャンまたはリャンメン)として残り9枚→3メンツの探索 */ if(j<8 && uniq[j+1]>0) { sprintf(form+restofform, "[%d%d]", j+1, j+2); uniq[j]--; uniq[j+1]--; slice_melds(uniq, form, restofform+4); uniq[j]++; uniq[j+1]++; } /* カンチャンのターツを見つけたらそれを待ちとして残り9枚→3メンツの探索 */ if(j<7 && uniq[j+2]>0) { sprintf(form+restofform, "[%d%d]", j+1, j+3); uniq[j]--; uniq[j+2]--; slice_melds(uniq, form, restofform+4); uniq[j]++; uniq[j+2]++; } } restofform -= 4; uniq[i] += 2; /* 取り除いた雀頭を戻す */ } return 0; }