ちーたんつ~るず 始めます

最近はあまりツールやゲームを作ることがなく、ホームページをちょろっとメンテするぐらいだったので、ひさびさになんか作ろうかなーと思いました。ただ、本格的なものを作ろうとするとそれなりの時間がかかってしまうし、途中で飽きたり挫折したりする可能性もあるので、自分が作りたいものを規模の大きさに関わらず気ままに作るつもりです。基本的に誰かのために作る、というよりは自分が欲しいから作る、というスタンスです。ただ、自分しか使わないのももったいないので、他の人にも使えそうなものがあれば公開していこうかと思います。

さて、ツールを公開するにあたり、ちょんプロ(ちょっとしたプログラム)みたいなものを公開してもなんか素っ気ないので名前を付けることにしました。その名も「ちーたんつ~るず」です。「つ~るず」は Tools をひらがなにしたものです。「ちーたん」は以前作っていた Windows Mobile 用の Twitter クライアントの名前から持ってきました。Windows Mobile のサポートも終了したため開発の方もやめてしまいましたが、それなりに使われたツールであり、そのままなくしてしまうのももったいなかったので名前だけでも今回採用しました。

前述したとおり、ちーたんつ~るずは私が気ままに作るツールなので、誰向けに作るというものではありません。多くの人に使えるツールである場合もありますし、ものすごく限定された人しか使わないようなツールである場合もあります。何を出すかはその時の気分次第です。

どんな環境で動かせるの?

基本的には .NET Framework で作ったツールになるので Windows デスクトップ用になるかと思います。ストアアプリ版を作る可能性もあるかもしれませんが、あちらは申請とかいろいろ面倒なので、気ままに作れるデスクトップ向けツールになるかと思います。場合によっては Web ツールになる場合もあります。その場合は sorceryforce.net のβ版開発室で公開することになるかと思います。

でもお高いんでしょう?

気ままに作ったツールなので、そこからお金を取ることはありません。ツールによっては広告を入れるという場合もあるかもしれませんが、利用者がツールを使うにあたって直接お金を支払うということはありません。アプリの購入やアプリ内課金もありません。

何を作るの?

ここまで書いたのだからなんか出すんだろうと思われますが、はい、まずは第1弾を公開する予定です。詳しい内容についてはツール公開時に書きますが、ほぼほぼできているので週末あたりには公開できるかもしれません。バージョンは 0.01 ですが、なんだかんだいって当初予定していたもの以上の機能をいれてしまったので、Ver 0.10 ぐらいでもいいんじゃないかと思ってます。一応 Windows デスクトップ向けのツールです。デスクトップ向けといってもタブレット向けです。とりあえず内容はお楽しみということで。

]]>

Visual Studio 2013 で HTML ファイルをデザインビューで編集できない

Visual Studio 2012 では HTML ファイルを開いた時にコードビューとデザインビューを表示することができたのですが、Visual Studio 2013 ではコードビューしか表示できないようです。

本来はビューの左下に選択項目があるのですが Visual Studio 2013 にはありません。

20140112180400@

aspx ファイルでは選択が可能です。

20140112180409@

前述のとおり、Visual Studio 2012 では HTML ファイルでも切り替えが可能でした。

20140112180435@

Microsoft 製品では Expression Web の開発も終了し、HTML 5 で編集できるのは Visual Studio ぐらいしかないので、Visual Studio 2013 で編集できないのはちょっと痛いです。aspx ファイルでは切り替えできるのでバグのような気もするのですがどうなんでしょう。

]]>

私の C# においての Region ディレクティブのつけ方

完全に私個人の考えにおいての内容なのであんまり参考にはしてほしくなかったりするのですが、こういうつけ方もあるよー、的なものとして書いておきます。

通常 Region ディレクティブの使い方としては複数のプロパティやメソッドを特定のグループとしてまとめて折りたためるようにしてコード全体を見やすくするために使います。一例としては下のような感じですかね。

#region プロパティ
public int X { get; set; }
public int Y { get; set; }
#endregion

こういう使い方は私も割と普通にします。しかし、特定のグループとして region でまとめあったとして、どのグループにいれるか判断が難しいメソッドを作成した時にどっちの region に入れるべきか迷うことが多々あります。

仮に文字列処理を「変換系」「検索系」の region でまとめたとします。そこに「Dictionary から特定のキーの値を探し出し、テキストを HTML に出力できるように変換し文字列を返す。」というメソッドを作成した場合「変換系」なのか「検索系」なのかかなり迷うことがあります。

まあこれは一例なのでほかにももっとバリエーションがあったりするのですが、そんなこんなで最近はグループのまとめとしての region はあまり使いません。

でも可視化するコードの量は減らしたいので、別案としてよくあるのが「メソッド単位で囲む」になると思います。例としては

#region " ToRadian : Degree から Radian に変換 "
/// <summary>
/// 角度を Degree から Radian に変換します。
/// </summary>
/// <param name="degree">Degree 単位の角度。</param>
/// <returns>Radian 単位の角度。</returns>
public static float ToRadian(float degree)
{
  return degree * (float)Math.PI / 180.0f;
}
#endregion

これでメソッドを1行にまとめることができます。しかし、これにはデメリットがあり、折りたたんだ場合にそのメソッドがどんなものなのかを示す情報が region の行1行にしかありません。さらに XML コメントとは別に起こさないといけないので、書くのが2度手間になり、修正も2度手間です。説明や引数が多かった場合でもなんとかして1行に収めないといけないです。

上記のような諸々の事情を解決するため、私は region を下のようにつけるようにしました。

/// <summary>
/// 角度を Degree から Radian に変換します。
/// </summary>
/// <param name="degree">Degree 単位の角度。</param>
/// <returns>Radian 単位の角度。</returns>
public static float ToRadian(float degree)
#region
{
  return degree * (float)Math.PI / 180.0f;
}
#endregion

例は1行しかないので全然メリットはないんですが、こうすることによって概要や引数、戻り値の情報が見れる状態でコードを折りたたむことができます。別途 region 用のコメントを書かなくていいのもメリットですね。もちろん1行regionよりは行数が増えてしまいますが、まあ、ここら辺はどうしようもないでしょう。増えすぎたらグループをregionでまとめて(最初に戻る)

ちなみにこの region のまとめ方は正規法でもなんでもないので、VB.NET で同じやり方をすると構文エラーで怒られます。こんなやり方もあるよー程度にしておいてください・・・。

]]>

MonoGame の SoundEffect.Play メソッドで未定義エラーが発生する原因について

国内にはさっぱり情報がないので海外のサイトを調べていたのですが、いくつかのサイトでは SharpDX の参照 DLL が間違っているせいという答えが書かれていました。しかし情報としては数か月前のものであり、実際に参照を見ても最新版では間違っているようには思えませんでした。

もう少し調べてみたら下記のサイトを見つけ、内容の通りに修正してみたら見事解決。情報が少ないと割と自力解決しなければいけないので苦労しますね…。

]]>

Entity Framework にて文字列の部分一致検索を行う

メモ書きです。

using (var entities = new xxxxxxEntities())
{
  var persons = from item in entities.Person
                where item.Name.Contains(keyword)
                select item;
}
// xxxxxxEntities は .edmx ファイルから生成されたエンティティクラス
// entities.Person はデータベースのテーブルから取得、生成されたクラス・プロパティ
// keyword は検索文字列

]]>

[.NET] 他のコントロールに押下キーの情報を渡す

アクティブでないウィンドウやコントロールに対してキーボードのキーを押したかのように情報を送るには、対象コントロールなどにフォーカスを当てて「SendKeys.Send」メソッド(または SendKeys.SendWait メソッド)を使うことによって送ることができます。

例えば、以下の例ではフォームがアクティブになっている状態でキーを押したときにテキストボックスに押したキー情報を送ってテキストを入力することができます。

private void form1_KeyPress(object sender, KeyPressEventArgs e)
{
  // アクティブなコントロールにキーを送るためフォーカスを当てる
  textBox1.Focus();
  SendKeys.SendWait(e.KeyChar.ToString());
}

フォームでキーが押されたときに Focus メソッドでテキストボックスにフォーカスを当て、SendKeys で押されたキーを送っています。送ったあとフォーカスを戻すのがベストだとは思いますが、必要に応じて入れてください。

基本的なコードはこれで OK なのですが、SendKeys では一部のコードが特殊な用途に使用されるキーであるため、このままでは送ることができません。対象キー、用途については以下の MSDN の SendKeys を参照してください。

特殊キーを通常の入力キーとして送るには中括弧({})で囲む必要があります。これを踏まえるとコードは以下のようになります。

private void form1_KeyPress(object sender, KeyPressEventArgs e)
{
  // アクティブなコントロールにキーを送るためフォーカスを当てる
  textBox1.Focus();
  switch (e.KeyChar)
  {
    case '^':
    case '+':
    case '%':
    case '~':
    case '(':
    case ')':
    case '{':
    case '}':
    case '[':
    case ']':
      // 特殊記号は中かっこで囲って送る
      SendKeys.SendWait("{" + e.KeyChar + "}");
      break;
    default:
      SendKeys.SendWait(e.KeyChar.ToString());
      break;
  }
}

これで一見完成のように見えるのですが、実は動かしてみると「^(カレット)」キーを押したときになぜか「&(アンパサンド)」で送られてしまいます。.NET Framework のバグかはわかりませんが、これでは完全とは言えないため別案を使います。

WSH (Windows Script Host) にも同様に SendKeys の仕組みがあり、こちらは正常にカレットが送るのでこれを使います。WSH を使うには以下の手順を行う必要がります。

  1. 参照設定の追加で、COM タブから「Windows Script Host Object Model」を追加する。
  2. 参照設定に追加された「IWshRuntimeLibrary」のプロパティを開き、「相互運用機能型の埋め込み」を False に設定する。

そのうえで以下のようにコードを修正します。#if の条件を入れていますが、WSH を使うか使わないかで分けているだけなので不要であれば消してください。

private void form1_KeyPress(object sender, KeyPressEventArgs e)
{
  // アクティブなコントロールにキーを送るためフォーカスを当てる
  textBox1.Focus();
  switch (e.KeyChar)
  {
    case '^':
#if true // Interop.IWshRuntimeLibrary を使ってよい場合
      (new IWshRuntimeLibrary.WshShellClass()).SendKeys("{^}");
      break;
#endif
    case '+':
    case '%':
    case '~':
    case '(':
    case ')':
    case '{':
    case '}':
    case '[':
    case ']':
      // 特殊記号は中かっこで囲って送る
      SendKeys.SendWait("{" + e.KeyChar + "}");
      break;
    default:
      SendKeys.SendWait(e.KeyChar.ToString());
      break;
  }
}
]]>

[C#]Visual Studioにおけるステートメントのコードスニペット

実はいままで知らなかったんですが if 文や for 文を入力する際にコードスニペットを使って定型文を入力できたんですね。今までちまちま鍵かっこと書いていました。^^;

コードスニペットは Tab キーを押して入力できます。まず、if 文を例として、if 文を入力したい箇所にカーソルを置きます。

image

続いて「if」と入力します。インテリセンスが表示されるので途中で Tab キーを押して確定しても構いません。

image

下のように「if」の後ろにカーソルがある状態で Tab キーを押します。

image

下図のように必要なかっこが自動的に作られます。あとはオレンジ色になっている個所を修正していきます。

image

else 文が必要な場合は同様に else と入力した後に Tab キーを押せば鍵かっこが追加されます。これ以外の for や while, switch などにも使えるので試してみてください。

試していませんが、VB.NET とかもできるのではないかと思います。

]]>

.NET Framework 4 で Crystal Reports for Visual Studio 2010 を使うと実行時にエラーが発生する

アプリケーションで .NET Framework 4 を使用し、app.config で以下のように .NET Framework 4 をサポートするように設定します。

<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

この状態で Crystal Reports for Visual Studio 2010 に関連する処理を実行すると、実行時に下のようなエラーが発生します。

ファイルまたはアセンブリ 'file:///C:Program Files (x86)SAP BusinessObjectsCrystal Reports for .NET Framework 4.0CommonSAP BusinessObjects Enterprise XI 4.0win64_x64dotnet1crdb_adoplus.dll'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

このエラーを回避するには、app.config の startup の属性に「useLegacyV2RuntimeActivationPolicy="true"」を追加します。

<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

この属性の詳しい説明については以下を参照して下さい。

]]>

SQL Server Management Studio で 0.5 を round するとエラーになる

環境

  • クライアント:SQL Server Management Studio 2008 R2
  • データベース:SQL Server 2008

内容

SQL Server Management Studio で「round(0.50, 0)」のように0.5<=x<1の範囲を round すると「expression をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。」というエラーが発生します。

下のコードのコメントを外すと確認できると思います。

select
 round(0.01, 0) as [0.01]
,round(0.49, 0) as [0.49]
--,round(0.50, 0) as [0.50] -- expression をデータ型 numeric に変換中に、
--,round(0.99, 0) as [0.99] -- 算術オーバーフロー エラーが発生しました。
,round(cast(0.50 as numeric(10, 2)), 0) as [0.50]
,round(cast(0.99 as numeric(10, 2)), 0) as [0.99]
,round(1.01, 0) as [1.01]
,round(1.49, 0) as [1.49]
,round(1.50, 0) as [1.50]
,round(1.99, 0) as [1.99]
,round(2.01, 0) as [2.01]

調べてみるとどうやら SQL Server Management Studio で実行したときだけ出るようで、プログラムなどから SQL を投げた場合ではエラーは出ないようです。

参考

]]>