【読書】プロダクティブ・プログラマ 〜技法編〜
読書のまとめ。
少し古い本だけど、何か参考になるものもあるだろうと読んでみますた。
はじめに
この本は何を目的とした本か?
「プログラマの生産性を向上するための本」。
「生産性」とは、一定の時間にできる仕事、もしくはあげられる成果のこと
※本書の冒頭より引用
この本は2つの節に分けられる。
1.技法編(生産向上の原理)
2. 実践編(生産性向上の哲学)
まとめてたら結構長いので今回は、技法編。
技法編では、主に下記の4つの原則に沿って説明がされる
■プログラマの生産性に関わる4つの原則
- 加速
- 集中
- 自動化
- 正準化
情報が古い部分が多いので、
とても個人的な見解を織り交ぜて、気に入った部分だけをピックアップしますた
あとmacしか使ってないから基本windowsについての記述はスキップしてまふ
加速
自分のPCで利用しているアプリケーションは、必要最低限にしましょう。
同じようなアプリは複数いらない。使うアプリを探す分だけ時間が無駄。
pushdコマンドとpopdコマンド
ディレクトリの移動に便利だと記述があった。
わたしはcdコマンドで十分かな。。。と思ってるけど
このコマンド知らなかったので.....φ(゚-゚=)メモニャン
コマンド自体はcdコマンドと同じようなもん。
ただ、これらのコマンドはカレントディレクトリを内部スタックに
保存するので、ディレクトリ移動を記録できて便利。
試してみる(σ_σ)ゞ
pushdコマンドでディレクトリ移動。
移動したカレントディレクトリがたまっていくのがわかる
$ pushd Documents/ ~/Documents ~ ~ $ pushd workspace/ ~/Documents/workspace ~/Documents ~ ~ $ pwd /Users/pnsk/Documents/workspace
この時点で、「~/Documents/workspace ~/Documents ~ ~」こんだけたまっている
popdしていく。
$ popd ~/Documents ~ ~ $ pwd /Users/pnsk/Documents $ popd ~ ~ $ pwd /Users/pnsk
スタックにたまっていたカレントディレクトリ情報が、最後「~~」になったらおしまい。
ほうほう。面白い。
ただ、1つ前のカレントディレクトリに戻るんであればcdコマンドで可能だからこっちでいいかも。
$cd -
集中(なんか途中から加速について記述している希ガス)
気が散るのを最大限防ぐ
ヘッドホンとか良い。
音楽はきかなくてもよくて、見た目に話しかけにくくしておくことが重要。
ω・*) < 音楽聞いてるふりしても余裕で話しかけられる気がするけど。。
不要な通知のオフも大切
ω・*) < skypeとかオフっちゃえ
時間を決めて、沈黙の時間をつくる
検索の効率化的なお話
ファイル名にメタ情報をいれる(何のプロジェクトかetc.)
正規表現とfindコマンドを駆使すると色々便利
ローカルPCにある、よくアクセスするディレクトリをルートビューに設定すると
階層を辿っていかなくても簡単にアクセスできる。
[書類]>[ブログネタ]をルートビューにもってきてみた
こんな感じ。
もとのディレクトリが移動しているわけではなく、ショートカットを作成しただけ。
プロジェクト関連のまとめ
プロジェクトのファイルを、ショートカットを使って一箇所のディレクトリにまとめる
これいい。
macのマルチデスクトップ
macのマルチデスクトップを利用するときは、そのデスクトップ毎に用途を明確にする
- コミュニケーション用
- ドキュメント用
- コーディング用
とか
自動化
小さなExcel作業もrubyなどでスクリプトを書いて、作業をより簡単にすること
よくアクセスするWebページのローカルキャッシュをとっておく事
これによりネットアクセスの時間ロスをふせぐ事ができる
これ、コンフル(商用wiki)の特定ページとかにしぼると役立ちそうかも。
どこまで自動化すべきか
2回以上繰り返す作業については自動化を検討する
ただし、自動化が妥当かの判断をする時間を作る必要がある
自動化に膨大なコストがかかるのであればそれはすべきではない
正準化
「正準化」:重複した余分なものを省いて単純化すること
技法編のNOTE
キーポイントが所々で示されているので気に入ったやつだけ。
「段取りではなく本質に注力せよ」
「単純作業の繰り返しは、知力と集中力を奪う」
「ドキュメントは「生きた状態」に保つ」
だいたいそんな感じかな。
全体感、とっても読みやすくてさらさら読めまふ (。◕ ∀ ◕。)
情報が古い物が結構あるけど、まあ、考え方を参考にする感じ。
【maven】nexusのLDAP認証
ω・`)
最近、読んだ本のまとめばっかりだった希ガス。
まだ途中のものばかりで公開していないけどw
LDAP認証の設定方法について。
以前はnexusのアカウント管理を、
nexus側でしていたんだけど、利用者も増え、いちいちアカウントを作成するのが
めんどうになってきたのでLDAPで管理するようにしました。
ただ、LDAPのユーザ全員が操作できるわけでなく、利用者をディベロッパーに制限した。
LDAP認証の設定自体はすんなりいくと特段難しい事はないんだけど
エラーメッセージが不親切なのでつまずくとうっとおしかったなぁ・・・(´*ω*`)。
LDAPの設定
ここでLDAPの設定をする。
これをしないと話にならぬ。
管理ユーザでログインして、Security項目のLDAP Configurationをクリックすると
LDAPの設定ページが表示される
設定内容は、
1. LDAPサーバへのコネクションの設定
2. ユーザのマッピングの設定
3. グループのマッピングの設定(この設定は、必須ではない)
って大きくこんな感じ。
1. LDAPサーバへのコネクションの設定
hostnameにはIP直接入れた。ホスト名でもよい
portはldapのデフォポート:389
別のポートで設定されている場合は、それを指定すればよい
「Search Base」は、ユーザやグループのマッピングの設定をするときの
ルートディレクトリを設定している。
【Check Authentication】ボタンで設定が間違えていないかチェックできちゃう
2. ユーザのマッピングの設定
LDAPのユーザ情報を取得しまふ。
Base DNにou={organization unit}と書いているけれど{}の部分は任意のouの値を入れる
ここでBase DNは、さっき指定したSearch Baseより下層部のディレクトリである必要がある
ObjectClassやUser Id属性、RealName属性は、ldap情報から利用したい属性を使う。
ObjectClassは属性の集合体を表す。利用したいldapの集合体を指定してやれば、
その集合体に属するldapのユーザ情報とマッピングが可能になる。
userIdはuidだろうがcnだろうが何を指定しても実はかまわない。
ただし、これがnexusにログインする際のidになるので適切なものを指定する必要がある。
※uidが妥当かなー。
RealName属性は、そのままで「実名」。
nexusでユーザ情報一覧を表示したときに、表示される単なる個人名。
これも個人が特定できるものであれば、適切なものを指定すればいい。
どの値を指定するかは、自分の利用しているldapの情報をldapsearchコマンドなどで確認すると良い。
こんな感じでコマンドたたくとuid=pnskのldap情報が取得できマフ。
※ldapのクライアントをインストールしている場合
$ ldapsearch -x -h xxx.xxx.xxx.xxx "uid=pnsk"
xxx.xxx.xxx.xxxはLDAPサーバのIPを指定してくらさい
3. グループのマッピングの設定
これは、任意のグループにのみ、nexusの権限とマッピングしたいので設定した。
groupId属性は、任意のグループのIdを示すもの(例:gidとか)。
groupMember属性は、任意のグループのユーザを示す。
Group Member Formatは、今回はcnがdeveloperだけに権限を付与したいため固定値とした。
権限(role)のマッピング
roleの作成
ldapのグループと、nexusの権限のマッピングを作成する
上述したグループのマッピング設定のdeveloperとマッピング。
Security項目のRolesを選択する
[Add]>[External Role Mapping]をクリックする
マッピングを作成するポップアップが出るので
RealmにLDAPを指定し、RoleでマッピングしたいLDAPのグループを選択する。
今回は、developerになる(※上記で設定したやつ)
以下で新規作成。
今回はLDAPアカウントのdevelopersに属するユーザにnexusの下記の2つの権限を与えた。
- 「Deployment and Artifact Upload Role」
- 「Repo: All Repositories (except delete operation)」
どっちもカスタマイズした権限だよ(。´・ε・`。)
これで設定完了。
LDAPに登録しているユーザであれば、
nexusにログインできて、artifactのアップロードとかができるようになったよ(・ε・)
【LACIE】認識されなくなった
appleショップでゲットしたUSB
完全に見た目で買ったんだけど、
なんか最近、認識されなくなった。。
てゆうか、finderに表示されない。。
※たぶんFUSE for OS X入れたせいだと思うんだけど。。
dfコマンドだといる。
/dev/disk1s1 7877504 7839184 38320 100% /Volumes/LA-PUBLIC
えー(;´Д`)
$ diskutil info /Volumes/LA-PUBLIC ~ ry) Mounted: Yes Mount Point: /Volumes/LA-PUBLIC Escaped with Unicode: /Volumes/LA-PUBLIC ~ry)
ひとまず、PUBLIC領域はmountされているね。
PRIVATE領域をみたいので、こっちをマウントする必要があるっぽい
PRIVATE領域をマウント
直接シェルをたたいた。(力技。。)
$ pwd /Volumes/LA-PUBLIC/Open-La-Private.app/Contents/MacOS $ ls LaPrivate startLaPrivate.sh $sh startLaPrivate.sh
パスワードを入力する画面が表示された。
きたきた。
これで、ひとまず普通にデータが見れます。
ちなみにこんな感じになってる。
$df -h ~ry) /dev/disk1s1 3.8Gi 3.7Gi 19Mi 100% /Volumes/LA-PUBLIC LaPrivate@fuse0 0Bi 0Bi 0Bi 100% /private/var/folders/s_/65ngfccj5xx01tm4m10l2g6h0000gp/T/.truecrypt_aux_mnt1 /dev/disk2 3.5Gi 1.8Gi 1.7Gi 51% /Volumes/LA-PRIVATE
取り外す
$ diskutil unmount /Volumes/LA-PRIVATE $df -h ~ ry) /dev/disk1s1 3.8Gi 3.7Gi 19Mi 100% /Volumes/LA-PUBLIC
PRIVATEいなくなったー。
$ diskutil unmount /Volumes/LA-PUBLIC Volume LA-PUBLIC on disk1s1 failed to unmount
ぐぐぐ。。。
diskutil以外にも、hdiutilとかでやってみたり、、、detachやってみたりしたけど
いけず。。。
$ diskutil unmount force /Volumes/LA-PUBLIC
いけた。
ああああ。。。
もっと良き方法があると思うんで追って追記しまふ。。。
github (business)ってどうなんだろ的なお話
「今時githubでしょ」って言われる今日このごろ。
果たしてどれだけの人が・・・(ry
(。´-ε-`。)モゴモゴ
って思ってるけど真剣に考えたことないから。
本当に、プロジェクトにgitを導入していきたいなら
もう少し、管理する側もしっかり理解して「導入を進める」ということを
していかなきゃなあと一人で自分のお尻をぺんぺん叩いてみた
|゚Д゚)))コソーリ
以前、試験的にGithubEnterprise(GHE)を導入してみたけど高価すぎたw
- 社内運用
- LDAP認証連携
とかメリットがあったのだけど。。。
ついでに、「git使ってみたい」要望が高かった時期に
gitlabっていうgithubのクローンも立ててみたんだけど
ちらほら利用されている程度かな。
「勝手に使っていいよ」スタンスで公開しちゃったのがいかんかったか。。
ω・`)コソ
ちなみにgitlabはプロジェクトで使うのにはいいけど、
リポの参照も管理者が承認しないとできないのでソーシャルコーディングには向いていないかと。。
元々用途がちがうのね。
さてさて。
privateリポを利用しようと思ったら有料版を使う必要がある
⇒GitHub · Build software better, together.
下記、いいとこと微妙なところのまとめ。
github businessのいいとこ(・∀・)
githubの機能がまんまプライベイトで使えるよ
てこと。
- Issue機能
- wiki
- pull request
- Gist:ちょろっとしたスクリプト管理に利用できる(。´・ε・`。)♪
- watchできる
- graph化:リポジトリのアクティビティがグラフ化されている
- 画像の差分がみれる:デザインチェックに使える?(。´・ε・`。)
しっかり利用するなら、プロジェクト開発において大きなメリットになる。
※GHEでも同じ昨日あるお
github businessの微妙なとこ(;´Д⊂)
外部にgithubがある
素人目だけど、これは個人的には・・・|д゚)
特に、規模のある程度大きな組織においては。。
追記
Secrets in the code · GitHub
private/publicを誤ったものとかが、検索でひっかかっちゃったりすることがあるみたいですね。。
ページ自体はみれなくとも。。。
「組織のプロダクト(リポ)を社外に置いている」ていうのは、許容したとして、
アカウントの管理が大変そう。
退社した人とか、諸々。。
あとは、githubが落ちたりメンテしてたら、機能自体が使えない。。
エンジニアだけが利用するとしたら、直接使ってね♪で良さそうだけど
フロントサイドの人にはきついんじゃないかなー。
あと、さっき、プロダクトを社外に置いているを許容したとして、
プロダクトの中に、ユーザデータにアクセスするための情報(DBのIP,ID/PWとか。。)が
ソースコードの中に含まれていた場合、ちょっと微妙だな。。。。
その辺の整備をしてから利用するようにする必要があるかな。
むずかし。(。´-ε-`。)
全体感
メリット | デメリット | |
---|---|---|
GHE | セキュリティ(LDAP認証、社内NW) ,UI(githubと同じなので使いやすい) | 高価(年間1ユーザおよそ2万円弱) |
github business | 安め , UI(github public と同じなので使いやすい) | セキュリティ(LDAP連携できない。社外) ,アカウントの管理、githubのメンテナンスに引っ張られる |
clone (gitorious, gitlab, etc.) | セキュリティ(LDAP,社内NW) | UI(cloneといえど、独自のUI) 運用大変すぐる(特にアップデートとか)。 |
セキュリティ考えると、GHEかcloneかな。
UIでいうならGHEかgithub businessが優勢っぽい。
追記
結局GHEの導入におちついた。
【svn】リポジトリフック 〜pre-commit〜
どこにでも書いてるけど、自分めも。
svnとredmineで連携して、
コミットメッセージの中にredmineのチケット番号が入ってなかったら
コミットできないようにしたい
ていう要望がありますた。
よくある話だけど、今回は、
1つのリポジトリの中の任意のプロジェクトだけコミットフックを適用したい
ってやつ。
今回はredmineとの連携はさておき、イラネッ(゚Д゚=)ノ⌒゚
同リポ内でコミットの制御を色々実験してみたー。
いつもお世話になっているこの本を参考にしてます(о´▽`о)♪
下準備
testリポジトリの下に、
という2つのプロジェクトを作成する。
プロジェクトのコミット
自分のローカルPCでテスト用プロジェクトを作成して
リモートsvnにコミットー。
こんな感じで。。
$mkdir svn_hook_test $cd svn_hook_test $mkdir file $vim test.txt (編集) $svn import svn_hook_test http://svn.pnsk.jp/svn/test/svn_hook_test -m "first commit."
リモートリポにsvn_hook_testにimportしただけだと
手元にあるローカルのsvn_hook_testはバージョン管理されないのでチェックアウトし直す
$rm -r svn_hook_test $svn co http://svn.pnsk.jp/svn/test/svn_hook_test/
あい。svn_testも同様にして準備おk
svnのフックスクリプト
準備ができたので、リモートsvnサーバでフックスクリプトを作成する
svnのフックスクリプトは
${SVN_HOME}/repos/test/hooks
にある
テンプレートが色々あるお
$ ls post-commit.tmpl post-unlock.tmpl pre-revprop-change.tmpl post-lock.tmpl pre-commit.tmpl pre-unlock.tmpl post-revprop-change.tmpl pre-lock.tmpl start-commit.tmpl
今回使いたいのは、pre-commitフック。
pre-commit
コミット完了直前に一行されるフックスクリプト。
コミットの内容などから、コミット制御ができる。
pre-commitの作成
テンプレートをコピーして実行権限を追加
$cp pre-commit.tmpl pre-commit $ chmod +x pre-commit $ls -l pre-commit -rwxr-xr-x 1 svn svn 3436 11月 2 11:25 pre-commit
pre-commitは引数で
がゲットできるので、それをつかって、svnlookコマンドでごにょごにょしまふ
svnlookコマンド
リポジトリ内の、リビジョンやトランザクションの確認をするためのコマンド
今回使うのはトランザクション周りのコマンド(-tを使う)。
- コミットトランザクション内で変更があったディレクトリの取得
文法的にはこんな感じ
$svnlook dirs-changed -t [トランザクション番号] [リポジトリのパス]
例えば、svn_hook_test/file/test.txtを修正、コミットすると
変更されたディレクトリはsvn_hook_test/file/となる。
このコマンドは、
コミットログの制御を適用するプロジェクトをハンドリングするために使う
- 変更のあったコミットの、コミットメッセージの取得
$svnlook log -t [トランザクション番号]
コミットメッセージの内容が取得できる
フックスクリプト
svn_hook_testプロジェクトのfilerディレクトリに配下のコミットについてのみ
コミットログに"pnsk"というキーワードを入れないとエラーを返すようにする
#!/bin/sh #----------------------------------------- # SVN PARAMETERS #----------------------------------------- REPOS="$1" TXN="$2" #----------------------------------------- # COMMAND #----------------------------------------- SVNLOOK=/usr/local/svn/bin/svnlook CHANGED_DIRS=`${SVNLOOK} dirs-changed -t "${TXN}" "${REPOS}"` COMMIT_LOG=`${SVNLOOK} log -t "${TXN}" "${REPOS}"` CHECK_DIR="^svn_hook_test/file" KEYWORD="pnsk" #----------------------------------------- # CHECK COMMIT_MESSAGE in CHECK_DIR #----------------------------------------- if echo ${CHANGED_DIRS} | grep "${CHECK_DIR}" > /dev/null then if !(echo ${COMMIT_LOG} | grep ${KEYWORD} > /dev/null) then echo -e "you need keyword" ${KEYWORD} > &2 exit 1 fi fi exit 0
動作テスト
同リポ内のsvn_testプロジェクト
キーワードのチェックはないので、正常にコミットできる
$ pwd {LOCAL_HOME}/workspace/direct/svn_test $ vim file/test.txt $ svn commit -m "test" Sending file/test.txt Transmitting file data . Committed revision 53.
svn_hook_testプロジェクトのnot_hook_fileディレクトリ
キーワードのチェックはないので、正常にコミットできる
$ pwd {LOCAL_HOME}/workspace/direct/svn_hook_test $ vim not_hook_file/test.txt $ svn commit -m "test" Sending not_hook_file/test.txt Transmitting file data . Committed revision 52.
pnskキーワードをコミットログに入れなくてもコミットでけた
svn_hook_testプロジェクトのfileディレクトリ
- コミットログにpnskキーワードを入れた場合
$ pwd {LOCAL_HOME}/workspace/direct/svn_hook_test $ vim file/test.txt $ svn commit -m "test pnsk" Sending file/test.txt Transmitting file data . Committed revision 51.
- コミットログにpnskキーワードを入れなかった場合
$ svn commit -m "test " Sending file/test.txt Transmitting file data .svn: Commit failed (details follow): svn: Commit blocked by pre-commit hook (exit code 1) with output: you need keyword pnsk
エラーになった
今日はここまで。
ちゃんちゃん
gpgコマンドめも
gpgコマンドまわりのめも。
GPGのツールとかあるけど、
GPG Keychain Access | GPGTools (OpenPGP Tools for Apple OS X)
mac使ってるなら、コマンドベースの方がよっぽど楽なわたし。
好みの問題だけど(○´ω`○)ゞ
俄然、本家のページが参考になる。
http://www.gnupg.org/documentation/manuals/gnupg.pdf
gpgコマンド
macもともとgpgコマンドはいってるお
わたしのはこんな感じ
$ gpg --version gpg (GnuPG) 1.4.9
公開鍵と秘密鍵の生成
鍵のペアを作成する
$gpg --gen-key
.gnupgディレクトリ配下に
pubring.gpg(公開鍵)とsecring.gpg(秘密鍵)ができる
楽勝(v´∀`)ハ(´∀`v)ヤッタネ☆
なんかメッセージできてた。
Note that this key cannot be used for encryption. You may want to use
the command "--edit-key" to generate a subkey for this purpose.
subkeyを作らないと、暗号化とか複合化できないよ!!的なこといってる。
このメッセージ、実際無視してやり続けたらできなかった(○゚ε゚○)プッ
subkeyつくるよ。
鍵の種類はRSA(暗号化のみ)
$gpg --edit-key [key] >addkey ---(ry ご希望の鍵の種類を選択してください: (2) DSA (署名のみ) (4) Elgamal (暗号化のみ) (5) RSA (署名のみ) (6) RSA (暗号化のみ) 選択は? 6 ---(ry
あい。こんな感じでできました。
$gpg --list-public-keys
これで確認できる。
配布用公開鍵
$gpg -a --export [ユーザ名] > [ユーザ名].asc
秘密鍵のバックアップ
$gpg --export-secret-key -a [ユーザ名] > [ユーザ名]_sec_bak.asc
公開鍵のインポート
自分のナイショファイルを、pgpで公開したい場合は、
その人の公開鍵をインポートする必要がある
$gpg --import [インポートしたい人の公開鍵]
登録した公開鍵の確認
$gpg --list-public-keys
テスト
テストファイルを暗号化して、複合化する。
自分のアカウントでも確認できる
テストファイル作成
$ vim test.txt
内容はこんな感じ
(o゚ロ゚)ノ
暗号化
$gpg -r [ナイショファイルを見せていい人のuid] -e test.txt
uidは、
$gpg --list-public-keys
で確認できるよ
複合化
$gpg -d test.txt.gpg
コンソール上にでるので、ファイルにしたい場合は、
$gpg -d --output [出力ファイル名] test.txt.gpg
ちゃんちゃん。
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
追記
gpgのコマンドもマスターして、
これでいくらでも暗号化してこーいヾ(○⌒∇⌒○)ノ
て、某アカウント発行の依頼をしたんだけど、
「gpgの設定めんどくさいだろうとおもったので、渡しにきました!!!」
って、善意丸出しの新卒の子にパスワードを手渡しされますた。。。
・・・・ (´・ω・`)
【maven】nexusの移行
(*゚▽゚)ノちゃお♪
今回は、まるっとnexus移行のお話。
Sonatype.org: Nexus
今まで使ってたnexus1.8.0のサーバ容量が厳しくなってきたのでサーバ移設。
nexusもバージョンアップして、nexus2.0.6になりますた。
データの移行
artifactとかまるっと持っていきたかったので、この2つだけrsyncすればいいとおもう。
sonatype-work/nexus/proxy sonatype-work/nexus/storage
sonatype-work/nexus/indexer配下も必要かと思ったけど、結局Repair Indexしたから意味がなかった
※Repair Indexの方法↓
How do I repair a repository index in Nexus? : Sonatype Support
これしないとartifact検索が機能してくれない。
3rdパーティのプロキシ
3rdパーティのリポジトリurlを登録してたけど、これは、手動で設定追加。
3rdパーティのリポジトリの設定は、
sonatype-work/nexus/conf/nexus.xml
に書いてあるんだけど、
今回はバージョンが異なるnexus間の移行だったので、設定ファイル周りは基本的には手動にした
・゜・(/Д`)・゜・。
ユーザアカウント
ユーザアカウントは2種類
- 個人アカウント
- プロジェクト単位アカウント
個人アカウントはLDAP連携なのでおいておいて、
プロジェクト単位アカウント(ビルドサーバとかで使うやつ)は、発行してます。
今回はやっぱりバージョン違いでコピーってわけにはいかない。
とはいえ、プロジェクト単位でパスワードもう一度発行するのは
プロジェクト担当者との調整の方がめんどくさいw
ユーザ情報は下記のxmlで管理されている。
sonatype-work/nexus/conf/security.xml
バージョン違いで微妙にxmlの構成が違うので
ID/PWだけそのままコピってもってきちゃった。てへぺろ
設定変更を反映させるには、nexus再起動してくらさい。
動作確認
jenkins経由、ローカル経由で確認。
.m2配下のライブラリを削除して、向き先変更してライブラリがちゃんとダウンロードできるか確認
プロジェクトアカウントでちゃんとアップロードできるか確認
そんな感じですた。ちゃんちゃん♪