[Visual Studio Code][c#] 埋め込みリソース

アイコンは外部ファイル読み込みではなく埋め込みたい

Visual Studio 2019ではなく、Visual Studio Codeで書くという縛りを設けているのだが、早速ハマったことがあり解決したのでログとして残しておく。

宇宙最強のIDEであるVisual Studio様で開発していると、GUIパーツの埋め込みリソース周りはほぼノーコードで実装できてしまう。自動的に.resx, .resourcesなどの生成とビルド時オプションの指定?なのか、それすらわからんというか意識したこともない。今回はexeのアイコン画像の指定(全く苦労しなかった)と、タスクバーアイコンの画像指定(MSのexampleを見つけられなかった && 情報が古いのか.net coreと.net frameworkでの差異なのかなんなのか && 嘘800 で時間使った)について。

vscode_image

.exe(とWindowsFormsタイトルのアイコン)

.exe(とWindowsFormsタイトルのアイコン)のアイコン指定は簡単だ。今回はプロジェクトディレクトリに"resources"というディレクトリを作成し、そこに"camera_icon.ico"というアイコン画像を配置している。埋め込みではなく単純にビルド時に出力したいと言うなら、画像の.gitkeepのように書けば出力される。

プロジェクトファイルに下記を追加する。

  <PropertyGroup>
    <ApplicationIcon>resources\camera_icon.ico</ApplicationIcon>
  </PropertyGroup>

これだけである。

exe_icon

タスクバーアイコン

検索の仕方が悪いのか、そもそもc#使いはVisual Studioを使わない理由が無いからなのか。調べるのに時間がかかった。上と同じ画像ファイルをタスクバーアイコンに設定する。

プロジェクトファイルに下記を追加する。

  <ItemGroup>
    <EmbeddedResource Include="resources\camera_icon.ico" LogicalName="camera_icon.ico" />
  </ItemGroup>

読み込みはこう。

        private void InitializeComponent()
        {
            ...

            // icon
            icon = new NotifyIcon();
            icon.Visible = true;
            icon.Text = Utility.Concat(settings.ApplicationTitle, " ", settings.ApplicationVersion);
            // ここ!!!
            var asm = Assembly.GetEntryAssembly();
            using var stream = asm.GetManifestResourceStream("camera_icon.ico");
            icon.Icon = new Icon(stream);

            ...
        }

System.IO.Streamで返ってくるので、埋め込みまくって何にでも使えるんじゃないじゃろか。

taskbar_icon

おわり

画面キャプチャツールをまた作ろうかなと

はじめに

史上最速でスクショがとれるワザ!「[Windows]+[Shift]+[S]」って知ってる?

こんなエントリがちょっと前にバズってました。私はSI時代、エビデンス(大爆笑)とかいうものを作る奴隷業に精を出していました。「目標をセンターに入れてクリック……目標をセンターに入れてクリック……」と死んだ目をしつつ Alt & PrintScreen → ペイントにペーストして保存。そんな想い出とともに、自身が使っているツールを思い出したのです。

CapImage2

カメラのアイコン

今考えると意味がわからないソフトウェア名なのですが、Shift & PrintScreen(など)で画面のビットマップコピーを取得すると同時に、指定ディレクトリにファイルを生成するツールです。Bitmap/PNGの画質、キーアサイン、出力ディレクトリの指定、くらいの項目は設定ファイルで変更できるようにしていた。ただ、activeなwindowではなく常に画面全体をキャプチャするので用途が限られていたのでした。

config_and_readme

よーし、これ改良してactiveなwindowを選択してキャプチャ出来るようにして、尚且つクリップボードのデータも取っちゃうぞ!などと意気揚々とプロジェクトディレクトリを開こうと思ったのですが、無いのです。VS2015なのか2013なのか思い出せませんがソリューションが。プロジェクトが。ソースコードが。

PS C:\> Get-ChildItem e:\ "capimage2.*" -Recurse

    ディレクトリ: E:\Application

Mode                LastWriteTime         Length Name                                                                                                                                         
----                -------------         ------ ----                                                                                                                                         
d-----       2014/10/18     15:40                CapImage2                                                                                                                                    

    ディレクトリ: E:\Application\CapImage2

Mode                LastWriteTime         Length Name                                                                                                                                         
----                -------------         ------ ----                                                                                                                                         
-a----       2015/01/13     22:31          20992 CapImage2.exe 

えー、Windowsの常駐ソフトウェアとか作り方微塵も覚えてないし、一番苦労したのは確かアイコン画像を自分で書いたんだよこれ!みたいな。

そこで

せっかくgolang勉強しようと思ってるし何作っていいかわからんしRaspberry Pi Zeroはなんか俺がやりたいと思っていることを尽く潰してくれやがるしってんで丁度いいかなと思い検索してみたのだが。golangとWindows GUIは超絶相性悪いというか、そんなもん作りたいやつが学ばないというかぶっちゃけ修羅の道なので断念した(なんかWindowsService作ってる人は何人かいたし海外だとわざわざgoからWin32API直叩きしてる人もいた……)。

.net coreでコンフィグや画面出力する部分はWebView2で作ることにした。WebView2の.net core GAまだー?

今一番面白い漫画は推しの子だよね(書き直してgistで貼り直した)

ルビー(星野瑠美衣)

仕事の話。何故か誰も書かないはずなのにrubyで動いているバッチがあり、それの改修を行おうとした。謎っぽい部分があって自宅PC環境にもrubyの環境を作った。適当に書いていたら狂ったように警告が出まくるので発狂しそうになったが、まあそんなもんだろう。言語というかプラットフォームが異なるというのは、異国に立ち入ることと同義だ。我々は旅人であり、立ち入った地の掟に従うべきである。「変数名をsnake caseにしろ!」「インデントはspace2charにしろ!」「3.0だかで文字列はイミュータブルにうんたらかんたら!」もう無理、狂いそう。

# rubocop:disable all

ハイ解決。「ヒャッハー!原住民は黙れ!黙れええい!」万が一検索で引っかかって見ている方がいるかも知れないので書きますが、 マジでrubyを習得したい人はやっちゃダメです

ほんとどいつもこいつもVisual Studio様(& C#)の爪の垢を煎じて飲め。※C#は言語自体がIDEを前提に考えられているので酷な物言いなのだが。

でだ、なんとrubyさん、boolで返ってくるような文字列の数値判定がないらしいのだ。PHPではis_numeric, ctype_digitなど。C#ではTryParse, String.All(char.IsDigit)など。まあこのあたりも毎度毎度で要件を完全に満たさないので改良してオレオレメソッド作ったりするのだけど。しかし、こんなもんに正規表現使いたくないぞ。rubyって正規表現速いのかな?知らんが。regex = 遅いという認識なので、どうしても必要がある場合以外は極力使いたくない。

で、rubyのcsv出力なのだが、文字列はダブルクオートで囲い、数値はそのまま出力したいのだが無いの。無いのよ。設定が。force_quotes:trueだと数値も囲っちゃうの。会社PCのrubyバージョンなのかな?と思ったがそうではないみたいなのね。

で、調べまくったが皆さん正規表現なのよなー。キャストして例外吐いたらfalseみたいな判別もあって笑ったけど、え?笑い事じゃない?

(20201031 すべて書き直したのを下に)

csvの中身

"Nier",100,"かぐや様",0050,-150,"回天剣舞六連","1.52",+1500,"2020-10-30","栗花落カナヲ"
"Nier",100,"かぐや様",0050,-150,"回天剣舞六連","1.52",+1500,"2020-10-30","栗花落カナヲ"
...

要件(データを取得するqueryでCOALESCE使うのでNULLは入ってこないしuintなので負の数もない)はクリアしているし特にアイデアもないのだけど、rubyメインの人はここらへん全てを正規表現でやってるんじゃろか。俺のググらびりてぃが低い?

続きを読む "今一番面白い漫画は推しの子だよね(書き直してgistで貼り直した)"

修正しました。てへぺろ

というわけでgolangの勉強を再開したのだが、

package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello")
    fmt.Println("Raspberry Piでも動くかな?Windowsも!")
}
$Env:GOOS = "linux"; $Env:GOARCH = "arm"; $Env:GOARM=6; go build -o hello_rp hello.go

golang

明日からバリバリ書くけど眠いから寝る。とベッドに入って思った。ナチュラルにARMでビルドしたけど、そもそもラズパイってARMじゃん。なんで.net coreでlinux-x86とか言ってんの?!?!で、試した。

using System;

namespace RpTest {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("Hello .net core 3.1!");
            Console.WriteLine("System.Environment.Version : " + System.Environment.Version);
            Console.Read();
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration>Release</Configuration>
    <Platform>Any CPU</Platform>
    <PublishDir>bin\Release\netcoreapp3.1\publish\</PublishDir>
    <PublishProtocol>FileSystem</PublishProtocol>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RuntimeIdentifier>linux-arm</RuntimeIdentifier>
    <SelfContained>true</SelfContained>
    <PublishSingleFile>True</PublishSingleFile>
    <PublishTrimmed>False</PublishTrimmed>
  </PropertyGroup>
</Project>

ARM32がない……?(ちなみに手書きで強制的にarm32に書き換えてもエラー) OS自体に.net coreをインストールする方法は腐るほど出てくるのだけど、クロスコンパイルに関してはARMの情報は探さないとないかー。

言い訳させていただくと、前回の記事にあるようにラズパイ関連のプログラミングエントリを検索すると、ぱいそんだらけだったので「公式以外見るの止めた!」となり、なんか変な誤解というか脳がバグって先のエントリみたいな勘違いをしてしまった模様。酒飲んでないのに。むしろ酔拳効果がないとも言える。(断酒開始から4週経過)

追記

こいつかー

Note: All models of generation 1 and Pi Zero are not supported because the .NET Core JIT depends on armv7 instructions not available on those versions.

ラズパイを捨てろ!(捨てません)

生殺与奪の権を他人に握らせるな!

Raspberry Pi Zero WH 買った
昨日こんなエントリを書いて、どのようにラズパイを使っていくかなどを考えつつ調べていた。が、尽く踏みにじられてしまった。

音系のプログラミングやりたい -> NAudioを前からやってみたかったしな -> あれ?ZeroはWin10 IOT入らないみたいだぞ -> 仕方がないからとりあえずasp.net coreでkestrelでも立てて動かすか -> んんん?targetにLinux x86ないぞ? -> \(^o^)/ ※追記参照(2020-1-27)

よく調べてから買えよ、としか言えないのだが。NAudioはよく見たらMicrosoft.Win32に依存してるって書いてあるしWin10 IOTはWin10じゃねえし……。まあ、せっかく買ったしあがきまくることにした。

折れるような鈍を作ったあの子が悪いのや

で、"Raspberry Pi プログラミング"で検索しまくったのだが、まー次から次へとぱいそんぱいそんぱいそん……死ねこら!近寄るな!これなー、派遣のエージェントにも言われたし友人にも一度だけ言われたのだけど、ぱいそんなー。インデントがゲロ吐くくらいキモいとか、亀みたいに遅いとか、MLって言ったってnativeライブラリに対するラッパーがあるだけじゃんとかetcetc...は死ぬほどどうでもよくて、俺は!爬虫類が!大嫌いなんだ!昔々、まだこんなにどこもかしこもぱいそんぱいそん言われる前の新宿紀伊国屋書店。オライリー本を手にとった俺は股関節が攣ったね。

閑話休題。で、調べてみるとgolangにgobotというIOTフレームワークがあり、斜め読みした感じだとGPIOなども散見されたのでいけるかなと。音周りのライブラリには全く期待できないが、最悪WAVのcreate&playくらいは出来んだろ、と。学習途中で.net coreに魅入られてしまったので離れていたが、おべんきょうの再開ということで。

頑張れ!人は心が原動力だから 心はどこまでも強くなれる!

で、.net coreの場合だとWindowsでコード書いて、そのままLinux-x64向けにビルドして実行ファイルのみsftpでlinuxに配置して実行、ってのが可能だったのだがgolangではそうはいかないだろうからsamba立ててファイル共有までしました。今日はおわり。

追記(2020-10-26)

マジかよ。クロスコンパイルしまくりんぐじゃないですか。

https://qiita.com/Jxck_/items/02185f51162e92759ebe

追記(2020-10-27)

壮大な勘違いをしていた。なぜにラズパイがx86なのか。次のエントリで修正しました。

修正しました。てへぺろ