Win
+ r
でスタートメニュー開いて下記を入力
ncpa.cpl
以上、自分用のメモ
Win
+ r
でスタートメニュー開いて下記を入力
ncpa.cpl
以上、自分用のメモ
以前こんな記事を書いたけど、もっと楽な方法があったのでメモる。
プロパティダイアログを表示させるコマンドのショートカットを作って、それを起動する方法。
以下にショートカットの作り方を簡単にまとめる。
"C:\Program Files (x86)\Google\Google Japanese Input\GoogleIMEJaTool.exe" "--mode=config_dialog"
GoogleIMEProp
がいいと思うあとは、それをダブルクリックすればGoogle日本語入力のプロパティが開ける。
元ネタのようにショートカットキーを設定するのもいいけどどうせ忘れるし、ショートカットの名前がGoogleIMEProp
なら一度ダブルクリックで起動した後はスタートメニューで google
まで入力すれば補完候補として表示されるからそれでいい。
めっちゃ楽になった。感謝!
Windows PCのグラボをRTX4060に替えて、ドライバ更新したらGeForce Experienceという(Steamをパクったような画面の)アプリが入った。
常駐してゲームごとにグラボを最適化してくれる賢そうなやつなんだけど、オーバーレイ表示とそれ用のショートカットキーがおせっかい機能として実装されている。
こいつが悪さして、Altキーのショートカットが諸々吸われてしまうので無効にする。
これで安息が訪れた。
cf.
[Alt + Z]で GeForce Experience が表示されてしまう – Born Digital サポート
追記
もっといい方法があったので、こっち↓をやったほうがいい。
zzz-kbd.hateblo.jp
かなり面倒だが、単語登録するには以下の手順でやる。
ていうか、なんぼなんでもめんどすぎ。
jsのeval()
関数をGoogleスプレッドシートでも使える。
でもスプレッドシート関数じゃないので、セルに直接=eval(A1)
とか入れても「不明な関数」になるから、以下のようにGASで一旦ラップしてやる。
function my_eval(formula) { return eval(formula); }
これで
5 + (-3)
=my_eval(A1)
と入力すると、A2セルに2
が入るはず。
でまあ、eval()
なのでセキュリティ的に危ないらしいが、Googleスプレッドシートで使ったときの具体的なリスクシナリオがちょっと思い浮かばない。
クラウドでどんなインジェクションされようが問題ない気がするんだけど、他の非公開のシートを公開されたりできるなら確かにヤバいな。でもまeval使ったシート自体が非公開なら改変されないから直接使うぶんには問題ないはず。
GoogleスプレッドシートにはExcelの「本当に開いてもいいですか?」的なのがないから危ないっちゃ危ないけど、内輪で使う分には問題ないよね。
ローカル編集可能なシートがヤバいとかかな。
だとすると、Googleスプレッドシートからキーボード履歴を取得して送信するトロイをインストールとかできるんだろうか。
そんなんされたらかなりやばそうだが。
うーん、セキュリティは難しいな。
サンプル書いたけど、ここにソース埋め込むのがめんどいのでGistを貼る。
arduino example: calling Serial.println() from a C source file · GitHub
C言語はC++のクラスとか理解不能なので、一旦C++でラッパー関数を書いて、それを呼ぶようにする。
でも、なぜにC言語から使いたいのか?
たとえば、使いたいライブラリがCだからとか、C++にないC言語固有の機能を使いたいとか、まあいろいろあるよね。
ちなみに、C言語からではなくC++のソースからSerial.println()したいときはこんな2段構えのラップ不要で、.cppに
#include <Arduino.h>
するだけで使えるので、もしC++でコンパイルが通るならソースを.cppにしてしまったほうが楽。
arduino example: calling Serial.println() from a C++ source file · GitHub
元ネタはこちら
stackoverflow.com
たまに使うと忘れてて毎回ググるハメになるので、自分用のメモとして残す。
// sub.c 呼はれる側 // ここにextern宣言は不要だが、書いてもコンパイル・リンクは通る // extern int x2(int n); int x2(int n) { return n * 2; }
// main.cpp 呼ぶ側 #include <iostream> using namespace std; extern "C" int x2(int n); // 関数をコールする側にextern "C"宣言を書く int main() { int x = 100; cout << x2(x) << endl; return 0; }
# Makefile .PHONY: clean clean: rm -f *.o call-c all: call-c call-c: main.o sub.o g++ main.o sub.o -o call-c main.o: main.cpp g++ -c main.cpp -o main.o sub.o: sub.c gcc -c sub.c -o sub.o
makeして実行
$ make all && ./call-c g++ -c main.cpp -o main.o gcc -c sub.c -o sub.o g++ main.o sub.o -o call-c 200
.oファイルのシンボル確認
$ nm sub.o main.o sub.o: 0000000000000000 T x2 <-- マングリングされていない main.o: U __cxa_atexit U __dso_handle U _GLOBAL_OFFSET_TABLE_ 000000000000009d t _GLOBAL__sub_I_main 0000000000000000 T main U x2 <-- マングリングされていない 0000000000000047 t _Z41__static_initialization_and_destruction_0ii U _ZNSolsEi U _ZNSolsEPFRSoS_E U _ZNSt8ios_base4InitC1Ev U _ZNSt8ios_base4InitD1Ev U _ZSt4cout U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_ 0000000000000000 b _ZStL8__ioinit||<
// sub.cpp 呼ばれる側 extern "C" int x2(int n); // x2()はこのファイル内からコールされないのでここにextern宣言は不要だが、 // // C++コンパイラにマングリング不要の指示として必須 int x2(int n) { return n * 2; }
// main.c 呼ぶ側 #include <stdio.h> extern int x2(int n); // 素のextern宣言を書く(そもそもCコンパイラにextern "C"はない) int main(void) { int x = 500; printf("%d\n", x2(x)); return 0; }
# Makefile .PHONY: clean clean: rm -f *.o call-cpp all: call-cpp call-cpp: main.o sub.o g++ main.o sub.o -o call-cpp main.o: main.c gcc -c main.c -o main.o sub.o: sub.cpp g++ -c sub.cpp -o sub.o
makeして実行
$ make all && ./call-cpp gcc -c main.c -o main.o g++ -c sub.cpp -o sub.o g++ main.o sub.o -o call-cpp 1000
.oファイルのシンボル確認
nm sub.o main.o sub.o: 0000000000000000 T x2 <-- マングリングされていない main.o: 0000000000000000 T main U printf U x2 <-- マングリングされていない
CソースからC++関数を呼ぶときは下記のように関数定義全体をextern "C" {}で囲んでもよい。
// sub.cpp 呼ばれる側 extern "C" { int x2(int n) { return n * 2; } }
C/C++コンパイラのどちらからも使われる可能性のあるヘッダファイルの場合は下記のように始まりと終わりをそれぞれ#ifdefと#endifで囲む必要がある。
// sub.h C/C++共通のヘッダファイル #ifdef __cplusplus extern "C" { #endif // プロトタイプ宣言 int foo(); void bar(int x); #ifdef __cplusplus } #endif