.NETの最近のブログ記事

ので その時使った 発表資料±α を置いておきます。

内容は プログラミング言語Boo についての簡単な紹介です。

時間が無かったので、 callable とか built-in macros とかの説明は省いてます。

ところで、"Hello, GUI World" の説明は Formにラベルを貼り付けるんじゃなくて、
↓みたいにボタンを置いてイベントハンドラの例示をした方がよかったですね。 反省。

import System.Windows.Form

class Hello(Form):
  public def constructor():
    button = Button(Text: "Push Me :)")
    button.Click += { MessageBox.Show("Hello, GUI World!") }
    self.Controls.Add(button)

こんな感じで。

子Windowの PreviewKeyDown イベントをハンドルしてやって PreviewKeyEventArgs.IsInputKeytrue にしてやれば親WindowのControlのフォーカスに使われることなく、子WindowのKeyDownイベントが発生するらしい。

という大変安直な名前の pixiv 専用クライアントを何かちょこちょこ作ってます。

一応 launchpadプロジェクトページ をこさえてみました。
Bazaar をお持ちであれば、 bzr branch lp:pixivviewer/trunk で多分最新のコードが取って来れます。
プロジェクトページにも書いてありますが、 SharpDevelop 4.0 で Boo言語 を使って書いてます。

「コードとかしらねぇよ。使える奴よこせよ」とかいう向きには、 ダウンロード用ディレクトリ に適当においておくので、適当にあれしてください。
なお、実行には 無駄に .NET Framework 4.0 が必要です。入ってない人はWindowsUpdateなり .NET Framework 4.0 のダウンロードページ なりでダウンロードしてインストールしてやってください。

レジストリとか多分使ってないので、アンインストールの際は展開したフォルダと 画像キャッシュディレクトリ を消してあげてください。

基本的に自分用に作ってるので、使いやすいかどうかは知りません。というか、個人差があるもんですよこういうのは。
後、本ソフトを使用する事によって生じるあらゆる事象については、私は責任を持たないものとします。あくまでも自己責任で使ってください。

質問等ありましたらこのエントリのコメントなり、 twitter なり launchpadのプロジェクトページなりでどうぞ。

ネタ元→ http://bbs.wankuma.com/index.cgi?mode=al2&namber=38363

ちょろっと.NETのクラスライブラリ眺めてみましたが、 .NETって標準ライブラリ使ってさくっとシャッフルすることって出来ないっぽい?

C++ なら std::random_shuffle, Perl なら List::Util でお手軽にシャッフルできるのにねー

#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
  int list[13];
  for (int i = 0; i < 13; ++i)
    list[i]=i+1;
  std::random_shuffle(list, list+13);
  std::copy(list, list+13, std::ostream_iterator<int>(std::cout, ","));
  return 0;
}
use strict;
use warnings;
use List::Util qw/shuffle/;
$,=',';
print shuffle 1 .. 13

http://floralcompany.jp/archives/2009/06/twitterfollower.html のツールですが、ようやくテストできました。
んで、やはりというかなんというか、実際にblockするとこがバグってましたので修正して上げ直しておきました。

本体ソース です。

ネタ元 → http://twitter.com/uten00/status/2177684203

まぁ、確かに最近のTwitterはSpamFollowerがわんさか来るようになってて、もちろん運営の方々も何らかの対処をやってるものだとは思うのですが、あまりにもしつこい&そこそこ量があるので、このようなツールに要望が出てくるのも致し方なしなのかな... (件の方がこういう形のツールを望んでいたのかどうかは不明ですが

S2Daoを使ったプログラミングの核となる、Entity(JavaではBeanと表現する。データを入れる「箱」)とDao(Data Access Object。データベース等へのアクセスを透過する)を作っていきませう。

とりあえず、不本意ながらどこにでもあるような 社員と部署 のサンプル を考えてみます。データは以下の通り

EMPLOYEE テーブル

IDNAMEDEPT
1山田 太郎1
2田中 一郎2
3鈴木 源太郎1

DEPT テーブル

IDNAME
1開発
2営業

S2Dao.NET を使った諸々を書く前に、S2Dao.NETが使ってる log4net の設定をする。

まず、configファイルの変更をlog4netが検知できるようにするため、 properties/AssemblyInfo.cs に以下の行を加える。

[assembly: log4net.Config.XmlConfigurator(Watch=true)]

そして、app.configを作成し、log4netの設定を書き込む。

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <log4net>
    <appender name="ConsoleAppender"
      type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.SimpleLayout">
      </layout>
    </appender>
    <root>
      <level value="INFO" />
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>
</configuration>

上のは単なる例なので、一番手間のかからないConsoleAppenderとSuimpleLayoutの組み合わせを使っている。

これで、log4net を利用する準備ができたので、一応確認しておく。

using System;

namespace S2DaoTest
{
  class Program
  {
    private static readonly log4net.ILog logger =
      log4net.LogManager.GetLogger(typeof(Program));

    /// <summary>
    /// エントリポイント
    /// </summary>
    /// <param name="args">使わない</param>
    public static void Main(string[] args)
    {
      logger.Info("Hello, world");

      Console.Write("Press any key to continue . . . ");
      Console.ReadKey(true);
    }
  }
}

ビルド・実行して、コンソールウィンドウに "INFO - Hello, world" と出力されればOK

但し、注意点。
ユーザコードでlog4netを使うより先にS2Dao/S2Container がlog4net を使用するような場合は、S2Dao/S2Containerを使う前にlog4netの初期化コードを入れなければならない。らしい

using System;

namespace S2DaoTest
{
  class Program
  {
    /// <summary>
    /// エントリポイント
    /// </summary>
    /// <param name="args">使わない</param>
    public static void Main(string[] args)
    {
      // http://s2container.net.seasar.org/ja/setup.html#log4net
      System.IO.FileInfo info = new System.IO.FileInfo(
          log4net.Util.SystemInfo.AssemblyShortName(
            System.Reflection.Assembly.GetExecutingAssembly())
          + ".exe.config"); // アセンブリがdllの場合は".dll.config"

      log4net.Config.XmlConfigurator.Configure(log4net.LogManager.GetRepository(), info);

      /* S2Dao/S2Container を 使う */
      // ...

      Console.Write("Press any key to continue . . . ");
      Console.ReadKey(true);
    }
  }
}

Seasarプロジェクト にある S2Dao.NET を使ってみたので、諸々を備忘録代わりに。

Q. S2Dao.NET って何? --- A. O/Rマッパーの一。 S2Dao の .NET Framework 対応版

Q. 入手方法? --- A. 本記事執筆時点では、 S2Container.NET に取り込まれているので、 S2Container.NETの最新版をダウンロードしてくればよろしいでしょう。

Q. prereqs? --- A. 公式のドキュメントには log4net を使ってるからどーのこーの書いてあるけど、アセンブリはS2Containerの配布物に同梱されてる。

Q. 事前に仕入れておいたほうがよい知識 --- A. AOP, インタフェースプログラミング, DI (後、おまけで ADO.NET)

-----

準備は整った。おもむろに VisualStudio ででも SharpDevelop ででも、 適当なSolutionとProjectを作り、 Seasar.DLL, Seasar.Dao.DLL, log4net.DLL を参照設定に追加しよう。

また、利用するDBがMS SQL Server や Oracle でない場合は、別途 ADO.NET対応のデータプロバイダを用意しよう。(例:SQLite なら System.Data.SQLite が利用できる)

ハノイの塔 をたくさんの言語で。

唐突に書きたくなって、頑張って色々書いてみた。(残念ながらスタック型言語(Brainf*ckとかwhitespaceとかは無い)

ハノイの塔回答プログラムのポイントはおおよそ2点

  • 関数/サブルーチン等の再帰呼び出し処理
  • 経過を出力する際の文字列フォーマッティング

それでは、どうぞ

という問題にこの間半日ほど悩んだので、原因と対処法をば...

ケース1:こんなの

public abstract class BaseForm : Form
{
  public abstract void hoge();
}

public class DerivedForm : BaseForm
{
  public override void hoge() { /* なにやら */ }
}

ケース2:こんなの

public class BaseForm : Form
{
  public BaseForm()
  {
    this.Load += new System.EventHandler(this.FormLoad);
  }

  private void FormLoad(object sender, System.EventArgs e)
  {
    throw new Exception("hoge");
  }
}

public class DerivedForm : BaseForm
{
}

前回 に引き続き、もういっちょソートネタ

何か、επιστημηさんのところで(というかわんくま同盟内で?)ソート祭りだそうなので、せっかくなので挑戦してみる。

...あれ? どぉやんだ? (東方算程譚) より。

名前と得点をメンバに持つExamの集合がある。
得点順にソートし、30点以上80点未満を列挙せよ。

これを System.Collections.Generic.List<Exam> でやろうとすると
どないになるんす?

使用するSQLiteライブラリは System.Data.SQLite
これは、Complete ADO.NET 2.0 Implementation ということだそうですが、
なにせ、ADO.NETとか使ったこと無いんで案の定ドキュメントあっても引っかかるところがあった...

ので、自分用備忘録として、使い方を載せておきます。

using System;
using System.IO;
using System.Data;
using System.Data.SQLite; // 名前空間のimport

class SampleClass
{
  public static void main(string[] args)
  {
    // コマンドライン引数の1つ目はデータベースファイルへのパスとする。
    if ( args.Count != 1 || !File.Exists(args[0]) ) {
      Console.WriteLine("usage: <exec> <dbfile>");
      return;
    }

    // データベースコネクションを設定
    SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
    builder.DataSource = args[0];
    SQLiteConnection conn = new SQLiteConnection(builder.ConnectionString);
    // 接続
    conn.Open();

    // Prepared Statementを作成
    SQLiteCommand comm1 = conn.CreateCommand();
    comm1.CommandText = "INSERT INTO TBL_HOGE VALUES (?, ?)";
    // Prepare() は"Does nothing"なので呼ばなくていい

    // パラメタを設定
    SQLiteParameter param = comm1.CreateParameter();    
    param.Value = "Hoge";
    comm1.Parameters.Add(param);
    param = comm1.CreateParameter();
    param.Value = 32;
    comm1.Parameters.Add(param);
    // statement を使いまわす場合は先に Parameters.Clear() しておく

    // SELECT以外の実行
    // INSERTした行数やらUPDATEした行数やらが返ってくるので
    // 必要なら使う。
    comm1.ExecuteNonQuery();

    // 今度はSELECT
    SQLiteCommand comm2 = conn.CreateCommand();
    comm2.CommandText = "SELECT * FROM TBL_HOGE";

    using ( SQLiteDataReader r = comm2.ExecuteReader() ) {
      // r.FieldCount --- 現在のResultSetのカラム数
      // r.HasRows --- SELECT結果が1行でもあれば true
      // r.Read() --- 次のResultSetを<b>読み込む</b>
      // r.NextResult() --- 次のResultSetへ<b>移動する</b>。(移動するだけで読み込んではくれないっぽい)
 
      // 初期rowは最初の結果の1つ前(他の多数のDBライブラリと一緒)
      int ridx = 0;
      while ( r.Read() ) {
        Console.WriteLine("["+ridx+"]");
        ++ridx;
        for ( int i = 0; i < r.FieldCount; ++i ) { // columnのindexは0 origin
          Console.WriteLine("  " + r.GetName(i) + " --- " + r.Item[i]);
          // もしくはr.Get***() メソッドで型指定で取ってくる。
        }
      }
    }

    comm2.Dispose();
    comm1.Dispose();
    conn.Dispose();
  }
}

こんな感じかな。

ちなみに、Parameterの型をちゃんと指定しないとまずい場合は、

SQLiteParameter param = comm.CreateParameter();
param.DbType = System.Data.DbType.Int64
param.Value = 0L;
comm.Paramters.Add(param);

とかやる。 (2008-03-18 基本的に常に指定しなきゃいけないみたい..)

また、SQLiteは基本的に変更即commitなので、Transactionは明示的に

SQLiteTransaction tx = conn.BeginTransaction();
// 何か変更
tx.Commit(); // または tx.Rollback();

とかやる必要あり。

もうひとつおまけ。
SELECT COUNT(*) FROM TABLE など、必ず1列目1行目が取れるような場合には

if ( (Int64)comm.ExecuteScalar() > 0 ) {
  // hogehoge
}

とかできる。

AUTHOR

  • turugina (虎王 剱奈)
  • E-mail: turugina {at} floralcompany.jp
  • pixiv
  • ニジエ

2014年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.10

- 警 告 -

本サイトにはいわゆる「18禁画像」(イラスト)へのリンクが存在します。 未成年の方や、その手の画像に不快感を覚える方は、 該当記事(「えちぃの」及び「ちょっとえちぃの」カテゴリ) をご覧にならないようお願いいたします。

上記を理解した上で非表示のブログパーツを表示する
あわせて読みたいブログパーツ
ついった
drawr/pixiv/twitpic