[C#]MemoryStreamに書き込んだ文字が、読み出し側で取得できないときにチェックする事。

WriteLine()で書き込んでも、フラッシュしないと読めない(場合がある)。
特に、長いデータを書き込んだとき、最後の方が一部だけ読めないときなどはこのパターン。

MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter( stream );
 
writer.WriteLine("test");
 
writer.Flush();               // <= これが必要



忘れがちなので注意!!

[C#] WinFormのプログラムからコンソール(標準出力)に文字を出力する

Windowsでは通常GUI(WinForm)のプログラムを作成した場合、通常ではコンソールへの文字出力を行う事ができません。コンソールアプリケーションでの文字列出力メソッドのSystem.Console.WriteLine()を試しに呼び出してみても、残念ながら何も出力されません。


ですが、プログラムのデバッグなど、コンソールに文字出力ができると便利なな場合も有ります。
このような場合、Win32 APIをコールする事で出力が可能です。

using System;
using System.Windows.Forms;
 
using System.Runtime.InteropServices; //DllImport属性を使用するために必要
 
namespace WinFormTest1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
 
            // コンソールにログを出力
            writeConsole( "Form1() called" );
        }
 
        private void Form1_Load( object sender, EventArgs e ) {
            // コンソールにログを出力
            writeConsole( "Form1_Load called" );
        }
 
 
        [DllImport("kernel32.dll")]
        public static extern bool AttachConsole(uint dwProcessId);
 
        [DllImport("kernel32.dll")]
        public static extern bool FreeConsole();
 
        //*********************************************************************
        /// <summary> コンソールに文字を出力する
        /// 
        /// </summary>
        /// <param name="msg">  出力する文字列</param>
        /// <returns>           true:成功, false:失敗</returns>
        //*********************************************************************
        private bool writeConsole( string msg ) {
 
            if ( !AttachConsole( System.UInt32.MaxValue ) ) {
                return false;
            }
 
            // stdoutのストリームを取得
            System.IO.Stream       stream = System.Console.OpenStandardOutput();
            System.IO.StreamWriter stdout = new System.IO.StreamWriter( stream );
 
            // 指定された文字列を出力
            stdout.WriteLine( msg );
            stdout.Flush();
 
            FreeConsole();
            return true;
        }
    }
}



上記例では、Win32APIのAttachConsole()、FreeConsole()を利用しています。
両APIは Windows2000以前のOSでは使用不可なので注意が必要です。(XP以降で追加されたAPIなので)


AttachConsoleの引数にMaxValueを指定する事で,自分のexeが実行されたコンソールが取得できます。

[Parameters]
dwProcessId [in]
 
ATTACH_PARENT_PROCESS (DWORD)-1
Use the console of the parent of the current process.


MSDNのAttachConsole function より


このプログラムを実行すると、以下のようにコンソールへの文字列出力が行えました。



またサンプルでは、writeConsole()メソッド内でAttachConsole()、FreeConsole()をコールしていますが、コンソールへの出力が大量にある場合は、メソッドの呼び出しをフォームのコンストラクタとデストラクタに移した方がパフォーマンスは良いです。

縦横のサイズ(尺、mm)から、面積を求める早見表

縦横のサイズ(尺、mm)から、面積を求める

[PukiWikiPlus]ページ編集時にパスワードを要求する


http://pukiwiki.cafelounge.net/plus/でPukiWikiを改造したPukiWiki Plus!というものが提供されています。

PukiWiki Plus!ではユーザ認証として、Digest認証や外部認証APIの利用ができるらしいですが、
これらの認証を使用したくない/使用できない場合や、そこまで本格的な認証は欲しくないけど簡易的なbot対策を行いたい場合があります。

このような場合のために、PukiWiki Plus!に対してページ編集時にパスワードを要求するようなパッチを当ててみました。
下記の変更を行う事で、パスワードを入力しないとコンテンツを編集できないようになります。



1.lib\html.phpのedit_form関数を変更

関数内の$body変数に対して、以下のタグ(パスワード入力欄)を追加します。

<textarea name="msg" rows="$rows" cols="$cols">$s_postdata</textarea>
<br />




<textarea name="msg" rows="$rows" cols="$cols">$s_postdata</textarea>
<br />
password:<input type="password" name="edit_password" maxlength="10" value="" />
<br />






2.plugin\edit.inc.phpのplugin_edit_write()関数を変更

以下の記述を追加すると、パスワード欄に”pass”と入力しないとエラーにさせる事ができます。

$edit_passwd = isset($vars['edit_password'])     ? $vars['edit_password']     : '';
 
if ($edit_passwd != "pass" ) {
	$retvars = array();
	$retvars['msg'] = "auth error";
	$retvars['body'] = "please input password.";
	return $retvars;
}



上記の替わりに、以下の記述を行うとbot対策で、書き込みが成功したように見せかけて、実際はページが変更されていない状態にできます。

$edit_passwd = isset($vars['edit_password'])     ? $vars['edit_password']     : '';
 
if ($edit_passwd != "pass" ) {
	return plugin_edit_honeypot();
}

[PukiWiki]パスワードを入力しないと編集不可にする

PukiWikiで管理者のパスワードを入力しないと、ページの編集不可にさせるよう、認証を行う方法です。
インストール先フォルダにあるpukiwiki.ini.phpを編集します。

$auth_usersの定義がされている場所を探し、既存のユーザをコメントアウトした後に、新しいユーザを作成します。

パスワードは安全のため、md5で変換した後の値をセットしておきます(下記のxxxxの場所)
また、md5の変換は、このページで行う事ができます。

$auth_users = array(
	// Username => password
	'admin'	=> '{x-php-md5}xxxx',
//	'foo'	=> 'foo_passwd', // Cleartext
//	'bar'	=> '{x-php-md5}f53ae779077e987718cc285b14dfbe86', // PHP md5() 'bar_passwd'
//	'hoge'	=> '{SMD5}OzJo/boHwM4q5R+g7LCOx2xGMkFKRVEx',      // LDAP SMD5 'hoge_passwd'
);




次に、認証を行う単位がページ単位(pagename)になっている事を確認します。

$auth_method_type       = 'pagename';   // By Page name




編集に対する認証をさせるように設定します。
下記の例では、全ページの編集に対してadminユーザの権限が必要となります。

$edit_auth = 1;		// 1:認証が必要
 
$edit_auth_pages = array(
	// Regex		   Username
	'##'	=> 'admin',				// 全頁に対してadmin権限を要求
//	'#BarDiary#'		=> 'bar',
//	'#HogeHoge#'		=> 'hoge',
//	'#(NETABARE|NetaBare)#'	=> 'foo,bar,hoge',
);



[C#]StreamWriterでファイルを排他オープンする方法

StreamWriterを使用してファイルを書き込む場合、通常以下のような感じでコーディングを行う。

using( StreamWriter writer = new StreamWriter( stream, Encoding.GetEncoding(932) ) ) {
	writer.Write( ... );
}



これに対して、出力するファイルを排他オープンし、ファイル書き込み中に他プロセスからの読み取りを拒否させたい場合がある。
その場合は、以下のようにusingを重ね、FileStreamからstreamをもらうようにすると良い。

using( FileStream   stream = new FileStream( filename, FileMode.Create, FileAccess.Write, FileShare.None ) )
using( StreamWriter writer = new StreamWriter( stream, Encoding.GetEncoding(932) ) ) {
	writer.Write( ... );
}

[C#]DataGridViewから,指定した条件に合うデータをLINQで取得する


DataGridViewコントロールに表示されているデータから,指定した条件に一致する行をLINQを使って取得するサンプルです。
ちょっと長いですが、1行で取得可能です。

string keyValue = "key1"; // 検索条件
 
DataGridViewRowCollection rowList = null;
try {
    rowList = DataGridView1.Rows.Cast<DataGridViewRow>().Select( row => row.Cells[ "ColKey" ].Value.Equals( keyValue ) );
} catch( Exception ex ) {
    // 該当データなし時は、例外が発生する
    MessageBox.Show( ex.Message );
}




また、キーに一致する行が1行のみだということが元から分かっている場合や、最初の1行目だけ欲しい場合は、以下のようにFirst()使用したほうが便利です。

string keyValue = "key1"; // 検索条件
 
DataGridViewRow row = null;
try {
    row = DataGridView1.Rows.Cast<DataGridViewRow>().First( row => row.Cells[ "ColKey" ].Value.Equals( keyValue ) );
} catch( Exception ex ) {
    // 該当データなし時は、例外が発生する
    MessageBox.Show( ex.Message );
}


WordPressで作ったサイト(blog)を、ブラウザの”検索プラグイン”に追加する

FirefoxやIEには、画面上部のアドレス表示欄の右に、検索バーが有ります。
検索バーを使うと、人気のある検索エンジンを、そのサイトを開くことなく利用することができるので大変便利です。



今回は、この検索バーにWordPressで作ったblogサイトを検索できるようにする方法を説明します。




まず、下記のファイルを作成し、Webサーバ上の適当なフォルダに置きます。
(今回はhttp://nanoappli.com/nanoappli_blogsearch.xmlにおいたとして説明します)

<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
    <ShortName>nanoappli.com BlogSearch</ShortName>
    <site>http://nanoappli.com/</site>
    <InputEncoding>UTF-8</InputEncoding>
    <Url type="text/html" template="http://nanoappli.com/blog/?s={searchTerms}" />
</OpenSearchDescription>



上記の中で、ShortName、site、Urlの中を変更します。
ShortNameは、検索バーに表示されるタイトルです
siteは検索バーのインストール時に表示されます。
Urlタグのtemplateには検索を行う際のURLを指定します。{searchTerms}の部分が入力された検索キーに置き換わります。



次に、blogサイト内に、以下のタグを埋め込みます。

<a onclick="window.external.AddSearchProvider("http://nanoappli.com/nanoappli_blogsearch.xml");">
nanoappli.com 検索プラグインを追加
</a>


このjavascriptによって、検索バーに項目を追加する事ができます。



これで準備は完了です。
実際に上記のリンクをfirefoxでクリックしてみると、以下のダイアログが表示され検索プラグインがインストール可能となります


IEの場合は、以下のようなダイアログになります。




実際に振る舞いを確認したい場合は、以下のリンクをクリックしてください。

nanoappli.com 検索プラグインを追加



インストール後に確認してみると、使用可能となりました。




また、htmlのheadに以下のタグを追加しておくと、検索バーから検索エンジンの選択を行うときに「検索プラグインを追加」の選択肢が表示されるので便利です。

<link rel="search" 
      type="application/opensearchdescription+xml" 
      title="nanoappli.comサーチ" 
      href="http://nanoappli.com/nanoappli_blogsearch.xml">



[C#]dankogaiのAmazon APIを使用して、書籍情報を取得する

Dan Kogai氏が下記のページで公開しているamazonの書籍情報取得APIが有ります。
Ajax – AWS Caching Proxy w/ Authentication Support

これを利用して、C#にて指定したASINの書籍情報を取得するサンプルです。

//*********************************************************************
/// <summary> dan.co.jpのwebapiを使用してアマゾンの書籍情報を取得する
/// 
/// </summary>
/// <param name="asin">	検索キー(ASIN)</param>
/// <returns>書籍情報</returns>
//*********************************************************************-
private static XmlDocument searchItemInfoByAsin( string asin ) {
	string url = "http://api.dan.co.jp/asin/" + asin + ".xml";
	using (XmlReader reader = XmlReader.Create(url)) {
		XmlDocument doc = new XmlDocument();
		doc.Load( reader );
		return doc;
	}
}




上記メソッドの呼び元側は、以下のようになります。

//-----------------------
// 商品情報を取得する
//-----------------------
XmlDocument itemDoc = null;
try {
	itemDoc = searchItemInfoByAsin( "4534045220" );
} catch ( Exception ex ) {
	MessageBox.Show( "商品データの取得に失敗しました id[" + id + "]\n" + ex.Message );
	continue;
}
 
string asin     = getNodeTextDef( itemDoc, "/opt/ASIN",     "" );
string title    = getNodeTextDef( itemDoc, "/opt/ItemAttributes/Title",     "" );
string author   = getNodeTextDef( itemDoc, "/opt/ItemAttributes/Author",     "" );
string binding  = getNodeTextDef( itemDoc, "/opt/ItemAttributes/Binding",    "" );
string label    = getNodeTextDef( itemDoc, "/opt/ItemAttributes/Label",      "" );
string newPrice = getNodeTextDef( itemDoc, "/opt/ItemAttributes/ListPrice/FormattedPrice", "" );
string imageUrl = getNodeTextDef( itemDoc, "/opt/ImageSets/SwatchImage/URL", "" );
string linkUrl  = getNodeTextDef( itemDoc, "/opt/DetailPageURL", "" );
 
System.Console.WriteLine( asin     );
System.Console.WriteLine( title    );
System.Console.WriteLine( author   );
System.Console.WriteLine( binding  );
System.Console.WriteLine( label    );
System.Console.WriteLine( newPrice );
System.Console.WriteLine( imageUrl );
System.Console.WriteLine( linkUrl  );



サンプル中で使用しているgetNodeTextDef()については、このページを参照してください。

[C#]XmlDocumentから指定されたノードの情報をxpathで取得する

XmlDocumentから指定されたノードの情報(InnerText)をxpathで取得するメソッドです。

該当するノードが複数存在する場合は、最初のノードを取得します。
また、1つも存在しない場合は第三引数で指定された値を返します(これは,VCLのAnsiString::ToIntDefメソッド的な振る舞いです)。

//*********************************************************************
/// <summary> XmlDocumentから指定されたノードの情報を取得する
/// </summary>
/// <param name="doc">          取得対象のxml情報</param>
/// <param name="xpath">        取得するノードのxpath式</param>
/// <param name="defaultValue"> 指定したノードが無かったときの値</param>
/// <returns>ノードのテキスト(InnerXml)</returns>
//*********************************************************************
private static string getNodeTextDef( XmlDocument doc, string xpath, string defaultValue ) {
    XmlNode node = doc.SelectSingleNode( xpath );
    if ( node == null ) {
        return defaultValue;
    } else {
        return node.InnerText;
    }
}

[C#]指定されたURLの画像をImage型として取得する

.NetFrameworkに用意されているSystem.Drawing.Imageクラスは、FromFile()メソッドで画像データをファイルから読み込む事ができますが、Web上に存在する画像をURL指定で読み込ませる事はできません。


そこで、urlを指定してImage型データを取得するメソッドを作成しました。

//---------------------------------------------------------------------------
/// <summary>
/// 指定されたURLの画像をImage型オブジェクトとして取得する
/// </summary>
/// <param name="url">画像データのURL(ex: http://example.com/foo.jpg) </param>
/// <returns>         画像データ</returns>
//---------------------------------------------------------------------------
public static System.Drawing.Image loadImageFromURL( string url ) { 
    int buffSize = 65536; // 一度に読み込むサイズ
    MemoryStream imgStream = new MemoryStream();
 
    //------------------------
    // パラメータチェック
    //------------------------
    if ( url == null || url.Trim().Length <= 0 ) {
        return null;
    }
 
    //----------------------------
    // Webサーバに要求を投げる
    //----------------------------
    WebRequest req = WebRequest.Create( url );
    BinaryReader reader = new BinaryReader( req.GetResponse().GetResponseStream() );
 
    //--------------------------------------------------------
    // Webサーバからの応答データを取得し、imgStreamに保存する
    //--------------------------------------------------------
    while ( true ) {
        byte[] buff = new byte[ buffSize ];
 
        // 応答データの取得
        int readBytes = reader.Read( buff, 0, buffSize );
        if ( readBytes <= 0 ) {
            // 最後まで取得した->ループを抜ける
            break;
        }
 
        // バッファに追加
        imgStream.Write( buff, 0, readBytes );
    }
 
    return new Bitmap( imgStream );
}

[CrystalReports]データ長さに応じてフォントサイズを調整する


CrystalReportsを使用して帳票印刷を行う際、印字するテキストが長すぎてフィールドの枠内に入りきらない場合、印字が欠けてしまいます。
このような場合、Excelだったら「縮小して全体を表示」という書式設定をしておくと、印字内容のデータ長に合わせて自動でフォントサイズを縮小させる事ができるのですが、残念ながらCrystal Reportsには、これと同じ機能は有りません。


そこで、今回はCrystal Reportsで、印字するデータの長さに応じてフォントサイズを調整させる方法を説明します。

データ長に応じたフォントサイズを指定する

今回の例では、下記帳票レイアウト(.rptファイル)内にある、Nameフィールドのフォントサイズを調整してみます。
ちなみにこの項目はデータセットのRepAddressLabel.Nameフィールドにバインドされています。


Nameフィールドを右クリックし、オブジェクトの書式設定を選択します。



フォントタブの、サイズの横にある”x+2″と書かれた小さいボタンをクリックします。



式ワークショップウィンドウが表示されるので、以下の式を入力します。


If ( Length( {RepAddressLabel.Name} ) < 24 ) Then
    12
Else If ( Length( {RepAddressLabel.Name} ) < 28 ) Then
    10
Else
    9


これは、プログラム側でセットされたRepAddressLabel.Nameフィールドのデータ長が、24文字未満の場合は12ポイント、28文字未満の時は10ポイント、それ以上の場合は8ポイントにフォントサイズを変更させる事を意味します。(各ポイントで何文字分の印字が可能かは試行錯誤して求めます…)


この設定を行った後にプログラムを実行すると、確かに指定した文字数以上でフォントサイズが切り替わるようになりました。





2バイト文字を含む項目に対応する

ただ、ここで注意が必要なのはLength()関数は文字のbyte数ではなく、文字数を返す事です。
この為、上記例のように全角と半角が混在する場合、ちょうど良い位置でフォントサイズを切り替える事ができなくなってしまいます(半角しか表示されない項目の場合は、前述の方法で問題ないです)。

Crystal Reportsの式として用意されている関数にはバイト数を取得する方法がありません。
この為、本問題に対処するためにはプログラム側からデータのbyte数を隠し列として渡してあげる必要があります。

下記の例はC#側でデータセットに印字内容をセットする処理です。
Name_LenBというフィールドに,プログラム側でデータ長をセットしています。

    DataSet1.RepAddressLabelDataTable table = new DataSet1.RepAddressLabelDataTable();
    [中略]
 
    dataRow = (DataSet1.RepAddressLabelRow)table.NewRow();
    dataRow.Name          = ...;
    dataRow.Name_LenB     = Encoding.GetEncoding("Shift_JIS").GetByteCount( dataRow.Name );




その上で、該当フィールドの式ワークショップで、式を以下のように変更します。


If ( {RepAddressLabel.Name_LenB} < 24 ) Then
    12
Else If ( {RepAddressLabel.Name_LenB} < 28 ) Then
    10
Else
    9



これで、2バイト文字を含むデータでも、適切にフォントサイズを調整出来る様になります。

クロネコメール便をワンクリックで集荷依頼できるソフトを作ってみた



ヤマト運輸には厚さ2cm以内の商品を格安で配送する事ができるメール便というサービスがあります。
メール便の依頼はコンビニ受付が有名ですが、その他にも、ヤマト運輸のサイト上で集荷依頼を行い、家まで取りに来てもらう事もできるので便利です。

…ですが、ヤマト運輸のサイトより集荷依頼を行う場合、web上での操作が煩雑(5画面くらい作業する必要がある)で面倒くさいので、ブラウザを自動操作するプログラムを作成しました。


インストール

本ページ下部にあるダウンロードリンクにあるzipを適当な場所に展開するだけです。

また、本ソフトを使用するためには、.NetFramework3.0がインストールされている必要があります。



使い方

プログラムを起動すると、メインウィンドウが表示されます。


左上の”集荷依頼を行う”をクリックすると、集荷依頼内容の入力画面が表示されます。
※ユーザID,パスワードには、ヤマト運輸で登録したクロネコメンバーズのものを入力して下さい。





依頼内容を入力後OKボタンをクリックすると、自動で依頼画面が進んでいきます。
操作の状況は画面下のステータスエリアに表示されます。
最後の確定だけ手動で行いたい場合は、依頼画面で”確認ボタンを自動クリック”からチェックはずせば依頼の直前までを自動操作させる事もできます。





依頼する内容がいつも同じ場合、設定画面で指定しておく事ができます。
例えば常に本だけを発送する場合には、設定画面の品名に”書籍”と入れておけば毎回入力する必要はありません。




コマンドラインオプション


他のプログラムと連携させたい場合はコマンドラインオプションもあります。
コマンドラインオプションの設定値は、[ツール]->[設定]で指定した値より優先されます。

/UserId     ユーザID
    ユーザIDを指定します
 
/Password   パスワード
    パスワードを指定します
 
/SyukaDate  出荷日選択肢のindex
    出荷日の選択肢の位置を指定します。
    0を指定すると「選択してください」、1だと直近の日付になります。
 
/SyukaTime  出荷日選択肢のindex
    0を指定すると「選択してください」、1だと「指定なし」になります。
 
/ItemName   商品名
    商品名を指定します。 全角で指定してください。
 
/Suryo      数量
    数量を指定します。 数量は半角で1以上の数値です。
 
/IsSlipReady
    伝票用意済みにチェックが入ります。
 
/IsSlipNeed
    伝票を集荷の時に用意してほしいにチェックが入ります。
 
/AutoClickConfirm
    集荷受付画面で、次へボタンを自動クリックします。
 
/AutoClickSubmit
    依頼内容確認画面で、確定する場短を自動クリックします。
    ※ヤマト運輸へ集荷依頼が実際に行われるので、本機能は
    このプログラムの動作を十分に理解してから使用してください!!
 
/Silent 1
    プログラム起動と同時に「集荷依頼を行う」画面が表示されます
/Silent 2
    プログラム起動と同時に集荷依頼が行われます



オプション指定例

KuronekoRequest.exe /UserId user /Password pass /SyukaDate 1 /SyukaTime 1 /ItemName 書籍 /Suryo 10 /IsSlipNeed /Silent 1





ダウンロード


下記よりダウンロードする事ができます。
ver1.0.0.0: KuronekoRequest.zip

ノートPCのバッテリ残容量をバッチで取得する

VBScriptで以下のコマンドを実行する事で、ノートPCの残バッテリー容量を取得する事ができます。
データの取得にはwmiを使用しているのでC#など、他の言語への移植も簡単かと思います。

'---------------------------------------------------
' ノートPCのバッテリ算容量を取得する
' usage: cscript /Nologo バッテリ容量.vbs
'---------------------------------------------------
Set rows = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * from Win32_Battery",,48)
 
For Each row in rows
    Wscript.Echo "バッテリ容量: " & row.EstimatedChargeRemaining & "%"
    Wscript.Echo "残り使用時間: " & row.EstimatedRunTime & "分"
Next




上記プログラムを「バッテリ容量.vbs」という名前で保存した上で、以下のコマンドを実行します。

cscript.exe /Nologo バッテリ容量.vbs



ダウンロード:バッテリ容量.zip

ATmega328Pのfuse bits設定メモ

AVRのワンチップマイコンにはfuse bit(ヒューズビット)というものがあり、これによってチップの動作を設定することができます。fuse bitには各ビットごとに意味があり、その意味はチップの型番によって異なるので注意が必要です。



ATmega328Pチップの、各fuse bitの意味です。
(画像上部のNote:にも有りますが,チェックが入っていない時がON”=1″なので注意!!)
http://www.engbedded.com/fusecalc より




各fuse bitの初期値は以下の通りです。

Low : 0x62
High: 0xD9
Ext : 0xFF






avrdude.exeを使ってfuse bitを変更することができます。avrdude.exeは、ArduinoのIDEをダウンロードすると、zip内のhardware\tools\avr\binフォルダに入ってます。

avrdude.exe  -C ..\etc\avrdude.conf -c arduino  -p m328p -t -B 4800 -P COM7 hfuse:w:0b11011001:m -U lfuse:w:0b01100010:m


“-P COM7″のところは、COMポートを指定します。


各オプションの意味は、引数無しでexeを実行すると分かります。

Usage: avrdude [options]
Options:
  -p <partno>                Required. Specify AVR device.
  -b <baudrate>              Override RS-232 baud rate.
  -B <bitclock>              Specify JTAG/STK500v2 bit clock period (us).
  -C <config-file>           Specify location of configuration file.
  -c <programmer>            Specify programmer type.
  -D                         Disable auto erase for flash memory
  -i <delay>                 ISP Clock Delay [in microseconds]
  -P <port>                  Specify connection port.
  -F                         Override invalid signature check.
  -e                         Perform a chip erase.
  -O                         Perform RC oscillator calibration (see AVR053).
  -U <memtype>:r|w|v:<filename>[:format]
                             Memory operation specification.
                             Multiple -U options are allowed, each request
                             is performed in the order specified.
  -n                         Do not write anything to the device.
  -V                         Do not verify.
  -u                         Disable safemode, default when running from a script.
  -s                         Silent safemode operation, will not ask you if
                             fuses should be changed back.
  -t                         Enter terminal mode.
  -E <exitspec>[,<exitspec>] List programmer exit specifications.
  -y                         Count # erase cycles in EEPROM.
  -Y <number>                Initialize erase cycle # in EEPROM.
  -v                         Verbose output. -v -v for more.
  -q                         Quell progress output. -q -q for less.
  -?                         Display this usage.

[arduino]Yikes! Invalid device signature.エラーの意味



arduinoでAruduinoISPを使用してbootloaderを書き込み時に下記のエラーが出たので,その内容を調べたときのメモです。

Yikes! Invalid device signature.




arduino.ccのトラブルシューティングに、以下の情報あります。

Why do I get errors about an invalid device signature when trying to upload a sketch?
 
If you get an error like:
 
avrdude: Yikes!  Invalid device signature.
       Double check connections and try again, or use -F to override
       this check.
 
 
it can mean one of two things. Either you have the wrong board selected from 
the Tools > Board menu or you're not using the right version of avrdude. 
Arduino uses a slightly modified version of avrdude to upload sketches to 
the Arduino board. 
 
The standard version queries for the board's device signature in a way not 
understood by the bootloader, resulting in this error. Make sure you're using 
the version of avrdude that comes with Arduino.


http://arduino.cc/en/Guide/troubleshooting より



大体以下のような感じの意味です。

Tools > Boardのメニューで正しいボードが選択されていないか、avrdudeのバージョンが間違っているときに発生します。avrdudeですが、Arduinoはスケッチをアップロードするのに、ちょっと改造されているバージョンのものを使用してます。
標準版(未改造版)のavrdudeだと、Aruduinoのブートローだ載ったチップのdevice signatureを正しく認識してくれないので、このエラーが出た時は、Arduino用のavrdudeを使っているか確認するとよいです。



Arduino用avrdudeのソースはこちら。
http://svn.berlios.de/wsvn/arduino/avrdude-5.4-arduino/#_avrdude-5.4-arduino_


バイナリは、下記ページでダウンロードできる開発環境zipを展開すると、中に入ってます。
http://arduino.cc/en/Main/Software

[C#,WebBrowser]ラジオボタンの選択肢から,指定した要素をC#でチェックさせる

WebBrowserコントロールに表示されたラジオボタンに対して、特定の項目を選択する方法です。


サンプルとして、以下のようなhtmlがあった場合に…

<input type="radio" value="1" id="selId1">選択肢1</input>
<input type="radio" value="2" id="selId2">選択肢2</input>
<input type="radio" value="3" id="selId3">選択肢3</input>



C#のコードから2つ目の要素にチェックを入れには、以下のように行います。

// 2番目の選択肢にチェックを入れる
HTMLInputElementClass selectBoxObj;
selectBoxObj = document.GetElementById( "selId2" ).DomElement as HTMLInputElementClass;
selectBoxObj.setAttribute( "checked", "checked" );



ちなみに、HTMLInputElementClassを使用する為には,MSHTMLの参照設定を行った上で,ソースの頭に”using mshtml;”を行っておく必要があります

[C#]WebBrowserコントロールで指定した位置に画面をスクロールさせる

下記のコードで、上から200pxの位置が画面の一番上になるようにスクロールされます。
横位置をずらしたい場合はPointの第一引数に値を指定します。

webBrowser1.Document.Window.ScrollTo( new Point(0,200) );

[C#]Form_Load()イベントで、フォーカスをセットする方法

WinFormsを使用したプログラムで、指定したコントロールにフォーカスをセットするには、
通常ではSetFocus()メソッドを使用します。

button1.SetFocus();



ですが、FormのLoadイベントでこの方法を使用しても、セットする事ができません。

これは、.NetFrameworkのイベントループ側で以下の処理を行っているためです。

1.親画面からForm.Show()メソッド(又はShowDialog)をコールする
↓
2.子画面のOnLoad()イベントが指定されていたら、実行する
↓
3.子画面に配置されているコントロールのTabStopをチェックし、初期フォーカスをセットする
↓
4.子画面が開く



このため、上記の2.でフォーカスをセットしても後続の処理でリセットされてしまい、
思ったように動作しません。

これを防ぐには、SetFocusではなく、以下のようにActiveControlに値をセットしてあげればOKです。

private void Form1_Load(object sender, System.EventArgs e) {
  // 初期フォーカスをセット
  ActiveControl = button1;
}


[VS2010]デバッグ時に.Net Frameworkのソースコードへステップインさせ、アセンブラのコードを表示させる

VisualStudioでWinFormを使用したプログラムを作成する場合、Form_Load()処理などのイベントハンドラを作成しハンドラ内に処理を記述していきます。
この際、Form_Load()の呼び出し元側は、.Net Frameworkのイベントループ処理となるのですが、この処理は呼び出し履歴ウィンドウで確認しても”外部コード”と表示されているだけで、どんなメソッドが呼び出されているか分かりません。




今回は、デバッグ時に”外部コード”の中身を表示させ、呼び元側にジャンプできるようにする方法を説明します。
これには、ステップインができるように、VisualStudio設定を変更させる必要があります。

.NET Frameworkソースへのステップイン設定


VisualStudioのツール->オプションを選択します。


左のメニューよりデバッグを選択し、「.NET Framework ソースのステッピングを有効にする」にチェックを入れます。


ダイアログが表示されるのでOKをクリックします。



オプションダイアログを閉じると、pdbファイルのダウンロードが行われます。
完了するまでしばらく時間が掛かります。



上記の設定を行い、フォームのLoadイベントハンドラでブレークさせてみます。



すると、呼び出し履歴のウィンドウにWinwods.Forms.FromのOnLoad()情報が表示されるようになります。


これをダブルクリックすると、新しいウィンドウが表示されます。


逆アセンブルの表示のリンクをクリックすると、コンパイル後のアセンブラが表示されます。



デバッグシンボル(pdb)ファイルをダウンロードし、キャッシュさせる

上記の設定に加え、次の作業を行っておくと.NET Frameworkライブラリ自体のpdbファイルをmicrosoftのサーバよりダウンロードし、キャッシュさせておく事が可能です。

先ほど確認した呼び出し履歴のウィンドウを右クリックし、シンボルの設定を選択します。


デバッグ->シンボルより、右側のMicrosoftシンボルサーバにチェックを入れます。
また、Windows.Forms.Formパッケージのpdbも欲しい場合は、下にある”除外されるモジュールの指定”リンクをクリックし、チェックをはずしておきます。


警告ダイアログが表示されるのでOKをクリックします。
この警告どおり、初回の実行時はpdbファイルをマイクロソフトのサーバからダウンロードするため、処理が遅くなってしまいます。(2回目以降はキャッシュが効くので問題ないです)



なお、VisualStudioの設定変更などを行いたくなく、ただソースが見たいだけの場合は下記のサイトより


なお、ネットに繋げない環境で利用したい場合は、下記のサイトより予めダウンロードしておく事も可能なようです。
http://referencesource.microsoft.com/netframework.aspx



また、このライセンスですが、以下のようになっています。

---------------
Overview
---------------
The Microsoft Reference Source License (MS-RSL) is the most restrictive of the Microsoft 
source code licenses. The license prohibits all use of source code other than the viewing 
of the code for reference purposes. The intent of this license is to enable licensors to 
release, for review purposes only, more sensitive intellectual property assets.
 
Microsoft commonly uses this license for developer libraries where modification is not 
required to make use of the source code. In these cases, the importance of transparency 
is based on the need for developers to more deeply understand the inner workings of the 
source code. In doing so, the licensees will be more effective in writing software that 
makes use of the licensed source code.
 
The copyright and patent grants in this license are both royalty free, meaning that the 
licensee does not have to pay anything to the licensor to make use of the source code. 
The license limits the source code release to use on the Windows platform only. 
Microsoft cannot provide legal advice on the use or implications of this license. 
We recommend that developers obtain appropriate legal advice before deciding
how to license their source code.
 
The source code for the .NET Framework libraries are released under a modified 
Microsoft Reference Source License.
 
---------------
Terms of Use
---------------
Developers who wish to access source code under the Reference Source Program must 
agree to the license that accompanies the code.
Licensees may use the source code to assist with the development of commercially distributed products.
Licensees may not modify or redistribute the source code.
 
 
-------------------------
Eligibility Requirements
-------------------------
There are no eligibility requirements for this program. Everyone who agrees to the 
accompanying license may use the source code provided under the Reference Source Program.


http://referencesource.microsoft.com/referencesourcelicensing.aspx より