"開発" の一覧

Visual WebGui販売終了

GrapeCityが販売していたVisual WebGuiが2014年10月22日で販売終了との事。価格は高いが、便利なんだろうなと気になっていた製品だった。

2013年の6月から1年半弱で販売終了となったのに気付いた時は、「買わなくてよかった」と「こんなことあるの?」という感想。

http://www.grapecity.com/tools/support/salesend.htm#end201411

ミドルウェアに依存しすぎるのは良くないが、開発力よりも仕様策定や現状調査に時間を割きたいのがツライところ。マイナーなミドルウェアに依存するのは注意しよう。

C#でのクラスライブラリの設計

C#でクラスライブラリを使用すると複数のプロジェクトで使用できて便利。しかし、どんな単位でクラスライブラリを分割するか悩みながらも下記のように考えていました。

  • 外部コンポーネントの有無
  • DBの接続先
  • ODBCの設定要否
  • .NetframeWorkのバージョン

しかしこの方法だと

  • ライブラリ数が増えてしまい、管理が大変
  • 他のライブラリとの依存関係が複雑になる

そこで.NetframeWorkのバージョンを3.5以上と決めて、細切れに分割していたライブラリをできるだけ統合した。

またNamespaceの設計は深く考えずに、ライブラリの一部だけ使用したい場合はライブラリ内のソースを参照追加するようにした。これによってコンポーネントの使用範囲についてはほとんど考慮しなくてよくなった。

もっといい方法があるはずですが…

AS400とのODBC接続時に円マークを使ったフィールドを正しく処理できない時

i5(AS400)とODBCで接続した場合に列名に円マークを含むテーブルを参照できない現象が以前から確認していましたが、あるとき全く気にしないで処理していることに気付きました。

確認したところ、原因はIBM System i Access for Windowsのバージョンでした。V5R4(詳細バージョン確認忘れ)ではだめでしたが、V6R1では問題ないです。

image

うまくODBCで参照できない時は、列名に円マークを使っていないか確認してみるといいかも知れません。

AS400とのiDB2Connectionで接続時にSQL0666エラー(タイムアウト)

よく対処方法を忘れているのでメモ。「iDB2Connection SQL0666」で検索して辿りつくのはいつもここ。ありがとうございます。

接続文字列にタイムアウトを0(無制限)としても自動で30に変更されていまうから、コードで再設定する事で解決します。

ちなみにODBCの場合はAS400のデフォルトの設定値によって同様のエラーが発生する時パターンあり

 

public void TestFunction()
{
    try
    {
        using (iDB2Connection cn = new iDB2Connection("DataSource=AS400;USERID=FOO;PASSWORD=BAR;CONNECTION TIMEOUT=0;"))
        {
            cn.Open();

            using (iDB2Command cmd = cn.CreateCommand())
            {

                cmd.CommandText = "SELECT * FROM HURGETBL";
                cmd.CommandTimeout = 0; // ←ここが無いと接続文字列でTimeout=0と定義しても30で上書きされてエラーになる。

                iDB2DataReader dr = cmd.ExecuteReader();
                if (dr.HasRows)
                {
                    dr.Read();
                }
            }
            cn.Close();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

}

VisualStudioでの社内向けシステム開発手法について

VisualStudioでの社内向けシステム開発手法について検討してみましたが・・・こんな感じになりました。

5点満点でまだ実装経験が無く不明な部分は3点にしてあります。ASP.NET MVCはユーザーに対して大きな変化は無いと思い今回除きました。

【大人の判断版】

architecture1

今回検討していたシステム要件としては上に記載したもの程、優先順位が高い。やはり3層アーキテクチャにすると開発の負荷が高い。新しい技術という事もあるし。

といって、新しい技術の習得を避けると関連する技術(SilverlightでいうならWCFサービスとか)も触れる機会が無くなるわけで、どんどん遅れていってる感が強くなる。そこで、開発者の学習意欲や満足度、社内だけではなく一般的な動作環境での評価も加味した場合が下記です。

【開発者のエゴ版】

architecture2

ということで、今ココです。Webサービス(ASMX)でDataTableを返してそのXMLを直接Silverlightへ持っていければまだ、まだ逆転できるかも?

エンティティフレームワークを使わない場合、テーブルをクラス化して、一覧画面や外部結合したクエリのシリアライズ用にクラス用意して・・・というのがツライです。

エンティティフレームワークは一度VS2008で試したのですがブラックボックス過ぎて、全く理解できてません。今は書籍が充実するのを待つかなーという消極的スタンス。

CEにてビジュアル継承が無効になる

CEの開発をVS2005で行っている際に、ビジュアル継承が無効になるとかなんとか。解決策を調べていたところ、

OBReadLibNet.dll内でプラットフォーム呼び出し(P/Invoke)を使用しているため、ビジュアル継承が無効となっています。OBReadLibNet.dllはデザイン時にプラットフォーム呼び出しを行いません。
継承したフォーム上にコントロールを表示させるには、親フォームのデザイン時属性ファイル(DesignTimeAttributes1.xmta)にDesktopCompatible属性を”true”と追加設定し、ビジュアル継承を有効にしてください。

という記載があったが、デザイン時属性ファイルってなに?という状態。どうもプロジェクトの「新しい項目の追加」からデザイン時の属性ファイルを指定する事でテンプレートから追加できた。具体的な記載方法は下記。

<?xml version="1.0" encoding="utf-16"?>
<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd">
  <Class Name="TestProject.FrmTest">
    <DesktopCompatible>true</DesktopCompatible>
  </Class>
</Classes>

WindowsCE用SqlClient

すっかりCEの開発をしていなかったら、SQL Serverに繋ぐ為に.Net Compact Framework以外にSqlClientをインストールしないと行けない事を忘れていた。

VS2005に付属のラインタイムは↓

C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Client\v2.0\

C#にてPDFファイルを結合

複数のPDFファイル一つのファイルにまとめるにはiTextSharpを使う。こちらを参考にさせて頂きました。これによって、結合できるがWebアプリ上でテンポラリファイルを生成とかカッコ悪い。

ということで、MemoryStreamに対応させました。が・・・copy.close時にMemoryStreamが閉じられてしまう。とりあえず、doc.close();とcopy.close();をコメントにしてみると、ファイル上で結合したものと比較して末尾が切れてる。

結局、

copy.CloseStream = false

がポイントでした。

 

        public static void fnJoinPdf(MemoryStream ms1, MemoryStream ms2, MemoryStream msJoin)
        {
            Document doc = null;    // 出力ファイルDocument
            PdfCopy copy = null;    // 出力ファイルPdfCopy
            MemoryStream[] aryMsStream = { ms1, ms2 }; // 入力ファイルを配列化
            try
            {
                //-------------------------------------------------------------------------------------
                // ファイル件数分、ファイル結合
                //-------------------------------------------------------------------------------------
                for (int i = 0; i < aryMsStream.Length; i++)
                {
                    // リーダー取得
                    PdfReader reader = new PdfReader(aryMsStream[i].ToArray());
                    // 入力ファイル1を出力ファイルの雛形にする
                    if (i == 0)
                    {
                        // Document作成
                        doc = new Document(reader.GetPageSizeWithRotation(1));
                        // 出力ファイルPdfCopy作成
                        copy = new PdfCopy(doc, msJoin);
                        copy.CloseStream = false;
                        // 出力ファイルDocumentを開く
                        doc.Open();
                        // 文章プロパティ設定
                        doc.AddKeywords((string)reader.Info["Keywords"]);
                        doc.AddAuthor((string)reader.Info["Author"]);
                        doc.AddTitle((string)reader.Info["Title"]);
                        doc.AddCreator((string)reader.Info["Creator"]);
                        doc.AddSubject((string)reader.Info["Subject"]);
                    }
                    // PDFコンテンツを取得、copyオブジェクトに追加
                    for (int iPageCnt = 1; iPageCnt <= reader.NumberOfPages; iPageCnt++)
                    {
                        PdfImportedPage page = copy.GetImportedPage(reader, iPageCnt);
                        copy.AddPage(page);
                    }
                    // フォーム入力を結合
                    PRAcroForm form = reader.AcroForm;
                    if (form != null)
                        copy.CopyAcroForm(reader);
                    // リーダーを閉じる
                    reader.Close();
                }
            }
            finally
            {
                if (copy != null)
                    copy.Close();
                if (doc != null)
                    doc.Close();
            }
        }

CEでもWeb参照設定はできる!

そんな気合い入れたタイトルにする必要は無いんだけど、個人的にサポートされていないという思い込みから驚いたので。

CEでWeb参照ができるということで、何ができるかというとクラスライブラリなどをWebサービス化(Web参照として利用できる形態に)する事で、

  • Webアプリ
  • Windowsクライアント用アプリ
  • CE用アプリ
  • たぶんSliverlightも

あたりで、共有できる為です。具体的なメリットは?というと、COMなどを利用しなければ実現できない処理をWebサービス化する事で外部アプリから制御できるようになります。

さらに噛み砕いて言うと、プリンタ制御用のCOMや三菱のシーケンサ制御用のCOMをWebサービス化すると、プリンタ制御用ライブラリをインストールする端末をWebサービスを提供するサーバーだけにする事ができます。

今頃気付くな!という話かもしれませんが、ようやくVS2003からVS2008に移行したところなので(汗)

VS2005で作成したサービスをWindows7ではInstallutilでセットアップできない

Windows7上でVS2005を使って作成したサービスプログラムをInstallUtilでインストールしようとしたところ、

D:\SVN\ServiceTest\ServiceTest\bin\Debug>installutil ServiceTest.exe
Microsoft(R) .NET Framework Installation utility Version 2.0.50727.4927
Copyright(C) Microsoft Corporation.  All rights reserved.

トランザクションのインストールを実行中です。

インストール段階を開始しています。
D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.exe アセンブリの進行状態については、ロ
グ ファイルの内容を参照してください。
ファイルは D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.InstallLog にあります。
アセンブリ ‘D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.exe’ をインストールしていま
す。
該当するパラメータ:
   logtoconsole =
   assemblypath = D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.exe
   logfile = D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.InstallLog

インストール段階で例外が発生しました。
System.ComponentModel.Win32Exception: アクセスが拒否されました。

インストールのロールバックを開始しています。
D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.exe アセンブリの進行状態については、ログ ファイルの内容を参照してください。
ファイルは D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.InstallLog にあります。

アセンブリ ‘D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.exe’ をロール バックしています。
該当するパラメータ:
   logtoconsole =
   assemblypath = D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.exe
   logfile = D:\SVN\ServiceTest\ServiceTest\bin\Debug\ServiceTest.InstallLog
System.ServiceProcess.ServiceProcessInstaller インストーラのロールバック段階で例外が発生しました。
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
インストールのロールバック段階で例外が発生しました。この例外は無視され、ロールバックは続行します。ただし、ロールバック完了後、コンピュータは完全に元の状態に戻らない可能性があります。

ロールバックの段階が正常に完了しました。

トランザクション インストールが完了しました。
インストールが失敗し、ロールバックが実行されました。

というエラーが発生。この状態で

net  start ServiceTest

22としても「無効なサービス名です」とのこと。試しにWindowsXPで同じ作業をすると正しく動作した。