TKYM's profile※ 画面は開発中のものですPhotosBlogListsMore Tools Help

Blog


    November 01

    公認けん玉 大空

    日本けん玉協会公認けん玉というものがある。
    級や段があって、認定を受けるためには公認のけん玉を使わないといけない。
     
    そのけん玉は、何種類かあるらしいのだが、あまり売っていない。
    大きな玩具店をみると、運が良ければTK16masterがあり、さらに運がよいと色を選べる。
    トイザラスとユザワヤ(大きい店舗)には赤だけあった。
    東京近郊の東急ハンズには、複数色、
    新宿のハンズには「大空」もあった(複数色)。
    単一色しかない店の場合、公認けん玉の隣におもちゃのけん玉もあったりするので注意。
    それと、ロフトは扱っている店をまだ見ていない。(2009/11/1)
     
     
    今回、塗装のないものと、赤を購入した。
    最近はまってきていたので、何種類かほしくなっていたが
    tk16masterで灯台が決まらないという言い訳だけはやめようと、そこまでは我慢した。
     
    結局、どのけん玉を使ってもできる技はできて、できない技はできなかった。
     
    もった感じは、tk16masterより軽い。
     
    ものすごい勢いで玉がぼこぼこになっていく。
     うぐいすできた
    October 29

    天気の良い日には手賀沼

    手賀沼は千葉県北西部の沼。
    昔は汚かったが、今は浄化が進み、遊歩道が整備され、公園や楽しめる施設も増えてきて、にぎわっている。
     
    アクセス
    常磐線我孫子駅より徒歩15分ぐらい
     
     
    おすすめ
    • 手賀沼公園
      よくイベントをやっていて、隣にあるアビスタも含めて考えるとほぼ毎週何かやっているようなイメージ。
      時には我孫子駅前の通りにも出店があることも。
      アビスタには図書館があり、ついでに読書も楽しめる。

    • 手賀沼親水広場
      水の館は入場無料で水や手賀沼に関する展示を見ることができる。
      1階には展示と、手賀沼にいる生物の展示。3階にはプラネタリウム、最上階は展望台になっている。
      外は広大な芝生と、複数のじゃぶじゃぶ池があり、一日楽しめる。
      手賀沼公園から少し歩いてみるとしたらここが目的地。

    • 道の駅しょうなん
      道路の休憩施設だが、地元の人が群がってしまっている道の駅。
      野菜の直売をやっている。その向かい側は温泉で、足湯もある。
      南側の沿岸は高規格な遊歩道兼自転車道があるため、
      その拠点として手賀大橋のあたりは便利だと思う。1周でだいたい20km、半周で10km。

    • 柏ふるさと公園・北柏ふるさと公園
      柏ふるさと公園はエコマラソンのスタート地点になっている。運動遊具がそろっている。
      北柏ふるさと公園は自然のイメージで、じゃぶじゃぶ池や、大堀川の河口付近で釣りができる。
      ここから西側も大堀川沿いの遊歩道がある。

    • 手賀沼フィッシングセンター
      手賀沼の漁協の施設。釣り堀や、バーベキュー、レストランがある。
      この施設の前に架かる手賀曙橋は眺めがよく、夕陽を撮っている人を見かけた。
      釣りをする人も多い。ここから東側も手賀川沿いの自転車道がある。

    楽しみ方はいろいろ、上の施設を拠点に、散策してみてはどうだろう。



    October 25

    タナトノート

     
    図書館で「タナト」という文字が目に入り、借りた。
    600ページ以上ある分厚い本だ。
    死が怖いもので、このような大作を夜な夜な読んでいては
    気がおかしくなってしまうかもしれないという懸念もあったが、
    それに興味が勝ってしまったため読み始めることになった。
     
    タナトノートという言葉は、死後世界の航行者を意味していて、
    麻酔によって人工的に臨死状態にさせ、死後世界を探検する。
     
     
    全体的に読みやすい内容で、憂鬱ながらも所々で笑い、すらすらと読んでいけた。
     
    最初のほうで記憶に残った表現がある。
    死は、神、女神、怪物、蛇がうようよいる河なんかではなかった。
    死、それはゆっくりと朽ちていく人間だった。
     
    何といっても、死はこれなのだと思う。恐ろしいものだ。
    そして、皆、そのことを普段は忘れて生きていける。
    しかし、いつかは向き合わねばならない。
    そこで、どうしていくか。
    September 18

    HSPでオセロ

    HSPでとりあえずオセロでも。
    ちなみに、ひとり遊びしかできません。

    実行にはHSPが必要です。

    othello

    全体的な構造としては、

    x, y 座標に置いた場合裏返せる個数を取得する関数
    #defcfunc revcnt array table, int x, int y, int curplayer

    #global
    タイトルとか画面の設定とか

    repeat

      背景描画、コイン描画、入力チェック

    loop

    *s_なんたら は、サブルーチンで、背景・コイン・クリック時がある。
    *s_background
    *s_coin
    *s_clicked

     

    --------

    #defcfunc という関数の定義は、戻り値を返せるが、この値を利用しないとエラーになってしまう。
    戻り値を捨てることを当たり前に考えていて困った。


    June 23

    if(0<i<100) という書き方 (C#)

    もちろん、 if(0<i<100) なんていう書き方は不可能である。
    しかし、何とかしようと思えばできなくもなさそうである。

       1: struct keisan
       2: {
       3:     public int i;
       4:  
       5:     List<range> condition;
       6:  
       7:     //tostring
       8:     public override string ToString()
       9:     {
      10:         return "" + i;
      11:     }
      12:  
      13:     //コンストラクタ
      14:     public keisan(int i) {
      15:         this.i = i;
      16:         condition = new List<range>();
      17:     }
      18:  
      19:     //新しく追加するとき
      20:     public keisan(keisan ks) {
      21:         this.i = ks.i;
      22:         condition = new List<range>();
      23:  
      24:         foreach(range r in ks.condition){
      25:             condition.Add(r);
      26:         }
      27:     }
      28:  
      29:     //bool へのキャスト
      30:     public static implicit operator bool(keisan ks){
      31:         foreach(range r in ks.condition){
      32:             if(r.min > ks.i || r.max < ks.i){
      33:                 return false;
      34:             }
      35:         }
      36:         return true;
      37:     }
      38:  
      39:     //int へのキャスト
      40:     public static implicit operator int(keisan ks) {
      41:         return ks.i;
      42:     }
      43:  
      44:     //int からのキャスト
      45:     public static implicit operator keisan(int i)
      46:     {
      47:         return new keisan(i);
      48:     }
      49:  
      50:     //オペレーター
      51:  
      52:  
      53:     //<
      54:     public static keisan low(int i, keisan ks) {
      55:         keisan result = new keisan(ks);
      56:         result.condition.Add(new range(i, int.MaxValue));
      57:  
      58:         return result;
      59:     }
      60:     public static keisan high(int i, keisan ks)
      61:     {
      62:         keisan result = new keisan(ks);
      63:         result.condition.Add(new range(int.MinValue, i));
      64:  
      65:         return result;
      66:     }
      67:  
      68:     public static keisan operator <(keisan ks, int i) {
      69:         return high(i, ks);
      70:     }
      71:     public static keisan operator <(int i, keisan ks){
      72:         return low(i, ks);
      73:     }
      74:  
      75:     //>
      76:     public static keisan operator >(int i, keisan ks){
      77:         return high(i, ks);
      78:     }
      79:     public static keisan operator >(keisan ks, int i){
      80:         return low(i, ks);
      81:     }
      82:  
      83:     //<=
      84:     //>=
      85: }
      86:  
      87: struct range{
      88:     public range(int min, int max) {
      89:         this.min = min;
      90:         this.max = max;
      91:     }
      92:  
      93:     public int min;
      94:     public int max;
      95: }

    int 型の値と、条件を保持する構造体を作ってみて、

    • 比較演算子をオーバーロードする。
    • int , bool へのキャストを書く
    • int からのキャストを書く(代入用)
    • ToString を書く

     

    細かいことは考えていないが、

       1: keisan k = 100;
       2:  
       3: if (200 > k > 0) {
       4:     MessageBox.Show(""+k);
       5: }

     

    と、書くことができた。


    February 17

    Destroy で 完全消去

    Destroy というソフトがある。
    安全にディスク消去できるソフトらしい。


    このソフトを使ってディスクを消去したいのだが、
    USB まで認識させるためには、ドライバを組み込まねばならない。
    そして、 FDD がないので余計ややこしい。

    自分の通った道をメモしておく。
    もっと簡単な方法はきっとある。
    1. 用意するもの
      1. Destroy の ファイル一式
      2. 仮想FDDソフト Virtual Floppy Drive
      3. USBASPI.SYS と DI1000DD.SYS
    2. Power2Go でブータブルディスクを作成する
      (Destroy 付属のISO を焼けばいいと思う。)
    3. VFD ドライブを作る。
      マイコンピュータにドライブが表示されるように努力する
    4. VFD でドライブを開く
      ドライブ0 を選択し、 開く/新規 をクリックし、ブータブルディスクの bootimg.img をイメージとして選択する。
    5. 開いたドライブにファイルを足す/追記する
      • USBASPI.SYS と DI1000DD.SYS
      • config.sys に 以下を追加する(説明書通り)
        device=usbaspi.sys
        device=di1000dd.sys
    6. VFD の画面から保存を選択する。適当に保存する
    7. Power2Go で、イメージとして6で保存したものを選択して、ブータブルCDを作成する。
      (deepBurner でも、ブートイメージを選んでブータブルCDを焼くメニューがあったような)
    試しにUSB メモリを消去してみたらうまくいった。
    あまりこういう面倒なことはしたくない。


    January 17

    数式をWebに貼る方法

    これまでOpenOffice の数式エディタで数式を作りコピペしていた。
    それが面倒になってきたので、GETパラメータに式を入れて表示できるもの
    がないか調べたところ、以下を見つけた。

    [mimeTeX]
    バイナリのcgi を実行する。
    ギザギザが気になる。


    [imgTeX]
    FastCGI
    キレイに表示できる
    TeX を使ってそれを PNG にしているとのこと。







    January 02

    曲線同士の交点を求めた

    ベジエ曲線同士の交点を、(自分的にはついに)求められた。
    誤差が大きいのであまり信頼は出来ないが、
    見た目上はちゃんと交点を指している。

    大まかにはこの記事の流れで出来た。
    http://prog-city.spaces.live.com/Blog/cns!E5379F11D9E8BB3F!1072.entry

    image

    December 07

    ベジエ曲線の分割

    曲線を t : 1-t に分割したければ、 制御点 1-2,  2-3,  3-4 を  t : 1-t に分割し、
    それを結んで出来た2本の直線を、再び t : 1-t に分割し、
    残りの1本を t : 1-t に分割する。

    分割した点は、新たな曲線の制御点になっている。


    image

            static public PointF[,] BezierCut(PointF[] points, float t){
                PointF[,] result = new PointF[2, points.Length];
                
                //stでくぎられる点を見つける
                //分割前の P0, Pn が分割後の L0, Rn になる
                result[0,0] = points[0];
                result[1,points.Length-1] = points[points.Length - 1];
    
                PointF[] prev = points;
                for (int i = 1; i < points.Length; i++)
                {
                    PointF[] tmp = new PointF[points.Length - i];
                    for (int j = 0; j < points.Length - i; j++)
                    {
                        //tmp[j] - tmp[j+1] の間を st で区切る
                        tmp[j].X = prev[j].X + (prev[j + 1].X - prev[j].X) * t;
                        tmp[j].Y = prev[j].Y + (prev[j + 1].Y - prev[j].Y) * t;
                    }
                    result[0,i].X = tmp[0].X;
                    result[0,i].Y = tmp[0].Y;
                    result[1,points.Length - i - 1].X = tmp[tmp.Length - 1].X;
                    result[1,points.Length - i - 1].Y = tmp[tmp.Length - 1].Y;
    
                    prev = tmp; //算出したものを保持
                }
    
                return result;
            }

    image

    このシリーズの他記事 http://prog-city.spaces.live.com/lists/cns!E5379F11D9E8BB3F!1047/

     

    December 01

    C#でベジエ曲線(5) ベジエ曲線同士の交点

    どのようにして曲線同士の交点を求めるか、全くわからずに悩んでいたが、直線との交点を求める方法を応用すれば可能であることに気づいた。

    曲線同士が接しているということは、その凸包も接していることになる。
    凸包の共有部分を調べ、絞り込むことで交点を得ることが出来るだろう。

    なんとなく思いついた流れ

    交点を求める( 曲線A, 曲線B){

        if( 2つの凸包が接していない ) return null;

        do{
            clipA[] = 曲線A が、曲線Bの凸包内部である部分
            clipB[] = 曲線B が、曲線Aの凸包内部である部分
        }while( ClipA.length == 1 && ClipB.length == 1 && 収束していない );

        if( ClipA.length ==  0 || ClipB.length == 0 ) return null;
        if( ClipA.length == 1 && ClipB.length == 1 && 収束した ) return 座標;

        result[] = {};

        for( ClipA.length 回 ){
            for( ClipB.length 回 ){
                result +=  交点を求める( ClipA[cnt1], ClipB[cnt2] );
            }
        }
        return result;
    }


    このシリーズの他記事: http://prog-city.spaces.live.com/lists/cns!E5379F11D9E8BB3F!1047/

    November 27

    Silverlightでは右クリックが使えない。

    よくよく考えてみれば、ブラウザ上で動くわけだから右クリックすると "Silverlight について" などと表示されるはずで、仕方ないことである。
     
    それを知るために、単純にGoogle 検索したのだが、
    silverlight + 右クリックの検索では、目的のコンテンツを得ることは出来ない。
     
    「~を右クリックして、メニューから~を選び・・・」
    などと、操作説明が大量にヒットして邪魔をする。
     
    そして無理にとった手法がこれ
     
    silverlight "右クリック" 処理 -"右クリックし" -"右クリックする" -"右クリックをする" -"右クリックメニュー" -"右クリックすると"-"右クリックすれば" -"右クリックをすると"
     
    結局見つけたのはMSDN の1ページ
     
    Silverlight 2 は現在、マウスの右ボタン イベントをサポートしていません。Silverlight 2 は、本質的にブラウザでホストされるプラグインであり、そのホスト ブラウザのプラグイン モデルに依存するので、入力シナリオを特定するのは困難です。マウスの右クリックのキャプチャは、その一例です。
     
    検索って難しい
    November 25

    凸包を得る

    凸包とは、 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGIH_jaJP222JP222&q=%e5%87%b8%e5%8c%85

    板の上に幾つも釘を打ち、外周から輪ゴムをかけて、ゴムと接している釘で構成される多角形。
    これを得るのはなんだか面倒な気がした。
    輪ゴムはすごいと思う。

    まず、端にある点を基準として、それに対する角度の順に点を並び替える。
    並び替えた順に点を見ていき、一つ前の点H 現在の点I 次点J の角度∠HIJ が マイナスの場合、
    凹みであると判断して、点Iを削除する。

    //凸包を得る
    static public PointF[] convex_hull(PointF[] points) {
    List<KeyValuePair<float, PointF>> dict = new List<KeyValuePair<float, PointF>>();

    //Y最小値を見つける
    int max = 0;
    for (int i = 1; i < points.Length; i++) {
    if (points[max].Y > points[i].Y)
    max = i;
    else if (points[max].Y == points[i].Y && points[max].X < points[i].X) {
    max = i;
    }
    }

    //角度とともにlist に格納する
    for (int i = 0; i < points.Length; i++) {
    if (i == max)
    {
    dict.Add(new KeyValuePair<float, PointF>(0, points[i]));
    }
    else
    {
    float theta = (float)Math.Atan2(points[i].Y - points[max].Y, points[i].X - points[max].X);
    if (theta < 0) theta = 2 * (float)Math.PI + theta;
    dict.Add(new KeyValuePair<float, PointF>(theta, points[i]));
    }
    }
    //ソートする
    System.Comparison<KeyValuePair<float, PointF>> cmp = new Comparison<KeyValuePair<float, PointF>>(cmpfunc);
    dict.Sort(cmp);

    //順に比較し、不要な点を排除していく
    List<int> del = new List<int>();
    for (int i = 1; i < dict.Count; i++) {
    int h = (i - 1 + dict.Count) % dict.Count;
    int j = (i + 1) % dict.Count;

    float theta1, theta2;
    theta1 = (float)Math.Atan2(dict[i].Value.Y - dict[h].Value.Y, dict[i].Value.X - dict[h].Value.X);
    if (theta1 < 0) theta1 = 2 * (float)Math.PI + theta1;
    theta2 = (float)Math.Atan2(dict[j].Value.Y - dict[i].Value.Y, dict[j].Value.X - dict[i].Value.X);
    if (theta2 <= 0) theta2 = 2 * (float)Math.PI + theta2;

    if (theta2 - theta1 < 0) {
    dict.RemoveAt(i);
    i--;
    }
    }

    //戻り値用の配列に格納
    PointF[] result = new PointF[dict.Count];
    for (int i = 0; i < dict.Count; i++) {
    result[i] = dict[i].Value;
    }

    return result;
    }


    このシリーズの他記事: http://prog-city.spaces.live.com/lists/cns!E5379F11D9E8BB3F!1047/


    November 07

    Yahooブリーフケース有料化

    ヤフーは、オンラインストレージサービス「Yahoo!ブリーフケース」を12月1日からYahoo!プレミアム会員およびYahoo! BB会員専用のサービスに変更する。無料の一般会員が保存したファイルについては、2009年2月2日にすべて削除する。 (internet.watch)

    http://internet.watch.impress.co.jp/cda/news/2008/11/06/21434.html

    Skydrive が出来てからはずっと使っていなかった。
    のぞいてみると、かなり懐かしいファイルが・・・。

    無料会員のファイルは 2009/2/2 に全て消されてしまうようなので、早めに落としておいた方がよさそう。

    今後は、 Gmail のストレージか Skydrive だろうか。

    November 04

    鍵盤を3D表示

    今、 鍵盤を XAML の 3D で表示したいと思っている。
    XAML は 最近の UI を記述するためのマークアップ言語である。
    その XAML に DirectXほどではないが ちょっとした3D を表示する機能がある。
     
    しかし、XAML を直接記述しようと思っても、 3角形の座標を 羅列して形を作らねばならないから、
    気の遠くなる作業となる。
     
    ZAM3D というソフトがあるらしいが 有償なのですぐに購入というわけには行かない。
    そこで、手持ちの 古い Shade 6 を取り出し、dxf を吐かせ、
    どこかで公開されていたコンバーターを落としてきて、変換させてみることにした。
     
    その前に、モデリングが必要である。
    実は過去に挫折しているので上手く行かないような気がする。
    呪いの鍵盤
    何とかそれっぽい白い鍵盤を用意した。
     
    これを、XAMLに変換してみると・・・。
    呪いの鍵盤パラドックス
    こんな感じ。とても使えそうにない。
     
    そしてもう一度反省を込めて作り直した。 Shade での状態。
    kansei
     
    自分としては上手く言ったように見えたが、この段階で、眠くてなぜか形状データがなくなってしまった。
    ちなみに、画像はないが、上図の鍵盤の1つを変換したところ、上手く変換されていた。
     
    やっぱり、 Shade はやめて、スクリプトか何かで自動的に生成しようと思う。
     
    WPF の本のコーナーになく、「ひょっとしたら・・・」と思い、別の棚を見たらあった。
    XML の本の棚に。
    October 15

    HSP で作る少しキレイかもしれない画面

    image

    グラデーションっぽい画像を生成しようと、HSPをいじっていた。
    そして、なんとなくゲームっぽくテキストを追加してみた。
    ついでにそれが近況報告になってしまっているというおまけ。

    ソース:

    sr = 200;        中心の色(開始色)
    sg = 200;
    sb = 200;

    sdistance = 100;開始色-中間色 の距離

    r = 60;            中間色
    g = 20;
    b = 0;

    edistance = 200;中間色-終了色 の距離

    er = 20;        終了色
    eg = 0;
    eb = 40;

    cx = 150;        開始色となる座標
    cy = 100;

    wid = 520;        画面サイズ
    hei = 400;
    screen 0, wid, hei

    redraw 0; 再描画を一時無効化する
    repeat hei
        y = cnt;
        dy = y - cy;
        repeat wid
            x = cnt;
            dx = x - cx;
            dist = sqrt(dx*dx + dy*dy);

            if dist <= sdistance {
                pr = sr - ((sr - r)*dist/sdistance);
                pg = sg - ((sg - g)*dist/sdistance);
                pb = sb - ((sb - b)*dist/sdistance);

            }else : if dist < sdistance + edistance {
                pr = r - (r - er)*(dist-sdistance)/edistance;
                pg = g - (g - eg)*(dist-sdistance)/edistance;
                pb = b - (b - eb)*(dist-sdistance)/edistance;
            }else{
            }
            color pr, pg, pb;
            pset x, y;
        loop
    loop

    buffer 2, 500, 80    ;白い見えない画面を作る
    cls

    ;それをメインの画面に配合する
    gsel 0;
    pos 10,310
    gmode 5, 580, 80, 150
    gcopy 2, 0, 0, 580, 80

    pos 20, 320
    font "MS P 明朝", 18, 2
    mes "レーシックを受けると、ハロー・グレア現象に夜間は悩まされる。\nしかし、月がこんな風に見えるのも、今だけだ・・・。"
    color 200,200,200
    pos 485, 370
    font "MS P 明朝", 18, 2
    mes "▼"

    redraw 1; 描画有効に戻す

     

    pset という命令で1ドットずつ色をつけているので、時間はかかる。
    内容は単に、ある座標からの距離で色を変化させるだけ。

    HSPのサイト :  http://hsp.tv/

    September 23

    レーシック

    手術日の朝は7:30に起床することにしていたが、早めに目覚めた。
    が、全く寝られないほどではない、その程度の緊張感だった。
     
    ギリギリまで 「やめとけ、レーシック」みたいなページばかり見ていた。
    当日キャンセルは原則無理と書いてあった。
     
    • 病院に着いた
    • 呼ばれた
    • 視力検査をした
    • 高いお金を払った
    • 待機
    • 手術の説明
       術後にかけるメガネと眼帯と、説明が書いてある紙を貰う。
    • 手術フロアに行った
       今までにつけてためがねと手荷物をロッカーに入れる。
    • 問診
       「質問ある?」に対して「今は無い」(後からされても困るだろうが)
       しかし、挙げるとすれば先知れぬ不安。
    • 待機

    最初の部屋
     フラップというものを作成するらしい部屋。
     イスに座らされると機械が頭上に現れる。
     目をぐりっとあけられる、今までに無いくらい。
     そして、光が目に当たる。
     「光をみててね~」といわれる。
     ものすごく押さえつけられる感じがするとすぐに機械がうなる。
     目には光しか見えない。
     耳には秒数を数えるナースの声と機械の音。

     終わると、目の前が白くなったが、全く見えないわけではない。
     ナースに付き添われて次の部屋の前へ移動する。

    2番目の部屋
     部屋があくまで目を閉じて待たされる。
     白い世界の状態なので、放置されているような気になる。
     10分くらい待って部屋に入ると同じような手術イスがある。

     またレーザーを照射される。
     つい力が入り、「力ぬいてね~、そうそう、うごかないよ~」 といわれる。
     穴の開いたシートをかぶせられ、レーザーが数十秒当たり、洗浄されてはがされる。
     道具を使って目をなぞられて(貼り付けるように)

     「終わりです」と言われて立ち上がり、回復室に連れて行かれる。

    回復室
     イスに座って眠らずに待つ。
     作業は終わったが緊張感が残っていたので眠気とは無縁。

    最後のチェック・解散
     特に問題ないので目薬を貰ってさようなら

    帰りの状況
     涙がひどかった。おまけに鼻水も出てきた。
     ただし、痛み止めは即効性があり、半分くらい帰ったところで点したらすぐにとまった。
     一人でも帰れそうだが辛そう、というレベル。

    これから
     いちばん怖いのは近視の戻り。
     せっかく1や1.5を越えたりしても、数年後に0.7などというざんねんなこともあるらしい。
     それは体質とも言われるが、なるべく目は酷使しないようにしたい。

    すべきか
     値段: 待てば少しは良心的になるかもしれない。紹介制度など不透明な部分がなくなって。
     安全性: 安心だと思うまで待てばよい。待ちすぎると老眼のためにメリットが減る。
     勇気: 手術は怖かった。痛くないが、怖いことに変わりは無い。
          術後の痛みはたいしたこと無かった。

    August 15

    レーシックの事前検査

    手術が可能かどうか調べにいってきた。(ここまでは無料)
    結論は、可能。 ただ、消耗品であるらしい角膜の厚さが1回分+a しかないため、
    極わずかな確率での失敗時に再手術ができないかもしれないとのこと。
    視力1.0獲得率は98%で、だいたい0.6くらいあればいいと思っているので成功率は 98%+少し。
     
    この確率は、信頼すべきものだと思うが、勇気は要る

    眼鏡屋でフレームを選ぶためにも。(まだかけるつもり)
    高い特殊レンズ代を省略して安く買うためにも。
    成功すればプールサイドで躓かない。
    成功すれば免許も裸眼で取れる。
    視野が広がる(最近のメガネはレンズ小さいから。)
    シャンプーとリンスを間違えない。
    メガネをなくしても匍匐前進は不要。
    悲惨な事故(踏み潰されたり)で大事なメガネを失わずに済む。
    裸眼時の目は3でもεでもない。
     
    夢のような生活に戻れるらしい、18万くらい & 98+a% で。

    今は昔、最初メガネをかけるときは、
    それまでの数週間、寝る前にミドリンとかいう目薬を点眼したりしてメガネにならぬよう粘った。
    結局、周りの人より早くメガネをかけ、「メガネくん」とお決まりの名前をもらいながら、
    「どうしようもないのか」と、しばらくは我慢の日々だった。

    それが今日はなんという技術の進歩だ。このまま行けば不老不死も夢じゃないかと思えるほどだ。

    でもやはり少し怖いとは思う。
     

    検査は結構長かった。
    明るいときと暗いときの見え方の検査、視力検査をして、
    よくわからない目薬を点眼されて、麻酔を点眼されて、目玉をグリグリされる。
    それで最後に結果発表。

    帰りは目薬の効果でまぶしい。夕日がまぶしくてお化けになったかと思った。
    地下通路を駆使して何とか帰宅。それでもまぶしさで普段より疲れた。
    手術のときはタクシーが良いかもしれない。

    さて、残るは最後の決断である。

    August 06

    Nicovolume 0.252

    1. ちょっとした機能追加をしてみた。

    時間が来ると、下のような画面が表示され、スライダーが左右に動きます。
    手動で動かすことによって、自動調整をキャンセルすることが可能です。

    0.252

    2. IE の自動起動が不要な場合のため、インストーラで ブラウザ拡張の有無を選択できるようにしました。
    その結果 Vista 環境で .msi 形式のインストーラがうまくいかなくなってしまったので、 exe 形式も入れておきました。

    3. Vista 環境で、 互換モード を使用する必要がなくなりました。
     Vista では 新しいAPI を使うようにしました。

    * 古いバージョンを消してから新しいバージョンをインストールする必要があります。
    * インストールフォルダ内にある time.conf を一時退避させておくと同じ設定で使えると思います。

    Nicovolume の記事
    http://prog-city.spaces.live.com/Blog/cns!E5379F11D9E8BB3F!918.entry


    Vista でのマスタボリュームコントロール についての 参考文献

    http://msdn.microsoft.com/en-us/library/ms679161(VS.85).aspx
    http://msdn.microsoft.com/en-us/library/bb331828(VS.85).aspx

    August 01

    フーリエ級数

    フーリエ何とかというものがさっぱりわからないので、教科書に書いてある次のような数式をもとに計算させてみた。

    周期Tの周期関数 f(t) が下のように展開される。

    image

    OnPaint に直接適当にコードを書く。
    f(t) は、連続してない関数にした。

        public int n;
        public double func(double d) {
            return ((int)Math.Abs(d) % 50 < 25) ? 0 : 50;
        }
    
        public double func_a(double d) {
            return func(d) * Math.Cos(n * 2 * Math.PI / 50 * d);
        }
    
        public double func_b(double d)
        {
            return func(d) * Math.Sin(n * 2 * Math.PI / 50 * d);
        }
    
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            int x;
            double y = 0;
    
            Point prev = new Point(0, 0);
            for (x = 0; x < 300; x++) {
                double a0 = 1.0 / 50.0 * mymath.simpson(-25, 25, 0.001, func);
                y = a0;
                
                for (n = 0; n < 10; n++) {
                    double an = 2.0 / 50.0 * mymath.simpson(-25, 25, 0.01, func_a);
                    double bn = 2.0 / 50.0 * mymath.simpson(-25, 25, 0.01, func_b);
    
                    y += an * Math.Cos(n * 2 * Math.PI / 50 * x);
                    y += bn * Math.Sin(n * 2 * Math.PI / 50 * x);
                }
                e.Graphics.DrawLine(Pens.Black, new Point(x, 200 - (int)y), prev);
                prev = new Point(x, 200 - (int)y);
            }
        }

    * simpson関数はこちら

    すると、こんな感じに表示された。

    25行目のループ条件: n < 2
    image

    n < 5
    image

    n < 10
    image

    本来のグラフ
    image

    ループすればするほど元の四角いグラフに近づいている。
    しかし、その分時間がかかった。

    シンプソンの公式

    シンプソンの公式のプログラムを汎用的にしておく。

    シンプソンの公式は、関数を二次曲線で近似させて積分する方法。
    台形公式より正確な値を出せる、とのこと。

    関数f の、st~ed の間を、刻み幅h以内で積分する。
    hは、刻み数が奇数になってしまった場合には変化する。

        //シンプソンの公式で積分する
    public delegate double simpsonFunc(double d);
    static public double simpson(double st, double ed, double h, simpsonFunc f){
    //刻み数を決める
    int nh = (int)(Math.Abs((ed - st) / h) + 1.0);
    if (nh % 2 != 0) nh++;
    h = (ed - st) / (nh-1);

    int cnt;
    double total = 0;
    for (cnt = 0; cnt < nh; cnt++ )
    {
    double tmpadd = f(h * cnt);

    if (cnt == nh - 1)
    { //最後:そのまま
    }
    else if (cnt == 0)
    { //最初:そのまま
    }
    else if (cnt % 2 != 0)
    { //奇数
    tmpadd *= 4;
    }
    else
    { //偶数
    tmpadd *= 2;
    }
    total += tmpadd;
    }
    return h / 3.0 * total;
    }

    この前のシンプソンの公式
    http://prog-city.spaces.live.com/blog/cns!E5379F11D9E8BB3F!940.entry


    このシリーズの他記事
    http://prog-city.spaces.live.com/lists/cns!E5379F11D9E8BB3F!1047/