俺がgithubを使うにあたってgitを理解しようとした話2
追記:
bleisさんによると「HEADはなんらかの参照を指すもので、コミットそのもを指すものではない」との指摘をいただきました。
図ではコミットを指していますが正しくはコミットのポインタを指します。
ただし、図の修正がめんどい*1のでご了承ください。
追記その2:
すばらしい図解をされているサイトを発見したので掲載させていただきます。コミットとコミットのポインタとHEADの位置などが参考になるだけでなく、各コマンドについてを図でひじょうにわかりやすく説明してくれています。
図解 Git
git話2回目。
hgを使っていた経験からpullやpushなど基本の意味はわかる。
しかしgitを使っていると概念の違いや謎のワードがたくさん出てくる。
今日はそれについても書き留めとく。
gitのポインタ
gitはコミットのポインタとして親コミットを指している。
よって図のように、各コミットの表す矢印はコミットの時系列と逆向きになる。*2
図はA→B→Cと変更していき、途中のBからbranchを作った状態。
HEADって何
今、手元のファイルがどこのコミットにいるのかを示す。
例えば上図だとCのポイントが現在のgitの状態。
もちろんそこから変更点があれば`git status`や`git diff`で確認できる。
HEAD^とかHEAD~って何者
HEADからコミットのポインタをいくつか辿った状態。
HEADはHEADポインタが指すそのもの。
HEAD^やHEAD~はHEADからポインタを1個辿ったもの。
HEAD^^は2個辿ったもの。。。。以下続く。
例えば上図の状態で`git checkout HEAD^`を行うと下図のような状態にHEADが移動し、ファイルを古い状態に戻すことができる。
masterって何
branchの1つでメインブランチに付けられる名前。
ブランチ名なのでcheckoutやpush・pullなどで指定ができる。
たとえばmasterブランチだけをとあるGithubレポジトリにpushしたければ、以下のようなコマンドになる。
$ git push git@github.com:hoge/fuga.git master
branchって何
枝分かれ。
途中で違った変更を行いたいときに支流として存在する変更点。
`git branch
`git branch`で現存のブランチの一覧を確認できる。
`git branch -d
もちろん、`git chekcout
例えば`git checkout branch_name`をすると、下図のようにHEADが移動する。
まとめ
- git checkout
で特定のブランチへ - git branch
- ブランチの一覧表示
でブランチの作成 - -d
でブランチの削除
- HEADは現在の状態を指すポインタ
- この程度のことすらわからないgit力に絶望した!!
俺がgithubを使うにあたってgitを理解しようとした話1
最近githubを使う機会が多いです。
まったくコードを書かなかった俺にとっては天から矢がふるレベルの珍しさ。
そこでこのシリーズでは、gitやGithubを使うにあたってのtipsをメモしていこうと思います。
問題点:pushしたcommitとGithubアカウントが関連付けされない
画像のようにGithub上でGithubアカウントの画像が表示されればOKです。
最初はなぜかこの関連付けがされずに、commit時の名前の名無し画像が出るだけでした。
解決法
Githubはアカウントとの関連付けを、Githubアカウント登録メールアドレスとcommitメールアドレスで行っているようです。
この2つを同じメールアドレスに設定しましょう。
.gitconfigへの設定
下記コマンドを叩くか、~/.gitconfigを編集し[user]を追記します。
この方法では全gitコマンドへ影響します。
レポジトリごとに設定を変えたい場合は--globalオプションを外したり。
$ git config --global user.email hoge@gmail.com
[user] email = hoge@gmail.com
Thanks
- @mzp
- @bleis
*1:何度もProfileのPublic Email Addressを編集してはまっていたバカがこちらの日記の主になります
金沢旅行に行ってきました
@athos0220が写真を撮りにどこか行きたいと言い出したので、@athos0220、@mzp、@momocusと金沢旅行に行ってきました。
2泊3日の楽しい旅行でした。
1日目
レンタカーを借りて近江町市場
よんたの1年ぶり運転で移動。
駐車やら怪しくて他メンバーがヒヤヒヤしてました。
市場ではコロッケや海鮮丼を食べました。
夜のおつまみも購入。
予想以上に外人が多くて驚きました。
金沢も観光スポット化してるのかー。
- mzpは電源のあるカフェに行きましょうと言ってたけど、却下しました。
2日目
3日目
まとめ
- 石川県の海の幸はうますぎる
- 金沢周辺、運転は荒い人多かったけど車の絶対数が少なくて運転しやすい
- 久しぶりに運転したけど事故なく旅行を終えれてよかった
- mzpの進捗よかったそうです
Xubuntu 64bitにおけるSML# 2.0.0のビルド
SML#2.0.0がリリースされました.
せっかくなのでパッケージではなくソースからビルド.*1
というわけでクリーンなXubuntu 12.04LTSでSML#をビルドしたときの経験まとめです.*2
32bit環境の整備
C/C++の32bitライブラリを用意しておきます.
GMP,LLVM,SML#のビルドに必要.
たぶんこれで依存するg++も入ってくれる.
# aptitude install gcc-multilib g++-multilib
GMPライブラリのビルド
通常のGMPライブラリパッケージ(libgmp-dev)は64bitビルドされているので,SML#用に32bitでビルドする.*3
configureを走らせるときにABI=32オプションをつけて,32bitビルドを指定.
$ wget https://gmplib.org/download/gmp/gmp-6.0.0a.tar.lz $ lzip -d gmp-6.0.0a.tar.lz $ tar xf gmp-6.0.0a.tar $ cd gmp-6.0.0a # mkdir /opt/gmp32-6.0.0 # ./configure ABI=32 --prefix=/opt/gmp-6.0.0 $ make && make check # make install
追記:runtimeでロードできるようにldconfのパスに加えて、リロードする。
# echo '/opt/gmp32-6.0.0/lib' > /etc/ld.so.conf.d/gmp32.conf # ldconf
LLVMのビルド
配布されているUbuntu系用のLLVMバイナリは64bitビルドです.*4
なので自力で32bitビルド.
また,SML#は現時点での最新版であるLLVM3.4 32bitを必要としますので,多くのディストリビューションで自力ビルドが必要かと思います.
$ wgetやら解凍やら省略 # mkdir /opt/llvm32-3.4 $ ./configure CC='gcc -m32' CXX='g++ -m32' \ --build=i686-pc-linux-gnu \ --prefix=/opt/llvm32-3.4 $ make # make install
必要なライブラリ郡その他
なんか知らないけど./configure中に怒られたので,libzやlibinfoをいれる.
INSTALLとかの説明には書いてないけど必要なら仕方ない.
# aptitude install libz-dev # aptitude install libinfo-dev
SML#のビルド
ここまでくればSML#をビルドするだけ!
fast-buildオプションが行方不明なのでコーヒーでも飲みながらまったり待ちましょう.
必要なオプションは32bit・GMP・LLVMの指定です.インストール先のprefixはお好みで.
オプション長すぎぱない.
$ wgetやら解凍やら省略 # mkdir /opt/smlsharp-2.0.0 $ ./configure CC='gcc -m32' CXX='g++ -m32' \ LD='ld -m elf_i386' \ LDFLAGS='-L/opt/gmp32-6.0.0/lib' \ CPPFLAGS='-I/opt/gmp32-6.0.0/include' \ --with-llvm=/opt/llvm32-3.4 \ --prefix=/opt/smlsharp-2.0.0 $ make # make install
まとめ
- 必要が無い限りSML#はビルドパッケージを使うと楽
- SML#をビルドするなら32bitOSが楽
- やれるものならやってみろ
Functional花見2014に参加してきまし
これに,前日の場所取りからお花見まで参加してきました.
なやばし夜市
なやばし夜市という日本酒祭りがあったのでとりあえず行ってみる.
すでに日本酒で酔っ払う.
夜の部
開始
桜の下は半分くらいしか埋まっておらず,無事にブルーシートを広げる.
夕方から花見してたグループと,泊まって場所取りするグループが半々くらいでした.
早速コンビニ買い出しとピザ注文を実行
ピザハットは22:30注文で23:00受け取りができました.
プロのラブライバーの方はラブライブコラボの箱が切れてても注文するし,ガチャで数秒1万円を溶かすし,すごいと思いました.
夜更け
寝袋で就寝.
寝転がって見る夜桜が綺麗でした.
銀シートがあれば外でも暖かいし背中もいたくなかったです.
首が痛くなり枕を持ってくればよかったと後悔.
あと隣の大学生グループの人狼が一晩中うるさくて,寝るのに邪魔でした.
そうでなくとも酔っぱらいばかりなのでうるさいです.
耳栓があったほうが良かったなと後悔.
夜明け
朝日が綺麗だったみたいですが寝てて見逃しました.
皆は朝ごはんはコンビニでカップ麺やおでんを食べてました.
ssh越しのLinuxサーバー上でテラリアをscreenで動かし続ける話
背景
テラリアにはまっています.
休職してテラリアにはまるとは,アホな話です.
というわけで友人とテラリアを共に遊ぶために,Linuxサーバー上でテラリアを動かすことを思いついたわけです.
Linuxで動かす場合,monoを使ってTShock(非公式テラリアサーバー)を動かす選択肢があります.
特にver1.2系となると他非公式サーバーは対応してない現状.
そこでテラリアサーバーを動かすときのお話です.
自分が知ってる手法の問題点
さて手持ちのサーバーは共有で借りてる某VPS上のDebian.
この上でテラリアを動かす場合,自分が知っている手法では問題がありました.
知ってる手法の問題点
- ターミナル起動(&やC-z・bgコマンド)
- 手元にサーバーがあるならターミナルを起動させっぱなしにすれば良い.けどリモート上のサーバだとsshしたターミナルを起動しっぱなしにしなければならず,サーバーだけでなくクライアント側までも起動しっぱなしにしなければならず鯖を立ててるのに元もこうもない.
- ターミナルから切り離して起動する(標準入出力・エラー出力を/dev/null等にする)
- 例えば逆引きシェルスクリプト/端末から起動したプロセスを切り離す方法 - Linuxと過ごすみたいなことをする.でもテラリアサーバでこれをすると,ターミナルを終了と同時にテラリアが停止する.悲しい.
screenを使った解決法
そこでscreenを使う!!
今までのscreenのイメージというと,「複数ターミナルを操れる,それローカルターミナルやEmacsでもできるよね」というイメージ.
でもその本質はまったく違っていて,すんごく便利だった.
デタッチ・アタッチの概念
screenのすごいところは複数シェルを起動しつつそれらが独立に動くところ.
つまりscreenで仮想起動したシェルはユーザログアウトしたあとも実行され続ける.
よってサーバー上で長時間計算・ゲーム等サーバーのプロセスを行うのに便利.
ちなみにそのときにscreenを離れてプロセスを実行し続けるのをデタッチ,離れたscreenを再度フロントに持ってくることをアタッチというようです.
- 新しいスクリーンの起動
$ screen
- screenのデタッチ(起動中のscreenを継続したままバックグラウンドにスタックする)
- (プロセス中で)C-a C-d
- デタッチしたscreenをアタッチする(デタッチscreenを再度フロントに持ってくる)
$ screen -r [screen id]
※C-aはEmacs等と干渉するため,設定で入れ替えることができます.
テラリアでの例
$ screen $ mono TerarriaServer.exe ... C-a C-d $ exit # ログアウトしてもテラリアは起動し続ける
今後の課題
TShockの動作が重いので,サーバの動作を軽くする設定やらサーバの設定をしなければ…
FirefoxにS3.Download Statusbarをいれた
Download StatusbarがFirefox26になって非対応になった.
ダウンロードの状態を下部バーにて一目でわかるのがすごく便利だっただけに,代替手段が必要に.
Download Statusbar – Firefox 向けアドオン
Download Status Bar
試してみるも,色合いや表示情報や考えている表示の仕方がだいぶ違う.
どうにも納得いかない.
S3.Download Statusbar
もともと使っていたDowload Statusbarを模倣したアドオン.
これだっ!!
Download Manager (S3) – Firefox 向けアドオン
ということでS3バージョンに落ち着きました.
Download Statusbarが使えなくなって困ってる人にお勧め.