ListPage

2010年12月2日木曜日

[C#] Yahoo デベロッパーネットワーク 続き

Yahoo デベロッパーネットワーク

WebAPI

とりあえず、オークション情報の取得を考えた結果、前回の様なカテゴリー名やカテゴリーIDが
必要だった!

で、何も考えずチェックボックスのNameプロパティの後にカテゴリーIDを付け足してあった・・。

this.CategoryCheckBox[i].Name = "CategoryCheckBox" + dt.Rows[i][0].ToString();
・・・こっからどう進めて行こうか。
とりあえず、ちゃんとCategoryCheckBoxができてるか確かめー。


ううーむ・・。チェックを入れた時にカテゴリーIDを収集するか・・。
Listとかに突っ込んでKEYみたいので判断するか悩むなー。と適当な事を考えつつ
WEBを見てたら、昨日書いたデシリアライズとシリアライズのサンプル発見!!

  public Yahoo.API.WebSearchResponse.ResultSet WebSearch(string appId, string query, string type, short results, int start, string format, bool adultOk, bool similarOk, string language)
  {
   string requestUri = 
                String.Format("http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid={0}&query={1}&type={2}&results={3}&start={4}&format={5}&adult_ok={6}&similar_ok={7}&language={8}", 
                appId, HttpUtility.UrlEncode(query, Encoding.UTF8) , type, results, 
                start, format, adultOk ? "1" : "0", similarOk ? "1" : "0", language);

   HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri);

   Yahoo.API.WebSearchResponse.ResultSet resultSet = null;
   using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
   {
    using (Stream responseStream = response.GetResponseStream())
    {
     XmlSerializer serializer = new XmlSerializer(typeof(Yahoo.API.WebSearchResponse.ResultSet));
     resultSet = (Yahoo.API.WebSearchResponse.ResultSet)serializer.Deserialize(responseStream);
    }
   }

   return resultSet;
  }

引数多すぎ!って思ったけどまぁ考えてくれた人ありがとー!この攻撃的なコードは
日本人じゃない。多分。

また駄文が長くなったので次回。

2010年12月1日水曜日

[C#] Yahoo デベロッパーネットワーク

Yahoo デベロッパーネットワーク

Web API

C#

激しく見づらいって言われたの加筆・修正

そういえば、とある質問サイトでYahooAPIなんてもんがあったなと
思い出し解答しましたが。実際には使った事なかったり・・。
なんてわけにもいかなかったので検索した所、PHPとかJAVAのサンプルはあったけど
.NETのサンプルは中々見つからなかったのでちょっとしこしこ書いてみた。

        public System.Data.DataSet ReturnCategory(int CategoryID)
        {
            System.Data.DataSet ds = new System.Data.DataSet();
            string ApiUrl = 
            string.Format("http://auctions.yahooapis.jp/AuctionWebService/V2/categoryTree" +
                                   "?appid={0}" +
                                   "&category={1}", ID, CategoryID);

            HttpWebRequest httpwebrequest =
                WebRequest.Create(ApiUrl) as HttpWebRequest;

            using (HttpWebResponse response = httpwebrequest.GetResponse() as HttpWebResponse)
            {
                ds.ReadXml(response.GetResponseStream());
            }
            return ds;
        }

こんな感じで、XMLでもDataSetでも返せる。本格的に作るんであればシリアライズして
クラス事に欲しい値を返せるようにするのが自分的なベストだけどサンプルでやるには
めんどすぎる為割愛ー。

でこんな感じで、カテゴリーの一覧を取得

まずは、guiをちょこっと作ってみた。

        //チェックボックスの配列の作成
        private CheckBox[] CategoryCheckBox;
        private void YahooSampleAPI_Load(object sender, EventArgs e)
        {
            //カテゴリーを決定する
            this.toolStripStatusLabel2.Text = "カテゴリーの取得中";
            int cid = 0;
            DataSet ds = yahooWebService.ReturnCategory(cid);
            DataTable dt = ds.Tables["ChildCategory"];
            int datacount = dt.Rows.Count - 1;
            //レイアウトの編集
            this.SuspendLayout();
            this.CategoryCheckBox = new CheckBox[datacount];
            for (int i = 0; i < datacount; i++)
            {
                this.CategoryCheckBox[i] = new CheckBox();
                this.CategoryCheckBox[i].Name = "CategoryCheckBox" + dt.Rows[i][0].ToString();
                this.CategoryCheckBox[i].Text = dt.Rows[i][1].ToString();
                this.CategoryCheckBox[i].AutoSize = true;
                int width = CategoryCheckBox[i].Width;
                this.CategoryCheckBox[i].Location = new Point(width + 15, 20);
                this.CategoryCheckBox[i].TabIndex = i;
                //this.flowLayoutPanel1.SetFlowBreak(CategoryCheckBox[i], true);
            }
            this.flowLayoutPanel1.Controls.AddRange(this.CategoryCheckBox);
            this.ResumeLayout(false);
            this.toolStripStatusLabel2.Text = "カテゴリーの取得に成功しました。";
        }

長くなったので次回.

2010年10月19日火曜日

[.NET C#][ZrdGraph]棒グラフの作成

翻訳機すら掛けないめんどくさがりやの為のZedGraph

データテーブルから該当の棒グラフの作成

vb.net

Public Class MainForm
Private Sub MainForm_Load _
(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim csvDir As String = "CSVのファイル設置場所"
Dim csvFileName As String = "CSVのファイル名"

Dim conString As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
+ csvDir + ";Extended Properties=""text;HDR=No;FMT=Delimited"""
Dim con As New System.Data.OleDb.OleDbConnection(conString)

Dim commText As String = "SELECT * FROM [" + csvFileName + "]"
Dim da As New System.Data.OleDb.OleDbDataAdapter(commText, con)

'DataTableの作成
Dim dt As New DataTable
da.Fill(dt)

Create_LineGraph(Me.ZedGraphControl1, dt)

End Sub

Private Sub Create_LineGraph(ByVal _zg As ZedGraphControl, ByVal _dt As DataTable)
Dim dtbuff As DataTable = _dt.Copy()
Dim myPane As GraphPane = ZedGraphControl1.GraphPane
'グラフの設定
myPane.XAxis.MajorTic.IsBetweenLabels = True
myPane.Title.Text = "TEST"
myPane.XAxis.Type = AxisType.Text

'データソースの設定
Dim dspl As DataSourcePointList = New DataSourcePointList
dspl.DataSource = dtbuff

'XY軸の設定
dspl.XDataMember = _dt.Columns(1).ToString()
dspl.YDataMember = _dt.Columns(0).ToString()
dspl.ZDataMember = Nothing
'グラフの描写タイプの設定
Dim myLine As BarItem
myLine = ZedGraphControl1.GraphPane.AddBar("sample", dspl, Color.Blue)

myPane.BarSettings.Type = BarType.Stack

ZedGraphControl1.IsShowPointValues = True
ZedGraphControl1.AxisChange()
End Sub

棒グラフの作成方法、プロットの仕方としては大まかに別けて2種類
直に数字を用いそれを利用する方法、データテーブルを用いそれを利用する方法
例えば、上記ではデータテーブルを用い利用している。
DataSourcePointListクラスの、XDataMemberプロパティとYDataMemberプロパティには
表示したい値を、CoulumnのIndexを指定するか、上記の様にCoumnの名前を指定する。
この時、実際の名前を入力しても良い。

そうでない場合は以下

直に数字を用いる

vb.net

dim xLabel() as string = (3) {"本田", "長友", "長谷部", "Turio"}
dim yValue() as double = (3) {7.5, 6.0, 7.0, 0}

dim myCurve as baritem = mypane.addbar("Score", nothing, yValue, color.red)

mypane.XAxis.MajoyTic.IsBetweenLabels = true
mypane.XAxis.Scale.TextLabels= Xlabels
mypane.XAxis.Type= AxisType.Text

mypane.BarSettings.Type = BarType.Stack

ZedGraphControl1.AxisChange()

XとYの値を、配列で用意しておきそれらを一括でグラフにするというもの。
また、BarItemクラスでは実数での実装とPointListでの実装の2つのが用意されている。
ListItemクラスでも同様に実数とPointListクラスでの実装の2つが用意されている。
これらを用いグラフをどの値を描写させるか決定させる。

2010年10月15日金曜日

[愚痴]ぐち

ヘルプ要請があったのでちょっと手伝ってきた
設計みたらVB6だったのに唖然

まぁ・・いいんだけど

とある工場の仕入在庫管理用のアプリケーション
サーバー機はwindowsserverでクライアント機3台がwindows7...

でまぁ、グレープシティさんのコンポーネント使う事になったんだけど
現行のコンポーネントだと対応していないとの事で
新たに・・つか今更、購入してた。

売上上がるみたいだからいいんだけど。
で、設計批判するわけじゃないんだけど明らかにこっちの
都合を押し付けてるような設計でいくら中小企業のパソコン使えないおばちゃんでも
さすがに使いにくいだろって感じの作り。

そこでかっこよく僕は「こんなんじゃ駄目だ。ユーザービリティに富んだ設計を!!」
と言えたらかっこよかったんだけどまぁ放置して・・。

僕が口出せる事じゃなかったんで言えてないけど画面設計くらいは見やすく判り易くを
心がけてわ。

個人的、独断と偏見だけど、営業力が強いと技術力が無くても金は稼げる。

2010年9月15日水曜日

[雑記]ライフデフラグ

ライフサイクルの最適化

デフラグ

メモとして

帰宅 19:00

食事 19:30-20:00

ジョギング 20:00-20:45

シャワー 21:00-21:25

余暇 21:30-22:30

勉強 22:30-23:00

余暇 23:00-23:45

就寝準備 23:50

就寝予定 24:00

起床 4:30-5:00 部屋を掃除しつつ支度

ジョギング 5:00-5:30

シャワー 6:00-6:30

飯 6:30-7:00

出社予定時刻 7:20-7:30


余暇が多い。

  • 勉強時間が少ないけど学習意欲が低すぎて困りもの
  • 休日・祝日は、睡眠時間を+3時間して睡眠不足を解消
  • 余暇は家族との付き合いの為、削ってはいけない
  • できればどこかで早朝学習をしたい

2010年9月10日金曜日

詰んだのでメモ

ODP.NET リファレンス抜粋

重要インストール情報

依存


ODP.NET 10gリリースは、Oracle Client10gリリースに依存する為、同じOracleホームにインストール
する必要があります。


ODP.NETでは通常に行った時Universal Installerで起動する為、前提条件を確認

インストール計画に沿ってOracle Clientをインストールする
http://otndnld.oracle.co.jp/document/products/oracle11g/111/solaris/E05979-01/install_overview.htm

2010年9月3日金曜日

OracleDataAdapterとOracleCommand

わんくまサイトの掲示板みてたら

OracleDataAdapterとOracleCommand

Bind変数が違う


基本的にrom専でしたがちょっと気になった所がありました。
ODP.NETを使用している方で、多分色々とごっちゃになってました。


>Execute Error:ORA-01008: バインドされていない変数があります。
>上記エラーが発生します。

private void AddOracleParameter
    (object value1, object value2)
{
    OracleParameter[] param = new OracleParameter[]
    {new OracleParameter("startDate", OracleDbType.Int32),
        new OracleParameter("endDate", OracleDbType.Int32)};
    param[0].Value = value1;
    param[1].Value = value2;
  
  cmd.BindByName = true;
    foreach (OracleParameter item in param)
    {
        cmd.Parameters.Add(item);
    }
}

これだと、変数cmdって事は多分OracleCommandで
OracleCommandのバインド変数にセットしその後、OracleDataAdapterのコンストラクタに
cmd.CommandTextを突っ込んでますが

これだと、OracleCommandのバインド変数がOracleDataAdapterに渡る事はにゃあですので

実際には、AddOracleParameterメソッドをオーバーロードさせるなりなんなりさせ
AdapaterかCommandかを切り分ける必要があります。

private void AddOracleParameter
    (object obj, dbtype dtype, int size)
{
 OracleDataAdapter1.SelectCommand.Parameters.Add
  (obj, dtype, size);
}
private void AddOracleParameter
    (object obj, dbtype dtype, int size, hoge hoge)
{
 OracleCommand.Parameters.Add
  (obj, dtype, size);
}

これ実際にプロジェクト中になるとわかりづらいんです。
Execute Error:ORA-01008: バインドされていない変数があります。

変数がバインドされていないので、OracleCommand.ParametersのAddメソッドが
正常な形で行われているのかそれとも’SQL文がおかしい’のか切り分けが微妙になってきます。


いやまぁ、OracleDataAdapterにもバインド変数をセットするプロパティが
あるのを事前に調べとけって話ですがね。

using (OracleDataAdapter oda = new OracleDataAdapter(cmd.CommandText, Cnn))
{
    using (System.Data.DataSet da = new System.Data.DataSet())
    {
      AddOracleParameter(_start, _end);
      oda.Fill(da, dataMember);
      return da;
    }
}



※AddOracleParameterは多分、自作クラスのODPの拡張メソッドぽいやつ。

[memo]いまさらクラウド

Windows Azure Platformについて

参考http://blogs.msdn.com/b/nakama/archive/2010/01/08/hello-world-windows-azure-platform.aspx

Windows Azure Platform 概要

概要


Windows Azure Platformは 既存のシステムの在り方をすべてリプレースするような
万能なサービスというわけではなく。

その為、Azureを利用するにあたり、MS社の製品やサービスの中でどのような位置付けに
あるものなのかを正しく理解する事が重要。

そして、理解する為に、MS社クラウドコンピューティング戦略である "S+S"と
それらがもたらすコンピューティングシステムの変化を理解しなければならない


クラウドコンピューティングとは?

クラウド


大雑把に述べると、ネットワークを介して'提供'される'サービス'
のシステム形態。

ネットワークの向こう側にあるサーバやシステムがどのような構成か判らないけれど
ユーザーがそうしたサーバの中身やシステムの構成などを意識することなく
サービスを享受する事ができる。

どっかで聞いた内容・・と思ったらOOP
抽象化とカプセル化の概念ぽい。

クラウドタイプ

3つの形

以下は、アプリケーション・ミドルウェア・インフラの3階層のシステム


クラウド型 IaaS (イァースらしぃ) (Infrastructure as a Service)
インフラ部分のみ任せる。この方式を取った場合には、自社ではアプリとミドルのみ用意すればよく
インフラ部分(ハードウェアの調達や監視、故障対応等)は業者にお任せしてしまう。

クラウド型 PaaS インフラとミドル層は任せる
インフラとミドルウェアの部分を任せるという方式。この方式を取った場合には
アプリケーションのみ用意する形。

クラウド型 SaaS アプリ・ミドル・インフラ全て任せる
全てを委託してしまう。という方式。この方式を取った場合には自社では
システムの構築や運用などについては一切気にする必要はなく
提供されるアプリケーションをそのまま使うだけ、という形になります。

読んでて今までもあんじゃん・・。と思ってましたらその下に


これって従来あったサービスと何が違うの?」と思われた方も多いと思います。はい、概していえばその通りです。実は IaaS, PaaS, SaaS に関しては、似たようなサービスが従来から存在しています。例えば以下のようなものを考えてみましょう。

ASPなんて典型的じゃーん。て思ったらやっぱASPはクラウドらしい。微妙すぎる。

じゃぁどうなの実際

稼動中のシステム

じゃぁあんま変わんないね。と思ってた所
薄字で。


クラウドコンピューティングというパラダイムシフトは多くのビジネスやコンピューティングシステムの在り方に影響を与えるものではありますが、既存のビジネスやコンピューティングシステムをリプレースするものではない、と考えるべき

確かにリプレースが全て出来たら利益的には良いけど。

2010年8月17日火曜日

DataSetにXMLを取り込む の続き 2

DataSetにXMLを取り込む の続き 2


このオーバーテクノロジーの超ハイスペックパソコンでは
Oracleからのデータ生成に耐えられない!


ので一旦中止

ちなみに行った

動作環境


Operating System: Windows XP Professional (5.1, Build 2600) Service Pack 3 (2600.xpsp_sp3_gdr.100216-1514)
Language: Japanese (Regional Setting: Japanese)
System Manufacturer: Dell Computer Corporation
System Model: OptiPlex GX270
BIOS: Phoenix ROM BIOS PLUS Version 1.10 A03
Processor: Intel(R) Pentium(R) 4 CPU 2.60GHz
Memory: 510MB RAM
Page File: 1179MB used, 196MB available
Windows Dir: C:\WINDOWS
DirectX Version: DirectX 9.0c (4.09.0000.0904)
DX Setup Parameters: Not found
DxDiag Version: 5.03.2600.5512 32bit Unicode

とりあえずデータの在り方にもよるんだろうけど、1000000件の単純な文字列だったら

BeginLoadData EndLoadData

の顕著な効果は現れないみたい。

不満ダ

2010年8月11日水曜日

DataSetにXMLを取り込む の続き

DataSetにXMLを取り込む の続き


BeginLoadData EndLoadData


1000000件
BeginLoadData EndLoadData有り Time is : 00:00:14.5700241
BeginLoadData EndLoadData無し Time is : 00:00:14.7292566


1000000件のデータを処理してみたけど、まったく効果がなかった・・・。ので!
ちょっと調べてみたら


データを読み込む間、通知、インデックスの維持、および制約をオフにします。

データの読込時に、インデックスや制約をオフにする・・。通知ってなんだ・・。


データを読み込んだ後、通知、インデックスの維持、および制約をオンにします。

だから通知ってなんだ・・・。とりあえず、1000000件ばかしのデータじゃあんまかわらんのか。
xmlの構造がもう少し複雑だと変わるのかもしれないのだけれども作成するのが・・・!!!!
そういえば、でかいデータがあった。

Oracle Databaseは、ネイティブXMLの生成をサポートします。次の場所に格納されたXMLデータを生成または再生成するためのオプションがいくつか提供されています。

というわけで、4000000万件分のデータをoracleからつくr・・・・。

メモリが足りないのか、フリーズする。

このPCじゃさすがに無理なのか。


2010年8月9日月曜日

DataSetにXMLを取り込む

DataSetにXMLを取り込む

XMLを取得


DataSetにXMLファイルを読込んで使う事なんて滅多に業務的に無い為メモ


VB.NET

Using ds As DataSet = New DataSet
 Dim dt As DataTable = New DataTable(tabelname)
        Dim xmlSR As System.IO.StreamReader _
         = New System.IO.StreamReader(filepath & xmlName)

        For Each dt In ds.Tables
         dt.BeginLoadData()
        Next

        ds.ReadXml(xmlSR)
        dt = ds.Tables(0)

        For Each dt In ds.Tables
         dt.EndLoadData()
        Next

End Using

C#

using (DataSet ds = new DataSet()) {
 DataTable dt = new DataTable(tabelname);
 System.IO.StreamReader xmlSR = new System.IO.StreamReader(filepath + xmlName);

 foreach ( dt in ds.Tables) {
  dt.BeginLoadData();
 }

 ds.ReadXml(xmlSR);
 dt = ds.Tables(0);

 foreach ( dt in ds.Tables) {
  dt.EndLoadData();
 }

}

DataSet ビジュアライザで確認

実際に確認してみたらいい感じ。

非常に大きなファイルを読み込む際に ReadXml を呼び出すと、パフォーマンスが低下することがあります。大きなファイルを読み込む場合に、ReadXml のパフォーマンスを最大にするには、DataSet のテーブルごとに BeginLoadData メソッドを呼び出し、その後で ReadXml を呼び出します。最後に、次の例に示すように、DataSet のテーブルごとに EndLoadData を呼び出します。


どんくらいの大量のデータやねんってことで調べた。

とりあえず1000件のデータを作成しstopwatchクラスで時間計測!

BeginLoadData EndLoadData有り Time is : 00:00:00.0227109 はえー・・。
BeginLoadData EndLoadData無し Time is : 00:00:00.0192091 あるぇー・・。

データがたりんのね。

10000件
BeginLoadData EndLoadData有り Time is : 00:00:00.1380896 ?
BeginLoadData EndLoadData無し Time is : 00:00:00.1264850 ?

100000件
BeginLoadData EndLoadData有り Time is : 00:00:01.3964389 ?
BeginLoadData EndLoadData無し Time is : 00:00:01.7707770 ?

び・・微妙な差が・・・。

1000000件 私のエディタの限界。
BeginLoadData EndLoadData有り Time is : 00:00:14.5700241
BeginLoadData EndLoadData無し Time is : 00:00:14.7292566

・・・・あれ・・?

・・・・・・・・


MA SA KA!!!

2010年8月4日水曜日

C# VB.NET LINQメモ

メモ LINQ


配列から特定の条件を指定し抜き出す

VB.NET

Dim PenType As String() = New String() {"えんぴつ","クレヨン","シャープペンシル","ボールペン"}
 Dim result As IEnumerable(Of String) = From Pens In Pentype Where Pens.Length <= 5

C#

string[] PenType = new string[] 
            {
  "えんぴつ",
  "クレヨン",
  "シャープペンシル",
  "ボールペン"
            };

            IEnumerable result = from pens in PenType where pens.Length <= 5 select pens;

SQL

select * from pentype where length(pen.name) <= 5

sql func

create or replace function length(v_invalue in varchar2)
return int_outvalue
is
begin
 return nvl(length(v_invalue),0);
end;
/

VB.NET / C# メモリ内クエリは、えんぴつ クレヨン ボールペン くせがあって相変わらず戸惑うな・・。

特定の条件を付けWindowsのサービスを取得

開始状況がRunningのサービスを全て取得

VB.NET

'dobon.net sample 
        '参照設定 System.ServiceProcess
        Dim scs As System.ServiceProcess.ServiceController()
        scs = System.ServiceProcess.ServiceController.GetServices()

        For Each item As System.ServiceProcess.ServiceController In scs
            Console.WriteLine(String.Format("サービス名{0}  状態{1}", item.DisplayName, item.Status))
        Next

        'linq
        Dim result As IEnumerable(Of String) = From sc In scs _
         Where sc.Status = System.ServiceProcess.ServiceControllerStatus.Running _
         Select sc.DisplayName

C#

///dobon.net sample 
     ///参照設定 System.ServiceProcess
   System.ServiceProcess.ServiceController[] scs;
            scs = System.ServiceProcess.ServiceController.GetServices();

            foreach (System.ServiceProcess.ServiceController item in scs)
            {
                Console.WriteLine(string.Format("サービス名{0}  状態{1}"
                    ,item.DisplayName,item.Status));
            }

     ///linq
            IEnumerable result =
                from sc in scs
                where sc.Status == System.ServiceProcess.ServiceControllerStatus.Running
                select sc.DisplayName;

2010年6月22日火曜日

社内研修 社内講師 第1回 鈴木

研修用まとめ

講師:鈴木

今期から新入社員向けに社内研修時に社内講師と社外講師の両方の方からの指導を受ける事になった為。

第一弾は社内講師の主に社内システムの構築をされてる方が行った。

話の冒頭では社内業務の流れをロジカルに説明して頂いた。
実際にある業務クラスと業務の流れを比較し理解を得ようという考えで行われていた。
その為、多少なりとも今までプログラミングに携わって来なかった社員もいきなりの配属先で
コーディングを行っていた社員も理解が深まった様子。


話の流れ

お昼を挟んだ2時間の講義となり以下の流れで話が進んでいった。

  • 業務フローと実際に稼動しているシステムとの関連性
  • 社独自の業務フローについて(割愛)
  • >事前アンケート回答<コーディング時のインターフェイスの有用性について
  • アンケートと質疑応答


継承とインターフェイス


小~中規模の場合、インターフェイスを使用する
大規模の場合、抽象クラスを使用するようにすると良いかも知れない
実際の設計時には応用する事。

スーパークラスとなれるクラスは1つだが、インターフェイスにはいくつでも
受け入れが可能となる。

データベースや実業務での固有名詞が多いため実際時の再利用性は低い事を念頭に
以下のストラテジパターンを紹介


ストラテジパターン

アルゴリズムの振り分け処理部


適用前のcoreflow

void coreflow(int id)
{

if (flowA == id)
 {
           処理A
 }
else if (flowB == id)
 {
    処理B 
 }
else if (flowC == id)
 {
    処理C
 }

}

適用後 coreflow

interface IStrategy{
 void coreflow();
}
class coreflowA : IStrategy
{
    public void coreflow()
 {処理A}
}
class coreflowB : IStrategy
{
    public void coreflow()
 {処理B}
}
class coreflowC : IStrategy
{
    public void coreflow()
 {処理C}
}

アンケート

5段評価

平均値

研修の理解度 3.2

実際にはノートを使用しサンプルプログラムを動かしつつ理解を深めた。
各人がレポートを提出したがレポートを見る限りでは理解度は高い。

2010年6月14日月曜日

ちょっとルーターとlinux

見ている人も少ないってかほとんど身内なんで愚痴りますが

ここんとこずーっとLinuxのセットアップとルーターとOracleと戦い続けていました。

Linuxは本当に辛かった。WindowsLuvな僕にはコマンド入力でインストール作業を行い
環境整えなければいけなくてもうあの画面はしばらくみたくないな・・。
で何をしてたかっていうとA君が難儀な受注を安請け合いしてきてコスト的に
?てかちゃんと上の方々とお話してるの?って聞いたら僕に言えばなんとかしてくれると
思った。すし奢ります。らしいから、時期的にカツオって事で僕も安請け合いしてしまった。

受注先は中小企業で従業員数6人で3拠点、今までは本社に郵送で書類やらなんやら送って
本社でのみ管理していたらしいけど今回、クラサバに。騙された!A君に。

で機器類を自分達で用意して費用削減!ってお話だったらしいんだがなぜだか僕がやるはめに。
(主にカツオに負けた)
それでもまぁ多少はしっかりしたもん持ってかんといけん!と思い土日を使用しなんたって
低予算でやれとのことでおもっきし選択肢がないのでLinuxサーバーにクラはWindowsで
構築する。システムのインストールが大変だ。って言われたけど僕も大変なんだ。

でもそこの社長さんが良い人で遅くまでやってたらラーメンの出前取ってくれて
ちょっとがんばろうって気になりました。

ってことでこの構成で決定。
Webサーバーとセキュリティ構築(セキュリティだけこっそり知り合いに手伝って貰いました)
まぁ大変でした普段ルーターなんて触らないから事前にネットで調べ知恵を拝借。
静的IPマスカレイドってかっこいい技も覚えたしそれなりに得た事もあったけど二度と
こういう分野外のお仕事は持ってきてもらいたくナイデス。

カツオは旨かったです。

2010年5月28日金曜日

WPF とこきそ3

wpf とこきそ3


以前のとこきそ1でレイアウトライブラリを使用した将棋盤やらオセロ盤をやろうかなって
思ってたらやっぱりやってる方が多数いる模様なので自分も試してみた

縦9*横9の盤を作成

使用するレイアウトライブラリはあえて <Grid></Grid>

前回縦割りと横割りの子ノードの追加方法は

<Grid.ColumnDefinitions>
	%lt;ColumnDefinition Width="*"/>
	<RowDefinition Height = "*"/>
</Grid.ColumnDefinitions>

これを9こ・・。


<Grid.ColumnDefinitions>
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
</Grid.RowDefinitions>

なんか良い方法ないかって位見づらい。
マァイイヤ。ワカレバ。で、これで升目を9個ずつ縦横そろえたわけで次は
枡目の線だなー。ShowGridLines="True" で枠線の表示はできる。表示は

borderColorとかないの?msdnをつらつらみたけどない。
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.grid_members.aspx

ネット上ではボーダーコントロールなるものを使用してるので前に習え。



名前空間 System.Windows.Controls

アセンブリ PresentationFramework (PresentationFramework.dll 内)

XMLNS http://schemas.microsoft.com/winfx/2006/xaml/presentation,

http://schemas.microsoft.com/netfx/2007/xaml/presentation


<Border Background="LightBlue" 
        BorderBrush="Black" 
        BorderThickness="2" 
        CornerRadius="45" 
        Padding="25">

まさか!1個ずつ子要素囲むの?
で、ColumnDefinition囲むとエラーでるし意味わからん。
アタッチかと思い


	
<Border Grid.Row="0" Grid.Column="0" BorderThickness="2" BorderBrush="Black"></Border>

こうしたら画面の左端がぽつんと黒くなった・・。


アタッチについて


自分自身のクラス中のプロパティではなく、 親要素で定義されたプロパティ値を設定することを添付プロパティと呼びます。
添付プロパティは(通常のプロパティは使えず、)依存プロパティでなければいけません。
(というか、通常のプロパティではこのような仕組みは実現できません。)
「依存プロパティ」という名前は、添付プロパティの例のように
「他のクラスとの依存関係を持つことができるプロパティ」というような意味合いです。

http://ufcpp.net/study/dotnet/wpf_xamladv.html#attached

現状だと81個手動でどげんかせんといかん!からちょっと考え・・。

よし。線はやめようってことでBorderコントロールは消去。

歩兵を設置。絵心0なのでPolygonで無理やり作りまして。

<Polygon Grid.Row="6" Grid.Column="0" Points="21,3 11,6 8,38 34,38 31,6 " Fill="#8B4513" />

駒を動かす事なんて度外視なのでさらにこの上から文字を描写
とりあえず出来りゃー良い系でがんがんいきます。

<TextBlock Grid.Row="6" Grid.Column="0" TextAlignment="Center" VerticalAlignment="Center" FontSize="15">
歩
</TextBlock>

縦書きが・・できん。香車と飛車と桂馬と・・成りが。という事で難しい事は後から
やることとして1文字わかればいいや系です。(日本人にはわかればいいや系精神が足りないと思います。)
動かす事を度外視としましたが、あれです。一応視野の端っこにはいるおいてあるつもりなので
パスと文字の統合について調べましたところ。

http://msdn.microsoft.com/ja-jp/magazine/dd263097.aspx

ありましたが・・・。これ読んでも理解できなさそうだ・・。
読ませる気ねーだろ。

2010年5月24日月曜日

WPFとこきそ 2

WPFとこきそ 2


座標を指定してレイアウト


htmlやcssのように座標をして描写したい場合が殆どだから今回のレイアウトライブラリは必修科目

                                       
Canvasレイアウトライブラリ
.Top上の余白の設定
.Left左の余白の設定
.Bottom下の余白の設定
.Right右の余白の設定
記事中(http://msdn.microsoft.com/ja-jp/windows/cc811499.aspx)には載ってはいないが基点位置について 中心となる基点位置は現状では画面の左上となる。
        <Canvas>
            <Ellipse
                Fill="Black"
                Width="300"
                Height="300"
                Canvas.Top="50"
                Canvas.Left="50"
                />
            <Ellipse
                Fill="White"
                Width="240"
                Height="240"
                Canvas.Top="85"
                Canvas.Left="45"
             />
        </Canvas>
Canvas.Top="50"は上端を基準とした50の位置 Canvas.Left="50"は左端を基準として50の位置 なるほど、でも管理しやすくする為にはCanvasの位置を変えたいなと思ったけど Canvasには .Top .Left のアタッチするプロパティがにゃーだよ。 始めに考えたのは、子要素や孫要素が存在するCanvasをCanvasで包む事。 これなら
     <Canvas>
        <Canvas Canvas.Right="500">
Canvas内の要素をわざわざ変更しなくても中間にあるCanvasのオフセット位置を指定するだけで良いんだけど 果たして推奨されるコードなのかと思いネット検索を掛けてみた。 が、ちょっと参考資料が見当たらないので知ってる方がもーし見てたら教えて下さい。

とこきそ1~2のまとめ

WrapPanelやStackPanel等もTopやLeftにアタッチできるプロパティがない・・・。 現状の自分のやり方だと1画面内にStackPanelとWrapPanelが複数個整列されていない状態で 必要になった場合、<Canvas></Canvas>で囲みまくる形になる・・。 なんとなくだけど綺麗じゃないかな。でもとりあえずこのまま進んでわかった時点で切替すれば いっか。

2010年5月22日土曜日

WPF とこきそ

WPF とことんきそる

WPF とこきそ

参考url http://msdn.microsoft.com/ja-jp/windows/cc811507.aspx

勝手に孤独に始まりました。wpfとこきそもうクラス多すぎで見るきもしないリファレンスなんですが
ゆっくりとやってみます。

崩れないレイアウト

XAMLのレイアウト機能を記事に沿って独断と偏見にみちた読解をしていきます。
まず最初は基本の 幅 高さ 余白 縦揃え 横揃えの方法
記事中では Ellipse(楕円)を使用しています。のでこちらはRectangle(四角)でやってみます。

Rectangle 要素
Fill 塗りの色
Width 四角の幅
Height 四角の高さ
	<Rectangle Fill="Aqua" Width="200" Height="150" />

青四角!この辺は、.NETやJAVA知ってる人なら見ただけで理解できるし知らない人でも英語がわかれば
楽かなー。

次は、可変するウィンドウだとウィンドウの大きさに合わせたりする処理が必要になってくるんだけど
これがMargin要素を使用することでクリア。余白は、ウィンドウとRectangleとの間事らしい。

ちなみに 左 上 右 下 CSSと一緒。

	<Rectangle Fill="Aqua" Width="200" Height="150" Margin="20,20,20,20" />
Marginウィンドウとこの場合はRectangleの間の値

C#とかでやるんであればResizeingイベント等で処理しなくちゃいけなくてUIロジックが
汚くなったりしてたから依存関係という面でみたら格段に楽!

冒頭で書いた縦揃え 横揃えは、 HorizontalAlignment と VerticalAlignment要素を使用
自分はこの要素名がかっこよくてたまらん。Vertical・・Vertical!!巻き舌なら技名。


VerticalAlignment 垂直方向の位置指定


HorizontalAlignment 水平方向の位置指定


	<"Aqua" Width="200" Height="150" Margin="20,20,20,20"
                   VerticalAlignment="Center" HorizontalAlignment="Stretch" />

これでバーティコォーも覚えた。バーティコォ

うん。

で、今まで何も考えずに<Grid></Grid>で閉じられた中に書いてみたけどここで
やっと説明が。

Gridというのはレイアウトライブラリ。間違ってもバーティコォライブラリではない。

Grid というレイアウトライブラリがあります。HTML でいうとテーブルみたいなものです。
この Grid にはテーブルのように行や列を増やしたり幅を固定したり自動にしたりすることができます。
このコードでは左には固定の幅をもったメニュー、右にはウィンドウの大きさに合わせて大きさが変わるコンテンツというようなレイアウトを実現しています。

	<Grid>
	  <Grid.ColumnDefinitions>
	    <ColumnDefinition Width="150"/>
	    <ColumnDefinition Width="*"/>
	  </Grid.ColumnDefinitions>
	  <Rectangle
	     Fill="Blue" 
	     Margin="20,20,20,20" 
	     Grid.Column="0" 
	  />
	  <Rectangle
	     Fill="Red" 
	     Margin="20,20,20,20" 
	     Grid.Column="1" 
	  />
	</Grid>

簡単に言うと Grid というエリアを縦に区切り、左の列の幅は 200 で固定して
右の列の幅は自動的に変わるようになっています。
Grid を区切るには Grid.ColumnDefinitions という子ノードを追加し
孫ノードに ColumnDefinition というノードを追加することで実現できます。
ColumnDefinition の数を増やすことにより列を増やすことができます。

固定されている列と自動的に幅が変わる列の動きを分かりやすくする為に、左の列に青く塗った楕円形、右の列に赤く塗った楕円形を配置しています。

配置する列を指定するには配置したいノードの要素に Grid.Column を追加します。
Grid.Column の値は ColumnDefinition を記述した順番に 0、1、2...と指定します。

???<Grid.ColumnDefinitions></Grid.ColumnDefinitions>これで子ノードを追加して・・
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>
この2つで要素のWidth値を決めるの?いきなりちょっぴり無理指数が上がる。

配置する列を指定するには配置したいノードの要素に Grid.Column を追加します
えーと、孫の財産を勝手に保管場所を決めるって事?か・・?な?ちゃうね!

Grid.ColumnDefinitionのRectangleのGrid.Cokumnで指定する

で、<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>

書いた順番にWidth値が150のColumnDefinitionが0番
Width値が"*"のColumnDefinitionが1番

なるへそ。

で、これを縦じゃなくて横区切りにするには

Column を Row に、Width を Height に変えるだけで実現できます

<ColumnDefinition Height="150"/>
<ColumnDefinition Height="*"/>

で孫ノードの要素の Grid.ColumnをGrid.Rowにしたらいいのか。

で記事が以外と展開が速い。あと独断と偏見に満ち満ちた意見なら縦割りはColumn.ヴァーティコゥ

順番に並べてくれるレイアウト StackPanel

	<StackPanel Orientation="Vertical">
	  <Ellipse 
	     Fill="Blue" 
	     Width="300" 
	     Height="50" 
	     HorizontalAlignment="Left" 
	  />
	  <Ellipse
	     Fill="Red" 
	     Width="300" 
	     Height="150" 
	  />
	  <Ellipse
	     Fill="Green" 
	     Width="300" 
	     Height="100" 
	     HorizontalAlignment="Right" 
	  />

Orientation="Vertical"って何・・。リクリエーションなら知ってる。
と思ってたら、これはVertical!縦並べか。で案の定横並べは、Orientation="Horizontal"
うーん、判りやすい。将棋の枡とかオセロの枡とかならすぐに描写できそうだ。

将棋の横枡っていくつだ・・。

ちなみにStackPanelだと並べまくってエリアからはみ出すと表示されないが例えば
ブラウザや画面が小さい時に香車が表示されなくなったり角枡に黒があるの?白があるの?
ってことになる。

それじゃーこまんね?ってことでMS様は用意しておりました。
レイアウトライブラリ WrapPanel


勝手に改行 WrapPanel

なんかの漫画に似たようなのあったな・・。
ちょっと単純なコードの羅列なのでコピペ

<WrapPanel Orientation="Horizontal"<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
</WrapPanel<	

例の如くOrientation="Horizontal これで横・縦で並べかえるわけか。
これなら香車が見えなくなることもないし、角枡に何が置かれているかわからなく
戦々恐々とオセロをやることもなくなる。ね。

2010年5月21日金曜日

表示と非表示

勝手に回答

イメージの表示と非表示

VisualBasicのメソッドを利用したプログラムで「消去」ボタンをクリックするとイメージが消え、「表示」ボタンをクリックするとイメージが表示されるようにするにはどんなプログラムを打てばよろしいのですか?

よくよくOOPで例えられるテレビの電源ってことで実モデルを参考にしてみる


使用する規程クラス
クラス名 名前空間
Form System.Windows.Form
PictureBox System.Windows.Forms
BitMap System.Drawing
Graphics System.Drawing

作成クラス
クラス名 名前空間
Form1 WindowsFormsApplication1
RemoteController WindowsFormsApplication1
IRemoteController WindowsFormsApplication1
TV WindowsFormsApplication1
ITV WindowsFormsApplication1
ChannelGuide WindowsFormsApplication1

とりあえず必要になりそうなクラスを6つ作成
ON OFFの簡単なプログラムだからリモコンの蓋とテレビのカバーも実モデルに
してみる


フォームクラス Form1.cs

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.button2.Click += new System.EventHandler(this.button2_Click);
        }
        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {

        }
    }

イベントの実装のみに留めておく


TVクラス TV.cs

public  class TV : ITV
    {
         private System.Windows.Forms.PictureBox Display;
         private System.Drawing.Image TempImage;

         public TV(System.Windows.Forms.PictureBox pict)
         {
             Display = pict;
         }

         public void ON()
         {
             if (TempImage != null)
             {
                 Display.Image = TempImage;
             }
             else
             {
                 Display.Image = null;
             }
             TvState = true;
         }

         public void OFF()
         {
             if (Display.Image != null)
             {
                 TempImage = Display.Image;
             }
             Display.Image = null;
             TvState = false;
         }

         public void OutPutToDisplay(System.Drawing.Image images)
         {
             Display.Image = images;
         }

         private bool _TvState = false ;
         public bool TvState
         {
             get { return _TvState; }
             set { _TvState = value; }
         }
    }

コンストラクタにPictureBoxを使用した、この際の考えとしてはForm上全てをテレビと見立てた場合
PictureBoxはディスプレイとして存在する事とします!


ITVインターフェイス ITV.cs

public interface ITV
    {
        void ON();
        void OFF();
        void OutPutToDisplay(System.Drawing.Image value);
        bool TvState { get; set; }
    } 

次にTVクラスのインターフェイスを作成します。実モデルに考えてみるとカバー。
若干実モデルと比べるとおかしいがあくまで参考なのでこれでいく。


RemoteControllerクラス RemoteController.cs

public class RemoteController :IRemoteController
    {
        private ITV _tv;
        public RemoteController(ITV tv)
        {
            _tv = tv;
        }
        public void RemoteON()
        {
            _tv.ON();
        }
        public void RemoteOFF()
        {
            _tv.OFF();
        }
        public void ChannelPush(int pushkey)
        {
            ChannelGuide cg = new ChannelGuide(pushkey);
            _tv.OutPutToDisplay(cg.SelectedChannel);
        }
    }

コンストラクタにTVクラス、基本的にはテレビとリモコンで1セット。

IRemoteControllerインターフェイス

public interface IRemoteController 
    {
        void RemoteON();
        void RemoteOFF();
        void ChannelPush(int value);
    }

実モデルを考えた場合、12個のボタンが必要になってくるがPC上でテンキーをリモコンの番号として
見立て場合、楽だった為。

ChannelGuideクラス ChannelGuide.cs

public class ChannelGuide
    {
        private int _SelectKey;
        private System.Drawing.Image _SeletedChannel;

        public ChannelGuide(int SelectKey)
        {
            _SelectKey = SelectKey;
            if (_SelectKey == 97)
            {
                SelectedChannel = oneChannel;
            }
            else if (_SelectKey == 98)
            {
                SelectedChannel = twoChannel;
            }
        }

        public System.Drawing.Image SelectedChannel
        {
            get{return _SeletedChannel;}
            set {_SeletedChannel = value ;}
        }

        private System.Drawing.Image _oneChannel = 
            System.Drawing.Image.FromFile
  (@"C:\Documents and Settings\***\My Documents\My Pictures\sample1.jpg");
        private System.Drawing.Image _twoChannel = 
            System.Drawing.Image.FromFile
  (@"C:\Documents and Settings\***\My Documents\My Pictures\sample2.jpg");
        
        private System.Drawing.Image oneChannel
        {
            get{ return _oneChannel;}
            set{_oneChannel = value;}
        }
        private System.Drawing.Image twoChannel
        {
            get{return _twoChannel;}
            set{_twoChannel = value;}
        }

このクラスは番組表クラスとしてあるフィールド毎に値を設置したいがめんどかったので2つにしてみた。
xmlやらなんやらで外部的に受け取りやすくしたり色々改善の余地もあったけどやめた。


フォームにイベントの中身を実装

private void button1_Click(object sender, EventArgs e)
        {
            if (tv != null)
            {
                tv.ON();
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (tv != null)
            {
                tv.OFF();
            }
        }
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (tv.TvState != false)
            {
                RemoteController remocon = new RemoteController(tv);
                remocon.ChannelPush(e.KeyValue);
            }
        }

2010年5月20日木曜日

WPF and Silverlight 2

WPF and Silverlight 2


今回使用するWPFクラスライブラリとXAML


XAML WPFクラス
<Application>要素 System.Windows名前空間のApplicationクラス
<Window>要素 System.Windows名前空間のWindowクラス
<Button>要素 System.Windows.Controls名前空間のButtonクラス

ボタンの追加

前回のHelloWorldプログラムにボタンを追加

<Button Width="100" Height="50" >
 Click
 %lt;/Button>

<Window>の子要素は自動的にセンタリングされるらしい
なおかつ<Window>要素は1つの子要素しか持つことができない。


イベントハンドラの追加 *.xaml

GUIとロジックの依存関係を薄める為に、イベントやそれに関係するロジックは
C#やVBで記述する。

XAML側のメソッドの追加
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="HelloWorldWindow"
  Title="My First XAML"
  Width="320"
  Height="240"
>
  <Button Width="100" Height="50" Click="HelloWorldWindow_Click">
    Click Me!
  </Button>
</Window>

<Button>要素のClick属性にボタンがクリックされた時に呼び出されるメソッドの
名前を記述する。
XAMLによるウィンドウの記述から暗黙的に作成されるクラスの名前を指定するために、<Window>要素に
対して[x:Class属性]でクラス名を指定する。

x:Class属性のxとはなんぞや?
xはプリフィックスである。リファレンス・マニュアルなどもxを付ける決まりになっている。
例えば、要素名の[Windows]や[Button]その属性名の[Width]や[Height]の名前空間は
<Window>要素のxmlns属性で指定されている
http://schemas.microsoft.com/winfx/2006/xaml/presentation
これはWPF名前空間と呼ばれ、名前空間に属する要素や属性はWPFのクラス・ライブラリの項目と対応付けられる
この時、規定名前空間以外の異なる名前空間の要素や属性を記述するには、プリフィックスが必要になる。
前例としてxを出したが実際にはなんでも良い。

例えば、x:Class="HelloWorldWindow"とあったがこれを
xaml:Class="HelloWorldWindow"やxamlclass:Class~と記述しても動作上では問題がない。

コードビハインド・ファイルによるイベント・ハンドラ *.cs

win.xaml.cs
using System.Windows;

  public partial class HelloWorldWindow : Window {
   void HelloWorldWindow_Click(object sender, RoutedEventArgs e)
   {
    MessageBox.Show("クリック");
   }
  }
 
部分クラス partialキーワードを使えば、本来はHelloWorldWindowクラス内に存在しなければならない
HelloWorldWindow_Clickメソッドを外部から追加できる。

この外部から追加したメソッドは、<Button Width="100" Height="50" Click="HelloWorldWindow_Click">

プロジェクトファイルの修正 *.proj

プロジェクトファイル内の<ItemGroup>に<Compile Include="win.xaml.cs" />を追加する。
<ItemGroup>
    <ApplicationDefinition Include="app.xaml" />
    <Page Include="win.xaml" />
    <Compile Include="win.xaml.cs" />

これでコンパイルする。

WPF and Silverlight

WPF and Silverlight


UIフレームワークというスコープでみた場合の性質は同じ

Silverlightはランタイムのサイズを4MB台に抑えなければならなかった為
WPFに比べると機能が削られているという違いがある

http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_01/uiframework_01_01.html

XAML構文ありきのWPF UIフレームワーク


この記事の中あたりに

WPF UIフレームワークを理解するうえでXAMLという言語そのもに対する知識はあまり重要でない。
と断言的に述べていた。


画面設計とロジックの分離

画面設計をXAMLで記述し、イベント処理やビジネスロジックなどはC#やVBのコードで記述
(このような形態を[コードビハインド]と呼ぶ)
XAMLでは、コントロールの配置や静的な画面設計ではなくグラフィックス描写やコントロールの合成、
アニメーション、UI要素とデータのデータバインディングといった動的な処理までも記述することができる
このおかげで、画面まわりの処理の多くをコードビハインド側のコードから排除でき、コードビハインド側の
コードではロジックに専念できる。


本当にXAMLの理解は重要ではない?

確かにExpression Blendなどのデザイナを使えば画面設計を行え、XAMLのコードを自動生成
する事ができます。XAMLの理解がないという事は、HTMLやCSSを知らずにWeb開発ができるの?
という事と同じ事である。

Hello XAML

全てテキストエディタでの作成

  • ウィンドウを定義した *.xamlファイル
  • アプリケーションを定義した *.xamlファイル

ウィンドウを定義した win.xaml

<Window
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 Title="My First XAML"
 Width="320"
 Height="240"
>
 Hello World
</Window> 

XAMLではウィンドウをWindow要素で記述する。Window /Windowタグで挟まれた内容が
ウィンドウに表示される。
Window要素の属性は上記のように設定できる

アプリケーションを定義した app.xaml

<Application
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 StartupUri="win.xaml"
/>

アプリケーションのビルド

このアプリケーションをビルドするには、ビルドツール(MSBuild.exe)を使って実行ファイルを
作成します。その為にはプロジェクトファイルを作成します。

プロジェクトファイル hello.proj

<Project
 xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
 DefaultTagets="Build">

 <PropertyGroup>
  <AssemblyName>HelloWorld</AssemblyName>
  <OutputType>winexe</OutputType>
  <OutputPath>c:\</OutputPath>
 </PropertyGroup>
 
 <ItemGroup>
  <ApplicationDefinition Include="app.xaml" />
  <Page Include="win.xaml" />
  
  <Reference Include="System" />
  <Reference Include="WindowsBase" />
  <Reference Include="PresentationCore" />
  <Reference Include="PresentationFramework" />
 </ItemGroup>
 
 <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
 <Import Project="$(MSBuildBinPath)\Microsoft.winFX.targets" />
</Project>

とまぁ呪文をたかたか打っていきいざコンパイル。
コマンドプロンプトを開き、先ほどの3つのファイルがある所まで移動する。
カレントディレクトリで、自分の場合は.NetFramework 3.5 だった為、
windows/microsoft.net/framework/v3.5/msbuild.exe を実行。

Hello World

MessageBox

Yahoo


勝手に回答。

「テキストボックスに日付を出すことができます」というのができません。

Messagabox.Show(#5/19/2010#)というのを入れるのですが、
そもそもそれを表示させる[MessageBox]なるものをどこで用意したら良いものやら…。

どこで用意したら良い?という回答なのだったけれど単純にSystem.Windows.Forms 名前空間を使用し、StaticなメソッドのMessagebox.showを実行すればよいのだけれども。どこがわからなかったのか・・。


[C#](1) ウサミミハリケーンのようなすごいプログラムを作っていきたいです

今回教えてほしいのはプログラムの停止 再開 の方法です

ウサミミハリケーン(ファイル) に停止 再開 など あって 興味を持ちました

手順 ソース 何でもいいので教えてください

とりあえず自分の常識は世間の常識ではない事を認識した方が良い。
肝心のこのアプリケーションは

どうやらログラム開発/解析用の多機能な汎用プロセスメモリエディタ兼デバッガ
というもの。でこれを停止・再開などに興味が・・・。

画面の右上で閉じたらいいね。

2010年5月19日水曜日

研修用クラス群

研修用 クラス群


使用するクラス
ユーザーインターフェイス Form1
データアクセスクラス DataAccess
データインターフェイスクラスIDataAccess
データクラス Data

画面構成

担当者ID
氏名
年齢



使用テーブル構成

FIELD TYPE
ID NUMBER (5)
NAME VARCHAR (20)
AGE NUMBER (2)
IMAGE VARCHAR (255)


Form1(ユーザーインターフェイス)


using System;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Yahoo_Sample_WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            AddOnFormControlEvent();
            InitializeOnFormControl();
        }
        private void AddOnFormControlEvent()
        {
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.button2.Click += new System.EventHandler(this.button2_Click);
            this.button3.Click += new System.EventHandler(this.button3_Click);
        }

        private void InitializeOnFormControl()
        {
            this.lblID.Text = "ID";
            this.lblName.Text ="Name";
            this.lblAge.Text ="Age";
            this.pictureBox1.Image = null;
            this.txtDispID.Text = string.Empty;
            this.txtDispName.Text = string.Empty;
            this.txtDispAge.Text = string.Empty;
        }
        private void button1_Click(object sender, EventArgs e)
        {

        }
        private void button2_Click(object sender, EventArgs e)
        {

        }
        private void button3_Click(object sender, EventArgs e)
        {

        }
    }
}

各、ボタンイベントにて動作の発動を行います。他処理としてInitializeOnFormControlやAddOnFormControlEvent等を
Form1クラスのコンストラクタで呼び出すように設定します。

戻る

DataAccess(データアクセスクラス)


概要

DataAccessクラスでは、データベースに対してクエリを発行します。Insert UpDate Delete Select文を発行します。
SQLやデータの構造上、かなりのバリエーションが必要になる為基本の4つを今回は採用する事にしました。
各パラメーターはDataクラスに対応しており、データクラスに事前に値を設定してあれば基本4つのクエリを発行します。
その為、例えば特定のデータを1件のみ必ず毎回取得するような場合には新たにデータベースアクセスクラスにメソッドを追加します。


using System;
using System.Data.OleDb;

namespace Yahoo_Sample_WindowsFormsApplication1
{
     public class DataAccess : IDataAccess
     {
         private int _ID;
         public DataAccess(int ID)
         {
             _ID = ID;
         }

         public DataAccess(){}

         public bool ExistenceData()
         {
            OleDbConnection OleDbConnection1 = new OleDbConnection();
            OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
            @"C:\Documents and Settings\***\My Documents\db1.mdb";

            OleDbCommand OleDbCommand1 = new OleDbCommand();
            OleDbCommand1.Connection = OleDbConnection1;

            OleDbConnection1.Open();

            OleDbCommand1.CommandText="SELECT COUNT(*) FROM sampleTable";
            OleDbCommand1.CommandText += "WHERE ID = @ID";

            OleDbCommand1.Parameters.Add("@ID", OleDbType.Char, 5).Value = _ID;

            int counter = (int)OleDbCommand1.ExecuteScalar();
            if (counter > 0) 
            { return true; }
            else { return false; }
         }

         public bool InsertData(Data data1)
         {
             OleDbConnection OleDbConnection1 = new OleDbConnection();
             OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
             @"C:\Documents and Settings\***\My Documents\db1.mdb";

             OleDbCommand OleDbCommand1 = new OleDbCommand();
             OleDbCommand1.Connection = OleDbConnection1;

             OleDbConnection1.Open();

             OleDbCommand1.CommandText = "INSERT INTO sampleTable" +
                 "(ID, NAME, AGE, IMAGE) VALUES (@ID, @NAME, @AGE, @IMAGE)";

             OleDbCommand1.Parameters.Add("@ID", OleDbType.Char, 5).Value = data1.ID;
             OleDbCommand1.Parameters.Add("@NAME", OleDbType.Char, 50).Value = data1.Name;
             OleDbCommand1.Parameters.Add("@AGE", OleDbType.Char, 2).Value = data1.Age;
             OleDbCommand1.Parameters.Add("@IMAGE", OleDbType.Char, 255).Value = data1.Image;

             if (this.ExistenceData() != true)
             {
                 OleDbCommand1.ExecuteNonQuery();
                 return true;
             }
             else{return  false;}
         }
         public bool DeleteData(Data data1)
         {
             OleDbConnection OleDbConnection1 = new OleDbConnection();
             OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
             @"C:\Documents and Settings\***\My Documents\db1.mdb";

             OleDbCommand OleDbCommand1 = new OleDbCommand();
             OleDbCommand1.Connection = OleDbConnection1;

             OleDbConnection1.Open();

             OleDbCommand1.CommandText = "DELETE FROM sampleTable WHERE ID = @ID";

             OleDbCommand1.Parameters.Add("@ID", OleDbType.Char, 5).Value = data1.ID;

             if (this.ExistenceData() != true)
             {
                 OleDbCommand1.ExecuteNonQuery();
                 return true;
             }
             else { return false; }
         }

         public bool UpDateData(Data data1)
         {
             OleDbConnection OleDbConnection1 = new OleDbConnection();
             OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
             @"C:\Documents and Settings\***\My Documents\db1.mdb";

             OleDbCommand OleDbCommand1 = new OleDbCommand();
             OleDbCommand1.Connection = OleDbConnection1;

             OleDbConnection1.Open();

             OleDbCommand1.CommandText = "UPDATA sampleTable SET NAME = @NAME, AGE = @AGE, IMAGE = @IMAGE" +
                 " WHERE ID = @ID";

      OleDbCommand1.Parameters.Add("@ID", OleDbType.Char, 5).Value = data1.ID;
             OleDbCommand1.Parameters.Add("@NAME", OleDbType.Char, 50).Value = data1.Name;
             OleDbCommand1.Parameters.Add("@AGE", OleDbType.Char, 2).Value = data1.Age;
             OleDbCommand1.Parameters.Add("@IMAGE", OleDbType.Char, 255).Value = data1.Image;

             if (this.ExistenceData() != true)
             {
                 OleDbCommand1.ExecuteNonQuery();
                 return true;
             }
             else { return false; }
         }
  
  /// 
         /// dataSetを返す
         /// 
         /// SELECT文を発行し全てのデータを取得しDataSetで返す
         public System.Data.DataSet SelectData()
         {
             OleDbConnection OleDbConnection1 = new OleDbConnection();
             OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
             @"C:\Documents and Settings\***\My Documents\db1.mdb";

             OleDbConnection1.Open();

             string selectCommandText = "SELECT * FROM sampleTable";

             OleDbDataAdapter adapter1 = new OleDbDataAdapter(selectCommandText, OleDbConnection1);

             System.Data.DataSet dataset1 = new System.Data.DataSet();
             
             adapter1.Fill(dataset1);

             return dataset1;
         }
     }
}

Insert時のIDはnotnullの為このままでは使用できません。dataクラスにてどうにかしてコーディングするように提案を行います。
私的見解では、データベース側のトリガーを使用したほうが良いと思います。

戻る

データアクセスインターフェイス


概要

研修用の為インターフェイスの使い方のみを言及した形のクラスになります。


using System;

namespace Yahoo_Sample_WindowsFormsApplication1
{
    interface IDataAccess
    {
          bool ExistenceData();
          bool InsertData(Data value);
          bool UpDateData(Data value);
          bool DeleteData(Data value);
          DataSet SelectData();
    }
}
戻る

Data(データクラス)

概要

コンストラクタを2つに設定します。この場合、引数がある場合の用途とない場合の用途を考えてます。
例えば、現状のDataAccessクラスのSelectDataを使用する場合等はIDの指定等が必要ない場合がある為です。
しかし、このままのデータクラスでは全てのデータ形式に対応できない事を明確にします。

理由として、NAMEフィールド{"山","朗"}という文字列があるフィールドに追加したりそのデータを探したりする場合には
Nameプロパティを使用する事はできません。このような場合の対応の仕方を考えて下さい。

using System;
using System.Windows.Forms;
using System.Text;
using System.Text.RegularExpressions;

namespace Yahoo_Sample_WindowsFormsApplication1
{
    public  class Data
    {
        private IDataAccess mydata;
        public Data(string ID)
        {
            if (ID!= string.Empty)
            {
                Regex regex1 = new Regex("^[0-9]+$");
                if (!regex1.IsMatch(ID))
                { MessageBox.Show("not String); }
                else
                {
                    mydata = new DataAccess(int.Parse(ID));
                }
            }
            else
            {
                MessageBox.Show("Nothing");
            }
        }
        public Data() {}
#region property
        private int _ID;
        public int ID
        {
            get{return _ID;}
            set{_ID = value;}
        }
        private string _Name = string.Empty;
        public string Name
        {
            get{return _Name;}
            set{_Name = value;}
        }
        private int _Age;
        public int Age
        {
            get{return _Age;}
            set{_Age =value;}
        }
        private string _Image;
        public string Image
        {
            get { return _Image; }
            set{_Image = value;}
        }
#endregion
    }
}
戻る