しんさんのブログ

科学や技術のこと読書のことなど

Git初心者が読むメモ

2023/9/27追記

このブログの方法では最近のgithubで問題が起きることがわかりました。 1)ローカルのdefault branchをmastar -> mainに変更する。

git config --global init.defaultBranch main git config --system init.defaultBranch main

2) リモートリポジトリへ初めてローカルからpushするときに問題が発生する。 以下のブログに問題の発生の様子とその対処法が書いてある。 [Git] fatal: refusing to merge unrelated historiesを解決する話 - Qiita

2020/11/25追記:非常にわかりやすい解説がありましたのでリンク張っておきます。初心者はこれを読めばversinon 管理について知ることができます。

一人でコードの開発をするときにも、バージョン管理とバックアップも兼ねてのリモートリポジトリの利用は便利だなと思います。 そのために必要なコマンドのメモ集です。 最近はGitHubでもprivateリポジトリを無料で持てるので、一人開発もGitHubを使用しています。

Gitの初期設定

Gitの設定をするにはgit configコマンドを使う

  • 設定の一覧の表示

    git config --list

  • 特定の設定を確認

    git config user.name

  • ユーザー名の設定

    git config --global usr.name hoge

  • メールアドレスの設定

    git config --global user.email hoge@hoge

  • editorの設定

    git config --global core.editor "code --wait"

Gitの基本操作

  • git init/git clone: Gitローカルリポジトリの作成/取得
  • git add ステージングエリアに変更を登録
  • git reset ステージングエリアに追加した変更をワークツリーに戻す
  • git commit コミットを作成
  • git rm Gitで管理しているファイルの削除
  • git branch ブランチによる作業場所の確保
  • git checkout ワークツリーの変更を取り消す
  • git merge: 変更を取り込む
  • git status ローカルリポジトリの状態を確認する
  • git diff 各エリアの差分を確認する
  • git log コミット履歴を確認する
  • git push: ローカルリポジトリをリモートリポジトリに反映する

初めてのGit作業の手順

プロジェクト用にからのディレクトリを作成する

そのディレクトリで git init を実行する

git init

.git fileが作成されローカルリポジトリのmaster が作られる. ファイルはすべてワークツリーに配置される。 .gitignoreに登録するとGit管理外になる。 存在するファイルはすべてワークツリーに配置されuntracked状態になる。
すでにリモート上にリポジトリが存在するときにはgit cloneを使用して、リモートからローカルにcloneする.

git clone --recursive https://someuser@bitbucket.org/someuser/test.git

README.md fileを作成する

gitの状態を確認

git status  

管理対象に追加(ステージングエリアに上げる).

git add <file/dir name>

or カレントディレクトリ全部
git add . or git -A
-Aオプションは可能なファイル全部を表す

コミット対象から外す

git rm

コミット対象の差分を確認

ファイルの修正前と修正後の差分を確認

  • ステージングエリア登録後にワークツリーにどんな変更があったのかを調べる。ワークツリーとステージングエリアの差分を表示。

    git diff

  • Gitディレクトリとステージングエリアの差分。ステージングエリアにどんな変更が登録されているかを見る。

    git diff --cached

--cachedオプションはコミット対象(ステージングarea)の差分を表示することを意味する

ファイルをGitで管理しないようにする

.gitignore ファイルを作りそこにfileName/dirName書き込む

ファイルの状態の確認を行う(変更されたファイルの一覧)

git status

コミットするためにユーザー名とメールアドレスの設定が必要

git config --global user.email "abc@def.ghi"
git config --global user.name "Hoge hoge"

(--globalを付けるとそのPCでのすべての操作に関してこの内容を使う)

gitの設定の確認

git config --list

コミットを行う

コメントをつけてcommitするには

git commit -m "first comment"

詳細な変更も記述してcommitを行うには
-mを付けないとVSCodeが立ち上がってエディタ上でコメントを入力できる

git commit -V

コミットの確認 (最後にコミットされているファイルと現在のファイルの比較され、差分が表示される)

1commitにつき1行だけのコンパクト表示

git log --oneline

変更箇所の詳細表示

git log -p xxxxxx

どのファイルがどれくらい変更されてるかの統計情報

git log --stat

ローカルリポジトリでの操作を取り消す

ワークツリーへの変更を取り消して、Gitディレクトリにあるファイルに取り換える git checkout, ステージングエリアへの変更を取り消す git resetがある。

git checkout: ファイルが直前のコミット(または直前のステージングエリアへの登録ファイル)に戻る。変更をいろいろやったがやっぱり直前のコミット状態に戻したいときに使う。パラメータにブランチ名を指定するとブランチの切り替えにも使える。

git checkout -- hoge git checkoutは上記の状態の取り消しのほかにブランチを作るブランチを切り替えるコミットした状態に切り替えるなど4つの目的で使える。 新たにgit restoreコマンドが上記の取り消しに使うコマンドとして提唱されている ブランチ切り替えに関してはgit switchコマンドがある

ステージングエリアにファイルが残っていると上記操作が意図通りにならないのでステージングを取り消すにはgit resetを使う git reset: git addしたステージングエリアへの登録を取り消す

コミットを取り消す

git reset HEAD hoge.cpp  

HEADは直前のコミットを取り消すことを意味する
git revert コミットID
を使う方法もある。この方法はコミットの取り消しをコミットするというようなイメージ

コミットしたファイルをGitの管理から外し削除する

git rm finename
git rm -r directoryname

git rmでワークエリアからファイルが削除される(削除するとともに削除した状態をステージングする)がGitディレクトリからは削除されていない。git commitすることで削除するというのをコミットしてGitディレクトリからも削除される。

git rm --cached

(.gitignoreに書き込んでおく)

現状の状態の確認

git status
コミットの履歴
git log

Gitで管理しないファイルを設定する

.gitignore というファイルを作成しそこに無視したいファイル名やディレクトリ名を書く。

コミット履歴の確認

git log

コミットメッセージ以外の詳しい作業内容の情報も欲しいとき

git log -p

リモートリポジトリへ登録

gitHubにアクセスし、新規リポジトリを作成する
1. gitHubにアクセスし、新規リポジトリを作成する
2. 右上のタブから"New repository"を選択
3. Repository name を決める
4. private/publicの選択
5. create repositoryをクリックしてリポジトリを作成する

remote repositoryへの登録

git remote add origin https://github.com/hogehoge/hogename.git

ローカルでの開発内容を共有リポジトリに反映させる

git push -u origin master

-uオプションは次回から入力を省略するためのもの
git push -u origin master とすると、次回から git push だけで引数に指定した origin master で勝手に push してくれる
ユーザ名やパスワードを聞かれるので入力
origin は共有リポジトリのこと。レポジトリの場所(URL)の別名
master はブランチの名前
master は大事なブランチなので、個人利用では自由にpushしても大丈夫だがチームでの場合はmasterには通常pushしない
ブランチはGUIから確認可能(<>Codeタブのすぐ下に n branches と出ていて、クリックすると詳細が見れる)

以上で、初めてローカルリポジトリを作りそれをリモートのmasterブランチに反映させる方法が終了.

実際に作業は、共同作業ということを考えるとコード集約を妨げないように、自分専用のブランチを作って、そこで作業を行う.
  1. まずは現在のブランチを確認: git branch
    アスタリスクのついていものが現在のブランチ
  2. 新しブランチを作成する: git branch [ブランチ名]
  3. ブランチ切り替え: git checkout [ブランチ名]
  4. ブランチ先へのコミット(上で書いたmasterへの作業と同じ)
  5. 状態確認をする:
    • git status
    • git diff
    • git commit -m "hogehoge"
  6. リモートにPushする:
    git push origin ブランチ名

コンフリクト解消方法

もしコンフリクトがあると git fetch
git pull
すると、CONFLICTと表示される。
VSCodeなどでコンフリクトしている部分を修正 git add, git commitでマージコミットする
最後にgit pushでリモートに送る

ブランチでの作業が終了して、ブランチをmasterにマージする
  1. masterとの差分の確認 git diff master
  2. マージ先(master)に移動: git switch -c master
  3. 作成したブランチをマージ先にマージ:git merge ブランチ名
  4. ログ確認(変更内容がマージ先に反映されているか確認): git log
  5. リモートに反映: git push origin master
  6. マージが終了したので、作業用ブランチを削除: git branch -d ブランチ名
  7. ブランチの削除をリモートに反映: git push origin :ブランチ名
    (コロンを忘れないように)

ローカルリポジトリのmasterブランチにリモートリポジトリoriginのmasterブランチを取り込みたいとき

git switch -c master #(ブランチをマスターに切り替え)

 chekoutの代わりに、git switch -c [ブランチ名]、と書くのが推奨されています。確かにこちらの方がわかりやすい。 git fetch origin master #(リモートリポジトリからコピーする)

プルリクエストでブランチをマージする方法

pull requestを作成すると自分がプロジェクトに対して加えた変更を他の人に知らせることが出来る。

  1. リモートにpushする git push origin hoge
  2. プッシュ後にgithubのプロジェクトページを開く
    行進されたブランチが黄色で表示されている
    ここからプルリクエストを作成する
  3. ベースブランチを自分のアカウントのリポジトリに変える
  4. プルリクのコメントを入力
  5. レビュアーを指定する
  6. Crate pull requestをクリックする
  7. reviewがChange Approvedになったらマージする Create a merge commit: ブランチも含め全コミットが追加される Squash and merge トピックブランチのコミットをまとめたコミットが追加される Rebase and merge ベースブランチのコミット履歴を一直線にする

リモートリポジトリの内容をローカルに反映する

反映する方法は2種類ある. pullとfetch
Pullはローカルリポジトリだけでなくワークツリーにも反映されパソコン内のファイルが即座に書き変わる.
フェッチはローカルリポジトリへの取得のみなのでワークツリーに変更を反映するにはpullするかマージする必要がある。pull = fetch + merge

  1. git pull origin master
  2. git fetch origin

ファイルやディレクトリ名を変更したり、移動する

git mv <sourceFilename> <dstFilename>

ブランチ名変更

git branch -m <sourceBranchName> <dstBranchName>

ブランチ削除

git branch -d <BranchName>

ブランチの切り替え

git switch -c [ブランチ名]

ブランチのマージ

git merge <BranchName>

ブランチの状況の確認には

git log --all --graph --pretty=oneline
既にgitHub上にリポジトリがあるときにローカルに新たにディレクトリを作成しgit initしてファイルを追加したりすると何がおきるか
git push -u origin master

error: src refspec master does not match any.
error: failed to push some refs to 'https://github.com/hoge/hogehoge.git'
となりエラーが出る

既にgitHub上にリポジトリがあるときにローカルに新たにディレクトリを作成しgit clone してから、ファイルを追加したりすると何がおきるか

add -> commit -> push で新たなファイルをリモートリポジトリのmasterに登録できた

[ここまでをまとめると]

Gitサーバー上でプロジェクトを作成.すると,内容が空のリポジトリができる(GUI 操作)
Gitサーバーからリポジトリを複製して,手元に作業ツリーを作成 (git clone).空の作業ツリーができる.
作業ツリーにソースコードを追加し,フォルダをGitに追加 (git add)
変更をコミットする (git commit)
コミットした変更をGitサーバに送り込む (git push)
他のメンバーもGit上のリポジトリを複製 (git clone) すると, ソースコード一式が既に入った作業ツリーが取得できる

過去の状態に戻す方法:

git branch devbranch2 comitID

Unityのシーンビューでの操作方法メモ

最近ユニティーを触り始めました.
キー操作に関するメモです.

対象のオブジェクトを視点の中心に持ってきたいとき

  • Hierarchyで対象オブジェクトをダブルクリックする
  • シーンビューでオブジェクトが選択された状態でfを押す

対象オブジェクトを中心にしてカメラを回転したいとき。オブジェクトを注視する視線方向は維持。

  • Alt + 左ボタンを押しながらマウスを動かす

対象オブジェクトに近づく or 遠ざかる

  • Alt + 右ボタンを押しながらマウスを動かす
  • ホイールをまわす

カメラを中心に回転。周囲を見回すようなカメラの動き。

  • 右ボタンを押しながら、マウスを動かす

視点の平行移動

  • Alt + Ctrl とマウスの左ボタンを押しながらマウスを動かす
  • 手のマークをONにしてマウスの左ボタンを押しながらマウスを動かす

以下のページを参照:
https://docs.unity3d.com/ja/2018.1/Manual/SceneViewNavigation.html

International Conference on Computational Photography 2018の発表動画を眺めていました

International Conference on Computational Photography 2018は発表の動画が公開されているので、参加できない人も発表を見ることができて便利です。
iccp2018.ece.cmu.edu
発表のタイトルをクリックするとYoutubeの動画に飛びます。
個人的には"Acquiring and Characterizing Plane-to-Ray Indirect Light Transport"が気になりました。
プロジェクターとローリングシャッターカメラのタイミング制御がむつかしそうですが、鏡面反射と拡散反射が分離できたりマテリアルが分離できたり興味深いです。

Deep learning を使ったobject_detectionの情報

Deep learning を使ったobject_detectionの情報は以下のサイトを見ればすべてまとまっています。
サーベイ論文をもとにして、各手法の論文や実装サイトへのリンクが時系列でまとめられています。
github.com

transfer learning, fine tunning, distillation, NNモデル圧縮について調べてみました

Transfer learning

ある領域で学習したモデルを別の領域の学習に利用する手法のことです。
例えばimage netのような膨大な量の学習データを使用して1000カテゴリ分類の学習を行ったとして、その結果を用いて学習データの少ない10カテゴリ分類の問題を解くという手法です。
具体的には、1000カテゴリ問題を解くネットワークと解きたい問題のネットワークを途中までは同じにして、重みに転移元(ここでは1000カテゴリ分類問題)の学習結果を使用します。
そして、少ないデータを使用して出力層近くの重みのみを学習することで、非常に精度よく10カテゴリ問題のモデルを構築できるという手法。
転移元と転移先の問題が似ていることが転移がうまくいく条件になります。
画像の分類なら、共通する特徴や、それを使用してクラス分類するという問題設定が共通しているので、転移学習が有効に働きます。

Fine tunning

fine tunningとはすでにあるのモデルの一部を再利用して、新しいモデルを構築する手法のことだそうです。 素粒子理論で出てくる超対称性の話とは違います。
転移学習と同じ手法に見えますが、以下のような違いがあります。
転移学習は上の例で書いたように、既存の学習済モデル(出力層以外の部分)を、重みデータは変更せずに特徴量抽出機として利用して、出力層部分のみ学習することで、新しいモデルを構築する手法です。
これに対して、ファインチューニングは既存の学習済モデル(出力層以外の部分)の重みデータを一部再学習して特徴量抽出機として利用するという手法です。
つまり転移学習では転移済み学習モデルは固定しているが、ファインチューニングでは元の学習済み重みをさらに書き換えて、新しいモデルに"詳細にtunningする"手法だといえます。
fine tunningを使用する目的はtransfer learningと同じで、少ない学習データで高い正解率を得るためですが、fine tunningの方がtransfer learningよりも柔軟性があるといえます。

Transfer learningは特徴量抽出機の部分を固定したfine tunningといえるかもしれません。

Distillation

Distillation(蒸留)というのは、上の二つと違いネットワークの構造にかかわる技術です。
Distillationは学習済みの複雑なネットワークと"ほぼ"同等なシンプルなネットワークを新たに学習する手法です。
なぜそんなことが必要かというと、ディープラーニングは実用上より少ないメモリでより高速に動作する必要があり、そのためには出力は同等のよりシンプルなネットワークを作ることに意味があるからです。
元のネットワークが非常に大規模なアンサンブルモデルの場合、それをシンプルなたった一つのネットワークで表現できるということには実用上大きな意味があります。
具体的には、例えば1000カテゴリ分類する複雑なネットワークの出力に対して、その出力の確率分布をソフトターゲットと呼び、そのソフトターゲットを出力するようなシンプルなネットワークを構築することでdistillationができます。
蒸留について非常にわかりやすく解説してあるサイトです。
Deep Learningにおける知識の蒸留
たとえて言うなら、教師が正解だけでなく問題の解き方までかみ砕いて教えることで、生徒は少ない学習量で効率よく問題に正解できるようになるということですね。

NNモデル圧縮の二つの手法

パラメータの多いモデルから、パラメータが少なく計算量の少ないモデルに抽出する手段。

よく使われるのがDistillation

Distillationは元の大きなモデルの出力を教師データにしてより小さいモデルを学習する手法のこと。

Pruningもよく使用される

Pruningはノードそのものや重みを削除してしまうことで全体のパラメータ数を削減する手法。

Anaconda でよく使うコマンド

Windows10でのpython環境の管理にAnacondaを利用していますが、Anaconda Navigatorが重いので大抵はコマンドラインで操作しています。
以下のサイトでよく使うコマンドがまとめられていましたのでご紹介します。
qiita.com

仮想環境の構築をするときは

conda create -n [name] python=[version][library]

仮想環境のrenameをするときには

仮想環境の名称変更 conda create -n [new name] --clone [old name]
仮想環境の削除 conda remove -n [old name] --all

とすればいいんですね。

tensorboardではまった話

最近久しぶりにtensorboarを使ったらはまったので顛末をメモ 動作環境はWindows10 + Anacondaでtensorflow1.9です。

現象

tensorboard --logdir LOG_FILE_PATH

(LOG_FILE_PATHは絶対パス)
でtensorboadは以下のメッセージが表示され問題なく動いているように見えます。

TensorBoard 1.10.0 at http://MachineName:6006 (Press CTRL+C to quit)

(MachineNameは動作させているPCの名前)   chromehttp://MachineName:6006 に接続するとなぜか接続できないです。
http://MachineName:6006の代わりにhttp://localhost:6006でもつながらないです。

解決策

起動する際に明示的にホストアドレスを以下のように指定しました。

tensorboard --logdir LOG_FILE_PATH --host=127.0.0.1

これで、http://127.0.0.1:6006 に接続すると以下のように動作しました。

f:id:wshinya:20181004112633p:plain
動作結果

ちなみに、LOG_FILE_PATHは ./hoge のように相対パスでも動きました。
ブラウザーChrome以外にもFirefoxでも問題なく動作しました。

tensorboardの詳しい解説は以下にあります
https://github.com/tensorflow/tensorboard