M1 MacBook Airのfnキーが顕著ですが、シザー式のキーボードは横方向から見ると光漏れが見えます。おそらくバタフライ方式に比べてストローク量が変わった(大きくなった)せいなのでしょうけど。まあ普通は斜め上から覗き込むケースは無いから構いませんが。
admin
la vie libre
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
性能のほんの一面ですが、素数計算プログラムで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
予定(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
<動作環境>
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
GitHubに実行ファイルをアップロードしてもそれはマシン固有ファイルなので無意味です。じゃどうやって拡張子のついてない実行ファイルを管理対象外とするのか?
これに答えてくれるのが、
https://qiita.com/padawan_e15/items/7ba90f09e3ecd559f95b
にありますが、
.gitignoreファイルに以下のように記述すれば、
〇 まず、全部のファイルを管理対象外として、(下の一行目)
① ただし、ディレクトリ配下のディレクトリ全ては除外、すなわち管理対象とする(二行目)
② ただし、ディレクトリ内の拡張子のあるファイル全ては除外、すなわち管理対象とする(三行目)
<.gitignore>
*
!*/
!*.*
とすることで、拡張子のないファイルだけ指定したことになるという理屈。
こうすることでVScodeのエクスプローラから実行ファイルが消えました。
admin
アプリレベルならば、最近webにあまり情報がなくなってきたのは、互換性がそれなりに出てきたからだろうけど、M1になることによってアプリもさることながら、ディレクトリ構造やツール類(例えばHomebrew)もかなり変更があるから、intel macからの単純移行はあり得なくて、スクラッチからインストールしないとダメだろう。
・現状インストールが必要だろうと思うアプリ・ドライバの一覧、これ以外にVMware Fusionは現状ベータですが、いずれ安定して無償なら入れるつもり。
<ブラウザ、クラウドストレージ、Utility>
Chrome
Canon LBP6230 printer driver(rossetta2で動くのか)
CotEditor
DropBox
Karabiner elements
LanScan
Mega
OneDrive
PhotoScape
QfinderPro(Qnap NAS管理)
Speedtest
TimeMachineEditor
<開発環境とアプリ>
Arduino IDE:これはVScodeに移行するつもり
Blender
Clang
Fusion 360
FlashPrint(FLASHFORGE 3Dプリンター用)
Homebrew
Kicad
M5stack USB driver
Python(pipじゃなくてconda使うと)
Ruby
Processing
Raspberry pi imager
Scratch link
SD card formatter
Smart json editor
Sonic pi
Thonny
Unity
VScode
Visual Studio
Xcode
マイクラEE
admin