膨らみすぎて手が付けられないコードの管理方針を考えてみた

皆様,こんにちは.
もう今年の残りが一年の24分の1程度しかないことに先ほど気づいたところであります.


年末と言えば,大掃除.
私は片付けが苦手すぎて服とか本とか捨てられずに困っているのですが,パソコンの中も同じです.
3年近く同じ環境で引き継ぎもなくコードを書き溜めていたので,収拾がつかなくなってきました.


これはまずい.
いろいろ苦労しながら書いたコードも,どこにあるか探せなくなってしまっては宝の持ち腐れです.


というわけでこれからコードをまともに管理できるようにするために,
現状分析と指針を箇条書きでまとめてみました.
「もっといい方法があるのに」とか「こういう管理方法があるよ」とか,
「それはないわーww」でもいいので突っ込みお待ちしております.


======

何の為にコード管理をするのか?

  • 効率の良い開発のため
    • 新規の処理の追加
    • バグ取り
  • 効率の良い引き継ぎのため
    • 機能単位の把握
    • 必要なファイルだけ着目できる(不要な/非本質的なコードの除外/不可視化)
  • 効率の良いバックアップのため
    • 変更履歴の追跡
    • 漏れのないバックアップ

現状はどうしているのか?

どのような問題があるのか?

  • 古いコードが多すぎて,どれが使えるのかよくわからない
  • Gitの管理単位が大きすぎて(Codeディレクトリすべて)変更を追いにくい
  • ファイル名は確実にユニークだが機能ベースでの検索に向いていない

解決方策

  1. プロジェクト単位でディレクトリを分ける
    • プロジェクトの中だけパスを通せばいいようにする
      • 逆に他のプロジェクトと相互依存しないようにする
      • 関係のないプロジェクトはパスから外す
      • 違うプロジェクトと同じ名前の関数があってもぶつからなくなる
      • 同じ機能の改良版なども比較的容易に作れるし扱える
    • 何をしているのかわかりやすい
      • ドキュメントもプロジェクト単位で作成すればよい
  2. Gitをもっと使いこなす
    • 卒論サーバーにでもリポジトリを作る
      • 本体が壊れても大丈夫
    • プロジェクト単位でGitのリポジトリを作成
      • 同名ファイルの重複が避けられる
  3. ファイル名のルールを変更する
    • 機能だけちゃんとあらわしている名前を付ける
      • ファイル名の一意性が必要ない
    • プリフィクスなどもつけない(関数に"f"など)
      • 基本的に関数ベースにする
  4. 開発方針の変更
    • 機能単位の分割(カプセル化)
      • 本文の長いコードは読みにくい
      • できるだけこまめに分割し,コメントだけでなく名前で機能を語らせる
      • 基本的に関数ベースにする,テスト以外はスクリプトを使わない

初めての結婚式披露宴のご招待に,右往左往しながら準備をした備忘録

お久しぶりです.
ずいぶん間が空いた上に技術のネタですらない個人的な話で恐縮です.


今回初めて結婚式の披露宴にご招待いただきました,
サークルで非常にかわいがっていただいた先輩方なのでうれしい限りですが,
今までは結婚式は呼ばれても2次会から,とりあえずスーツで行けばOK,という感じだったので
どんな格好で行けばいいのか何を持って行けばいいのかよくわかりませんでした.
そもそも招待状には会費とか載ってないんですよね(ご祝儀を持って行くから)
それでいろいろ調べていたので思い出しながらまとめてみることにします.


1.Google先生に「結婚式 披露宴 服装」について教えを請う
都合のいいことに,服装だけでなくマナーについて一通りまとめてくださっているサイトを見つけました.

結婚式のマナー/結婚式の招待状・ご祝儀・服装 http://www.happy2-marriage.com/

これを一通り読んでみたら,結構わかってないことが多いことがわかりました.

2.服装
まずスーツ屋に行って披露宴でつけられるようなネクタイを探しています,と聞いてみました.
灰色というかシルバーのネクタイをお勧めされて,ついでにポケットチーフも買いました.
白いネクタイというのはご親族の方とかが多いのですね.

3.ご祝儀
中身は新札なので銀行で両替をしました.
銀行の方に聞いたら,両替機に新札が入ってるんですね.

ご祝儀袋も用意したのですが,短冊が3枚入っていて,使い方に困りました.
Google先生に「ご祝儀袋 短冊」とか聞いても一枚だけ挟むとか白紙の短冊と合わせて二枚で挟むとか諸説あるようです.

祝儀袋の短冊の使い方 | OKWave http://okwave.jp/qa/q5488596.html

むー.

あと,筆ペンで自分の名前と住所と金額を書かないといけないのが意外としんどいですね.
普段パソコンばかりでボールペンすらろくに持たないもので...

あとは,ご祝儀袋を入れる「袱紗(ふくさ)」というのも買いました.


あとは当日遅刻なんかしないように頑張って起きるくらいでしょうか.

Git Immersion (Git漬け)を訳しながら使い方を覚えてみる.その6

久々にGitをいじってみています,
何やってたか忘れるなー(汗)


LAB 11 エイリアス(別名)

目標:gitコマンドのエイリアス(別名)とショートカットの設定法を学ぶ


git status, git add, git commit, あとgit checkout は略語があったら便利なコマンド.
ホームディレクトリにある.gitconfig というファイルの中に次の内容を書き加えよう.

[alias]
co = checkout
ci = commit
st = status
br = branch
hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short
type = cat-file -t
dump = cat-file -p

これでcheckout,commit,statusはカバーできた.
あと前回のlogもカバーしよう.
これでgit checkout と打ちたくなったところでどこでもgit co と打てるようになる.
同様にgit statusの代わりにgit stを,git commitの代わりにgit ciを使える.
何より良いのはgit histを使うことで,長いlogコマンドを打たなくても良くなることだ.

MacBookAirのバッテリー容量を黙々と記録するスクリプトを作った

バッテリーがどういう減り方してるのかが気になるわけですよ.
重い処理させずにディスプレイの輝度も低めにしとけば結構持つのはわかったんだけど.


と,いうわけでバッテリーの状態を黙々とcsvファイルに記録するためのRubyスクリプトを書いた.
参考にしたのはこちら.

mac bookのバッテリー状態をはてなグラフに記録してみよう - mac 日記
http://d.hatena.ne.jp/yao3/20091207/1260204647

#!/usr/bin/ruby
class BatteryLog

  def run
    logging
  end

  def logging
    info = get_status
    _logging(Time.new,info)
  end

  def _logging(time, info)
    begin
##### ログを保存するディレクトリをフルパスで.
      Dir::chdir("/Users/tokyoster/Documents/ruby/BatteryLogs")
    rescue
      Dir::mkdir("/Users/tokyoster/Documents/ruby/BatteryLogs")
      Dir::chDir
    end

##### Capacity,Current,Cycle Count
    log_str = time.strftime("%y/%m/%d %H:%M") + "," + info["Capacity"].to_s + "," + info["Current"].to_s + "," + info["Cycle Count"].to_s
    log_file_name = "BatteryLog" + time.strftime("%y%m%d") + ".csv"
    
    log_file = File.open(log_file_name,"a+")
    log_file.puts(log_str)
    log_file.close
  end

  def get_status
    info = eval(`/usr/sbin/ioreg -w0 -n "AppleSmartBattery" | grep LegacyBatteryInfo`.gsub(/=/, '=>').gsub(/^.*\{/, '{'))
    return info
  end
end
  
BatteryLog.new.run

こいつをCronに登録するときには

crontab -e

* * * * * ruby /Users/tokyoster/Documents/ruby/battery_log.rb

てな感じですね.
これで一分ごとにバッテリー容量とバッテリー残量とサイクルカウント(何回充電サイクルが繰り返されたか)が記録されるようになりました.
あとはこれを黙々とグラフ化して表示してくれるガジェットみたいのがあったらいいですよねー,

MacBookAirを買ってとりあえず入れてみたソフトウェアのリストを晒してみる

メモがてら列挙してみる.


Chrome:まずはブラウザ
KasperskyAntiVirus:学校のライセンスで使えるので.
MacPorts:Terminalで使えるソフトウェアの管理
RVM,Ruby,Rails:Webアプリ開発環境の整備
DropBox:データ共有環境を作る
XcodeObjective-Cとかやってみたい
TeXShopTeXで論文を書く環境が欲しい(※設定中)
TexWorks:同じく(※設定中)
ComicViewer:画像用のビューアらしい.自炊始めたら使えそう
LateXiT:Keynoteで数式を扱うために
TotalTerminal:Terminalをホットキーで呼び出す
EverNote:Webとかで集めた資料を束ねておくのに便利.
Alfred:option+spaceで検索窓を出せるランチャー.
mi:テキストエディタ
Echofon Lite:Twitterクライアント
KeynoteMacでプレゼンテーションと言えば.
Skype禁断のアプリ
TeamViewer:リモートで他のパソコンを操作できる
Wifi Analyzer:Wifi通信状況のチェック
EclipseJavaとかの開発環境.


Keynote入れたからにはPagesとNumbersも入れるべきでしょうかね?
あと家計簿のソフトが欲しい.

MacBookAirを買ってWindowsServer2008R2とBootCampするまでの備忘録

Macの割に冒険しすぎたような気がしないでもない.←


なんでWindows7でなくServer2008R2なのかというと,学生だったらMicrosoftDreamSparkで無料で使えるからです.
(他にもVisualStudioとかがただで使えるので超おススメ)
ただ,まあだいたい同じだろうと思ってたら意外と勝手が違って,ハマりまくったのでメモします.


1.MacからBootCampでインストールする
Dreamsparkからダウンロードすると".img"の形式になってるので,".iso"に書き換える.
あとは指示通り.


2.Windowsのインストール
指示通りにやってく.
後々外付けストレージをつける予定だったので,パーティションWindowsを少なめにしてみた.
デスクトップが表示されるまでとりあえず普通.


3.ドライバ関連のインストール
ここが第一関門.
ドライバをインストールしないうちに自分でシャットダウンor再起動してしまうと,
「あれ,MacってCtrl+Alt+Delなくね?」
Mac版のcontrol+option+fn+deleteも効かない??」
となって詰みます.というか,詰みました.
MacのDel=WinのBSにキーバインドが当たってるみたいなので,fn+delete=Delが効かないんでしょうね,多分.
やっちゃった人は外付けのキーボードをつないで,BSの位置じゃないDelを使えばOKです.

と,いうわけでドライバのインストールをします.
BootCampでWindowsを入れたUSBメモリ内のWindowsSupportフォルダの中にSetup.exeがあるので起動・・・

できない?

サイドバイサイド構成が云々と言われて起動できませんでしたorz
仕方がないので手動でドライバを入れましょう.
なお,あとからまとめて入れられるっぽいので,
キーボード:WindowsSupport\Drivers\Apple\x64\AppleKeyboardInstaller64.exe
無線ネット(多分):WindowsSupport\Drivers\Broadcom\BroadcomNetworkAdapterWin7_64.exe
あたり入れとけばいいんじゃないでしょうか.


4.無線を有効化する
第二関門.
WindowsServerはその名の通りサーバーなので,余計なものが一切無効になってます.
「ドライバ入れたはずなのに有効にできねえ?!」と焦りました.
このページを参考にして有効にしました.
http://macnorikae.blogspot.com/2010/06/windows-server-2008-r2lan.html


5.WindowsUpdate
とりあえずごっそり更新しましょうか.
結構更新するもの多かったです.


6.ドライバ関連のインストール
もう一度WindowsSupport\Setup.exeを起動します.
多分動きます.



とりあえず使える感じになるんじゃないでしょうか.

Git Immersion (Git漬け)を訳しながら使い方を覚えてみる.その5

ぼちぼちと進めます.

LAB 9 変更であって,ファイルではない
http://gitimmersion.com/lab_09.html
目標:gitはファイルではなく変更について機能することを学ぶ


ほとんどのソースコントロールシステムはファイル単位で機能する.ソースコントロールにファイルを追加するとシステムはその時点からファイルの変更を追跡する.
Gitはファイル自体というよりファイルに加えられた変更に着目する.git add file というのはリポジトリにそのファイルを追加させる命令ではない,むしろ後々コミットされる前に現在のファイルの状態を記録させておくということだ.
このLabではこの違いについて掘り下げてみよう.


1.最初の変更:デフォルトの名前も許可する
Hello Worldプログラムを変更して引数がない場合の既定値をもたせる.
vi hello.rb

name = ARGB.first || "World"
puts "Hello, #{name}!"


2.変更を追加する
git add hello.rb


3.二回目の変更:コメントの追加
ここでコメントも追加する.
vi hello.rb

# Default is "World"
name = ARGV.first || "World"

puts "Hello, #{name}!"


4.現在の状態を確認する
git status
このように出力されるはず.

# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: hello.rb
#
# Changed but not updated:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: hello.rb
#

この状態でhello.rbがどのように二回挙げられているかに注目してほしい.最初の変更(デフォルトの名前の設定)はステージングされていてコミットの準備ができている.二回目の変更(コメントの追加)はステージングされていない.このままコミットすれば,コメントはリポジトリに保存されないだろう.
やってみよう.


5.コミットする
ステージングされた変更(初期値設定)をコミットしてから,もう一度状態を見てみよう.
git commit -m " Added a default value"
git status

$ git commit -m " Added a default value"[master 03ea0e0] Added a default value
1 files changed, 2 insertions(+), 1 deletions(-)
$ git status
# On branch master
# Changed but not updated:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: hello.rb
#
no changes added to commit (use "git add" and/or "git commit -a")

ここでstatusコマンドはhello.rbの変更は保存されていないが,ステージングエリアにはもうないことを示している.


6.二回目の変更を追加する
二回目の変更もステージングエリアに追加してからgit statusを実行してみよう.
git add .
git status
注:ここでファイルを追加するのにカレントディレクトリ('.')を使った.これはカレントディレクトリ以下の変更された全てのファイルを追加できる便利なショートカットだ.しかし全部追加するにしても,コミットするつもりのないファイルを追加することのないように,addする前にstatusをチェックしたほうがいい.
"add ."といううまいやり方があるのも知ってほしいのだが,このチュートリアルでは今後も安全のためにファイルを明示してaddすることにする.

出力はこうなる.

# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: hello.rb
#


7.二回目のコミット
git commit -m "Added a comment"


LAB 10 履歴
http://gitimmersion.com/lab_10.html
目標:プロジェクトの履歴の見方を学ぶ

これまでの変更履歴のリストを見るには,git log コマンドを用いればよい.
git log
すると,こう出力されているはず.

commit b2a48e09bc05afbacbd3b1f53fae63eb86e19dd0
Author: Yoshiteru Toki <〜〜〜〜〜@gmail.com>
Date: Tue Aug 16 21:07:45 2011 +0900

Added a comment

commit 03ea0e092b1a63e7215afb4500d255c0dbf6cf3f
Author: Yoshiteru Toki <〜〜〜〜〜@gmail.com>
Date: Mon Aug 15 17:08:18 2011 +0900

Added a default value

commit 8888ecf86f8eb5853ad1b22d751d7190fcb5d6c6
Author: Yoshiteru Toki <〜〜〜〜〜@gmail.com>
Date: Mon Aug 15 16:19:01 2011 +0900

Using ARGV

commit 718f5be1d67298f201db8cca8211d0c8ee313444
Author: Yoshiteru Toki <〜〜〜〜〜@gmail.com>
Date: Mon Aug 15 14:06:23 2011 +0900

First Commit

これはここまでリポジトリに追加した,全部で4つのコミットのリストだ.


1.一行での履歴
logコマンドで表示される履歴は実際の必要以上に多い.一行形式で表示してもいい.
git log --pretty=oneline
出力は,

b2a48e09bc05afbacbd3b1f53fae63eb86e19dd0 Added a comment
03ea0e092b1a63e7215afb4500d255c0dbf6cf3f Added a default value
8888ecf86f8eb5853ad1b22d751d7190fcb5d6c6 Using ARGV
718f5be1d67298f201db8cca8211d0c8ee313444 First Commit


2.表示するエントリを指定する
表示する履歴を選択するオプションはいくつもある.以下のオプションを試してみよう.
git log --pretty=oneline --max-count=2
git log --pretty=oneline --since='5 minutes ago'
git log --pretty=oneline --until='5 minutes ago'
git log --pretty=oneline --author='Yoshiteru Toki'
git log --pretty=oneline --all


3.ちょっと複雑な指定
先週の変更部分を見直すためにはこうする.
自分の変更だけ見たかったら,"--auther=Toki"とか付け足せばいい.
git log --all --pretty=format:"%h %cd %s (%an)" --since='7 days ago'


4.究極のログの形式
やがて,自分にとって一番やりやすいこんな形式を使うようになった.
git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short

出力すると,見た目はこうなる.

* b2a48e0 2011-08-16 | Added a comment (HEAD, master) [Yoshiteru Toki]
* 03ea0e0 2011-08-15 |  Added a default value [Yoshiteru Toki]
* 8888ecf 2011-08-15 | Using ARGV [Yoshiteru Toki]
* 718f5be 2011-08-15 | First Commit [Yoshiteru Toki]

詳しく見てみよう.

・--pretty="..." というのは出力形式の定義.
・%h というのはそのコミットのハッシュ値
・%d はコミットの付属情報.(たとえばブランチの頭とかタグとか)
・%ad は変更された日付
・%s はコメント
・%an は変更者名
・--graph はコミットツリーをアスキーグラフレイアウトで表示することを示す.
・--date=short は日付形式を短くする

いろんな形式でログを見たいときがある.幸い,次のLabでgit aliasesについて学ぶことができる.


5.その他のツール
ログの履歴を見るとき,Macならgitx,ほかのプラットフォームでもgitkというのが便利だ.