Hoge Fuga Tech

Hoge Fuga Tech

プログラミング、サーバー、ネットワーク、IT用語、ハマったときのトラブルシューティングなど様々なIT関連の話題をひたすら書いていく技術ブログです。

Featured Posts

Sports

2017年11月14日火曜日

Githubを使った開発フロー


Githubの開発フロー

Githubはコマンドがたくさんありますが、意外と開発をするときにメインで使うコマンドが限られています。ここでは、最低限これだけ知っていれば開発できるように、手順とコマンドを紹介します。
(Githubが使える前提で話を進めます)

Githubを使ったローカル作業


1. git branch (自分の場所を確認、自分がいるところに「*」がついてる)

2. git checkout master (ローカル側のmasterにいなかったら移動する。「git checkout branch名」とすると「branch名」にも移動できます)

3. git pull (githubサーバーのmasterから最新状態のプログラムを取ってきて、ローカルのmasterに取り込む)

4. git checkout -b ブランチ名 (ローカルのmasterを最新状態にしてbranchを切る。ブランチ名は任意だが、そのときに何を開発するかを表しているとわかりやすい。ログイン機能なら、login_functionといった感じです)

5. branch側で開発作業を行う (masterで開発しないように気をつけましょう)

6. git statusで今回編集したファイルの一覧を確認する。

7.git diff #6で表示されたファイル名で、今回編集した差分が確認出来る。

8. (開発完了or複数機能があってキリの良いところで) git commit -am "ここに何の開発/修正をしたかを書く" (オプションaは変更があったファイル全て、mはメッセージ)
※git commit -amは既存のプログラムファイルを修正した場合で、新規にファイルを追加した場合は明示的に「git add 管理したいファイル名」を行なわなければならない(新規ファイル全てを管理したい場合はgit add -Aのみでok)。git addしたあとのcommitは「git commit -m "メッセージ"」となり-aがいらない。commitとはログ残しのような作業。

9. git push origin branch名 (commitしたらgithubサーバーにローカルbranchをアップロードする。github側にもローカルと同じようにbranchができる。originとはファイルのアップロードするサーバー名のこと(気にしなくて良いです))

これでローカル側の作業は終わりです。

github側の作業

10. pull requestを作成する (プログラムをチェックしてもらうため、修正があったら5に戻る。同じbranchで修正を行えば、再度pushしたときにこのpull requestに修正が追加されていくのでご心配なく)

11. githubサーバー側のmasterにbranchをmerge(マージ)する (最後にgithubサーバー側のmasterに自分の修正をmergeします。mergeしたらdelete branchみたいなボタンがあるので、サーバー側のbranchは削除してしまいましょう)

12. githubサーバーのmasterをサービスが動いているサーバー(AWSのEC2など)にリリースする

13. サービスがちゃんと動いているか確認 (失敗すると画面が真っ白になったりしますww)

14. OKなら完了です。次の開発に移る時は1に戻る。ローカル側でbranchがいらなくなったら「git branch -D いらないbranch名」で削除できます。

2017年8月20日日曜日

Javaオブジェクト指向プログラミング(5) - コンストラクタ


前回までのインスタンス化のやり方だと、インスタンス化(new)して、そのインスタンスが持っているフィールドに後から値を代入しています。それはインスタンス化された直後のフィールドはまだ何もデータを持っていないからです。

このような状態だとある不都合が生じる場合があります。例えば前回の侍クラスがゲームのキャラクターだったとしてインスタンス化をしたら、インスタンス直後はHPがないので、死んでいます。その後そのキャラクターを担当した開発者がhpフィールドに値をしっかり設定すれば良いのですが、人間なので忘れてしまうかもしれません。

このような不都合に対応するためにJavaではインスタンス直後に実行される処理を書くことができます。それがコンストラクタ(constructor)と呼ばれるメソッドです。

上記の6行目から8行目がコンストラクタです。このSamuraiクラスをインスタンス化してHPフィールドを表示してみましょう。300が表示されるはずです。下記が上記の侍クラスを呼び出すプログラム例です。

300は表示されましたでしょうか?コンストラクタを定義するかどうかは開発者次第ですが、定義されていたら、そのクラス(この場合は侍クラス)を使う側は呼び出したりすることはありません。あくまでインスタンス化されたときに自動で処理されるメソッドです。

コンストラクタを定義する

コンストラクタを定義
すると上記で書きましたが、そもそもどうやったらコンストラクタになるかを説明します。Javaでは以下の条件を全て満たすとコンストラクタとみなされます。

#1, メソッド名がクラス名が完全に同じ(SamuraiクラスであればSamuraiコンストラクタ)
#2, メソッドの戻り値がない

コンストラクタに引数を渡す



コンストラクタに引数を渡してフィールドなどに設定する値を動的にすることができます。上記のようにコンストラクタに引数を定義すると呼び側(mainクラス)でインスタンス化した時に、引数が求められます(ないとエラーになります)。

コンストラクタのオーバーロード

上記で引数がないとエラーになりますと書きましたが、実はエラーを回避する方法があります。それはコンストラクタのオーバーロードです。オーバーロードによりコンストラクタを複数定義できます。どのコンストラクタが呼び出されるかは引数の数や引数の型・順序などで決まります。複数のコンストラクタがあっても1つしか動作しないので覚えておきましょう。

コンストラクタがないクラスもコンストラクタが自動で追加される

実はどのJavaのクラスも、インスタンス時に必ずコンストラクタを実行しなければなりません。つまり、本来であればどのクラスも1つはコンストラクタが定義されていないといけません。しかしJavaの暗黙ルール的なものがあって、コンストラクタを開発者が定義しなくてもプログラムが動くようになっています。そのルールは以下の通り。

1つもコンストラクタがクラスに定義されていない場合、デフォルトコンストラクタがコンパイル時に自動的に追加される。デフォルトコンストラクタとは引数がなく、処理の内容が何もないコンストラクタです。

上記のプログラム例で引数付きにコンストラクタを定義した時に、呼び出し側(mainクラス)で引数を削除するとエラーが起きるのは、引数付きのコンストラクタを定義したため暗黙ルールから外れたからです。

複数コンストラクタがあるときに別のコンストラクタを呼び出す

コンストラクタを複数定義してみると、よくほぼ同じ定義だと思うことや「他のコンストラクタが使えたらな」と思うことがあります。その場合あるコンストラクタから他のコンストラクタを呼び出すことが可能です。下記はそのサンプルプログラムです。


mainクラスからは引数なしでインスタンス化していますので、コンストラクタは引数なしの方が動作します。そのコンストラクタで「this("武蔵");」としている部分がもう一つのコンストラクタを呼び出している部分です。結果引数付きのコンストラクタが呼ばれ、表示は300と武蔵が表示されるはずです。このようにあるコンストラクタから別のコンストラクタを呼び出すことができます。因みにこの「this」と「this.nameなどのthis」は別物です。前者は同一クラスの別のコンストラクタを呼び出すもの、後者は自分のインスタンスを表すものです。

◯「Javaオブジェクト指向プログラミング」シリーズの記事一覧はこちら

2017年8月17日木曜日

Javaオブジェクト指向プログラミング(4) - インスタンスについて覚えておきたいこと


JavaはJVMが準備したコンピュータのメモリ領域で動きます。このメモリ領域をヒープといいます。Javaのプログラムが例えばインスタンス化するとヒープ領域を使い、インスタンス情報を格納します。つまりインスタンスとはヒープに確保された一部のメモリ領域です。

インスタンス生成で何が起こっているのか?

※このプログラムは完全ではありません。説明するため使用するため最低限の実装しかしていません。



まず、「Samurai s」の部分が実行されると、JVMが使用されていないメモリ(ヒープ)に変数sの準備・領域確保します(例:メモリの20番地)。このときはまだインスタンス化されていないのでSamuraiのインスタンスを受け入れる準備だけされています。インスタンス化はnew Samurai()の部分です。このインスタンス化された情報を格納するためにピープの中でインスタンスのサイズに応じて必要なメモリを確保します (例:100〜130番地)。

ここで変数sに入っているのは何でしょうか?実はインスタンス自体が代入されているわけではなく、インスタンスの確保されたメモリの先頭番地が代入されています。上記の例で言うと100が代入されています。変数sの領域には実際のインスタンス情報はなく、「100番を確認してください」という情報がありますので、実際は100番を参照します。このように他の領域を参照させるモノを参照型と言います。そのあとは、名前を書き換えたらHPを書き換えたりしていますが、まず上記の順番(20番→100番)でアクセスして、name部分やhp部分を書き換えます。

インスタンスは独立している

侍クラスのインスタンスが2回生成され、s1とs2に代入されたとします。s1の侍の名前を変えても当然s2には何も影響がありません。注意が必要な場合は下記のプログラムです。


この結果は「ただの侍」が表示されます。なぜかというと変数の中はメモリの先頭番地が入っているからです。Samurai s2 = s1はs1に入っている番地をs2にコピーしているので、s1もs2も同じ侍ということになります。結果、どちらかの変数で名前やHPを変えるともう片方の変数にも影響があるのです。

has aの関係




上記の侍クラスのプログラムは、刀クラス型のフィールドがありますが、問題ありません。なぜ問題ないかというとhas a(持っている)という英文が成り立ち自然だからです。

Samurai has a Katana.(侍は刀を持っている)

この時もKatanaはメモリがしっかり確保され、変数katanaには刀の情報が確保されているメモリの先頭番地が代入されています。この他フィールド以外にも、メソッドの引数や戻り値にクラス型のフィールドを用いることができます。

◯「Javaオブジェクト指向プログラミング(5) - コンストラクタ」の記事はこちら
◯「Javaオブジェクト指向プログラミング」シリーズの記事一覧はこちら

2017年8月15日火曜日

Javaオブジェクト指向プログラミング(3) - クラスの定義のメリット・インスタンス生成方法


クラス定義でできるようになること

Javaはクラスを定義することによって、2つのことが可能になります。1つは作成したクラスからインスタンスを生成できるようになることです。二つ目はインスタンスを代入するための変数の型が増える(利用できるようになる)ことです。これをクラス型変数と言います。

Javaでは変数は何かしらの型を持っています。intやStringといった具合です。これらはJavaの標準的な型でいつでも使える型です。その他にクラスから生み出されたインスタンスを代入するするクラス型の変数が使えるようになります。例えば前回の記事で侍クラスを作成しましたが、Samurai型が利用できるようになります。つまり、クラスを定義することによって、Javaで利用可能な型が増えていきます。定義方法はintなどと変わりません。インスタンスは基本的に、クラス型の変数に入れて利用します。


Samurai s;

クラス型変数はなぜ必要か?

クラス型変数が必要な理由はずばりインスタンスを見分けるためです。侍クラスからたくさんの侍のインスタンスを生成したとしましょう。例えば走れという指示を出した時にクラス型変数がないとどの侍に指示しているのかわかりません。つまりクラス型変数があると以下のようにできます。

Samurai s1;
Samurai s2;
s1とs2は同じ侍クラスから生成されたインスタンスが代入されるとしましょう。上記のようにs1とs2で分かれていればs1に対して指示を送ったり、またはs2にだけに対して指示を送ったりすることができます。

インスタンスの生成・フィールドへ値を代入する、メソッドの利用

インスタンスの生成の基本形は以下のかたちです。

クラス名 変数名 = new クラス名();
Samurai s = new Samurai();

生成されたインスタンスのフィールドに値を代入する場合は以下の通り。

変数名.フィールド名 = 値
s.name = "侍マン";

メソッド使い方は以下の通り

変数名.メソッド名()
s.run();

オブジェクト指向は難しい?

オブジェクト指向というと普段生活でまず言うことのない言葉ですし、難しい印象を持たれがちですが、現実世界に置き換えて考えてみるとわかりやすいかもしれません。例えばhumanという人間クラスを作った時に、人間誰もが名前、性別、年齢、身長、体重などを持っており、それらがクラスのフィールドになります。また、歩く、走る、食べる、飲むなどの行動を取ることができます。その行動をメソッドとしてクラスに定義していくのです。クラスで定義していることは実はほとんどが、実生活や普段の行動などに繋がっていることが多いのです。つまりクラスを定義するときは現実世界で起きていることを真似てみると分かりやすいかもしれません。これがオブジェクト指向の考え方です。

◯「Javaオブジェクト指向プログラミング(4) - インスタンスについて覚えておきたいこと」はこちら
◯「Javaオブジェクト指向プログラミング」シリーズの記事一覧はこちら

2017年8月13日日曜日

Javaオブジェクト指向プログラミング(2) - クラスの定義


まず、クラスの宣言方法ですが、特に難しいことはありません。基本的なかたちは下記のようになります。侍クラスを作ってみましょう。


ドラクエやファイナルファンタジーなどのRPGゲームを想像してみましょう。キャラクターは名前やHP(ヒットポイント)を持っています。では、この侍クラスに名前とHPを追加してみましょう。


クラスに宣言された変数をフィールド(field)と呼びます。

今度はゴーストクラスです。


メソッドを定義する

オブジェクトが様々な処理をするためにはメソッドを定義する必要があります。ここでは侍が何か食べて体力が50回復するというeatメソッドを定義してみましょう。


thisは自分自身のインスタンスという意味を持った特別な変数です。「.」(ドット)は「の」という意味だと思ってください。つまりthis.hpは「このインスタンスのhp」という意味になります。

ここで、クラス名やフィールド名などの命名規則を確認しておきましょう。

クラス名:先頭が大文字の名詞(例:Samurai, Ghost)
メソッド名:動詞。単語が2つ以上のときは2つ目以降の単語の先頭は大文字(例:run, getItem)
フィールド名:名詞。単語が2つ以上のときは2つ目以降の単語の先頭は大文字(例:name, memberList)


◯「Javaオブジェクト指向プログラミング(3) - クラスの定義のメリット・インスタンス生成方法」はこちら
◯「Javaオブジェクト指向プログラミング」シリーズの記事一覧はこちら

2017年4月15日土曜日

RubyのProc - Rubyプログラミング(15)


ここではRubyのProcモジュールについて紹介します。ざっくり言うと、Procsはブロックをオブジェクト化したもので、変数の内部に保存されるメソッドです。はい、何言っているかわからないですよね。

Procのコードサンプル

まずは、シンプルなprocを作成してみましょう。


上記のプログラムを呼び出す方法は2つあります。1つ目は、[]と渡したい引数を使います。

p full_name["Taro", "Yamada"]

もう一つは

p full_name.call("Taro", "Yamada")

Procのプロセスを確認してみましょう。上記のコードでは新しいProcインスタンスを作成して、full_nameという変数にそのインスタンスをアサインしています。Procはパラメーターとしてコードのブロックを取ることができます。ここではfirstとlastという2つの違った引数をProcに渡しています。その引数はProc内に進んでいきます。Proc内ではなんでもできます。このケースでは単純に、firstとlastを表示しています。

また、下記のような方法でもProcを作成できます。


Taroと5回表示されると思います。

ブロックとは?

この記事の最初にProcは「ブロックをオブジェクト化したもの」と書きましたが、ブロックとはなんでしょうか?他のプログラミング言語ではブロックをクロージャーなどど呼んでいます。ブロックを使用して一連の流れをグループにして、何かの処理をカプセル状態にすることができます。

Rubyでは2つの方法でブロックを作成できます。

Curly braces

Curly bracesとは「{}」のことです。

add = Proc.new { |x, y| x + y}
add[1,2]

上記を実行すると3が返ってくるでしょう。curly brancesの内側のコードがブロックの内部です。

do...end

もう一つの方法は、do...endを使う方法です。

add = Proc.new do |x, y|
x + y
end

add[1,2]

2つとも同じ結果になるでしょう。

なぜProcを使うのか?

メソッドでほぼ同じことが実現できるのに、なぜProcを使用するのでしょうか?それは通常のメソッドより柔軟性を与えてくれるからでしょう。Procだと一連の流れ(メソッドの内容)を変数に保存することができて、プログラムのどこからでもその変数を呼び出すことができることが大きなメリットでしょう。

◯「Rubyプログラミング」シリーズの一覧はこちら

2017年4月4日火曜日

Ruby on Railsのマイグレーションファイルでカラム名を変更する


一度作成してしまったテーブルのカラム名を変更したい時がありますよね?データが既に入っている場合などは、テーブルをdropして再度作り直すのは少々面倒です。ここでは、Railsのマイグレーションファイルで、カラム名を変更する方法を紹介します。今回はusersテーブルにあるusernameをuser_nameに変更する例を見ていきます。

rails generateコマンドでマイグレーションファイルを作成

まずはじめに、rails generate(gのみでもok)でマイグレーションファイルを作成します。

rails g migration rename_username_to_users

コマンドが成功するとdb/migrateディレクトリ以下にマイグレーションファイルが作成されます。

マイグレーションファイルに変更内容を書き込む

次に先ほど作成したマイグレーションファイルを以下のように編集します。


rake db:migrateでマイグレーションファイルを実行する

最後のrake db:migrateコマンドでマイグレーションファイルを実行します。成功するとusersテーブルのusernameがuser_nameに変更されているのが確認できると思います。

◯Ruby on Railsのマイグレーションファイル関連の記事はこちら

最近の投稿