plant-raspberrypi3のブログ

ラズベリーパイ3とPythonに挑戦して、植物を愛でたり画像を加工したりします。最近はscikit-imageの勉強してます。

GitHubの練習 その3 ~複数のアカウントの使い分け~

GitHubで趣味用と仕事用などでアカウントを分けたいときのためのメモ。

このあたりのページを参考にさせていただきました。

qiita.com

labs.opentone.co.jp

repositoryごとにアカウントを分ける

各repositoryのディレクトリに入って次のコマンドを打ち込み、GitHubのページをリモートに設定。

$ cd repository1
$ git remote add origin https://github.com/***/repository1.git

次に、アカウント、メルアドを設定。

$ git config user.name "***"
$ git config user.email "***@example.com"

.git/configにちゃんと設定されているか確認。

$ cat .git/config

[remote "origin"]やら[user]やらのところをチェック。

キーチェーンアクセスで履歴を消去

Macでやると自動でアカウントとパスワードが保存されてしまい、切り替えがうまくいきませんでした。

こちらのページを参考に履歴を消去。

qiita.com

  1. Spotlightで「キーチェーンアクセス」を検索
  2. キーチェーンアクセスで「すべての項目」を選択
  3. 「git」を検索
  4. github.comを削除

これでうまくいきました。

GitHubの練習 その2 ~branch~

前回に引き続き、GitHubの練習です。

plant-raspberrypi3.hatenablog.com

今回はbranchを中心に。

  1. branchとは?
  2. ローカルでbranchを作って作業
  3. branchをGitHub上にプッシュ
  4. branchをmasterにマージ

1. branchとは?

以下のページから引用。

backlog.com

ブランチとは、履歴の流れを分岐して記録していくためのものです。分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。

複数人で開発するときには必須の機能みたいです。

1人で作業するときの必要性はまだ実感していませんが、、、
とりあえず使ってみようということで。

2. ローカルでbranchを作って作業

今回も以下のページを参考にさせていただいています。

techacademy.jp

前回のmasterでの作業の続きからです。

$ git branch
* master

ちゃんとmasterになっていますね。

新しいbranchsub1を作ってみます。

$ git branch sub1

branchsub1に移動します。

$ git checkout sub1
$ git branch
  master
* sub1

ちゃんとsub1が作成されて、そちらに移動されています。

では、README.mdを再びいじってみます。

$ echo "" >> README.md
$ echo "hello world" >> README.md
$ cat README.md
# hello-world
test repository
test from local

hello world

branchsub1にコミットします。

$ git add README.md
$ git commit -m "Add description"

3. branchをGitHub上にプッシュ

早速、GitHubにアップロードというかプッシュします。

$ git push origin sub1
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 287 bytes | 287.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/***/hello-world.git
 * [new branch]      sub1 -> sub1

GitHubのページで確認すると、master以外にsub1という名前のbranchが作成されているはず、、、

4. branchをmasterにマージ

マージするためには一旦masterに戻ります。

$ git checkout master

その後、マージを実行します。

$ git merge sub1

GitHubにマージ後のmasterpushします。

$ git push origin master

GitHub上のmasterにもsub1に加えた変更が反映されているはず、、、

おまけ

gitのコマンドの参考ページのメモ。

qiita.com

qiita.com

GitHubの練習 その1 ~とりあえず使ってみる~

GitHubの使い方がいまいちわからなくて苦労したのでメモ。

GitHubの公式ページ

github.com

と以下のページを参考にさせていただきました。

techacademy.jp

  1. アカウントの作成
  2. repositoryの作成
  3. ローカルで作業してみる
  4. ローカルの作業結果をGitHub上へプッシュ

1. アカウントの作成

アカウント名、e-mailアドレス、パスワードだけで登録できます。楽ですね。

登録アドレスに送られてきたメールでVerifyするのを忘れずに。

2. repositoryの作成

GitHubページ上で作成します。ログインしたときの画面にある

「New Repository」

のボタンで作成できます。

  • Repositoryの名前を入力
  • Descriptionは入れても入れなくてもOK
  • 無料プランの場合はPublic一択
  • 「Initialize this repository with a README」はチェックを入れておく (READMEはいりますよね?)
  • gitignoreとlicenseはあとで追加できるらしい (やり方は知らない)

仮に***というアカウントでhello-worldというrepositoryを作成したことにします。

3. ローカルで作業してみる

Macの人はターミナルを開きます。(他のOSは各自)

作業用のディレクトリを作成して移動、gitを開始。

$ mkdir working
$ cd working
$ git init

gitコードは入っていました。なければインストール。

作業したいアカウントのリポジトリをダウンロード。

$ git clone https://github.com/***/hello-world.git

git cloneする場合は前述のgit initは必要ないかも。

次に、ダウンロードされたか確認。

$ ls
hello-world
$ cd hello-world
$ ls
README.md

ちゃんとREADME.mdがダウンロードされています。

ちなみに、README.mdの中身も確認

$ cat README.md
# hello-world
test repository

これに追記。

$ echo "test from local" >> README.md
$ cat README.md
# hello-world
test repository
test from local

ローカルでgitaddcommit

$ git add README.md
$ git commit -m "Add description"

4. ローカルの作業結果をGitHub上へプッシュ

では、「プッシュ」とやらをしてみます。(アップロードみたいなもの?)

$ git push origin master
Username for 'https://github.com': ***
Password for 'https://***@github.com':

元のwebページを確認するとアップロードされて反映されているはず、、、

次回は「ブランチ」とやらを使ってみる予定。

機械学習とTensorflowの用語集ページ

こんにちは。らずべりーです。

ラズパイさんで画像認識モデルの訓練ができるかなー、と先日入れたKerasで試したところ、見事にフリーズし撃沈orz

訓練はMacのほうでやろう、、、

TensorflowやらKerasのわからん

Kerasを使っていて、素人的にはよくわからない用語が多かったです。

何となくこういう意味なんだろうな、というのは想像はつくのですが、ドキュメントには(常識的すぎるのか)あまりちゃんと書いてなかったり、どこに書いてあるのかわからなかったりして困ってました。

Tensorflowの用語集ページを見つけた

TensorflowのGetStartedを見ていて、用語集へのリンクがついていたので、備忘録としてメモ。

Get Startedのページ

https://www.tensorflow.org/get_started/www.tensorflow.org

機械学習とTensorflowの用語集ページ

developers.google.com

助かりますね。

たとえば、batchとbatch sizeの説明。

batch

The set of examples used in one iteration (that is, one gradient update) of model training.

batch size

The number of examples in a batch. For example, the batch size of SGD is 1, while the batch size of a mini-batch is usually between 10 and 1000. Batch size is usually fixed during training and inference; however, TensorFlow does permit dynamic batch sizes.

Google翻訳

バッチ

モデル訓練の1回の反復(つまり、1回の勾配更新)で使用される一連の例。

バッチサイズ

バッチ内のサンプルの数。たとえば、SGDのバッチサイズは1ですが、ミニバッチのバッチサイズは通常10〜1000です。バッチサイズは通常、トレーニングと推論の間に固定されます。ただし、TensorFlowは動的なバッチサイズを許可します。

これから度々お世話になりそうです。

ラズパイカメラをJupyter Notebookから操作してハマった話

こんばんは。らずべりーです。

安易に実行すると危ないことがあるよ、という自分への教訓用のメモです。

久々にラズパイカメラをいじった

以前はraspistillなどでターミナルから操作していましたが、

plant-raspberrypi3.hatenablog.com

MobileNetやXceptionの画像認識と組み合わせていきたいなぁ、ということで、python-picameraを使ってみることに。

せっかくなら、Jupyter notebookから操作していろいろやりたいなー、ということでpyenv環境にJupyterを入れ直しました。

$ pip install jupyter

今回は特に何も問題なくすんなりいきました。よかった(´∀`*)ホッ

とりあえずプレビューしてみた

早速使ってみよう!ということで、とりあえずプレビュー。

#このコードは危険なハマりコードなのでそのままコピペしてはいけません!

import picamera

with picamera.PiCamera() as camera:
    camera.start_preview()

実行するとプレビューが全画面表示になります。

よしよし、と思ったのもつかの間、

「あれ?どうやって終了するんだっけ?ヽ(・д・!i!i)ノ」

キーボードを叩けども叩けどもうんともすんとも反応はなし。ドキュメントなどには「ターミナルからの実行だとCtrl+Dで終了できるよ!」と書いてあるものの、Jupyter Notebookにはなんの効力も発揮しませんでしたorz

これは、コンセントを抜くしかないのか、、、(´;ω;`) ブワッ
しかし実行中に抜いたらSDカードが壊れるかも、、、(´;ω;`)ブワッ

とパニクっていたところ、ふと

「そういえばiPhoneからSSH接続できるようにしてたわ」

plant-raspberrypi3.hatenablog.com

と思い出し、iPhoneのTerminiusアプリからSSH接続して

sudo reboot

しばらく待つとちゃんと立ち上がりました。壊れなくてよかったーε-(´∀`*)ホッ

ちゃんとドキュメントを読んでから始めないとだめですね。(こんなことをする無鉄砲ものは私くらいかもしれませんが、、、)

以下が公式ドキュメントにある安全なコードです。

picamera — Picamera 1.10 documentation

import time
import picamera

with picamera.PiCamera() as camera:
    camera.start_preview()
    time.sleep(10)
    camera.stop_preview()

stop_previewまでコードに書いてから実行しないと危険!

というお話でした。

真面目にドキュメント読もう、、、

おまけ

ちなみに、最近やっとwith関数の使い方を把握しました、、、closeしなくて良いのは便利ですね。

おまけ2

そういえば、SSH接続でJupyterのプロセスをキルする方法もありましたね。そちらの方が安全そうなので、次に何かあったらそうしよう、、、

ラズパイで学習済みモデルを使った画像認識をしてみた その2

こんばんは。らずべりーです。

土日にお試ししていたラズパイで画像認識の件で追記です。

plant-raspberrypi3.hatenablog.com

モデルの読み込みと予測にかかる時間をちゃんと測ってみました。(環境によって違う場合がありますが、参考値として。)

MobileNet

モデルの読み込みにかかった時間: 53秒
一枚の画像の予測にかかった時間: 1秒

Xception

モデルの読み込みにかかった時間: 2分20秒
一枚の画像の予測にかかった時間: 4秒

やはりMobileNetは速いですが、Xceptionもあらかじめ読み込んでおけば、予測自体はすぐに終わるので実用上は問題なさそうです。

ラズパイをsambaサーバー化

ずいぶん前のエントリーで実施した旨書いていたのですが、久しぶりに見直したらSSH接続のほうの参照先のリンクが切れて参照できなくなっていたので、やばい!と思い、引用そのままですが備忘録としてメモ。

各コードの説明については引用元を参照してください。

引用元: www.virment.com

準備

$ sudo apt-get install samba

#ユーザを作成
$ useradd -m user1

#user1をsambaユーザとして登録
$ pdbedit -a user1
#パスワードを設定
new password:
retype new password:
Unix username: user1
NT username:
  (以下略)

#グループの作成
$ groupadd group1

#グループにメンバーの追加
$ gpasswd -a user1 group1
$ gpasswd -a user2 group1

#共有用ディレクトリの作成と設定
$ mkdir /home/public
$ chgrp group1 /home/public/

#アクセス権の設定
$ chmod -R 774 /home/public/

sambaの設定ファイルの編集

$ vi /etc/samba/smb.conf

設定ファイルの中身。

[global]
 
## Browsing/Identification ###
workgroup = WORKGROUP
→ ワークグループ名の設定
 
dos charset = CP932
→ Windowsマシンとの通信時に使用する文字コードの指定
 
unix charset = utf-8
→ Unixマシンとの通信時に使用する文字コードの指定
 
unix extensions = no
→ Macから接続する場合には必要 (詳細は未調査です)
 
hosts allow = 192.168.1.0/255.255.255.0
→ sambaサーバへのアクセスを許可するIPアドレスの指定
 
### Debugging/Accounting ###
log level = 1
→ 出力するログのレベルを指定。
  数値は010まで指定可能。数値が大きいほど詳細なログを出力
 
log file = /var/log/samba/log.%m
→ ログの保存場所の指定。%mはアクセスしてきたユーザマシン名に
  置き換わる変数。つまりこの場合はユーザマシン毎にログを出力する
 
max log size = 1000
→ ログファイルの最大サイズの指定。単位はキロバイト。
  左の場合は最大1MB。1MBを越えると、ログファイル末尾に
 「.old」が付けられて新しいログファイルが作成される。
  すでに「.old」が存在していた場合は削除されて上書きされる
 
###### Authentication ######
map to guest = never
→ ゲスト認証の無効化。有効にする場合は「never」ではなく
 「bad user」を記述

 #============= Share Definitions =============#
[homes]
comment = Home Directories
→ ディレクトリの説明に記述されるコメント
 
browseable = no
→ ディレクトリを共有一覧に表示しないための設定。
  例えばwindowsの場合は「ネットワーク」上に表示されない。
  表示する場合は「yes」を記述
 
writable = yes
→ ファイルへの書き込み許可の指定。
  書き込みを許可しない場合は「no」を記述
 
valid users = %S
→ ディレクトリにアクセス可能なユーザの指定。
  この場合はアクセスしてきたユーザが各自のディレクトリならば
  アクセス可能で、自分以外のユーザはアクセス不可。
  %Sはアクセスしてきたユーザ名に置き換わる変数。
 
[public]
path = /home/public
→ 共有ディレクトリのパス
 
browseable = yes
writable = yes
valid users = @group1
→ ディレクトリにアクセス可能なユーザをグループで指定。
  グループを指定する場合はグループ名に@を付けて指定する。
  この場合はgroup1に属するユーザのみがpublicにアクセス可能になる。

ファイアウォールの設定を確認

UDPの137番、138番、TCPの139番、445番のポートを許可する設定になっているかを確認する