[Python] 359 ファイル名の数字を引き算してリネーム

[Mac M2 Pro 12CPU, Ventura 13.6, Python 3.10.4]

画像ファイル名に含まれる数字を抽出して引き算しリネームするスクリプトを書きました。

下記スクリプトでは2桁の数字から2を引き算した新ファイル名にリネームしています。

import os, shutil

srcDir = "/images"
dstDir = "/images2" # 移動先

for filename in os.listdir(srcDir):
    if filename.endswith(".jpeg"):
        newName1 = (filename.split(".")[0]).split(" ")[0]
        newName2 = str(int((filename.split(".")[0]).split(" ")[1]) - 2).zfill(2)
        print(newName1 + newName2)
        
        new_filename = newName1 + " " + newName2 + ".jpeg"
        oldPath = os.path.join(srcDir, filename)
        print(oldPath)
        
        newPath = os.path.join(dstDir, new_filename)
        print(newPath)
        
        os.rename(oldPath, newPath)      # ファイル移動
        # shutil.copy2(oldPath, newPath) # ファイルコピー

[Swift] 44 Apple WatchのComplication改良 / watchOS 10による表示不良 解決 / containerBackground

[Mac M2 Pro 12CPU, Ventura 13.6, watchOS 10.0.1, Xcode 15.0]

[Swift] 42で報告したComplicationの表示不良が解決しました。Viewコンテンツの新属性として.containerBackgroundを追加するだけでした。

watchOSの大型アップデートの際に新属性記述が必須になることがあるようです。Apple Developer ForumsとMac OTAKARAの記事を参考に修正しました。

WWDC23で前もって紹介されており、Appleのやらかしではありませんでした。

ただApple Watch SEのシミュレータでは新属性なしでも正常表示しているのが解せないです。アップデートしたwatchOS 10では対応が必要で、watchOS 10そのものには不要なのでしょうか。

解決しない場合は、検証用追加機としてApple Watch Series 8あたりを購入しようかと覚悟していたので助かりました。

SE 第2世代でもいいから追加機導入して2台開発体制にする方がいいかな。iOSとは違ってwatchOSアップデートはサブ機でお試しが無難ですから。

watchOS 10でも正常表示になった
struct MemoToolAW_ComplicationsEntryView : View {
    var entry: Provider.Entry

    var body: some View {
        Image(systemName: "square.and.pencil")
        .resizable()
        .aspectRatio(contentMode: .fit)
        .foregroundColor(.white)
        .background(Color.blue)
        .containerBackground(for: .widget){  // watchOS 10から必須
            Color.blue
        }
    }
}

参考
Apple Developer Forums
Mac OTAKARA

[Swift] 43 Apple WatchのComplication改良 / accessoryCornerの円弧状表示 / watchOS 10

[Mac M2 Pro 12CPU, Ventura 13.6, watchOS 10.0.1, Xcode 15.0]

watchOS 10でComplicationのコーナー全体を円弧状表示できるようになりました。

これまではラベルのみ円弧状表示で本体は水平表示でした。水平表示では”令5″の2文字でスペース的に限界だったのを”令和5″の3文字に増やすことができました。

ただし前回記事に書いている通り、実機(Apple Watch SE)ではまともに表示できていません。シミュレータでのみ成功しています。

struct ComplicationCorner : View {
    var entry: Provider.Entry
    
    var body: some View {
        Text(getFormattedYear())
        .font(.system(size: 22))
        .widgetCurvesContent()  // これを追記、"令和5"が円弧状に表示される
        .foregroundColor(.green)
        .widgetLabel {
            Text(getFormattedDate() + getFormattedWeekday())
            .foregroundColor(.yellow)
        }
     }

[Swift] 42 Apple WatchのComplication改良 / watchOS 10による表示不良

[Mac M2 Pro 12CPU, Ventura 13.6, watchOS 10.0.1, Xcode 15.0]

watchOS 10になってAppleさん早速やらかしています。

自製のComplicationがまともに表示されなくなりました。

watchOSはAppleや専門業者以外ダウングレードできないので、Appleがバグ修正するまで放置するしかありません。

XcodeはApple Watch実機をなかなか認識できなくてビルドがままならず、watchOSアプリの開発は時間が掛かるばかりです。結局、iPhoneをMacに有線で再接続するとXcode上でApple Watch実機を認識できました。

iPhone & Apple Watchは家族のヘルスケア管理端末にして、普段使いはPixel & Pixel Watchにしようかと思い始めています。ファミリーウォッチ機能がなければとっくに見切りを付けているところです。

Complicationの
表示不良(内側上・左, 右下)

[Swift] 41 メモアプリ製作 その12 ToolbarItemのplacement新機能 watchOS 10

[Mac M2 Pro 12CPU, Ventura 13.6, watchOS 10.0.1, Xcode 15.0]

watchOSが10にバージョンアップし、watchOS版アプリのToolbarItemの位置をbottomに設定できるようになりました(.bottomBarと記述)。

これまでは”.automatic”にして上部にしか配置できませんでした。これでメモアプリwatchOS版のUIを改善できました。

この種の機能がバージョン10にしてようやく導入というのは結構遅いと思います。急ピッチで機能の拡充をお願いしたいものです。

import SwiftUI
import CoreData

struct ContentView: View {
    @Environment(\.managedObjectContext)var viewContext

    @FetchRequest(
    entity: Note.entity(),
    sortDescriptors: [NSSortDescriptor(key: "creationDate", ascending: false)])
    private var contents: FetchedResults<Note>

    var body: some View {
        NavigationView{
            List{
                ForEach(contents){content in
                    NavigationLink{
                        if((content.content?.isEmpty) == false){
                            DraftAppleWatch(text:content.content!, note: content)
                        }
                    }label:{
                        if((content.content?.isEmpty) == false){
                            Text(content.content!)
                        }
                    }
                }
                .onDelete(perform:deleteContent)
            }
            .navigationTitle("メモリスト")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar{
                ToolbarItem(placement:.bottomBar){ // ここを変更
                     NavigationLink{
                        DraftAppleWatch()
                    }label:{
                        Text("+")
                        .font(.system(size: 24))
                        

                    }
                }
            }
        }
        .accentColor(.blue)
    }
<以下略>

[JavaScript] 18 Adobe XDのアイテムデータを取得するプラグイン作成 その4 テキスト出力 / UXP for Adobe XD

[Mac M2 Pro 12CPU, macOS Ventura 13.5.2]

Adobe XDでitemの座標とサイズを出力するプラグインを作成しています。

これまでは開発者コンソールに出力させてからコピー&ペーストしてテキストファイルを作成していました。

UXP for Adobe XDというプラットフォームを使うとファイル選択画面を表示させてテキストファイルに出力させることが出来ます。

ChatGPT(gpt-4)がこのプラットフォームの存在を教えてくれました。gpt-3.5ではAdobe XDのような商業アプリに関する情報はほとんど扱っていません。

一部有識者がgpt-4の性能低下を明らかにしていますが、それは高度な計算を大量に実行する場合の話であって、一般的な用途では変わらず優秀だと言えるでしょう。

const fs = require("uxp").storage.localFileSystem;

async function myCommand(selection) {
    let items_list = "";
    var num = 1;
    selection.items.forEach(function(value){
        if (num < selection.items.length){
            items_list += value + ";";
        } else {
            items_list += value;
        }
        num += 1;
    });

    // txtファイルとして保存する
    const file = await fs.getFileForSaving("output.txt", { types: ["txt"] });
    await file.write(items_list);
}

module.exports = {
    commands: {
        GetItemXY: myCommand
    }
};
前回の記事

[JavaScript] 17 Chrome拡張機能をSafariへ移植

[Mac M2 Pro 12CPU, macOS Ventura 13.5]

YouTubeをカスタマイズする拡張機能 own-youtubeをSafariへ移植しました。ソースコードはGitHubから入手しました。

移植と言ってもそんな大層な内容ではなく、Xcode上でChrome版をコピーしただけです。Finder上でファイルコピーしてもxcodeprojファイルに反映されないため移植は出来ません。

iPadOSでは正常に動作しましたが、iOSでは検索窓だけの初期画面にはなりませんでした。

この拡張機能を導入してから安易に動画を再生しなくなり、時間を無駄に消費することもなくなりました。

Safari Extension Appの空プロジェクトを作成してからChrome版をコピーする

[C++] 349 FLTK : ChatGPTアプリの製作 その36 jsonファイルをフォルダに振り分ける

[Mac M2 Pro 12CPU, MacOS Ventura 13.5, clang 14.0.3]

自製ChatGPTアプリに関する記事は3月以来5ヶ月ぶりです。記事にはしていませんが、これまで何度も更新を重ねグレードアップしています。

ChatGPTアプリでのやりとりはjsonファイルとして保存しています。大分ファイルがたまってきたため、年月フォルダ(今月の場合は”2308″)を自動作成して振り分けるMovJSボタンを実装しました。

ChatGPTにコードを書いてもらいました。一応コードはチェックして問題なさそうなのでビルド&実行したところ一発で成功しました。

実装完了までものの10分です。AIアシストでプログラミングすると生産性爆上がりです。

#include <iostream>
#include <filesystem>
#include <fstream>

namespace fs = std::filesystem;

void movJSONCB(Fl_Widget*, void*){
    fs::path srcDir = "/ChatGPT";

    // srcDirにあるjsonファイルのpathをリスト化する
    std::vector<fs::path> jsonFiles;
    for (const auto& entry : fs::directory_iterator(srcDir)) {
        if (entry.path().extension() == ".json") {
            jsonFiles.push_back(entry.path());
        }
    }
    
    // ファイル名の先頭4文字のフォルダを作成する
    for (const auto& jsonFile : jsonFiles) {
        std::string folderName = jsonFile.filename().stem().string().substr(0, 4);
        fs::path folderPath = srcDir / folderName;
        
        // フォルダがすでに存在する場合は上書き作成しない
        if (!fs::exists(folderPath)) {
            fs::create_directory(folderPath);
        }
        
        // ファイルをそれぞれのフォルダに振り分ける
        fs::path destinationPath = folderPath / jsonFile.filename();
        fs::rename(jsonFile, destinationPath);
    }
}

[AI] GPT-4 APIの利用資格 2023/08

先月7月からOpenAIへ1ドル以上の支払実績のあるユーザーにGPT-4 API利用資格が付与されるようになりました。

低課金ユーザーの私は7月0.52ドル、8月1.5ドルの支払いでようやく資格を得ることができましたが、今のところGPT-4を使える状態になっていません。

モデルの利用可否はOpenAIサイトのPlaygroundで確認できます。

Bingで使った感触ではGPT-4は能書きが多いだけでコーディングのアシストには余り向いていない印象ですが、早く突っ込んだ検証をしたいです。

自製アプリはGPT-4に対応済み

23/08/09追記
23時の時点でGPT-4 APIを使えるようになっていました。これから検証に取り掛かります。

GPT-4 APIが使用可能になった

[C++] 348 size_tの大きさ

[Mac M2 Pro 12CPU, MacOS Ventura 13.3.1, clang 14.0.3]

size_tはサイズを表す符号なし整数型データです。

符号なしの整数型であればunsigned intでいいのではないかと考えることもできますが、size_tはポインタを格納する場合もあるため4バイトのunsigned intでは足りないです。8バイト必要になります(64ビットプラットフォームの場合)。

コードで出力しようとするとintと同じように扱えるので何のために存在しているのか疑問に思っていましたが、ようやく理解できました。