サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ドラクエ3
akiramei.hatenadiary.org
唐突にPC98時代によく使われていたMAG画像形式ファイルを読み込むプログラムをC#に移植してみました。2,3個の画像でしか試してないのでバグがあるかも。 // 謝辞 // MITH(T.Saito)氏のWAB−S用マルチグラフィックローダ WMLのソースを参考にさせていただきました。 using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Runtime.InteropServices; using System.Text; /// <summary> /// MAG形式画像ローダ。 /// </summary> public static class MagFile { private
Visual Studioや秀丸だと行を選択してタブを押すとインデントを変えることが出来ますが、vimでも同様のことができたんですね。ビジュアルモードで行を選択して「>」で右インデント、「<」で左インデント。一回実行すると選択が解除されるのが不便だと思いましたが、.(ピリオド)で繰り返せばいいことに気づいて問題解決。 プログラミング言語のソース編集だったらファイルの先頭に移動して「=G」で整形するので、それほど使わないんですけどね。(^^;
最近知ったショックなこと。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sample { [AttributeUsage(AttributeTargets.Class)] class MyAttribute : Attribute { public string Name { private set; get; } public MyAttribute (string name) { Name = name; } } // _nameが参照できる!? [My(_name)] class Program { private const string _name = "mei"; static void Main (string[] args) {
MEF記事の連続投下第三弾。あまり一般受けしないネタを連投です。(^^; IronRubyをアプリケーションにホスティングは難しくありませんが、dynamicを使うなど特別扱いが必要だったりするし、何よりもVS上でコードを書いてビルドという流れの中に「rubyでコードを書いてC#でホスティングコードを書く」が入ると開発のテンポが悪くなります。私的にはrubyでコードを書いたら勝手に取り込んでくれるくらいでないとIronRubyをホスティングしようとは思わないです。 ということで今回のミッション。 C#で作成したインタフェースをrubyで実装してC#のクラスにインポートさせたい。 rubyで簡易的に実装して、あとでC#のコードで差し替えたりとかそんな使い方を想定しています。 必要なもの RubyCodeExportProvider : rubyで書いたクラスに対するエクスポートプロバイダ。
個人的に.NET4で一番期待していたMEFですが、何か足りないなぁっと思っていたらAOPがサポートされていなかったんですね。twitterでつぶやいていた案でちょっと組んでみました。ExportProviderでごにょごにょ。ただ、まだ勉強のためのコードなのでこのまま仕事とかでは使えないと思います。(^^; using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; using System.Linq; using System.Reflection; using System.ComponentModel.Composition.Primitives; using Castl
C#の場合、多重継承はインタフェースを使うことになりますが、実装クラスへの委譲を書くのがちょっと面倒です。一方、Pythonは実装の多重継承ができるのでこれを利用して委譲の手書きを手抜きできないか試してみました。 まずは、多重継承させるインタフェースを用意します。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace IronPythonSampleLib { public interface IBasicCalc { double Add(double x, double y); double Sub(double x, double y); } public interface IAdvanceCalc { double Mul(double x,
IronRubyはα時代から弄っていましたが、バージョンが上がるたびにホスティング方法が変更されていました。RCになったのでそろそろ最終版だと思いたいのですが、どーなんでしょ。(^^; てきとーなrubyのクラス。 class Foo def bar puts 'baz' end def add(x, y) x + y end def sub(x, y) x - y end end これをC#から呼び出してみます。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using IronRuby.Hosting; namespace IronRubySample { class Program { static void Main(string[] args) { //
私の調べもの(MS系技術情報)の場合、googleよりもbingの方が良い結果を返すことも多く、最近はもっぱらいbingを使っていたりします。Bing API 2.0のリファレンスを見たら何やら面白いことができそうなので、ちょっと弄ってみました。とは言っても英語->日本語翻訳ですが。(^^; 出来上がりは、こんなの。相変わらずのてきとーUI。記事が長くなるのでXAMLは省略。 Jsonを使った例になっています。一応、検索のコードも入れておきましたが、翻訳とほとんど一緒です。 using System; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Json; namespace BingSearchSample { public p
.NET4.0で追加されたExpandoObjectクラスを使うと実行時にメンバーの追加、削除が出来ます。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Dynamic; namespace DynamicObjectSample { class Program { static void Main(string args) { dynamic foo = new ExpandoObject(); // プロパティの追加 foo.Name = "mei"; // メソッドの追加 foo.Hi = new Action(() => Console.WriteLine("Hi, {0}!", foo.Name)); // メソッドの追加(引数あ
WinFormでは簡単に対応できるのでWPFも楽勝だと思っていたのですが、Visual Studioはあんま面倒を見てくれないです。やり方は色々ありますが、個人的には、 http://www.codeproject.com/KB/WPF/WPFLocalize.aspx この方法が良さそうに思いました。 上記の記事を読めば理解できますが、折角なので簡単なサンプルを作ってみます。 完成予定図 コンボボックスで言語を切り替えると、ラベルのテキストも連動して変わるだけの単純なものです。 プロジェクトの構成 こんな感じ。 まずは、リソース管理用のCultureResources.csを見てみましょう。 using System; using System.Collections.Generic; using System.Globalization; using System.Windows.Da
LINQによってデータ取得をSQLっぽく出来るようになったので、DataTable.Selectのようなメソッドは必要なのか?と、ふと思いパフォーマンス比較をしてみることに。 using System; using System.Data; using System.Diagnostics; using System.Linq; class Program { static void Main (string args) { DataTable t = new DataTable (); t.Columns.Add ("KEY1",typeof (int)); t.Columns.Add ("KEY2",typeof (string)); t.Columns.Add ("KEY3",typeof (string)); for (int i = 0; i < 1000; ++i) { Dat
ウィンドウの最小化ボタン、最大化ボタンを消して欲しいと要望があったので、後輩に頼んだら難しいという回答が。そんなのプロパティの設定だけだと思ってみてみたら、プロパティが無い。WPFのWindowってMinimizeBoxとかMaximizeBoxが無かったのね。これくらい用意してくれよ・・・と、ぶつぶつ言いながら、やっつけコード。 using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop; [Flags] public enum WindowStyleFlag : uint { WS_SYSMENU = 0x00080000, WS_MINIMIZEBOX = 0x00020000, WS_MAXIMIZEBOX = 0x00010000, }
便利だけどあんまり使われていないので、使用例をちょっと紹介。 開発中に#ifdef DEBUGでトレース埋め込んだりすることがあると思います。良くあるパターンとしてメソッド名や引数、時間などを書き出すと思いますが、単純作業で退屈ですし、ソースコードが読みにくくなってちょっと嫌です。そんなの時に、カスタム属性とRealProxyを使うと便利です。 こんなクラスがあったとします。 class MyClass : ContextBoundObject { public double Add(double x, double y) { return x + y; } public void Multiply(double x, double y, out double z) { z = x * y; } public double Divide(double x, double y) { if (
The Future of C# | pdc2008 | Channel 9 VS2010がダウンロードできないので、不貞腐れてPDC2008のヘジたんセッションをまとめてみました。ヒアリングが壊滅的に苦手なので、あまり当てにならないと思います・・・(^^; C#の進化 C#1.0 Managed Code C#2.0 Generics C#3.0 LINQ C#4.0 ? C#はマネージコードから始まってジェネリック、LINQと進化してきた。 トレンド Declarative Dynamic Concurrent 宣言型(Declarative) LINQで関数型言語の要素を取り入れている。 命令型(Imperative)はHow(どのように)に重点を置いているが、 宣言型はWhat(何を)に重点を置いている。 ハードウェアの進歩により、HowをJIT等に任せられるようになるので「何を」
Redirecting… Cecil is a library written by Jb Evain (http://evain.net/blog/) to generate and inspect programs and libraries in the ECMA CIL format. It has full support for generics, and support some debugging symbol format. ILバイナリをごにょごにょいじくり回せるライブラリです。Mono meetingでよく名前を聞いていましたが使ったことが無かったので試してみました。 サンプルコードをちょっとだけ改変したロギングコードを埋め込む例。(バイナリ書き換えAOPっぽいやつ) using System; using Mono.Cecil; using Mono.Cecil.C
CodePlex Archive The Managed Extensibility Framework (MEF) is a new library in .NET that enables greater reuse of applications and components. とありますが、とりあえずDIコンテナと考えておけばOK。既に記事として取り上げたつもりでしたが、過去に紹介していたのは、 はじめてのUnity - 匣の向こう側 - あまりに.NETな Unityでした。あと、Monologueの方でMEFのライセンスがMS-LPLなので云々とかあった記憶がありますが、これについては改善される方向なようです。 では、簡単なサンプルでMEFを見てみましょう。 まずは、インタフェースの定義。いつものIGreeting。 public interface IGreeting { v
仕事がVisual Studioを使った.NET開発になって昔ほど家でMSの開発環境を弄る熱意もなくなったので、自宅ではMacの使用率を上げようかと思います。で、早速、Monodevelopを入れてみたところ、メニューが文字化けしてしまいました。忘れないようにメモを。 /Library/Frameworks/Mono.framework/Versions/Current/etc/gtk-2.0 にある、gtkrcを編集。 gtk-font-name = "Hiragino Kaku Gothic Pro" とすればOK。 Monodevelopの起動は、「アプリケーション>ユーティリティ>ターミナル」を起動して、コマンドラインから $ monodevelop & と打ち込みます。
CodePlex Archive マイクロソフトが出しているDIコンテナですが、ちょっと興味があったので弄ってみました。 http://www.microsoft.com/downloads/details.aspx?FamilyId=6A9E363C-8E0A-48D3-BBE4-C2F36423E2DF&displaylang=en&hash=aBGhzv3UZX8uqX0aMdoKbxV9bzV8xWVigGzUoYDxEr8ZLApv1HNVx9jtfHPIg3bgREX5h6Z%2f0OKNWEvXJSCW2A%3d%3d まずは、ここからダウンロードし、インストーラを起動。 デフォルトだと、 C:\Program Files\Microsoft Unity Application Block 1.0 ここにインストールされます。 では、早速、サンプルの作成してみましょう。簡単な
id:Seasonsさんとこより。 http://d.hatena.ne.jp/Seasons/20071223/1198420293 今度は、Excel上で動画ですか! どーやっているんだろう・・・ 私が実現するとしたら、 AVIファイルからBMPを作成する BMP単位にExcelシートを作成する タイミングを取ってシート切り替え って感じかしら。 じゃ、やってみようっと。 先ずは、AVIからBMPの切り出し。Video for Windows APIを使えば切り出せますが、API直呼びはやめて、C#でラッパークラスを作成します。C++/CLIを使わずにP/Invokeで押し通すのは私の趣味(^^;。 using System; using System.Drawing; using System.Runtime.InteropServices; using System.IO; nam
LINQ to SQLを使うとDDLを書かずにデータベース、テーブルが作れるのが良いですね。外部キーもちゃんと張られますし。 (追記) これはLINQ to SQLじゃなくてLINQ to Entitiesなのかな。LINQ toほにゃららの区別がついてないです。(^^; SQL Server 2005 compactSQL Server compact 3.5向け。 using System; using System.Linq; using System.Data.Linq.Mapping; using System.Data.Linq; namespace ConsoleApplication1 { [Table(Name = "Customers")] public class Customer { [Column(Name="Customer ID", IsPrimaryKey
方法 : SQL Server Compact 3.5 データベースをアプリケーションと共に配置する sqlceca35.dll sqlcecompact35.dll sqlceer35EN.dll sqlceme35.dll sqlceoledb35.dll sqlceqp35.dll sqlcese35.dll 上記7つのDLLさえあれば、OKなのか。DBのためのインストール作業が不要なのはいいですね。 (追記)id:NyaRuRuさんのコメントより SQL Server 2017 on Windows and Linux | Microsoft 再配布の手続き。
コレクションを列挙する場合、foreachを使うことが多いのですが、要素が何番目なのか欲しい場合があります。IListが相手ならforで回せば良いですが、IEnumerableの場合だと自分でループカウンタを用意することになって、ちょっと不格好です。しかし、C#3.0だと拡張メソッドがそれなりに充実しているため、そのようなループを簡潔に書くことができます。 using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1 { class Program { static void Main(string args) { string ss = { "one", "two", "three", "four", "five", "six", "seven", "eig
ちょっと調べた限りでは、LINQ to SQLはOracleに対応していないようです。私はSQL Serverがさっぱりなので、これではLINQ to SQLで遊べません。(^^; 悔しいので、ググってみたら、http://code2code.net/DB_Linq/というものを発見しました。素のままのLINQ to SQLにくらべて手間は増えますが、これで行けそうな感じです。 手順 上記サイトからソースコードをダウンロードし、ビルドします。今回はOracleなのでDbLinq_OracleOnly.slnを使います。すると、DBLinq.Oracle.Prototype.dllが作成されます。 次にサンプルプロジェクトを用意して、先ほどのアセンブリを参照に追加します。 以下のコードを打ち込みます。もし、ユーザ、パスワードをscott/tigerから変更している場合は、適宜修正してください
ちょっと仕事で必要だったので調べてみました。基本的にはCOMから.NET呼び出しなのでCCWとなるのですが、ググってみるとVB.NETにてComClass属性を使うという例を発見。ComClass属性はVBのみなのでC#からは直接Excel公開は出来ない、という感じでした。が、納得が行かないので、ちまちま試していたらC#でも公開できました。ってか、すごく簡単でした。最初に探した記事はVS.NET時代のなので、VS2005から出来るようになったのかもしれません? 手順は以下の通り。 Excelから呼び出す簡単なアセンブリを作成します。ライブラリプロジェクトを作って、以下のコードを書きます。 using System; using System.Runtime.InteropServices; namespace MyClassLibrary { [ClassInterface(ClassIn
http://d.hatena.ne.jp/akiramei/20071125/1195977405 ↑のフォロー。 保存先にバージョン情報を持っているので、アセンブリのバージョン番号が変わると設定値が無効になってしまいます。その場合、旧バージョンから値を移行させる必要があります。 例えば、こんな感じ。 public class MySettings : ApplicationSettingsBase { const string KEY = "LastExecuted"; // ユーザ毎に保存する [UserScopedSetting] public DateTime LastExecuted { get { // if (this.SettingsKey.Contains(KEY)) {...} // ↑このように書くのはダメ。 // 最初のアクセス時に設定を読み込むようなので、 //
例えば、前回起動した時刻や起動回数など、実行時間を超えてアプリケーションの状態を保存したい場合があります。その場合、外部記憶(ファイルやDBなど)にシリアル化などして保存する(いわゆる永続化)ことになりますが、.NET2.0だと、SettingsBase(ApplicationSettingsBase)を使うと便利です。 以下は、アプリケーションの前回起動した時刻を保存する例。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; namespace Sample { public class MySettings : ApplicationSettingsBase { const string KEY = "Last
気づいてなかったのですが、.NET2.0からは、関数ポインタをDelegateへ変換して呼び出せるようになったんですね。.NET1.1のころはManaged C++を使ったり、ヘルパDLLを用意したりする必要があったのが、C#だけで解決できるようになったのは良いですね。試しにSusieのプラグインを呼び出すサンプルを書いてみました。 画像表示までやると日記で書くようなコード量じゃなくなるので、アーカイブ内のファイル名を列挙するだけです。(^^; using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.IO; namespace Sample { #region Win32 API static class Win
http://d.hatena.ne.jp/akiramei/20071111/1194786373 ↑で、AppDomainを使ってDLLをロード/アンロードさせましたが、.NET3.5ではアドイン開発用にSystem.AddInが追加されています。簡単なサンプルを書こうかと思いましたが、既に分かりやすい記事があったので、そちらを紹介するだけにします。(^^; ・http://msdn.microsoft.com/msdnmag/issues/07/02/CLRInsideOut/default.aspx?loc=jp ・http://msdn.microsoft.com/msdnmag/issues/07/03/CLRInsideOut/default.aspx?loc=jp 技術的な詳細。 ・How To: Build an Add-In using System.AddIn | G
app.configを複数ファイルに分けたいことがあります。例えば、app.configとweb.configに共通の設定などがあったりとか。この場合、カスタムセクションを作ったりすることになりますが、そこまで大掛かりなことが不要な場合は、configSourceを使うと便利です。 <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings configSource="appSettings.config"/> </configuration> 上記の場合、appSettingsの内容が別ファイル(appSettings.config)に記述できます。もちろん、接続文字列セクション(connectionStrings)とかも対応可能です。
次のページ
このページを最初にブックマークしてみませんか?
『匣の向こう側 - あまりに.NETな』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く