Cygwin で Cron を動かす

インストール

cron と cygrunsrv を cygwin でインストール済とする.
合わせて,nkfも入れてあると便利.

nkf を入れる場合,gcc-coreとmakeも入れておくこと.

サービスに登録

昔は cygrunsrv を叩いていたが,今は cron-config でできる.
要,管理者権限.

予断だが ssh-server なんかも ssh-host-config でできるらしい.

yes/no で聞かれているところは基本 yes.
入力を促されるところは CYGWIN は空欄,パスワードは Windows のログオンパスワード.

もしエラーが起こった時に,日本語で読みたい場合は,

cron-config 2>&1 | nkf -u

とかしておくと便利.

cron を開始

うまく開始する条件がよく分からんが,たまに上でうまく動作しないことがある.
一応,こうなっていれば成功のはずなのに,なぜかスクリプトの出力をファイルにリダイレクトさせたはずの出力が得られないことがある.

$ cygrunsrv -Q cron
Service             : cron
Display name        : Cron daemon
Current State       : Running
Controls Accepted   : Stop
Command             : /usr/sbin/cron -n

そういう時は,サービスの再起動が良い.
要管理者権限.

$ net stop cron 2>&1 | nkf -u
$ net start cron 2>&1 | nkf -u

これはメッセージが日本語確定なので,nkfを使う.
で,その後ステータスを見て, Current State が Runnning でなければ,cygrunsrv で開始させる.

$ cygrunsrv -S cron

HHKBをHHKモードでWindowsでもLinuxでも使う

環境

ホストOS
Ubuntu 14.04
ゲストOS
Windows 7
VM PF
Virtualbox

要件

  • Windows側
    • CapsLockを使いたくない
      • HHK モードが理想
        • DIP SW 1: OFF, 2:OFF としたい
    • Windowsキーを使いたい
      • Lite 拡張モードにせざるを得ない
        • DIP SW 1: ON, 2: OFF
    • DeleteよりもBackSpaceを使う
      • DIP SW 3:ON
    • 左手でもFnキーが欲しい
      • DIP SW 4:ON
    • AltキーはSpaceの両隣
      • DIP SW 5:ON
    • Wakeupは無効
      • DIP SW 6:OFF
  • Linux側
    • 右Alt(◇と入れ替えたキー,以降は「新右◇」と表記)をxmonadのショートカットキーの起点にしたい
      • Lite 拡張モードの場合,新右◇はSuper_Rなので,mod4あたりを設定に使えば良かった.HHKモードの場合,新右◇はHenkan_Modeであり,modキーに割り当てられていない.

課題

  • HHKモードでWindowsキーを使いたい
  • HHKモードで新右◇をSuper_Rの代用にしたい

対策

キーマップの変更 in Windows
HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout へ Scancode Map を設定する.
他に設定がない場合,

0x00000000
0x00000000
0x02000000
0x5ce07900
0x00000000

とする.
ちなみに,0x79=変換キー,0xe05c=右Windowsキー

xmodmap in Linux
xmodmapを設定した上で,xmodmapでロード.

add Mod4 = Henkcan
xmodmap ~/.Xmodmap

補足

両方設定していても,VM上で正しくWindowsキーとして動作する.

追記(2017/1/24)

remminaで接続した先のWindowsに対して,上の設定ではWindowsキーとしての動作をさせられなかったので別の手段を適用してみた.
この場合,上で行なった設定は不要になるので注意.

この辺を参照のこと.
xkbでキーバインドを変更する – Happy My Life
Ubuntu 15.04: キーボードのカスタマイズ設定 - 児童小銃
要点としては,キーが何になっているのかは xev で確認.
henkan_mode はsetxkbmap上は<HENK>.

キーマップの出力
$ setxkbmap -print > ~/.xkb/keymap/mykbd
キーの置き換え設定の記述
partial modifier_keys
xkb_symbols "HenkSuper" {
    replace key <HENK> {[ Super_L ]};
};
キーマップの修正
~/.xkb/keymap/mykbd の xkb_symbolsの項目のの最後に”+kbd_swap(HenkSuper)”を追加する
キーマップの適用
以下を,X起動時のどこかでやれば良い.

xkbcomp -I${HOME}/.xkb ${HOME}/.xkb/keymap/mykbd $DISPLAY

私の場合,xmonadを使っているので,xmonad.hsのstartupHookで

spawn "xkbcomp -I${HOME}/.xkb ${HOME}/.xkb/keymap/mykbd $DISPLAY; xmodmap ~/.Xmodmap

としてみた.
後ろにxmodmapをつけているのは,xkbcompの実行後にxmodmapがデフォルトに戻ってしまって,xmonadのmodキーの設定が外れてしまうため.

結果

ダメだった.
remminaには,相変わらず何も送信できてないっぽい.
他にremminaの設定でRDPのキーボードレイアウトのタブのuse client keyboard mappingをオン/オフ変えてもダメ.
Super_LとSuper_Rと変えてもダメ.
あんまし意味なかった.

追記(2017/2/24)

rdesktopなら,xkb の方の設定でスタートメニューを開くことができた.
.Xmodmapの方は試してないので不明.

rdesktop -g 2560x1440 -a 32 -z -u $(id -un) -p $(cat /path/to/passwordfile) HOSTADDR

Adobe Readerの「最近使用した場所」を保存させない

編集>環境設定>文書 にある 「最近使用した文書にリストする数」を0にすると,開いたファイルの履歴は残らないものの,そのファイルまでのパスは保存される.
パスはレジストリの,
[HKCU\Software\Adobe\Acrobat Reader\11.0\AVGeneral\cRecentFolders]
の配下に「c1」「c2」…「cX」という名前のキーとして作成される.
そこで,cXというキーを全て削除すると,履歴は消える.

履歴を残さないようにするには,以下の手順で,キーに書き込みできなくしてやれば良い.

  1. cRecentFoldersを右クリックして出てくるメニューから,アクセス許可を選択.
  2. 詳細設定,のボタンをクリック
  3. アクセス許可のタブの中の「継承の無効化」ボタンをクリックし,削除を選択
  4. 開いている2つのダイアログ両方のOKを押して設定保存して終了

Ubuntu on Laptop PCで画面を閉じてもスリープしない

基本的には,ここの通り.Linux - モニターを閉じるとサスペンドされるのを防止 - Qiita

なんだけど,当該設定ファイルを見てみると他にも電源まわりの動作が書かれてるから試してみたら思い通りに動いてくれてハッピー.

HandlePowerKey=suspend
HandleLidSwitch=ignore

電源ボタンでスリープ,閉じてもスリープせず

Windows 7 で Windows 10 へのアップグレードを薦める通知を削除する

webで出て来るやり方 (ASCII.jp:トラブル回避! 「Windows 10を入手する」を消す方法!とか,「Windows10を入手する」の通知が消えない\(^o^)/ - time 0 and 1など) に加えて,私はGWXフォルダを消し損ねたので,ちょっと手をかけてみた.
正直,このワームを防ぐには,Windows Updateを無効化した方が早いんじゃないかという気がしている.

  • 上の記事にあるアップデート(KB3035583,KB2952664)は,最低限,消しておく.
  • セーフモードで起動(再起動後にF8を連打してセーフモードを選択)
  • (私はexplorer.exeを管理者権限で開いたが,そんな手間はいらないかも?分からないので,うまくいかんかったら試してね)
  • C:\Windows\System32\GWXを右クリック>プロパティ>セキュリティタブ>詳細設定>所有者,と辿り所有者を自分に変更してプロパティを一旦閉じる.
  • 再度,プロパティを開き,セキュリティタブ>詳細設定>アクセス許可の変更>このオブジェクトの親から継承可能なアクセス許可を含める,のチェックボックスを外す.
  • 出てくるダイアログボックスは,削除でも追加でもいいので選択し,適当に答えながら,プロパティを全部閉じる.
  • GWXフォルダ自体をShift+Delで削除する
  • C:\Windows\System32のフォルダの中の何もないところを右クリックして,新規作成>テキストドキュメントを選択し,ファイル名をGTXとする.
  • GWXを右クリックし,上と同じ要領で所有者を自分に変更,親からの継承のチェックボックスを外し,ダイアログで「削除」を選択.
  • 再起動して,普通に使う

ここまでやっても,Windows updateの最初に出てくる「Windows-10にアップグレード」,は実体が複数種類あるので,3回くらい非表示にしないと,また出てくるので注意すること.

GWXはフォルダとして作成してもいいんだけど,Winとかlinuxは同じフォルダに同じ名前のファイルとフォルダを作れないのを利用して,アクセスコントロールが分かりやすいファイルを作って書き込み禁止にすることにした.

今のところ,これでうまくいっているが,これでもだめな場合の方針はファイル暗号化を有効にしてGWXを暗号化した後に暗号化用の証明書を削除して復号できなくしてしまうとか…

ibus1.5系をASCIIキーボード+SKK環境で使い易くする

参考

本の虫: iBus 1.5がクソすぎる
iBusがクソになった理由 — KaoriYa

経緯

2年くらい前にこの記事を見た時は,何を言っているのかさっぱり分からなかったが,今なら少しは分かる.
でも,uimを散々使ってみた挙句,uimの変換中文字列がホワイトアウトして表示されなくなる現象 (RequestUim - uim-doc-ja - Japanese Documentation Project for uim - Google Project Hosting) に出くわしてからibusに戻っているのが現状だ.
ちなみにホワイトアウトは,私の環境ではシングルモニタでも出る
uimは,.Xdefaultにurxvtの色設定を書いても,.uimで色定義書いてuim-colorに適用してもだめだったから,私の知識では打つ手なし

まぁ方針の善し悪しは,特定人種の攻撃みたいな様相なのでスルーすることにして,
どうすれば,私の環境で快適に使えるかと試してみた.
あくまでマシになる程度で,快適とまではいかなかったが,文字が見えないよりはマシなので,uimは捨ててibusに乗り換えた.

環境

OS
Ubuntu 14.04
WM
xmonad
IM
ibus
IME
ibus-skk
キーボード
ASCII配列
エディタ
VIM ときどき emacs
VIMの動作するurxvtでちゃんと変換中文字列が表示されて,emacsでは起きないよう設定できることが最低条件

やること

ibus+ibus-skkのインストール
.xprofileで環境変数を設定してibus起動させるとかは,頑張って.
今覚えている範囲なら,これ書いてXかubuntu丸ごとかを再起動しとけばいけるかも.

xmodmap .Xmodmap export XIM=ibus export XIM_PROGRAM=/usr/bin/ibus-daemon export XIM_ARGS="--xim" export GTK_IM_MODULE="ibus" export XMODIFIERS="@im=ibus" export QT_IM_MODULE="ibus" ibus-daemon -d -x
ibusの設定を全ウィンドウで共通化させない
xmonadではツールバーなんて軟弱なものはないので,現在のinput methodを確認する術が,入力してみる,しかない.
不便極まりないので,ウィンドウを起こした時には常に決まった入力モードであって欲しい.
ibus-setupのadvancedでShare the same input method among all applicationsのチェックを外すことで,可能である.
skkの初期モードをLatinにしておく
実は初期モードはLatinなんだけど,Hiraganaに切り替えていたので戻すだけ.
キーボード操作メインのxmonadで初期モードHiraganaは自殺行為だった.
ibus-setupのinput MethodからSKKを選択してPreferencesを押し,Behaviorからinitial input modeをLatinにしておけばOK
ASCIIキーボードで入力できるようにする
ibus-skkのキーマップが106キーボードになっているので,asciiに変更する.
要su権限.
/usr/share/ibus/components/skk.xmlのlayoutをjpからusに変えて再起動か再ログインか,何かすればOK
(追記)インプットメソッドをskkのみにする
skkの中で直接入力できるのに,Englishを残しておく意味はないので,消す.これしないと,英語環境を使ってる時デフォでskkが起きてくれなくてうざい.これをやっても,例えばemacsを起動した時にはddskkを呼ばなくてもasciiの入力はできるし,C-jはLispの実行だし,C-x C-jでddskkが起きる.

結果

ウィンドウを遷移する度に,Latinに切り替わるぜ!
これがWindows機の動作だったらキレてるところだが,ubuntuなら,そんなに違和感ない.
ちなみに,何でか分からんが,.XdefaultsにemacsでuseXIMはfalseだよーとかしなくても,emacsからはibus-skkは呼ばれない.

あふwでmd5sumを実行してメッセージ枠に結果を出力する

お気に入りのツールを気ままに拡張するブログ で公開されているafxtoolsに同梱のafxamsを使う.
afxtoolsをGitHubからDLして,afxtoolsというフォルダをafxwと同じフォルダに展開した状態,かつcygwinの実行ファイル群にパスが通っている前提.

何故か,直接実行ではうまくいかなかったので,バッチファイルを挟む.
afxwと同じフォルダへ適当な名前(pmd5sum.batとする)のバッチファイルを作成して,

md5sum.exe %1 | xargs.exe c:\path\to\afxw\afxtools\bin\afxams.exe MesPrint

続いて,あふwの設定ダイアログのプログラムタブのShift-Xとかに,

%afxw%\pmd5sum.bat "$P\$F"

とかすれば,Shift-Xでカーソル下のファイルのmd5sumがメッセージ枠に出るはず.

ubuntuをwindowsマシンの第2パーティションにインストールしようとしてハマった

ハマった環境.

  • SSD+HDD搭載ノートPC
  • C:(SSD)へWindows7インストール済
  • D:(HDD)へデータを格納
  • C:とD:それぞれパーティションを切り直して,C:の後ろに/とswapを,D:の後ろに/homeを入れる
  • 新たに導入したOSはUbuntu Server 14.04.2
  • インストーラはUSBメモリを使用./dev/sdaがUSB,/dev/sdbがC:,/dev/sdcがD:
  • expert installでブートローダはLILOを/dev/sdb2のPBRへ導入
  • MBRのブートローダはMBMを導入.USBへMBM.144を焼いてインストールするが,edit partitionでは0がUSB,1がD:,2がC:だったくせに,install mbmでは1を指定するとC:のmbrに入った
    mbmから/deb/sdb2を指定してliloを起こすも,ディスクを読み込めずプロンプトにinitramfsと表示されるbusyboxが始まる.

原因

USBでインストールしたため,HDDのマッピングがうまくできていなかったこと.
by-idとかで指定してくればいいものを,自動ではやってくれなかった.

対策

  • initramfsの状態で,
    (initramfs) ls /dev/sd*
    (initramfs) ls -l /dev/disk/by-uuid/
    (initramfs) mkdir /mnt
    (initramfs) mount /dev/sda2 /mnt # <-インストール時は/dev/sdb2だったが,今は/dev/sda2
    (initramfs) cd /mnt/etc
    (initramfs) /mnt/bin/ed lilo.conf # <-ラインエディタ.viとか見付けられたら,viでもいい.とにかくエディタで修正する
    
  • lilo.confで,
    - append="root=/dev/sdb2  "
    + append="root=/dev/disk/by-uuid/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  "
    
  • lilo.confに従いブートローダの再構築.ただし,/mntにマウントした状態ではうまく動作しない&busyboxだとエラーを吐くので,
    (initramfs) mv /mnt/dev /mnt/d # <- /devを移動してくるための準備
    (initramfs) mv /dev /mnt # <- 後でchrootする/mnt配下にsdXやdisk/by-uuidがないといけない.シンボリックリンクではchroot後に上に辿れないので,移動するしかない
    (initramfs) ls /mnt/bin/*sh # <- bashとか入ってるか確認.hadacchiはbashでやった
    (initramfs) chroot /mnt /bin/bash # <- chroot後のパスで指定
    # sudo /sbin/lilo # <- rootのプロンプトに見えたけれど,sudoしないと動いてくれなかった
    # exit # <- busyboxへ戻る
    (initramfs) reboot
    

私の環境では,これで通常のubuntuが起き上がってくれた.
あとで,他に不整合が起こってないか確認すること.
といいつつ,/devは起動時に中身を再構築されるっぽいので,/dが残っていることさえ気にしなければ,特に問題ないと思う.

ドライブレターへの割り当て

Windows上のあるフォルダをドライブレターへの割り当てをしようとすると,

 >subst F: C:\path\to\folder

みたいにすることになるが,再起動すると割り当てが解除される.
解除されないためには,レジストリにエントリを追加する.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices]
"F:"="\??\C:\path\to\folder"

ネットワークドライブをドライブレターへ割り当てしようとすると,

 >net use F: \\servername\sharedname

なぜかこの場合は,永続的に割り当てされる.

ドライブ間/ディレクトリ間のdiff

なんかwebに転がっていそうだけど,ちゃんと探さず実装.
python on cygwinで動作確認.
os.statを使っているので,多分シンボリックリンク辿ってしまう.

なんでこんなもんがいるのかっつーと,truecryptのストレージファイルをdropboxで共有していて,うっかりあるPCでマウントしたまま別のPCでもマウントしてしまうと,ストレージファイルのタイムスタンプが両方とも新しくなって競合が起こって,それぞれのPCでマウントしていたストレージファイルが両方残ってしまうから.
すぐその場で気付けばいいんだが,後で増殖しているのに気付いた場合,差分がどこにあるか把握するのが困難なので,全ファイル,全dirを比較して,どのファイル/dirがどう差分あるのか出力する.
linuxは忘れたけど,windowsでフォルダ配下に新規ファイルを作ったりファイルを消したりすると,ディレクトリのタイムスタンプが更新されてしまうので,無駄に差分が出力されるのを防ぐため,ディレクトリの時刻は比較しないことにした.
どうせ,そのディレクトリ配下で何かいじってたら,ファイルの差分として検出できるし.

import os,sys,stat

if len(sys.argv)<3:
    sys.stderr.write("""Too few arguments!
Usage:
    python diffdrive.py drivepath1 drivepath2
""")
    sys.exit()

if not os.path.isdir(sys.argv[1]) or not os.path.isdir(sys.argv[2]):
    sys.stderr.write("""input path is not found!
""")
    sys.exit()

apath=sys.argv[1]
bpath=sys.argv[2]

def diffdir(apath,bpath,counter):
    if counter>10000: return True
    try:
        alist=os.listdir(apath)
        blist=os.listdir(bpath)
    except OSError,ex:
        if ex.errno == 13:
            alist=[]
            blist=[]
            # permission error
        else:
            raise ex

    tmplist=[]
    nextlist=[]
    for afile in alist:
        # ignore fucking wasted file started by '._' which is created by Mac OS X
        if afile[:2] == '._':
            continue
        if afile not in blist:
            sys.stdout.write("< %s/%s\n"%(apath,afile))
            counter+=1
        else:
            tmplist.append(afile)
    for bfile in blist:
        # ignore fucking wasted file started by '._' which is created by Mac OS X
        if bfile[:2] == '._':
            continue
        if bfile not in alist:
            sys.stdout.write("> %s/%s\n"%(bpath,bfile))
            counter+=1
    for abfile in tmplist:
        astat=os.stat(apath+'/'+abfile)
        bstat=os.stat(bpath+'/'+abfile)
        amode=astat[stat.ST_MODE]
        bmode=bstat[stat.ST_MODE]
        asize=astat[stat.ST_SIZE]
        bsize=bstat[stat.ST_SIZE]
        atime=astat[stat.ST_MTIME]
        btime=bstat[stat.ST_MTIME]
        if stat.S_ISDIR(amode) and stat.S_ISDIR(bmode):
            nextlist.append((apath+'/'+abfile,bpath+'/'+abfile))
        elif stat.S_ISDIR(amode)==stat.S_ISDIR(bmode):
            if asize==bsize and atime==btime: next
            elif atime>btime:
                sys.stdout.write("< %s/%s is newer\n"%(apath,abfile))
                counter+=1
            elif atime %s/%s is newer\n"%(bpath,abfile))
                counter+=1
            elif asize>bsize:
                sys.stdout.write("< %s/%s is larger\n"%(apath,abfile))
                counter+=1
            elif asize %s/%s is larger\n"%(bpath,abfile))
                counter+=1
        else:
            if stat.S_ISDIR(amode):
                afiletype='DIR'
                bfiletype='FILE'
            else:
                afiletype='FILE'
                bfiletype='DIR'
            sys.stdout.write("< %s/%s is %s\n> %s/%s is %s\n"\
                    %(apath,abfile,afiletype,bpath,abfile,bfiletype))
            counter+=1
    for nextpair in nextlist:
        if diffdir(nextpair[0],nextpair[1],counter): return
    return False

diffdir(apath,bpath,0)