20200529のGitに関する記事は8件です。

GitHub 2回目以降のpush ほんとに簡単にメモ書き

ほんとに簡単にメモ書き

github
$ git init
$ git add .

ここでもしaddできなかった場合は、-uで変更したファイルをaddできる

github
$ git add -u
$ git add 指定したファイル

新規作成したリポジトリ等は直接指定してaddすればできるはず。

github
$ git commit -m ‘message’
$ git status

# On branch master
# Your branch is ahead of 'origin/master’ by 1 commit.

statusでコミットを確認できればpushでOK

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

Gitの設定:初級

対象OS

  • 研究室のUbuntu
    • terminalやATOMなどからでも使用できるが設定はterminalにて行うこと.

設定のための確認

GitLabを用いて研究室内でプログラムの共有を行う.そこで,GitLabにアクセスして設定のための以下の情報を確認しておくこと.

  • フルネーム
  • メール

GitLabへのアクセス方法

  • 研究室内UbuntuへのID, Passwordを用いる.
  • 研究室GitLabのログインページにて,LDAP Username, passwordに入力しSing inする.
  • Sing in後,右上のアイコンから「設定」をクリックする.
    • 左ペインのプロフィールを選択(されているはずだが)する.
      • フルネームとメールの内容を確認する.
        • 後のuser.nameとuser.emailの設定で使用する.

Inkedgitlab-settings_LI.jpg

各種設定

Gitの初期設定

$ git config --global user.name "[フルネーム]"
$ git config --global user.email [メール]

[フルネーム],[メール]にあたるところはGitLabで確認したフルネームとメールとする.

$ git config --global user.name "Ichiro Tanaka"
$ git config --global user.email icchi@gmail.com

GitLab使用のための設定

GitLabとssh接続でファイルをアップロードしたりダウンロードする時にパスワードなしで簡単にやり取りするための設定.

SSH公開鍵の確認

以下のコマンドで公開鍵(id_rsa.pub)が既にあるか確認する.

$ ls ~/.ssh

以下のファイルがあれば次のSSH公開鍵の作成を飛ばしてもかまわない.

  • id_rsa
    • 秘密鍵.他人に見せないように.
  • id_rsa
    • 公開鍵.他人に見せる用.

SSH公開鍵の作成

id_rsa.pubがなければ作成する.

$ ssh-keygen

途中でパスフレーズ(passphrase)を求められるが,何も入力せずエンターキーで進める.

GitLabでのSSH公開鍵の利用

id_rsa.pubの中身をGitLabの然るべきところに張り付ける.まずid_rsa.pubの中身をコピーする.
例えば以下のコマンドで表示された文字列をコピーする.

$ cat ~/.ssh/id_rsa.pub

次にGitLabにアクセスし,右上のアイコンの設定から左ペインのSSH鍵(図では赤丸で示したプロフィールから7つ下)をクリックすると,文字列を張り付けられるページになる.
「キー」のところに張り付けて,「キーを追加」ボタンを押す.

Inkedgitlab-settings_LI.jpg

確認

自分のでなくても,誰かの適当なプロジェクトをclone出来ることを確認する.

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

自分とこの環境下におけるGit & GitLabレクチャー

完全に研究室の学生教育用としてGit & GitLabレクチャーノートを作成する.
このページは全体の構成をあらわし,各所へのリンク集とする.
ソースコードをのせ行指定での説明(〇行目は~という意味,みたいな説明)をしているので"Qiitaをより便利にするChrome拡張機能をつくりました"を見ながら拡張機能を入れて行表示できるようにしておくと見やすいかも.

更新履歴

2020/6/5:基本的なところ作成.
2020/5/29:初期設定作成.
2020/5/28:このページ作成.事始め.

対象

環境

  • ユーザ使用PC
    • Gitがインストールされている研究室内のUbuntu Desktop
  • GitLab
    • 研究室内のGitLabサーバ
    • 本当のFQDN, IPを使用するとまずいので,ここでは下記の名前とする.
      • FQDN:
        • gitlab.mylab.ac.jp
      • IP address:
        • 192.168.7.1

知っといてほしい知識

  • Git - Book
    • とりあえず.基本.一読しておくように.情報いっぱいなので覚えなくてもよく,必要に応じて調べられるようにしておけば十分.

Contents

紹介

  • Gitって?
    • プログラムなどをバージョン管理するもの.
    • 自分のPCにて管理.
  • GitLabって?
    • gitで管理するものをクラウドで管理してくれるサーバ.
    • 研究室においてあるサーバ上でファイルを管理.
    • 自分一人で管理するだけでなく他の人のファイルも扱え,みんなで管理できるようにしたもの.
      • もちろん権限を色々設定可.

設定

とりあえず見るべきは初級のみ.それ以外は慣れて時間があれば.

レクチャー

それぞれの項目に対して以下を目標に作成.

  • 読むのに5分以内
  • やるのに15分以内
  • 入り組んだ話は後に.
    • ただ,すぐに読めるようにリンクで対処

とりあえず見るべきは初級のみ.それ以外は慣れて時間があれば.

初級

中級

応用

まとめた一般的な情報

future work

  • 設定中級.sshやgit config.改行コードの話など.
  • subdirectory化.
  • チートシート準備?
  • 前のバージョンにタグで戻す方法.
  • git worktreeコマンドの紹介.
  • グループプロジェクト内でのマージリクエストの流れ.

参考

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

【Windows10】「ゼロから作るDeep Learning」環境構築

はじめに

この資料は、「ゼロから作るDeep Learning」(1)~(3)の各書籍のコードを動かすために必要な準備を記載したものです。
基本的にプログラム書いたことのない方か、経験が浅い方向けです。
Windows上では開発しないという方にも役立つかもしれません。

「gitとかvscodeとかそんなもの当たり前に入ってるよ!」
という方にはこの資料は不要なのでご注意ください。

Pythonのインストール

公式サイトからインストーラをダウンロードする。
https://www.python.org/

ページ上部の'Donwloads'をポイントし、'Download for Windows'の下に表示されるリンクをクリックするとダウンロードできる。

インストール時にパスを通しておくことを忘れずに。
具体的には、インストールウィザードの最初の画面で、「Add Python 3.X to PATH」にチェックを入れる。

これを怠るとpipコマンドが使えない。
また、Windowsストアにある未インストールのPythonと誤認してコマンドを受け付けてくれなくなるなどの不具合が出る場合がある(経験談)。

gitのインストール

サンプルコードがgithubにあるのでダウンロードはgit cloneで行うことにする。
そのための準備として、gitのインストールが必要となる。

gitのインストールは公式サイトへ。
https://git-scm.com/

ページ右側にある'Download x.xx.xx for Windows'のリンクをクリックするとインストーラがダウンロードできる。

Pythonモジュール類のインストール

本書のプログラムの実行に必要なライブラリ類をインストールしておく。
必要なライブラリは巻によって異なるが、まず1巻のみを読み進めるならばnumpyとmatplotlabの2つのみインストールしておけば問題ない。
それ以外のライブラリ類は2巻・3巻のコードを実行するために必要となるものである。

スタートメニューからgit bashを起動する。
(コマンドプロンプトでも可能)
git_bash.png

まず、pip自体をアップデートしておく。
pipは頻繁にアップデートされるので、既にpythonをインストールしている方でもアップデートすることをおすすめする。

bash
$ pip install --upgrade pip

numpy [1~3巻]

その後、numpyをインストール。
numpyはPythonの数値計算ライブラリである。

bash
$ pip install numpy

matplotlib [1~3巻]

続いて、matplotlibをインストール。
matplotlibは機械学習本体の動作には関わらないが、機械学習の進み具合や性能をグラフで表示して評価するために用いる。

bash
$ pip install matplotlib

sklearn [2巻]

2巻では、上記2つに加えてsklearnが必要になる。
(なくてもコードの実行は可能だが、学習にかかる時間が非常に長くなるためインストールした方がいい)
1巻では必要ない。

bash
$ pip install sklearn

CuPy [2巻・3巻]

2巻・3巻のオプションで、1巻では必要ない。
オプションなのでインストールしなくても構わない(なくても現実的な計算時間で収まる)。
ただし、プログラムを改造するなどして複雑化しようとする場合は導入した方がよい。

CuPyはNVIDIAのGPUを搭載したPCでしか使用できない。

インストール方法は下記の別記事を参照。
https://qiita.com/BARANCE_TW/items/30abf85c55070a2bdc9d

Pillow [3巻]

Pillowは画像処理用のライブラリである。
色空間を変更したり、2値化したりと画像を加工する機能を持つ。

bash
$ pip install pillow

Graphviz [3巻]

graphvizはグラフ描画用のツールである。
ここで言うグラフは、matplotlibで描く一般的なグラフではなく、グラフ理論で用いられるエッジとノードからなるグラフのことを指す。

インストール方法は下記の別記事を参照。
https://qiita.com/BARANCE_TW/items/c3f7816d38cc9e746bbd

サンプルコードのclone

cloneの前に、適当な作業用のディレクトリ(フォルダ)を作成しておく。
以下では、Cドライブ直下に"ai"というディレクトリを作成した場合を想定。
(つまり、C:\aiがワークスペースディレクトリになる)

次にリポジトリURLをブラウザで開き、右側にある緑のボタンを押して表示されるclone用のURLをコピーする。
repo.png

各巻のリポジトリは下記。

clone URLをコピーしたら、git bashを開き、下記の{clone URL}のところにコピーしたclone用URLを貼り付けて実行する。
少しすると、サンプルコードが該当ディレクトリにcloneされる。

bash
$ cd /c/ai
$ git clone {clone URL}

vscodeのインストール

1巻の序盤までは対話式コンソールでも十分なコード量だが、中盤以降は爆発的にコード量とファイル数が増えるので、何かしらの環境を利用することをおすすめする。
ここではvscodeをインストールするが、好きなIDEやエディタがあるのであればそれでも構わないと思う。

vscodeは下記からダウンロードする。

ワークスペースを開く

vscodeを起動したら、まずはさきほどcloneしたディレクトリをワークスペースとしてopenする。
「ファイル」メニューをクリックし、「フォルダーを開く」を選択する。
(「ワークスペースを開く」ではないので注意)
workspace1.png

その後、cloneしたディレクトリまで移動して「フォルダーの選択」をクリックすると、ワークスペースが開く。
左側の「エクスプローラー」にcloneしたファイルの一覧が表示されていることを確認する。

launch.jsonの編集

vscodeでは「Ctrl」+「F5」でコードの実行ができる(または「F5」でデバッグ実行)。
しかし、その際の実行ディレクトリは、デフォルトではワークスペースのルートディレクトリになってしまう。
この状態のままだと、次のような問題が発生する。

  • コードが記載されたファイルの場所を起点として記述したfrom・importが想定通りに働かなくなる。
  • pickleなどでファイルをread/writeする際のディレクトリが、ワークスペースのルートディレクトリになってしまう。

この問題を解決するために、launch.jsonを編集してファイルのあるディレクトリを実行ディレクトリにする。
まず、左側のアイコンが並んだ場所から「実行」タブを選択し、「launch.jsonファイルを作成します」を選択する。
launch1.png

次に、「Select a debug configuration」という表示が現れるので、「Python File」をクリック。
launch2.png

すると、launch.jsonの編集画面が表示される。
このファイルは、ワークスペースのルートディレクトリ直下にある「.vscode」ディレクトリの中に格納される。
launch3.png

このファイルの「configurations」の値に"cwd": "${fileDirname}"という表記を付け加える。
付け加えた後のファイルは下記のようになる。

launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal", // カンマを末尾に追加
            "cwd": "${fileDirname}" // ここに追加!!
        }
    ]
}

これで、「Ctrl」+「F5」で実行時にファイルのあるパスに移ってからプログラムが実行されるようになった。

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

GitのPackfileの容量が増えすぎて、パソコンが身動き取れなくなった日

はじめに

先日、パソコンの容量が埋まってしまい作業ができる状態ではなくなった。不要なファイルやアプリをとことん消したが解決には至らなかった為、より探ってみた。


No space left on device

コマンドも打てない...

原因

  • 大量のバイナリファイルを抱えていたので、.git/oblects/pack/が肥大化していた。


Packfileとは

  • そもそもgitではgit initをしたとき、objectsファイル内にpackファイルが作られる。そしてcommitをした際に新しいobjectファイルとして.git/oblects/pack/に圧縮するらしい。

パソコンの容量を空けた手順

  • 容量を確認。
du -sh .git/objects
  • 何がパックされているか、ファイルの中身を見ることができる。
git verify-pack -v .git/objects/pack/パックファイル
  • .git/objects/pack/tmp_pack_オブジェクトIDのファイルを削除。

  • 今回はとりあえず、リモートはそのままにローカルの容量を空けたいだけなので、commit履歴自体は消さず、歴史の改変も行わない。

終わりに

  • 200GBも開けることができた。
  • 不要なファイルとしてコミット履歴やリモートからも消したいのであれば、下の参考などを元に進める必要がある。
  • pushする際にgit gcコマンドで、何がパックされているか確認することもできる。
  • バイナリをgitで管理するのはあまり得策ではないように思う...

参考

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

git submodule --init --recursive で特定の submodule を無視する

背景

  • project が submodule している repo が, さらに submodule で馬鹿でかい git repo を登録している
  • project 自体では, その submodule が submodule している repo は使っていない(ビルドでは利用されない)ので無視したい

IREE

https://github.com/google/iree

でやってみます.

問題なのは, IREE が submodule 登録している swiftshader が submodule で追加している PowerVR_Examples です. 普通に clone すると 2 GB くらいあります(--depth 1 でも 700 MB くらい)

方法

https://stackoverflow.com/questions/52179463/how-to-exclude-a-specific-git-submodule-from-update

ありがとうございます.

-c submodule."REPO".update=none を追加でいけました.

ただ,

# NG
$ git -c submodule."third_party/swiftshader/third_party/PowerVR_Examples".update=none submodule update --init --recursive 

とすれば行けそうですが, 親プロジェクトからのパス指定はできないようでした.

# OK
$ git -c submodule."third_party/PowerVR_Examples".update=none submodule update --init --recursive 

のようにします.

third_party/PowerVR_Examples を無視するのを, それぞれの submodule repo で実行する感じになっています.

懸念点

git -c で設定を追加すると, submodule 処理が直列化するっぽい?ようです
(通常は submodules は並列に git clone される)

TODO

  • 同名の submodule repo path が, 複数の submodule repo にあるとうまく行かない(すべて無視されてしまう)ので, 特定の submodule ごとに設定できるようにする(うまく grep 的なのが使えればよいが... shell script を書くことになるかな?)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Git】syntax error near unexpected token ('  解決方法メモ

syntax error near unexpected token ('  

解決法①
(が入っている事で構文エラーになっている模様(空白や記号) 
* ファイル名の(の前までコピー
* ファイル名の最後に*をつけて再度コマンドをtry

解決策②
ファイル名を""ダブルクォーテーションで囲って文字列として扱えばいいらしい
※試してない←

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

gitのpre-commitでterraform書式チェックを自動化する

はじめに

terraformでインフラ運用している中で、credentials情報をローカルに持てない等のセキュリティポリシーが理由でローカル(コーディング環境)からterraform実行できないケースがあると思います。

そんなとき、書式ミスや変数参照ミスなどをterraform実行環境にデプロイしてみないとわからないのは、非効率ですよね。仮にデプロイをパイプライン等で自動化していても、パイプライン実行の待ち時間が無駄ですし、タイポなどのしょうもないミスでcommit履歴が汚れるのは微妙です。。

そこで、gitのpre-commit機能を利用してcommit前にterraform fmt/init/validateを自動実行するようにしてみました。これによりコマンドが成功した場合のみcommitされ、失敗した場合は、commitされずにエラー内容が出力されます。

うまく動かない等があれば、コメントいただければと思います。

実行例

成功例

$ git commit -m "test"
Directory: terraform/ terraform fmt: Passed
Directory: terraform/ terraform init: Passed
Directory: terraform/ terraform validate: Passed
Directory: terraform/environment/iam/ terraform fmt: Passed
Directory: terraform/environment/iam/ terraform init: Passed
Directory: terraform/environment/iam/ terraform validate: Passed
Directory: terraform/environment/lambda/ terraform fmt: Passed
Directory: terraform/environment/lambda/ terraform init: Passed
Directory: terraform/environment/lambda/ terraform validate: Passed
[master 9b47d9e] test
 8 files changed, 77 insertions(+), 14 deletions(-)
 create mode 100644 terraform/environment/iam/dev.tfvars
 create mode 100644 terraform/environment/iam/prd.tfvars
 create mode 100644 terraform/environment/iam/variables.tf
 create mode 100644 terraform/environment/lambda/variables.tf

失敗例

$ git commit -m "test"
Directory: terraform/ terraform fmt: Passed
Directory: terraform/ terraform init: Passed
Directory: terraform/ terraform validate: Passed
Directory: terraform/environment/iam/ terraform fmt: Passed
Directory: terraform/environment/iam/ terraform init: Passed
Directory: terraform/environment/iam/ terraform validate: Passed
Directory: terraform/environment/lambda/ terraform fmt: Passed
Directory: terraform/environment/lambda/ terraform init: Passed

Error: Missing required argument

  on main.tf line 16, in module "get_lambda":
  16: module "get_lambda" {

The argument "memory_size" is required, but no definition was found.


Error: Unsupported argument

  on main.tf line 23, in module "get_lambda":
  23:   memory_sze            = 256

An argument named "memory_sze" is not expected here. Did you mean
"memory_size"?

Directory: terraform/environment/lambda/ terraform validate: Failed

実行環境

  • WSL (Ubuntu 18.04)
  • git version 2.17.1
  • Terraform v0.12.19

準備から実行まで

準備1. terraformインストール

使用しているversionに合わせたterraformをこちらからインストールします。
(すでにインストール済みの場合は不要)

準備2. .gitignore.terraform/を追加

ローカルでterraform initするので、.terraform/配下にpluginやmoduleがインストールされます。
これらはgit管理する必要がないので.gitignoreファイルに以下を追加します。
(すでに記載済みの場合は不要)

.gitignore
.terraform/

準備3. pre-commitファイルを配置

.git/hookspre-commitというファイル名で以下の内容を配置する

.git/hooks/pre-commit
#!/bin/bash -u

work_dir=`pwd`

# 戻り値チェック
check_return_code() {
    cmd_name="$1"
    dir_name="$2"
    rc=$3
    if [ ${rc} -eq 0 ];then
        echo "Directory: ${dir_name} terraform ${cmd_name}: Passed"
    else
        echo "Directory: ${dir_name} terraform ${cmd_name}: Failed"
        exit 1
    fi
}

# terraform実行ディレクトリを抽出する.
# .tfファイルを含むディレクトリ名を変数target_dirに格納. .tfstate及びmoduleは除外.
target_file=$(git diff --cached --name-only --diff-filter=AMRC | grep -E ".tf$|.tfvars$")
if [ -n "${target_file}" ]; then
    target_dir=$(echo ${target_file} | xargs dirname | sort -u)
else
    echo "No change in TF file."
    exit 0
fi

# terraform init/validate
for dir in ${target_dir}
do
    cd ${work_dir}/${dir} || exit 1

    # terraform fmt
    fmt_file=$(terraform fmt)
    check_return_code fmt ${dir} $?

    # fmtにより変更されたファイルをstageする.
    if [ -n "${fmt_file}" ];then
        cd ${work_dir}
        for file in ${fmt_file}
        do
            git add ${dir}/${file}
        done
        cd ${dir}
    fi

    # terraform init
    terraform init -backend=false 1>/dev/null
    check_return_code init ${dir} $?

    # terraform validate
    terraform validate 1>/dev/null
    check_return_code validate ${dir} $?

    #exit 1
done

実行

上記実施後にcommitすると、実行例のようにterraform fmt/init/validateが変更対象のディレクトリごとに実行されます。

注意点

tf version 0.11以前でtfvarsファイルを使用している場合、terraform validateでエラーになります。
その場合、-var-fileオプションでtfvarsを明示的に指定する必要があります。

参考

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