[US配列] 再起動なしにUS配列に変更するULE4JIS

キーボードレイアウトはみなさん何を使ってますか?

最近はリモートワークも加速したため、わたしは私用でも会社でもハイスペックゲーミングノートPCを利用するようになりました
(持ち運べるので)

わたしはノートPCのキー配列は、たいてい、日本語配列を購入します

でも、外付けキーボードを用いて作業するときは、US配列にしています

これは昔に、人のPCで何かデバッグしたりとか、限られたサーバールームなどの環境で作業したりする際に
キー配列でイラッとして打ち間違い多発とかがよくあったのです

そんなときでも違和感なくキー操作できるように
普段からあえて、どちらのキー配列でも作業できるようにしといたほうが良いかなーと思い
常時(US/JIS)配列に触れる環境をあえて作っています

やり始めた当初は、通常作業が相当ストレスフルだったのですが
今となっては慣れたもんで、Winwodでも macOSでも、US配列でも日本語配列でも
なんでもすんなりと受け入れられるようになりました

日常のコツで、パスワードの記号は、両方の配置を確実に覚えられるものにしておくか、覚えられない位置の記号は利用しないか、という行動にもつながりました…

ともあれ、ノートについてるのは日本語配列、外付けキーボードはUS配列、で日によってちょこちょこと行き来したいとき、キー配列の変更のためにわざわざ再起動をするのはとても腰が重いです

そこで、キー配列のエミュレータをしてくれる常駐アプリをいつも入れています

サクサクと軽いです
インストールも必要ないし、変なランタイムにも依存してません

で、この ULE4JIS を起動している時だけUS配列になります
(US配列を辞めたいときは常駐終了させるか
 タスクバーのアイコンから「エミュレーション停止」をするかで簡単に変更できる)

再起動が不要!!!これ超重要!!

ずいぶん昔に公開されているツールですが、わたしの Windows11 でも問題なく動作しています

この作者の方に募金したいレベルで毎日使わせてもらってます!
(特に募金も Githubスポンサーもは見当たらない)

いつもありがとうございます!!!

と声を大にして言いたいと思って、ブログ書きましたmm


[C++] C++の新しいパターンマッチ「inspect」

この記事は meetup app osaka@7 online への参加記事です

先日 2023/2/20 ごろにISO WG21 C++ 委員会メンバーのAntony PolukhinさんがMedium(Yandexサイト)で 「C++23が完成したよ~」と記事を書かれていました

それでちょっと新しいC++の機能には何があるのかなと調べていたところ
知らない文法が増えそうな予感の「Pattern Matching」inspect を見つけたので
それについてメモしてます

これはどこのC++に入るかは決まってないので、将来的には採用されないかもしれないです


<試した環境>


もともとパターンマッチするといえば、こんな感じで switch case を使ってると思います

1
2
3
4
5
6
7
8
9
int x(42);
switch (x) {
    case 0: std::cout << "zero"; break;
    case 42: std::cout << "forty-two"; break;
    default: std::cout << "something else";
}

// output
// "forty-two"

これが、inspect を用いるとこんな感じに書けます

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// number
int x(42);
inspect(x) {
    0 => { std::cout <<  "zero"; }
    42=> { std::cout <<  "forty-two"; }
    _=> { std::cout <<  "something else"; }
};

// output
// "forty-two"

文字列マッチもこんな感じに

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// string
std::string s = "foo";
inspect (s) {
    "foo" => { std::cout << "got foo";}
    "bar" => { std::cout << "got bar";}
    __ => { std::cout << "don't care";}
};

// output
// "foo"

タプル的な値のマッチも比較的少ない行数で書ける

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// tuple
auto box = std::pair(0, 42);
auto&& [i, j] = box;
inspect (box) {
    [0, 0]=> { std::cout << "all zero";}
    [1, 0]=> { std::cout << "i=1, j=0";}
    [0, 1]=> { std::cout << "i=0, j=1";}
    [__, __]=> { std::cout << i << ',' << j;}
};

// output
// 0,42

ポリモーフィックに型判定も出来るらしい
というのも、現時点ではまだ実装されていないみたいで動作しなかったです

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// polymorphic type
struct Fruits { virtual ~Fruits() = default; };
struct Orange : Fruits { int ore; };
struct Apple : Fruits { int ap; };
auto o = new Orange();
inspect (o)
{
//    2023/3/3 時はコンパイルエラー
    <Orange> => { std::cout <<  "Orange"; }
    <Apple>  => { std::cout <<  "Apple"; }
};

これが出来れば、あとはテンプレートのオペレーター演算子も比較的少ない行数で実装できるという…


まだまだ未来の機能ですが、差分学習しておかないと完全に置いて行かれますね…
C++の言語機能は複雑すぎます

とはいえ業務コードでも、競プロなどでも
少ない行数で書けるのはとても良いと思うので(=バグの入る余地が減る)
どんどん進化していってもらいたいですね!

<参考>


[C#] $文字を置換したい

ちょっとnewbie的ですが、$ 文字をひっかけようとしてうまくいかなかったので、その時のメモです

今回の開発環境はこちら


Unityで string 文字列の中の $ 文字を置換使用を思いましたが、うまく出来ませんでした

1
text = text.Replace("\\$", "");

はて。。。なんでかな?

調べてみて、こちらなら思った通りの動作になりました

1
text = Regex.Replace(text, "\\$", "");

正規表現だとうまく行くみたい

参考:


[C++] VC++でHackerRankの環境構築

この記事は C++ Advent Calendar 2022 7日目の記事です。

(内容まとめ)
競プロ勢にとったら当たり前のローカル環境設定についての記事です
自分の言葉でまとめなおしたメモになります
みんな!AtCoder もいいけど HackerRank も面白いよ!


今年の3月ごろ、同僚(海外の方)から
「HackerRank 結構いいよ、わたしは週末によくやってるよ~」
と教えてもらいまして
たまにポチポチ解いています

ざっくり言うと、お題に対するコードを書いて、要求通りの出力が出来れば Pass! でポイントが溜まっていってバッチがもらえたりします
わたしは主にC++の Problem Solving を解いています
(数学系の問題も多いです)

C++ language のジャンルで解くことも出来ますが、こっちは文法問題なので、あまり面白くない

HackerRankは他のオンラインコーディングプラットフォームとはちょっと異なっていて
競技で問題を解いてランクを上げるというよりは、スキルの習得に焦点を当てているような気がします
解いて欲しい問題用の関数がミニマムに提供されてて、最初に記載するであろう入力系の処理が予め記載されているので、解くのに集中出来ますね

で、それまで真面目に Easy 問題を解いていたのですが、簡単すぎるし量も多い…つまらん…
となって、教えてくれた同僚に
「HackerRank、何の問題を解いてる?」
と聞いたところ、
「えぇー Easy やってるの?時間の無駄だよ~わたしは Hard しかやらないよ」
と突っ込まれました><。

さてそこで、Hard 問題をやり始めましたが、あら。。。難しい。。。
こんなけ難しかったらデバッグしたくなるんだけど、HackerRankのサイトに組み込まれたコードエディタ上から問題を解くので、プリントデバッグしか方法がない
変数の中身や配列の中身をもっとアグレッシブに確認したい…

前置きが長くなりましたが、HackerRankをやるときに、Visual Studio上でコードを書いて確認する方法を記載しましたmm

<今回の環境>


VSにコードコピペしてHackerRankの問題を解きたい

コピペ出来ないとしんどいです!

しかし HackerRank も他の競プロと同じく、#include <bits/stdc++.h> があります
そのまんまじゃリンク通りません

なので、ライブラリを認知する箇所に stdc++.h を置いておけば良いのです

他にも色んな方が公開されてますけど、検索するとこの方の↑↑↑リンクがよく見つかりました

これを、VC++がデフォで認知する場所に置きます

一番簡単な場所に調べ方は、

1
#include <iostream>

とコードに書いて、F12iostream の場所までジャンプ
→ソースのタブを右クリックすると、そこのディレクトリの場所までジャンプ出来る

ちなみにわたしの場合は、ここにありました
C:\Program Files (x86)
 \Microsoft Visual Studio
  \2019
   \Enterprise
    \VC
     \Tools
      \MSVC
       \14.29.30133
        \include

エラーやワーニングが出る場合

めんどいですが、毎回エラー除去のための define を書くのが無難な対応だと思います
(業務のコードじゃないし)

例えば、HackerRank でよく出てくるこんなコード

1
ofstream fout(getenv("OUTPUT_PATH"));

エラーになります

error C4996: ‘getenv’: This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

あんた getenv は非推奨だけど使いたいなら、_CRT_SECURE_NO_WARNINGS 定義しなさいよ!ってやつです
ええ、使いたいんです、HackerRank にコードコピペしたいんで!
なのでわたしはガッツリと先ほどの stdc++.h の上の方に定義を追記しています

自分はVSに慣れてるので、慣れた環境でコード書けるのが快適ですね

(余談) VSCodeでやろうとしたが…

最初は、Windoows の VSCode で環境構築をしようとしてたのですが、なかなか手ごわいです…

mac はさくっとものの数分で C++デバッグ環境が構築できたのに
Windows だと、半日かけてもうまく動きませんでした><。
(VC++ がうまく動かなくて、gcc はなんとか動作したって感じです)

色々調べていた時に、VSCode on Windows 情報でいちばん面白かったのが、この中国の投稿サイトでした

わたしは中国語はよくわからないので、Googleのページ翻訳でよくここの Zhihu サイトを見るのですが
この記事は見てて笑っちゃいました。。。
情報量も多いし、皮肉アリ、ぶっちゃけトークありで、読み物として面白かったです

ここを見て、あ、VSCode on Windows でVC++使うのちょっと大変かも…と思いました
中国は同じように感じがあるので、そこの悩みも詳細にかかれてて、親近感沸きました

あんまり日本でこういう記事見ないな~なんでだろ、ぶっちゃけすぎるからかな?

C++だけじゃなくてUnityの情報も多いです、知識投稿サイトってやつかなー?とにかく面白い


(まとめ)

コード書くなら開発環境は整えようね!

C++ で mac なら VSCode だけど、Win なら VS 使おうぜ!

HackerRank ほんとお勧め、地道に解くのが楽しい


(参考)


[Git] コミット済みのファイルを Git LFS 管理対象にしたいとき

バイナリファイルコミットしちゃたけど、これ Git LFS 管理対象にしたかったよねー。。。

というときの作業メモです

わたしの環境は Windows での動作確認になります

1) git lfs installGit LFS をインストールします
わたしの環境にはすでに入っていたみたい…

>git lfs install
Updated Git hooks.
Git LFS initialized.

2) git lfs version でバージョンを確認しておく

>git lfs version
git-lfs/3.2.0 (GitHub; windows amd64; go 1.18.2)

3) git lfs track とすると、.gitattributes に格納されている対象データの情報が見れます

例えばこんな感じ

>git lfs track
Listing tracked patterns
    *.dll (.gitattributes)
    *.exe (.gitattributes)

4) git lfs track でLFS管理に入れたいファイルを指定します

>git lfs track "*.o"
Tracking "*.o"

ファイル単体を指定したければ、直接指定すればOK

>git lfs track "aaa/bbb/ccc.bin"

5) .gitattributes に追加した対象ファイルが記載されているので
それをコミット&プッシュすればOK!

6) まだLFS管理してなかったときにコミットしてしまったファイルは
いったん削除コミットをしてから、もう一度コミット&プッシュするのが良さそうでした


(参考リンク)


[Unity] Windows/macOS内にあるUnityの場所

バッチモードとかでUnityを起動させたいとき

Windowsだと

C:¥Program Files¥Unity¥Hub¥Editor¥(バージョン名)¥Editor¥Unity.exe

とまぁ想像のつく位置にいてるんですけど

macOSのとき、あれ?どこにあるんだっけな?になったので、そのメモです

mac の場合はここに居てました

/Applications/Unity/Hub/Editor/(バージョン名)/Unity.app/Contents/MacOS/Unity

(バージョン名) は例えば 2021.3.2f1 とかになります


[Windows] 壁紙のレジストリ設定場所

PCの壁紙にしてる画像データ…どこにあるんだっけ?
デスクトップでは見えてるんだけど…

そんな時は一度、レジストリの中を見てみたら解決するかもしれません

Windows11の環境で見てみました


壁紙のレジストリ設定

  1. regedit でアプリを検索すると Registry Editor が出てきます

  2. HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers
    の中に、壁紙として登録されている画像情報のパスが入っています

おお。。。ここにありましたか。。。!

しかし、
元のファイルを消しちゃったけど、デスクトップの壁紙だけは残ってるってときは
どこにあるんでしょうかね…
どなたか知ってる方いらっしゃれば教えてくださいmm


(参考)


[Git] macでgitを初めて使う時

mac で初めてコマンドから git を使う時の設定メモです

git コマンドが使えなかった

Gitをコマンドラインで打つと、こんなエラーが出ました。。。

1
% git 

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

開発者ツールが入ってないらしい

Xcode をインストールする

xcode-select --install でインストールします

1
2
3
% xcode-select --install
code-select: note: install requested for command line developer tools
% 

こんな感じでインストールが進みます

実際のダウンロードは、わたしの環境では20分くらい、インストールは10分くらいでした

そしてインストール完了のウィンドウが出てほっ…

Gitコマンドが使えるように

git と打ってみる

1
% git                   

usage: git [–version] [–help] [-C ] [-c =]
[–exec-path[=]] [–html-path] [–man-path] [–info-path]
[-p | –paginate | -P | –no-pager] [–no-replace-objects] [–bare]
[–git-dir=] [–work-tree=] [–namespace=]
[]

無事、コマンドラインから git が使えるようになりました〜


[Hugo] GitHub Actionsでサイトを自動デプロイしたときにCNAMEを残す方法

Hugo に限らないのですが
gh-pages ブランチを利用して GitHub Pages を作った時
自動デプロイで、独自ドメインの設定を記載した CNAME が消えちゃうことがあります

そのトラブルシュートについてです


Hugo 自体の設定もあるのですが、それよりも
元のコンテンツに CNAME ファイルを含めてしまうのがシンプルで簡単です

Hugo ならメインブランチの static ディレクトリ以下に CNAME を設置します

これだけでOK!


[C++] 2次元Vectorのメモ

HackerRankやってるときによく2次元配列が出てくるので、ちゃちゃっとやりたいときのメモです

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 2次元配列の宣言,,,出来れば v じゃなくて用途名にしたいところ…
std::vector<vector<int>> v(2, vector<int>(3));
// こんな配列が出来てる↓↓↓
v.at(0).at(0);
v.at(0).at(1);
v.at(0).at(2);
v.at(1).at(0);
v.at(1).at(1);
v.at(1).at(2);

// 呼び先でも内容を更新したいときは参照が楽…
void func(vector<int> &t)
void func(vector<vector<int>> &v)

// べた書きループはかなり楽
for(unsigned int i = 0; i < v.size(); ++i){
    for(unsigned int j = 0; j < v.at(i).size(); ++j){
        // 何か処理
    }
}
// べた書きループ、
// サイズチェックが気になる or 他でも利用するなるなら…
unsigned int row = v.size();
for(unsigned int i = 0; i < row; ++i){
    auto &box = v.at(i);
    unsigned int col = box.size();
    for(unsigned int j = 0; j < col; ++j){
        auto &ck_data = v.at(i).at(j);
        // 何か処理
    }
}

業務や後に残るコードではなく、とにかくちゃちゃっとやりたい、という要望って
自分はこれまで出会ったことが無かったので
この手のコーディングは、自分的にはかなり新しいというか新鮮な感じがします