.bash_profileの条件分岐 カレントディレクトリによるPATH優先順位変更

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0]

以前の記事”[AI] ローカルLLM検証 llama.cppのmake時にSegmentation fault:11発生 macOS”で.bash_profileを書き換え、PATHの優先順位を変えました。

何らかの弊害があるだろうと思っていましたが、早速問題が表出しました。

pythonコマンドで/usr/local/binにある普段使いのPython3.10.4ではなく、/usr/binにあるPython3.9.6(macOSのデフォルト)が呼び出されるようになりました。

ChatGPTに解決方法を教えてもらい、以下のように.bash_profileを書き換えました。

PROMPT_COMMAND="check_for_llama_cpp"
check_for_llama_cpp() {
    # grepファイルを読み込めるようにする
    export PATH=/usr/bin:$PATH

    if ls | grep -q "llama.cpp"; then
        # 'llama.cpp' を含むディレクトリの場合
        export PATH=/usr/local/bin:$PATH
        export PATH=/usr/bin:$PATH
    else
        # それ以外のディレクトリの場合
        export PATH=/usr/bin:$PATH
        export PATH=/usr/local/bin:$PATH
    fi
}

これでllama.cppをビルドする時だけPATHの優先順位が変わり、/usr/binが優先されます。カレントディレクトリが変わる度にPROMPT_COMMANDによるチェックが入る仕組みです。その度にPATHデータが増えていきますが、パフォーマンスに影響はないでしょう。

[Xcode] アイコン登録 iOSとmacOSの違い 黒枠付きになる

[M1 Mac, Ventura 13.3.1, Xcode 14.3]

iOSアプリのアイコンとしてmacOSアプリで使ったアイコンと同サイズのものを登録すると下図のように黒枠で囲まれてやや小さいアイコンになりました。

黒枠付きアイコン(左側)

調べると、iOSの方は正方形の画像を登録しXcodeが角丸のアイコンにトリミングしてくれる仕組みであることが分かりました。

引用元:Apple Developer Documentation

iOSアプリ開発者の手間を軽減するようAppleが配慮しているということでしょうか。売上の半分以上を占めるiPhoneならさもありなんといったところです。

かといってmacOSアプリ開発者の方からiOSに合わせろという声は上がらないでしょう。アイコンも製作物の一部ですし角丸にするくらい自分でできる、と思っているのでは。

黒枠がとれたアイコン

[Xcode] printデバッグ時のコンソール表示

[M1 Mac, Ventura 13.3.1, Xcode 14.3]

Xcodeの独特なUIのおかげで足止めを食らったので記録しておきます。

何かの拍子にDebug AreaのVariables Viewボタンを押してしまったためにコンソールが表示できず、しばらく右往左往しました。

Debug Area右下のView選択ボタンにホバーした際、ボタンを押した時の動作がポップアップ表示されるのですが、非常に紛らわしいです。自分なら今現在の状態、例えば”Console Active”と表示させます。ボタンのラベルならともかく、ポップアップにボタン動作を表示させるのは私的には御法度です。

青色だからActiveだというのは分からないことはないものの、どうもしっくりきません。またデフォルトでは左右表示ですから元に戻すボタンが欲しいところです。

高機能ゆえに仕方がないことかもしれませんが、本当に初心者泣かせなUIです。この分かりにくさはDAWアプリのCubaseに通じるところがありますね。

IDEを使うとどうしても不満たらたらになってしまいます。iOSアプリを非IDE環境で作るのはハードルが高すぎるので我慢するしかありません。

Variables Viewのみ表示
Variables Viewとコンソール表示

[Swift] 27 iOSアップデート時のWatch Appトラブル

[M1 Mac, Ventura 13.3.1, Xcode 14.3]

iOSとwatchOSをそれぞれ16.5.1、9.5.2にアップデートしたところWatch Appが消えてしまいました。Watch App with iOS Appの方は残っています。

自製Watch Appを全て消して再インストールしようとするとApple Watchを認識できないとか色々難癖を付けてきます。

結局Mac、iPhone、Apple Watchを全て再起動すると直りました。最初からそう言ってほしいものです。

この手のトラブルは以前から発生しているようでApple開発者フォーラムでも非難囂々です。ちなみにMacとiPhoneはUSBハブ経由ではなく直接つなぐ方がいいらしいです。

[AI] ChatRWKVアプリ製作 その12 Mac版メモリ制限解除

[M1 Mac, Ventura 13.3.1, Python 3.10.4, PyTorch 2.0.0]

Mac版を改良しメモリの制限を解除できるようにしました。

def loadModel(self):
    self.box.setStyleSheet('background-color: #3E62AD')
    self.output.setText("")
    
    # PyTorch環境変数設定
    limitoffChecked = self.limit.isChecked()
    
    if limitoffChecked == True:
        os.environ['PYTORCH_MPS_HIGH_WATERMARK_RATIO'] = '0.0'
    else:
        try:
            del os.environ['PYTORCH_MPS_HIGH_WATERMARK_RATIO']
        except:
            pass

    try:
        print(f'PYTORCH_MPS_HIGH_WATERMARK_RATIO = {os.environ["PYTORCH_MPS_HIGH_WATERMARK_RATIO"]}\n')
    except:
        print('PYTORCH_MPS_HIGH_WATERMARK_RATIOは設定なし\n')

<以下略>

[AI] ChatRWKVアプリ製作 その11 M1 Mac / Metalで再挑戦

[M1 Mac, Ventura 13.3.1, Python 3.10.4, PyTorch 2.0.0]

ChatRWKVの設定により7Bサイズのモデルを読み込めるようになりました。

環境変数 PYTORCH_MPS_HIGH_WATERMARK_RATIOをゼロに設定しメモリ使用の上限を撤廃することで読込が可能になります。ただしシステムが不安定になる可能性があるため要注意です。

動作はかなり遅く実用にはほど遠いですが、RAMメモリ強化でどこまで速くなるのか興味深いです。

ところでAppleのイベントWWDCが今晩開催されますが(日本時間6/6 午前2時)、AIについてどのような発信があるのか楽しみです。

またグランフロント大阪にApple Storeを出店する計画があるとか。実現したらヨドバシ梅田と同様に売り上げ日本一になるのでは。

import os

# PyTorch環境変数設定
os.environ['PYTORCH_MPS_HIGH_WATERMARK_RATIO'] = '0.0'
print(f'PYTORCH_MPS_HIGH_WATERMARK_RATIO = {os.environ["PYTORCH_MPS_HIGH_WATERMARK_RATIO"]}\n')
self.stratChoice = QComboBox(self)
self.stratChoice.setGeometry(215,70,100,25)
self.stratChoice.addItem('mps fp32 -> cpu fp32 *10')
self.stratChoice.addItem('mps fp32')
self.stratChoice.addItem('cpu fp32')
self.stratChoice.addItem('cuda fp16')
7Bでは環境変数を変更しないとエラーになる
環境変数変更で7Bは読み込めたが動作はかなり遅い

[C++] 312 FTDI FT-XシリーズをBit Bangモードで使う MacOS

[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]

FTDIの技術資料にあるサンプルコードをApple Silicon Macで動くようにしました。いつものように非IDE環境です。

AN_373 Bit-Bang Modes for the FT-X Series

D2XXドライバをダウンロードして、適当な所に配置します。今回は/usr/localディレクトリにしました。

Windows用のコードをApple Siliconにて非IDE環境で使えるようにする、といった類いの作業は自分なりの手法を確立させているので、比較的はかどります。やっていて楽しい作業です。今回はCocoaフレームワークとIOKitフレームワークのビルドオプションへの追加が肝でした。

FT231Xを使ってAVRマイコンに書き込みできるのか検証中です。

ただ、Bit Bangの解説資料ではあるもののフル機能を使えるわけではないような気がします。

// #include <Windows.h> 元はWindows用
#include <stdio.h>
#include <stdint.h>
#include "ftd2xx.h"

FT_STATUS ftStatus;
FT_HANDLE ftHandle;
DWORD w_data_len = 3; //write 3 bytes
DWORD data_written; // number of bytes written
UCHAR Mask = 0x0F;  //00001111 Set D7-D4 input, D3-D0 output [input (0) and output (1)]
UCHAR Mode = 0x04;  //0x04 = synchronous bit-bang
DWORD RxBytes; //number of bytes to be read from the device
DWORD BytesReceived; //number of bytes read from the device
uint8_t RxBuffer[8]; //buffer to receive data from FT-X device
uint8_t data_out[8]; //buffer for data to be sent to FT-X device
unsigned int i;

int main() 
{
    ftStatus = FT_Open(0, &ftHandle);
    ftStatus |= FT_SetUSBParameters(ftHandle, 4096, 4096); // Set USB transfer sizes
    ftStatus |= FT_SetChars(ftHandle, false, 0, false, 0); // Disable event characters
    ftStatus |= FT_SetTimeouts(ftHandle, 5000, 5000); // Set read/write timeouts to 5 sec
    ftStatus |= FT_SetLatencyTimer(ftHandle, 16); // Latency timer at default 16ms
    ftStatus |= FT_SetFlowControl(ftHandle, FT_FLOW_NONE, 0x11, 0x13);
    ftStatus |= FT_SetBaudRate(ftHandle, 62500); //bit rate is x16 this value = 1M

<以下略>
# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# オプション設定
CPPFLAGS = -std=c++20
LDFLAGS = -lc++ -framework Cocoa -framework IOKit

# includeパス(-I)
INCLUDE = -I./include \
-I/usr/local/D2XX

# ライブラリ(-l)
LIBRARY_l = /usr/local/D2XX/build/libftd2xx.a

# ライブラリパス(-L)
LIBRARY_L = -L/usr/local/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(addprefix $(OBJDIR), $(patsubst ./src/%.cpp,/%.o,$(SRCS)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = test

# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS)

# コンパイル&ビルド
.PHONY:all
all: clean $(OBJS) $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app

[MacOS] .DS_Store関連の検証 Makefile動作不調解決 / ChatGPTの虚言癖改善

[M1 Mac, Monterey 12.6.3, clang 13.0.0, ChatGPT API(gpt-3.5-turbo), NO IDE]

.DS_Storeを削除せずにMakefileを正常動作させることが出来るようになりました。

findコマンドでsrcディレクトリ内のcppファイルパスを取得する際、.DS_Storeファイルを対象外としました。findコマンドにそのような機能があるとは知りませんでした。*.cppのワイルドカードで良かったのかも。

今回の件でChatGPTに散々嘘をつかれて振り回されたため、虚言癖が出ないようsystemロールで”あなたはソースが明確に存在することしか発言しないチャットボットです”と釘を刺すと少しましになりました。

嘘をつくなと指示してもその概念が分からないようなので、かみ砕いて説明する必要がありました。

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f -not -name ".DS_Store")

[MacOS] .DS_Store関連の検証 Makefile動作不調

[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT API(gpt-3.5-turbo), NO IDE]

Spotlightのためにディレクトリ情報をまとめた.DS_StoreがMakeコマンドを妨害することがあります。

対象ディレクトリにある.DS_Storeを消してしまえば済む話ですが、それではSpotlightが正常に機能しなくなるのでMakeコマンド実行時にこのファイルを無視できないか方法を探っています。ちなみにGitではgit ignoreを使って無視できます。

.DS_StoreはFinderで隠しファイルを見えるようにしても隠れたままですから、取り扱いがやっかいです。

取りあえず消してしまった.DS_Storeを仮置きするために他のディレクトリからコピーする方法をメモしておきます。

全てのディレクトリに.DS_Storeは存在しているはずなので、最初にfindコマンドで所在を確認する必要は特にありません。

# .DS_Storeファイルの所在を確認
$ find "/ChatGPT" -name ".DS_Store"
# 出力
/ChatGPT/.DS_Store
/ChatGPT/.git/.DS_Store
/ChatGPT/bin/.DS_Store
/ChatGPT/etc/.DS_Store
/ChatGPT/images/.DS_Store
/ChatGPT/include/.DS_Store
/ChatGPT/obj/.DS_Store

# 適当な.DS_Storeファイルを対象ディレクトリへコピー
$ cp /ChatGPT/obj/.DS_Store /ChatGPT/src

# コピーできているか確認
$ find "/ChatGPT" -name ".DS_Store"
# 出力
/ChatGPT/.DS_Store
/ChatGPT/.git/.DS_Store
/ChatGPT/bin/.DS_Store
/ChatGPT/etc/.DS_Store
/ChatGPT/images/.DS_Store
/ChatGPT/include/.DS_Store
/ChatGPT/obj/.DS_Store
/ChatGPT/src/.DS_Store