TimeMachiEditor on M1 Mac

M1 MacBook Airのtimemachine editorはログインしていないと自動起動しないのでなぜかを調べてみた。

こういう風に設定、つまり毎日朝の5時にリブートして、5時半からタイムマシーンを起動させたい。しかしその時は起動しないで、MacBook Airにログインしてから、timemachineが起動する。

 

M1 MacBook AirにはPower Nap機能の設定がない、デフォルトでオンになっているらしい。以下はIntel Macの設定画面。

timemachine editorのFAQから、

① timemachine editorの常駐は不要、まあログインしてないんだからどちらにしろ無意味

② power napはオンにしろ、ただしapple siliconのモデルはデフォルトでオンになっている

どちらも満足されている筈ですがね。

以上の現象からは、回避するならばバックアップを先に実行してリブートを後回しにすれば良いだろう。

 

admin

ISRG AGREEMENT UPDATE

という内容のメールが来て何だろうなと思いましたが、おそらくsakuraで使っている無料の証明書関連だろうと思って調べると確かにそうです。

サービスを受けている側は何もやらなくてもいいけど、アップデートされたagreementは読めとあります。agreementへのリンクは、

https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf

関連しそうなsakuraからのメッセージは、

https://ssl.sakura.ad.jp/column/letsencrypt-root-certificate/

になるでしょうか。

 

admin

UTM + Ubuntu arm対応imageのインストール

Apple silicon用のVMとして無償のUTMもapple silliconで使えるようなのでインストールしてみた。結論はデスクトップ画面ではログオンできない。–> 部分解決(please refer to the bottom)

https://original-game.com/how-to-install-ubuntu-on-m1-mac/#m_heading-3

https://oopsoop.com/ubuntu-on-mac-using-utm/

https://qiita.com/doraryu1/items/f79ab67b4c7b060a0917

を参考にインストールした、デスクトップ環境インストールは、

$ sudo apt install tasksel

$ sudo tasksel install ubuntu-desktop

ではインストール始まらなかったので、以下(デスクトップ化するための参考サイト(日本語が変だから翻訳サイトらしい))を参考にaptコマンドで対応

https://codepre.com/ja/como-instalar-un-entorno-de-escritorio-gui-en-ubuntu-server.html

$ sudo apt install ubuntu-desktop

これで、デスクトップ画面は出たけど、ログインができないし、パスワード入力後のログイン画面でハングしてしまうこともあるようです。

英語キーボードだし、caps lockも掛かってないけど不思議、M1 Macだから未だ不安定なのかもしれない。サーバーモードでは普通に使えるようですが。

デスクトップモードでログオンするか、CUI(サーバーモード)でログインするかはUTMの設定で切り替えできるから、サーバーモードで立ち上げればいいのだけれども。

P.S.(2022/7/26)

UTMのセットアップで”Emulated Display Card”を”virtio-ramfb”から”virtio-ramfb-gl(GPU Supported)”に変えたら起動した。変更理由はGPUサポートだよなと思ったから、他の選択ではエラーメッセージ出て起動しなかった。

見慣れた画面ですが、違和感あるのはFirefoxが見えないこと。

ただし、デスクトップに無いFirefoxをインストール

$ sudo apt install firefox

しても起動しないし、chromeは”you have held broken packages”と言われてインストールできないからまだ未解決問題は残ってます。

 

admin

今時のJava Scriptを知るための本

ブラウザの歴史の中で、最初はオマケのような機能だったのが、今は主役の一つとなっている言語。ScratchもJava Scriptの上で動いている(だから遅いのですが)わけだし。

VScodeで仮想的に簡易サーバーを立ち上げられる拡張機能(Live Server)とかあるんだね。

 

admin

地球儀印字

同じUSキーボードでも、2019 MacBook ProとM1 Airでキーボードが一箇所だけ違うとこ(タッチバーは除く)がfnキーへの地球儀印字。

Big Sur以降のApple Siliconモデルかららしいですが、初めて知った。ショートカットの拡張機能ですね。

iPadにキーボードつけた時と同じように使えるようなのですが、付けてないのでいまいち便利さはわかりません。少なくとも”ひらがな””英字””カタカナ”切替とかは使いやすいとは思わない。

 

admin

M1 MacBook Airの性能比較

性能のほんの一面ですが、素数計算プログラムで3モデル(2018 Air(8GB/Dual core)/2019 Pro 16(16GB/i7)/M1 Air(16GB/M1)をベンチマークしてみました。

使用したプログラムソースは以下のリンクから。一千万と一億までの素数を求める時間を算出しています。

https://github.com/chateight/c-plusplus/blob/master/m_thread.cpp

結果は巷の情報通り(ほぼIntel Macの16インチ並みで、2018 Airからは数倍の性能)と言えますか。SSDの性能差は見えていなくて、CPUとメモリ周りの性能差ですね。

M1系はメモリ管理も改善されているようで、未だM1 MacBookはスワップが発生していません。

同じようにアプリ開いていても、メモリプレッシャー表示レベルが明らかに低い。ファンレスだから静音だし、全てはtsmc 5nmの威力です。

 

admin

M1 MacBook Air到着と開発環境インストール

予定(20日〜28日)より早く本日到着、早速セットアップを開始。

M1モデルは右側ですが、外観は同じだろうから見分けはつかない、まあUSキーボードだから簡単に識別できるのだけれども。色違うから、それも識別要素ですが。

16インチと二段重ねしたところ、フットプリントの違いがわかります。

ゼロからインストールは途中ですが、アプリ互換は以下の通り。予想通り Canonの2014年製レーザープリンタはドライバ存在しないし、この先も出てこないだろうから使えない。

言語系と開発環境は設定が必要だから、じっくりとこれから。

印象全般は、電池がめちゃくちゃ持つのと、その結果としてアプリインストールやOS更新でも熱くならない。Intel dual coreの2018年 Airはファンがブンブン回っていたけども。おそらく、長い動画の書き出しとかはスロットリングに入るのだろうけど、そんなことは滅多にやらないし。

体感速度はIntel  MacBook Pro 16と雰囲気同等だから十分高速と言えます。

 

<M1 Macでインストール必要なもの>

(✅:M1 ready,  including Universal、🔖:Rossetta2、🆖:対応してない)

<<基本機能>>

✅Chrome

🆖Canon LBP6230 printer driver(8年前のプリンターはやはりダメ)

✅CotEditor

✅DropBox(インストールはしたけど最大3台ログイン制限)

✅Karabiner elements(M1)

✅LanScan

✅Mega

✅OneDrive

🔖PhotoScape

🔖QfinderPro(Qnap NAS管理)

✅Speedtest

✅TimeMachineEditor

 

<<開発環境とアプリ>>

Arduino IDE:これはVScodeに移行するから不要

✅Blender

✅Clang(インストール済み)

🆖Fusion 360 → 一度は起動したけど、OSアップデート後に起動できなくなった、再インストールもうまくいかないからしばらく放置

🔖FlashPrint(FLASHFORGE 3Dプリンター用)

✅Homebrew

🔖Kicad

✅M5stack USB driver

✅Python(pipじゃなくてconda使うと)

✅Ruby

✅Processing(betaだけどapple silicon対応) 

🔖Raspberry pi imager

🔖Scratch link

✅SD card formatter

🔖Smart json editor

🔖Sonic pi

🔖Thonny

✅Unity

✅VScode

🔖Visual Studio(Unityインストールと同時はintel版、個別にはarm版もインストールできる。おそらくUnityのpreferenceで選択すればarm版も使えると思う。)

✅Xcode

🔖マイクラEE

 

P.S. 2022/7/19

一通り開発ツールも入れてみたけど、Intel Mac時代とは雰囲気がだいぶ違うインストールをしないといけない。アプリのApple silicon対応は開発ツールだと概ね五割と言ったところでしょう。あと一年ぐらいしたら、そこそこ落ち着いてくるでしょうか。

以下は、インストーに当たって参考としたサイトといくつかのコメントです。

○ VScode/pythonのインストール

参照サイト、よく整理されています

https://qiita.com/c60evaporator/items/aef6cc1581d2c4676504

・HomeBrew

上のリンクからHomeBrew本家のコマンドは、

$/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”

とあるからこれを使う

・VScodeもbrewからインストール

・Python関連のツール

パッケージ管理はpipではなくcondaがApple siliconではベターであると、さらに仮想化した方が良いというのでそうしました。

(過渡的でいずれpipに回帰するかも)M1 Macにおいてはライブラリによってpipとcondaの2通りのパッケージ管理ツールを使い分ける必要があるけど、今回はconda(ただしcondaでは存在しないパッケージはある)

 

○ c++環境

https://zenn.dev/takuho/articles/cea703bde06732

https://qiita.com/cubinglover/items/5b4d05ca0f77c60f1d79

インストール状態でコンパイラーバージョンはc++20になっていたので、いくつかのソースは修正が必要になるでしょう。

 

○ ruby/rails環境

https://zenn.dev/osuzuki/articles/a535b2840bbea3

 

admin

new int[]とstd::vectorクラスでの実行速度差

<動作環境>

Intel MacBook Pro 16

 

<メモリ管理>

new int[]方式はメモリの領域管理、特にリリースを自分で管理しなければいけないのでバグの入り込み余地が多いのですが、コンテナクラスを使うことでその可能性を少なくしてくれます。しかし、想像するにパーフォーマンスは落ちるでしょう。ということで比べてみました。

#include <iostream>
#include <utility>
#include <vector>

const int a_size = 1000000*100;

class home
{
    int* m_land;
    int* cp_land;

public:
    explicit home(int size)
        : m_land{new int[size] ()}{}
    
    ~home() { delete [] m_land;}

    home(home&& other);

    int* land() const { return m_land; }

    int* land_cp() const { return cp_land; }

    void copy()
    {
        cp_land = new int[a_size];
        for (int i = 0; i <= a_size; i++)
        {
            cp_land[i] = m_land[i];
        }
    }

    void v_copy()
    {
        std::vector v_int(a_size, 0);
        //std::vector vc_int(a_size);
        //std::copy(v_int.begin(), v_int.end(), vc_int.begin());
        std::vector vc_int = v_int;
    }

    void del()
    {
        delete [] cp_land;
    }
};

home::home(home&& other)
    : m_land{other.m_land}
{
    other.m_land = nullptr;
}


int main()
{
    std::chrono::system_clock::time_point  start, end;
    start = std::chrono::system_clock::now();

    home A{a_size};
    std::cout << "A\'s land address : " << A.land() << std::endl;

    A.copy();
    std::cout << "A\'s cp_land address : " << A.land_cp() << std::endl;
    A.del();

    home B{std::move(A)};
    std::cout << "B\'s land address : " << B.land() << std::endl;

    B.v_copy();

    std::cout << std::endl;
    end = std::chrono::system_clock::now();
    double elapsed = std::chrono::duration_cast(end-start).count();
    std::cout << "elapsed time : " << elapsed << " ms" << std::endl;
}

追加したのはv_copyメソッドとその中でパターンの変更とcopyメソッド使う使わないはソース(35~38行目、69行目の該当行コメントアウト)で対応。

 

<実行結果>

① std::vectorで領域確保だけで2秒近く要している

② 領域のパディングは自動と明示である程度の差がある、new int[]は0でしかできないけど、vectorは任意の値で初期化できるのはアドバンテージ

③ コピーは単純コピーが相対的std::copyより早いけど、それでもマニュアルのforループコピーよりもおよそ2倍(std::copyはおよそ4倍)の時間が掛かる

④ std::copyは実行時間最遅

領域サイズ:100MB

<初期状態:マニュアル(new int[])で領域確保とコピー>
A's land address : 0x7fad25700000
A's cp_land address : 0x7fad05700000
B's land address : 0x7fad25700000

elapsed time : 497 ms


<領域確保:おそらく0埋めされるはず>
A's land address : 0x7f8996700000
A's cp_land address : 0x7f8976700000
B's land address : 0x7f8996700000

elapsed time : 2292 ms


<領域初期化値を明示的に追加>
A's land address : 0x7f8549700000
A's cp_land address : 0x7f8529700000
B's land address : 0x7f8549700000

elapsed time : 2518 ms


<別のstd::vectorにコピー>
A's land address : 0x7fc174f00000
A's cp_land address : 0x7fc154f00000
B's land address : 0x7fc174f00000

elapsed time : 3510 ms


<コピーにstd::copyを使用>
A's land address : 0x7f8b68700000
A's cp_land address : 0x7f8b48700000
B's land address : 0x7f8b68700000

elapsed time : 4396 ms


便利・セキュアさと処理時間は相反するというのは、まあそんなものでしょうか。

ソースは、

https://isehara-3lv.sakura.ne.jp/blog/2022/07/13/右辺値参照の代表的使い方である移譲処理でのパ/

の記事に追加して以下のurlになります。

https://github.com/chateight/c-plusplus/blob/master/move_perform.cpp

 

P.S. @2022/7/21

M1 MacBook Airで同じ処理実行させると処理速度が全く違う。いずれのケースでも1秒以下(700ms程度)で実行されるから、その差はなんだろう?

そのままのソースではコンパイルできないので、#include <chrono>は必要でしたが、それは本質ではない。

可能性としては、コンパイラーのバージョンぐらい(c++11 vs c++20)なのか?MacBook Pro 16のコンパイルオプションを-std=c++20にしても変わらないからそうじゃないよね。だとすると処理系の差?

 

admin

右辺値参照の代表的使い方である移譲処理でのパーフォーマンス効果

<実行環境>

Intel MacBook pro 16

 

<右辺値参照で移譲処理>

コピーは性能に大きな影響があるのは常ですが、じゃどれぐらい影響あるのか試してみました。

やってること、

① メモリ領域確保(初期化 or 未初期化:13行目の()有無)、この場合には100MB確保と領域の移譲処理

② 領域のコピー(有り or 無し:53/54/55行目のコメントアウト有無)

の4パターンの実行速度比較

#include <iostream>
#include <utility>

const long a_size = 1000000*100;

class home
{
    int* m_land;
    int* cp_land;

public:
    explicit home(long size)
        : m_land{new int[size] ()}{}
    
    ~home() { delete [] m_land;}

    home(home&& other);

    int* land() const { return m_land; }

    int* land_cp() const { return cp_land; }

    void copy()
    {
        cp_land = new int[a_size];
        for (int i = 0; i <= a_size; i++)
        {
            cp_land[i] = m_land[i];
        }
    }

    void del()
    {
        delete [] cp_land;
    }
};

home::home(home&& other)
    : m_land{other.m_land}
{
    other.m_land = nullptr;
}


int main()
{
    std::chrono::system_clock::time_point  start, end;
    start = std::chrono::system_clock::now();

    home A{a_size};
    std::cout << "A\'s land address : " << A.land() << std::endl;

    A.copy();
    std::cout << "A\'s cp_land address : " << A.land_cp() << std::endl;
    A.del();

    home B{std::move(A)};
    std::cout << "B\'s land address : " << B.land() << std::endl;

    std::cout << std::endl;
    end = std::chrono::system_clock::now();
    double elapsed = std::chrono::duration_cast(end-start).count();
    std::cout << "elapsed time : " << elapsed << " ms" << std::endl;
}

<結果>

・領域初期化有りモードではおおよそコピー時間差(領域初期化の有無で、領域コピー有りの時間にそれほど差はないのはなぜかと思うけど)、これを見ると領域の初期化も当然重い処理。

・領域初期化無では領域コピー実行の比重がほぼ100%、コピーしなければ1ms以下で処理完了してます。

・いずれにしろ、これらの処理が繰り返し実行される場合には大きなパーフォーマンスの差になるから、移譲は使える時には使ったほうが良い。

領域サイズ:100MB

<領域初期化有り>

・std::move
A's land address : 0x7ff049f00000
B's land address : 0x7ff049f00000

elapsed time : 166 ms

・+ 領域copy
A's land address : 0x7fb615700000
A's cp_land address : 0x7fb5f5700000
B's land address : 0x7fb615700000

elapsed time : 546 ms


<領域初期化無し>

・std::move
A's land address : 0x7fb23ff00000
B's land address : 0x7fb23ff00000

elapsed time : 0 ms

・+ 領域copy
A's land address : 0x7fb03df00000
A's cp_land address : 0x7fb01df00000
B's land address : 0x7fb03df00000

elapsed time : 514 ms

ソースは以下のリンクから、

https://github.com/chateight/c-plusplus/blob/master/move_perform.cpp

メモリ管理をマニュアルでやっていますが、vectorクラスのようなコンテナを使ったときのパーフォーマンスにも興味があります。

 

<疑問一点>

デストラクターでcp_landの解放すると、

*** error for object 0x7ff7b9aae490: pointer being freed was not allocated

のエラーが出ますが、なぜ?取り敢えずはdel()メソッド追加で対応してますが。

 

admin