20210112のMacに関する記事は9件です。

##UNIXのCでgetch()を再現する

同期

ユーザーが入力したあとリターンキーを押さなくてもいいプログラムをCで作りたいと思ったことです。

いろいろ調べてみた結果,答えに価するプログラムを見つけたので紹介します。

例のプログラムが乗ったサイト

Linuxのgetch()およびgetche()と同等のものは何ですか?

コード(編集済み)

getch.c
#include <termios.h>
#include <stdio.h>

static struct termios old;
static struct termios current;

void initTermios(int echo)  {
    tcgetattr(0, &old);
    current = old;
    current.c_lflag &= ~ICANON;

    if(echo) {
        current.c_lflag |= ECHO;
    }else {
        current.c_lflag &= ~ECHO;
    }
    tcsetattr(0, TCSANOW, &current);
}

void resetTermios(void) {
    tcsetattr(0, TCSANOW, &old);
}

char getch_(int echo) {
    char ch;
    initTermios(echo);
    ch = getchar();
    resetTermios();
    return ch;
}

char getch(void) {
    return getch_(0);
}


int main(int argc, char **argv) {
    char c;
    while(1) {
        c = getch();
        printf("input:%c\n", c);
        switch(c) {
            case 'w': printf("forward\n"); break;
            case 's': printf("back\n"); break;
            case 'a': printf("left\n"); break;
            case 'd': printf("right\n"); break;
            case ' ': printf("jump\n"); break;
            case 'f': printf("action\n"); break;
            case 'Q': return 0; //quit
            default: printf("It's an invalid key!\n");
        }

    }
    return 0;
}
result
input:w
forward
input: 
jump
input:Q
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UNIXのCでgetch()を再現する

getch()とは

getch()とはchar型しか取得できませんかリアルタイムで処理されるので便利です。

Windowsではconio.hをインクルードすることで使えますが,UNIXにはありません。

同期

ユーザーが入力したあとリターンキーを押さなくてもいいプログラムをCで作りたいと思ったことです。

いろいろ調べてみた結果,答えに価するプログラムを見つけたので紹介します。

例のプログラムが乗ったサイト

Linuxのgetch()およびgetche()と同等のものは何ですか?

コード(編集済み)

getch.c
#include <termios.h>
#include <stdio.h>

static struct termios old;
static struct termios current;

void initTermios(int echo)  {
    tcgetattr(0, &old);
    current = old;
    current.c_lflag &= ~ICANON;

    if(echo) {
        current.c_lflag |= ECHO;
    }else {
        current.c_lflag &= ~ECHO;
    }
    tcsetattr(0, TCSANOW, &current);
}

void resetTermios(void) {
    tcsetattr(0, TCSANOW, &old);
}

char getch_(int echo) {
    char ch;
    initTermios(echo);
    ch = getchar();
    resetTermios();
    return ch;
}

char getch(void) {
    return getch_(0);
}


int main(int argc, char **argv) {
    char c;
    while(1) {
        c = getch();
        printf("input:%c\n", c);
        switch(c) {
            case 'w': printf("forward\n"); break;
            case 's': printf("back\n"); break;
            case 'a': printf("left\n"); break;
            case 'd': printf("right\n"); break;
            case ' ': printf("jump\n"); break;
            case 'f': printf("action\n"); break;
            case 'Q': return 0; //quit
            default: printf("It's an invalid key!\n");
        }

    }
    return 0;
}
result
input:w
forward
input: 
jump
input:Q
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Apple Silicon M1でのTensorFlowの動作速度検証

はじめに

発売当初の絶賛ムードに対して、若干時間がたった現在では「そうでもないのでは?」的な記事も増えている気がするM1 Mac。
TensorFlowのM1対応に関しても、なんとも評価しづらいような結果の記事が出てきているが、ここでは筆者が購入したMac Miniでの簡単な検証結果を記事にする。

基本的にGPUを使うと遅い

M1に最適化されたというTensorFlowでは、使用するデバイスを下記のように指定できる。

from tensorflow.python.compiler.mlcompute import mlcompute
mlcompute.set_mlc_device(device_name="gpu") # 'any' or 'cpu' or 'gpu'

デフォルトでは'any'で最適なデバイスを勝手に選んでくれるという。

VGG19をCIFAR10で学習させた場合の1エポックの学習時間は以下の通りだった。(バッチサイズは100)

any cpu gpu
247s 243s 458s

'gpu'が一番遅い。'any'と'cpu'が同じくらい。ResNet50でも似たような結果になる。
アクティビティモニタでGPUやCPUの履歴を見ると、GPUを使うのは'gpu'とした場合のみで、'any'としてもCPUしか使わないようだ。
ちなみに、CPUを使用している際にもCPUの使用率としては割と余裕があり100%使い切っていない(使いきれていないというべきか?)。

M1はNeural Engineというのも搭載しているが、私の理解ではこれは推論でしか使われないもので、今回のように訓練では関係ないと思われる。
つまり、'any'とした際にはCPUが'最適なデバイス'として選択されていることになるだろう。
実際GPUを使うと遅くなるわけだから、最適と言われればその通りだけれど、これでいいのか?という疑問は感じざるを得ない。今後のアップデートで改善されるかもしれないが。

GPUを使った方が早い場合もある

以下のようなコードでモデルを作成すると、GPUとCPUの処理時間が逆転した。

def make_model():
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Conv2D(64, (3,3), padding='same', activation='relu',input_shape=(32,32,3)))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D((2,2), padding='same'))

    model.add(tf.keras.layers.Conv2D(128, (3,3), padding='same', activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D((2,2), padding='same'))

    model.add(tf.keras.layers.Conv2D(256, (3,3), padding='same', activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D((2,2), padding='same'))

    model.add(tf.keras.layers.Conv2D(512, (3,3), padding='same', activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.GlobalMaxPooling2D())
    model.add(tf.keras.layers.Dense(10, activation='softmax'))
    return model
any cpu gpu
43s 43s 35s

これはGPUが早い。Conv2Dの数を減らすとGPUが有利になるようだ。
GPUの方が早いので、'any'で最適なデバイスが選択できていないとも言える。わざわざモデルの内容をみてデバイスを決める処理が入っているとも思えないので、現状常に'any'ではCPUが選択されるのだろう。

Intel CPUに比べれば速い(はず)

筆者はIntel版Macを持っていないので、WindowsPCとGoogleColabのGPUなしでの比較とする。
上にあげた、簡単なモデルで訓練を実行した結果がこちら。

デバイス 時間(s)
M1 Mac (CPU) 43
M1 Mac (GPU) 35
Google Colab (Xeon 2.20GHz 2cores) 537
Windows(i7-4710MQ 2.50GHz 4cores) 505

CPUでの処理速度としては圧倒的に速かった。
Intel版Macと比較しても、それなりに速いのではなかろうかと推測する。

NvidiaのGPUと比べると厳しい

上記と同じ実験をGoogleColabのP100で実施すると1エポックが5秒程度で終わる(初回は12秒ぐらいだが)。
K80ならもう少し時間がかかりそうだが、それでもM1よりは速いだろう。

Geforce GT730Mというモバイル向けのチップでCUDA対応のTensorFlowで実行すると104秒だった。
M1の方が速いのは立派だが、これは古いチップでcoreが384しかないので、最近のものならばM1より早くなるだろう。

テストコード全文

import tensorflow as tf
import sys

def make_model():
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Conv2D(64, (3,3), padding='same', activation='relu',input_shape=(32,32,3)))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D((2,2), padding='same'))

    model.add(tf.keras.layers.Conv2D(128, (3,3), padding='same', activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D((2,2), padding='same'))

    model.add(tf.keras.layers.Conv2D(256, (3,3), padding='same', activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.MaxPooling2D((2,2), padding='same'))

    model.add(tf.keras.layers.Conv2D(512, (3,3), padding='same', activation='relu'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.GlobalMaxPooling2D())
    model.add(tf.keras.layers.Dense(10, activation='softmax'))
    return model


def test(device_name='any', model_name='VGG19'):
    from tensorflow.python.compiler.mlcompute import mlcompute
    mlcompute.set_mlc_device(device_name=device_name)

    train_data, validation_data = tf.keras.datasets.cifar10.load_data()

    batch_size = 100

    ds_train = tf.data.Dataset.from_tensor_slices(train_data).repeat(50000)
    ds_train = ds_train.batch(batch_size).prefetch(tf.data.experimental.AUTOTUNE)
    ds_validation = tf.data.Dataset.from_tensor_slices(validation_data)
    ds_validation = ds_validation.batch(batch_size).prefetch(tf.data.experimental.AUTOTUNE)

    if model_name=='VGG19':
        from tensorflow.keras.applications import VGG19
        model = VGG19(weights=None, input_shape=(32,32,3), classes=10)
    elif model_name=='ResNet50V2':
        from tensorflow.keras.applications import ResNet50V2
        model = ResNet50V2(weights=None, input_shape=(32,32,3), classes=10)
    else:
        model = make_model()
        model.summary()

    steps_per_epoch = 50000//batch_size

    loss = tf.keras.losses.SparseCategoricalCrossentropy()
    acc = tf.keras.metrics.SparseCategoricalAccuracy(name='acc')
    model.compile(optimizer=tf.keras.optimizers.Adam(),
                loss=loss, metrics=[acc])
    model.fit(ds_train, epochs=3, steps_per_epoch=steps_per_epoch,
                validation_data=ds_validation)

test( sys.argv[1], sys.argv[2])

まとめ

現状ではM1に最適化したTensorFlowはCPU処理の最適化がメインで、GPUは有効に使えていないようである。
それでもCPU処理のみを考えると、かなり速いのではないか。
ただし、TensorFlow関係では色々と不具合の報告もあるようなので、現状では積極的におすすめはしない。

参考

Apple Silicon M1 でtensorflow-macosを実行したらめちゃくちゃ速かった。

機械学習の開発環境としてのMacBook Air(M1)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCode 選択した複数行をマルチカーソルにするキーボードショートカット

Atom Keymaps

https://marketplace.visualstudio.com/items?itemName=ms-vscode.atom-keybindings

Atom Keymaps では、 Command + Shift + l に設定されているが、デフォルトのキーマップではどう設定されているのか気になった。

キーボードショートカットの設定変更

Command + K, S でキーボードショートカット設定を開く

Add Cursors to Line Ends
editor.action.insertCursorAtEndOfEachLineSelected

で検索する。

デフォルトでは Shift + option + | となっていました。

しかし、日本語キーボードだとどうやっても押せそうにないので、
Shift + option + ¥ に変更するとうまくいった?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

brew upgrade rbenv ruby-build で XcodeがmacOSをsupportしてないエラー

ruby3.0、rails6.1.0で新たにrailsアプリを開発。
atomエディタのLinterが rbenv: version `ruby-3.0.0' is not installedとのエラーを吐く。

rbenvでruby-3.0.0を入れる必要があるとのことなので、以下のコマンドを実行。

$ brew update
 (時間かかった。。)
$ brew upgrade rbenv ruby-build

参考:rbenvでmacのrubyを最新にする - Qiita

すると以下のエラー。

==> Installing ruby-build
Error: Your Xcode does not support macOS 11.
It is either outdated or was modified.
Please update your Xcode or delete it if no updates are available.
Xcode can be updated from the App Store.

Error: An exception occurred within a child process:
  SystemExit: exit

More Software Downloads - Apple Developerより最新のCommand Line Toolsを手動でインストール。

参考:Error: Your Xcode does not support macOS 11.0.が出た時の対処方法

その後、再度以下のコマンド。

$ brew upgrade rbenv ruby-build
Error:
  homebrew-core is a shallow clone.
  homebrew-cask is a shallow clone.
To `brew update`, first run: 
...

なんかError吐いたけどインストールしたよう。

$ rbenv install --list
...
3.0.0
...

 入ってる。

$ rbenv install 3.0.0
...
$ ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20]

成功。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android Studioインストール後にコマンドラインでビルドしようとするとJDKのインストールを求められる問題の対処法

macでAndroid Studioの環境構築をした際に若干詰まった部分をメモしておきます。

問題

macにAndroid Studioをインストールしたあと、Android Studio外で以下のようなコマンドによりビルドしようとした際に、以下のエラーメッセージとスクショのようなダイアログが表示され、JDKのインストールを求められました。

ビルドコマンドとエラーメッセージ
$ ./gradlew assembleDebug
No Java runtime present, requesting install.

JDKをインストールを求めるダイアログ
スクリーンショット 2021-01-12 15.23.01.png

環境

  • macOS Catalina 10.15.17
    • Intel CPU
  • Android Studio 4.1.1

解決策

Android StudioにはすでにJDKを内包しているため、パスを通してやれば良いです。

具体的なパスは、Android Studioのメニュー > File > Project Structureの画面で、左ペインのSDK Locationを選択し、JDK Locationを見ることで確認できます。
JDKパス確認画面.png

ちなみに、ここの項目のヒントに、「外部プロセスで利用したい場合はJAVA_HOMEにこのパスを追加する」旨が記載されていました。
JDKパスヒント.png

確認したパスを~/.zprofileファイルに以下のように書き込んだのちターミナルを再起動すると、ビルドコマンドが利用できるようになります。

.zprofile
export JAVA_HOME="/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home"

参照

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macbook Pro 13-inch, M1, 2020 / v11.1 の環境構築してみてメモ

intelとの違い

  • そもそもarmとx86/x64なので,動かせるアプリケーションが変わってくる
    • 基本的にはarmで動かせるものは普通にterminalからインストールすれば良い
    • 動かせないものは rosetta を利用することでインストール可能となる

買った理由

  • 使ってたPCが壊れたから
  • 次に出るmacbook proが14 / 16インチなので,正直13でもでかいと思っていて,そういう前提で決めた
  • m1の情報を追うためには,使っておくのが最も早い
  • intel版に比べかなり安い

注意点

  • intel版からtimemachineをやると壊れた
    • rosettaをインストールするかアンインストールして新たにm1版をインストールするか
    • アプリケーション数が多すぎて対応が無理だし,使ってないものも多いので新たに作り直す必要あり
  • 初期化のやり方注意
    • ちゃんと調べてから作業しないと詰む
    • intel版のやり方だと文鎮化の可能性がある
  • 基本的には,item2で開く前にrosettaをonにする必要あり

所感

  • 大体のミドルウェアはDockerで動かすのであまり影響があるとは思えなかった
  • 結局os native必須のものってそんなに多くない
  • バッテリーは噂通りかなり持つ
    • os再インストールを2回ぐらいして数時間環境構築とかしながらPC触ってたけど,半分ぐらいバッテリー残ってる

通常セットアップ(zsh, rosetta on / off)

     # initialize
     defaults write com.apple.finder AppleShowAllFiles -boolean true
     defaults write com.apple.desktopservices DSDontWriteNetworkStores true

     # rosetta on (on item2)
     uname -m # x86_64
     # zsh
     sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
     # vim
     echo ':syntax on' >>~/.vimrc
     # brew
     /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
     compaudit | xargs chmod g-w,o-w
     brew install tig jq
     brew tap sanemat/font
     brew install ricty
     cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
     fc-cache -vf

     # nvm
     curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
     nvm -v
     # rosetta off (on item2)
     uname -m # arm64
     nvm i v15.5.1
     # rosetta on (on item2)
     uname -m # x86_64

     # git / github
     ssh-keygen -t ed25519 -C "test@example.com"
     cat id_rsa.pub # copy github
     ssh -T git@github.com
     git config --global user.email "test@example.com"
     git config --global user.name "test"

動作検証済み

  • universal
    • chrome
    • line
    • iterm2
    • vscode
  • apple
    • slack
  • todo
    • norton
    • office
    • docker

reactnative

発生したerror

[oh-my-zsh] Insecure completion-dependent directories detected:

以下で修正可能

compaudit | xargs chmod g-w,o-w
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macbook Pro 13-inch, M1, 2020 / v11.1 の環境構築してみてハマりどころなどを記載

intelとの違い

  • そもそもarmとx86/x64なので,動かせるアプリケーションが変わってくる
    • 基本的にはarmで動かせるものは普通にterminalからインストールすれば良い
    • 動かせないものは rosetta を利用することでインストール可能となる

買った理由

  • 使ってたPCが壊れたから
  • 次に出るmacbook proが14 / 16インチなので,正直13でもでかいと思っていて,そういう前提で決めた
  • m1の情報を追うためには,使っておくのが最も早い
  • intel版に比べかなり安い

注意点

  • intel版からtimemachineをやると壊れた
    • rosettaをインストールするかアンインストールして新たにm1版をインストールするか
    • アプリケーション数が多すぎて対応が無理だし,使ってないものも多いので新たに作り直す必要あり
  • 初期化のやり方注意
    • ちゃんと調べてから作業しないと詰む
    • intel版のやり方だと文鎮化の可能性がある
  • 基本的には,item2で開く前にrosettaをonにする必要あり

所感

  • 大体のミドルウェアはDockerで動かすのであまり影響があるとは思えなかった
  • 結局os native必須のものってそんなに多くない
  • バッテリーは噂通りかなり持つ
    • os再インストールを2回ぐらいして数時間環境構築とかしながらPC触ってたけど,半分ぐらいバッテリー残ってる

通常セットアップ(zsh, rosetta on / off)

     # initialize
     defaults write com.apple.finder AppleShowAllFiles -boolean true
     defaults write com.apple.desktopservices DSDontWriteNetworkStores true

     # rosetta on (on item2)
     uname -m # x86_64
     # zsh
     sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
     # vim
     echo ':syntax on' >>~/.vimrc
     # brew
     /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
     compaudit | xargs chmod g-w,o-w
     brew install tig jq
     brew tap sanemat/font
     brew install ricty
     cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
     fc-cache -vf

     # nvm
     curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
     nvm -v
     # rosetta off (on item2)
     uname -m # arm64
     nvm i v15.5.1
     # rosetta on (on item2)
     uname -m # x86_64

     # git / github
     ssh-keygen -t ed25519 -C "test@example.com"
     cat id_rsa.pub # copy github
     ssh -T git@github.com
     git config --global user.email "test@example.com"
     git config --global user.name "test"

動作検証済み

  • universal
    • chrome
    • line
    • iterm2
    • vscode
  • apple
    • slack
  • todo
    • norton
    • office
    • docker

reactnative

発生したerror

[oh-my-zsh] Insecure completion-dependent directories detected:

以下で修正可能

compaudit | xargs chmod g-w,o-w
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac mini (M1, 2020) で LaTeX の環境構築 (VSCode)

前の記事 競プロ環境構築 に続きメモです。

参考にした記事です
https://qiita.com/uoyuki/items/c172235a0caf2f637ea4

環境

  • Mac mini (2020, M1)
  • macOS BigSur 11.1

手順

  • VSCode の拡張機能をインストール
    • TeX Workshop
  • TeX をインストール & アップデート
% brew install --cask tex-no-gui
% sudo tlmgr update --self --all

無限時間かかります。

  • setting.json に追加
    //Latex
    "latex-workshop.latex.tools": [
        {
            "command": "ptex2pdf",
            "args": [
                "-interaction=nonstopmode",
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOCFILE%.tex"
            ],
            "name": "ptex2pdf"
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "ptex2pdf",
            "tools": [
                "ptex2pdf"
            ]
        }
    ],
    "latex-workshop.latex.autoClean.run": "onFailed",
    "latex-workshop.view.pdf.viewer": "tab",
    "editor.renderControlCharacters": true,
  • VSCode を終了して (ウィンドウを閉じるだけではだめ) 再起動

できるようになりました、えらい。

おわりに

ユーザスニペットをまた構築します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む