[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

[FFmpeg] 動画に複数のぼかしを入れる

[M1 Mac, Big Sur 11.6.8]

FFmpegのコマンドがとにかくわかりにくいので、書き留めておきます。

開発中のビデオツールアプリに実装するには、このコマンドをC++で生成する必要があります。

FFmpeg関連の情報はネットに数多くありますが、どういったユーザー層なのか気になります。C/C++ユーザーよりもコマンドライン使いが多そうです。

ffmpeg -i out.mp4 -filter_complex \          --- (1)
 "[0:v]crop=265:154:648:103,boxblur=4[b0]; \ --- (2)
  [0:v]crop=94:111:572:267,boxblur=4[b1]; \  --- (3)
  [0:v][b0]overlay=648:103[ovr0]; \          --- (4)
  [ovr0][b1]overlay=572:267[ovr1]" \         --- (5)
-map "[ovr1]" out2.mp4                       --- (6)

(1) 入力ファイルはout.mp4。以下、-filter_complexを記す。
(2) 入力ファイル0番目の映像[0:v]について、x:648,y:103の位置からw:265,h:154のサイズでクロップし、レベル4のboxblur処理をする。これをb0とする。
(3) 入力ファイル0番目の映像について、x:572,y:267の位置からw:94,h:111のサイズでクロップし、レベル4のboxblur処理をする。これをb1とする。
(4) 入力ファイル0番目の映像とb0をx:648,y:103の位置で重ねる。これをovr0とする。
(5) ovr0とb1をx:572,y:267の位置で重ねる。これをovr1とする。
(6) ovr1をマッピングし、out2.mp4として出力する。

[MacOS] ディレクトリ権限の変更によるアプリ動作不良

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

通信プロトコルの実験を進めていく過程でなぜかホームディレクトリへの書き込みが不可になっていたため、一部アプリが動かなくなりました。

ホームディレクトリの権限を縮小した覚えは全くないのですが、以下のように読み取り可能、書き込み不可、実行可能になっていたので、chmodコマンドで権限を全て可能に戻しました。

[MacOS] Windows機とのファイル送受信 SFTPコマンド例

[M1 Mac, Big Sur 11.6.8]
[DeskMini B660, Windows11]

MacとWindows機との間でファイルのやりとりができるようにしました。

Macをサーバーとする送受信はOpenSSHクライアントがデフォルトで有効になっているため、何も設定しなくてもWindows機コマンドプロンプト(あるいはPowerShell)からSFTPコマンドで可能です。

今回の設定はWindows機がサーバー、MacがクライアントのSFTPによるファイル送受信になります。

手順は以下の通りです。

1.Windows11のオプション機能 OpenSSHサーバーを追加する。

2.”コンピューターの管理”でOpenSSHサーバーを有効にする。

`3.コマンドプロンプトにhostnameを入力してホスト名を確認する。

4.MacのターミナルからWindows機にアクセスする。

sftp ホスト名.local

5.getコマンド、putコマンドでファイルをコピーする。

# Windows11のホームにあるtest.txtをMacのdirへコピーする。
get test.txt [to mac dir]

# Windows11のホームにあるtestディレクトリをMacのホームへコピーする。
get -r test

# Windows11のホームにあるtestディレクトリ内のファイル全てをMacのdirへコピーする。
get -r test [to mac dir]

# Macのホームにあるtest2.txtをWindows11のdirへコピーする。
put test2.txt [to win dir]

[MacOS] Mac間のファイル転送 SFTP

[M1 Mac, Big Sur 11.6.8]

ローカル環境のMac間でファイルをコピーする時は、iCloudやFinderのSMB接続を使っていましたが、iCloudは同期が異様に遅い、SMB接続はトラブルが多いため、結局USBストレージでコピーファイルを移すことが多かったです。

最近、通信プロトコルを学習していて、SFTPコマンドを使えば簡単にファイル転送できることを知りました。SFTPはFTPのセキュリティ強化版です。なおAirDropはWi-Fi接続が必須なので今回は除外しています。

これまでGUIでSMBプロトコルを使うとトラブルに見舞われることが多かったので、これを機会にSFTPへシフトするつもりです。

これで大分作業効率がアップしそうです。Macユーザーでどれくらいの方がSFTPを使っているか知りたいです。

次はWindows機との効率的なファイル送受信を検討します。

SMBのトラブル例(他にログインがなくてもこうなる)
SFTPによるファイル転送(ディレクトリ転送も可能)

[AppleScript] 02 アルファベット入力からローマ字変換 スクリプト案

かなり時間が掛かりましたが、土台が出来上がりました。

以下のスクリプトではクリップボードのアルファベットをひらがなに変換するだけです。

操作中のアプリで文字を全選択してひらがな変換し、アプリに貼り付けるという動作はまだできません。

いつになるかわかりませんが、完成すればAutomatorに登録してショートカットを割り当てる予定です。

それにしてもAppleScriptの情報の少なさには困り果てました。ネット検索する限りでは日本語ユーザーの有識者は2人位しかいらっしゃいません。on – endが関数の設定と分かるまでは全く前に進みませんでした。

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() -- 今のところ機能せず

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

on pasteString()
    tell current application
        activate
        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

参考サイト

[AppleScript] 01 アルファベット入力からローマ字変換

アルファベットから”かな”キー連打でローマ字変換するという機能がmacOS Monterey 12.3.1では今のところ使えません。

もうAppleの対応をあてにせず、AppleScript等でなんとかできないか探ってみます。

実装したい内容は以下の通りです。
1.カーソル直近のアルファベット文字列を自動選択する。
2.ローマ字変換でひらがなに変換する。
3.漢字変換する。
アサインするキーはこれまで通り”かな”キー連打あるいは⌘ + 1文字とします。

ネットで調べるとAppleScriptでNSStringTransformLatinToHiraganaを使っているコード例が見つかりました。

またBig Surに戻すのもアホらしいのでなんとかしたいです。

[macOS] 34 launchdによる定期実行 実施例

[macOS Big Sur 11.6.1]

launchdによるプログラムの定期実行を試してみました。

エディタやXcodeを使ってxml形式でplistファイルを作成するのですが、エディタでは非常に書きにくいです。Xcodeが多少マシかと思います。どちらにしても結局crontabの方が扱いやすいです。

plistファイルを/Library/LaunchAgentsに作成したら、chownコマンドで所有者変更、chmodコマンドで権限変更します。最後にplistファイルをロードすると定期実行が始まります。

下記コード例では60秒おきにtest.pyを実行します。

このスキルはcrontabが使えなくなった際の代替手段としてストックしておきます。htmlとxmlは極力書きたくないです。だからなのかJavaScriptとはまた疎遠になっています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>test</string>
    <key>ProgramArguments</key>
    <array>
        <string>python</string>
        <string>test.py</string>
    </array>
    <key>StartInterval</key>
    <integer>60</integer>
    <key>StandardOutPath</key>
    <string>test.out</string>
    <key>StandardErrorPath</key>
    <string>test.err</string>
</dict>
</plist>
Xcodeでplistを表示
# plistを有効化
launchctl load test.plist

# plistを無効化
launchctl unload test.plist