Programming」カテゴリーアーカイブ

NSApp

Objective-c のコードだけで NSApp を作るソースを作成。
って以前 PyObjC で作ったんだから Objective-c に書き戻すだけだ。

NSApplication – Paepoi

と思ったんだけど動かない、何故だ?
検索しまくって以下のページを見つけた。

Minimalist Cocoa programming

setActivationPolicy を追加したらなんとか動くようになった。
逆に PyObjC は何故いらないんだ?
それとガベージコレクションではないので破棄が必要なんだなこれが。
NSAutoreleasePool という便利なものはこう使うみたい。

#import <Cocoa/Cocoa.h>

// clang app.m -framework Cocoa

@interface AppMenu : NSMenu
//- (id) init; // いらない
@end

@implementation AppMenu
- (id) init {
    [super init];
    id item_app = [[NSMenuItem new] autorelease];
    [self addItem:item_app];
    id menu_app = [[NSMenu new] autorelease];
    [item_app setSubmenu:menu_app];
    id item_quit = [[NSMenuItem new] autorelease];
    [item_quit initWithTitle:@"Quit App" action:@selector(terminate:) keyEquivalent:@"q"];
    [menu_app addItem:item_quit];
    return self;
}
@end

int main(int argc, char *argv[]) {
    // ガベージコレクションではないのでコレを利用
    [NSAutoreleasePool new];
    // NSApp を作る
    [NSApplication sharedApplication];
    // C ではコレが必須だった
    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
    // command+Q で終了するメニューを入れる
    id main_menu = [[AppMenu new] autorelease];
    [NSApp setMainMenu:main_menu];
    // コレをしないと最前面に出てこない
    [NSApp activateIgnoringOtherApps:YES];
    // メインループを回す
    [NSApp run];
    //
    return 0;
}

a.out

動いたんだけど。。。。。

command+Q は使えるんだけどメニューが選択できない。
一度非アクティブにして再度アクティブ化すればイケるんだけど。
てかリンク元のコードも同じジャン。
PyObjC 版はそんな必要なんて無いのに何故だろう?

どうでもいかもしれないけれど、M1 Mac でビルドしたんだけど。
Silicon Info で確認したらこの a.out は arm64 で動いていた。

ついでに。
SyntaxHighlighter は objective-c ハイライトが無いのね。

BloggerのSyntaxHighlighterでObjective-Cを表示する方法 – menXpon

作っている人がいるってのが有名アプリのいいところ。
筆者の WordPress は自前設置なので scripts に放り込むだけ。
後は Add Code to Head プラグインの設定で以下を追加。

<script type="text/javascript" src="/sh2/scripts/shBrushObjectiveC.js"></script>

プレビュー、よしハイライトできた。
ただ Objective-c なんて今後そんなに使うか疑問なんだけど。

C++14

unary_function は C++11 から非推奨だったのね。
functional – cpprefjp C++日本語リファレンス

std::cout を覚えただけで C++ を簡単みたく書く初心者ブログが多いよね。
筆者の Tips ページはそいつらが見たら絶望するように STL を使っていたり。
なのでワケワカメの代表 unary_function が使えないのは困ったなぁ。
と思ったけどコメントアウトしただけで動くじゃん。

それと auto で便利になったとかも見かける。
いや、class で this を戻すのに auto 指定できるレベルでないとそれほど。
…できるジャン!

// stl.cc
#include <iostream>
#include <vector>
#include <algorithm>

/**
 * Fedora 33
 * g++ stl.cc
 *
 * macOS Big Sur
 * clang++ -std=c++14 stl.cc
 */

/*
 * みんな大好き C++ のテンプレート
 * C++11 より unary_function は非推奨
 * なんだけど、継承する必要が無くなっただけだったり
 */
template <class T>
struct outputfunc { // : public std::unary_function<T, void> {
    void operator()(T obj) {
        std::cout << obj << " ♪♪♪ ";
    }
};

class App {
public:
    App() {
        std::vector<std::string> vec = {"SUZUKIの", "バイクは", "カッコイイ"};
        // 関数オブジェクトにしたけど今は範囲ベース for のほうがいい
        std::for_each(vec.begin(), vec.end(), outputfunc<std::string>());
    }
    ~App() {
        std::cout << std::endl << "今日も元気でね!" << std::endl;
    }
    static auto init() {
        // auto で this を戻せる
        return new App();
    }
};

int
main(int argc, char* argv[]) {
    // イヂワルな初期化
    auto app = App::init();
    delete app;
    return 0;
}

cpp14

macOS ではオプションが必要なのね、c++17 指定でもいい。
for も Python と同じようにできるし、使わない間に随分進化していた。
後は :: と -> が全部ドットになれば、って今更無理だろうな。
たまにしか C++ を触らないとどうしてもソコがね。

C11

C 言語って C99 の後に C11 というのがあるんだね。

C11 (C言語) – Wikipedia

gets を排除なんてどのコンパイラもやらないだろうな。
gets_s なんて Clang も gcc も使えないぞ、cc.exe ただ一つじゃねーの?

しかし gets で検索するとみんな色々書いているけど。。。
GNU Readline ってそんなに無名なんだろうか?

GNU readline | Paepoi Blog

標準入力では一番の選択肢だと思うんだけど、まあ人それぞれ。

char16_t と char32_t 型か、今までどおり wchar_t で問題ないような。
UTF-16 と UTF-32(UCS-4) が混在する場合なんてありえる?

てか

#include <uchar.h>

が macOS では CLang でも gcc でもエラーなんだけど?

macos – OS Xでuchar.hが見つからない – スタック・オーバーフロー

古い質問だけど今もそうなの?
Fedora の gcc だと普通にコンパイルできるんですけど。
U の接頭子ならイケたのでそっちでやってみる。

#include <stdio.h>

int main (int argc, char const* argv[]) {
    printf("wchar size: %lu byte\n", sizeof(L'a'));
    printf("UTF-32(UCS-4) size: %lu byte\n", sizeof(U'a'));
    return 0;
}

utf32

うん、Fedora の gcc も macOS の Clang もオプション無しでイケる。
全部 UTF-32 なのよね、NSString が UTF-16 なのが少し困る。
あっ混在あった、ってそれ相互利用なんてしないと思うけど。

Fedora C99

あれ?

c99

Fedora 33 の gcc で C99 ってオプション無しで対応しているんだね。
知らない人多いかもだけど C99 以前は先に変数宣言が必須だったのよ。
ちなみに GNOME アプリのソースは今でも全部そうなっている。

C++11 範囲ベース for ループ 入門

c++11

C++ 11 もそのまんまビルドできるじゃん。
いや筆者って C++ は面倒臭いのでほとんど使わないんだけど。

C++14 – Wikipedia

検索したら C++14 も既に、Clang も当然のように。
なんてこった。。。。。

gcc で C/C++ – Paepoi

筆者の作った上記ページがまさか過去の遺物になっていたとは。
M1 Mac で Clang なんてページを追加しようと思ったらこんなことに。
書き換えするか、忙しいのでのんびり待ってね。

M1 Mac JXA and PyObjC

会社の都合で休日出勤は無しなので M1 Air をしっかり試す。
たしかパワーは 2019 Air の五倍なので筆者の 2018 からだと八倍くらいか。
ログイン画面まで 15 秒、パスワードを打ち込みプラス 15 秒でもう使える。
他に Web でベタ褒めされている件、あれらは全部本当だった。
こんなの筆者の知っている Macbook Air じゃない、怪物にも程がある。

とりあえず再構築、Atom を公式サイトから入れよう。
起動しようとすると Rosetta2 をインストールしますか?とアラートが。
インストールを選ぶと一瞬で入ったから内部で有効化しただけだと思うけど。
ぶっちゃけ来年くらいまでは全員が入れると思う。

Atom を Gedit のように使う – Paepoi

再構築完了、書いてて良かった自前カスタムのすべて。
早速 JXA を試そう、ES2020 は対応されているか。
?? 演算子と BigInt と globalThis をまとめてテスト。

#!/usr/bin/osascript

const p = globalThis.print ?? console?.log;
p(12341234123412341234n *2n);

atom_run

動くじゃないの。

GNOME 3.38 Gjs | Paepoi Blog
import 関数は使えない。
Promise も動いた、ただ筆者には便利さが解らない。
matchAll も動く、Gjs と同じく詳細は出力されないけど。

だいたい Gjs と同じって感じ。
ただし、NSMakeRect のバグはそのまんまだ、やっぱりやる気無いのね。

しかしマジで Python2 がデフォルトで入っているのがなんとも。
PHP は 7.3.22 か、さくらインターネットでさえ 7.4.10 なのに。
perl と ruby はどうでもいい。

端末で python3 と打ち込むと CommandLineTools のダイアログ。
インストールすると Python3 が使える、3.8.2 だ。
普通に使えるけど、PyObjC が pip3 でインストールできない。

Python Release Python 3.9.1 | Python.org

macOS 64-bit universal2 installer
というものが公式にあった、これならイケるかな。
CommandLineTools を先に入れないと 3.8 に上書きされるので注意。
インストーラに従うだけで 3.9 にアップグレードできる。
んで、pip3 のアップグレードを行う必要があった。

# pip upgrade
pip3 install --upgrade pip
# install
pip3 install -U pyobjc

PyObjC Tips – Paepoi

PyObjC

PyObjC もコレで問題なく動くじゃないの。
少し面倒だったけど混迷期だからしかたがないね。