Mac を新調したらやること

Mac を新調したらやること。

Finder がらみ

拡張子は「表示」、隠しファイルも「表示」に変更する。

後者はターミナルから設定する必要があるが、いつも忘れてしまうためメモ。

defaults write com.apple.finder AppleShowAllFiles TRUE

ついでで

killall Finder

とやっておく。

他に apple 製品を使っているようなら、Finder サイドバーは Air Drop を表示させておいた方があとあと便利。

時刻表示

US キーボード使っているとデフォルトではアメリカ時刻になってしまうようだ。

apple メニュー -> 一般 -> 日付と時刻 で以下のパネルを表示させる。

位置情報をオンにしているなら、「現在の位置情報に基づいて、時間帯を自動的に設定」を有効にするのが一番簡単。

GitHub の SSH 接続

GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~

あたり参照。

homebrew がらみ

最近は(個人使用でも)マルチユーザー環境で使うことを意識している。

1 台の Mac でマルチアカウントで homebrew を使う

あたりを参照。

ただし、管理者アカウントのうち一人は、(自分の環境ではなく)従来通り Mac 本来の環境にインストールしておいていいかも。

Java がらみ

ワイは arm Mac では Azule というところの JDK を採用している。

こちらがダウンロードページ。.dmg を落とすのが一番楽。

プロジェクト管理には maven を使っているが、これまではバイナリなどを /usr/local や /opt に直置きしていた。
が、ユーザーによっては maven のバージョンも換えたいということがあるかもしれない、ということで、/(ユーザーホーム)/opt 以下に置くことにした。

ダウンロードページはこちら

NetBeans のダウンロードページはこちら

PostgreSQL がらみ

arm Mac 出始めの頃は、PostgreSQL.app はおろか homebrew も arm Mac にネイティブで対応していなかった。

そのせいか、macports を使って導入するケースが多かったように思う。

が、現在では両者とも arm 対応になっているので、どちらかで入れればいい・・・のだが、ここらへんはポリシーによるかも。
繰り返しになってしまうが、マルチユーザーを意識すると個々のアプリは、ユーザー各自の環境にインストールした方がいい。

だが、データベースサーバーなどを個々の環境毎に変える必要あるのか?という気はする。

こういうポリシーならば macports 由来で入れた方がいいかもしれない。

基本的なアプリなど

chrome サファリはあまり使わないんで。

Visual Studio Code エディタはお好みで。

apple の開発者証明書の引っ越し

apple に developer 登録している場合、開発者証明書を引っ越しておいた方がいいでしょう。

古いMacから新しいMacへ鍵付き証明書を持ってくる

あたりに具体的な手順が書いてある。

 

(続く)

 

 

Python の言語仕様で驚いたこと

最近(ようやくというべきか)Python を触っているんだが、他言語に慣れた人がびっくりする Python の特徴。

関数の返り値が複数取れる

多くの人が驚くのがこれだと思う。

y, z = object.function()

というような書き方が平然とまかり通っている。

関数側の実装を

def test()
    return 'test', 100

とすれば(もちろん、こういう書き方が文法的に許される、という前提が必要だが)、 確かに返り値は複数になりますね。

// が切り捨て除算

これはワイだけかな?

最初見たとき、「え、これ # のタイポ?」と思った。

“”” コメント “””

複数言語を使う際に注意払うのがコメントアウトだと思うが、quot 記号3連続というのは斬新でした。

if __name__ == ‘__main__’ の謎

サンプルでよくある

if __name__ == ‘__main__'

という書き方だが、ここあたり参照。

要は、「ある python コードをコマンドラインから実行するときは __name__ に __main__ が引き渡される」というだけの話だと思う。

これをすごくわかりにくく書いてあったり、インデントがおかしいサンプル載っけてたりする記事をよく見かけるが、なんだあれ?

 

(続く)

 

librosa の使い方

python の音響解析の基本的なモジュールは librosa のようなんだが、情報が古い記事が多い。

参考記事

比較的しっかり書かれた記事は

Pythonの音声処理ライブラリ【LibROSA】で音声読み込み⇒スペクトログラム変換・表示⇒位相推定して音声復元

あたりだろうか。

上の記事にしても 2020 年に書かれているので、やや古いのだが、解説が丁寧だし、検証がまとも。

「古い」というのは、例えば、librosa.display.waveplot などという今では廃止になった関数もしれっと使われていたりするから。
だが、こういうのはエラーメッセージをググるなどすれば、対策は立てやすい。(後継の関数を使うならば、librosa.display.waveshow となる)

参考にならない記事

逆に、古いだけで、処理の意図も書かれていない記事はほぼ害悪。

例えば、STFT(Short-Time Fourier Transform: 短時間フーリエ変換)で出力される行列は、確か 0.8 くらいの時に出力形式そのものが変わったのだが、このことを意識していないと実用(波形データ→STFT→加工→逆 STFT →加工した波形データなど)に使う際に間違ったことをやりねない。

SoundFile との併用

便利な librosa だが、配列をファイルに書き出そうとすると使い勝手が悪いらしい。
(『librosa における 16-bit でのWAV書き出し』参照)

そこにもあるように SoundFile というパッケージを使う。

なお、書き出したファイルは(デフォルトでは)python ファイルのある位置になるようだ。
jupyter notebook の場合は、.ipynb の置かれているフォルダになる。

noisereduce との併用

実際のデータはノイズなどものっているため、これを落とす処理が必要。
その一つに noisereduce パッケージがある。なお、これも librosa 同様、conda ではなくて pip から入れる。

これを使った具体例は、ここあたり参照。

 

3D可視化

波形データの可視化は、上のようにやればいいが、ものによっては3Dで可視化したい場合がある。

pyVISTA というのがあるらしい。

pythonをインターフェイスにして VTK を呼び出して・・・ってこれ MacOS じゃダメじゃん。
VTK は OpenGL に依存しているので、MacOS では非推奨の VTK 使ってる時点でアウト。

日本からは小山哲央という人が参加しているらしいのだが、この人ってやらかしちゃった人ですよね。

スクリプト言語が関の山で、Java/C/C++ 使いこなす能力はないでしょう、この人。

将来性、イマイチ。

 

Anaconda Python For Mac の使い方(メモ)

Anaconda Python のインストール記事は数多くあるが、実務的な使い方はそんなに多くない。

Anaconda Pythonのインストールと仮想環境の作成 for Mac

あたりで、しっかり仮想環境の作成までやっておくこと。

その後、モジュールをインストール。これも上の続編

Anaconda Pythonにモジュール(numpy, matplotlib)をインストールする for Mac

を参考に。

ただし、MacOS Ventura 環境ではデフォルトでは python は入っていないようだ。
python は anaconda 環境のみでしか使わないということであれば、その都度 anaconda 環境の python を呼び出した方が何かと混乱は減るように思うので、この流儀に従った方がいいかも。

conda activate

で、base の仮想環境が立ち上がる。この状態なら python は普通に使える。

あるいは以下の方法でもいいらしい。ワイはこの使い方は今のところしていないが。

anaconda インストール時には、まだ python は使えるようになってはいないので、ターミナルから

/(user ホームなど)/opt/anaconda3/bin/conda init zsh

と打ち込み、ターミナルを再起動しましょう。

以降、python などのコマンドが使えるようになります。
(『MacOS 版 Anaconda のインストール』参照)

 

conda と pip の使い分け

例えば、波形解析でよく使われる librosa は現時点(2023/2 月)では conda のチャンネルにはないので、pip install で入れる必要がある。

正しくインストールできていれば、anaconda navigator からでも下のように認識してくれるようだ。

なお、librosa の紹介記事のサンプルなどで

 y, sr = librosa.load(librosa.util.example_audio_file())

というのがよく出てくるが、現在はこのメソッドは使えない

また、Mac では .ogg ファイルが読み込めないようだ。(ffmpeg を入れておけば大丈夫っぽいです)

jupyter notebook の保存先フォルダ変更

デフォルトでは、ホーム直下になるので、ホームが乱雑になる。

【Mac】jupyter notebookのディレクトリ変更方法

で適宜変更しておくと良いだろう。

 

 

QxOrm で簡単なサンプルを書いてみる

以前に書いた QxOrm の記事が(日本においてはおそらく)最初の解説記事だったらしく、ちょいちょい反応があった。

ネット上でも gitlove さんという方が、簡単なサンプルを書いてくれた。

クラスの定義や main 関数での QxOrm の操作はそこに書かれているコードほぼそのままでいいと思います。

ただ、(チュートリアルでもあまり強調されていないが)QxOrm を使う際のオマジナイみたいなもので、export.h というファイルが必要なようです。

target = test としたとき、まず .pro ファイルで _BUILDING_TEST を定義しておき、export.h で各種マクロを定義します。

具体的には以下の通り。

//export.h
#ifndef _QX_TEST_EXPORT_H_
#define _QX_TEST_EXPORT_H_

#ifdef _BUILDING_QX_TEST
#define QX_TEST_DLL_EXPORT QX_DLL_EXPORT_HELPER
#else
#define QX_TEST_DLL_EXPORT QX_DLL_IMPORT_HELPER
#endif

#ifdef _BUILDING_QX_TEST
#define QX_REGISTER_HPP_QX_TEST     QX_REGISTER_HPP_EXPORT_DLL
#define QX_REGISTER_CPP_QX_TEST     QX_REGISTER_CPP_EXPORT_DLL
#else
#define QX_REGISTER_HPP_QX_TEST     QX_REGISTER_HPP_IMPORT_DLL
#define QX_REGISTER_CPP_QX_TEST     QX_REGISTER_CPP_IMPORT_DLL
#endif

#endif

このファイルを precompiled.h に include しておき、main から使えるようにしておく、という構成です。

マクロを定義したので、ソースも適宜変更。

//person.h
#ifndef _CLASS_PERSON_H_
#define _CLASS_PERSON_H_

class person
{
public:

   long id;
   QString name;

   person() :id(0) { ; }
   virtual ~person() { ; }

};

QX_REGISTER_HPP_QX_TEST(person, qx::trait::no_base_class_defined,1)//←これを追加

#endif // _CLASS_PERSON_H

person.cpp も以下のように変更。


#include "../include/precompiled.h"

#include "../include/person.h"

#include <QxOrm_Impl.h>

QX_REGISTER_CPP_QX_TEST(person)//←追加

namespace qx {
template &lt;> void register_class(QxClass<person> & t)
{
   t.id(& person::id, "id");

   t.data(& person::name, "name");
}}

main.cpp


#include "../include/precompiled.h"

#include <QtCore/qcoreapplication.h>
#include "../include/person.h"

#include <QxOrm_Impl.h>

int main(int argc, char * argv[])
{
   // Qt application
   QCoreApplication app(argc, argv);
   QFile::remove("./person.db");

   typedef std::shared_ptr<person> person_ptr;
   person_ptr d1; d1.reset(new person()); d1->name = "name1";

   typedef std::vector<person_ptr> type_lst_person;
   type_lst_person lst_person;
   lst_person.push_back(d1);

   // Parameters to connect to database
   qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
   qx::QxSqlDatabase::getSingleton()->setDatabaseName("./person.db");
   qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
   qx::QxSqlDatabase::getSingleton()->setUserName("root");
   qx::QxSqlDatabase::getSingleton()->setPassword("");
   qx::QxSqlDatabase::getSingleton()->setFormatSqlQueryBeforeLogging(true);
   qx::QxSqlDatabase::getSingleton()->setDisplayTimerDetails(true);

   // Only for debug purpose : assert if invalid offset detected fetching a relation
   qx::QxSqlDatabase::getSingleton()->setVerifyOffsetRelation(true);

   // Create all tables in database
   QSqlError daoError = qx::dao::create_table<person>();

   person_ptr person_1; person_1.reset(new person());
   person_1->id = 1; person_1->name = "秋葉 太郎";

   daoError = qx::dao::insert(person_1);

   return 0;
}

これで、ビルドして、実行すると出力先に test(d) という実行ファイルと person.db という sqlite のデータベースができているはずです。

DB Browser for SQLite などで覗いてみると…

できてますね!

注意点

①上では、従来の .pro ファイルを使う qmake でビルドしています。

なのですが、cmake でビルドしようとすると QxOrm のライブラリが見つからない場合があるようです。

これは QxOrm の cmake ビルドシステム自体が未整備のためのようです。関連の PR がありました。

開発者さん自身は、しばらくは qmake メインでいきたいようです。

ワイは、こんなことを提案してきました。

cmake が他のパッケージをどうやって探しているかまっっったく理解してませんが。

参考:

https://qiita.com/shohirose/items/d9bda00a39a113965c5c

②他には postgreSQL が繋がらないかな。

qx::QxSqlDatabase::getSingleton()->setDriverName("QPSQL");

としたでのは、ドライバーがロードできない云々というエラーが出る。