So-net無料ブログ作成
検索選択
前の10件 | -

VMWareで仮想シリアルポート同士を接続 [その他]

RS232Cの開発でシリアルポートが必要になったけど、
ノートPCなんでシリアルポートがない。
USB-RS232C変換ケーブルもない。

VMWareのゲストOSにシリアルポートを2個追加して、同じ名前付きパイプを設定すると
仮想PC内のシリアルポート同士で送受信できるようになった。

開発環境のノートPCでは、COM2とCOM3が追加された。
ss001.png
ss002.png

Python 3とwxPythonのインストール [Python]

Pythonでウインドウ画面(GUI)の作成をしてみたくなったのでインストールから始めた。

OSは、Windows 7 Professional SP1 32bit

次のソフトを使用
・Python 3.6.1
・wxPython 4.0.0a1

wxPythonのインストールがややこしいみたいな事を見かけるので身構えていたけど
あっさりとインストールに成功した。

1.Python 3.6.1をダウンロードし、exeを実行する。

2.「Add Python 3.6 to PATH」にチェックを入れる。

3.Pythonのインストールは、「Customize installation」を選択し
C:\Python\Python36-32にインストールした。
チェックは全てデフォルトのまま。

4.wxPythonのインストールはコマンドプロンプトから行った。
コマンドプロンプトを開き次のコマンドを実行
> pip install wxpython
何事もなく成功して終わった。

5.次のコードのファイルを作成し、実行して画面が表示されることを確認して終わり。
test.py(UTF-8 BOM無)
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テスト画面")
frame.Show()
application.MainLoop()

継承したコントロールのTextの初期値を変更する [VB.NET]

Buttonを継承してカスタムコントロール(以下SearchButton)を作成した。
SearchButtonには虫眼鏡のアイコンを設定したけど、ツールボックスから配置すると
TextにSearchButton1と入ってしまう。
別にTextを削除すれば良いのだけど、最初から空白が入れば良いなと思ってコンストラクタで
MyBase.Textに空白を設定したけど空白にならなかった。

調べてみて次のコードで実現できた。
参照:System.Design.dll
Imports System.ComponentModel

Public Class ControlDesignerEx
    Inherits System.Windows.Forms.Design.ControlDesigner

    Public Overrides Sub InitializeNewComponent(ByVal defaultValues As System.Collections.IDictionary)
        MyBase.InitializeNewComponent(defaultValues)
        Me.Control.Text = ""
    End Sub
End Class

<Designer(GetType(ControlDesignerEx))>
Public Class SearchButton
    Inherits Button

    Public Sub New()
        MyBase.New()
        MyBase.Image = UserCtrl.My.Resources.Resources.SearchIcon
    End Sub
End Class


Androidのタブレットをサブディスプレイにする [Android]

Androidのタブレットを、サブディスプレイにしてみた。
USBで接続してサブディスプレイにするソフトは、いくつかあるみたいだけど
次の環境で試してみた。

PC側の環境
OS: Windows 7 Professional SP1 32ビット
ソフト: Mirror-DTC for Windows

Android側の環境
端末: ZenPad 3 8.0 (解像度: 2048x1536)
OS: Android 6.0
ソフト: Mirror-DTC for Android

PC側で問題だったのが、接続されていないサブディスプレイを認識させる必要があったので
コントロールパネルの"ディスプレイの設定の変更"にある、"プロジェクターへの接続"で"拡張"を選択し
サブディスプレイを表示させた。
(解像度が1280x720で固定されていた)

PC側は、WiFiのアクセスポイントの設定をして、Androidタブレットから接続した。
参考URL
http://www.akakagemaru.info/port/internet-softap.html

これらの設定を行って上のMirror-DTCを使うとサブディスプレイとして、
Androidタブレットを使用することが出来た。
Android側のMirror-DTCの設定は、ディスプレイ2を表示して、モニターモードで動作させた。
サブディスプレイでYouTubeを再生させてみたけど、目立った遅延もなく再生できた。

でも、Androidタブレットの解像度が大きすぎて字が小さくて、ちょっと見にくい・・・
それに、Androidタブレット(4:3)とPCサブディスプレイ(16:9)の比率が合っていない・・・

そこで、VGAの仮想ドライバがあれば良いな。と思って探してみたけど、(ZoneScreen とか MaxiVista とか)
画面転送の機能まであったりするので、別の方法を考えてみた。

その方法が、PC側のVGAコネクタに、ダミーのVGAコネクタを接続する!です。
ダミーVGAコネクタを接続することで、PC側はモニターが接続されていると認識し、
解像度も好きに変更が出来ます。

早速、電子部品を購入してダミーVGAコネクタを作ってみた。
・D-Sub 15ピン(3列、オス) (ミニ)コネクタ x1個
・D-Sub 9ピン カバー x1個(D-Sub15ピンの3列は、9ピンのカバーを使用)
・抵抗 1/4W 75Ω x3本

(抵抗を付けるのに、半田つけをしたので、半田と半田ごてを使いました。)

D-Sub 15ピンの1番-6番、2番-7番、3番-8番を75Ωの抵抗で接続する。
カバーを取り付けて完成!

参考URL
http://blog.hogehoge.com/2011/03/androidpc.html
http://www.geeks3d.com/20091230/vga-hack-how-to-make-a-vga-dummy-plug/

出来たダミーVGAコネクタをPCにつなぐと、
800x600~1920x1200までの解像度を選択することが出来た!

AVD Managerでエミュレータが起動しない [Android]

Android Studioでサンプルプロジェクトをとりあえず動作させようとしたけど
エミュレータが起動しなかったのでメモ。

参考URL
http://codezine.jp/article/detail/9341

AVD Managerでデバイスを作成したのは良いけど、端末の画面が表示されて進まなくなった。
デバイスの設定で"Show Advanced Settings"のボタンを押して詳細設定を開く。
"Memory and Storage"のRAMの設定値を512MBに変更して、エミュレータを起動すると
端末が動作した!

サンプルプロジェクト(Hello World!!)も動いた!

まとめると、このパソコンのメモリ足りてない!

Android Studioのエラー(CreateProcess error=216) [Android]

Android Studio 2.2.2をインストールしたときの、つまづいたエラーのメモ。

PCの環境とかは次のとおり。
OS: Windows 7 Professional SP1 32ビット
JDK: Java SE Development Kit 8u111/Windows x86
Android Studioは、日本語化済み。

JDK、Android Studioともにインストールは正常に終了。
早速、プロジェクトを新規作成して・・・としたところで次のエラーが発生した。
CreateProcess error=216, このバージョンの %1 は、実行中の Windows のバージョンと互換性がありません。コンピューターのシステム情報を確認して、プログラムの x86 (32 ビット) のバージョンと x64 (64 ビット) のバージョンのどちらが必要か確認してから、ソフトウェアの発行元に問い合わせてください。

色々調べると、OSが32ビットなのに64ビットで使おうとしてるんじゃない?てきなことらしい。
解決方法が、メニューの[ファイル]-[プロジェクト構造]を開いて
プロジェクト構造.png
JDK Locationの"Use embedded JDK(recommended)"のチェックを外して
インストールしたJDKのパスを設定する。

これで大丈夫だろ。と思ったら次のエラーが発生した。
Unable to start the daemon process.
This problem might be caused by incorrect configuration of the daemon.
For example, an unrecognized jvm option is used.
Please refer to the user guide chapter on the daemon at https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html
Please read the following process output to find out more:
-----------------------
Error occurred during initialization of VM
Could not reserve enough space for 1572864KB object heap

簡単に言うとメモリ足りてない!ってことらしい。
解決方法は、プロジェクトを開いて、[Gradle Scripts]-[gradle.properties]ファイルを開く。
gradle.properties.png
org.gradle.jvmargsの設定を次にように変更して保存する。
org.gradle.jvmargs=-Xms512m -Xmx1024m

とりあえず、これでAndroid Studioを再起動して、プロジェクトを開き直したらエラーが全部解決できた。

未使用のシリアルポート(COMポート)の削除 [その他]

USBのシリアル変換を使用して、いろいろな機器と接続していると
なんだかんだで、COMポートが増えていた。
COM1がずっと使用状態になって、割り当てできなかったりと不便だったので
次の方法で未使用のCOMポートを削除した。

コマンドプロンプトを管理者として実行して
次のコマンドを実行するとデバイスマネージャが開くので

set devmgr_show_nonpresent_devices=1
start devmgmt.msc

メニューの[表示]-[非表示のデバイスの表示]を押すと、現在使用していないデバイスが表示される。

デバイスマネージャのポートのツリーを開いて現在使用していないポートを右クリックして削除する。
このとき、ドライバーソフトウェアは削除しない。

参考URL
Windowsで増えすぎた未使用COMポートを削除する方法
http://airvariable.asablo.jp/blog/2013/02/24/6730209

Jsonファイルの読込み、書込み [VB.NET]

データを保存したり、マスターデータを読み込んだりしたいときは
CSVでデータファイルを作っていたのを、Jsonファイルにしてみた。

Jsonファイルの読み書きは、DataContractJsonSerializerを使用すれば簡単に使える。
Jsonファイルの内容をクラスとして扱える(シリアル化、逆シリアル化)ようになる。
使用するには、参照で System.Runtime.Serialization を追加する。

Dim trend As New TrendGroup

'TrendGroup.jsonを読み込んで、TrendGroupクラスにデータを格納する。
Util.ReadJson(Of TrendGroup)("C:\TrendGroup.json", trend)

'何か処理

'TrendGroupクラスのデータをTrendGroup.jsonに保存する。
Util.WriteJson(Of TrendGroup)("C:\TrendGroup.json", trend)

ファイル名:Util.vb
Imports System.Runtime.Serialization.Json

Public Class Util

    ''' <summary>
    ''' JSONファイルの書込
    ''' </summary>
    ''' <typeparam name="T"></typeparam>
    ''' <param name="path"></param>
    ''' <param name="target"></param>
    ''' <returns></returns>
    Public Shared Function WriteJson(Of T)(path As String, ByRef target As T) As Boolean

        Dim encUTF8 As System.Text.Encoding = New System.Text.UTF8Encoding(False)
        Dim resValue As Boolean = True
        Dim memory As New IO.MemoryStream
        Try
            'クラスのデータをJSON形式に変換(シリアル化)
            Dim serializer As New DataContractJsonSerializer(GetType(T))
            serializer.WriteObject(memory, target)
            Dim json As String = encUTF8.GetString(memory.ToArray())
            'データの書込
            Dim writer As New IO.StreamWriter(path, False, encUTF8)
            Try
                writer.Write(json)
            Catch ex As Exception
                resValue = False
            Finally
                writer.Close()
            End Try
        Catch ex As Exception
            resValue = False
        Finally
            memory.Close()
        End Try

        Return resValue

    End Function

    ''' <summary>
    ''' JSONファイルの読込
    ''' </summary>
    ''' <typeparam name="T"></typeparam>
    ''' <param name="path"></param>
    ''' <param name="target"></param>
    ''' <returns></returns>
    Public Shared Function ReadJson(Of T)(ByVal path As String, ByRef target As T) As Boolean

        Dim encUTF8 As System.Text.Encoding = New System.Text.UTF8Encoding(False)
        Dim resValue As Boolean = True
        Dim reader As New IO.StreamReader(path, encUTF8)
        Try
            'データの読込
            Dim json As String = reader.ReadToEnd()
            Dim memory As New IO.MemoryStream(encUTF8.GetBytes(json))
            Try
                'JSON形式のデータをクラスに変換(逆シリアル化)
                Dim serializer As New DataContractJsonSerializer(GetType(T))
                target = DirectCast(serializer.ReadObject(memory), T)
            Catch ex As Exception
                resValue = False
            Finally
                memory.Close()
            End Try
        Catch ex As Exception
            resValue = False
        Finally
            reader.Close()
        End Try

        Return resValue

    End Function

End Class


Order:=0とか付けておくと、保存したときにOrderの順番で保存される。
付けないとアルファベット順に保存される。(順番は読み書きするには問題ないけど)
ファイル名:TrendGroup.vb
Imports System.Runtime.Serialization.Json

<DataContract()>
Public Class TrendGroup

    <DataContract()>
    Public Class Axis
        <DataMember(Order:=0)> Public Property Minimum As Double
        <DataMember(Order:=1)> Public Property Maximum As Double
        <DataMember(Order:=2)> Public Property Interval As Double
    End Class

    <DataContract()>
    Public Class Trend
        <DataMember(Order:=0)> Public Property TrendNo As Integer
        <DataMember(Order:=1)> Public Property AxisType As Integer
        <DataMember(Order:=2)> Public Property LineColor As Integer
    End Class

    <DataContract()>
    Public Class Member
        <DataMember(Order:=0)> Public Property GroupNo As Integer
        <DataMember(Order:=1)> Public Property GroupName As String
        <DataMember(Order:=2)> Public Property Axis1 As Axis
        <DataMember(Order:=3)> Public Property Axis2 As Axis
        <DataMember(Order:=4)> Public Property Trend As Trend()
    End Class

    <DataMember(Order:=0)> Public Property TrendGroup As Member()

End Class


Jsonファイルを書き込むと、整形しないと見づらくなるので整形用ツールを用意しておくと便利。
Jsonファイルは、UTF-8(BOMなし)で保存する。
ファイル名:TrendGroup.json
{
    "TrendGroup": [
        {
            "GroupNo": 1,
            "GroupName": "グループNo1",
            "Axis1": {
                "Minimum": -30,
                "Maximum": 30,
                "Interval": 5
            },
            "Axis2": {
                "Minimum": 0,
                "Maximum": 100,
                "Interval": 5
            },
            "Trend": [
                {
                    "TrendNo": 1,
                    "AxisType": 0,
                    "LineColor": -65536
                },
                {
                    "TrendNo": 2,
                    "AxisType": 0,
                    "LineColor": -23296
                },
                {
                    "TrendNo": 3,
                    "AxisType": 1,
                    "LineColor": -256
                }
            ]
        },
        {
            "GroupNo": 2,
            "GroupName": "グループNo2",
            "Axis1": {
                "Minimum": 0,
                "Maximum": 60,
                "Interval": 5
            },
            "Axis2": {
                "Minimum": 0,
                "Maximum": 100,
                "Interval": 5
            },
            "Trend": [
                {
                    "TrendNo": 4,
                    "AxisType": 0,
                    "LineColor": -65536
                },
                {
                    "TrendNo": 5,
                    "AxisType": 0,
                    "LineColor": -23296
                },
                {
                    "TrendNo": 6,
                    "AxisType": 1,
                    "LineColor": -256
                }
            ]
        }
    ]
}

WinMergeのJSONプラグインを作成してみた [その他]

JSONファイルが何かと便利!と色々使ってみてるけど、
元データとの比較が面倒だったりしたのでWinMergeのJSONプラグインを作成したときのメモ。

JSONファイルを整形して比較する。
整形には、JavaScriptのJSONを使用する。
WinMergeのプラグインは、VBScriptで作成されている。
WinMergeのプラグインで、JavaScriptは動くのか?(動いた!)
でも、JSONを使用すると「'JSON' は宣言されていません」と出る。
json2.jsを使用すれば出来た!

json2.js
https://github.com/douglascrockford/JSON-js

作成したプラグインと、json2.jsをMergePluginsフォルダに入れます。

ファイル名:CompareJsonFiles.sct
<scriptlet>

<implements type="Automation" id="dispatcher">
	<property name="PluginEvent">
		<get/>
	</property>
	<property name="PluginDescription">
		<get/>
	</property>
	<property name="PluginFileFilters">
		<get/>
	</property>
	<property name="PluginIsAutomatic">
		<get/>
	</property>
	<method name="UnpackFile"/>
	<method name="PackFile"/>
</implements>

<script language="JavaScript" src="json2.js"></script>
<script language="JavaScript">
function getJson(filename) {
	return jsonParse(adoLoadText(filename, "utf-8"));
}
function jsonParse(text) {
	try {
		var obj = JSON.parse(text); 
		return JSON.stringify(obj, null, "    ");
	} catch(e) {
		return e.message;
	}
}
function adoLoadText(filename, charset) {
	var stream, text;
	stream = new ActiveXObject("ADODB.Stream");
	stream.type = 2;
	stream.charset = charset;
	stream.open();
	stream.loadFromFile(filename);
	text = stream.readText(-1);
	stream.close();
	return text;
}
</script>

<script language="VBS">

Option Explicit

Function get_PluginEvent()
	get_PluginEvent = "FILE_PACK_UNPACK"
End Function

Function get_PluginDescription()
	get_PluginDescription = "Json形式のファイルを整形し比較をする。"
End Function

Function get_PluginFileFilters()
	get_PluginFileFilters = "\.json$"
End Function

Function get_PluginIsAutomatic()
	get_PluginIsAutomatic = True
End Function

Function UnpackFile(fileSrc, fileDst, pbChanged, pSubcode)
	Dim fso
	Dim foDst
	
	Set fso = CreateObject("Scripting.FileSystemObject")
	
	Set foDst = fso.OpenTextFile(fileDst, 2, True)
	foDst.Write(getJson(fileSrc))
	foDst.Close
	
	Set foDst = Nothing
	Set fso = Nothing
	
	pbChanged = True
	pSubcode = 0
	UnpackFile = True
End Function

Function PackFile(fileSrc, fileDst, pbChanged, pSubcode)
	PackFile = False
End Function

</script>
</scriptlet>


WinMergeのプラグインは、JavaScriptでも良いんじゃないのかな?

DataGridViewの選択行を元の行に戻す [VB.NET]

DataGridViewでDataSourceを設定すると選択行が先頭行になる。
選択行を覚えておき、元の位置に戻すプログラムのメモ。
'現在選択している行を取得
Dim rowFirst As Integer = 0
Dim rowCurrent As Integer = 0
If DataGridView1.CurrentCell IsNot Nothing Then
    rowFirst = DataGridView1.FirstDisplayedScrollingRowIndex
    rowCurrent = DataGridView1.CurrentCell.RowIndex
End If

DataGridView1.DataSource = dt

'選択していた行へ復旧
If DataGridView1.CurrentCell IsNot Nothing Then
    DataGridView1.FirstDisplayedScrollingRowIndex = rowFirst
    DataGridView1.CurrentCell = DataGridView1(0, rowCurrent)
End If

前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。