- 投稿日:2021-01-12T18:50:41+09:00
##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, ¤t); } 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; }resultinput:w forward input: jump input:Q
- 投稿日:2021-01-12T18:50:41+09:00
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, ¤t); } 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; }resultinput:w forward input: jump input:Q
- 投稿日:2021-01-12T16:40:16+09:00
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関係では色々と不具合の報告もあるようなので、現状では積極的におすすめはしない。参考
- 投稿日:2021-01-12T16:09:39+09:00
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
+¥
に変更するとうまくいった?
- 投稿日:2021-01-12T16:06:16+09:00
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: exitMore 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]成功。
- 投稿日:2021-01-12T15:53:46+09:00
Android Studioインストール後にコマンドラインでビルドしようとするとJDKのインストールを求められる問題の対処法
macでAndroid Studioの環境構築をした際に若干詰まった部分をメモしておきます。
問題
macにAndroid Studioをインストールしたあと、Android Studio外で以下のようなコマンドによりビルドしようとした際に、以下のエラーメッセージとスクショのようなダイアログが表示され、JDKのインストールを求められました。
ビルドコマンドとエラーメッセージ$ ./gradlew assembleDebug No Java runtime present, requesting install.
環境
- macOS Catalina 10.15.17
- Intel CPU
- Android Studio 4.1.1
解決策
Android StudioにはすでにJDKを内包しているため、パスを通してやれば良いです。
具体的なパスは、Android Studioのメニュー > File > Project Structureの画面で、左ペインのSDK Locationを選択し、JDK Locationを見ることで確認できます。
ちなみに、ここの項目のヒントに、「外部プロセスで利用したい場合は
JAVA_HOME
にこのパスを追加する」旨が記載されていました。
確認したパスを
~/.zprofile
ファイルに以下のように書き込んだのちターミナルを再起動すると、ビルドコマンドが利用できるようになります。.zprofileexport JAVA_HOME="/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home"参照
- 投稿日:2021-01-12T02:17:39+09:00
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
- 投稿日:2021-01-12T02:17:39+09:00
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
- 投稿日:2021-01-12T01:52:47+09:00
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 を終了して (ウィンドウを閉じるだけではだめ) 再起動
できるようになりました、えらい。
おわりに
ユーザスニペットをまた構築します。