PERSONAL.XSLB
Public Type UserRevision
Name As String
Revision As String
End Type
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub auto_open()
' F1キーを殺す
Application.OnKey "{F1}", ""
'キー コード
'Shift +
'Ctrl ^
'Alt %
Application.OnKey "^+c", "CleanCopy"
Application.OnKey "^+v", "PasteValue"
End Sub
' コピー時、末尾にLFがつくのを防ぐ
Sub CleanCopy()
Application.StatusBar = "copied."
' 全ての選択されたセル値をCRLFで結合
Dim val As String
For i = 1 To Selection.Count
If (Len(val) > 0) Then
val = val & vbCrLf
End If
val = val & Selection(i).Value
Next
' 文字列の末尾からすべての改行コードを除く
val = TrimEndNewLine(val)
' クリップボードへ送る
Call Copy_ClipBoard(val)
' Dim cb As New DataObject
' cb.SetText val
' cb.PutInClipboard
' 少し待機してからステータスバーをクリアする
For resonance = 0 To 100
Sleep 10
DoEvents
resonance = resonance + 1
Next
Application.StatusBar = ""
End Sub
Private Sub Copy_ClipBoard(cpy_txt As String)
If True Then
With CreateObject("Forms.TextBox.1")
.MultiLine = True
.Text = cpy_txt
.SelStart = 0
.SelLength = .TextLength
.Copy
End With
Else
Dim CB As New DataObject
With CB
.SetText cpy_txt ''変数のデータをDataObjectに格納する
.PutInClipboard ''DataObjectのデータをクリップボードに格納する
End With
End If
End Sub
' 文字列の末尾からすべての改行コードを除く
Function TrimEndNewLine(文字列 As String) As String
Dim strTmp As String
strTmp = 文字列
Do Until Right(strTmp, 2) <> vbCrLf
strTmp = Left(strTmp, Len(strTmp) - 2)
Loop
Do Until Right(strTmp, 1) <> vbLf
strTmp = Left(strTmp, Len(strTmp) - 1)
Loop
Do Until Right(strTmp, 1) <> vbCr
strTmp = Left(strTmp, Len(strTmp) - 1)
Loop
TrimEndNewLine = strTmp
End Function
' 貼り付け時、結合セル対するエラーを防止する
Sub PasteValue()
Application.StatusBar = "PasteValue"
Dim CB As New DataObject
Dim sel As Range
Set sel = Selection
If Application.CutCopyMode Then
sel.PasteSpecial Paste:=xlPasteFormulasAndNumberFormats
Else
' ペーストの起点を決定
Dim st As Range ' ペースト起点
Set st = sel.Range("A1")
' クリップボードからデータ取得
Dim c_rows As Variant
CB.GetFromClipboard
c_rows = Split(CB.GetText, vbCrLf)
' 処理中の行/列番号
Dim i_row As Integer
i_row = st.Row
Dim i_col As Integer
i_col = st.Column
' ペースト処理
For i = LBound(c_rows) To UBound(c_rows)
Dim c_cols As Variant
c_cols = Split(c_rows(i), vbTab)
For j = LBound(c_cols) To UBound(c_cols)
Dim cell As Range
Set cell = Cells(i_row, i_col)
With cell
.Value = c_cols(j)
i_col = i_col + .MergeArea.Columns.Count
End With
Next j
' 改行
i_col = st.Column
i_row = i_row + Cells(i_row, i_col).MergeArea.Rows.Count
Next i
End If
Application.StatusBar = ""
End Sub
Private Function CONCATENATE2(rTarget As Range, Optional prefix As String = "", Optional suffix As String = "")
Dim sWork As String: sWork = ""
Dim rCell As Range
For Each rCell In rTarget
sWork = sWork + prefix + CStr(rCell.Value) + suffix
Next
CONCATENATE2 = sWork
End Function
Sub SetRedShapeAsDefault()
Set targetSheet = ActiveSheet
' 適当な四角形を描いて「既定の図形に設定」した後消す
' 塗りつぶし=なし
' 線色=赤
' 太さ=2.25
With targetSheet.Shapes.AddShape(Type:=msoShapeRectangle, Left:=1, Top:=1, Width:=100, Height:=100)
.Fill.Visible = False
.Line.ForeColor.RGB = RGB(255, 0, 0)
.Line.Weight = 2.25
.SetShapesDefaultProperties
.Delete
End With
' 適当な線を描いて「既定の線に設定」した後消す
' 線色=赤
' 太さ=3.0
With targetSheet.Shapes.AddLine(BeginX:=1, BeginY:=1, EndX:=100, EndY:=100)
.Line.ForeColor.RGB = RGB(255, 0, 0)
.Line.Weight = 3
.SetShapesDefaultProperties
.Delete
End With
End Sub
WSL2でX11のGUIを動かす設定
現時点では次の通り。
WSL側の設定
DISPLAY環境変数の設定
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
~/.profile とかに書いておく。
Windows側の設定
VcXsrvのインストール
sourceforge.net からダウンロードしてインストール
XLaunchからVcXsrvを起動する。
- Select display settings = Multiple windows
- Select how to start clients = Start no client
- Extra settings = Disable access controlも含めて全てにチェックし、Additional parameters for VcXsrv 欄に「-ac」を入力
Save configuration で設定をデスクトップとかに保存しておくとダブルクリックで設定済みのVcXsrvが起動する。
ファイアウォールの設定
「VcXsrv windows xserver」をプライベート、パブリックともに許可しておく
高解像度PCでアプリのウィンドウが常に画面外に出るとき
新調したノートPCは、スペックと値段の見合いからゲーミングノートにした。 ゲームはやらないけど、プログラミングやDTMには具合が良い。
一部のプログラムが、起動すると常に画面外にいてめんどくさかったのだが、 実行ファイルのプロパティ⇒互換性タブ⇒高DPI設定の変更から 高DPIスケール設定の上書きを「システム」にしたら起動時に画面中央に表示されるようになった。 ちなみに、「システム(拡張)」はメニューの表示がうまくできなかった。
VisualStudio Code の ターミナル に MSYS2 の zsh を使う
settings.jsonに以下のように記述
{ "terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\zsh.exe", "terminal.integrated.env.windows": { "MSYSTEM": "MINGW64", "CHERE_INVOKING": "1", "MSYS2_PATH_TYPE": "inherit" }, "terminal.integrated.shellArgs.windows": [ "--login" ], "terminal.integrated.cursorStyle": "line" }
MSYS2でインストールしたGitは挙動不審なのでGit for Windowsを使用する。 したがって「"MSYS2_PATH_TYPE": "inherit"」は必須。
Xamarinでできたもの
Xamarin勉強してできたものを晒す
1本目
イベント処理がカオス化して手を入れたくない。Prismに手を出すきっかけになった。
2本目
Prism+ReactivePropertyで作成。
起動が遅いのは、どこかでイベントループしてるからな気がする。
画像認識やってみたい(Xamarinで既存のjarやsoを使う)
画像認識やってみたい!!
というわけで調べてみると、こんなのを発見。
なんか簡単そう。 とりあえずお得意のVisualStudioで作ってみよう。 →失敗しました。以下失敗の記録。
もらってくる
上記のページから
をダウンロード
画像辞書をつくる
「画像辞書作成ツールv2 for Windows」をダウンロード・展開して、DatasetCreater.exeを実行。
使い方は上記ページの通り。同梱の Tutorial にも書いてあるが、とても簡単。
プロジェクトの作成
VisualStudioで新規プロジェクトを作成。テンプレートは「Androidアプリ(Xamarin)」の「単一ビューアプリ」を選択。
今回はXamarin.Formsはパス。
jarを参照できるようにする
「画像認識ライブラリv2 for Android」は、jarファイルといくつかのsoファイル(共有ライブラリ)、aファイル(静的ライブラリ)で構成されている。
jarファイルをXamarinで参照できるようにするには、「Androidバインドライブラリ(Xamarin)」を作成するらしい。
少々日本語が不自由だが、jarファイルを追加することはできた。
soファイルは??
soファイルを埋め込む
以下の手順でOK
- 「Androidバインドライブラリ(Xamarin)」プロジェクトの下に、libフォルダを作成する。
- libフォルダに、「画像認識ライブラリv2 for Android」のarmeabiフォルダを中身ごとコピーする。
- VisualStudioで、armeabiフォルダ下の全ファイルについてビルドアクションを「EmbeddedNativeLibrary」に変更する。
ここで、.DS_Store は .thumbnail 的なファイルであるため無視してよい。
.aファイルは通常.soファイルに含まれるためこれも無視してよい。。。はず。
Xamarinからバインドライブラリを使う
「Androidアプリ(Xamarin)」プロジェクトから「Androidバインドライブラリ(Xamarin)」プロジェクトを参照すればOK。
あとは、「画像認識ライブラリVer.2.0 | ギャップロ」のサンプルのように実装すればよい。
バインドライブラリでインターフェイスが自動変換されているためコピペでは動かないが、オブジェクトブラウザでカバーできる。
getXXX が XXX というプロパティになっていたり、someFunc 関数が SomeFunc 関数に変換されている程度の相違しかない。
これは素敵な機能!
ABIを変更する
「画像認識ライブラリv2 for Android」に含まれていたsoファイルは、armeabiにしか対応していない(と思う)。
アーキテクチャがarm64のスマホで実行するとファイルがないエラーが発生する。ちょっとハマった。
CPUアーキテクチャは一般的に下位互換性があるので、対応アーキテクチャをarmeabiに限定しても動くはず。
下図のように「Androidアプリ(Xamarin)」プロジェクトのプロパティから「サポートされているアーキテクチャ」をarmeabiのみに変更する。
x86のエミュレータが使えないのは痛いが、仕方ない。

いざ実行! しかし……

oh....
- .aファイルもEmbeddedNativeLibraryにしてみる
- GPFineRecognizerではなくGPFastRecognizerにしてみる
- 古いNexsus5でデバッグしてみる
等々試してみたが解決せず。 AndroidStudioを立ち上げる元気もないのでとりあえず投げる。
PL/pgSQLで配列の内容を列挙する
for var in select unnest(array) loop raise notice '%', var ; end loop;