- 投稿日:2021-03-01T23:28:33+09:00
MacBookのオススメ初期設定
はじめに
嫁からの誕生日プレゼントで M1 MacbookPro を貰った(めっちゃ嬉しい)ので、自分なりの初期設定を記載する。
初めてMacを使用する方などの参考になればと。
目次
- アカウント名
- ローカル名
- トラックパッド
- キーボード
- デスクトップ
- バッテリー
- gitのインストール
- Finder
- ターミナルの設定
- 公開鍵の作成
- 署名
アカウント名
基本的にスクショや画面共有することが多く、本名を露出したくないので「macuser」という名前を使用している。
ターミナル画面を共有したときに本名で設定していると うっかり載ってしまうことがある。
アカウント名@ローカル名 ~と表示されるので、本名を晒したくない人は気をつけよう。
初期設定時に本名を設定して「変えたい」という人がいれば Apple公式 に変更方法が載っているので参考に。
https://support.apple.com/ja-jp/HT201548ローカル名
こっちもターミナルに表示される部分。
macusernoMacbook-Pro !
ださい。変えよう。
[ システム環境設定 ] > [ 共有 ] > [ コンピュータ名 ]
m1-mac とした。
トラックパッド
MacBookの初期のトラックパッドの速度、チョー遅い。
なので、変える。
[ システム環境設定 ] > [ トラックパッド ] > [ 軌跡の速さ ]
[ タップでクリック ] を オン にしていると、トラックパッドに触れただけでクリック判定となります。
(タップで使用したい場面があるので、個人的にオン)キーボード
文字を入力しただけで勝手に変換される ライブ変換
勝手にタイプミスと判断され修正される タイプミス修正ありがた迷惑。オフにする。
[ システム環境設定 ] > [ キーボード ] > [ 入力ソース ]
ライブ変換 オフ!
タイプミスを修正 オフ!あと、プログラミングしてると
\
(バックスラッシュ) を沢山打つ。
現状だと Option + ¥ で入力になっているのでめんどくさい。デスクトップ
色々とインストールするときにディスクをマウントするので、デスクトップにこんな感じのアイコンが出現する。
邪魔。デスクトップには何も表示させたくない。
なのでこうする。
[ Finder ] > [ 環境設定 ] > [ デスクトップに表示する項目 ]
スッキリ〜〜〜
Finderを起動すると、左の方にマウントされてるディスクが表示されるので、ここからアンマウント。
バッテリー
[ システム環境設定 ] > [ Dockとメニューバー ] > [ バッテリー ] > [ 割合(%)を表示 ] を オン!
あと、充電ケーブル外すと画面が少し暗くなるのが嫌なので、
[ システム環境設定 ] > [ バッテリー ] > [ バッテリー電源使用時はディスプレイを少し暗くする ] を オフ!
gitのインストール
ターミナルに git って打ち込んでインストールすれば おk
Finder の設定
ホームディレクトリは頻繁にアクセスするので、アクセスしやすくした方がいい。
あとは、ホームディレクトリを左のクイックアクセス的なところにドラッグすればおk。
隠しファイルの表示もしたほうがいい。
Command + Shift + . で 隠しファイルが表示される。
ターミナルの設定
白背景に黒文字だとターミナルっぽくない!
[ ターミナル ] > [ 環境設定 ] > [ 一般 ] > [ 起動時に開く ]
から自分の好きなものに設定。
Homebrew の色にしてみた。
ターミナルっぽくなった!色、背景透明度などの微調整などは [ プロファイル ] から行えるので、是非自分の理想のターミナルに仕上げてください。
公開鍵の作成
$ ssh-keygen -t rsa -b 4096 -C "メールアドレス" Generating public/private rsa key pair. Enter file in which to save the key (/Users/macuser/.ssh/id_rsa): Created directory '/Users/macuser/.ssh'. Enter passphrase (empty for no passphrase): パスワード入力 Enter same passphrase again: パスワード入力 Your identification has been saved in /Users/macuser/.ssh/id_rsa. Your public key has been saved in /Users/macuser/.ssh/id_rsa.pub. The key fingerprint is: SHA256:xxxxxxxxxxxxxxx メールアドレス The key's randomart image is: +---[RSA 4096]----+ | xxxxxx | | x x x x | | xxxxxxxxx | | x x x ox*x | | x = . = | | x x . . x | |xxx x . . | +----[SHA256]-----+~/.ssh/id_rsa.pub に公開鍵が作成された。
$ cat ~/.ssh/id_rsa.pubGitHubに登録しよう。
毎回パスワードを聞かれるのも鬱陶しいので、
$ ssh-add ~/.ssh/id_rsa
した。
署名
GitHubでの署名付きコミットをするため。
$ brew install gpg pinentry-mac $ LANG=C gpg --gen-key ~~~~~ 鍵作成 ~~~~~ # こいつをGitHubに登録しとく。 $ gpg -a --export ${PUB_KEY} > ~/.ssh/pubkey.gpg $ git config --global commit.gpgsign true $ echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf最後に
個人的な設定を紹介しましたが、これ良いよ! という設定がありましたら、コメント欄にお願いします。
- 投稿日:2021-03-01T18:39:10+09:00
Mac(Catalina)にSQLWorkbench/Jをインストールする
初めてのQiita投稿です。
お手柔らかにお願いします。筆者の環境
・macOS Catalina バージョン10.15.7<インストール手順>
1. Java(JDK,JRE)をインストールする。
2. SQLWorkbench/Jをインストールする。【ハマったポイント】
SQLWorkbench/Jとの整合性なのか、Java11ではSQLWorkbench/Jが正常に起動しなかった。
SQLWorkbench/Jを起動すると、"Unable to load Java Runtime"と表示される。1.Java(JDK,JRE)をインストールする。
SQLWorkbench/Jを動かすためには、Javaが必要となります。
JREの入手先としてはいくつかありますが、OpenJDKのビルドであるZulu提供のものを使用します。
(Zulu版 Java JRE)Zulu(他のJavaサポート)については、nowokayさんがまとめて下さっていますのでこちら参照ください。
https://qiita.com/nowokay/items/edb5c5df4dbfc4a99ffb#zuluzulu-enterpriseJava8をインストールしていきますが、macOSのバージョンが10.15ですので、"10.13 or later"のDMG版を選択して、ダウンロードします。
ダウンロード完了後、ファイルを開き、ウィンドウに従ってインストールを進めます。
(Javaインストールの確認)
Macでターミナルを開き、下記コマンドを実行する。
$java -version
下記のようなバージョン情報が表示されていれば、インストールは正常に完了しています。
openjdk version "1.8.0_282" OpenJDK Runtime Environment (Zulu 8.52.0.23-CA-macosx) (build 1.8.0_282-b08) OpenJDK 64-Bit Server VM (Zulu 8.52.0.23-CA-macosx) (build 25.282-b08, mixed mode)Javaのパスが設定されていない場合、javaコマンドが実行できないため、下記作業を行う必要があります。
環境変数を通す。
$export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
$source ~/.bash_profile
再度、
java -version
でバージョン情報が表示されるか確認してください。2. SQLWorkbench/Jをインストールする。
パッケージダウンロード先より"Mac Package"から、macOS用のパッケージをダウンロードします。
ダウンロードフォルダに圧縮ファイルがあるので、そちらを解凍すると、SQLWorkbenchJ.appが追加されます。
一度、ダブルクリックで開いて、正常に起動できれば画像のような画面が表示されます。
(※筆者はここで、冒頭に書いたエラーが発生)
Javaはインストールして、SQLWorkbenchもインストールできたけれど、初期設定がうまくできていない状態という解釈で
以下の作業を行います。ターミナルを開き、SQLWorkbenchの設定ファイルを加筆修正。
$vi /Applications/SQLWorkbenchJ.app/Contents/Info.plist
加筆の内容は以下。
<key>JVMRuntime</key> <string>zulu-8.jdk</string>対象のファイルを保存し、シンボリックリンクの作成を行う。
$ln -s /Library/Java/JavaVirtualMachines/zulu-8.jdk /Applications/SQLWorkbenchJ.app/Contents/PlugIns/改めて、SQLWorkbenchJのアプリケーションを起動すると、正常に起動!!
ドライバ入れるとこまでがインストールセットだと思いますが、本題はエラーで詰まった話なので割愛。
- 投稿日:2021-03-01T14:41:33+09:00
【Macでcronを使ってNode.jsプログラムを定期実行させるまで】
cronせっかく勉強したのに、Macだとlaunchd使いましょうとかいわれてなんやそれってなってます。
フルディスクアクセスにターミナル.appと、crontabを追加する。
1,フルディスクアクセスにcrontabを追加
「システム環境設定」→「セキュリティとプライバシ」→「フルディスクアクセス」で鍵を解除 →「+」→「command + shift + G」で /usr/bin/cron/ を入力して開く → crontabを選択して開く2,フルディスクアクセスにターミナル.appを追加
1と同じように、アプリケーション/ユーティリティ/を開く → ターミナル.appを選択して追加ここまで行えば、cronを実行できるようになる
crontabにcron文を記述する
cronの操作
crontab -e でvimなどで開ける
crontab -l で記入したcron文一覧を見れるcron文
毎日10時10分にnode ~といったnode.jsファイルを自動実行したい場合10 10 * * * /Users/~/.nodebrew/current/bin/node /Users/~/programming/Nodejs/sample.js>>error.txt #分 時 日 月 曜日 nodeコマンドのフルパス 実行したいjsファイルのフルパス・nodeコマンドのフルパスは
which node
とterminalに入力するだけ
・>>error.txtとすると、jsならconsole.log()での出力内容を取得したtextファイルを作成できる。これで指定した時間に指定したファイルを実行できる
cronを実際に動かしてみてハマったときに確認したこと。
・cronに設定したPATHは合っているか
・logは出力できているか
・logはどこまで出力されているか→原因の場所特定→結果 .envファイルを読み込むdotenvモジュールのファイルパスが相対パスになっていたことが問題だった。
require('dotenv').config() //動かなかったコード require('dotenv').config({ path: '/Users/~/JS/Nodejs/scraping/.env' })
cronを止める
cronを一時的に止めたい場合は、#でコメントアウトすればいい
- 投稿日:2021-03-01T14:41:33+09:00
【Macでcrontabを動かすためにやったこと】
cronせっかく勉強したのに、Macだとlaunchd使いましょうとかいわれてなんやそれってなってます。
フルディスクアクセスにターミナル.appと、crontabを追加する。
1,フルディスクアクセスにcrontabを追加
「システム環境設定」→「セキュリティとプライバシ」→「フルディスクアクセス」で鍵を解除 →「+」→「command + shift + G」で /usr/bin/cron/ を入力して開く → crontabを選択して開く2,フルディスクアクセスにターミナル.appを追加
1と同じように、アプリケーション/ユーティリティ/を開く → ターミナル.appを選択して追加ここまで行えば、cronを実行できるようになる
crontabにcron文を記述する
cronの操作
crontab -e でvimなどで開ける
crontab -l で記入したcron文一覧を見れるcron文
毎日10時10分にnode ~といったnode.jsファイルを自動実行したい場合10 10 * * * /Users/~/.nodebrew/current/bin/node /Users/~/programming/Nodejs/sample.js>>error.txt #分 時 日 月 曜日 nodeコマンドのフルパス 実行したいjsファイルのフルパス・nodeコマンドのフルパスは
which node
とterminalに入力するだけ
・>>error.txtとすると、jsならconsole.log()での出力内容を取得したtextファイルを作成できる。これで指定した時間に指定したファイルを実行できる
cronを実際に動かしてみてハマったときに確認したこと。
・cronに設定したPATHは合っているか
・logは出力できているか
・logはどこまで出力されているか→原因の場所特定→結果 .envファイルを読み込むdotenvモジュールのファイルパスが相対パスになっていたことが問題だった。
require('dotenv').config() //動かなかったコード require('dotenv').config({ path: '/Users/~/JS/Nodejs/scraping/.env' })
cronを止める
cronを一時的に止めたい場合は、#でコメントアウトすればいい
- 投稿日:2021-03-01T11:25:54+09:00
missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
$ xcode-select --install
refs
macOS アップデート後にいつも出くわす invalid active developer path エラー - A Memorandum https://blog1.mammb.com/entry/2019/12/03/225607
- 投稿日:2021-03-01T10:53:08+09:00
pythonで簡単に顔認証ライブラリ使ってみた
開発環境
Macbook Air (M1チップ)
anaconda
ANACONDA.NAVIGATORでGUIを使った仮想環境を用いる。
M1チップでもRosetta2で普通に使える。python 3.7.9
openCVが3.7以降だと失敗した気がする。numpy 1.19.2
opencv 3.4.2
pillow 8.1.0アーキテクチャ
Face_detection
├ face_learner.py (学習用プログラム)
├ face_id.py (認証用プログラム)
├ pos
└ 撮った正解画像と傘増しした画像
├ pos.txt (正解画像のリスト)
├ pos.vec (正解画像の特徴量を示したベクトルデータ)
├ neg
└ 不正解画像
├ neg.txt (不正解画像のリスト)
├ haarcascade_frontalface_default.xml (人間の顔認識用xml)
├ cascade
└ 認証する人の顔認識用xml不正解画像は自分で適当に集め、listを作成。
neg.txt./neg/neg1.jpg ./neg/neg2.jpg ./neg/neg3.jpg ./neg/neg4.jpg ./neg/neg5.jpghaarcascade_frontalface_default.xmlはgithubから持ってくる。
(opencv/data/haarcascades/haarcascade_frontalface_default.xml)
face_learner.pyで正解画像撮影/画像傘増し/学習をする。
実行するとカメラが起動するので自分の顔を撮る。
ちょっと恥ずかしい。
終わるとcascadeフォルダにcascade.xmlが生成されるのでそれをトップディレクトリに移動させる。face_id.pyで実際に認証を行なっている。
カメラが起動し、自分の顔の上に名前が出る。コード公開
face_lerner.py# ====================================================================== # Project Name : Face Identify # File Name : face_lerner.py # Encoding : utf-8 # Creation Date : 2021/02/20 # ====================================================================== import os import re import numpy as np import time import glob import shutil import PIL.Image from PIL import ImageEnhance import subprocess import cv2 def takePic(cascade, picnum_max): """take pictures for learning """ cap = cv2.VideoCapture(0) color = (255,255,255) picture_num = 1 while True: ret, frame = cap.read() facerect = cascade.detectMultiScale(frame, scaleFactor=1.7, minNeighbors=4, minSize=(100,100)) font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(frame, str(picture_num), (10,500), font, 4,(0,0,0),2,cv2.LINE_AA) if len(facerect) > 0: for (x,y,w,h) in facerect: picture_name = './pos/pic' + str(picture_num) + '.jpg' cv2.imwrite(picture_name, frame) picture_num += 1 cv2.imshow("frame", frame) if picture_num == picnum_max + 1: break if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() def removePic(): """remove files for initialize """ os.chdir('cascade') for x in glob.glob('*.xml'): os.remove(x) os.chdir('../') os.chdir('pos') for x in glob.glob('*.jpg'): os.remove(x) os.chdir('../') if os.path.exists('pos.txt'): os.remove('pos.txt') def countPic(): """count a number of taken pictures """ files = os.listdir("./pos") count = 0 for file in files: count = count + 1 return count def bulkOut(): """Bult out pics """ # a number of taken pics originalnum = countPic() # a number of present total pics imageNum = countPic()+1 # Flip horizontal for num in range(1, originalnum + 1 ): fileName = './pos/pic' + str(num) + '.jpg' if not os.path.exists(fileName): continue img = cv2.imread(fileName) yAxis = cv2.flip(img, 1) newFileName = './pos/pic' + str(imageNum) + '.jpg' cv2.imwrite(newFileName,yAxis) imageNum += 1 print('*** Flip horizontal is finished *** \n') # Change Saturation SATURATION = 0.5 CONTRAST = 0.5 BRIGHTNESS = 0.5 SHARPNESS = 2.0 for num in range(1, 2 * originalnum + 1): fileName = './pos/pic' + str(num) + '.jpg' if not os.path.exists(fileName): continue img = PIL.Image.open(fileName) saturation_converter = ImageEnhance.Color(img) saturation_img = saturation_converter.enhance(SATURATION) newFileName = './pos/pic' + str(imageNum) + '.jpg' saturation_img.save(newFileName) imageNum += 1 print('*** Change Saturation is finished *** \n') # Change Contsract for num in range(1, 3 * originalnum + 1): fileName = './pos/pic' + str(num) + '.jpg' if not os.path.exists(fileName): continue img = PIL.Image.open(fileName) contrast_converter = ImageEnhance.Contrast(img) contrast_img = contrast_converter.enhance(CONTRAST) newFileName = './pos/pic' + str(imageNum) + '.jpg' contrast_img.save(newFileName) imageNum += 1 print('*** Change Constract is finished *** \n') # Change Brightness for num in range(1, 4 * originalnum + 1): fileName = './pos/pic' + str(num) + '.jpg' if not os.path.exists(fileName): continue img = PIL.Image.open(fileName) brightness_converter = ImageEnhance.Brightness(img) brightness_img = brightness_converter.enhance(BRIGHTNESS) newFileName = './pos/pic' + str(imageNum) + '.jpg' brightness_img.save(newFileName) imageNum += 1 print('*** Change Brightness is finished *** \n') # Change Sharpness for num in range(1, 5 * originalnum + 1): fileName = './pos/pic' + str(num) + '.jpg' if not os.path.exists(fileName): continue img = PIL.Image.open(fileName) sharpness_converter = ImageEnhance.Sharpness(img) sharpness_img = sharpness_converter.enhance(SHARPNESS) newFileName = './pos/pic' + str(imageNum) + '.jpg' sharpness_img.save(newFileName) imageNum += 1 print('*** Change Sharpness is finished *** \n') # Rotate by 15 deg. for num in range(1, 6 * originalnum + 1): fileName = './pos/pic' + str(num) + '.jpg' if not os.path.exists(fileName): continue # read original file img = cv2.imread(fileName) h, w = img.shape[:2] size = (w, h) # define angle to rotare angle = 15 angle_rad = angle/180.0*np.pi # caluclate a size of pic after rotation w_rot = int(np.round(h*np.absolute(np.sin(angle_rad))+w*np.absolute(np.cos(angle_rad)))) h_rot = int(np.round(h*np.absolute(np.cos(angle_rad))+w*np.absolute(np.sin(angle_rad)))) size_rot = (w_rot, h_rot) # rotate center = (w/2, h/2) scale = 1.0 rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale) # add translation) affine_matrix = rotation_matrix.copy() affine_matrix[0][2] = affine_matrix[0][2] -w/2 + w_rot/2 affine_matrix[1][2] = affine_matrix[1][2] -h/2 + h_rot/2 img_rot = cv2.warpAffine(img, affine_matrix, size_rot, flags=cv2.INTER_CUBIC) cv2.imwrite(newFileName, img_rot) newFileName = './pos/pic' + str(imageNum) + '.jpg' saturation_img.save(newFileName) imageNum += 1 print('*** Rotation by 15 deg. is finished *** \n') # Rotate by -15 deg. for num in range(1, 7* originalnum + 1): fileName = './pos/pic' + str(num) + '.jpg' if not os.path.exists(fileName): continue # read original file img = cv2.imread(fileName) h, w = img.shape[:2] size = (w, h) # define angle to rotare angle = -15 angle_rad = angle/180.0*np.pi # caluclate a size of pic after rotation w_rot = int(np.round(h*np.absolute(np.sin(angle_rad))+w*np.absolute(np.cos(angle_rad)))) h_rot = int(np.round(h*np.absolute(np.cos(angle_rad))+w*np.absolute(np.sin(angle_rad)))) size_rot = (w_rot, h_rot) # rotate center = (w/2, h/2) scale = 1.0 rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale) # add translation) affine_matrix = rotation_matrix.copy() affine_matrix[0][2] = affine_matrix[0][2] -w/2 + w_rot/2 affine_matrix[1][2] = affine_matrix[1][2] -h/2 + h_rot/2 img_rot = cv2.warpAffine(img, affine_matrix, size_rot, flags=cv2.INTER_CUBIC) cv2.imwrite(newFileName, img_rot) newFileName = './pos/pic' + str(imageNum) + '.jpg' saturation_img.save(newFileName) imageNum += 1 print('*** Rotation by -15 deg. is finished ***\n') print('*** Bulking out is completed ***\n') def generatePosFile(cascade): """make text file of face positions in pictures """ fpos = open('pos.txt', 'a') for fileName in glob.glob('./pos/*.jpg'): img = cv2.imread(fileName) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = cascade.detectMultiScale(gray) for (x,y,w,h) in faces: text = fileName + ' 1 ' + str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h) + '\n' fpos.write(text) print('*** making pos.txt is finished ***') # user_fileName = input('Please input your fileName\n') cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') picnum_max = input('please input a number of pictures to take\n') # remove pos and files in pic/pos removePic() # start video and take pictures takePic(cascade, int(picnum_max)) # count a number of picutres bulkOut() # make text file of face positions in pictures generatePosFile(cascade) subprocess.call('opencv_createsamples -info pos.txt -vec pos.vec -num ' + str(countPic()), shell=True) posnum = input('please input a number of created pos\n') subprocess.call('opencv_traincascade -data ./cascade -vec pos.vec -bg neg.txt -numPos ' + posnum + ' -numNeg 40', shell=True)face_id.py# ====================================================================== # Project Name : Face Identify # File Name : face_id.py # Encoding : utf-8 # Creation Date : 2021/02/22 # ====================================================================== import cv2 font = cv2.FONT_HERSHEY_SIMPLEX if __name__ == "__main__": cap = cv2.VideoCapture(0) cascade_path_human = 'haarcascade_frontalface_default.xml' cascade_path = 'cascade.xml' cascade_human = cv2.CascadeClassifier(cascade_path_human) cascade = cv2.CascadeClassifier(cascade_path) while True: ret, frame = cap.read() facerect_human = cascade_human.detectMultiScale(frame, scaleFactor=1.7, minNeighbors=4, minSize=(100,100)) facerect = cascade.detectMultiScale(frame, scaleFactor=1.7, minNeighbors=4, minSize=(100,100)) if len(facerect_human) > 0: for rect in facerect_human: cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (255, 255, 255), thickness=2) if len(facerect) > 0: for rect in facerect: cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (255, 0, 0), thickness=2) cv2.putText(frame, 'name', tuple(rect[0:2]), font, 2,(0,0,0),2,cv2.LINE_AA) cv2.imshow("frame", frame) # quit with q key if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()cv2.putText(frame, 'name', tuple(rect[0:2]), font, 2,(0,0,0),2,cv2.LINE_AA)これのnameを自分の名前に変更すればOK。
まとめ
撮った写真40枚程度 (傘増し後1200枚程度)で、精度はともかくそれっぽい認識はできていた。
deep learningに詳しくなくても、こんなことができてしまった。
- 投稿日:2021-03-01T00:22:37+09:00
VSCode でC++の開発環境構築(Windows / MacOS)
ことの発端
前々から VSCode で C++ の開発環境を作りたいと思って、やってみたら拍子抜けするくらい簡単1 だったのでメモ。
Windows
方針
VisualStudio や Mingw-w64 でも良いけど、個人的には WSL で環境構築した方がUbuntsuだし簡単かもと思い今回はこちらを選択します。
WSL じゃなくて VirtualBox の Ubuntu イメージがあるなら、VSCodeからリモート接続でも良いかもですが、共有フォルダとかファイル権限とか案外面倒なので、この説明は WSL ってことにします。WSL をインストール
VirtualBox や Docker Desktop for Windows みたいな VT-x を使っているミドルウェアをインストールしていないなら WSL2 に更新しても良いかもです。2
開発ツールのインストール
ターミナル(wsl)を起動して下記のコマンドを実施します。
sudo apt update sudo apt upgrade -y sudo apt install build-essential -y sudo apt install gdb -y sudo apt install cmake -yVSCode に拡張機能をインストール
こいつで、WSLにリモート接続した状態でVSCodeが使えるようになります。3
MacOS
方針
Xcode が入っている前提なので Clang になるけど、簡単なテストコードの開発環境という前提なので、これで良しとします。(今後問題が出たら考える)
開発ツールのインストール
標準では cmake が入っていないので、 Homebrew から下記コマンドを実施してインストールします。
brew install cmake
開発作業
CMake を使う場合
CMakeLists.txt
を作りますが、CMakeTools
が良い仕事をしてくれるので、作る手間は省けます。
- 開発作業を行うフォルダを作成
- VSCodeを起動
- 1で作成したフォルダを開く
- 【Windowsのみ】 VSCodeの左下の をクリックすると、コマンドパレットが表示されるので「Remote-WSL: Reopen Folder in WSL」を選択
- 拡張機能をインストール(インストールしていない場合)4
- ソースコード(main.cpp)を作成
- [F1]でコマンドパレットを表示して
CMake: Configure
を選択- 続けて
CMakeLists.txt
を作るか聞いてくるのでCreate
を選択main.cppp#include <iostream> int main(void) { std::cout << "hello" << std::endl; return 0; }
CMakeTools
が反応してビルド準備までやってくれる。(初回は通知が表示される)- 手動で行う場合は、[F1] でコマンドパレットを表示して
CMake: Configure
を選択して、キット(gcc
やClang
)や最適化(デバッグが目的なのでDebug
)の設定を行います。- この一連の作業で
build
フォルダが作成されるので、build
フォルダは.gitignore
に追加しときましょう。ビルドとデバッグ
- [F7] でビルド
- [CTRL] + [F5] でデバッグ開始
- 大概のデバッガと同じようにブレークポイントとかスタックトレースとか普通に使える
コンソールアプリで簡単なテストコードを書きたいという動機なので、XcodeとかAndroid Studioとか既存の開発環境に導入するとなると、それはもういばらの道です。 ↩
過去に、VT-xを使っている VirtualBox と Docker Desktop for Windows のネットワークドライバがコンフリクトして大変な目に遭ったのだが、WSL2もVT-xに対応したので同じことが起きそうで躊躇しているが、他に VT-x を使うミドルウェアがインストールされていないなら、WSL2の方が良いかと。 ↩
姉妹品で Remote - SSH: ms-vscode-remote.remote-sshがあって、サーバにリモート接続して作業する際に大変重宝しています。 ↩
VSCodeはリモート接続毎に拡張機能をインストールするため WSL にリモート接続後にインストールする必要があります。 ↩