雑草SEの備忘録

東大を卒業し、SEとして働くことになった。備忘録的に作業を綴る。

GemfileとGemfile.lockの簡単なお話

Ruby on Railsをやり始めたときだと、Gemfileって何?そんでbundle installするとつくられるGemfile.lockって何?みたいな感じですよね。
今日は、GemfileとGemfile.lockの簡単なお話です。

gemっていうのは、Javaでいうところのライブラリみたいなものです。結構頻繁に使われるあるまとまった処理があって、それを毎回開発するたびに書いているのは大変なのでgemという形にしてみんなが使えるようにして配布しているわけですね。

開発者は、この機能を作りたい!そのためには、このgemが必要だ!って思った時は、Rails.rootにあるGemfileに追加します。
だけど、gemの中にはさらに別のgemを使っているgemもあったりして、さらにそのgemも別のgemを使っていて…とかが往々にしてあります。
さらに、Aというgemを使うためにはZというgemのバージョン1.2.1が必要だけど、Bというgemを使うためには、Zというgemを使うんだけど、1.3.0のバージョンが必要で…みたいな話もあります。

そこで、Railsだと、bundle installするときにそのあたりの依存性をよしなに解決してくれるわけですね。そして、その解決した依存性をGemfile.lockというファイルに記録します。
Gemfile.lockをリポジトリに入れて管理しておけば、そのリポジトリを別の環境に持っていったときも依存性は解決されているので、Gemfile.lockに従ってgemをインストールすればいいことになって、便利です。

ただ、たまに、Gemfile.lockそのままじゃだめなときがあります。私の過去の経験の話を少しします。
当時、開発は、AWS上のEC2で行ったり、Macのローカルの環境で行ったりしていました。gemの中には、なぜかEC2では難なくインストールできたのに、Macではうまくインストールされないというものがありました。
仕方がないので、私は、そのgemをGemfile.lockから消し、もう一度bundle installを行うとよしなに依存性が解決され、別のバージョンのgemがインストールされました。それで、無事めでたくbundle installを行うことが出来ました。

もちろん、本番環境とローカルでは、gemのバージョンが異なってくるわけですが、デプロイ時は本番環境に近い環境でbundle installするので、当時は問題は発生していませんでした。

私も含め初学者はこのあたりブラックボックスのまま突き進むことがあると思いますが、ちょっと振り返ってみました。


詳しい話は、(ベタですが)次の記事にお任せします。
www.rubylife.jp

当たり前だけど、ちゃんとgitのstatusを見てからaddしようね。

当たり前の事なんだけど、gitでcommitする前はきちんとgit statusして変更したファイルを確認し、必要なファイルだけをコミットするということをきちんとしないといけない。

当たり前の事なんだけど。

だけど、余りわかっていない初心者はとりあえず

git add .

して、

git commit -m 'commit message'

しちゃう。あるいは、この二つのコマンドを一気に

git commit -am 'commit message'

みたいなことをする。

もちろんstatusみたりもするけど、ふ~んみたいなかんじでスルーしちゃう。
まあ全部私の事なんですけど。

なんでかっていうと、言い訳だけど、初心者がやるチュートリアル的なもの
 Ruby on Rails Tutorial
とか
 RSpec の入門とその一歩先へ~RSpec 3バージョン~
とかがそんな感じでやってるから。
もちろん、これらはgitの使い方を学ぶものではないから、仕方がないんだけど、きちんと一回gitの勉強はしないとねと。

最近は学習して、

git status

でmodifiedファイルを確認。Ruby on Railsをやってたりすると、bundle installしたときにGemfile.lockとかも書き換わってる時があるので、それらはaddしないようにする。

git add file.rb

する。
それで、私の場合、一旦diffを見る。
addしない場合だと、

git diff

だけで見れるけど、addしたもののdiffを見るときは、

git diff --cached

で見ることができる。ここで間違いがないかを確認する。間違いがあればそのファイルを修正してもう一度addする。
間違いがないことを確認したら、

git commit -m 'commit message'

でコミットする。-amはなるべく使わない。
一旦addしたものを取り消したいなら、

git reset

を使う。commitする前だったらこれでaddを取り消せる。
commitしてしまったら、

git reset --soft HEAD^

を使って直前のコミットを取り消す。resetのオプションに--softならファイルの変更は取り消されない。コミットだけ取り消される。
オプションが--hardの場合はファイルの変更まで取り消されるので注意。ただ、gitにはこれもまた戻す方法がある。
自分の場合、今の所--softしか使う機会はないけど。

Windows7でVMWareでLinux Mintを使ってみる

転職して、Macを使うようになりました。

normalse.hatenablog.jp


ただ、前職ではWindowsだったし、私物のパソコンもWindows(Let's note CF-S10)です。
家で勉強したい!とか開発したい!というときに、Windowsだと、コマンドの違いだったり、なんか違うってなことで、Mac欲しいな~と思いながらも、経済的見地から購入できないでいます。

1年以内には買おうと思いますが、とりあえず今は手元にあるWindowsでなんとかしようと思いました。
Macであることが重要というよりも、Linuxが使えれば問題ないので、WindowsVMWareを導入し、VMWare上でLinuxをインストール。今回インストールしたのは、Linux Mint 17.2です。

linuxmint-jp.net

なぜMintなのかというと、色々と紆余曲折ありまして。。
もともとは、VMWareではなく、久しく放置してあったWindowsXPが入ったパソコンにUbuntuを入れようとしたのですが、これがなかなか重い・・・。最近のUbuntuはそれなりのスペックのパソコンじゃないとまともに動かないみたいです。

そして次に入れようとしたのがLinux Mint。名前からしても軽そうだし、なんかかわいい。かわいいは正義です。
といことで、WindowsXPが入っていたパソコンにMintを入れたのでした。。

ただ、色々考えてみると、外出時にパソコンを持っていくとしたら今のLet's noteだろうし、二台持ちはさすがにないよな~ということで、Let's noteにMintを入れよう!と。かわいいし。

そんなわけでMint。

普通にVMWareをインストール。

Mintはいくつか種類がありますが、一番おすすめされているMATE No codecsを選択しました。
www.linuxmint.com
ここにあります。

そのあと少しはまったのでメモ。
VMWareを使うのであれば、Winodowsとシームレスにマウスを行き来したりしたいですし、画面もVMWare Workstation Playerのウィンドウの大きさに合わせて変れるようにしたいです。マウスのシームレス化は何もしなくでもできたのですが、ウィンドウの可変ができていなかったので設定。

いろいろ調べると、VMWare Toolsというものがあるそうで、それをインストールしなければいけないと。
VMWare Playerのバージョンが変わったのか、ネットの海にあふれている情報ではできにくい。。

少し探した結果、ここにありました。
f:id:smartenergy:20150922123950p:plain
(画像では再インストールとなっていますが、インストール前のときは「再」はついてませんでした。)

ただ、sudo ./vmware-install.pl -dすると、
open-vm-tools are available from the os vendor and vmware recommends using open-vm-tools
みたいなコメントがでてインストールできない。。

色々調べてみると、最近は、open-vm-toolsというのを使うのが推奨されているようです。(上のコメントそのまんまですがw)

open-vm-toolsのインストールの仕方は、Linux Mintだと左下のメニューからパッケージマネージャを起動し、open-vmで検索。
どれが必要でどれが不要なのかわからなかったので、とりあえず、片っ端からインストール対象に。
右クリックでインストール指定をすればできます。

f:id:smartenergy:20150922125759p:plain

あとは適用を押すのみ。
これで再起動したら画面のサイズがVMWare Playerのウィンドウサイズに追従してくれるようになりました。たぶん…。

あとは、WindowsとMintの間でコピー&ペーストができるように。
これは、設定ファイルである.vmxファイルを変更します。

場所は、
ユーザ名\Documents\Virtual Machines\
の配下にVMWareでインストールしたマシン名が書かれているので、そのフォルダの中にあります。

私の場合、Linux Mintで登録したので、
フォルダは
ユーザ名\Documents\Virtual Machines\Linux Mint
vmxファイルは、
Linux Mint 17.2.vmx
になっていました。

このファイルに、次の2行を書き加えればWindows-Mint間でコピペができるようになります。

isolation.tools.copy.disable = "FALSE"
isolation.tools.paste.disable = "FALSE"


あとは、私の必須エディタであるvimをインストールしたり、.vimrcを設定したりしてとりあえず使えるように・・・。

結構長かった。。

かわいいよ、Mint。。
f:id:smartenergy:20150922130520p:plain

転職直前の気持ち

転職をした。

といっても、20日までは今の会社に籍はあって、21日から新しい会社に移るのでまだ過去形ではない。

新卒で、今の会社に入って1年と4か月。多分短いと言われるだろう。周りからは3年は居ろとも言われた。上司に退職の意思を告げたとき、こうして短期間で職を変えることが僕にとって良いこととは思えないと止められたりもした。

転職活動をしはじめたのが4月末から。その間、精神的に紆余曲折があった。

まずは、次の会社への入社を4日後に控えた現時点での気持ちを率直につづってみたいと思う。気持ちというのは移ろいやすく、おそらく今の気持ちは3か月後にはないだろうから、今綴らなければならないと思う。備忘録だと思って書く。


正直なところ、今は不安で押しつぶされそうだ。

現職は、全世界で10万人以上の従業員がいる大企業。SI業界ではそれなりに名の知られた会社だ。一方、次は従業員100人にも満たない企業だ。今年で創業10周年。本格的にサービスインしてからは、7~8年たっているから、ベンチャー企業と言えるのだと思う。

現職の様な大企業では、教育もしっかりしているし、福利厚生もそれなりに手厚い。寮もあって、光熱費込で月額1万5000円を負担するだけで良い。大企業の中では潤沢な福利厚生とは言えないが、全体的に見れば手厚いと言える。
しかし、次の会社は寮などない。一定の条件を満たせば近距離手当がつくが、提示された条件では、その近距離手当を含んで現職と同程度である。光熱費も当然自分で払う。残業代も、45時間/月までは支給されない。必然、生活は苦しくなる。

それでも僕は転職を決意した。

私のモットーは、「若い時の苦労は買ってでもしろ」だ。

年収が多少下がろうとも、若い時からたくさん経験ができるであろう会社を選んだ。もちろんそういう経験ができるかどうかは分からないが、スピード感は、今の会社よりも早いであろう。

現職に大きな不満があったわけではない。もちろん、どこの会社に勤めようが、多少の不満はあるであろう。ただ、職場での人間関係も良好だったし、直前まで携わっていたプロジェクトでは、残業は多かったものの、仕事のやりがいもあった。積極的に自分から仕事をとりにいっていた。テスト工程のマネジメントの仕事をしていたのだが、テストがスムーズに進められるようにスケジュールを作成し、テスト仕様書も作成した。BPさんとのやりとりも僕が直接やっていたし、障害が起きたときの対応も僕がしていた。
先輩も関西人だったからかとても面白かった。上司からは、二人を見てると漫才の様だとも言われるぐらいだった。僕はテスト推進チームに属していたが、違うチームの人からは、テストチームは楽しそうで羨ましいと言われたりもした。

ただ、やはり大企業ならではの弊害もあって、思うところがあって退職することになった。ここでは詳細は別の機会に譲る。

現職での良好な人間関係もそうだし、仕事も覚え始めて面白くなってきてからの退職だったので、正直なんで辞めなければいけないのかという思いもあった。未だにある。だけれども、今の会社で定年まで働くイメージがまったく湧かないし、僕はやっぱり大企業に向かないんだと思う。経営者が直接見える企業で働きたいというのが就活していたころからの思いだった。小さいながらも会社が一丸となって、みんながみんな同じ方向を見て進む。そういう会社で働きたかった。
ただ、大企業に入りやすいのは圧倒的に新卒。大企業の経験もしたかったので、新卒の時は、今の会社を選んだ。知人に今の会社に勤めている人もいたので、雰囲気も分かって働くイメージが湧いたというのもある。

今度の会社は、エージェント経由で紹介された企業だ。面接は3回あって、2次面接と最終面接は同じ日に行ってくれた。しかも今の会社の定時を過ぎてからだったので、最後は23時近くだった。その日、オフィスの見学もさせてくれて、さらには、その日のうちに内定を出してくれた。僕を採用したいという熱意をすごく感じた。
内定のあと、オファー面談という、条件が提示される面談がある。その時にも、代表取締役、開発部の部長、人事部の部長というメンバーで面談を受けた。正直、人事部の人だけかと思ったので、びっくりした。かなり重いと感じたけど、結局はその熱意にやられた。

だからこそ、余計に不安だ。一応、現職でJavaの経験はあるとはいえ、転職先では、Ruby。やったことない。しかも、部長は東大卒だし、以前は外資系のIT系コンサル会社に勤めてたと言うし、周りの人も優秀そう。すごい期待してくれてるのはひしひしと感じたが、正直私は何もできない。それでもポテンシャルを買ってくれたんだと思う。

新しい職場での人間関係も不安だ。面談では、僕はその会社に居そうだとも言われた。やはり会社によって勤めている人の雰囲気は似ている。僕はその会社に居そうだというのだから、雰囲気は近しいのだろう。実際、オフィスを訪ねて働いている人と会話したときも、大きな隔たりは感じなかった。だからきっと大丈夫なんだろう。

しかし、いくら不安に思ってももう動き出してしまっている。後戻りはできないところまできてしまった。ここまできたら、どうせ死ぬわけじゃないしと思って腹をくくって頑張るしかない。

日立の社員が転職して後悔しているブログが有名になったが、私は後悔するのだろうか。いや、後悔するかしないかは次の会社での自分次第。もうやるしかない。

クイックソートのソース(Java)

クイックソートアルゴリズムJavaで実現したときのソースです。
クイックソートってどんなものかっていうのは、他のサイトをあたってください。
軸の取り方はもう少し工夫しても良いかもしれません。平均の値をとるとか。

// クイックソートのメソッド
public static int[] quickSort(int[] input) {
	return quick(input, 0, input.length - 1);
}

private static int[] quick(int[] input, int left, int right) {
	int[] array = input;
	int currentLeft = left;
	int currentRight = right;

	// 要素数が1以下のときは、何もせず返却する
	if (array.length < 2)
		return array;

	// クイックソートの場合、軸の選び方は色々あるが、このメソッドでは
	// 軸は、currentLeftとcurrentRightの真ん中にある要素とする。
	int pivot = array[(currentLeft + currentRight) / 2];

	do {
		while (array[currentLeft] < pivot) {
			currentLeft++;
		}

		while (array[currentRight] > pivot) {
			currentRight--;
		}
		if (currentLeft <= currentRight) {
			int index1 = currentLeft++;
			int index2 = currentRight--;
			int temp = array[index1];
			array[index1] = array[index2];
			array[index2] = temp;
		}
	} while (currentLeft <= currentRight);

	if (left < currentRight)
		quick(array, left, currentRight);

	if (currentLeft < right)
		quick(array, currentLeft, right);
	return array;
}

マージソートのソース(Java)

マージソートのソースのアルゴリズムJavaで実現したときのソースになります。
アルゴリズムの説明は、他のサイトをあたってください。あしからず。。

public static int[] mergeSort(int[] input) {
	// 分割の配列
	int[] array = input;
	// 並び替えた数値を格納する配列。最終的にこの配列を返す。
	int[] b = new int[array.length];

	// 分割する添え字
	int middle = (0 + array.length - 1) / 2;
	// 分割した配列の前半分を格納する配列
	int[] array1 = new int[middle + 1];

	// 分割した配列の後ろ半分を格納する配列
	int[] array2;
	// arrayの要素数が1以上のとき
	if (0 < array.length) {
		array2 = new int[array.length - middle - 1];
		// arrayの要素数が0以下のとき
	} else {
		array2 = new int[0];
	}

	// 要素数が1以下のときは、何もせず返却する
	if (array.length < 2) {
		return array;
	}
	// 前半部分をarray1にコピー
	System.arraycopy(array, 0, array1, 0, middle + 1);

	// 後半部分をarray1にコピー
	System.arraycopy(array, middle + 1, array2, 0, array.length - middle - 1);

	// 前半部分を並び替え(再帰的に)
	array1 = mergeSort(array1);

	// 後半部分を並び替え(再帰的に)
	array2 = mergeSort(array2);

	int bindex = 0;
	int array1index = 0;
	int array2index = 0;

	for (int i = 0; i < array.length - 1; i++) {
		if (array1index < array1.length && array2index < array2.length) {
			if (array1[array1index] < array2[array2index]) {
				b[bindex] = array1[array1index];
				array1index++;
			} else {
				b[bindex] = array2[array2index];
				array2index++;
			}
			bindex++;
		}
	}
	if (array1index > array2index) {
		for (int j = array2index; j < array2.length; j++, bindex++) {
			b[bindex] = array2[j];
		}
	} else {
		for (int j = array1index; j < array1.length; j++, bindex++) {
			b[bindex] = array1[j];
		}
	}
	return b;
}

バブルソート(基本交換法)のソース(Java)

バブルソート(基本交換法)のアルゴリズムJavaで実現したときのソースです。
バブルソートってどんなものかっていうのは、他のサイトをあたってください。
バブルソートにはいくつかのパターンがありますが、今回紹介するのは、大きな数値を右に持っていくものになります。

public static int[] bubbleSort(int[] input) {
	int[] array = input;
	int temp;
	for (int j = 1; j < array.length; j++) {
		for (int i = 0; i < array.length - j; i++) {
			if (array[i] > array[i + 1]) {
				temp = array[i + 1];
				array[i + 1] = array[i];
				array[i] = temp;
			}
		}
	}
	return array;
}