ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

水曜日, 5月 21, 2008

JavaFXとWPFってそっくりじゃない?

最近はヒマでしかたがなかったので、 JavaFXって結局何なんだ?ってことで調べてた、 一応はスクリプティングの形式はとっているが、 バインドとかの仕組みというか考え方って .NETのWPFと同じなんじゃないのかなぁ~?? まぁ、別にどっちが先かとか言ってるわけじゃないんだけど、 自分の勉強用の課題としてどっちに手をだそうかなぁ~と考え中 最初はSWTとか面倒だからやりたくねなぁ~とJavaを避けてたんだが、 別にJavaFXが使えるんだったら、Javaでもいいかw

月曜日, 4月 07, 2008

OpenLDAPがWindowsで使えたら。。。

いや、Sambaをかませばできるのは知っているんですが、 ほしいのはシングルサインオンの機能だけなんですよね。。。 とりあえず、Samba4が出てくるのを待っとくか。 その間に、Struts2の勉強でもしておこう。 (C#は?どこいった。。。)

火曜日, 2月 26, 2008

WPFとXmlDataProviderにnamespace-uriがくっつくと・・・

WPFのお勉強中 Windows Presentation Foundation データ バインディング: パート 1 を参考にWPFのRSSFeedを見るアプリを作ってみた。 リンク先ではローカルのxmlを参照して更新までやってしまうアプリだったけど、xmlを用意するのが面倒に思ったので、この部ログのフィードを読み込むアプリにしてみた。 最初はXAMLへのデータバインディングをせずにC#側で手動実装のパターンだった。 さすがに記事が2006年だったので、.netFramework3.0の実装で書かれていた。 せっかくvs2008を使ってるんだからということで、LINQtoXMLでコーディングしてみた。 XAML側はリンク先を見てください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using log4net;
using log4net.Config;

namespace ExampleCS
{
/// <summary>
/// Window1.xaml の相互作用ロジック
/// </summary>
public partial class Window1 : Window
{
   private static readonly ILog log = LogManager.GetLogger(typeof(Window1));

   public Window1()
   {
       // BasicConfigurator replaced with XmlConfigurator.
       XmlConfigurator.Configure(new System.IO.FileInfo(@"log4net.xml"));
       InitializeComponent();
       blog = XDocument.Load(BLOGURL);
   }

   XDocument blog = new XDocument();
   const string BLOGURL = "http://utsuutsu.blogspot.com/feeds/posts/default";

   #region Event
   void Window1_Loaded(object sender, RoutedEventArgs e)
   {
       FillListBox();
   }
   private void entryListBox_Changed(object sender, SelectionChangedEventArgs e)
   {
       if (entryListBox.SelectedIndex != -1)
       {
           XElement element = ((ListBoxItem)entryListBox.SelectedItem).Tag as XElement;
           if (element != null)
           {
               titleText.Text = element.Element("{http://www.w3.org/2005/Atom}title").Value;
               urlText.Text = element.Elements("{http://www.w3.org/2005/Atom}link").
                   Single(el => el.Attribute("rel").Value == "alternate").Attribute("href").Value;
               dateText.Text = element.Element("{http://www.w3.org/2005/Atom}updated").Value;
               bodyText.Text = element.Element("{http://www.w3.org/2005/Atom}content").Value;
           }
       }
   }
   private void updateButton_Click(object sender, RoutedEventArgs e)
   {

   }
   #endregion
   #region private
   void FillListBox()
   {
       entryListBox.Items.Clear();

       var nodes = blog.Descendants("{http://www.w3.org/2005/Atom}entry");
       foreach (XElement element in nodes)
       {
           ListBoxItem item = new ListBoxItem();
           item.Tag = element;
           item.Content = element.Element("{http://www.w3.org/2005/Atom}title").Value;
           entryListBox.Items.Add(item);
       }
   }
   #endregion
}
}
log4netのコードとかもそのままにしてるけど、気にしないでください。 こっちはこれまでの学習の効果があってすぐにできた。 問題はXAMLだけを利用する(バインディングですべて解決)パターンだった。 XmlDataProviderでフィードを読ませてバインディングしていけばいいのかと思いきや、namespace-uriを指定する方法がわからない。。。 なんとなくクラスの関連上XmlNamespaceManagerがそれに該当するんだろうということはわかったんだけど、これってクラス->オブジェクトなんでXAMLに直にuriを書くわけにはいかず。。。(stringになるもんね) どうすりゃいいのかわからず、 あっちこっち探し回っているとMSDNのフォーラムに対応方法が載っていた。 Resources上でXmlNamespaceMappingCollectionにKeyを付けてXmlNamespaceMappingを生成するというやり方で、Key名を使ってXmlDataProviderにバインディングすることができるらしい。 で、やってみた結果がこれ(今度はXAMLだけで逆にC#側のコーディングは0です。)
<Window x:Class="ExampleCS.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ExsampleCS">
<StackPanel>
    <StackPanel.Resources>
        <XmlNamespaceMappingCollection x:Key="mapping">
            <XmlNamespaceMapping Uri="http://www.w3.org/2005/Atom" Prefix="rss"/>
        </XmlNamespaceMappingCollection>
        <XmlDataProvider x:Key="RssFeed" XmlNamespaceManager="{StaticResource mapping}" Source="http://utsuutsu.blogspot.com/feeds/posts/default" />
    </StackPanel.Resources>
    <TextBlock HorizontalAlignment="Center" FontWeight="Bold">
        BlogEditor
    </TextBlock>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
        <ListBox Name="entryListBox" Height="300" ItemsSource="{Binding Source={StaticResource RssFeed}, XPath=//rss:entry}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding XPath=rss:title}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Grid Width="500" Margin="5" DataContext="{Binding ElementName=entryListBox, Path=SelectedItem}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="25"/>
                <RowDefinition Height="25"/>
                <RowDefinition Height="25"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Grid.Column="0">Title:</TextBlock>
            <TextBox Binding.XmlNamespaceManager="{StaticResource mapping}" Grid.Row="0" Grid.Column="1" Name="titleText" Text="{Binding XPath=rss:title}" />
            <TextBlock Grid.Row="1" Grid.Column="0">Url:</TextBlock>
            <TextBox Binding.XmlNamespaceManager="{StaticResource mapping}" Grid.Row="1" Grid.Column="1" Name="urlText" Text="{Binding XPath=rss:link/@href[1]}"/>
            <TextBlock Grid.Row="2" Grid.Column="0">Date:</TextBlock>
            <TextBox Binding.XmlNamespaceManager="{StaticResource mapping}" Grid.Row="2" Grid.Column="1" Name="dateText" Text="{Binding XPath=rss:updated}"/>
            <TextBlock Grid.Row="3" Grid.Column="0">Body:</TextBlock>
            <TextBox Binding.XmlNamespaceManager="{StaticResource mapping}" Grid.Row="3" Grid.Column="1" Name="bodyText" TextWrapping="Wrap" Text="{Binding XPath=rss:content}"/>
        </Grid>
    </StackPanel>
</StackPanel>
</Window>
XmlDataProviderにバインディングしてListBoxにバインディングするところまでは問題なかったんだけど、最後にイベント連動のGrid側のDataContextの内容がTextBox上で取得できないという状態になり、 またまた悪戦苦闘。。。 やっぱり、namespace-uriがらみだった。。。 TextBoxにBinding.XmlNamespaceManager="{StaticResource hoge}"って実装が必要なんだそうだ。。。 まあ、最終的にはこんなのができた。 ExampleCS Application側(app.xaml)でスタイルをあれこれすればもうちょい見た目もよくなるだろう。。。 オンラインセミナーで「Expression Blend」とかいうツールの紹介がされていた。デザインに関してはこっちでやるといいよ~とMSの人は言っていた。 また、機会があればそっちも見てみようと思う。
ひとつだけ腑に落ちない部分がある。 それは、XAML上だけで表現するときにXPathで属性の条件付き取得の式がちゃんと評価されてないんじゃないの?って思うところだ。
rss:link[@ref='hoge']/@href
これで、linkタグの中でref属性がhogeのhref属性値が取得できると思うんだけど、何か違うのかな?? LINQでSingleを使った時には問題なかったんだけど。。。(Singleは1つ以外だとExceptionが発生する)

木曜日, 2月 21, 2008

XMLスキーマとLINQtoXML

.net FrameworkのLinq to XMLを試してみる。 dtdとかxsdファイルがない状態なら、MSさんが提供してくれているXQueryっていうソリューションを参考にするとすぐに理解できた。 問題は自分でxsdを定義した場合だ、 System.Xml.Linq.XNameクラスを利用してElements(XName)やAttribute(XName)等々の呼び出しをするんだけど。。。 (from x in ~ select ~じゃないのは置いといて。。。) 自分にはXMLに関しての知識があまりにも少ないってことがよくわかった。 XNameにはxsdのパスを付けて指定するんだということを学習した。 {http://xxxx/hoge.xsd}ElementName で指定しないとダメらしい。 これが正しい指定方法らしい。 XMLShemaでもそういう風に書いてあった。 ネームスペースなんて意識したことはほとんどない。。。 dtdやxsdはxmlを書くときにバリデータとしてあれば便利だなくらいにしか思ってなかったもんなんで。。。

日曜日, 2月 17, 2008

SQLiteでLINQ to SQLできねー

結局、SQLServerでしか使えないのね。。。 いまいち、やる気がなくなりました。。。 気を取り直して、LINQ to XMLに手を出してみよう。 MSさんからサンプルコードも出てるし、SQLライクに使えるんだろう。 しかし、サンプルのXQueryってプロジェクトを見ていて気がついたことが一つlog4net.xmlとかのコンテンツに分類されるファイルは標準では出力ディレクトリに出力されないんですね。。。(コピーしてきたファイルだけ?) ともかく!「出力ディレクトリにコピー=>新しい場合はコピー」に設定しないとダメなんですね。。。 VS使ってる人には常識なんでしょうか? Eclipseでやってるときは基本的に全部Antでコピーしてたからなぁ~ GUIで設定ってのを見落としがちです。 気をつけないと。。。

土曜日, 2月 16, 2008

SQLite.NET DbProviderFactoriesについて

.netではapp.config(内容はXML)ってのを使うのが普通みたいですね。 SQLite.NETでも多聞に漏れずHelpの最初に 「DbProviderFactories」についての説明があります。 このFactoryを利用すれば、SQLiteに依存したクラスを使わなくても動作します。 app.configでの設定方法は2種類あるらしく、
  1. SQLiteバージョン非依存
  2. SQLiteバージョン依存
ちょっとづつだが、app.configの書き方が違う。 最初はよくわからんかったのだが、そういう時はTry and Errorに限りますね。 1については
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite"
    description=".Net Framework Data Provider for SQLite"
    type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
</configuration>
アプリケーションのフォルダ(VS2008で言ったらDebugモードでbin/debugの場所)にSystem.Data.SQLite.DLLを設置しないといけない。 2については
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite"
    description=".Net Framework Data Provider for SQLite"
    type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"
    Version=1.0.48.0, Culture=neutral,
    PublicKeyToken=db937bc2d44ff139"/>
</DbProviderFactories>
</system.data>
</configuration>
この場合はアプリケーションのフォルダにdllを置く必要はないらしい。 addタグにVersion,Current,PublicKeyTokenの属性を付け足してやればグローバルキャッシュ?からdllをロードしてきてくれるみたい。。。 SQLite.NETの公式フォーラムで紹介されていたサンプルコードをSQLiteに依存しないクラスで書き換えてみた。 System.Data.Commonを使っています。
using System;
using System.Data.Common;

namespace Sample
{
  class Program
  {
      static void Main(string[] args)
      {
          DbProviderFactory fact = DbProviderFactories.GetFactory("System.Data.SQLite");
          using (DbConnection cnn = fact.CreateConnection())
          using (DbCommand cmd = cnn.CreateCommand())
          {
              cnn.ConnectionString = "Data Source=mydatabase.db";
              cnn.Open();

              // Create a new table
              cmd.CommandText = "CREATE TABLE FOO (ID INTEGER PRIMARY KEY, MyValue NVARCHAR(256))";
              cmd.ExecuteNonQuery(); // Create the table, don't expect returned data

              // Insert something into the table
              cmd.CommandText = "INSERT INTO FOO (MyValue) VALUES('Hello World')";
              cmd.ExecuteNonQuery();

              // Read the values back out
              cmd.CommandText = "SELECT * FROM FOO";
              using (DbDataReader reader = cmd.ExecuteReader())
              {
                  while (reader.Read())
                  {
                      Console.WriteLine(String.Format("ID = {0}, MyValue = {1}", reader[0], reader[1]));
                  }
              }
          }
      }
  }
}
どうにかして、dllが自動的にアプリケーションのところにコピーしてくれないもんか?と考えてます。(log4netのdllは勝手にコピーされてるみたいだし方法はあると思うんだけど。。。) あとは、もう少しなれたらLINQを試してみようと思う。

木曜日, 2月 14, 2008

つまるところFuncって何すっか?

C#のお勉強はまだまだ続いてます。 今回は System.Collections.Generic.Dictionary ではまった。。。 JavaでいうところのHashMapみたいなものらしい。 でも、keyタイプでコレクションを引き当てようと色々試してみるとIEmutable.Select(Func selector) って、コードフォーマットが出てくる。。。 これかな? と思って触ってみたら、どうもこれはselectorで操作したコレクションを返すものらしい。。。 普通のコレクションならFind(delegate(){})で当てれるのに。。。 これが、.net framework3.0の新機能なのかな? LINQってのもあるらしいけど、これはJavaのhibernateのHQLみたいなオブジェクトに対するSQLのお友達なんだろうと、ちょっと説明を読んで思った。 LINQってのはSQLiteの組み込みで実験してみるか。。。 そのうちに。。。

水曜日, 2月 13, 2008

結局WPFの利点は何なんだろう?

ちょっとC#の勉強の箸休めにWPF(Windows Presentation Foundation)を少し触ってみた。 xamlっていうタグ言語でデザインをするみたいだ。 データリソースの利用方法が理解できれば、もう少しやりやすくなるのかもしれないが、ちょっとIDEの機能が着いていけてないような気がしなくもないです。。。 このやっつけ仕事っぽい、プロパティビューはないだろ。。。 もう少し、使いやすくしてほしかった。。。 昔、C#のWebアプリの中国製造の受け入れ作業をしたことがったときにGUIで作ったアプリってどうしてもaspxファイルの中身がグチャグチャでおかしくてもどのあたりがおかしいのかわからないってことがあった。。。 その時には「やっぱ、HTML系のコードは手で作るのが一番正確だ!」と思った。今でもその考えはかわらない。 もう少し、IDEの機能が強化されたらWPFにチャレンジしてみようと思う。

日曜日, 2月 03, 2008

C#のIOストリームって

懲りずにC#のお勉強中です。 今日、気になったんですが、ファイルのストリームを開いた後に当然close(必要ならその前にflush)する訳ですが、もともとJavaばっかりやってた人間ですので try{}catch(Exception e){}finally{} のような書き方でいいだろうと思っていたんですが、 usingを使って強制的にDepose(オブジェクトを解放するもんだと思ってます)でflush・closeをしてくれているらしい。。。 .net1.1だと何かバグとかあったらしいけど。。。 しかし、using句を使ってExceptionが発生したときには、どうやってハンドリングするんだろう?? 結局、try/catchも書きつつusingを使っていくしかないのかなぁ~?

月曜日, 1月 21, 2008

C#特訓(C#概要-その1)

いきなり、話は脱線するがMicrosoft Visual C# 2008 Express Edition + Subversionができるかどうかを見てみたら、どうやらできないらしい。。。 Visual Stadio用のアドインとしてAnkhってのはあるんだけど、Expressは対応してないらしいです。 非常に残念だ。。。 気を取り直して、本題の「C#概要」を読んだまとめ 1.プログラムの構造と実行フロー Windows フォーム アプリケーション 手続型と違ってイベントドリブンなんですよ~って説明(このあたりはJavaと同じだね) Windowsベースアプリは通常親がすべての状態を参照することができてメッセージのやり取りが可能 これと同じような機能をデリゲーションってのでもできるらしい。(これはそのうち出てくるみたいだからスルーだな) コンソールアプリケーション 基本的にMainメソッドを含む1つのクラスで構成される。 後はC#の構造を覚えるなら公開されているソースコードを読んどきなさい!とのこと、概要に目を通したら見てみよう。 2.名前空間(namespace) Javaでいうところのパッケージですな。
using hoge.hoge;
で呼び出すらしい。 何かサラっと書いてあったのでビビったが、.NET Framework だけでも 80 以上の名前空間があり、1 つの名前空間には最大で数千のクラスがあるらしい。。。JavaDocみたいなのってどこにあるんだ?? 独自の名前空間について、説明では
プロジェクトの各名前空間用に個別のフォルダを作成することをお勧めします。
なんて言ってるんですが、分けなくても動くのかよ。。。 3.クラス 言わずと知れたOOPなクラスですな。
  • newでインスタンス作成
  • 静的(static)とインスタンスのメンバについて、後はstaticクラスもあるよってところかな?staticメンバをインスタンスメンバとして操作すると軽度のエラーが発生する可能性があるそうです。(しかし、何で軽度で済むんだ。。。
  • カプセル化の話(もう、今更だね。。。)
  • 継承については:(コロン)でやるらしい child : parent
  • ポリモーフィズムな話(オーバーライドな話)
  • コンストラクタ(すべてのクラスにあるそうな)ついでに変数の初期値についても説明があった「ゼロ (数値データ型)、false (ブール型)、または null (参照型) 」
  • オーバーロードな話「。オーバーロードにより、コードの柔軟性とわかりやすさが向上します。」(マジですか??
  • デストラクタの話、こいつについてはJavaなら基本的にガベージは自動的にされるので意識しなかった(シリアライズデータをいじるときくらいかな?)。ここでは「アンマネージ リソースを使用する場合を除き、デストラクタの実装が必要になることはまずありません。」とのことアンマネージリソースについては後で説明があると思うのでスルー
  • 構造体について、構造体・・・?なんだこりゃ??現時点ではTypeの一種として認識しておくことにしてスルー
サブのカテゴリとして
  • 方法 : オブジェクトでメソッドを呼び出す
  • 方法 : クラスから継承する
  • 方法 : 既定のパラメータをシミュレートする
  • 方法 : プロパティを宣言する
  • 方法 : オブジェクトにプロパティを設定する
に目を通す。 気になったのは、シール(sealed)クラスってのは継承しないようにした方が良いらしい。(Javaでいうところのfinalのことらしい) プロパティの宣言方法が「おぉー!」って思った。
private string name;
// A read-write instance property:
public string NameProperty
{
  get
  {
    return name;
  }
  set
  {
    name = value;
  }
}
こんなのでいいらしい。 とりあえず、まとめが長くなったので今日はここまで!

C#特訓(Hello World編)

何か順番が前後した気もしなくもないが、前回のC#特訓(Windowsフォーム アプリケーション作成編)の最後で初心者は「C#言語の概要」を読めとのこと。。。 もっと早く言ってください!! とりあえず、やってみました。 やったことは
  • よくあるプログラミング入門「Hello World」を作る
  • もうひとつクラスを作ってインスタンスを作成し、そいつをHello Worldから呼び出す。
  • System.Console.writeLine(string, object...)書き方はこれでいいのかな?で{0}とかで文字列を埋めることができるのを確認する。
Hello Worldのところで説明している分は網羅したつもりです。 まずは新しいプロジェクトとして「コンソールアプリケーション」を選択します。 あとはとっても簡単なMainメソッドを呼び出すだけです。 しかし、Mainメソッドの先頭文字が大文字なのはいいのか? とりあえず、気になったのでmainとして実行してみるとMainが無いと怒られた。。。 特殊だからいいのか?? あとは System.Console.writeLine("Text1={0},Text2={1}",100,"テキスト"); ってな感じでコードを書くと出力結果は Text1=100,Text2=テキスト となる。 この辺はJavaで言うjava.text.MessageFormatと同じような動きのようだ。 とりあえず、先に概要を読めばよかったと反省。 「C#言語の概要」は結構長いので続きはまた明日です。

日曜日, 1月 20, 2008

C#特訓(Windowsフォーム アプリケーション作成編)

心機一転してC#のお勉強を始めてみた。

まずはここからMicrosoft Visual C# 2008 Express Editionをダウンロードします。
インターネット経由で.netフレームワークやらIDEをダウンロードしてインストール作業が自動的に進みます。

しかし、何故か1回目は.net Framework3.5のインストール段階でフリーズです。。。
何か雲行きがいきなりおかしくなってきました。。。
一度、中断して再度インストールを実行すると無事インストールされました。(よかったよかった)

さて、まずはC#の教材として最適なものをWeb上で探そうとしましたが、どうやらC#ってのは既に3ヴァージョンあるみたいです。(この辺はJavaと同じですかね?下位互換とかは大丈夫なのかな?)

せっかくやるのなら最新のでお勉強したいものです。
そこらへんにあるC#入門でやるのはあきらめてIDE周りの使い方も勉強したかったので、「スタートページ」の「作業の開始」ってところにある『最初のアプリケーション』というのから手をつけてみましょう。

どうやらお題はWebブラウザを作成するといったものです。

題して『方法 : C# Windows フォーム アプリケーションを作成する』です。

VBちっくにフォームに部品をあれこれ置いて行きF5を押すと自動的にビルドされ実行されます。

言われたとおりにコードを足したのに動かない。。。

ウィンドウは出てくるんですけど、指定したURLへ移動できないのです。。。

ここで、そういやprivateメソッドで各種アクションの挙動は追加したけど、フォームのどことも紐づけていなかったことに気付きます。

よくよく、説明を読んでみると稲妻マークのところで紐づけるようです。

コード的には
this.goButton.Click += new System.EventHandler(this.goButton_Click);
  • goButtonはボタンオブジェクトの名前
  • goButton_Clickはイベントメソッドの名前
ってのがボタンと動作をくっつける動作であることを理解.

しかし、this.goButton.ClickってのがClickしたときのプロパティであることは理解できるんですが、
「+=」なんてやり方で追加しちゃっていいんですか??

うーん、単純でわかりやすいと言えば分りやすいのかもしれないけど、やっぱaddEvent(EventHandler)ってイメージとのギャップに少し驚きです。
あとは、
namespase Foo{ public class Bar{public void method(){}}} ってな具合にnamespaseから{}で囲まないといけないってことが最初わからず。いつまでもエラーが消えなくて泣きそうに。。。
理由がわかれば非常に恥ずかしいですけどね。。。

もうひとつクラス上でのpartial宣言が「何じゃこりゃ?」って最初は思いました。
Javaと違ってクラス名とファイル名が一致しないなんて事ができるんですね。驚きでした。

しかし、無料でIDEを出してくれたMicrosoftさんありがとうです。
今度は別の教材を勉強しようと思います。

今日はここまでです。

failed to read qemu headerのときのメモ

かなり久々。。。 忘れないようにここに書きこんでおく。 ちょっとした手違いで libvirtでイメージを起動しようとすると failed to read qemu header なんておっしゃられて起動しない。。。 vmwareserverを使って...