技術メモ、Tips、忘備録

技術系のメモ、試してみたこと、その他

【Windows Terminal】右下にキャラクターを表示させる【海外でよくある】

どんなやつ?

こんなやつです。
f:id:monkey999por:20201023170852p:plain

1.画像の用意

まずは透過画像の用意です。Transparent animeとかでググるといいでしょう。
わたしはここを使わせていただきましたm(__)m

こんな感じでいくつかダウンロード!
上記のサイトからダウンロードする場合、リサイズして200pxくらいがちょうどいいです。
f:id:monkey999por:20201023171627p:plain

2.setting.jsonの書き換え

以下のように書き換えます。透過率は0~1の間でいじってみてください。

// ファイルのパス。使用可能な拡張子は`.jpg`、`.png`、`.gif `。
"backgroundImage": "%USERPROFILE%\\Documents\\my_contents\\Transparent_image_with_wt\\item\\1.png",

// 背景画像のストレッチ モード。元の画像をそのままのサイズで使用
"backgroundImageStretchMode": "none",

// 背景画像の配置。右下
"backgroundImageAlignment": "bottomRight",

// 背景画像の不透明度。0~1の間で設定。0に近いほど透明。
"backgroundImageOpacity": 0.8

そして起動。完成です。

3.表示する画像をランダムにしてみる

ここまでの内容だと画像が固定されてしまっているので、ちょっとつまらないです。ランダムにしてあげましょう。
調べてみた感じwindows terminalにそのような設定は無さそうだったので、ちょっと工夫します。

仕組み

1.読み込み先の画像パスを固定

"backgroundImage": "%USERPROFILE%\\Documents\\my_contents\\Transparent_image_with_wt\\main.png",

2.以下のようなバッチを用意。 ※2020/10/24追記..実行時に画面に文字が出ないように修正

@chcp 65001 > nul
@pushd %~dp0

@rem windows terminalが読み込む画像パスにランダムで画像を配置する

@set /a n=0
@for  %%A in (..\Transparent_image_with_wt\item\*) do @if exist %%A ( @set /a n=n+1 )

@rem 最初のランダムは使えない
@echo %RANDOM% > nul

@set /a R=(%RANDOM%*%n%/32768)+1

@copy /Y ..\Transparent_image_with_wt\item\%R%.png ..\Transparent_image_with_wt\main.png > nul

@wt

3.上記のバッチにパスを通す
4.windows terminalを起動するとき、はwin+rでランチャー起動⇒作成したバッチファイル名を入力しエンター。

何回か試してみます。
f:id:monkey999por:20201023175024p:plain
f:id:monkey999por:20201023175059p:plain
f:id:monkey999por:20201023175344p:plain

まだ画像が少ないんでかぶる率も高いですが、動作はOKですね!
あとは起動時に一瞬コマンドプロンプトが表示されるのが少し嫌ですが、まあ良しとしましょう。
読んでいただきありがとうございました。

参考

Anime transparent background PNG cliparts free download | HiClipart
Windows ターミナル プロファイルの設定 | Microsoft Docs

【効率的にググる】Chromeの検索窓から、amazonやgithubの検索エンジンを使用するショートカット

前置き

私もついさっき知りました。タイトルのような便利な機能があったなんてまったく知らなかった。。
サクッとやり方だけ説明します。

使い方

例: amazomで検索する場合

  1. Google Chromeを開く
  2. 左上の検索欄にamazon.co.jpと入力後、Tabキーを押す
  3. 以下のような表記になるので、調べたいワードを入力してエンター。
    f:id:monkey999por:20201012122500p:plain
    検索窓
  4. 試しにこたつで検索すると、amazonの検索結果が表示されます。
    めっちゃくちゃ簡単かつ便利な機能ですね!
    f:id:monkey999por:20201012123128p:plain
    Amazon検索結果 - こたつ

利用可能な検索エンジンについて

chrome://settings/searchEnginesに定義されているものが検索可能なようです。
私の場合はこんな感じです。
f:id:monkey999por:20201012124019p:plain
キーワードChromeの検索窓に入力する文字で、クエリURLが実際にリクエストするURLのようですね。

ほかの例だと、例えば、
Github.com
  ⇒ Githubでプロジェクト検索
translate.google.com
  ⇒ 入力した文字をGoogle翻訳の翻訳結果を表示
youtube.com
  ⇒ youtubeで動画を検索

となります。

以上になります。
読んでいただきありがとうございました。

参考

Set your default search engine - Computer - Google Chrome Help
Chrome のキーボード ショートカット - パソコン - Google Chrome ヘルプ

【Windows Terminal】起動時のシェルをWSL2(またはその他のシェル)に変更する

2020/10/23 追記

以下の記事は誤りです。(正確には誤りではないですが、やり方としては正しくないです。)追記した以下の内容が正しいです。
タイトルのことはWindows ターミナルのグローバル設定 | Microsoft Docsに記載の方法でできます。
私の場合はUbuntuにしたかったので、setting.json"defaultProfile"をwsl2のguidに変更します。
ドキュメントをちゃんと読まないとダメですね。

前置き

タイトルの通りです。使ってますか?Windows Terminal

こんな風にいろんなシェルをペインで分けて使ったり、プロンプトを好きにカスタマイズしたりして使う、軽量なシェルクライアントです。

f:id:monkey999por:20201006161330p:plain
https://docs.microsoft.com/ja-jp/windows/terminal/

今回はそのWindows Terminalでデフォルトで起動されるシェルを変更します。

設定(Json)

Windows Terminalは設定にjsonを使います。開発者向けのツールだけありますね。
(ちなみに最初設定の開き方で迷いました。cmd.exeとかだと左上を右クリックなんですけ。これはタブバーにあるマークから開けます)

ここに設定方法が書いてありますが、少しわかりづらかったのでこうして記事にしました。
結論から書くと、こんな感じでデフォルトの起動するシェルを変えられます。以下はwslを起動しています。

"defaults":
{
    // SETTINGS TO APPLY TO ALL PROFILES
    // "commandline": "例: cmd.exe"
    "commandline": "wsl"
},
"list":
[
    // PROFILE OBJECTS
]

余談(よくわからなかったこと)

MS Docs見ると、こんな感じの説明がされてたんですが、

コマンド ライン
これは、プロファイルで使用される実行可能ファイルです。
プロパティ名: commandline
必須かどうか: オプション
受け入れ可能: 実行可能ファイル名を表す文字列
既定値: "cmd.exe"

【Python】「間違えようのないやり方が、一つだけある」という考え方

先日、 言語設計者たちが考えること (THEORY/IN/PRACTICE) | Federico Biancuzzi, Shane Warden, 伊藤 真浩, 頃末 和義, 佐藤 嘉一, 鈴木 幸敏, 村上 雅章 |本 | 通販 | Amazonという本を読みました。

数多く存在するプログラミング言語、その言語の設計者たちが何を考え、どんな目標をもって取り組んでいるのかということがインタビュー形式で読める書籍となっています。
この本の中で、Pythonの生みの親であるGuido van Rossumu氏の「間違えようのないやり方が、一つだけある」という考え方が非常に良いものだと思ったので記事に残しておきたいと思いました。

私自身Pythonはやったことがないのですが、Pythonの設計として上記の考え方は非常に重要視されています。
プログラムって書ければいいというだけにはいきません。むしろ他人が書いたものを読むことの方が圧倒的に多いです。
そこで目的を達成するための方法が一つに絞られる、というこの考え方は、読む側にとって非常にありがたいものです。

言語レベルで手法が標準化されているのはありがたいですね~
そのうちPython触ってみたいですね

【WSL2】wsl2のインストールで0x80370102 エラーが出たときの対処方法【HP】

Windows 10でwsl2をインストールするときに一発でうまくいかなかった部分の対応をメモしときます。
以下の手順で進めました。
Install Windows Subsystem for Linux (WSL) on Windows 10 | Microsoft Docs

MS StoreでUbuntuをインストールし起動すると、以下のエラーが起こりました。

WslRegisterDistribution failed with error: 0x80370102 

手順にもある通り、コンピューターのBIOS内部で仮想化が有効化されていないことが原因のようです。
私の場合はHPのPCなので、F10でBiosを起動し、System ConfigurationVirtualization TechnologyEnableにすればうまくいきました。

Powershellで引数をMandatory(必須)にするときに地味にハマったこと

事象

Powershellでスペースありの文字列型の引数を受け取るとき、受け取った値にダブルクォーテーションがついてたりついてなかったりするので、それについて。

以下のようにparamを使って引数を受け取る自作関数があったとします。

function Get-Hoge{
    param(
        [Parameter(Mandatory)]
        [string]$arg
    )

Write-Host $arg
}

で、関数を呼ぶ時は以下の2つの呼び出し方があります。 渡すのはスペースを含む文字列とします。
パターン1

PS C:\Users\nogam> Get-Hoge -arg "has space"
has space

これは問題なさそうですね。
パターン2(Mandatoryにより入力待ちから入力する場合)

PS C:\Users\nogam> Get-Hoge
コマンド パイプライン位置 1 のコマンドレット Get-Hoge
次のパラメーターに値を指定してください:
arg: "has space"
"has space"

のほうは、ダブルクォーテーション付きで渡されます。
"has space"ではなくhas spaceとだけ入力すれば、ふつうにhas spaceが渡されます。

これを回避するためには、以下のようにTrimすればよいです。

Write-Host $arg.Trim("`"")

何がハマったのか

ここからはPowershellの仕様とは関係ない運用的な話になります。
例えば、上記の関数が以下のようにファイルパスを受け取るような関数だった場合を考えます。

function Open-HogeFile{
    param(
        [Parameter(Mandatory)]
        [string]$file_path
    )
    $file = [System.IO.File]::Open($file_path, [System.IO.FileMode]::Open)
    $file
    $file.Close()
}

パターン1の場合

PS C:\Users\nogam> Open-HogeFile -file_path "C:\Users\nogam\Downloads\hoge.txt"

CanRead        : True
CanWrite       : True
CanSeek        : True
IsAsync        : False
Length         : 11
Name           : C:\Users\nogam\Downloads\hoge.txt
Position       : 0
Handle         : 4228
SafeFileHandle : Microsoft.Win32.SafeHandles.SafeFileHandle
CanTimeout     : False
ReadTimeout    : 
WriteTimeout   : 

問題なさそうです。しかしパターン2だと

PS C:\Users\nogam> Open-HogeFile
コマンド パイプライン位置 1 のコマンドレット Open-HogeFile
次のパラメーターに値を指定してください:
file_path: "C:\Users\nogam\Downloads\hoge.txt"
"2" 個の引数を指定して "Open" を呼び出し中に例外が発生しました: "パスに無効な文字が含まれています。"
発生場所 C:\Users\nogam\Downloads\test.ps1:6 文字:5
+     $file = [System.IO.File]::Open($file_path, [System.IO.FileMode]:: ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException
 
null 値の式ではメソッドを呼び出せません。
発生場所 C:\Users\nogam\Downloads\test.ps1:8 文字:5
+     $file.Close()
+     ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) []、RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 

当然ですが失敗します。

ところで、「この引数の渡し方は失敗するのがわかっているのに、なぜそんな渡し方をするの?」と思いますよね。
それは、この関数の運用を考えると見えてきます。この関数の利用者は、
1.エクスプローラーからファイルを右クリック⇒パスをコピー
2.関数を実行するときに、コピーしたパスをペースト
という手順を踏むことが多くなるはずです。
上記の1.でコピーしたパスはダブルクォーテーション付きでコピーされます。
また、この関数を利用するのがPowershellをあまり利用しない人だった場合、関数実行時に指定する引数と対話型プロンプトから指定する引数で渡し方が違うとは想像しにくいです
なので、引数はTrimして受けるのがいい気がしますね。

ここまでお読みいただきありがとうございます。

【java, C#】windowsの環境変数を取得する。

はじめに

自分がよく使う言語でWindows環境変数UserProfileを取得してみる。

java

String userProfile = System.getenv("UserProfile");

c sharp

string userProfile = Environment.GetEnvironmentVariable("UserProfile");

・免責事項

当方は、当記事にコンテンツを掲載するにあたって、その内容、機能等について細心の注意を払っておりますが、コンテンツの内容が正確であるかどうか、最新のものであるかどうか、安全なものであるか等について保証をするものではなく、何らの責任を負うものではありません。また、当方は通知することなく当記事に掲載した情報の訂正、修正、追加、中断、削除等をいつでも行うことができるものとします。また、当記事、またはコンテンツのご利用により、万一、ご利用者様に何らかの不都合や損害が発生したとしても、当方は何らの責任を負うものではありません。