SKKFEP

記事を書いたつもりが、なんか残ってなかったので改めて書いておく。
バイナリは、ここから DL → co Programs
skk-fepとも.

  1. setup.js を起動
  2. IE の窓から「インストール」をクリック
  3. 何度か出る UAC を全部 OK
  4. (個人的にはなくても良い気がしてきている)「カタカナ辞書」にチェックを入れてアップデート
  5. skkuser.txt をユーザ辞書フォルダに入れて「辞書の更新」
  6. 「設定>詳細」を次のように編集して上書き保存。(設定名がころころ変わるので、注意)
    • 配列 → 0 (英語キーボード)
    • 区切 → 1 (コロン、セミコロンの全角入力,なくてもいいかな…)
    • 句点 → 2 (ピリオド)
    • 読点 → 2 (カンマ)
    • 改行 → 1 (Enter入力で決定+改行)
    • 疑似 → 1 (入力モードをカーソルの色で表示する機能をエミュレート)
    • cy → ち
  7. 「コマンド」からコマンドプロンプトを上げて、> rule r
  8. puttyとかでサーバーサイドに uim-fep+uim-skk とか準備している場合,ローカルのskk-fepを殺さないといけなので,> rule putty.exe m5
  9. 「閉じる」で完了だが、IME 全部置き換えるためにログオフ→ログオンを推奨。

特定ドメインでアクセスされた場合のみ、移転後ページへのリンクを張った移転メッセージを表示

前使っていたドメインから現在のドメインへリダイレクトをしていたが、どうにもアクセスが完全には途絶えていないらしい。
んで、リダイレクトしているホストやリファラから、古いドメインへリンクしているサイトを特定するために、また移転したよメッセージを表示するために、ワンクッションはさむことにした。←ほぼ検索エンジンか更新されていない掲示板等であることが判明したので,rewriteはやめた
なんとなくのイメージだけで作業開始したものの、実際に作業してみるとハマりポイントがいくつかあったため、メモに残す。

やったこと

  • 旧ドメイン配下の任意ページ(存在の有無によらず)へのアクセスがあった場合、移転メッセージを提示する。
  • 同居する他のドメイン名で80番ポートにアクセスが飛んだ時は、明らかに存在するはずのルートへのリクエストのみ403を返し、他のリクエストの場合は404を返す。
  • 移転メッセージには、http[s]://新ドメイン/元リクエストのパス?元リクエストのQUERY_STRING へのリンクを貼っておく。
  • アクセスログを mysql に残す。

ハマりポイント

任意ページへのアクセスの受け方
分かりにくいけど,これはもう使ってない方法.
任意ページへのアクセスを、上の処理を行なうスクリプトへ元のGET文字列も含めて飛ばすのは意外と難しい。
.htaccess を使って、Rewrite でリクエストを書き換えると簡単にできる。ただし REFERER はこの時点で死ぬので、REFERER を取りたい場合は他の手段を講じる必要がある。
具体的な記述は、例えば

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(old\.domain\.com)(:80)?
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ http://redirect.domain.com/?$1 [QSA,R=301,L]

といった感じ。
QSA は QUERY_STRING を最後に付与する指示。

php での HTTP ヘッダの返し方
php で HTTP ヘッダを返して、特定のアクセスの場合に 404 とか 403 を返す方法はいくつかある。
詳しくは php 公式ページのリファレンスを見るとして、私の環境では次のコードがうまく動いた。
あらゆる出力 (HTML の DOCTYPE や XML 宣言を含む) より前に記述しないと意味がないことに注意。

header("HTTP",true,404);
header("Content-type: text/html; charset=iso-8859-1");
include('./404.php');

404.php は、httpd の 404 ドキュメントを模したファイルで、上の .htaccess を用いた場合は QUERY_STRING に アクセスパスがついてくるので、展開して使えば、それっぽく表示できる。
apache2 の場合、404 や 403 はブラウザの設定に依らず charset が iso-8859-1 で返っていたので、ヘッダに入れた。

今時のmysql

なんか php 公式のリファレンスに mysql は古いから mysqli を使え、と書かれていたので、使うことにしたが、ちょっと梃摺った。

$mysqli = new mysqli("DBHOST", "DBUSER", "DBPASS", "DBNAME");
$mysqli->query($query);

mysqli では、特段の理由がない限りはセッションの close をしないらしい。
$query は使いたい SQL をそのまま書いたもの。

いざ文書にしてみると、迫力のない tips だな。
他にも元アクセスのパターンによって何度か print デバッグしないといけないと思うけど、頑張れ!

VMware で CD-ROM boot (ゲストOS再インストール)

VMware を標準で使っていると、OS インストール後は仮想ドライブに起動イメージを入れてゲスト OS を起動しても OS インストール画面に入ることができない。
これは、CD-ROM ドライブの起動ディスクとしての優先度が低いためであるので、BIOS から優先度を上げてやらなければならない。
ところが、VMware は標準では、BIOS に入るための F2 の受け付け時間が全くなく、現実には入力することができない。
また、リセットやリブートする毎にゲスト OS のフォーカスが外れて VMware のウィンドウにフォーカスが合ってしまうため、PC の起動時によくやる「最初から F2 を押しておく」も通用しない。

そこで、ゲスト OS の .vmx ファイルに、BIOS 設定画面に強制的に入る boot.forceSetupOnce = "TRUE" を追記するか、
BIOS のブートまでの遅延を設定する bios.bootDelay = "5000" を追記するなどの方法で対処する。

ubuntu とか centos で resolv.conf が勝手に書き換えられるのを止める

最近は linux を使っていても PC 起動のタイミングで resolv.conf が勝手に書き換えられるようになってしまった。
普通にインストールすると /etc/resolv.conf は symlink なのだが、通常ファイルに置き換えてもダメ。
昔は dhclient.conf の書き換えで直っていたのだが、最近はそれも効かなくなり苦労していた。

[ Fedora ] resolv.conf が勝手に書き換えられていた - NetworkManager を無効にする: Fomalhaut of Piscis Australis
がドンピシャの記事だったので、メモる。
CentOS の場合は載っているが、一応転載しつつ、ubuntu の場合も書いておく。

CentOS の場合: # yum erase NetworkManager
ubuntu の場合: # apt-get purge network-manager

注意
このままだと、resolv.conf も interfaces も設定しなければならないので、この状態で遠隔操作のままリブートしないこと!!
interfaces は最近、編集する機会が減り、検索結果にも出にくくなってきた気がする。
eth0 inet static とかで検索したら出るよ。

なお、 ubuntu だと記事の CentOS のように network-manager-pptp とか関連っぽいものは消えてくれなかった。
記事では erase を使っている辺りに憎しみを感じるが、大変よく分かります。

debian で DHCP サーバ

NTT の HGW の DHCP 機能がイケてないので、自分で立てた。
不満は、DHCP が配信するオプションを指定できないこと。
自分で立てた DNS を HGW が引こうとすると引けず、ローカル DNS の設定が反映されない日々が続き、嫌気が差したのであった。

やることは簡単。

# apt-get install isc-dhcp-server

このままだとエラーが出るので、更に設定ファイルを変更する。
authoritative; のコメントを外す。
log-facility を local7 とかにして、ログ出力先を制御するのもあり。
rsyslog.conf で cron.* とかが並ぶところに、local7.* と書き、出力したいパスを指定する。
最後に、rsyslog を再起動するのと、isc-dhcp-server を再起動するのを忘れないように。

サブネットの設定は、例えば以下みたくガッツリ書く。

subnet 192.168.x.0 netmask 255.255.255.0 {
    option broadcast-address    192.168.x.255;
    option routers              192.168.x.1;
    option subnet-mask          255.255.255.0;
    option domain-name          "yourdomainname.com";
    option domain-name-servers  192.168.x.y, 192.168.x.z;
    range                       192.168.x.51 192.168.x.100;
}

クラスCの場合は、例えばこんな感じ。
なお DNS の設定は、BIND9 で DNS サーバ とかを見て設定すること。

Redmine を debian wheezy に入れる

やってみたよ。

  1. mysql を入れる。→ 過去記事を参照( mysql 設定メモ
  2. パッケージを入れる。
    $ sudo apt-get install ruby ruby-rails-3.2 rubygems ruby-dev \
    > libmysqlclient-dev libapache2-mod-passenger
    
  3. gem で Ruby のパッケージ?(gem)を入れる。
    $ sudo gem install mysql2 -- --with-mysql-lib=/usr/lib/mysql
    $ sudo gem install bundler
    
  4. Redmine ディレクトリへ移動し、種々のローカル gem を入れる。
    なんか、上と同じように root で入れてもいい気がしてきたが、Redmine の公式を参考に、何となくフィーリングでローカルに入れた。

    $ bundle install --without development test rmagick postgresql sqlite
    
  5. mysql のユーザを作成。
    > grant all privileges on DBNAME.* to 'DBUSER'@'localhost';
    > create user 'DBUSER'@'localhost';
    
  6. パスワードを設定のため,パスワード設定するSQL文を書いたsqlファイルを作成.
    set password = password('PASSWORD')
    

    コマンドラインからパスワードセット.

    $ mysql -u DBUSER < passwd.sql
    

    当該ユーザでDB作成.

    $ mysql -u DBUSER -p
    > create database DBNAME character set utf8;
    
  7. config/database.yml.example を database.yml として編集。
    production:
      adapter: mysql2
      database: DBNAME
      host: localhost
      username: DBUSER
      password: DBPASS
    
  8. あとはまぁ、redmine 公式の通りに。
    $ rake generate_secret_token
    $ RAILS_ENV=production rake db:migrate
    $ RAILS_ENV=production rake redmine:load_default_data
    

    最後のコマンドを実行すると言語を聞かれるので、日本語なら ja を入力。

  9. 更に公式に従って、
    $ mkdir tmp public/plugin_assets
    $ sudo chown -R nobody files log tmp public/plugin_assets
    $ sudo chmod -R 755 files log tmp public/plugin_assets
    

    nobody を使うのは、passenger をデフォルトで動かす(PassengerDefaultUser を指定しない)場合。

  10. /etc/apache2/sites-enabled/ の指定ファイルで、VirtualHost の設定をする。
    DocumentRoot は、 /path/redmine/public
  11. apache2 を再起動すれば、OK。なんか初回アクセスはちょっと重かった。

初期データの管理者&パスワードは、admin

スマホアプリの RedminePM からアクセスするには、basic 認証にした上で、Setting > Authentication > Enable REST web service にチェックを入れておくこと。

MS Office PowerPoint 2010 でフォント設定のダイアログを表示

PPT2007 までは、プレースホルダのダイアログを開いて、欧文フォントと和文フォントを個別に変更するなどの操作ができた。
PPT2010 では、スライドマスタの編集画面でプレースホルダを右クリックしても「フォント」というメニューが出てこない。
その場合、リボンの「ホーム」にある「フォント」の右下(下図の赤○の部分)をクリックすると表示できる。

PPT 2010 フォントダイアログ
PPT 2010 フォントダイアログ

HDDが飛んだ

debian から USB3.0 経由でマウントして使っている HDD が飛んだ。
最近、smartctl から無理くり S.M.A.R.T. 情報を引いていたことの祟りではないかという気もするが、ともかくバックアップ用 HDD が飛んで心配なので、すぐに新しい HDD を手配する。

で、どうせアクセスできないので、この HDD は遊んでみることにする。

mount しながら kern.log を見ると、たまにエラーを吐く。毎回じゃないのが謎。
最初に出たエラーはこれ。
warning: mounting fs with errors, running e2fsck is recommended
言われるがまま、e2fsck するも no error だった。
んじゃスキャンするか、と思って

dd if=/dev/sdb1 of=/dev/null bs=64k

するが、たまに飛ばしていた kill -USR1 への応答がなくなり、9GB 目前で突然、停止。
その時に出たのがこの2種類のエラー。
end_request: critical target error, dev sdb, sector 1598034432
と、
end_request: I/O error, dev sdb, sector 1598034448
なおエラーセクタの番号は、アクセスする度に違う数が出る。

次に、S.M.A.R.T. 情報はこんな感じ。
笑える。

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       10260
  3 Spin_Up_Time            0x0027   163   144   021    Pre-fail  Always       -       8833
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       978
  5 Reallocated_Sector_Ct   0x0033   109   109   140    Pre-fail  Always   FAILING_NOW 726
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   086   086   000    Old_age   Always       -       10447
 10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       438
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       19
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       943
194 Temperature_Celsius     0x0022   113   093   000    Old_age   Always       -       39
196 Reallocated_Event_Count 0x0032   001   001   000    Old_age   Always       -       715
197 Current_Pending_Sector  0x0032   199   197   000    Old_age   Always       -       539
198 Offline_Uncorrectable   0x0030   200   199   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       1
200 Multi_Zone_Error_Rate   0x0008   156   001   000    Old_age   Offline      -       8920

これでも、5回に1回くらいはアクセスが成功するから不思議なものだ。
なお今回は旧バックアップを最近とっているうえ、オリジナルの HDD が無事だからこんなテキトーなことしているが、普通は最初にデータ救出しましょう。

管理者ユーザ名の変更

wordpress が、ハッキング集団によりクラックされているようなので、対策をちょこっとだけしてみる。
もともと、管理者ユーザの slug を変更することはしていたが、ユーザ名がデフォルトの「admin」だったので、変えた。
ユーザを新しく作る方法だとユーザIDが変更されてしまうため、sql で DB を直接編集することにした。

> update PREFIX_users set user_login = 'NEWUSERNAME' where ID = IDnumber;

ついでにパスワードも記号の混じったものに変更した。
wordpress でパスワードに使える記号の一覧が得られなかったので、これまた DB を直接編集して書き込むことにした。
私が使っている記号群は、認証は通った。

> update PREFIX_users set user_pass = MD5('NEWPASSWORD') where ID = IDnumber;

ID は簡単に bruteforce attack で割り出されてしまうので、凝ったことはしていない。

あとは、admin でログイン仕掛けて来た PC に zip 爆弾でも返したいところ。
まだやってないけど。