May 16, 2010

乱数生成アルゴリズム WELL

Mersenne Twister (MT) の作者らによる比較的新しいアルゴリズム・ WELL (Well Equidistributed Long-period Linear) についてのメモです。
  • 原著はこちら:L'Ecuyer, Pierre; Panneton, François; Matsumoto, Makoto (2006), Improved Long-Period Generators Based on Linear Recurrences Modulo 2
  • 論文の訂正表はこちら。シフト演算の部分に関する誤りが訂正されているので必ず参考に。
  • Game Programming Gems 7 で紹介されています。記事を書いた Chris Lomont 氏 (http://www.lomont.org/) のサイトで原文が公開されています:
  • アルゴリズムの特徴は:
    • MTより計算が少しだけ重い。
    • MTは初期状態のビットパターンに0を多く含んでいると、出力する乱数のビットパターンにもしばらく0が多く含まれてしまう傾向がある。WELLはこのような状態からの脱出がMTに比べて早い。
  • C# (VS 2010) で周期 2^1024 バージョンの WELL を書いてみました:
  • 10000回の Monobit テストに対して不合格となるのは1〜2回程度。優秀だと思います。
    • System.Random を使ったら Monobit テスト 10000回に対して3000〜4000回しか合格しないケースがあることにびっくりです。

Apr 30, 2010

Vista : シンボリック リンクでフォルダを別ドライブへ移設

Windows Vista 以降からは mklink コマンドで「シンボリックリンク」を作成することができる。
これによりファイル/ディレクトリの実体をドライブをまたいで配置することが可能となっている。

この機能を利用して C:\Program Files\AdobeD:\Program Files\Adobe へ移設する方法は次のようになる:

1. 管理者権限でコマンドプロンプトを起動
   (※「すべてのプログラム>アクセサリ>コマンド プロンプト」を右クリックし「管理者として実行」)

2. コマンドラインでの作業:
  C:\Windows\system32> cd "c:\Program Files"
  C:\Program Files> xcopy /E /H /I /K /X Adobe "D:\Program Files\Adobe"
  ...
  C:\Program Files> ren Adobe Adobe___
  C:\Program Files> mklink /D Adobe "D:\Program Files\Adobe"
  Adobe <<===>> D:\Program Files\Adobe のシンボリック リンクが作成されました
 
  C:\Program Files> rmdir /S Adobe___
(2013-01-22 追記)
Windows Vista/7 ならば Robocopy が標準で使えるので下記のほうがいいかも。
"C:\ProgramData\Microsoft"にある "Windows Defender" を D:\ProgramData\Microsoft に移すものとして:

  • 「Win+R(ファイル名を指定して実行)」で "cmd /f:on [Ctrl+Shift+Enter, 管理者権限で実行]"
  • コマンドラインから下記の順に実行
C:\ProgramData\Microsoft>robocopy "Windows Defender" "D:\ProgramData\Microsoft\Windows Defender" *.* /copyall /dcopy:t /mir
C:\ProgramData\Microsoft>ren "Windows Defender" "___Windows Defender"
C:\ProgramData\Microsoft>mklink /D "Windows Defender" "D:\ProgramData\Microsoft\Windows Defender"
C:\ProgramData\Microsoft>rmdir /S "___Windows Defender"

Apr 23, 2010

LINQ to XML メモ







  1. <version="1.0" encoding="utf-8"?>
  2. <game_consoles>
  3.   <ip_address_map>
  4.      <name="Xbox 360">192.168.11.2>
  5.      <name="PlayStation 3">192.168.11.3>
  6.      <name="Wii">192.168.11.4>
  7.      <name="3DO Real">192.168.11.5>
  8.      <name="DreamCast">192.168.11.6>
  9.   </ip_address_map>
  10. <game_consoles>
というXMLファイル・config.xml があるとき、「targetタグ」から「nameに3を含む」項目に次のようにしてアクセスできる:
  1. using System;
  2. using System.Linq;
  3. using System.Xml.Linq;
  4. // ...
  5.    XDocument config_xml = XDocument.Load(@".\config.xml");


  6.    var query = from c in config_xml.Descendants("target")
  7.                 where c.Attribute("name").Value.Contains("3")
  8.                 select c.Attribute("name").Value + " " + c.Value;
  9.     foreach (var q in query)
  10.     {
  11.         Console.WriteLine("{0}", q);
  12.     }


from/where/selectのあたりが LINQ (Language INtegrated Query) to XML と呼ばる仕組みを使っている部分。C# 3.0 (.NET Framework 3.5 以降) で利用可能。

ハッシュテーブルなど、別なデータ構造に入れる場合の例はこんな感じでいける:

 
  1. var platform_map = new Dictionary<stringstring>();
  2. XDocument config_xml = XDocument.Load(@".\config.xml");
  3. var query = from c in config_xml.Descendants("target")
  4.                  where c.Attribute("name").Value.Contains("3")
  5.                  select new KeyValuePair<stringstring>(c.Attribute("name").Value, c.Value);
  6.      foreach (var q in query)
  7.      {
  8.          platform_map[q.Key] = q.Value;
  9.      }
最初に登場した config.xml は、System.Xml.Linq 以下の XDocument などを使い次のようにして作成されたもの:





  1.     XDocument doc = new XDocument(
  2.         new XElement("game_consoles",
  3.            new XElement("ip_address_map",
  4.                 new XElement("target"new XAttribute("name""Xbox 360")"192.168.11.2"),
  5.                 new XElement("target"new XAttribute("name""PlayStation 3")"192.168.11.3"),
  6.                 new XElement("target"new XAttribute("name""Wii")"192.168.11.4"),
  7.                 new XElement("target"new XAttribute("name""3DO Real")"192.168.11.5"),
  8.                 new XElement("target"new XAttribute("name""DreamCast")"192.168.11.6")
  9.                 )
  10.             )
  11.         );
  12.     doc.Save(@".\config.xml");
XmlReader/XmlWriterを利用したコードに比べると格段に楽ですね。

Feb 14, 2010

The Pareto Theory

A Technique for Producing Ideas (アイデアのつくり方) のメモ。 日本語版の「パレートの学説」。
80対20の法則で知られるパレートによる人の分類・speculatorとrentierが登場します。
以下は単語のメモ:


  • speculator
    • 投機家、相場師;思索家
  • rentier
    • 〈フランス語〉不労所得生活者
  • speculative
    • adj.思索にふける、熟考する;(不確かな情報に基づいた)推測の;《金融》投機的な、危険をはらんだ
  • preoccupied
    • 没頭している、頭がいっぱいで;すでに占有されている
  • italicized
    • イタリック体の ※訳書中で傍点により強調している部分は原著だとイタリック体で表記されている
  • brood
    • 卵を抱く;(雲が)垂れ込める、静かに覆う;じっと考える、思案[熟考]する、くよくよ考える ※難しい…。 訳書では「冥想性(brooding quality)」となっていた
  • political and diplomatic reconstruction
    • 政治・外交的再構成 (※訳書より)
  • bag holder
    • 鴨にされやすい人 (※訳書より。辞書には無い)
  • God's chilluns
    • 神の申し子  (※訳書より)
  • at any rate
    • とにかく、いずれにせよ、どちらにせよ、何はともあれ、それにしても


Feb 7, 2010

.zshrc

明日からちょっと使ってみよう、という分にはこのくらいの設定で十分かと。
HTML変換にはPastebinを利用させていただきました。(2011-01-15)設定ファイル中の「^[」はエスケープなので注意。Emacsなら C-q ESC で入力できます。

  1. HISTFILE=~/.zsh_history
  2. HISTSIZE=100000
  3. SAVEHIST=100000
  4. LANG=ja_JP.UTF-8
  5. PROMPT="%{^[[31m%}$%{^[[m%} " # 通常時
  6. RPROMPT="%{^[[31m%}[%~]%{^[[m%} " # 右プロンプト
  7. PROMPT2="%{^[[31m%}%_%%%{^[[m%} " # for/if 等のネスト時
  8. SPROMPT="%{^[[31m%}[Confirm] %R -> %r ? ([N]o,[Y]es,[A]bort,[E]dit):%{^[[m%} " # コマンドのスペル修正時
  9. # Emacs キーバインド
  10. bindkey -e
  11. # 履歴関連
  12. setopt hist_ignore_dups # 重複を除去
  13. setopt share_history # zshプロセス間で履歴を共有
  14. setopt extended_history # 時刻も記録
  15. # cd 関連
  16. setopt auto_cd # ディレクトリ名のみで cd
  17. setopt auto_pushd # cd -[Tab] で履歴表示→番号でそこへ戻る
  18. # 補完関連
  19. autoload -Uz compinit
  20. compinit
  21. zstyle :compinstall filename '~/.zshrc'
  22. zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' # 大文字/小文字の違いを無視
  23. zstyle ':completion:*:default' menu select=1 # 候補表示後にもう一度Tabを押してカーソル選択モードに
  24. setopt correct # (要compinit) コマンド名の間違いを指摘させる(SPROMPT)
  25. setopt list_packed # 補完候補を詰めて表示
  26. setopt nolistbeep # 補完表示時のビープ音を抑制
  27. # ls : zsh による補完と実際の出力の色を合わせる
  28. # dircolors コマンドの結果を利用するのがよいかも
  29. # Ref.: http://journal.mycom.co.jp/column/zsh/009/index.html
  30. zstyle ':completion:*' list-colors 'di=34:ln=35:so=32:pi=33:ex=32;01:bd=01;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=42;34'
  31. LS_COLORS='di=34:ln=35:so=32:pi=33:ex=32;01:bd=01;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=42;34'
  32. # 先方予測 : 無効化はコマンドライン上から predict-off でOK
  33. autoload predict-on
  34. predict-on
  35. # zed : Ctrl-x,Ctrl-w で保存して終了。 Ctrl-c で保存せず終了。
  36. # Ref.: http://journal.mycom.co.jp/column/zsh/011/
  37. autoload zed
  38. alias ls='ls --show-control-char --color=auto'
  39. alias la='ls -a --show-control-char --color=auto'
  40. alias ll='ls -l --show-control-char --color=auto'
  41. alias lal='ls -al --show-control-char --color=auto'
  42. alias where="command -v"
  43. alias j="jobs -l"
  44. # Ref.:
  45. # * rom Bash to Z Shell: Conquering the Command Line
  46. #   * http://www.bash2zsh.com/
  47. # * Adam's zsh page
  48. #   * http://adamspiers.org/computing/zsh/
  49. # * Zyrnix's .zshrc
  50. #   * http://zshwiki.org/home/cfg/zyrnix
  51. # * 漢のzsh
  52. #   * http://journal.mycom.co.jp/column/zsh/
  53. # * 横着プログラミング 第3回: 履歴マニア
  54. #   * http://0xcc.net/unimag/3/

The Formula of Experience

A Technique for Producing Ideas (アイデアのつくり方) のメモ。 日本語版の「経験による公式」。
サンゴの島(atoll)だって突然できあがるわけではないんだし、アイデアにもできあがる過程があるはずだ、と。
以下は単語のメモ:
  • romance

    • 恋愛物語、空想小説、冒険物語、伝奇物語、作り話、虚構

  • lend to

    • ~に役立つ

  • South Seas

    • 南太平洋

  • atoll

    • 環状サンゴ島

  • unaccountable

    • 説明できない、不思議な

  • ponder

    • じっくり考える、思案する

  • confide

    • ~を打ち明ける;~を委託する、信任する

  • glut

    • 供給過剰;食べすぎる;~の欲望を満たす、~を飽かせる

Jan 31, 2010

MSBuildのパスを探す

@echo off
for %%v in (4.0 3.5 2.0) do (
    for /f "tokens=2*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\%%v" /v MSBuildToolsPath ') do (
       echo Your MSBuild is installed in: %%jMSBuild.exe
    )
) 2>NUL
  • MSBuild.exeが配置されている場所がHKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\2.0\MSBuildToolsPath というレジストリにあるのでそれを取得しようとしています。
  • コマンドラインからレジストリの情報を操作するために reg.exe を利用しています。
  • reg.exeの出力を加工するために for の文字列パース機能を利用しています。
  • for /f のパース動作制御キーワード :

    • delims : 未指定の場合は "delims= " (タブ1文字+半角スペース1文字)と同じ
    • tokens=2* : %%i に2列目 (ここではREG_SZ) を、 %%j に3列目以降の文字すべて(ここではレジストリの内容)をまとめて格納

  • 参考:

    • http://www.robvanderwoude.com/ntregistry.php
    • http://www.dostips.com/DtTipsStringManipulation.php#Snippets.SplitString
    • http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/for.mspx