ページ

2017年10月26日木曜日

USB-RS232Cケーブル REX-USB60 (XP対応品)を Winndow10で使えるようにしてみた

背景

COMを多用するシステムを構築する場合、PCのCOMポートが足りなかったりします。
最近のPCはCOMポートそのものがないこともなります。
そんな場合、USB-RS232Cケーブルが重宝します。
そんな過去の開発案件で、ラトックシステムのREX-USB60を多数保有しているのですが、
Windows XP全盛の時代に購入したものですので、それ以降のWindowsのバージョンにはデバイスドライバが対応していませんので、使用が不可能になってお蔵入りになってました。
そこで、現在使用しているWindows10で、再びREX-USB60を使用できるようにする検討をし、実現できましたので報告しておきます。

USBシリアル変換ICについて

現状では、FTDI社の方が売れているのではないかと思いますが、Prolific社のICも出回ており、このREX-USB60はProlific社のPL2303を使用しています。

USB-RS232Cケーブルについて

各ケーブルのメーカーとOSの対応状況を表にしていただいた記事がありました。
大変参考になりました。
http://wiki.tomocha.net/Windows_Vista_USB-RS232C.html

この記事の中の方法も参考にしながら、以下の方法で使用できました。
ケーブル内のEEPROMを書き換える方法をここでは採用しています。
試す方は自己責任でお願いします。

REX-USB60 を Winndow10で使用する方法

手順概要

  1. Windows XP の環境でEEPROMの書き換え
  2. Windows 10 の環境でProlific社のドライバをインストール
  3. コード10エラー解消パッチプログラムの実行

Windows XP の環境でEEPROMの書き換え

XPのPC環境の準備

XPのPC環境を用意します。古いPCを引っ張り出すのが手っ取りばやいのですが、それがない場合はVMWare等のヴァーチャルPC環境でXPを準備します。
XPの環境で、まず、REX-USB60のドライバをインストールします。この環境でREX-USB60でCOMがオープンできるようにします。

EEPROM書き換えソフトウェアのインストール

eep-pl2303x_eeprom_writer_v1003_4481.zipをダウンロードしてXPの環境にインストールします。
ここからダウンロードしました。

EEPROMの書き換え

REX-USB60が差し込まれている状態で、書き換えソフトウェアを起動します。
ちなみに一本ずつやった方がいいでしょう。
VID=067B/PID=2303に書き換えます。
以上でXP環境での作業は終了です。

Windows 10 の環境でProlific社のドライバをインストール

Ver 1.3 以前のものであれば、コード10エラーが出ないなどの情報がありますが、いくつかのバージョンを試しましたが、コード10エラーが出ました。
コード10エラーの対処法は後述しますので、最新のバージョン1.18.1 でも一応動作できました。
バージョンダウンによるコード10エラー回避できない理由としては、「PL2303 H」 Chipが実装されているためかもしれません。デバイスドライバのリリースノートには「- Windows 8 is NOT supported in HXA/XA chip versions (will show yellow mark Error Code 10).」との記載があるのでそのためでしょう。
インストーラのフォルダに同梱されれているPL2303_CheckChipVersion でChipのバージョンが確認できますが、コード10エラーを解消しないと確認できません。

そこはあまりめげないで、最新のものをインストールしちゃいました。
Download Latest Driver here:
http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41

コード10エラー解消パッチプログラムの実行

デバイスドライバインストール後にREX-USB60をUSBポートに挿入して、デバイスマネージャーを立ち上げると、ドライバは認識されましたが、コード10エラーでビックリマークが表示されて、COMが開けない状態になります。

そこで、これをインストールすればバッチリです。
http://www.ifamilysoftware.com/news37.html
http://www.ifamilysoftware.com/Drivers/PL2303_64bit_Installer.exe

「PL2303 Code 10 Fix」というアイコンでデスクトップにできますので、プログラムを起動して、「Continue」ボタンを押します。
デバイスマネージャーで、エラーが消えたか確認してみると…
あれ!?エラーのままです。

で、USBケーブルを差しなおしてみると、エラー表示が消えて、COMが開けるようになりました。
この時、同じUSBポートに差さないと、またパッチプログラムのやり直しになるようです。

あとがき

デバイスドライバを書き換える方法など、ほかにもやり方があったのですが、デバイスドライバの証明書だのなんだので、厳しくなっているので、この方法を採用しました。
VMWareでXP環境を構築したのですが、これも案外時間がかかって、古いXPのCD-ROMとシリアルがあれば、もっと早かったかも。
1人日かけてしもうた。

2017年3月5日日曜日

Visual Studio C# エクセルに画像を貼り付ける

生産管理システム構築の際に、製品に貼る銘版シールを自前のシステムから、エクセルシートを作成して、特別な装置が無くても工場で銘版シールが作成できるようにしたい。

前提として
Visual Studio 2010
Excel 2003
を使用する。

幾つかの方法があったので試してみた。

1.Worksheet.Shapes を使う方法
 ちょっと難しかったのか、ぜんぜんです。
 オプションパラメータもうまく参照できませんでした。
 エクセル2003じゃー、だめってことかと思います。
 mso なんちゃらって、いう、パナメータ。Enumっぽいのですが、参照できませんでした。とっとあきらめました。

2.クリップボードに一旦画像をコピーしてから貼り付ける
結果、この方法で成功したのですが、ちょっと難儀したので、書き残します。

2.1 Range.PasteSpecial を使う方法
クリップボードにイメージデータをコピーするサンプルコードとしては
    System.Windows.Forms.Clipboard.Clear();
    System.Windows.Forms.Clipboard.SetImage(バーコード[ImagIdx]);

こんな感じでOKでした。
次に、Range.PasteSpecia() を実行してみたのですが、エラー。
パラメータも幾つか試したのですが、エラーを重ねるばかりで、正解がわかりませんでした。
あまりにも、答えが見つからないので、軽く日本酒をグビーっとあおってみたのですが、状況は打開できませんでした。
こういうときは、一晩寝て、翌朝に神社に行って祝詞をあげて、禊をすると解決するのです。(冗談です)

2.2 Picturesを使う
プログラムでクリップボードにコピーされた後、あらかじめ立ち上げておいたエクセルシートで「貼り付け」をすると、ちゃんと貼り付けることでできていたので、答えは必ずあると考えておりました。

成功したバターンは、
コピー先のRangeを選択してから、Pictures.Pasteを実行する。
サンプルコードとしては
 Range.Select();
   Pictures pictures = (Pictures)Worksheet.Pictures(Type.Missing);
   Picture picture = pictures.Paste(Type.Missing);

こんな感じです。これでOK牧場でした。

2016年11月25日金曜日

共有サーバーSDのSPFレコード修正について


共有サーバーSDから送信したメールが迷惑メールに判断させるようなのでいろいろと調べたら、DNSの設定でSPFレコードを修正する必要がある。
との事で、
アスメルの記事を参考に設定したのですが、
http://asumeru.net/spf-gmo

設定例の
v=spf1 +ip4:157.7.144.0/24 +ip4:203.141.249.128/25 +ip4:210.157.19.64/26 include:1lejend.com ~all

をそのまま設定してしまって、
SPFレコードチェックツール
http://asumeru.net/tools/spf/spfchecker.php


を使ってチェックするとPASSしてしまうので、良いかと思っておりました。

正しくは、以下のようです。(2016/11/25現在)
v=spf1 include:spf.gmoserver.jp include:1lejend.com ~all

http://d.hatena.ne.jp/MugeSo/20100410/1270906618

の記事にある、
check-auth@verifier.port25.com
にメール送信すると、検証結果が返信されます。
良しとしておきます。


2016年5月8日日曜日

IKEAのLED照明のAC/DCアダプタのDCアダプタ側のコネクタの標準化について

IKEAのLED照明が近くのリサイクルショップに新古品らしく売っていたので、台所用の照明として買ってみました。

似たような記事は以下です。
http://applestores.blog.fc2.com/blog-entry-403.html

IKEAのRIBBAというシリーズ品のようで、フレームなどの枠に載せるような使い方をするようです。


そんな事はついぞ知らず、台所に強引に付けてしまいました。
台所に取り付けた感じ。

15Wの蛍光灯がありましたが、蛍光管が切れましたので、LED照明を付けてました。
賃貸物件ですので、インシュロックで簡単に留めてみました。
ON/OFFスイッチの操作もできて、快適です。
奥様に喜んでもらえるか心配ですが、近くのリサイクルショップで1980円で売ってまして、まーいいかなーと思い購入しました。
蛍光灯が15Wで、このLED照明にすると4W位ですみます。11Wの差は大きいかな。


愛犬のための常夜灯としても使用したいので、いつの日か、太陽電池と蓄電池のシステムにしたいなーと思い、少し検討していました。



AC/DCアダプタに「helms-man」の文字があったので、探してみると以下のメーカーであることがわかりました。
http://www.helms-man.com/

DCの出力はDC12V500mAと表示されています。

で、ふと気になったので、このDC側のコネクタです。
標準的なものように思えます。
このコネクタのメス側を用意してあげれば蓄電池と繋げるのも簡単な気がします。

コネクタの規格を調査したいと思います。
AC/DCアダプタのメーカーのページをさらに検証します。
如何にそれらしい製品のページがありました。
http://www.helms-man.com/en/products/page-85.html

準拠している規格が表示されています。


UL1310


  • Class 2 パワーサプライユニットに関する規格
  1. 8A以上の出力電流が流れない
  2. 出力電圧は、DC30V以下

UL697


  • 玩具向け変圧器に関する規格

UL8750


  • LED照明向けの安全規格

IEC61558


  • 変圧器,電源装置,リアクトル及びこれに類する装置の安全性規格

UL60950/IEC60950


  • 定格電圧が600V以下の情報処理機器の安全性規格

UL60065/IEC60065


  • オーディオ、ビデオ及び類似の電子機器-安全性要求事項

IEC61347


  • LED制御のための直流又は交流電源に対する安全規格

IEC60335


  • 家庭用電気機器の国際規格
  • 接続先機器が短絡した際の最大電流について4,000V以下では200mAと規定

UL60601/IEC60601


  • 医療用電気機器の安全性と基本的性能を確保するための、一連の技術規格


以上、AC/DCアダプタであれば、準拠すべき規格です。
LEDに関してはフリッカに関しては、簡単にスマホのカメラで検証しました。
この日は、カレーを仕込んだのですが、カメラの映像にはフリッカの映り込みは少ないようです。
そこそこ優秀です。

カレーはルクルーゼの鍋で、ゴボウと豚肉をベースにした和風カレーです。
美味しくできましたよ。

脱線しすぎました。

AC/DCアダプタはパッと見では、それなりに優秀だという事が分かりました。
ACラインノイズ放射など、見たいところですが、測定器もないのですし、DCシステムの方か検討課題ですので、次にいきます。


DCコネクタについての考察

LED照明の電力供給を家庭内でシステム化するには、DCのコネクタを標準化したいと思うのが常です。
前述の例では12Vのシステムでした。
12Vはバイクでも多いですし、太陽光発電システムでも採用されるケースが多々あるかと思います。

IKEAが採用したHelms-ManのDC側のコネクタ



ありました!資料が!
12V近辺の家庭内(屋内)のDC供給システムのコネクタとしては気に入りました。
あのいわゆるジャックのデザインは、ちょっとデザインがねー。
という意味合いで、IKEAなんかはこれを採用したのではないでしょうか。




2015年10月12日月曜日

家の中で「音」が時空を超えた現象について

はじめに

私が幼少のころに過ごした家での出来事を報告する。
私は長野県長野市の古里地区で生まれ育った。
1968年、昭和43年8月に生まれ駒沢団地で育った。

6歳になった1974年、昭和49年の春ごろから新居に引越した。
普通の昭和後期の木造住宅だ。

そのときの住所は長野県長野市大字金箱796-3。
現在は取り壊されて小さな公園になっている。

家族構成は、父、母、兄と私の四人家族で、兄は4歳年上だった。

家の間取りは、1階3DK、2階に子供部屋が一部屋。

発生した現象について


  1. 誰もいない2階の子供部屋から人が歩く音が1階に響く。
  2. 2階にいる時、階段を昇ってくる足音が聞こえたが、誰もそこには居なかった。

頻度について

  1. の現象は度々発生していた。私と兄と母が体験したが、母は気づいていないふりをしていた。
  2. の現象は1度だけ体験した。私と兄が2階にいて体験している。

発生期間について

  1. の現象は、私が小学1年生から中学生までの続いた。その後、家を増築して、その現象は感じられなくなった。
  2. の現象は私が小学4年生ぐらいの夏から秋の事だったと記憶する。

この現象の原因の一端に気づくまで

正直言って、この件をあまり他人に話した事はなかった。完全にオカルト現象だと思っていたからだ。
だが、映画『インセプション』を見たとき、この幼少の頃の記憶が蘇った。
そして、以下の仮説が腑に落ちる。
  1. の足音や2階に誰かが居る気配の現象は、自分の気配で、時間が遅れて(または早く)物音が聞こえたのではないか。
  2. は1の現象が怖くて、夜中に一人で2階上がれなくて、階段の途中で止まって、じっと2階の気配を感じようとしていた事があった。この時の行動が、時間が遅れて(または早く)音として聞こえたのではないか。

1階と2階の間に時空のハザマがあった

と結論づけるとこの現象が納得いく。
これは、オカルト現象ではなく、自分の気配が時空を超えて伝わってきた、現象に過ぎないと考えられ、これに科学的根拠があるとすれば、人類の未来に何らかの貢献ができると思われる。

家の構造に何らかの要因があるのでは?

家の構造がこの現象を引き起こす何らかの関わりがあると考えられる。何故なら増築後にこの現象が感じられなくなったためだ。

階段と家の構造

家は南南東を向いて玄関は西南西側にあり、その玄関を上がるとすぐに玄関が南南東を向いて2階に登る構造。
階段を登りきると突き当りは壁で、左側に子供部屋の扉(襖)、左側に小窓があった。
突き当りの壁にはいつも丸い鏡がかけてあった。
階段の天井には押入れの小部屋がせり出していた。
階段は12段で、踊り場を入れると13段あったと記憶する。

西南西から見た時の断面図

その他の特色

階段上の踊り場、つまり襖の前で手を叩くと、その音が共鳴する。
日光の鳴き竜に近いかもしれない。
手をパンと一回叩くと、「パンーパンーパンー…」としばらく響くような感じで共鳴した。

丸い鏡について

丸い鏡に何らかの因果関係あるかわからないが、現象が収まった増築後には、この鏡は外されていたように記憶する。

小窓について

増築後は小窓がなくなり、ドアが設置された。
小さいアルミサッシだった。

右側の壁について

増築前は右側の壁の外は西日がとても良く当たるところだった。

時間のずれ幅について

こらは難し判断なのだが2の現象だけを見ると、夏ごろと秋ごろがリンクするので、3か月~半年程度のずれが有ったと考えられる。

物質のずれは有ったのか

答えはNOだ。
音だけが時間がずれて伝わる事があった。

私と兄はしっかりと現象2を体験しているが、例えば3ヶ月後の自分を見たというようなことは無かった。

2014年7月29日火曜日

WordPress blogger_newPost() に投稿日時を指定する。

WordPressへ外部から投稿を可能にする、 blogger_newPost() ですが、
投稿日時をMySQLのシステム日時から自動で取得します。

過去記事を外部投稿したい場合、これでは不都合です。

投稿日時を指定できるように改良していました。

class-wp-xmlrpc-server.php から抜粋

2014年4月24日木曜日

Window server 2012 R2 で、Monacaデバッガー Window8アプリのデバッグ





MonacaデバッガーをWindows Server 2012 R2 にインストールして実行してみた。
起動するとログイン








Windows Server 2012 R2の開発者用ライセンスが必要とのメッセージが出て、取得しを試みたところ、以下のメッセージが出た。うーん残念。



それもそうかな。
MonacaのWindowsアプリはWindows8向けになっているので、Windows Server 2012 R2でMonacaデバッガーを実行させるには、それなりの準備が必要なようだ。

Windows Server 2012 R2でWindows8のアプリを動作させるには、「機能」を追加してあげる必要がると思われる。
これはWindows Server 2008でWindows7のアプリを動作させる時と同じ。

以下のサイトを参考しにして、機能を追加してみた。

Windows Server 2012でWindows 8で利用できる機能を追加する


Windows Server 2012 R2

















Visual Studio 2010 C#.NET で WordPress に自動投稿するプログラム


Visual Studio 2010 C#.NET で WordPress に自動投稿するプログラムを作るべく調査しまいた。


以下のサイトを参考にしました。
http://www.moonmile.net/blog/archives/1284


XML-RPCを使います。
参考サイトに従ってC#のプロジェクトをダウンロードしてコンパイルしました。

コンパイルを試した結果、.NET Framework 4ではうまくいきません。
.NET Framework 3.5で動作確認ができました。

現時点でのxml-rpc.netのバージョンは.2.5.0でした。


参考サイトのソースを少し変更して、コマンドプロンプトからすべて引数で動くように改修しました。


  • サンプルコード


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CookComputing.XmlRpc;

namespace WP_Post
{
    class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            try
            {
                pg.url = args[0];   //<投稿先のURL/xmlrpc.php/>
                pg.username = args[1];  //ブログのユーザー名
                pg.password = args[2];  //ブログのパスワード
                string title = args[3]; //タイトル
                string content = args[4];   //記事内容
                pg.categoryID = int.Parse(args[5]);//カテゴリID
                // 投稿
                pg.BllogerNewPost(title, content);
            }
            catch (Exception ex)
            {
                Console.WriteLine("エラー:" + ex.Message);
                return;
            }
        }
        // ユーザー名
        string username = "<ブログのユーザー名>";
        // パスワード
        string password = "<ブログのパスワード>";
        // 投稿先のURL
        string url = "<投稿先のURL>";
        // 投稿カテゴリID
        int categoryID = 0;

        public void BllogerNewPost(string title, string content)
        {
            //プロキシクラスのインスタンスを作成
            IBlogger proxy =
                CookComputing.XmlRpc.XmlRpcProxyGen.Create<IBlogger>();
            //URLを指定
            proxy.Url = url;

            int id = 0;
            // content を生成
            content = string.Format("<title>{0}</title>", title)
                + string.Format("<category>{0}</category>", categoryID)
                + content;

            //blogger.getRecentPostsを呼び出す
            id = proxy.newPost(
                "",             // WordPressの場合は無視
                "1",            // 念のため1にしておく
                username,
                password,
                content,
                false);
            //結果を表示する
            Console.WriteLine("id: " + id);
        }
    }

    public interface IBlogger : IXmlRpcProxy
    {
        /// <summary>
        /// 新規投稿
        /// </summary>
        /// <param name="appkey">無視</param>
        /// <param name="blogid">無視</param>
        /// <param name="username">ユーザー名</param>
        /// <param name="password">パスワード</param>
        /// <param name="content">本文</param>
        /// <param name="publish">公開するかどうか</param>
        /// <returns>エントリのIDを返す</returns>
        [XmlRpcMethod("blogger.newPost")]
        int newPost(
            string appkey,
            string blogid,
            string username,
            string password,
            string content,
            bool publish);
    }
}





2014年4月8日火曜日

VBA エクセルマクロでCDOを使ったメール送信プログラム

BASP21を使ったメール送信プログラムは結構存在しますが、WinodwsにCDOが標準搭載されてからは、CDOを使っプログラムもリリースされるようになりました。
以下にサンプルプログラムを用意しました。
ヒントになればと思います。
GmailとYahoo mailで試したところ、本文のCRLFの扱いの違いがありました。
改行コードCRLFをLFに変換する機能は有った方が良いようです。
SMTPサーバーのプラットフォームの違いなのかもしれません。





サンプルプログラム

Option Explicit
'参照設定でCDOを参照しておくこと
Public passwd As String
Public sw As Byte

Sub MySendMail()
    Dim ret As String
    Dim szLogfile As String
    Dim szServer As String, szTo As String, szFrom As String
    Dim szSubject As String, szBody As String, szFile As String
    Dim flBody
    Dim i As Long
    Dim fs, a As Object
    Dim oMsg As New CDO.Message
    Dim szCC As String, szBCC As String
On Error GoTo Err_Handler
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.CreateTextFile(Worksheets("設定").Cells(27, 1).Value, True) 'ログファイル
    passwd = ""
    oMsg.Configuration.Fields.Item(cdoSendUsingMethod) = cdoSendUsingPort '2
    oMsg.Configuration.Fields.Item(cdoSMTPServer) = Worksheets("設定").Cells(11, 1).Value 'SMTPサーバー名
    oMsg.Configuration.Fields.Item(cdoSMTPServerPort) = Worksheets("設定").Cells(13, 1).Value 'ポート番号
    oMsg.Configuration.Fields.Item(cdoSMTPConnectionTimeout) = 60   'タイムアウト値

    If Worksheets("設定").Cells(7, 1).Value <> "" Then  'CC
        oMsg.CC = Worksheets("設定").Cells(7, 1).Value
    End If
    If Worksheets("設定").Cells(9, 1).Value <> "" Then  'BCC
        oMsg.BCC = Worksheets("設定").Cells(9, 1).Value
    End If
 
    oMsg.Configuration.Fields.Item(cdoSMTPAuthenticate) = Worksheets("設定").Cells(15, 1).Value 'SMTP認証
 
     '要パスワード認証の場合
    If Worksheets("設定").Cells(17, 1) = 1 Then
        UserForm1.Show
        If sw = 1 Then
           oMsg.Configuration.Fields.Item(cdoSendPassword) = passwd
         Else
            MsgBox "送信処理をキャンセルしました。"
            GoTo Exit_sub
         End If
    End If
 
    If Worksheets("設定").Cells(21, 1) = 1 Then
        oMsg.Configuration.Fields.Item(cdoSMTPUseSSL) = True    'SSL暗号化
    Else
        oMsg.Configuration.Fields.Item(cdoSMTPUseSSL) = False    'SSL暗号化しない
    End If
 
    oMsg.Configuration.Fields.Item(cdoLanguageCode) = Worksheets("設定").Cells(23, 1).Value '文字コード
    oMsg.Configuration.Fields.Update

 
    ' メール送信結果を記録するファイル名を指定します。
    szServer = Worksheets("設定").Cells(11, 1) ' SMTPサーバ名
    '
    With Worksheets("宛名及び置換文字")
        If .Cells(1, 3) & .Cells(1, 7) = "" Then
            MsgBox "タイトルとFROMを入力してください"
            GoTo Exit_sub
        Else
            If MsgBox("タイトル:" & .Cells(1, 3) & vbCrLf & "送信元:" & .Cells(1, 7) & vbCrLf & vbCrLf & "上記でよろしいですか?", _
                vbOKCancel, "確認") = vbCancel Then
                GoTo Exit_sub
            End If
        End If
        szSubject = .Cells(1, 3)    ' 件名
        szFrom = .Cells(1, 7)   ' 送信元
     
        If .Cells(1, 10) = "高" Then
            oMsg.Fields("urn:schemas:mailheader:Importance") = "High"
            oMsg.Fields("urn:schemas:mailheader:Priority") = 1
            oMsg.Fields("urn:schemas:mailheader:X-Priority") = 1
            oMsg.Fields("urn:schemas:mailheader:X-MsMail-Priority") = "High"
            oMsg.Fields.Update
        End If
        If Worksheets("設定").Cells(19, 1).Value = "" Then
            oMsg.Configuration.Fields.Item(cdoSendUserName) = Cells(1, 7).Value 'メールアドレス
        Else
            oMsg.Configuration.Fields.Item(cdoSendUserName) = Worksheets("設定").Cells(19, 1).Value   'ログインID
        End If
        oMsg.Configuration.Fields.Update
     
        oMsg.From = szFrom
        oMsg.Subject = szSubject
     
     
        i = 3
        Do While .Cells(i, 1) <> "END"
            If .Cells(i, 1) = "○" Then
                szTo = .Cells(i, 5)    ' 宛先
                szBody = .Cells(i, 6) ' 本文
                If Worksheets("設定").Cells(25, 1).Value = 1 Then '改行コードCRLF
                    szBody = Replace(szBody, vbLf, vbCrLf)
                End If
                szFile = .Cells(i, 11) '添付ファイル
                oMsg.To = szTo
                oMsg.TextBody = szBody
                If szFile <> "" Then
                oMsg.AddAttachment szFile
                End If

                On Error GoTo ErrHandler1
                 oMsg.Send
                  .Cells(i, 1) = "完了"
cont1:
            End If
            i = i + 1
        Loop
    End With
    ' パラメータエラーのときは、戻り値にエラーメッセージが返ります。
    MsgBox "終了しました"
    GoTo Exit_sub

ErrHandler1:
    MsgBox "エラー:" & Err.Number & vbCrLf & Err.Description
    a.WriteLine (Date & " " & Time & " " & Err.Number & "-" & szTo & "-" & Err.Description)
    Worksheets("宛名及び置換文字").Cells(i, 1) = "エラー"
    Resume cont1

Err_Handler:
    MsgBox Err.Description, vbCritical, "Error"
    GoTo Exit_sub

Exit_sub:

   a.Close

End Sub

2014年4月7日月曜日

今更ながら磁気カードについて考える

今はRFID・ICカードが普及して、今更磁気カードなんて使わないでしょ!?
そう思われる。

磁気カードはスキミングにより、サクサク読み取れます。
カードのコピーは多少の技術的知識があれば、お茶の子さいさい、への河童。なわけです。

セキュリティーの面からもICカードを利用するのが望ましい事は誰でも納得出来るところです。

しかし、磁気カードはまだまだ使われている。


理由は、「カードの単価が安い」という事に尽きる。
無料でカードを顧客に配布する様なカードソリューションにとっては、重要な要件になる。

ICカードはMifare Ultra rightはもっとも安いICカードだが、それでも磁気カードの方が安い。

したがって、磁気カードは市場から無くならない。

VB.NETからExcel2007のソート機能を使う

VB.NETからExcel2007のソート機能を使う


ソートキーが文字列の場合、順番を指定してソートしてあげないと、希望通りのソートができないですよね。
VB.NETから簡単にエクセルのソート順を文字列していして実行する方法を見つけたので書いておきます。
VBレスキュー(花ちゃん)のサンプル投稿用掲示板
を参考にしてみたものの、いまひとつピンとこない。

半日悩んだ結果、こんなに簡単なコードで、出来る事がわかりました。
「CustomOrder」を使います。


以下にサンプルコードを書いておきます。
既にエクセルオブジェクトが読み込まれていて、アクティブシートが選択されている状態であることを前提にしています。
「strソート文字列」はソートする文字列群がすでに代入された、StringのArrayListとします。

「CustomOrder」はシート毎に設定すると考えられます。
シートを選択してSort.SortFieldsに設定してあげたらできました。


2013年8月5日月曜日

FDT.exeがインストールされているか自動判定する


PCと接続されている機器のファームウェアのバージョンアップを自動化したいという要求は多々あると


Renesas FDT.exe

レジストリのUninstallリストを見る方法

レジストリのUninstallプログラムリストを見れば、既にインストールされているプログラムの一覧を取得できる。
以下がそのレジストリ名。

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{プロダクトID}

FDTのプロダクトIDを調査した。

  • V409 {376379F3-E708-453E-B5C1-FB60675C513C}
  • V408 {0776792E-F51C-4CE5-A4FB-86E126DB9C81}
  • V403 {29170013-CC82-4D81-BEB3-970662DD7A98}
  • V401 {287BC16B-9185-4E2B-B713-557A1ADF9590}
手元にあるいくつかのバージョンを
ということで、各バージョンのプロダクトIDが異なるため、全てのバージョンをのプロダクトIDを事前に調べて、全部を検知するのは、賢いやり方では無さそう。


関連付けファイルの情報などのレジストリを見る方法

そこで、別の方法を考えてみる。
FDTのインストール時にデフォルトでは拡張子に関連付け処理が適応される。
ということは、関連ファイルが起動される際の、起動プログラム情報がレジストリに追加されているはずである。
レジストリを調査していると、以下のレジストリ名を発見した。

  • HKEY_CLASSES_ROOT\FDT4.Config\shell\open\command

この中を見ると

  • "C:\Program Files\Renesas\FDT4.09\fdt.exe" "/DISCRETESTARTUP" "w4fRun \"%1\""

と書いてあった。バージョンによってフォルダ名が違うものの、インストールされた痕跡はこれで分かる。痕跡と書いたが、アンインストールされてもこの情報は残っている為、実態があるかどうかは別途調べなければならない。

レジストリの値を抽出する方法

バッチファイルでレジストリの値を抽出すること自体はとても簡単。

【レジストリの値を抽出する】

SET FDT_REG_KEY_CONF=HKEY_CLASSES_ROOT\FDT4.Config\shell\open\command
FOR /F "TOKENS=2,3,* delims= " %%I IN ('REG QUERY "%FDT_REG_KEY_CONF%"') DO (
IF "%%I"=="REG_SZ" SET FDT_EXE_CMD_VALUE=%%J
)


ここまでは簡単。
しかし環境変数FDT_EXE_CMD_VALUEに入る文字列は

  • C:\Program Files\Renesas\FDT4.09\fdt.exe"

となっている。最後のダブルクォーテーションが余分だ。

文字列からダブルクォーテーションを削除する方法

色々試してみたが、テキストのテンポラリファイルに一旦掃き出すがのもっとも簡単だと思われる。

ECHO %FDT_EXE_CMD_VALUE%>tmp.txt
などで、テキストに掃き出してから以下のバッチファイルを呼び出す。

【ダブルクォーテーションを削除する.bat】

REM BATファイルのパラメータ
REM %1 対象テキストファイル名
if "%1"=="" goto end
set fname=%~1
copy %fname% org >nul
type nul >%fname%
for /f "delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del /f org
goto end

:sub
set l=%line:"=%
>>%fname% echo %l%
goto :EOF

:end





バッチファイルで文字列からダブルクォーテーションを削除する。


バッチファイルで文字列からダブルクォーテーションを削除する。

バッチファイル制御を試みると、この問題にぶち当たることがあります。
例えばレジストリの内容を見て、プログラムフォルダを検索するなど、PATH名に空白がある場合は文字列がダブルクォーテーションで囲まれている。
そこにプログラムパラメーター等の文字列がさらに書き込まれている場合、for文で区切り文字処理がうまくできず、片方だけダブルクォーテーションが残ってしまってガックリ来たりします。
そうなると意外に面倒くさい。
ダブルクォーテーションが残ってしまった文字列をテキストファイルに吐き出して、そのテキストファイルから、ダブルクォーテーションを削除するバッチファイルを作成してみた。