VB6を起動したところ、『Visual Studio 2005 Premier Partner Edition』のセットアップディスクを求められました。
自分で明示的にインストールした記憶がないので、何かに付帯してインストールされてしまったのではないかと考え、手元に該当するメディアも無いことだし、とりあえずセットアップ要求をスキップしようとしたのですが、キャンセルボタンを押しても「取消中」と表示されたまま先に進まなくなってしまいました。
そのような現象が発生したときに取った解決手順です。

※Visual Studio 2005 Premier Partner Editionは、SQL Serverの関連製品をインストールすると入ってしまうという情報が検索で引っかかりました。たしかに動作確認用にSQL Server 2005と関連ツールがインストールされています。
でも、最近までセットアップディスクの要求はなかったはずなんですよね、謎です。

Read More

VB .NETからWSL(Windows Subsystem for Linux)を起動しLinuxコマンドを実行、標準出力に出力された内容を.NET側で受け取りコンソールに出力するサンプルプログラムです。

サンプルプログラムはLinuxのPSコマンドを実行し、標準出力の内容を逐次読み込むパターンとイベントハンドラを用いて非同期に読み込むパターンの2つを用意しました。

BackgroundWorkerなどと組み合わせると長時間実行するLinuxコマンドから出力される内容を.NET側で受け取りGUIに進行状況を表示しながら実行することもできます。

  1. Linuxコマンドから標準出力に出力出力された内容を逐次読み込むサンプル

' This software is distributed under the license of NYSL.
' ( http://www.kmonos.net/nysl/ )

''' 
''' <summary>
''' WSL上でLinuxコマンドを実行し、標準出力に出力された内容をコンソールへ出力
''' </summary>
Public Shared Sub InvokeWslCommand()

    Dim psi As New ProcessStartInfo()

    ' WSLのディストリビューション(ubuntu、ubuntu1804など)
    psi.FileName = "ubuntu1804"
    ' WSL上で実行するコマンド(実行したい部分をダブルクオーテーションで囲む)
    psi.Arguments = "run ""ps -aux"""

    ' リダイレクト設定(標準出力のみをリダイレクト)
    psi.RedirectStandardInput = False
    psi.RedirectStandardOutput = True
    psi.RedirectStandardError = False

    ' シェル使用せず、ウィンドウ表示なし
    psi.UseShellExecute = False
    psi.CreateNoWindow = True

    ' WSLプロセスを起動
    Using p = Process.Start(psi)

        ' 標準出力に出力される内容を読み取り
        Dim reader = p.StandardOutput
        Do Until reader.EndOfStream
            Dim line = reader.ReadLine
            Console.WriteLine(line)
        Loop

        ' プロセスの終了待ち
        p.WaitForExit()

	' 終了コードを出力
        Console.WriteLine("exit-code=" & p.ExitCode)

    End Using

End Sub
  1. Linuxコマンドから標準出力に出力された内容をイベントで受け取り非同期で読み込むサンプル

' This software is distributed under the license of NYSL.
' ( http://www.kmonos.net/nysl/ )

''' 

''' <summary>
''' WSL上でLinuxコマンドを実行し、標準出力に出力された内容をコンソールへ出力(非同期版)
''' </summary>
Public Shared InvokeWslCommandAsync()

    Dim psi As New ProcessStartInfo()

    ' WSLのディストリビューション(ubuntu、ubuntu1804など)
    psi.FileName = "ubuntu1804"
    ' WSL上で実行するコマンド(実行したい部分をダブルクオーテーションで囲む)
    psi.Arguments = "run ""ps -aux"""

    ' リダイレクト設定(標準出力のみをリダイレクト)
    psi.RedirectStandardInput = False
    psi.RedirectStandardOutput = True
    psi.RedirectStandardError = False

    ' シェル使用せず、ウィンドウ表示なし
    psi.UseShellExecute = False
    psi.CreateNoWindow = True

    ' WSLプロセスを起動
    Using p = Process.Start(psi)

        ' 出力を受け取った時のハンドラを設定
        AddHandler p.OutputDataReceived, Sub(sender As Object, e As DataReceivedEventArgs)
                                                Console.WriteLine(e.Data)
                                            End Sub

        ' 非同期読み込み開始
        p.BeginOutputReadLine()

        ' プロセスの終了待ち
        p.WaitForExit()

        ' 非同期読み込みをキャンセル
        p.CancelOutputRead()

	' 終了コードを出力
        Console.WriteLine("exit-code=" & p.ExitCode)

    End Using


End Sub

Windowsのパス表現(例: C:\data\ )とWSLのパス表現(例: /mnt/c/data )を変換するための方法として、WSL側にはwslpathコマンドがサポートされていますがWindows側 .NETのライブラリでは簡単に変換できる方法がないようです。

WSL環境のwslpathコマンドを呼び出しパス表現の変換を行うための関数を作成しました。

' This software is distributed under the license of NYSL.
' ( http://www.kmonos.net/nysl/ )

''' <summary>
''' Windowsのパス表現からWSLのパス表現に変換する
''' </summary>
''' <param name="distro">ディストリビューションの起動コマンド(ubuntu、ubuntu1804など)</param>
''' <param name="windowsPath">Windowsのパス</param>
''' <returns>WSLのパス</returns>
Public Shared Function ToWslPath(distro As String, windowsPath As String) As String

    Dim psi As New ProcessStartInfo()
    psi.FileName = distro
    psi.Arguments = "run ""wslpath '" & windowsPath.Replace("\", "/") & "'"""
    psi.RedirectStandardOutput = True
    psi.UseShellExecute = False
    psi.CreateNoWindow = True

    Dim p = Process.Start(psi)
    Dim wslPath = p.StandardOutput.ReadLine
    p.WaitForExit()

    Return wslPath

End Function

''' <summary>
''' WSLのパス表現からWindowsのパス表現に変換する
''' </summary>
''' <param name="distro">ディストリビューションの起動コマンド(ubuntu、ubuntu1804など)</param>
''' <param name="wslPath">WSLのパス</param>
''' <param name="slash">Trueの場合セパレータが"/"、Falseの場合セパレータが"\"</param>
''' <returns>Windowsのパス</returns>
Public Shared Function ToWindowsPath(distro As String, wslPath As String, Optional slash As Boolean = False) As String

    Dim psi As New ProcessStartInfo()
    psi.FileName = distro
    psi.Arguments = "run ""wslpath " & If(slash, "-m", "-w") & " '" & wslPath & "'"""
    psi.RedirectStandardOutput = True
    psi.UseShellExecute = False
    psi.CreateNoWindow = False

    Dim p = Process.Start(psi)
    Dim windowsPath = p.StandardOutput.ReadLine
    p.WaitForExit()

    Return windowsPath

End Function



PowerBuilderのソースファイル(.SRWファイルなど)からコントロールの定義とイベントハンドラを抽出するための正規表現です。

コントロールの定義を抽出する正規表現

type\s{1,}(\S{1,})?([\s\S]*?)end\s{1,}type

イベントハンドラを抽出する正規表現

event\s{1,}(\S{1,})?;([\s\S]*?)end\s{1,}event

$1にコントロール名またはハンドラ名、$2に本体部分が設定されます。

PowerBuilderライブラリファイル(.PBLファイル)から.SRW形式のソースファイルの作り方については、『PowerBuilderのソースファイルをテキスト形式で一括エクスポートするツール』をご覧ください。

PowerBuilderのソースファイル(.SRDファイル)からSQLを抽出するための正規表現です。

試した範囲ではデータソースとして設定されているSQL、PBSELECT(PowerBuilder独自のSQL)ともに抽出できています。
SQLの場合は、複数行にわたるSQLやダブルクォートで囲まれていても抽出ができることを確認しています。

retrieve=(\”[\s\S]*?^(\~\”)?\”|\”\s{0,}PBSELECT.*\”)

retrieve=(\”[\s\S]*?(^(\~\”)?|[\s\w;])\”|\”\s{0,}(?!PBSELECT\s{0,})[\s\S]*?\”|\”\s{0,}PBSELECT.*\”)

※2019/01/22 12:30 抽出できないケースがあることが判明したので、正規表現を修正しました。

PowerBuilderライブラリファイル(.PBLファイル)から.SRD形式のソースファイルの作り方については、『PowerBuilderのソースファイルをテキスト形式で一括エクスポートするツール』をご覧ください。

pbl_exporttool

PowerBuilderのソースファイル(ライブラリ/PBLファイル)は、独自形式のためPowerBuilder IDE上でしか開くことができません。
しかし、PowerBuilderが提供する組み込み関数の中には、ソースファイルの内容を解析し登録されているオブジェクトの一覧を取得したり、本体部分をテキストとして取得したりする機能が含まれているので、中身を取り出しテキスト化すること自体は可能そうです。

今回は、この機能を使ってPBL形式のソースファイルをテキスト形式のソースファイルとして一括エクスポートするツールを作成しました。

Read More

Windows 10上にVB6の開発環境を構築する必要があり作業を行ったのですが、そのときいろいろな問題が発生しました。
インターネット上には、Windows 10へVB6をインストールための様々な情報が公開されていますが、実際に試してみると公開されている情報と違う箇所や端折れる手順などがありました。
今回、実際に行った一連の作業を記事にまとめました。

確認を行った環境

  • Windows 10 Pro Version 1803 (64ビット版)
  • Visual Basic 6.0 Enterprise Edition
    Visual Studioサブスクリプション(https://docs.microsoft.com/ja-jp/visualstudio/subscriptions/ )で提供されているもの

作業の流れ

  • VB6本体のセットアップ
  • VB6サービスパック(SP6)の適用
  • VB6SP6 累積的な更新プログラムの適用
  • VB6の起動とプロジェクトの読み込み

※注意
Visual Basic 6.0は、開発元のMicrosoftのサポートが終了した開発環境です。
最悪の場合、システムやデータに復旧不可能なダメージを与える可能性があります。
実際の導入にあたっては細心の注意を払い、ご自身の責任においてお試し下さい。


Read More

ゲームボーイミクロはとても小さくガジェット好きの心をつかんで離さないゲーム機ですが、ゲームボーイアドバンスSPやDS/3DSシリーズと違い、液晶画面がむき出しの状態なので画面に傷がつかないか常にひやひやします。

もともとは専用の布ポーチが付属しており、持ち運びや保管はポーチに入れて画面を保護するようになっていたのですが、今となっては入手が困難。
じゃあ代わりのものを…と探してみても、ミクロがぴったり収まるサイズのケースというのがなかなか見つからないんですよね。

なかば諦めかけていたのですが…

ついに見つけました!

100円ショップ『ザ・ダイソー』で買い物をしているとき、スマホのアクセサリーを扱うコーナーで「イヤホンケース」なるものを発見。
見た瞬間、その大きさにピーンときました。

ダイソーのイヤホンケース

早速買い求めてミクロを収納してみたところ、「ミクロ用に作ったのではないか!?」と思うくらいピッタリ!
ちょっとピッタリすぎるかなという感じも若干しますが、傷が付いたり塗装が剥げたりすることはなさそうです。

そこそこの強度がありそうな素材で作られているので、カバンの中で”つぶれ”や”こすれ”には強そうです。
試す勇気はありませんが、落下もある程度までは耐えてくれそうな感じがします。

ダイソーのイヤホンケースにミクロを収納した状態

網ポケットの部分にイヤフォンを収納した状態でもきちんとファスナーがしまりました。

IMG_9221

商品名は『イヤホンケース&小物入れ(角形)』、型番は”K-18P-12”、”002”のようです。
色は3色くらいありました。
価格は税別100円です。


Windows 10のWSL向けに最適化されたという触れ込みの新しいLinuxディストリビューション『WLinux』がWindowsストアで公開されました。

さっそく購入してみたのですが、起動した瞬間、いきなりのエラー。
「WslRegisterDistribution failed with error: 0x80070003」と表示され、表示されたメッセージに従いキーを押すと終了してしまいました。
萎えます。

2018-10-02

この現象を回避する方法が分かったので、記述します。

Windowsの設定を開き(Windowsキー + “i”の同時押しが便利です)、[システム]-[ストレージ]-[新しいコンテンツの保存先を変更する]画面で表示される、[新しいアプリの保存先]の設定値を確認してください。

この設定値がCドライブ以外に設定されていると「WslRegisterDistribution failed with error: 0x80070003」と表示されてしまうようです。

「Cドライブ」に変更した後、適用ボタンを押して設定を反映します。

「新しいアプリの保存先」に「Cドライブ」以外を設定した状態でWLinuxをインストールしている場合、いったんWLinuxをアンインストールします。
アンインストールした後、WLinuxを再度インストールを行い起動すると先ほどのようにエラーが表示されず次のフェーズへと進めるようです。

2018-10-02 (1)

お客様から「Excelのメニュー項目の表示が英語になってしまった」と問い合わせをいただきました。

最初は、Excelの設定画面([ファイル]-[オプション]-[言語])で「表示言語の選択」の設定が変わってしまい英語表記になってしまったのかと思ったのですが、現地で調査をしてみるとどうも勝手が違うようです。

ここまでにわかっていること

  • Excelの表記が英語表記になっていた
  • WordやPowerPointは日本語表記のまま
  • Excelの設定は変えていない

マイクロソフトのコミュニティを調べてみると同じような現象の報告がありました。「Excel2016の英語設定を日本語に変更する方法をお教えください。(サーフェスラップトップ)

ここに書かれているようにWindowsの表示言語の設定(設定の[時刻と言語]-[地域と言語]-[言語])などを確認しましたが、Windowsの設定は「日本語」で問題がありません。
Windows Updateもすべて正常に行われているようです。
ダメもとでWindowsに言語を追加してみたり、Windowsの表示言語をいったん日本語以外の言語に切り替えて、日本語に戻してみたりしましたがExcelの表記は英語のままです。

追加でわかったこと

  • Windowsの表示言語の設定は「日本語」
  • Windows Updateはすべて正常に行われている

もう一度マイクロソフトのコミュニティに投稿された情報をよく読むと重要な情報を見つけました。

しかし、ストアアプリ版Officeなので、Windowsの表示言語と連動していて、画像のように、言語を追加できないようになっています。

問題を起こしたパソコンのExcelの設定画面を確認してみると、表示言語を切り替えるための項目が表示されていないことがわかりました。
インストールされているものはストアアプリ版のOfficeのようです。

ちなみに、デスクトップ版Excel 2016の設定画面は下記のような表示になります。
「表示言語の選択」という項目で表示言語とヘルプ言語の設定や、追加の言語リソースの取得(言語パック)ができるようになっています。

スクリーンショット 2018-06-26 0.41.44

さらに、確認をするとネットワークの接続が不安定だったようでインターネットにうまく接続できない状態があったようです。

さらに追加でわかったこと

  • インストールされているOfficeはストアアプリ版
  • ネットワーク接続が不安定だった

Windowsの『ストア』で「ダウンロードと更新」の状況を確認すると、Office系のアプリがダウンロードの途中でエラーになって保留状態になっていました。

保留状態になっているものを手動で更新し、更新が完了したところでExcelを立ち上げてみると…

日本語表記が復活!!

ストアアプリの更新に失敗したのが原因のようです。


パソコンのメーカーや導入した時期なども関係していた

今回の問題が起きたパソコンはデル社製のデスクトップマシンで2018年3月に導入したパソコンだったのですが、ここに落とし穴がありました。

デルのWebサイトで公開されているナレッジベース情報に「Office 2016 プリインストール版 アクティベーション方法(Windows 10)」という項目があります。

ここに以下に引用する記載があります。

    • Windows 10 Fall Creators Update 以降が搭載された PC にプレインストールされた Office 2016 は、Windows 10 ストアアプリ版 Office 2016 がプレインストールされています。
    • Office 2016 の再インストールは、Windows 10 の “Microsoft Store” アプリからインストールします。
    • 再インストールには、インターネット接続と初回セットアップで使用した Microsoft アカウントが必要となります。

導入した時期が2018年3月なので、Fall Creators Updateが適用されたWindows 10 が導入されています。
Fall Creators Updateが適用されたパソコンのプレインストール(PIPC) Office 2016なのでストアアプリ版Officeが導入されていたようです。

ストアアプリ版のOfficeなんてSurfaceだけかと思ったら、ほかのメーカーのパソコンにも入っていたとは…
今回はじめて知りました。


結論

Excelの表記が英語表記になった場合、導入されているOfficeがストアアプリ版かデスクトップ版かをチェックする。
ストアアプリ版の場合、『ストア』の「ダウンロードと更新」の状況を確認し、失敗している場合、ダウンロードと更新のリトライを行う。