2014年1月16日木曜日

PC再起動時に,前回開いていたPower Pointファイルをまとめて開く

Windows Updateをかけると,PCの再起動を迫られることがよくある.
何の因果かPower Pointを5枚も10枚も開いていた場合,再起動した後にそれらをひとつひとつ開き直すのはめんどくさい. 特にファイルの保管場所がバラバラだとこの上なくめんどくさい.
そこで,現在開いているPower Pointファイルの場所(ファイルパス)を記憶しておいて,再起動後にそれらをまとめて開くためのプログラムを書いた. 言語はC#.(実はC#触るの初めてなので環境構築からだった)
仕様は,
  • 起動するとコンソール上に「save」「open」のメニューが出る
  • saveを選ぶと,現在開いているpptファイルのパス一覧を表示し,ユーザのデスクトップフォルダに保存する.
  • openを選ぶと,前回デスクトップに保存したファイルからパスを読み込んで,まとめて開いてくれる
という感じ.で,コードは以下. 命名とか色々適当なのはスルーで.

using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Microsoft.VisualBasic;

namespace PPTSO{
    class PPT{
        private string save_file = "C:\\Users\\" + System.Environment.UserName + "\\Desktop\\PPTSO.txt";

        static void Main(string[] args){
            PPT ppt = new PPT();
            if (!File.Exists(ppt.save_file)){
                File.Create(ppt.save_file).Close();
            }
            while (true){
                Console.Clear();
                Console.WriteLine("s: save current ppt files");
                Console.WriteLine("o: open previous ppt files");
                Console.WriteLine("q: quit");
                Console.Write("input: ");
                string menu = Console.ReadLine();
                Console.WriteLine(menu);
                if (menu.Equals("s")){
                    ppt.savePPT();
                }else if (menu.Equals("o")){
                    ppt.openPPT();
                }else if (menu.Equals("q")){
                    break;
                }else{
                    Console.WriteLine("input error. press any key...");
                    Console.ReadKey();
                }
            }
        }

        public void savePPT(){
            Interaction.CreateObject("PowerPoint.Application", "");
            PowerPoint.Application pApp = (PowerPoint.Application)Interaction.GetObject(null, "PowerPoint.Application");
            foreach (PowerPoint.DocumentWindow dw in pApp.Windows){
                Console.WriteLine("{0}", dw.Presentation.FullName);
            }
            string yn;
            Console.WriteLine("--------------------");
            Console.WriteLine("are you sure to save? y/n");
            while (true){
                yn = Console.ReadLine();
                if (yn.Equals("n")){
                    return;
                }else if (yn.Equals("y")){
                    break;
                }else{
                    Console.WriteLine("input error. press \"y\" or \"n\":");
                }
            }
            FileStream fs = new FileStream(save_file, FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            foreach (PowerPoint.DocumentWindow dw in pApp.Windows){
                sw.Write(dw.Presentation.FullName + "\r\n");
            }
            sw.Close();
            fs.Close();
        }

        public void openPPT(){
            string path;
            List<string> pathList = new List<string>();
            FileStream fs = new FileStream(save_file, FileMode.Open);
            StreamReader sr = new StreamReader(fs);
            while ((path = sr.ReadLine()) != null){
                pathList.Add(path);
                Console.WriteLine(path);
            }
            sr.Close();
            fs.Close();
            string yn;
            Console.WriteLine("--------------------");
            Console.WriteLine("are you sure to open? y/n");
            while (true){
                yn = Console.ReadLine();
                if (yn.Equals("n")){
                    return;
                }else if (yn.Equals("y")){
                    break;
                }else{
                    Console.WriteLine("input error. press \"y\" or \"n\":");
                }
            }
            List<string> openedPathList = new List<string>();
            Interaction.CreateObject("PowerPoint.Application", "");
            PowerPoint.Application pApp = (PowerPoint.Application)Interaction.GetObject(null, "PowerPoint.Application");
            foreach (PowerPoint.DocumentWindow dw in pApp.Windows){
                openedPathList.Add(dw.Presentation.FullName);
            }
            PowerPoint.Presentations pPt = new PowerPoint.Application().Presentations;
            foreach (string str in pathList){
                if (openedPathList.Contains(str)) continue;
                pPt.Open(str);
            }
        }
    }
}








相関係数の検定

論文を書く時など,シミュレーション実験の結果から相関係数を算出することがある.
参考程度であれば相関係数を出しただけで終えても良いのだが,論文等に載せる場合は算出した相関係数に意味があるか否かを調べる必要がある.
どういうことかと言うと,相関係数の算出に用いたデータはあくまでもサンプルであり,真の相関係数が求まっているわけではない.

つまり,母集団から標本を取り出して計算した結果に過ぎないので,もし使用した標本が外れ値だらけで,母相関係数との間に大きなずれがあれば,意味のない値ということになってしまう.
そこで,母相関係数ρ=0であるという帰無仮説をたてて,有意性の検定を行なう.
これを無相関検定と呼ぶ.手順は次の通り.(rは相関係数,nはサンプル数)
  1. 帰無仮説をたてる:「相関が無い(ρ=0)」
  2. 対立仮説をたてる:「相関がある(ρ≠0)
  3. 有意水準を決める:通常は1%か5%
  4. 自由度*を求める:自由度=サンプル数-2
  5. t値を計算する:t=r * ((n-2)/(1-r^2))^(1/2)
  6. t分布表を見て,該当する自由度の箇所の水準値をt値が上回っていれば,帰無仮説は棄却(対立仮説を採択)
  7. 6.と逆の場合には,帰無仮説を採択
エクセルで求める場合,まず以下でt値を計算する.

 t=ABS(相関係数*SQRT(サンプル数-2)/SQRT(1-相関係数^2))
次に,以下でp値を計算する.

 p=TDIST(t値, 自由度, 2)
pが有意水準を下回っていれば,帰無仮説を棄却できる(相関係数が有意であると言える).


※参照ページ

※自由度
 母集団からサンプル数nで標本を取り出す場合について考える.標本平均を母平均と一致させるためには,n-1個のサンプルは自由に選んでも良いが,残りの1つで標本平均を調節しなければならない.この,自由に選べる数「n-1」が自由度.
 大雑把な理解としては,相関係数の場合は,相関を見る対象である2つの母集団が存在するため,自由度が2減る.従って,「サンプル数-2」が自由度となる.


2014年1月14日火曜日

jEditにスペルチェック機能を追加する

jEditにはSpell Checkというスペルチェック用のプラグインが用意されている.
Spell Checkを使うには,事前にAspellをインストールしておく必要がある.
Aspellはオープンソースのスペルチェッカーで,Spell CheckはjEdit側からこのAspellの機能を呼び出すためのプログラム.
Aspellのインストール方法についてはTeX Wikiに詳しい説明がある.
Windowsの場合,Aspell Win32版の配布ページから本体と辞書をダウンロードして,順にインストールする.記事執筆時点(2014.1.15)では,
  • 本体: Aspell-0-50-3-3-Setup.exe
  • 辞書: aspell-en-0.50-2-3.exe
なお,英語以外の言語の辞書もあるので必要に応じてインストールする.
Aspellをインストールしてbinフォルダにパスを通すと,コマンドプロンプトから以下のコマンドでテキストファイルのスペルチェックが可能.

aspell --lang=en -c ファイル名

例えば,以下のようなテキストファイルを用意する.

test text.
tets text.

これに対し,コマンドプロンプトで上記のコマンドを実行すると,下図のようになる.



画面下に出ている選択肢から例えば「1」を選ぶと,当該箇所が「test」に書き換えられる.

さて,jEdit側.
Spell Check pluginをインストールして,plugin optionsからSpell Checkのオプション画面を開く.
「Aspell Engine」という項目があるのでそこを開き,aspell.exeの場所を指定しておく.
(例えば,C:\Program Files (x86)\Aspell\bin\aspell.exe)

「General」という項目で,「Spell-checking engine」のところを「Aspell」に設定する.
その下にある「Refresh list」を押してから辞書として「en」を選択する.

これで準備はひとまず完了.
テキストファイルを開いた状態で,プラグインメニューからSpell Checkを選び「Spell check selection」を実行すると,スペルチェックしてくれる.
他にもいくつかメニューがあるので,状況に応じて使い分けすると良い.

なお,「Browse user dictionaries」を実行するとファイルブラウザ側でユーザ辞書のディレクトリが開く.
間違って変な単語をAdd(ユーザ辞書に追加)してしまった場合は,この辞書を修正する.
ただし,jEdit上で修正しても,反映されなかった.
たぶん,jEdit側で起動時に読み込んで,終了後に変更されていたら書き戻す感じになっている? jEditを終了した状態で修正し,修正後にjEditを再起動したらうまくいった.