odenのメモ帳

いっつも解決したことを書き留めなくて,後々後悔するので,それを防ごうプロジェクト

C#- .NET上のChartコンポーネントに線を引きたい

はじめに

株価チャートとかで(部分的に)線を引きたい時にどうすればいいのか手こずったので忘れないうちに記しておく.

方法

Chart全体に線を引きたいならば

chart1.Series["candle"].ChartType = SeriesChartType.Line;

とかやって折れ線グラフを生成すればよいが,株価チャートでトレンドラインを引くときなど,気軽に2点を選択して直線を引きたい場合どうすればいいか結構時間がかかったのでまとめる.

LineAnnotationを利用した.プロパティにはX,Y,Width,Heightしかないが,WidthとHeightをうまく計算すると意図した位置に線を引くことができる.AllowSelecting,AllowMovingプロパティをtrueにすれば選択,移動もできる.他にリサイズも可能.
f:id:oden-dengaku:20160301225143p:plain

コード

このコードは,チャート上で2回クリックするとその2点間を結ぶ直線を生成する.LineAnnotation(線注釈)を選択してもカウントされてしまうので注意.

        Point point = new Point();
        private void chart1_MouseDown(object sender, MouseEventArgs e)
        {

            if (point.X == 0 && point.Y == 0)
            {
                //始点
                point.X = (int)chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
                point.Y = (int)chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
            }
            else
            {
                //終点
                Point temp = new Point();
                temp.X = (int)chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
                temp.Y = (int)chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);

                //線を生成
                LineAnnotation ano = new LineAnnotation();
                ano.AxisX = chart1.ChartAreas[0].AxisX;
                ano.AxisY = chart1.ChartAreas[0].AxisY;
                ano.IsSizeAlwaysRelative = false;
                ano.AllowSelecting = true;
                ano.AllowMoving = true;

                ano.X = point.X;
                ano.Y = point.Y;

                ano.Height = temp.Y - point.Y;
                ano.Width = temp.X - point.X;

                chart1.Annotations.Add(ano);
                point = new Point();
            }
        }

C#でのHTML取得方法を比較した

C#でWebページの内容を取得する方法はいくつかあるが,どれが速いのかよく分からなかったのでテキトーに調べてみた.計測とか調べ方はチョー適当なので参考程度に.

今回確かめたC#でWebページの内容を取得するクラスは

  • WebClientクラス
  • WebRequestクラス
  • HttpClientクラス

である.

というかC#でHTMLを取得するいい方法を誰かおしえてください.

計測結果

クラス 時間(秒)
WebClient 3.279
WebRequest 4.741
HTTPClient 4.081

今回,あるURLのHTMLを50回取ってくるという操作の10回平均を計測した.

今回計測した所WebClientが一番速いという結果になったが,HTTPClientクラスは非同期対応とか各クラスで特徴あるので使い分けましょうということで.
なお下記コードでProxyをnullにしているのは,そうした方が速いらしいからである.

追記

using使ってないクソダサコードだけど許して

コード

using System;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Net.Http;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            // 時間計測用のタイマー
            var timer = new System.Diagnostics.Stopwatch();
            timer.Start();
            for (int k = 0; k < 10; k++)
            {
                for (int i = 0; i < 50; i++)
                {
                    string URL = "hogehoge";

                    ///ここを適宜変更
                    string temp = getHTML(URL);
                    ///
                }
            }
            
            timer.Stop();
            Console.WriteLine("{0:0.000}秒", timer.Elapsed.TotalSeconds/10);
            Console.Read();
        }



        static string getHTML(string url)
        {
            WebRequest wr = WebRequest.Create(url);
            wr.Timeout = 10000;
            HttpWebRequest pcHttpRec = (HttpWebRequest)wr;
            pcHttpRec.Proxy = null;

            Encoding enc = Encoding.GetEncoding("UTF-8");
            string result = "";
            using (Stream st = wr.GetResponse().GetResponseStream())
            using (StreamReader sr = new StreamReader(st, enc))
            {
                result = sr.ReadToEnd();
            }
            return result;
        }

        static string getHTML2(string url)
        {
            Uri webUrl = new Uri(url);
            Task<string> webTask = GetWebPageAsync(webUrl);
            webTask.Wait();
            string result = webTask.Result;
            return result;
        }

        static string getHTML3(string url)
        {
            WebClient wc = new WebClient();
            wc.Encoding = Encoding.UTF8;
            wc.Proxy = null;
            Stream st = wc.OpenRead(url);

            Encoding enc = Encoding.GetEncoding("UTF-8");
            StreamReader sr = new StreamReader(st, enc);
            string html = sr.ReadToEnd();
            sr.Close();

            st.Close();
            return html;

        }

        static async Task<string> GetWebPageAsync(Uri uri)
        {
            // HttpClientHandlerにProxy情報を設定する
            HttpClientHandler ch = new HttpClientHandler();
            ch.Proxy = null;
            using (HttpClient client = new HttpClient(ch))
            {
                // タイムアウトをセット(オプション)
                client.Timeout = TimeSpan.FromSeconds(10.0);
                return await client.GetStringAsync(uri);
            }
        }
    }
}

ubuntuが爆発したのでlubuntuを導入

ubuntuからpython3を消したところ,誤って別のも消えてしまい,タスクバーとか色々バーが出てこなくなってしまった.戻すのは面倒だし,重要なデータは一応バックアップできたので,lubuntuに変えてみるかということで実際に変えた.

で,lubuntuにした際に初めにいじったやつを書いておく

日本語入力の設定(mozc)

デフォルトのはポなのでまず変えるやつ.

sudo apt-get install fcitx fcitx-mozc fcitx-libs-qt5 fcitx-frontend-qt5

これしたらログイン・ログアウト

ディレクトリ名を英語に

デフォルトだと「Document」が「ドキュメント」になっちゃってるので英語にする

LANG=C xdg-user-dirs-gtk-update

zshのインストール

別にbashでもいいんだけど,慣れちゃったので

sudo apt-get install zsh
which zsh
chsh

でwhichのときに出てきたパスを入力. 色はまだ良くわかってないので設定してない

vim,gvimのインストール

はい

sudo apt-get install vim-gtk

lubuntuをちょっと使った感想としては,起動とかスリープからの回復はやっぱりubuntuより早くなってる気がした.

ubuntuにpipがapt-get installで入らなかった時

今話題のTensorFlowを試してみようと思いインストールしようとすると,どうやらpipで入れるのが楽らしい.てことで,Ubuntuに入ってなかったpipを

sudo apt-get install python-pip

によって入れようと思ったらエラー.あれあれおかしいなと慌ててたら他の方法がありました.

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
sudo python get-pip.py

これで僕の場合無事pipがインストールできました.

参考

How to Install Pip on Ubuntu 14.04 LTS | Liquid Web Knowledge Base

簡単にお金を儲けたい・・・簡単にお金を儲けたくない?

お金を儲けたい…そうだ株だ!→適当にやってn万円含み損を抱える
ってなったので,ちゃんとやらなきゃなーと思ってテクニカルでちょっとやってみようと思いました.

プログラミングをちょっと齧ってる身としては,ボタンをポチって押せばテクニカル指標がぱっと見れる奴がほしいなと思ったので作ってみました.
f:id:oden-dengaku:20151117225932p:plain
C#で作りました.C#サイコー 左上のテキストボックスに銘柄コードを入れてボタンを押すとテクニカル指標が出てくるようになってます.そしてあるサインを捉えたら売買サインを出すようにもしています.データはヤホーからHTMLを
ガシガシして取ってきてます.
f:id:oden-dengaku:20151117225938p:plain
ただ単体の株のテクニカル指標だけ見ても今どれが上がりそうなのか探すの辛くね?って気づいてしまったので,(できるだけ)すべての株についてデータを取ってきて一覧にしてみました.フィルタ機能もあります.

コレ使ってちょっとシミュレーションしてみて思ったのが,テクニカル指標と株の動きってなんか関係なくね?というオチ

久しぶりに.vimrcを整えた

夏休みの間うぶんつたんを触っておらず,vimから離れていたので復帰として.vimrcをいじった.

javacompleteとsyntasticというプラグインを知ったので早速入れてみた.

javacompleteはもちろんjavaの補完をしてくれるやつ.どうしてもEclipseをやりたくないんだ…
こんな感じ
f:id:oden-dengaku:20151008214543p:plain
でもこれをするとneocompleteが効かない?補完の関数を変えてるっぽいから仕方ないか

syntasticはコンパイルしなくても構文エラーをチェックしてくれるプラグイン.むしろなんで今まで入れてなかったんだという感じ

:Error

とするとエラーの内容も出してくれる.便利だ…
f:id:oden-dengaku:20151008214545p:plain

ちなみに今入れているプラグイン

  • neobundle
  • vim-quickrun
  • neocomplete
  • lightline
  • vimproc
  • syntastic
  • javacomplete

texで文章の幅に合わせて画像を貼りたい

texで画像を貼る時って

\includegraphics[width=10cm]{hoge.eps}

ってやると思うんですけど,幅指定って大体直接値で指定しているページが多く,文章の幅と合わせる場合ってどうすりゃいいんだって思ったんで調べた.

\linewidth

を使えば幅が取れるので

\includegraphics[width=\linewidth]{hoge.eps}

とすれば綺麗に揃う.また,

[width=0.8\linewidth]

とすれば幅の0.8倍になる.