[C++] const char* とconst wchar_t*の相互変換

Python/C APIでよく使うため関数をリサーチしました。2011年のStackOverflow英語版等にいい関数がありましたので拝借します。なおサロゲートペアには対応していません。

サロゲートペア:1つの文字に対して2つの文字コードを使って表される文字。𠀋 𡈽 𡌛 𡑮 𡢽 𠮟 𡚴 𡸴 𣇄 𣗄など。

const wchar_t* GetWC(const char* c) {
    const size_t cSize = strlen(c)+1;
    wchar_t* wc = new wchar_t[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
    delete [] wc;
}

--------------------------------------------------
// stringへの変換(charは"string.c_str()")

std::string GetStr(const wchar_t* c) {

  std::string tmps;

  if (c == nullptr)
    return tmps;

  size_t sz = wcslen(c);

  tmps.reserve(sz*2);

  const size_t CNT_MAX = 50;
  char tmpc[CNT_MAX];
  wchar_t tmpw[CNT_MAX];

  const wchar_t* p = c;
  while (*p) {
    wcsncpy(tmpw, p, 1);
    tmpw[1] = L'\0';
    p += 1;
    
    wcstombs(tmpc, tmpw, CNT_MAX);
    tmps += tmpc;
  }
  
  return tmps;
}

setlocale(LC_ALL, ""); // GetC関数使用の際に必要

マルチバイト文字対策とは言えワイド文字wchar_tの存在は何ともやっかいです。

参考サイト
参考サイト2

[macOS] キーチェーンのパスワードを急に要求しだした

[M1 Mac, Big Sur 11.6.5]

codesignコマンド実行時に急にパスワードを要求するようになりました。

以下の方法で解決しました。

1.macOSのログインパスワードをシステム環境設定”ユーザとグループ”から設定し直す。今回はこれまでと同じパスワードを再設定しました。

2.キーチェーンアクセスを起動し、システムのキーチェーンアクセスを開く。

3.Mac Developer ID Applicationの秘密鍵を右クリックし、”情報を見る”を選択。

4.”アクセス制御”タブをクリックし、”これらのアプリケーションによるアクセスを常に許可”のところに”/usr/bin/codesign”を登録する。

これでうまくいきました。なお解決後、秘密鍵の内容を確認すると登録したはずのcodesignは消えていました。それでも問題ありません。

macOSに関する奇妙な現象は枚挙にいとまがなく、今では怒りもわかず気にならなくなりました。Appleに報告してもまず対応しないので、程よい距離感で付き合っていくことにしました。

[VSCode] PlantUMLのプレビュー表示ができない

[M1 Mac, Big Sur 11.6.5, VSCode 1.67.1]

PlantUMLのプレビュー表示のショートカットキーはoption + Dですが、偏微分記号∂が入力されてしまいます。

macOS Big Surのキーボードビューアを確認すると確かに∂がアサインされています。つまりショートカットキーの設定が不適切です。

VSCodeのキーボードショートカット設定でshift + command + Dに変更しました。

US配列だったらoption + Dで正常にプレビュー表示できるのでしょうか?このキーはWindowsでしか使えない気もします。

キーボードビューア

[VSCode] settings.jsonのファイルパス

[M1 Mac, Big Sur 11.6.5, VSCode 1.67.1]

Macの場合、settings.jsonは以下のパスに配置されています。

使い始めた頃はアプリからの呼び出し方が分からなくて苦労しました。

結構深いところにあるので、やはりアプリから呼び出す方が早いでしょう。左下の管理ギアにある”設定”を選択し、右上に出現する”ページをめくるような”マークをクリックします。

$HOME/Library/Application Support/Code/User/settings.json

[macOS] プログラミング環境の移行 VSCode, Homebrew, PyPI(pip), シェル変更

TimeMachineなしでMontereyからBig Surに2回目のダウングレード中です。かなキー連打の日本語変換機能をAppleScriptで実装できなかったのとキーボード(Logicool K375s)が不調になったことが主な理由です。

TimeMachineデータは残しておらず、いい機会なので一から構築しています。

今はUSBストレージで作業していますが、iCloudやGitHubを介してスクリプトで自動化もできそうです。ただ今のところiCloudは同期が遅くて正直使えないです。

1.VSCode[エディタ]

ホームディレクトリの.vscodeディレクトリをコピーするだけです。

2.Homebrew[パッケージ管理]

1)移行元でBrewfileを作成する。

brew bundle dump

2)ホームに作成されたBrewfileを移行先のホームにコピーする。

3)シェルをzshからbashに変更する。(前環境がbashの場合)

# シェルの確認
echo $SHELL

# シェル変更
chsh -s /bin/bash


4)移行先にHomebrewをインストール後、以下コマンドでデータを取り込む

# Homebrewのインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# データの取り込み
brew bundle

3.PyPI(Python Package Index) [Pythonパッケージ管理]

1)移行元でrequirements.txtを作成する。テキストファイル名はなんでも可。

pip freeze > requirements.txt

2)移行先のホームにコピーする。

3)移行先でrequirements.txtを取り込む。

pip install -r requirements.txt

[macOS] Pythonの開発環境構築 非pyenv

[Mac mini M1, macOS Big Sur 11.6.5]

Big SurにてPythonの開発環境を一から再構築してみました。pyenvは使わず、公式サイトからダウンロードしたPython3.10.4固定です。

ディレクトリ読み込みの優先順位は.bash_profileで設定しています。最初はpipがどこにも見当たらず少し焦りました。結局pip3をファイル名変更したシンボリックリンクとして使っています。

export PATH="/Library/Frameworks/Python.framework/Versions/3.10/bin"
export PATH=$PATH:"/usr/local/bin"
export PATH=$PATH:"/usr/bin"
export PATH=$PATH:"/bin"
# python
# /usr/local/binに3.10.4のシンボリックリンクを作成

ln -s /Library/Frameworks/Python.framework/Versions/3.10/bin/python3 /usr/local/bin/python

# pip
# /usr/local/binにpip3のシンボリックリンクを作成

ln -s /Library/Frameworks/Python.framework/Versions/3.10/bin/pip3 /usr/local/bin/pip

ファイル名を変えない場合は.bash_profileに以下の記述を追加します。

alias python="python3"
alias pip="pip3"

SIP(System Integrity Protection)を解除しても/usr/binのファイルを入れ替えることができないので、/usr/local/binに配置しました。

設定前後のpythonおよびpipファイルは以下のようになります。実効ファイルの配置ディレクトリ(色付きセル)はwhichコマンドで確認しました。

[C++] 25 string, char*, int間の変換

メインブログのTIPS記事はこちらに移動させます。

<string型からchar*型>
using std::string;

string str;
char* str_to_char = str.c_str();

<string型からchar[]型>
string str;

char ch[2048] = {};
str.copy(ch, 2047); // 最後にヌル文字が残るようにする

<int型からstring型>
using std::string; using std::to_string;

int num ;
string int_to_string = to_string(num);

<string型からint型>
using std::string; using std::stoi;

string str;
int str_to_int = stoi(str);

<char*型からint型> atoi関数はエラー時に0を返すので取り扱い注意!!
#include <stdlib.h>

char* ch;
int char_to_int = atoi(ch);

<int型からchar*型>
int型からstring型、string型からchar*型へ順に変換

using std::string; using std::to_string;

int num ;
string int_to_string = to_string(num);
char* str_to_char = (to_string(num)).c_str();

<const char*からstring型>
using std::string;

const char* cstr;
string cstr_to_string = string(cstr);

<char型単体からstring型>
char ch = 'a';
string str{ch}; strがstring型変数

<char[]型からstring型>
char chars[] = {'a', 'b', 'c'};
std::string str(chars, 3); // 3はcharの個数、strがstring型変数

[C++] size_t型

未だになじまないのでメモ。

長さ、大きさ、サイズを表現する型。sizeof演算子、strlen関数など、byte数や長さの表現に使用する。

unsigned longと同義。