Object Browserを、64bit環境でOracleInstantClientを使用してUSB起動させる。


Oracleを使用したアプリを開発する上で、あると非常に便利なObjectBrowserですが、64ビット環境にインストールするとそのままでは実行できません。

これは、開発元サイトでも以下のように記載されています。

Q:64ビット版OSでも使用できますか?
 
A:大変申し訳ございませんが、現状では64ビット版OSにつきましては正式対応しておりません。
 
ただし、Object BrowserをインストールしたOSが64ビット版である場合である場合におきましても、
以下の方法でご利用可能であることを確認しております。
①インストールされたOracleクライアントが32ビット版をインストールする
②Object Browserを「C:\Program Files (x86)」など、括弧のついたフォルダ以外にインストールする
 
現在ところ上記方法で問題なく動作することを確認しておりますが、
正式動作保証外のため、今後64ビット版固有の不具合が発見されましても対応はできかねますので
あらかじめご了承の上、ご利用ください。


http://www.sint.co.jp/products/siob/ob/faq/faq.html より


というわけで、サポート外となりますが、具体的には以下の手順で起動させる事ができました。
しばらく使ってみましたが問題なく利用できています。


1:ObjectBrowserのインストール先に、OracleInstantClientをコピーする。
ここでコピーするのはx64ではなく、x86版の方です。


2:下記バッチを作成し、バッチファイルからプログラムを起動させる。

set NLS_LANG=JAPANESE_JAPAN.JA16SJIS
set PATH=OracleInstantClient_32bit;%PATH%
start ob9.exe




また、この構成の場合ではtnsnames.oraが存在しないため、データベースの接続先は”localhost:1521/orcl”といった形で指定を行います。


ちなみに、上記フォルダ構成をとっておくとUSBメモリから起動させる事も可能です。
但し、クライアントライセンスで契約している場合は、複数台で使用するとライセンス違反にならなよう、注意が必要です(インストールするマシンの台数分,クライアントライセンスが必要です)。
SI Object BrowserではじめるDBシステム構築入門

[Java]マルチスレッドでの、子スレッド終了待ち処理サンプル


基礎からわかるTCP/IP Javaネットワークプログラミング


package com.nanoappli.test
 
// マルチスレッド処理サンプル
public class MultiThreadSample {
    public static void main( String args[] ) {
        TestClass inClass = ( new MultiThreadSample() ).getTestClass();
 
        /*------------------------*/
        /* 子スレッドの実行を行う */
        /*------------------------*/
        System.out.println( "test1" );
        Thread childThread = new Thread( inClass );
        childThread.start();
        System.out.println( "test2" );
 
 
        /*------------------------*/
        /* 親スレッドの仕事を行う */
        /*------------------------*/
        System.out.println( "main : start" );
        try {
            for ( int loop = 0; loop < 3; loop++ ) {
                System.out.println( "parent:" + String.valueOf( loop ) );
                java.lang.Thread.sleep( 1000 );
            }
        } catch ( InterruptedException ex ) {
            ex.printStackTrace();
        }
 
 
        /*----------------------------*/
        /* 子スレッドが終わるまで待つ */
        /*----------------------------*/
        try {
            synchronized ( childThread ) {
                childThread.wait();
            }
        } catch ( InterruptedException ex ) {
            ex.printStackTrace();
        }
 
        /* PG終了 */
        System.out.println( "main : end" );
    }
 
 
    //-------------------------------------------------------------------
    // インナークラスの取得メソッド
    //-------------------------------------------------------------------
    TestClass getTestClass() {
        return new TestClass();
    }
 
 
    //-------------------------------------------------------------------
    // 別スレッドで起動する内部クラス
    //-------------------------------------------------------------------
    class TestClass implements Runnable
    {
 
        // 子スレッド処理(Thread.start()からコールされる)
        public void run() {
            try {
                for ( int loop = 0; loop < 5; loop++ ) {
                    System.out.println( "child:" + String.valueOf( loop ) );
                    java.lang.Thread.sleep( 1000 );
                }
                System.out.println( "child:end" );
            } catch ( InterruptedException ex ) {
                ex.printStackTrace();
            }
 
            // 自分待ちになっているオブジェクトがいたら起こしてあげる
            synchronized ( this ) {
                this.notifyAll();
            }
        }
    }
}



TCP/IPソケットプログラミング Java編

[Java]ソケットからデータを受信(その2:タイムアウト処理付き)

Javaでソケットからのデータ受信、その2です。

前回とほぼ同じ処理ですが、クライアントからの接続、および接続後のデータ受信でタイムアウト処理を設けて有ります。接続待ちでは3秒、データ受信は2秒以内にクライアントからの操作が行われないと、タイムアウトが発生したとみなしています。
基礎からわかるTCP/IP Javaネットワークプログラミング


package com.nanoappli.test;
 
import java.io.*;
import java.net.*;
import java.util.Arrays;
 
public class HelloWorld2
{
    public static void main( String args[] ) {
        int READ_BUFF_LEN = 2000;
        System.out.println( "start" );
        try {
            byte []readBuff = new byte[ READ_BUFF_LEN ];
            ServerSocket socket = new ServerSocket( 4949, 1, InetAddress.getByName( "192.168.1.1" ) );
 
            /*----------------------------------*/
            /* クライアントからの接続待ちに入る */
            /*----------------------------------*/
            while( true ) {
                Socket clientSocket;
                System.out.println( "接続待ち:" + socket.toString() );
                socket.setSoTimeout( 3000 );
                try {
                    System.out.print( "wait" );
                    clientSocket = socket.accept();
                } catch( SocketTimeoutException ex ) {
                    System.out.println( "-> 接続タイムアウトが発生しました. " );
                    continue;
                }
 
                System.out.println( "接続しました:" );
 
 
                /*----------------------------------*/
                /* データの受信を行う               */
                /*----------------------------------*/
                clientSocket.setSoTimeout( 2000 );
                InputStream inStream = clientSocket.getInputStream();
                int inputLen;
                int readPos = 0;
                while ( readPos < 10 ) {
                    System.out.print( "wait2" );
                    try {
                        inputLen = inStream.read( readBuff, readPos, READ_BUFF_LEN-readPos );
                    } catch( SocketTimeoutException ex ) {
                        System.out.println( "-> 受信タイムアウトが発生しました " );
                        continue;
                    }
                    System.out.println( "read:" + String.valueOf( inputLen ) );
                    readPos += inputLen;
                }
 
 
 
                /*--------------------------*/
                /* 受信したデータを表示する */
                /*--------------------------*/
                byte []readBuff2 = Arrays.copyOfRange( readBuff, 0, readPos );
                System.out.println( "データを受信しました:" + new String( readBuff2, "Windows-31J" ) );
 
 
                /*------------------------*/
                /* ソケットをクローズする */
                /*------------------------*/
                clientSocket.close();
 
            }
 
        } catch( Exception ex ) {
            ex.printStackTrace();
        }
        System.out.println( "end" );
    }
}



TCP/IPソケットプログラミング Java編

[Java]ソケットからデータを受信する

Javaでソケットからデータを受信するサンプルです。

プログラムを起動すると、ポート4949で待ち受けを行います。

クライアントから接続後、データを10byte受信すると、受信データを画面表示します。
また、受信データはsjis(厳密にはcp932)が来る事を想定しています。

package com.nanoappli.test;
 
import java.io.*;
import java.net.*;
import java.util.Arrays;
 
public class HelloWorld
{
    public static void main( String args[] ) {
        int READ_BUFF_LEN = 2000;
        System.out.println( "start" );
        try {
            byte []readBuff = new byte[ READ_BUFF_LEN ];
            ServerSocket socket = new ServerSocket( 4949, 1, InetAddress.getByName( "192.168.1.1" ) );
 
 
            while( true ) {
                /*----------------------------------*/
                /* クライアントからの接続待ちに入る */
                /*----------------------------------*/
                System.out.println( "接続待ち:" + socket.toString() );
                Socket clientSocket = socket.accept();
                System.out.println( "接続しました:" );
 
 
                /*--------------------------------------------*/
                /* データの受信を行う(10byte受信するまで待つ) */
                /*--------------------------------------------*/
                InputStream inStream = clientSocket.getInputStream();
                int readPos = 0;
                while ( readPos < 10 ) {
                    int inputLen = inStream.read( readBuff, readPos, READ_BUFF_LEN-readPos );
                    readPos += inputLen;
                }
 
                /*----------------------------*/
                /* 受信したデータを表示する   */
                /* 文字コードははSJISとみなす */
                /*----------------------------*/
                byte []readBuff2 = Arrays.copyOfRange( readBuff, 0, readPos );
                System.out.println( "データを受信しました:" + new String( readBuff2, "Windows-31J" ) );
 
                /*------------------------*/
                /* ソケットをクローズする */
                /*------------------------*/
                clientSocket.close();
            }
 
        } catch( Exception ex ) {
            ex.printStackTrace();
        }
 
        System.out.println( "end" );
    }
}



上記処理にタイムアウト処理をつけたバージョンは、こちら

[C#]WebBrowserで,指定されたalt属性を持つタグを自動クリックする

WebBrowserコントロールを使用して特定のページを表示した後に、特定の画像をクリックした事にするコードです。
サイトによっては、imgタグを使用して、画像をボタン代わりに使っているので、そのような場合に便利です。

private bool clickTagByAltStartsWith( string tagName, string keyString ) {
    HtmlElementCollection tagList;
    IHTMLElement targetTag = null;  // 検索対象のタグ(Microsoft HTML Object Libraryの参照設定が必要)
 
    tagList = browser.Document.GetElementsByTagName( tagName );
    foreach( HtmlElement tag in tagList ) {
        IHTMLElement tagDomEle = tag.DomElement as IHTMLElement;
        object altText = tagDomEle.getAttribute( "alt" );
        if ( tagDomEle == null || altText == null || !altText.ToString().StartsWith( keyString ) ) {
            continue;
        }
 
        // 見つけたタグをセットして、探索終了
        targetTag = tagDomEle;
        break;
    }
    if ( targetTag == null ) {
        // 条件に一致するタグが無かった...
        return false;
    }
 
    //--------------------------------
    // 見つけたタグをクリックする
    //--------------------------------
    targetTag.click();
    waitForResponse();
 
    return true;
}






呼び出し元は、以下のような感じになります。

private void button1_Click( object sender, EventArgs e ) {
    bool isSuccess = clickTagByAltStartsWith( "img", "検索" );
    if ( !isSuccess ) {
        MessageBox.Show( "対象の画像が存在しませんでした。" );
        return;
    }
 
    MessageBox.Show( "検索をクリックしました" );
}



上記の処理を使用するための注意事項として、プロジェクトの参照設定で「Microsoft HTML Object Library」を設定する必要があります。


また、メソッド中のgetAttribute()の引数で”alt”属性を決め打ちしていますが、これも引数にすればさらに汎用性が高まりますね。

チャージコントローラMPPT10シリーズ(MPPT30,MPPT60,WS-MPPT30,SE-MPPT30 etc…)の機能説明

ソーラー発電で使用するチャージコントローラのMPPT10シリーズについての情報です。

この製品ですが、ネット上に仕様についての情報が見当たらないので、小売店にから入手した情報を置いときます(正式な仕様が知りたい場合は必ず販売元へ直接問合せを行ってください)。

MPPTxxシリーズの型番は末尾の数字が最大容量(アンペア数)をあらわします。

この製品群はOEM販売されているようで、発売元によってMPPT30,WS-MPPT30,SE-MPPT30等の型番が存在します。以下の画像を見ると分かるように、左上のロゴが異なっているだけで見た目は同じです。

WELLSEE


instapark


ECOLIFE





主な機能

MPPT(Maximum Power Point Tracking)コントロールを行って充電を行うため、(非MPPT製品比で)10~30%程度、充電効率が向上します。
充電と給電を同時に行えます。
充電、電流管理、電力供給の仕様はSOC規格を満たしています。

Function:


常にバッテリのfull voltage conditionを保持する
過充電の防止
過放電の防止
夜間にソーラーパネルへの逆流を防止
バッテリーの逆極性の防止
ソーラーパネルの逆極性の防止
バッテリー電圧低下時に自動で給電をカットし、電圧復帰時には再供給を自動で行う
サージプロテクト
気温変化に伴う電圧変化を自動で補正(?)



大きさ・重さ

193x110x48mm
740g

接続方法

コントローラーには6つの端子があります。
本体向かって下に端子がある状態で左から、ソーラーパネルプラス極,ソーラーパネルマイナス,バッテリープラス,バッテリーマイナス,給電先プラス,給電先マイナスの順です。

ソーラーパネルの接続を行う前にバッテリーを接続します。バッテリー無しで、ソーラーパネルから負荷へ直接給電させないで下さい。

室内の電灯による給電はできません(電灯の明かりではチャージするには弱すぎる為)。

ソーラーパネルの端子にDC電源を接続すると、コントローラのトラブルの原因となります。


インジゲータとボタン

赤のLED(charge)が点灯していると、バッテリーは直充電されています。
赤のLED(charge)が点滅していると、バッテリーはMPPT機能によって充電されています。
赤のLED(charge)が消灯していると、バッテリーは充電されていません。

緑のLED(load)が点灯していると、負荷への給電が行われています。
緑のLED(load)が消灯していると、負荷への給電が行われていません。

3色LED(battery)が赤の時はバッテリーの容量が残り少なく、緑だと満充電です。橙は通常の状態です。
※12V稼動の機器の場合、赤:10.5~11V、橙:11~13.7V、緑:13.7以上です。


トラブルシューティング


問題:
    緑LEDが消灯、バッテリLEDが赤になっている
原因:
    バッテリーの電圧が低いです
対処:
    1:電源の供給をやめ、負荷側の端子をはずした後、再接続します。
    2:バッテリー充電の問題です。ソーラーパネルをアップグレードするか,バッテリーを交換します。



問題:
    バッテリLEDが橙で、LOADのLEDが緑なのに、負荷側に電源が供給されない
原因:
    過負荷か回路がショートしている為、コントローラの内部ヒューズが切れました
対処:
    問題が解消された後10~20分待つと自動でヒューズは戻り、給電が再開されます。



発電量・使用量の確認
機械単体で発電量・使用量を確認することはできず、確認用のオプション機器やPC接続によるログ吸出しもできません。
発電量・使用量を確認したい場合は、別途回路を自作する必要があります。


この商品は、ネットでも以下のショップより購入可能です。




2011/05追記:実際に購入してみました

ソーラー発電システムの自作 その3(チャージコントローラ)

だれでもできるベランダ太陽光発電

[Crystal Reports]印刷時の余白(マージン)を変更させる

Crystal Reportsで、印刷時に用紙の余白(マージン)を設定する方法です。

int marginLeft = 10; // 左マージンを10mmでセット
 
CrystalDecisions.Shared.PageMargins margin = cryReport.PrintOptions.PageMargins;
margin.leftMargin   = mmToTwip( marginLeft ); // mmの指定をtwip単位に変換する
margin.topMargin    = 0;
margin.bottomMargin = 0;
margin.rightMargin  = 0;
cryReport.PrintOptions.ApplyPageMargins( margin );



一旦PrintOptions.PageMarginsで現在の余白情報を取得し、値のセットをした上でApplyPageMargins()で再指定を行います。最後のApplyPageMargins()は忘れがちなので、注意してください。

また、ここで指定する値の単位はtwipなので、画面等からmm単位でマージンを指定される場合は単位の変換が必要です。
mmとtwipの相互変換を行う関数

[CrystalReports]プリンタのキューに、指定した帳票タイトルを表示させる

Crystal Reportsを使用して帳票印刷時、プリンタのキューに表示されるドキュメント名(タイトル)を指定する方法です。


VS2010に付属のCrystal Reportsでは、SummaryInfoプロパティが持っているReportTitleに値をセットすれば設定可能です。

// 帳票のタイトルをセット
cryReport.SummaryInfo.ReportTitle = "ピッキングリスト";
 
// プリンタに印刷
cryReport.PrintToPrinter( 0, false, 0, 0 );



実際に印刷してみたときのキュー表示は以下の通りです。


ドキュメント名の頭に”Crystal Reports – “の接頭語は必ずついてしまう様です。
これを削除する方法は分かりませんでした…



ちなみに、VS2005,VS2008付属のCrystal Reportsは、異なる設定方法だそうです。
手元に環境が無いので、動作の確認はしていません

VB.Netのサンプル

Dim crReportDocument        As New ReportDocument
Dim boReportClientDocument  As ISCDReportClientDocument
Dim boPrintOutputController As PrintOutputController
Dim boPrintReportOptions    As New PrintReportOptions
 
' load the report
 
boReportClientDocument  = crReportDocument.ReportClientDocument
boPrintOutputController = boReportClientDocument.PrintOutputController
 
' set print job title
boPrintReportOptions.JobTitle = "ピッキングリスト"
 
' print the report
boPrintOutputController.PrintReport(boPrintReportOptions)





参考資料:
Print job name issue SCN
SAP Note 1386475 – How to set printer name and print job title at runtime using Report Application Server SDK for Visual Studio .NET

Visual C#2008逆引き大全至高の技 データベース+印刷/帳票編
4798024961

jQuery sparklineの簡単なサンプル4つ

jQueryのプラグインである”jQuery sparkline”を使用すると、webページ内に小さなグラフを埋め込む事ができます。


基本形


<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="http://omnipotent.net/jquery.sparkline/1.6/jquery.sparkline.min.js"></script>
 
<script type="text/javascript">
$(function() {  $('.test1a').sparkline(); });
</script>
test1:<span class="test1a">1,2,3,2,5,2,3,2,1</span>



test1:1,2,3,2,5,2,3,2,1



値はコメント内でもOK


test2:<span class="test2"><!-- 1,2,3,2,5,2,3,2,1 --></span>



test2:1,2,3,2,5,2,3,2,1



プログラムから動的に値をセット


<script type="text/javascript">
var data = [3,1,4,1,5,9,2,6,5];
$('.test3').sparkline( data );
</script>
test3:<span class="test3"></span>



test3:



棒グラフもOK


<script type="text/javascript">
/* ピンクの棒グラフ */
$('.test4').sparkline('html', {type: 'bar', barColor: '#ff9999'} );
</script>
<span class="test4">1,2,3,2,5,2,3,2,1</span>



test4:1,2,3,2,5,2,3,2,1



**参考資料**
sparklineの仕様:jQuery Sparklines
Beautiful Visualizationに寄稿されたsparklineの情報:Sparklineによるアクセス履歴視覚化

自作向け、個人で購入可能なソーラーパネル一覧

ソーラー発電システムの自作に興味があったので、自作向けにソーラーパネル単体で販売しているもので、個人が購入可能なものを調べてみました。

個人での自作だと、12V給電でシステムを組むむ事が多いと思うので、12Vバッテリ向けのパネルのみ(パネル電圧が15~18Vぐらい)がチェック対象です。また、発電容量が異なると価格が大きく変わるので、今回は全て100Wで統一しました。
価格は2012年4月現在の金額です。

2011/05追記:実際に購入しました -> ソーラー発電の自作用に,パネルを購入しました





商品番号    au017
価格        15,372円 (税込) 送料別 
 
■商品詳細
タイプ:単結晶
1枚最大出力:100W
最大出力動作電圧:18V
最大出力動作電流:5.56A
開放電圧:22.36V
短絡電流:6.02A
サイズ:1210*540*35mm
最大のシステム電圧:1000V
1枚重量:10.5KG
枠:アルミ


たぶんこれが最安値っぽい。
形もベーシックな横長タイプ。





単結晶ソーラーパネル100W人気のサイズ(85x85cm)

単結晶ソーラーパネル100W人気のサイズ(85x85cm)
価格:15,900円(税込、送料込)


単結晶ソーラーパネル100W 人気のサイズ(85x85cm) 
商品番号    TAI100
価格        15,900円 (税込) 送料込
 
 
●種類:単結晶
●最大出力100W
●開放電圧15.84V
●短絡電流9.23A
●最大出力動作電流7.69A
●重量8.95kg
●サイズ 85X85X3.5cm
●ソーラーセルのサイズ156X156mm


購入者のコメントを見ると、晴れの日で実質50W程度の出力らしい。
当然ながら理論値そのままの出力は期待していないけど、実測値が分かっているのは良い。

サイズが横長じゃないのも、設置場所によってはプラスポイントになる。
あと、1個目と比べて重量が1kgくらい軽い。





商品番号    dls100
特別価格    19,800円 (税込) 送料込 
 
只今、5年間の長期保障をお付けして、
送料も弊社負担でお届けします。
 
日本語の配線・取り付けマニュアルも無料で同梱させて頂きます。
初めて自家発電にチャレンジする方も安心です。
 
■仕様■
・商品名:単結晶ソーラーパネル 100W
・ブランド名:SN Solar Technology Co., Ltd.
・最大出力:100W
・動作電圧:18V
・動作電流:5.5A
・開放電圧:22V
・短絡電流:5.8A
・フレーム:アルミ合金
・サイズ :1210×540×35mm
・重量  :8Kg


前二つに比べるとちょっと高いけど、初心者にとってマニュアル付きなのは心強い。





商品番号    dls100set
特別価格    21,900円 (税込) 送料込 
 
 
送料無料でチャージコントローラー付き。5年間の長期保障もお付けしています。
 
日本語の配線・取り付けマニュアルも無料で同梱させて頂きます。
初めて自家発電にチャレンジする方も安心です。
 
 
■ソーラーパネル仕様■
・商品名:単結晶ソーラーパネル 100W
・ブランド名:SN Solar Technology Co., Ltd.
・最大出力:100W
・動作電圧:18V
・動作電流:5.5A
・開放電圧:22V
・短絡電流:5.8A
・フレーム:アルミ合金
・サイズ :1210×540×35mm
・重量  :8Kg
 
 
■チャージコントローラー仕様■
・定格:12A
・サイズ:120×100×60mm
・重さ:200g
・12Vは144Wまで対応可能
 24Vは288Wまで対応可能



さっきの商品に、チャージコントローラーが付いたもの。
100Wだけで実験する場合は、コントローラが2000円で手に入るので、お値打ちです。
ただ、将来300W以上に拡張する予定がある場合は、コントローラーの買いなおしになるので、無駄になるかもしれない。





商品番号    STSP-100
価格        15,000円 (税込 15,750 円) 送料別
送料        2,500円
 
◇商品詳細◇
 【商 品 名】 単結晶ソーラーパネル18V100W
 【品  番】 STSP-1002
 【原 産 国】 ドイツQ-CELLS SE社製単結晶シリコン
 【加 工 国】 中国
 【結晶種類】 単結晶
 【最大出力】 100.38W
 【開放電圧】 21.689V
 【短絡電流】 6.342A
 【最大出力動作電圧】 17.756V
 【最大出力動作電流】 5.56A
 【サ イ ズ】 1016*670*30mm
 【重  量】 8KG
 【備  考】 4角形ウェハー、接続ケーブル付
 
○太陽光発電の本場ドイツ社製シリコン使用!
○さらに4角形ウェハで無駄が少なく効率UP!!
○接続ケーブルも付属しているのでお手軽!
○ご家庭の手助けにどうでしょうか!?
○重量約8Kgで移動も楽々!



15,000円だけど、送料別なので実質17500円です。
経営破たんしたQ-CELLS社のモノなので、拡張したいときに同一品が手に入るかが疑問。
トラブルがあったときに、サポートもどうなるか不安…





【送料無料】【ランキング1位・ソーラーパネル】驚安宣言!単結晶ソーラーパネル100W・ニューショップ
http://item.rakuten.co.jp/auc-eitaijapan/solar-100w-0e/
商品番号    solar-100w-0e
価格        20,580円(税込、送料込)
 
品番 ET-MA100A
セル種類 単結晶
モジュール変換効率 17%
公称最大出力 100W
公称最大出力動作電圧 18.5V
公称最大出力動作電流 5.4A
外形寸法 1210*540*35mm
質量 8.2kg
輸入元 盈泰ジャパン株式会社 
 
 
省エネ生活応援!!オープン記念~最安値挑戦!
翌日発送可!
11月23日まで123枚完売御礼!
40枚追加販売致しました



価格はちょっと高め。
大量に売っているっぽいので、同一仕様のパネルを追加購入する予定がある場合はよいかもしれません。





主だったものは、こんな感じでした。
色々見てみましたが、やっぱり1つ目に紹介した、単結晶18Vソーラーパネル(太陽電池)100Wがベターな感じです。

ソーラー発電の自作用に,パネルを購入しました
チャージコントローラMPPT10シリーズの機能説明

だれでもできるベランダ太陽光発電

[C#]Form.AcceptButtonを指定すると、複数行TextBoxで改行できない。

Form.AcceptButtonで、OK時のボタンを指定すると、MultiLine=trueに設定されている複数行のTextBoxでEnterキーを入力しても改行することができません。
これは、TextBoxの改行処理が入る前に、Form側でキー入力が横取りされてしまうためです。

この問題を回避するには、TextBox.AcceptsReturnをtrueにします。
また、余談ですがAcceptsTab=trueにしておくとTAB文字を入力する事ができます。

C#で、住所から緯度・経度を検索する(geocoding.jp利用)


住所から簡単に緯度・経度を検索してくれるWebAPIを、geocoding.jpが提供してくれているらしいので、これを利用したWindowsのアプリを作成してみました。

プログラムは、本記事の最後にあるDownloadから取得可能です。




データ取得の処理

まずは、画面構成です。
検索するだけなので、検索キーワード、検索ボタンと結果の3つだけがあるシンプルな構成です。


プログラムは、検索ボタンクリック時のハンドラだけです。
APIがシンプルなので、処理も簡単に記述する事ができます。

//*********************************************************************
/// <summary> 検索ボタンクリック時のハンドラ
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
//*********************************************************************
private void button1_Click( object sender, EventArgs e ) {
 
    //----------------------------------------------------
    // 検索クエリを組み立てる
    // (HttpUtilityの使用には,System.Webの参照設定が必要)
    //----------------------------------------------------
    String queryStr = HttpUtility.UrlEncode( txtQuery.Text );
    String url      = "http://www.geocoding.jp/api/?v=1.1&q=" + queryStr;
 
 
    //---------------------------
    // サーバーにクエリを投げる
    //---------------------------
    WebResponse response = null;
    try {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.Method = "GET";
        request.UserAgent   = "GeoLookup/1.0 (Language=CS)";
        request.ContentType = "text/xml";
        response = request.GetResponse();
    } catch( WebException  ex ) {
        response = ex.Response;
    }
 
    //---------------------------------
    // 応答をxmlドキュメントとして取得
    //---------------------------------
    XmlDocument doc;
    doc = new XmlDocument();
    doc.Load(response.GetResponseStream());
 
    //エラーチェック
    if ( doc.SelectNodes( "/result/error" ).Count > 0 ) {
        txtResult.Text = "検索エラー :" + doc.SelectNodes( "/result/error" ).Item(0).InnerText;
        return;
    }
 
    //--------------------------------
    // 取得した応答データを解析する
    //--------------------------------
    string lat             = selectTextToDef( doc, "/result/coordinate/lat", "" );
    string lng             = selectTextToDef( doc, "/result/coordinate/lng", "" );
    string lat_dms         = selectTextToDef( doc, "/result/coordinate/lat_dms", "" );
    string lng_dms         = selectTextToDef( doc, "/result/coordinate/lng_dms", "" );
    string needs_to_verify = selectTextToDef( doc, "/result/needs_to_verify", "" );
    string google_maps     = selectTextToDef( doc, "/result/google_maps", "" );
 
    //--------------------------------
    // 解析した結果を出力する
    //--------------------------------
    txtResult.Text  = "緯度     : " + lat +  Environment.NewLine;
    txtResult.Text += "経度     : " + lng +  Environment.NewLine;
    txtResult.Text += "緯度(dms): " + lat_dms +  Environment.NewLine;
    txtResult.Text += "経度(dms): " + lng_dms +  Environment.NewLine;
    txtResult.Text += "住所     : "       + google_maps     +  Environment.NewLine;
    txtResult.Text += "needs_to_verify: " + needs_to_verify +  Environment.NewLine;
}
 
//*********************************************************************
/// <summary> XMLドキュメントから指定されたノードの値を返す
///           指定されたノードが存在しない場合は,defaultValueを返す
/// </summary>
/// <param name="doc">          検索元xmlドキュメント  </param>
/// <param name="query">        検索を行うノード(xpath)</param>
/// <param name="defaultValue"> ノードが存在しない場合のデフォルト値</param>
/// <returns>                   検索したノードの値(innerText)</returns>
//*********************************************************************
private string selectTextToDef( XmlDocument doc, string query, string defaultValue = "" ) {
    XmlNodeList nodeList = doc.SelectNodes( query );
    if ( nodeList.Count <= 0 ) {
        return defaultValue;
    } 
 
    return nodeList.Item(0).InnerText;
}



HttpWebRequestと、XmlDocumentを使用しているおかげで説明すべき事が無いくらい簡単に作る事ができました。
あえて注意点を挙げるとすれば、検索クエリのURLエンコードで使用しているHttpUtilityクラスを使用する上で、System.Webを参照設定するのが必要なことぐらいです。



ダウンロード

.NetFramework3.0のランタイムを使用しています。

download: GeoLookup.zip

[CrystalReports]積算合計フィールドで,集計のタイプに”合計”が出ない場合

CrystalReportsで、合計値を印字しようとして積算合計フィールドを作成した際、集計のタイプに”合計”が出ない場合は、該当の列が数値型になっていない(String等になっているとダメ)。

で、該当の列をStringからInt32に変更した上で”データベースの照合”を行っても、列名が同じでデータ型だけ変更した場合は、定義が変更されたという事をrptファイルのデザイナが認識してくれないみたい。

このような場合は、一旦列名を他のものに変えてから、元に戻すと正しく認識してくれるようです。

CrystalReportsでデータセットを指定後、データセット定義が変更時のrpt更新方法

VisualStudioでCrystalReportsを使用する場合、プログラム側から帳票側へ印字情報を渡すにはDataSetを使用します。
どのDataSetを使用するかは、帳票レイアウトファイルであるrptを作成する際に指定します。

通常だとこれで問題ないのですが、一旦rptファイル作成した後で,DataSetに対して列の追加や削除などが行われ定義が変わった場合はどうなるでしょうか?

気になったので試してみました。




まずは、追加前の状態です。DataSetの内容が、rptのデータベースフィールドに表示されています。

[DataSetの定義]


[*.rptファイル]




この状態でDataSetに列を追加しました。


rptを確認して見ると,残念ながらDataSetの内容は反映されていませんでした….





このような場合はどうすればよいのか調べてみたところ、該当のテーブルを右クリックし”データベースの照合”を選択すれば良いみたいです。



すると、ダイアログが表示されて…



無事、DataSetの内容がrptに反映されました。




4798124869
SAP Crystal Reports 2011 レポート開発入門ガイド

[VS2010]プロジェクトのフォルダに、*.sln.docstates.suoファイルが作成される。

プロジェクトが入っているフォルダをふと見たら、docstates.suoという拡張子のファイルが存在していました。


気になったので調べてみたところ、VisualStudioのプラグインの「Productivity Power Tools」をインストールしていると作成される設定ファイルでした。エディタで開いてみた感じでは、どのタブ(ファイル)をピン止めしているかなどの情報を管理しているっぽいです…


このファイルは*.suoファイルと同じくユーザ毎の環境を管理しているファイルなので、gitやSubversionなどのバージョン管理ソフトを使用している場合は、管理下に含める必要ありません。


4873114020
プロダクティブ・プログラマ -プログラマのための生産性向上術

貸株を行ったとき株主番号が変更されるか証券各社に聞いてみた

株を保有している場合、銘柄によっては配当のほかに株主優待がもらえる銘柄が有ります。
株主優待の内容は、企業によって異なり、金券や、自社商品、オリジナルグッズや食事券など様々です。
また、企業によっては長期間保有している株主に対し、長期保有者としてより大きな優待を提供する場合があります。


長期間保有者に対するプラスサービスについて、具体的な銘柄を幾つかあげてみると、以下のような企業が実施しています。

3048:ビックカメラ
 
連続3、4回保有(1株以上) 株主お買物優待券1枚追加 (1,000円券×1枚)
連続5回以上保有(1株以上) 株主お買物優待券2枚追加 (1,000円券×2枚)
※毎年8月及び2月末日の株主名簿及び実質株主名簿に、連続3回以上同一株主番号にて、
記載または記録された株主様を対象とします。





4337:ぴあ
 
ギフトカード
100株以上 2,500円相当
1,000株以上 5,500円相当
自社ギフトカード、オリジナル音楽カード、オリジナル図書カードから優待金額範囲内で事前に自由選択
※3期連続(1年半超)以上保有株主に対しては100株以上で5,000円相当、1,000株以上で11,000円相当





8566:リコーリース
 
クオ・カード
保有継続期間1年未満:3,000円相当
保有継続期間1年以上:4,000円相当
保有継続期間3年以上:5,000円相当
※保有継続期間の認定は、3月末を基準とします。





4526:理研ビタミン
 
自社関連商品(食品)
100株以上 1,000円相当
500株以上 2,000円相当
1,000株以上 3,000円相当
3,000株以上 4,000円相当
※3年以上連続して保有している株主は,2倍




これらの企業が株を長期保有しているかの判断を何で行っているかは様々ですが、通常は株主番号が同一かで判断する場合が多いです。



ところで、幾つかの証券会社では、貸株サービスを行っています。
貸株サービスを利用し、権利落ち日付近だけ自己所有した場合、株主番号が同一になるのか気になったので、各社に問合せを行ってみました。



以下が、各社の回答内容です。



monex証券:
決算をまたいで貸株サービスを利用された場合は、株主番号は変更されます。
3月末が権利確定日の株式の場合、27日(火)16:30までに貸株からはずす手続きをされないと決算をまたいで貸株を利用することとなります。




SBI証券:
当社「貸株サービス」にて貸出中の株式は「所有権を移転している」こととなるため、株主番号が変更されたり、継続保有とみなされない恐れがございます。




kabu.com証券:
貸株を行いますと、一度お客さまのご名義から変更となるため、その後返却された場合、株主番号は変更されております。
なお、銘柄によっては自動的に名寄せを行い、同番号にする場合もあるようですので、お手数ですが、株主名簿管理人様に直接ご確認いただけますようお願いいたします。



松井証券:
回答いただけませんでした…



monex証券以外は、各社とも株主番号が変更されるリスクがあるようです。
貸株を行っている証券会社では、どの銘柄を貸株対象にするかを、個別にしている事ができるので、長期保有者向けの優待サービスを行っている銘柄は予め貸株にしない方が無難なようです。

また裏技として、単元株が100株や10000株の場合、優待取得用の単元株とは別に、1株だけ端株として持っておくという方法もあります。端株はミニ株と異なり名義が購入者本人になるので、単元株分の名義が変わってもほふりで管理されている端株分の株主番号がそのまま維持されます。
株式投資の裏技

[log4net]警告”log4net.Config.DOMConfiguratorAttribute は古い形式です”が表示される場合にすべき事

VisualStudioでlog4netを使用すると、以下の警告が表示される場合があります。


警告 1
'log4net.Config.DOMConfiguratorAttribute' は古い形式です: 
    'Use XmlConfiguratorAttribute instead of DOMConfiguratorAttribute'




この場合の対処法はメッセージ通りで、AssemblyInfo.csに書いた以下の1文を変更すれば、警告が表示されなくなります。

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






[C#]ArgumentExceptionで、”DataSource のプロパティまたは列 xxxx にバインドできません。”エラーが出る場合

プログラムの実行時、ArgumentExceptionの例外が発生し、”DataSource のプロパティまたは列 xxxx にバインドできません。”というメッセージが出力される場合があります。


System.ArgumentException はハンドルされませんでした。
  Message=DataSource のプロパティまたは列 xxxx にバインドできません。
パラメーター名: dataMember
  Source=System.Windows.Forms
  ParamName=dataMember
  StackTrace:
       場所 System.Windows.Forms.BindToObject.CheckBinding()
       場所 System.Windows.Forms.BindToObject.SetBindingManagerBase(BindingManagerBase lManager)
       場所 System.Windows.Forms.Binding.SetListManager(BindingManagerBase bindingManagerBase)
       ...





これは、画面のコントロール(TextBoxやLabelなど)のプロパティで指定されているデータソースが存在しないためです。データバインディングは、DBのデータソースやアプリケーション設定情報などに対して行う事が可能ですが、今回はアプリケーション設定情報とバインドしていた場合に何をチェックすべきか説明します。

まず、コントロールがバインドしている紐付け先は、コントロールのプロパティを開き、DataBindingsのValueを確認します。
ここに表示されているValueの値が”(Settings) – “から始まっていたら、アプリケーション設定キーの情報と紐付けが行われています。



次に、プロジェクトで指定されている、アプリケーション設定キーの一覧をチェックします。
VisualStudioのメニューより、プロジェクト→xxxのプロジェクトを選択します。



設定タブを表示させると、登録済みのアプリケーション設定キーが表示されます。
もしこの一覧に、コントロールのプロパティで確認したValueが無い場合は、前述のエラーメッセージが表示されます。


プロパティを一旦クリアして(必要であれば)正しいアプリケーション設定キーを指定しなおせば、エラーは出なくなります。



[log4net]PatternLayoutのConversionPatternで指定可能なパラメータ一覧

log4netでログを出力する際、layout type=”log4net.Layout.PatternLayout”の、ConversionPatternで指定可能なパラメータの種類と意味の一覧です。

元ネタはこちら> http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

パターン名 内容
a appdomainが指定されたのと同じ意味です。
appdomain AppDomainを、どこでログ出力されたかを分かりやすい形で出力します。
aspnet-cache ASP.NETでキャッシュされている内容を全て出力します。特定のものだけ出力したい場合は、%aspnet-cache{key}の形で指定します。このパラメータは、Compact Framework や、Client Profile assembliesでは使用できません。
aspnet-context ASP.NETの全コンテキストアイテム情報を出力します。特定のものだけ出力したい場合は、%aspnet-context{key}の形で指定します。
このパラメータは、Compact Framework や、Client Profile assembliesでは使用できません。
aspnet-request ASP.NETの全リクエストパラメータ情報を出力します。特定のものだけ出力したい場合は、%aspnet-context{key}の形で指定します。
このパラメータは、Compact Framework や、Client Profile assembliesでは使用できません。
aspnet-session ASP.NETの全セッション情報を出力します。特定のものだけ出力したい場合は、%aspnet-context{key}の形で指定します。
このパラメータは、Compact Framework や、Client Profile assembliesでは使用できません。
c loggerと同じ意味です。
       
C typeと同じ意味です。
       
class typeと同じ意味です。
       
d dateと同じ意味です。
       
date ログ出力が行われた時刻をlocal time zoneで出力します。UTCで出力したい場合は、%utcdateを使用してください。
日付の書式指定は、例えば”%date{HH:mm:ss,fff}”や、”%date{dd MMM yyyy HH:mm:ss,fff}”の形式で記述します。詳細はdate format specifierを参照してください。ISO8601で出力したい場合は、Iso8601DateFormatterを参照してください。日付指定には,
.NetFrameworkのDateTime.ToString()と同じ構文でいけますが、log4netの書式指定のほうが推奨されています。…
These can be specified using one of the strings “ABSOLUTE”, “DATE” and “ISO8601” for specifying AbsoluteTimeDateFormatter, DateTimeDateFormatter and respectively Iso8601DateFormatter. For example, %date{ISO8601} or %date{ABSOLUTE}.

These dedicated date formatters perform significantly better than ToString.


exception

Used to output the exception passed in with the log message.

If an exception object is stored in the logging event it will be rendered into the pattern output with a trailing newline. If there is no exception then nothing will be output and no trailing newline will be appended. It is typical to put a newline before the exception and to have the exception as the last data in the pattern.

F fileを指定したときと同じです
file ログ出力のメソッド呼出元のコードがあるファイル名を出力します。
*注意*呼び出し元のファイル名を取得する処理は非常に遅いです。ですので、この指定をするのは速度が問題ないときに限って行ってください。呼び出し元の情報についてのavailabilityは後述の特記事項も参照してください。(訳注:翻訳前の元ページで確認してください)
identity

Used to output the user name for the currently active user (Principal.Identity.Name).

WARNING Generating caller information is extremely slow. Its use should be avoided unless execution speed is not an issue.

l locationと同じ意味です。
L lineと同じ意味です。
location

Used to output location information of the caller which generated the logging event.

The location information depends on the CLI implementation but usually consists of the fully qualified name of the calling method followed by the callers source the file name and line number between parentheses.

The location information can be very useful. However, its generation is extremely slow. Its use should be avoided unless execution speed is not an issue.

See the note below on the availability of caller location information.

level

Used to output the level of the logging event.

line

Used to output the line number from where the logging request was issued.

WARNING Generating caller location information is extremely slow. Its use should be avoided unless execution speed is not an issue.

See the note below on the availability of caller location information.

logger

Used to output the logger of the logging event. The logger conversion specifier can be optionally followed by precision specifier, that is a decimal constant in brackets.

If a precision specifier is given, then only the corresponding number of right most components of the logger name will be printed. By default the logger name is printed in full.

For example, for the logger name “a.b.c” the pattern %logger{2} will output “b.c”.

m Equivalent to message
M Equivalent to method
message

Used to output the application supplied message associated with the logging event.

mdc

The MDC (old name for the ThreadContext.Properties) is now part of the combined event properties. This pattern is supported for compatibility but is equivalent to property.

method

Used to output the method name where the logging request was issued.

WARNING Generating caller location information is extremely slow. Its use should be avoided unless execution speed is not an issue.

See the note below on the availability of caller location information.

n Equivalent to newline
newline

Outputs the platform dependent line separator character or characters.

This conversion pattern offers the same performance as using non-portable line separator strings such as “\n”, or “\r\n”. Thus, it is the preferred way of specifying a line separator.

ndc

Used to output the NDC (nested diagnostic context) associated with the thread that generated the logging event.

p Equivalent to level
P Equivalent to property
properties Equivalent to property
property

Used to output the an event specific property. The key to lookup must be specified within braces and directly following the pattern specifier, e.g. %property{user} would include the value from the property that is keyed by the string ‘user’. Each property value that is to be included in the log must be specified separately. Properties are added to events by loggers or appenders. By default the log4net:HostName property is set to the name of machine on which the event was originally logged.

If no key is specified, e.g. %property then all the keys and their values are printed in a comma separated list.

The properties of an event are combined from a number of different contexts. These are listed below in the order in which they are searched.


the event properties
The event has Properties that can be set. These properties are specific to this event only.

the thread properties
The Properties that are set on the current thread. These properties are shared by all events logged on this thread.

the global properties
The Properties that are set globally. These properties are shared by all the threads in the AppDomain.

r Equivalent to timestamp
stacktrace

Used to output the stack trace of the logging event The stack trace level specifier may be enclosed between braces. For example, %stacktrace{level}. If no stack trace level specifier is given then 1 is assumed

Output uses the format: type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1

This pattern is not available for Compact Framework assemblies.

stacktracedetail

Used to output the stack trace of the logging event The stack trace level specifier may be enclosed between braces. For example, %stacktracedetail{level}. If no stack trace level specifier is given then 1 is assumed

Output uses the format: type3.MethodCall3(type param,…) > type2.MethodCall2(type param,…) > type1.MethodCall1(type param,…)

This pattern is not available for Compact Framework assemblies.

t Equivalent to thread
timestamp

Used to output the number of milliseconds elapsed since the start of the application until the creation of the logging event.

thread

Used to output the name of the thread that generated the logging event. Uses the thread number if no name is available.

type ログ出力メソッドの呼び出し元のクラス名をパッケージ名つきで出力します。このパラメータは後述する”精度指定”のオプションを付与する事もできます。パラメータは、波括弧に整数を指定します。
もし、精度指定が行われた時は、パッケージ名のうち指定された数値文が出力されます。未指定時は、パッケージ名を含めて全ての名称が出力されます。

例えば、ログ出力を行った処理のクラス名が“log4net.Layout.PatternLayout”だったときに,%type{1} を指定したら、“PatternLayout”がログ出力されます。

注意:呼び元のクラス情報を取得するのは処理速度的に遅くなってしまうので、このパラメータは速度が問題ないときに限って使用してください。

See the note below on the availability of caller location information.

u Equivalent to identity
username

Used to output the WindowsIdentity for the currently active user.

WARNING Generating caller WindowsIdentity information is extremely slow. Its use should be avoided unless execution speed is not an issue.

utcdate

Used to output the date of the logging event in universal time. The date conversion specifier may be followed by a date format specifier enclosed between braces. For example, %utcdate{HH:mm:ss,fff} or %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is given then ISO8601 format is assumed (Iso8601DateFormatter).

The date format specifier admits the same syntax as the time pattern string of the ToString.

For better results it is recommended to use the log4net date formatters. These can be specified using one of the strings “ABSOLUTE”, “DATE” and “ISO8601” for specifying AbsoluteTimeDateFormatter, DateTimeDateFormatter and respectively Iso8601DateFormatter. For example, %utcdate{ISO8601} or %utcdate{ABSOLUTE}.

These dedicated date formatters perform significantly better than ToString.

w Equivalent to username
x Equivalent to ndc
X Equivalent to mdc
% “%%”と指定すると、ログファイルに”%”を出力します。


ConversionPatternは、以下のような感じでapp.configに記述します。

<configuration>
<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
    ...
<configSections>
 
<log4net>
    <appender name="MyAppender" type="log4net.Appender.RollingFileAppender">
        <param name="File"               value="log.txt"    /> 
        <param name="AppendToFile"       value="true"       />
        <param name="RollingStyle"       value="Date"       />
        <param name="DatePattern"        value="yyyy-MM-dd" />
        <param name="MaxSizeRollBackups" value="7"          /> 
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss} %-5p %20file(%4L) %m%n" />
        </layout>
    </appender>
 
    <root>
        <level value="ALL" />
        <appender-ref ref="MyAppender" />
    </root>
</log4net>





[C#].NETFramework,Version=v4.0.AssemblyAttributes.csでコンパイルエラーが発生する。

問題の内容

VisualStudioでコンパイル時、”.NETFramework,Version=v4.0.AssemblyAttributes.cs”ファイルでエラーが発生する場合があります。

上記ファイルが存在する場所は、プロジェクトがあるフォルダではなくtempの下になっています。
このファイルは、VisualStudioが自動生成するファイルで、正しく生成されていれば、以下のような内容になります。

// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")]



ですが、なにかのタイミングでこのファイルがおかしくなってしまうことがあるようで、コンパイル時にエラーが発生してしまいます。
再現状況は不明ですが、tempフォルダを全て削除し、再起動した直後に良く発生するような気がします。



解決方法


解決方法としては、一旦VisualStudioを終了した後、該当ファイルを削除し再度コンパイル直すと、うまく行くようです。
ただし、この方法では問題が再発する(しばらくすると,問題の.csファイルがおかしくなってしまう)ことがあるので、対処療法に過ぎません。


他には、*.csprojファイルを手で編集してしまう方法があります。
VS2010を閉じた後、csprojファイルをエディタで開いて、”Import Microsoft.CSharp.targets”のタグがある下に、を追加させます。
一旦変更してしまえば、その後ビルドを行っても問題の.csファイルを自動生成しなくなるようです。

変更例

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
 
  ...
 
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="GenerateTargetFrameworkMonikerAttribute" />                   <-- この行を追加
 
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>