2013年9月4日水曜日

距離感

2週間ほどの帰省からの帰還.終わってみると案外あっけないような長かったような不思議な二週間でありました。勝手にご飯が用意され掃除が行き届くという天国の様な環境に甘えた結果、体重がえらいことになっている以外は久々の地元の空気がなかなか新鮮で楽しく過ごせました。

長いこと会えていなかった高3の担任が寂しがってるという情報をキャッチしていたので母校へ行ったのですが,なんだか周りがわっかい高校生中学生ばかりで(当たり前)、ちょっと前までこの空間に自分が居たことが信じられませんでした。あの空気に僕はもう馴染めません。完全アウェーです。

帰りに寄った部活でマウンドに久々に経った時もホームとの距離がやたらと遠くて、数年前はここで平気で投げていた事が実感を伴って思い出せず、ちょっとさみしい思いをしました。

よく久しぶりに会う友達にも変わってないなぁと言われる事が多かったり、自分でも高校から大学にかけて対して変わっていないつもりではあるにしても、ちょっとづつ変わっているようです。

ちなみに担任は一ミリも全く変わっておらず、「なんで来たんだなんか精神でも病んでるのか? そうじゃないなら早く東京で彼女でも作れ、とりあえずはサークルだサークルに入れそして遊べこんな田舎から早く帰れ」とありがたい助言を頂きました。彼はあのままで死ぬまで突き通してほしいです。

2013年8月16日金曜日

打線シュミレーターを作ろうとする

using System;
class Player
{
    public string name;
    public int pa, ab, hit, single, two, three, hr, bb;
    public double avg, obp, slg, ops;

    public void data(string name, int pa, int hit, int two, int three, int hr, int bb)
    {
        this.name = name;
        this.pa = pa;
        this.ab = pa - bb;
        this.hit = hit;
        this.single = hit-two-three-hr;
        this.two = two;
        this.three = three;
        this.hr = hr;
        this.bb = bb;
        this.avg = (double)(single + two + three + hr) / this.ab;
        this.obp = (double)(hit + bb) / this.pa;
        this.slg = (double)(single + two * 2 + three * 3 + hr * 4) / this.ab;
        this.ops = this.obp + this.slg;
        Console.Write("Name: {0}, Avg: {1}, OBP: {2}, SLG: {3}, OPS: {4}\n", this.name, (avg).ToString("#.###"), (obp).ToString("#.###"), (slg).ToString("#.###"),(ops).ToString("#.###"));
    }

    public void data(){
        Console.Write("Name: {0}, Avg: {1}, OBP: {2}, SLG: {3}, OPS: {4}\n", this.name, (this.avg).ToString("#.###"), (this.obp).ToString("#.###"), (this.slg).ToString("#.###"),(this.ops).ToString("#.###"));
    }
}

class StartingMenber : Player
{
    public int l_pa, l_ab, l_hit, l_single, l_two, l_three, l_hr, l_bb, l_daten;
    public double l_avg,l_obp,l_slg,l_ops;

    public StartingMenber()
    {
        this.l_pa = 0;
        this.l_ab = 0;
        this.l_hit = 0;
        this.l_single= 0;
        this.l_two = 0;
        this.l_hr = 0;
        this.l_bb = 0;
        this.l_three = 0;
        this.l_daten = 0;
    }
    public void ShowLogData()
    {
        this.l_ab = this.l_pa - this.l_bb;
        this.l_avg = (double)(this.l_single + this.l_two + this.l_three + this.l_hr) / this.l_ab;
        this.l_obp = (double)(this.l_single + this.l_two + this.l_three + this.l_hr + this.l_bb) / this.l_pa;
        this.l_slg = (double)(this.l_single + this.l_two * 2 + this.l_three * 3 + this.l_hr * 4) / this.l_ab;
        this.l_ops = this.l_obp + this.l_slg;
        Console.Write("Name: {0:0.000}, Avg: {1}, OBP: {2}, SLG: {3}, OPS: {4} 打点: {5}\n", this.name, (this.l_avg).ToString("#.###"), (this.l_obp).ToString("#.###"), (this.l_slg).ToString("#.###"), (this.l_ops).ToString("#.###"),this.l_daten);
    }
     
}

class Baseball
{
    public static int[] baseph = { 0, 0, 0, 0 };
    public static int outcount = 0;
    public static int gamenum = 200;
    public static bool kai = true;
    static void Main()
    {
        Player kikuchi = new Player();
        kikuchi.data("廣瀬", 252, 62, 8, 1, 7, 41);
        Console.Write("試合数を入力してください :");
        gamenum = int.Parse(Console.ReadLine());
     
        StartingMenber[] team1 = new StartingMenber[9];
        for (int i = 0; i < 9; i++)
        {
            team1[i] = new StartingMenber();
            Console.Write("{0}番", i + 1);
            team1[i].data("廣瀬", 252, 62, 8, 1, 7, 41);
        }
        int seed = Environment.TickCount;
        for (int k = 0; k < gamenum; k++)
        {
            outcount = 0;
            seed +=2;
            for (int num = 0; outcount < 27; num++)
            {
                if (kai)
                {
                    Console.Write("{0}回の攻撃\n", outcount / 3 + 1);
                    kai = false;
                }
                getdageki(ref team1[num % 9], ref baseph, seed++);
            }
        }
        Console.Write("得点:{0} 平均得点{1}\n", baseph[3], ((double)baseph[3] / gamenum).ToString("#.000"));
        for (int i = 0; i < 9; i++)
        {
            team1[i].ShowLogData();
        }
     
    }

    public static void getdageki(ref StartingMenber batter, ref int[] b, int seed)
    {
        Random r = new Random(seed);
        int d_kekka = r.Next(batter.pa);
        int t = 0;
        batter.l_pa++;
        if (d_kekka <= batter.bb)
        {
            Console.Write("フォアボール\n");
            batter.l_bb++;
            if(b[0]==0){
                b[0] = 1;
            }
            else if (b[1] == 0)
            {
                b[1] = 1;
            }
            else if (b[2] == 0)
            {
                b[2] = 1;
            }
            else
            {
                t++;
            }
        }
        else if (d_kekka <= batter.bb + batter.hr)
        {
            Console.Write("ホームラン!\n");
            batter.l_hr++;
            t += b[0] + b[1] + b[2] + 1;
            for (int k = 0; k < 3; k++)
            {
                b[k] = 0;
            }
        }
        else if (d_kekka <= batter.bb + batter.hr + batter.three)
        {
            Console.Write("スリーベース!\n");
            batter.l_three++;
            t += b[0] + b[1] + b[2];
            b[0] = 0;
            b[1] = 0;
            b[2] = 1;
        }
        else if (d_kekka <= batter.bb + batter.hr + batter.three + batter.two)
        {
            Console.Write("ツーベス\n");
            batter.l_two++;
            t += b[1] + b[2];
            if (b[0] == 0)
            {
                b[1] = 1;
                b[2] = 0;
                b[0] = 0;
            }
            else if (b[0] == 1)
            {
                b[2] = 1;
                b[1] = 1;
                b[0] = 0;
                int rand2 = r.Next(100);
                if (outcount % 3 == 0 && rand2 <= 15)
                {
                    t++;
                    b[2] = 0;
                }
                else if (outcount % 3 == 1 && rand2 <= 25)
                {
                    t++;
                    b[2] = 0;
                }
                else if (outcount % 3 == 2 && rand2 <= 50)
                {
                    t++;
                    b[2] = 0;
                }
            }
        }
        else if (d_kekka <= batter.bb + batter.hit)
        {
            Console.Write("ヒット\n");
            batter.l_single++;
            t += b[2];
            b[2] = b[1];
            b[1] = b[0];
            b[0] = 1;
            int rand1 = r.Next(100);
            if (b[2] == 1)
            {
                if (outcount % 3 == 0 && rand1 <= 30)
                {
                    t++;
                    b[2] = 0;
                }
                else if (outcount % 3 == 1 && rand1 <= 50)
                {
                    t++;
                    b[2] = 0;
                }
                else if (outcount % 3 == 2 && rand1 <= 70)
                {
                    t++;
                    b[2] = 0;
                }
            }
            else if (b[1] == 1 && b[2] == 0 && rand1 <= 20)
            {
                b[2] = 1;
                b[1] = 0;
            }
        }
        else
        {
            outcount++;
            Console.Write("凡打\n");
            if (outcount % 3 == 0)
            {
                if (outcount != 27)
                {
                    Console.Write("チェンジ\n");
                    Console.Write("{0}回の攻撃\n", outcount / 3 + 1);
                }
                else { Console.Write("GameSet\n"); }
                b[0] = b[1] = b[2] = 0;
            }
            else if (b[2] == 1 && r.Next(100) >= 50)
            {
                t++;
                b[2] = 0;
            }
            else if (b[2] == 0 && b[1] == 1 && r.Next(100) <= 25)
            {
                b[2] = 1;
                b[1] = 0;
            }
            else if (b[1] == 0 && b[0] == 1 && r.Next(100) < 5)
            {
                b[1] = 1;
                b[0] = 0;
            }
        }
        tokuten(ref b[3], ref batter.l_daten, t);
    }

    public static void tokuten(ref int g_tokuten, ref int b_daten, int t)
    {
        g_tokuten += t;
        b_daten += t;
        if (t > 0)
        {
            Console.Write("{0}点得点!\n", t);
        }
    }
}

なんかいやってもゴミ2割打者廣瀬と3割後半神廣瀬が交互に並ぶ打線になってシュミレーターの意味を成さない!
おそらくrandomつくってるところがおかしいんだけど,何がおかしいのかさっぱりわからないから困ったぞ~

2013年8月11日日曜日

WHIPの扱い

WHIPの解釈と応用
http://baseballconcrete.web.fc2.com/alacarte/whip.html

最近良く聞くWHIP,あんまり有用じゃないっていうのを何処かで見たような気がしてたんだけど多分これですね.
めっちゃ綺麗にまとめられてる上に論理的ですっきり頭に入るのが良い.実験レポートでもこんな綺麗な文章書きたいね.
これを読んでると,野球の指標って人によって分かりやすさと正確さとどっちを求めるかが違うっていうのをちゃんと頭に入れて考えないといけないなって思う.
複雑すぎても一部のマニアックな人しかわからないし,かと言って打率とか出塁率,防御率みたいな簡単な指標だけで選手のすべてを判断できるかって言うとそうでもないし,正解は無いのかも.

2013年7月28日日曜日

後半戦に向けて

現在88試合消化済み

投手陣は中継ぎ先発の違いを除けばリーグ平均よりもちょっと良いぐらいのレベルで落ち着いてる.これを良い方に捉えることも出来るが,マエケンバリントン野村大竹を有して平均レベルに落ち込んでしまうというのはちょっと悲しい感じもする.

データを見ると,防御率その他指標を見ると投手陣は阪神巨人が圧倒,それから1点弱悪くなって広島中日,またそこから0.6点ほど悪くなって横浜ヤクルト.QS率53.8%は巨人と大差ないレベルというのを考えると,やはり中継ぎ陣が崩壊していることが伺える.
現状中継ぎでまともに投げれるのが久本>今村,小野ぐらいしか居ない.しかも,今村はもう去年の様なストレートが投げれておらず四死球ばかりで不安定,小野は四死球率が高い,奪三振率は低い,やたらと低い被BABIPと確変でなんとか保ってると言う感が否めないことを考慮すると,もうセットアッパーの前を任せられるのは久本という状態.しかも7月はその久本も打ち込まれはじめており,永川横山が奇跡的な復活をしない限り中継ぎ崩壊待ったなしである.

こんなことになってるのも,若手有望株の中村恭平,今井,中崎,中田廉,福井,ちょこっとブレイクして消えた篠田赤ハンカチあたりが仕事をしてない事が最大の原因であることを考えると二軍の育成力,ドラフト戦略が上手くいっていないことを如実に表している.

マエケンバリントン大竹がいるうちにこの中から一人ぐらいはまともに先発を任せられるのが出て来てほしいなと言う願望だけど現実は甘くなさそう.


打撃成績は相変わらず低調.去年何故か優秀な選球眼を持っているのにもかかわらず固定されなかった丸と,新加入のキラの両者が素晴らしい長打率と選球眼を発揮しているのは希望.廣瀬は連続出塁記録を作った後から右肩下がりではあるもののRX27は6.5を超える,もうひと踏ん張りしてほしいところ.しかし,この3人を除くと梵ルイスがリーグ平均程度の得点貢献をしているが,それ以外がどうにも振るわない.松山と岩本は表面上良い成績だが,二人共四死球を全く選ばないために得点貢献は大したレベルには至っていない.(松山4.87,岩本3.27) 守備の縛りも考えるとマイナスの方が大きいと推察される.
あとは菊池と堂林.この二人はそもそもヒットを打てていない.菊池は,セカンドは打撃貢献がもともと平均して低いポジションであるから,相対的にそれほどマイナス要素は無いし守備での貢献があるぶんまだ大丈夫とは言えるが,問題は堂林である.本来長打を期待されているはずなのに.IsoP(長打の割合を表す指標)がチーム平均を大きく割って中東と同等,菊池よりも大きく低いレベルである.去年の飛ばないボールで平均してXR27が5を超えていたのに打てなくなっているのは相手チームの研究かはたまたスランプか.一回二軍に落としてーとも考えたいがそんな余裕が無いのが辛いところ.


2013年6月6日木曜日

javascriptで遊ぶ

大学の講義でやれC言語だやれC#だクラスだオブジェクト指向だとうるさくなってきたので,ちょっと本腰をいれなあかんなと思い始めたってのは前書きました.

そこでLinuxだと楽にやれるよとアドバイスを頂いたので,Win8のDeveloper版を試した時以来HDDのゴミと化していたVirtualBoxを久しぶりに起動して,なれない仮想OSとにらめっこしながらなんとかUbuntuとかいうLinuxの一種?を入れることには成功しました.
なんですが,どうにもメモリの割り当てとかCPUのコア数の割り当てが上手く行かず,シングルコア512MBのメモリ上で動くクソPCが完成しました.なんで上手くいかんかなぁ…


そんで,まあとりあえずはブラウザで動く手頃なもんから始めてみようとjavascriptに手をつけてオブジェクト指向とやらの練習をしてます.昔htmlとcss2はちょっとかじってたので少しは入りやすいかなと.
色々やってるんですが,わかったようなわからんような不思議な感じです.直感的に操作できるのはええんですが,書いてる人が意味がわかってなくてもなんとなくで動いてしまう節があります.便利っちゃ便利なんだけどね.

html5のcanvasタグと組み合わせると,お絵かきが出来る~ってのをサーフィンしてたら見つけたので,色々見ながらボールが吹き出すだけのよくわからんもんを作ってみました.
http://yakyuzuki.blogspot.jp/p/var-namea-0-window.html

本当はブラウザ上で重力定数いじったりボールの数いじったり色の分布をいじったりするボタン的なものを用意しようと思ってたんですが,なーんかこれも上手くいかないのでちょっと心折れてます.プログラムムズい.


2013年5月29日水曜日

Word-数式エディタメモ

数式エディタについて色々調べてたら結構便利そうな機能があったのでメモ

・場合分けを入力する
"\eqarray"+"(式1@式2@式3@…)"+"<space>"

ex). \eqarray(x=3@y=2)<space>

・&を加えることで上下の式の位置を整えれる.
式1,2,3…の各々に&を入れると、&が入っているところを上下で揃えてくれる.

ex).\eqarray(x&+&y&+&z&=&20@5x&+11&y&+7&z&=&2)<space>

ex2). \eqarray(左辺&=lim_(n->\infty)1/n\sum_(k=1)^n f(k/n)@&=\int_0^1f(x)dx)<space>

Word の行形式の数式と数式オートコレクト(Microsoft)
http://office.microsoft.com/ja-jp/word-help/HA101861025.aspx
http://www.unicode.org/notes/tn28/UTN28-PlainTextMath-v2.pdf

Word で楽に数式を作る
http://www.eml.ele.cst.nihon-u.ac.jp/~momma/other/WordEqn3x.pdf

WordとTexって結局どっちがええのんか

実験のレポートをやってると、文章中に数式を打ちこみまくります.その時にWordよりもTexのほうが数式は綺麗に出力できるから便利~ってのをよく聞くので、Texwikiってとこを参考にして、TexエディタのTexmakerっていうのを入れてみました.
http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Texmaker

・Texmaker公式
http://www.xm1math.net/texmaker/

まだTexを入れたことがないって人は、まず最初にW32Texっていうのをインストールする必要があるので、先にそれをインストールします.
(http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?W32TeXを参照)
パッケージまるごと自動でインストールしてくれるソフトを作ってくれている人がいるので、それを動かせば勝手にやってくれるので便利です.さっきの頁の「簡易インストーラー」のところにあります


このTexmakerなにやら日本語出力だかに問題があるらしいので、環境設定のところを

Texmakerの設定(win)
http://blog.livedoor.jp/kobakeiichi_exe/archives/65783993.htm

とかを見ながらちょいちょい変えると、とりあえずそれっぽいものを出力出来るようになりました.やったね!

EditaでTexをいじってみて思ったことをつらつらと
・オートコンプリートって素晴らしい
今までTexを使って文章を打つときはTerapadみたいなテキストエディタしか使ってませんでした.そのときはコマンド打ち込むのやたら面倒臭いしWordのが100倍楽じゃん…とか思ってましたが、エディタにはオートコンプリートがあるので案外楽にうてます.\begぐらいまで打ち込むと、勝手に予測変換で\begin{equation}まで打ってくれるのはかなりのストレス軽減.まあちょっと考えればTex用のオートコンプリートのついたエディタがあるぐらい想像つきそうですがそれに2年以上気づかなかったのが情けない

・思ったように数式を出力できる
当たり前っちゃ当たり前ですがちょっと感動.Word2010の数式エディタはtexっぽい入力の仕方で数式を打ち込めるので、それを覚えてからはまあまあ入力が早くなってはいたんですが、あれはどうにも二次形式と行形式が思ったように行かない事がままあって面倒なんです.特に一行分の高さで表示したいところで分数を打ち込むときとか.まず一回入力して行形式に変えて、そっから添字と定数だけは二次形式に…とまあ手数も増えて面倒臭い.
それに対して、Texだと分数はひとつの関数になってます.(\frac{a}{b}でa/bを二次形式で出力します)なので、自分が二次形式分数として出したいところだけ分数として出力できるので、これはええなと思いました.

逆にWordとくらべて面倒臭いなと思ったこと
・画像貼っつけるのにタグいじらないといけない
直感的に行かないのはうざったい.Excelから表とかグラフをはっつけるのもちょっと大変
・ソースを作るのにいちいち英半角に直すのがうっとうしい
慣れれば早いんだろうけどね.こういう時英語圏の人がうらやましいなって思う
・数式のリファレンスを見ながらの作業になる
Wordだと最終手段「マウスで選択!」がある分ちょっと面倒.あとWordだとわからない文字を見つけてきてHoverすると、それの入力方法がポップアップされるからリファレンスもそんなに見なくても大丈夫、っていうのも大きな差かな.

あ、これなんて読むんだろうっていうときにポップアップは結構便利