20210301のMacに関する記事は7件です。

MacBookのオススメ初期設定

はじめに

嫁からの誕生日プレゼントで M1 MacbookPro を貰った(めっちゃ嬉しい)ので、自分なりの初期設定を記載する。

初めてMacを使用する方などの参考になればと。

目次

  • アカウント名
  • ローカル名
  • トラックパッド
  • キーボード
  • デスクトップ
  • バッテリー
  • gitのインストール
  • Finder
  • ターミナルの設定
  • 公開鍵の作成
  • 署名

アカウント名

基本的にスクショや画面共有することが多く、本名を露出したくないので「macuser」という名前を使用している。

スクリーンショット 2021-03-01.png

ターミナル画面を共有したときに本名で設定していると うっかり載ってしまうことがある。

アカウント名@ローカル名 ~ 

と表示されるので、本名を晒したくない人は気をつけよう。

初期設定時に本名を設定して「変えたい」という人がいれば Apple公式 に変更方法が載っているので参考に。
https://support.apple.com/ja-jp/HT201548

ローカル名

こっちもターミナルに表示される部分。

例えば初期ではこんな感じ。
スクリーンショット 2021-03-01.png

macusernoMacbook-Pro !

ださい。変えよう。
[ システム環境設定 ] > [ 共有 ] > [ コンピュータ名 ]
スクリーンショット 2021-03-01.png

m1-mac とした。

ターミナルを再起動してみると...
スクリーンショット 2021-03-01.png

トラックパッド

MacBookの初期のトラックパッドの速度、チョー遅い。

なので、変える。

[ システム環境設定 ] > [ トラックパッド ] > [ 軌跡の速さ ]
スクリーンショット 2021-03-01.png

[ タップでクリック ] を オン にしていると、トラックパッドに触れただけでクリック判定となります。
(タップで使用したい場面があるので、個人的にオン)

キーボード

文字を入力しただけで勝手に変換される ライブ変換
勝手にタイプミスと判断され修正される タイプミス修正

ありがた迷惑。オフにする。

[ システム環境設定 ] > [ キーボード ] > [ 入力ソース ]

ライブ変換 オフ!
タイプミスを修正 オフ!

スクリーンショット 2021-03-01.png

あと、プログラミングしてると\ (バックスラッシュ) を沢山打つ。
現状だと Option + ¥ で入力になっているのでめんどくさい。

↓こいつを オン にしてやる。
スクリーンショット 2021-03-01.png

デスクトップ

色々とインストールするときにディスクをマウントするので、デスクトップにこんな感じのアイコンが出現する。
スクリーンショット 2021-03-01.png

邪魔。デスクトップには何も表示させたくない。

なのでこうする。

[ Finder ] > [ 環境設定 ] > [ デスクトップに表示する項目 ]
スクリーンショット 2021-03-01.png
スクリーンショット 2021-03-01.png

スッキリ〜〜〜

Finderを起動すると、左の方にマウントされてるディスクが表示されるので、ここからアンマウント。
スクリーンショット 2021-03-01.png

バッテリー

スクリーンショット 2021-03-01.png
メニューバーに %表示 したい!

[ システム環境設定 ] > [ Dockとメニューバー ] > [ バッテリー ] > [ 割合(%)を表示 ] を オン!
スクリーンショット 2021-03-01.png

スクリーンショット 2021-03-01.png

あと、充電ケーブル外すと画面が少し暗くなるのが嫌なので、

[ システム環境設定 ] > [ バッテリー ] > [ バッテリー電源使用時はディスプレイを少し暗くする ] を オフ!
スクリーンショット 2021-03-01.png

gitのインストール

ターミナルに git って打ち込んでインストールすれば おk
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3433373238322f32383536386132652d396235352d666366312d306233642d3561316237636537613436302e706e67.png

Finder の設定

ホームディレクトリは頻繁にアクセスするので、アクセスしやすくした方がいい。

上のタイトルを二本指クリック > ユーザ
スクリーンショット 2021-03-01.png

あとは、ホームディレクトリを左のクイックアクセス的なところにドラッグすればおk。

スクリーンショット 2021-03-01.png

隠しファイルの表示もしたほうがいい。

Command + Shift + . で 隠しファイルが表示される。
スクリーンショット 2021-03-01.png

ターミナルの設定

白背景に黒文字だとターミナルっぽくない!

[ ターミナル ] > [ 環境設定 ] > [ 一般 ] > [ 起動時に開く ]
から自分の好きなものに設定。

スクリーンショット 2021-03-01.png

スクリーンショット 2021-03-01.png
Homebrew の色にしてみた。
ターミナルっぽくなった!

スクリーンショット 2021-03-01.png

色、背景透明度などの微調整などは [ プロファイル ] から行えるので、是非自分の理想のターミナルに仕上げてください。

公開鍵の作成

$ 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.pub

GitHubに登録しよう。

毎回パスワードを聞かれるのも鬱陶しいので、

$ 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

最後に

個人的な設定を紹介しましたが、これ良いよ! という設定がありましたら、コメント欄にお願いします。

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

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-enterprise

Java8をインストールしていきますが、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が追加されます。
一度、ダブルクリックで開いて、正常に起動できれば画像のような画面が表示されます。
(※筆者はここで、冒頭に書いたエラーが発生)
スクリーンショット 2021-03-01 18.30.00.png

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のアプリケーションを起動すると、正常に起動!!
ドライバ入れるとこまでがインストールセットだと思いますが、本題はエラーで詰まった話なので割愛。

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

【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を一時的に止めたい場合は、#でコメントアウトすればいい

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

【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を一時的に止めたい場合は、#でコメントアウトすればいい

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

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

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

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.jpg

haarcascade_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に詳しくなくても、こんなことができてしまった。

参考 : 顔認証のプログラム作ったって言ってイキリたくない?

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

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 -y

VSCode に拡張機能をインストール

こいつで、WSLにリモート接続した状態でVSCodeが使えるようになります。3

MacOS

方針

Xcode が入っている前提なので Clang になるけど、簡単なテストコードの開発環境という前提なので、これで良しとします。(今後問題が出たら考える)

開発ツールのインストール

標準では cmake が入っていないので、 Homebrew から下記コマンドを実施してインストールします。

brew install cmake

開発作業

CMake を使う場合CMakeLists.txtを作りますが、CMakeToolsが良い仕事をしてくれるので、作る手間は省けます。

  1. 開発作業を行うフォルダを作成
  2. VSCodeを起動
  3. 1で作成したフォルダを開く
  4. 【Windowsのみ】 VSCodeの左下の リモートウィンドウを開きます をクリックすると、コマンドパレットが表示されるので「Remote-WSL: Reopen Folder in WSL」を選択
  5. 拡張機能をインストール(インストールしていない場合)4
  6. ソースコード(main.cpp)を作成
  7. [F1]でコマンドパレットを表示してCMake: Configureを選択
  8. 続けて CMakeLists.txt を作るか聞いてくるのでCreateを選択
main.cppp
#include <iostream>
int main(void) {
  std::cout << "hello" << std::endl;
  return 0;
}
  • CMakeToolsが反応してビルド準備までやってくれる。(初回は通知が表示される)
  • 手動で行う場合は、[F1] でコマンドパレットを表示してCMake: Configureを選択して、キット(gccClang)や最適化(デバッグが目的なのでDebug)の設定を行います。
  • この一連の作業でbuild フォルダが作成されるので、 build フォルダは .gitignore に追加しときましょう。

ビルドとデバッグ

  • [F7] でビルド
  • [CTRL] + [F5] でデバッグ開始
  • 大概のデバッガと同じようにブレークポイントとかスタックトレースとか普通に使える

  1. コンソールアプリで簡単なテストコードを書きたいという動機なので、XcodeとかAndroid Studioとか既存の開発環境に導入するとなると、それはもういばらの道です。 

  2. 過去に、VT-xを使っている VirtualBox と Docker Desktop for Windows のネットワークドライバがコンフリクトして大変な目に遭ったのだが、WSL2もVT-xに対応したので同じことが起きそうで躊躇しているが、他に VT-x を使うミドルウェアがインストールされていないなら、WSL2の方が良いかと。 

  3. 姉妹品で Remote - SSH: ms-vscode-remote.remote-sshがあって、サーバにリモート接続して作業する際に大変重宝しています。 

  4. VSCodeはリモート接続毎に拡張機能をインストールするため WSL にリモート接続後にインストールする必要があります。 

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