[MacOS] Microsoft AutoUpdateを取り消す

以下にあるMicrosoft AutoUpdateファイルを削除します。

消していたはずのこのファイルが何かの拍子に復活したりするので困っています。

/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app

2023/8/14追記
新規Macにデータ移行したらExcelをMicrosoftサイトから上書きインストールしないとライセンス認証できなかった。おまけにMicrosoft AutoUpdateが復活したのですぐに削除した。Microsoftのサービスは本当に扱いづらい。勘弁して欲しい。

 [MacOS] “かなキー2回押しで日本語変換”同等機能をAppleScriptで実装 Montereyでも動作

[M1 Mac, Monterey 12.6.3]

Monterey以降ではアルファベットからのかなキー2回押し日本語変換が使えないため、自製のAppleScriptをcmd + opt + zに割り当てています。

Vanturaではうまく動作しなかったのですが、Montereyでは一応動くのでホッとしています。

use AppleScript version "2.5" --  (10.12) or later
use framework "Foundation"
use scripting additions

property NSString : a reference to current application's NSString
property NSStringTransformLatinToHiragana : a reference to current application's NSStringTransformLatinToHiragana

selectString()

set latin to the clipboard

set hiragana to alphabetToHiragana(latin)

set the clipboard to hiragana

pasteString()

henkan()

on selectString()
    tell current application
        tell application "System Events"
            keystroke "ac" using {command down}
        end tell
    end tell
end selectString

on pasteString()
    tell current application
        tell application "System Events"
            keystroke "v" using {command down}
        end tell
    end tell
end pasteString

on alphabetToHiragana(aStr)
	set aString to NSString's stringWithString:aStr
	return (aString's stringByApplyingTransform:(NSStringTransformLatinToHiragana) |reverse|:false) as string
end alphabetToHiragana

on henkan()
    tell current application
        tell application "System Events"
            keystroke "a" using {command down}
            key code 104
            key code 104
        end tell
    end tell
end henkan

[Windows] アプリexeファイルからappxファイルへの変換バッチファイル

アプリ動作確認の際、exeファイルからappxファイルへの変換手作業があまりにもわずらわしいので、バッチファイルを作成しました。

UWPディレクトリ、appxmanifest.xmlやpfxファイルなどをすでに作成している前提です。

最後にwingetコマンドでストアアプリをアンインストールし、新しいappxファイルでインストールします。

@ECHO OFF

copy "D:\code\VC++\Projects\ColorSampleJP\bin\ColorSampleJP.exe" "D:\code\VC++\temp\ColorSampleJP_UWP\ColorSampleJP-3.1.0.exe"
cd/d "D:\code\VC++\temp"
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\makepri.exe" createconfig^
    /cf priconfig.xml^
    /dq en-US^
    /Overwrite
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\makepri.exe" new^
    /pr ColorSampleJP_UWP^
    /cf priconfig.xml^
    /of ColorSampleJP_UWP^
    /Overwrite
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\makeappx.exe" pack^
    /d ColorSampleJP_UWP^
    /p ColorSampleJP-3.1.0.appx^
    /Overwrite^
    /l^
    /nv
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe" sign^
    /a^
    /fd SHA256^
    /f my-sample.pfx ColorSampleJP-3.1.0.appx
C:\Users\[ユーザ名]\AppData\Local\Microsoft\WindowsApps\winget.exe uninstall --name ColorSampleJP --accept-source-agreements
ColorSampleJP-3.1.0.appx

exit /b

Visual Studioにありがちな不具合

無駄な足止めをくらわないよう記録しておきます。
発覚し次第、項目を追加していきます。

1.インクルードに問題がないのに赤色下線が出現する。
これでプロジェクトのプロパティを何度も無駄に確認させられています。
赤色下線が出ていても取りあえずビルドしてみましょう。
この不具合が一番腹立たしいです。

 [MacOS] “かなキー2回押しで日本語変換”同等機能をAppleScriptで実装

[M1 Mac, Big Sur 11.6.8, Ventura 13.0]

“かなキー2回押しで日本語変換”と同等の機能をAppleScriptで実装しました。cmd + opt + zに割り当てています。ただしアルファベットの前に別種の文字があるとそれらを消してしまう仕様になっています。

このスクリプトはBig Surでは動きますが、残念ながらVenturaでは誤動作します。おそらくMontereyでもNGだと思います。

Venturaで”display dialog”コマンド(C言語におけるprintf)を使いAppleScriptの挙動をApple純正・非純正アプリにて検証してみましたが、スクリプトエディタのような純正アプリでもクリップボードへのコピーができない時がありとても不安定です。再現性がないというのは致命的です。

もはやスクリプト言語として開発環境が破綻しているようにも思えるので、AppleScriptとは距離を置くことにしました。JavaScript for Automation(JXA)についてはこれから試してみます。

それにしてもAppleScriptユーザーが率先してこのような状況を発信すべきだと思うのですが、ネットを見渡した限りほぼ皆無というのが実に不思議です。

use AppleScript version "2.5" --  (10.12) or later
use framework "Foundation"
use scripting additions

property NSString : a reference to current application's NSString
property NSStringTransformLatinToHiragana : a reference to current application's NSStringTransformLatinToHiragana

selectString()

set latin to the clipboard

set hiragana to alphabetToHiragana(latin)

set the clipboard to hiragana

pasteString()

henkan()

on selectString()
    tell current application
        tell application "System Events"
            keystroke "ac" using {command down}
        end tell
    end tell
end selectString

on pasteString()
    tell current application
        tell application "System Events"
            keystroke "v" using {command down}
        end tell
    end tell
end pasteString

on alphabetToHiragana(aStr)
	set aString to NSString's stringWithString:aStr
	return (aString's stringByApplyingTransform:(NSStringTransformLatinToHiragana) |reverse|:false) as string
end alphabetToHiragana

on henkan()
    tell current application
        tell application "System Events"
            keystroke "a" using {command down}
            key code 104
            key code 104
        end tell
    end tell
end henkan
Automator設定
システム環境設定 – キーボード – ショートカット

[MacOS] Apple Siliconで内部音声付き画面収録

[M1 Mac, Ventura 13.0]

MacOSではデフォルトで内部音声付き画面収録ができません。

“BlackHole”という仮想オーディオドライバを導入すると内部音声も収録できるようになります。このドライバのソースコードはGitHubで公開されています。今回はビルド済みバイナリをダウンロードして導入しました(メールアドレスの登録が必要)。

MacOSのユーティリティ – Audio MIDI設定で以下のように設定します。

入力(マイクの記号)はBlackHole 2chに設定し、出力(スピーカーの記号)は複数出力装置でBlackHole 2chとMacのオーディオ装置をチェックします。左下の歯車ボタンで入力と出力を適切に設定しないとうまくできないので要注意です。

2023/3/31追記
現在のBlackHoleはビルド済バイナリのダウンロードでは$5以上の寄付が必須になっている。Homebrewからもインストール出来るが、M1 Macでは30分経過したあたりから音が割れ出して最終的には無音になる。仕方ないのでIntel Macで収録している。

[MacOS] Makefileを常にVSCodeで開く : SwiftDefaultApps

SwiftDefaultAppsでテキストエディットに関連するファイルを全てVSCodeで開くように変更しました。

Applicationsタブでテキストエディットの関連ファイルとしてチェックが入っているファイルタイプについて左隣のUniform Type Identifiers(UTI)タブでVSCodeに設定しました。

これでMakefileをダウンロードする度に右クリックメニューで関連付けを変更しなくて済みます。ちなみにMakefileのUTIはpublic.dataです。テキストエディットが起動することは今後一切ありません。

拡張子のないファイルについてはこの方法で解決できます。大げさですが長年の懸案からこれで解放されそうです。

ネットにはMakefileに関するこの種の情報が見当たりませんでした。こういう細かいところでの使いづらさに耐えきれず、皆さんLinuxへ行ってしまうのでしょうか。

私もほとほとあきれているクチですが、まだしばらくMacで粘ってみます。

[MacOS] Tokyo Cabinetの削除コマンド

インストールはしたものの私には不要だったので、以下コマンドで削除しました。下4つ以外は一括削除できます。

rm /usr/local/include/tcutil.h
rm /usr/local/include/tchdb.h
rm /usr/local/include/tcbdb.h
rm /usr/local/include/tcfdb.h
rm /usr/local/include/tctdb.h
rm /usr/local/include/tcadb.h
rm /usr/local/lib/libtokyocabinet.a
rm /usr/local/lib/libtokyocabinet.so.x.y.z
rm /usr/local/lib/libtokyocabinet.so.x
rm /usr/local/lib/libtokyocabinet.so
rm /usr/local/lib/pkgconfig/tokyocabinet.pc
rm /usr/local/bin/tcutest
rm /usr/local/bin/tcumttest
rm /usr/local/bin/tcucodec
rm /usr/local/bin/tchtest
rm /usr/local/bin/tchmttest
rm /usr/local/bin/tchmgr
rm /usr/local/bin/tcbmgr
rm /usr/local/bin/tcbtest
rm /usr/local/bin/tcbmttest
rm /usr/local/bin/tcftest
rm /usr/local/bin/tcfmttest
rm /usr/local/bin/tcfmgr
rm /usr/local/bin/tcttest
rm /usr/local/bin/tctmttest
rm /usr/local/bin/tctmgr
rm /usr/local/bin/tcatest
rm /usr/local/bin/tcamttest
rm /usr/local/bin/tcamgr
sudo rm /usr/local/libexec/tcawmgr.cgi
sudo rm -r /usr/local/share/tokyocabinet/
sudo rm -r /usr/local/man/man1/
sudo rm -r /usr/local/man/man3/

[LLDB] アセンブリ言語の行にBreakpointを設定する

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

C言語コードの行単位ではレジスタ値やメモリ値の詳細が追えないので、アセンブリ言語の行単位で追跡する方法を模索しました。

GDBは不可、LLDBでは可能でした。ただし最初にrunコマンドで空実行させないと有効なBreakpointが設定できません。

GDBが仕様及び酷いバグでIntel Macでもまともに使えない状態になっていますが、LLDBのこの程度の不具合ならかわいいものです。

ちなみにGDB導入についてはIntel MacにMacPortsでインストール、ggdbファイルにコード署名、SIP(System Integrity Protection)を–without debugオプションで限定的に解除しても、結局バグに阻まれました。なおApple Siliconには今のところビルド済みファイルは提供されていません。

GCC、GDB共にソースコードからのビルドもまともにできないですし、GNUはMacを軽視しているように思います。だからこそAppleはclangやLLDBの開発に注力しているのでしょう。

LLDBではなんとかできたものの、nextコマンドを使えずアセンブリ言語コード各行をBreakpointとして設定する必要があるのでかなり面倒です。

とりあえずログを載せておきます。

bin $ lldb test
(lldb) target create "test"
Current executable set to /test' (arm64).
(lldb) disass -n main
test`main:
test[0x100003e48] <+0>:   sub    sp, sp, #0x60             ; =0x60 
test[0x100003e4c] <+4>:   stp    x29, x30, [sp, #0x50]
test[0x100003e50] <+8>:   mov    w8, #0x0
test[0x100003e54] <+12>:  str    w8, [sp, #0x2c]
test[0x100003e58] <+16>:  str    wzr, [sp, #0x4c]
test[0x100003e5c] <+20>:  mov    w8, #0x3e8
test[0x100003e60] <+24>:  str    w8, [sp, #0x48]
test[0x100003e64] <+28>:  adrp   x8, 0
test[0x100003e68] <+32>:  add    x8, x8, #0xf50            ; =0xf50 
test[0x100003e6c] <+36>:  ldr    w9, [x8]
test[0x100003e70] <+40>:  add    x10, sp, #0x40            ; =0x40 
test[0x100003e74] <+44>:  str    x10, [sp, #0x10]
test[0x100003e78] <+48>:  str    w9, [sp, #0x40]
test[0x100003e7c] <+52>:  ldrh   w8, [x8, #0x4]
test[0x100003e80] <+56>:  strh   w8, [sp, #0x44]
test[0x100003e84] <+60>:  add    x8, sp, #0x38             ; =0x38 
test[0x100003e88] <+64>:  str    x8, [sp, #0x18]
test[0x100003e8c] <+68>:  mov    x8, #0x797a
test[0x100003e90] <+72>:  movk   x8, #0x78, lsl #16
test[0x100003e94] <+76>:  str    x8, [sp, #0x38]
test[0x100003e98] <+80>:  add    x8, sp, #0x30             ; =0x30 
test[0x100003e9c] <+84>:  str    x8, [sp, #0x20]
test[0x100003ea0] <+88>:  adrp   x8, 0
test[0x100003ea4] <+92>:  add    x8, x8, #0xf56            ; =0xf56 
test[0x100003ea8] <+96>:  str    x8, [sp, #0x30]
test[0x100003eac] <+100>: ldr    w9, [sp, #0x48]
test[0x100003eb0] <+104>: mov    x8, x9
test[0x100003eb4] <+108>: adrp   x0, 0
test[0x100003eb8] <+112>: add    x0, x0, #0xf5a            ; =0xf5a 
test[0x100003ebc] <+116>: mov    x9, sp
test[0x100003ec0] <+120>: str    x8, [x9]
test[0x100003ec4] <+124>: bl     0x100003f20               ; symbol stub for: printf
test[0x100003ec8] <+128>: ldr    x8, [sp, #0x10]
test[0x100003ecc] <+132>: adrp   x0, 0
test[0x100003ed0] <+136>: add    x0, x0, #0xf61            ; =0xf61 
test[0x100003ed4] <+140>: mov    x9, sp
test[0x100003ed8] <+144>: str    x8, [x9]
test[0x100003edc] <+148>: bl     0x100003f20               ; symbol stub for: printf
test[0x100003ee0] <+152>: ldr    x8, [sp, #0x18]
test[0x100003ee4] <+156>: adrp   x0, 0
test[0x100003ee8] <+160>: add    x0, x0, #0xf68            ; =0xf68 
test[0x100003eec] <+164>: mov    x9, sp
test[0x100003ef0] <+168>: str    x8, [x9]
test[0x100003ef4] <+172>: bl     0x100003f20               ; symbol stub for: printf
test[0x100003ef8] <+176>: ldr    x8, [sp, #0x20]
test[0x100003efc] <+180>: adrp   x0, 0
test[0x100003f00] <+184>: add    x0, x0, #0xf73            ; =0xf73 
test[0x100003f04] <+188>: mov    x9, sp
test[0x100003f08] <+192>: str    x8, [x9]
test[0x100003f0c] <+196>: bl     0x100003f20               ; symbol stub for: printf
test[0x100003f10] <+200>: ldr    w0, [sp, #0x2c]
test[0x100003f14] <+204>: ldp    x29, x30, [sp, #0x50]
test[0x100003f18] <+208>: add    sp, sp, #0x60             ; =0x60 
test[0x100003f1c] <+212>: ret    
(lldb) run
Process 21720 launched: '/test' (arm64)
i: 1000
c: abcde
c_ptr: zyx
c_ptr2: V?
Process 21720 exited with status = 0 (0x00000000) 
(lldb) disass -n main
test`main:
0x100003e48 <+0>:   sub    sp, sp, #0x60             ; =0x60 
0x100003e4c <+4>:   stp    x29, x30, [sp, #0x50]
0x100003e50 <+8>:   mov    w8, #0x0
0x100003e54 <+12>:  str    w8, [sp, #0x2c]
0x100003e58 <+16>:  str    wzr, [sp, #0x4c]
0x100003e5c <+20>:  mov    w8, #0x3e8
0x100003e60 <+24>:  str    w8, [sp, #0x48]
0x100003e64 <+28>:  adrp   x8, 0
0x100003e68 <+32>:  add    x8, x8, #0xf50            ; =0xf50 
0x100003e6c <+36>:  ldr    w9, [x8]
0x100003e70 <+40>:  add    x10, sp, #0x40            ; =0x40 
0x100003e74 <+44>:  str    x10, [sp, #0x10]
0x100003e78 <+48>:  str    w9, [sp, #0x40]
0x100003e7c <+52>:  ldrh   w8, [x8, #0x4]
0x100003e80 <+56>:  strh   w8, [sp, #0x44]
0x100003e84 <+60>:  add    x8, sp, #0x38             ; =0x38 
0x100003e88 <+64>:  str    x8, [sp, #0x18]
0x100003e8c <+68>:  mov    x8, #0x797a
0x100003e90 <+72>:  movk   x8, #0x78, lsl #16
0x100003e94 <+76>:  str    x8, [sp, #0x38]
0x100003e98 <+80>:  add    x8, sp, #0x30             ; =0x30 
0x100003e9c <+84>:  str    x8, [sp, #0x20]
0x100003ea0 <+88>:  adrp   x8, 0
0x100003ea4 <+92>:  add    x8, x8, #0xf56            ; =0xf56 
0x100003ea8 <+96>:  str    x8, [sp, #0x30]
0x100003eac <+100>: ldr    w9, [sp, #0x48]
0x100003eb0 <+104>: mov    x8, x9
0x100003eb4 <+108>: adrp   x0, 0
0x100003eb8 <+112>: add    x0, x0, #0xf5a            ; =0xf5a 
0x100003ebc <+116>: mov    x9, sp
0x100003ec0 <+120>: str    x8, [x9]
0x100003ec4 <+124>: bl     0x100003f20               ; symbol stub for: printf
0x100003ec8 <+128>: ldr    x8, [sp, #0x10]
0x100003ecc <+132>: adrp   x0, 0
0x100003ed0 <+136>: add    x0, x0, #0xf61            ; =0xf61 
0x100003ed4 <+140>: mov    x9, sp
0x100003ed8 <+144>: str    x8, [x9]
0x100003edc <+148>: bl     0x100003f20               ; symbol stub for: printf
0x100003ee0 <+152>: ldr    x8, [sp, #0x18]
0x100003ee4 <+156>: adrp   x0, 0
0x100003ee8 <+160>: add    x0, x0, #0xf68            ; =0xf68 
0x100003eec <+164>: mov    x9, sp
0x100003ef0 <+168>: str    x8, [x9]
0x100003ef4 <+172>: bl     0x100003f20               ; symbol stub for: printf
0x100003ef8 <+176>: ldr    x8, [sp, #0x20]
0x100003efc <+180>: adrp   x0, 0
0x100003f00 <+184>: add    x0, x0, #0xf73            ; =0xf73 
0x100003f04 <+188>: mov    x9, sp
0x100003f08 <+192>: str    x8, [x9]
0x100003f0c <+196>: bl     0x100003f20               ; symbol stub for: printf
0x100003f10 <+200>: ldr    w0, [sp, #0x2c]
0x100003f14 <+204>: ldp    x29, x30, [sp, #0x50]
0x100003f18 <+208>: add    sp, sp, #0x60             ; =0x60 
0x100003f1c <+212>: ret    
(lldb) b 0x100003e48
Breakpoint 1: where = test`main at test.c:3, address = 0x0000000100003e48
(lldb) b 0x100003e4c
Breakpoint 2: where = test`main + 4 at test.c:3, address = 0x0000000100003e4c
(lldb) b 0x100003e50
Breakpoint 3: where = test`main + 8 at test.c:3, address = 0x0000000100003e50
(lldb) r
Process 22004 launched: '/test' (arm64)
Process 22004 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100003e48 test`main at test.c:3
   1   	#include <stdio.h>
   2   	
-> 3   	int main() {
   4   	    int i = 1000;
   5   	    char c[6] = {'a', 'b', 'c', 'd', 'e'};
   6   	    char* c_ptr = 'xyz';
   7   	    char* c_ptr2 = "stu";
Target 0: (test) stopped.
(lldb) next
Process 22004 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
    frame #0: 0x0000000100003e4c test`main at test.c:3
   1   	#include <stdio.h>
   2   	
-> 3   	int main() {
   4   	    int i = 1000;
   5   	    char c[6] = {'a', 'b', 'c', 'd', 'e'};
   6   	    char* c_ptr = 'xyz';
   7   	    char* c_ptr2 = "stu";
Target 0: (test) stopped.