railsで作った読書管理アプリをグレードアップさせてみる

前回作った簡易的な読書管理アプリをグレードアップさせてみる。結局もう一回作りなおさないといけないは目になったのだが、現時点で付属されている機能は読んだ本のタイトルが記録できる、読んだ本を一覧で見られる、読んだ本の記録を削除できる、読んだ本の名前の変更ができるだけである。

ここに以下の機能を付属させるところまでやってみる。

  • 読んだ本にコメントをつけられる
  • 読んだ本にスコアをつけられる
  • 関連書籍を設定できる
  • 関連書籍へのサイト内リンクがある
  • 本のタイトルやコメントを空欄で保存できないようにする

以上が余裕だったら

  • 読んだ日時を記録できるようにする
  • 本の画像を保存できるようにして、本の画像も表示されるようにする
  • 友達に本をオススメする機能を作る
  • 読んだ本にタグ付けして、タグごとに本の一覧を見られるようにする
  • ユーザー登録機能をつけて、ユーザーごとに別々に管理できるようにする

"return"というコマンドの理解を通してcodingについて考えてみる


def sayHi(name = "Steve")
s = "hello!" + name
# メソッドは返り値を持たせることも出来る。ここではsが返り値
return s # returnは省略可能
end
ここではdef sayの部分で何も名前を指定しない場合はSteveとなるように設定がなされている。
次の行でsを打つとhello入力した名前(何も入力がない場合はSteve)となるように命令をしてあげる。

# 返り値を持つのでメソッドの結果を代入することが可能
greet = sayHi()
puts greet # hello! Steve

# このメソッドで定義された変数は外からアクセスできない!!
# defとendの間でしかsという変数は定義されていないから
puts s # とやるとエラーを吐く

これはつまりどういうことなのか。要するに各ファイルというのはパソコンに流した時にどう出力されるのかをこちら側で指定する必要があるわけである。もっと簡単に説明するために以下の例を見てみる。Controller.rbというファイルに以下のコーディングがなされていたとする。

def test
p'hello'
end #ここまでをpart1と呼ぶことにする

p world

def world
return 'world'
end # part1の終わりからここまでをpart2と呼ぶことにする

def hoge
w = 'yeah'
h = 'hey'
z = 'god...'
return h # return hがないと'god...'出力されてしまう
end
p hoge # part2の終わりからここまでをpart3と呼ぶことにする

このままパソコンに流すとpart1は何も出力されない。testというアクションがどこにも定義されていないからである。これはまるでパソコンに向かって「testというアクションがあるからhelloとプリントしてね」と言っていることと同じである。現実の世界ではこいつが何をしようとしているか大体の検討がつくがプログラミングの世界では「testというものがこういうものでこのコマンドを入力するとこのように出力されるという詳細な流れを書かなければならないのである。
part2はこのファイルで一番最初に出力される部分である。ファイルをコンピュータに流すとコンピュータは上からコードの出力を行うのだが、part1が出力されないため一番最初に出力されるのはpar2の部分。つまりworldである。これはあえてp worldを最初に書いたのだが仮にコンピュータが定義なしのworldを確認したとしてもその下にちゃんとworldに戻ってくるように定義されているのである。(これを返り値と呼ぶ)
part3は結果としてheyが出力されるようになっている。しかしもしreturnというコマンドを消したとしたら出力される値は'god...'である。何故かと言うとコーディングは上から下にかけて順番に読み込んでいく特性があり、正確な定義やコマンドが無い限りはその方法によって情報が出力されるからである。

グループディスカッションをする時の基本

大学三年生だしせっかく日本に一時帰国してるわけだし就活は多分いづれするんだろうと思ったので個人的に一目置いているgoodfindが主催しているセミナーに何個か参加してみた。そこで行われたグループディスカッションにていくつかフィードバックを貰ったのでここにメモっておく。ちなみにディスカッションのお題は「東京に観光客を増やす具体的な策を考えなさい」を15分で行われた。人生初のグループディスカッションだったが人一緒にと物事を考えて具体的な策に仕上げてくっていう作業めっちゃ面白いな(笑)就活やったことないし、全くの無知だったので馬鹿にしてたけどめっちゃ面白いな。
お題にもよるのだがグループディスカッションの基本的な流れは「ターゲットの特定化」「問題や原因の特定化」「その原因に対して何ができるか」「それに対する解決策」「解決策のプライオリティ決め、実現可能性の考慮」というのが常。このお題に沿って考えるとするならば、「世界中のどの層をターゲットとするのか」を考え、「彼らが今東京に来ない理由、問題」を特定し解決策を練っていくという流れである。もっと言うと「現状把握」「原因の深掘」「真の課題」「それらを何かの軸を持って優先順位づけ」「目指す姿の構築」「対応策の具体化」と言った具合であろう。以下が実際にもらったフィードバック一覧。

  • もっと深く定量的に考えるようにする(何となくはダメ)
  • 共通項を探すクセをつけると考えやすい(金持ちが多いetc)
  • 現状分析をもっと丁寧に
  • 問題を細分化する
  • 何かの軸を持って優先事項をつける(もちろん確固とした根拠を持つ軸)
  • 仮説を持つことを意識する(思い込みは危険)

特に一番危険な考え方が「思い込み」である。「中国人は金持ちが多いから」とか「東京は外人が多い」といった根拠のない考え方をベースに物事を考えると思考の浅はかさが露呈される。「何をもってして金持ちと定義するのか」や「何をもって多いと言えるのか」といったことをしっかりと考えぬいた上で議論に進むのが大前提である。面白かったなーグループディスカッション。俺も個人的に毎日こういうの自分にお題を課してやりたいなーとか思ったりしてる。

参考URL:
トップ企業人事のGDチェックリスト10
議論を混乱させる“クラッシャー就活生”出現!グループディスカッションで巻き添え不合格にならない方法

追記:
知り合いから色々と教えてもらいつつ自分でそれを実践した結果、グループディスカッションでは頭の使いドコロを考えることが大切だということがわかった。以下にそれをまとめておく。フレームワークなりルーティンなり持ってるとめっちゃ楽だな(笑)ってか逆にこんなんで企業って人のコミュニケーションとやらを図っているのか。。

  • 「じゃあ何からやりましょうか」と話すのが大切
  • ホワイトボード占領すると受かりやすい
  • 疑問を投げかけまくる
  • 「まずの議論の流れを決めまっしょか」
  • もし決まってるのなら「◯◯と◯◯が」
  • 「僕のブレスト、意見の絞込と磨き込みと結論のまとめだと思うんですけど、他なんかありますか?」
  • 口癖のように名前を覚えておく
  • 始まる前に名前を最低一つは覚える
  • 話が一度終ろうとするときに「それっていいよね」って大声で言うと効果的でそのキーワードを抽出して
  • 基本褒める
  • 「俺もそれで言いたいことあるんだけどさ、今大丈夫っすか?」
  • 「今のこれとこれでだいぶ出揃ったと思うんですけど、みなさん他にありますか」
  • 新規事業は場を支配しないと難しい。
  • ユーザー(ターゲット)を完全に決めきると勝ちパターン。
  • 「俺らと超近い人にしよう」班にいるひとに聞いてみる、その人の経験を引き出す
  • サービスつくるのはヒヤリングから始まるからグループ内のそれっぽいメンバーにいきなり質問してそのニーズを完璧に埋めるようなサービスを作る。
  • IT系とか広告系はちゃんと議論することを意識した方がいい。
  • リーダーでもまとめようとすると失敗するケースが30分の中で一個はあるはずだからそこをつく。
  • 自分で辺りざわりのない意見を3つくらい言って皆にふる
  • 例えばお菓子関係のユーザーに「俺お菓子買わないから全然わからないんですよねー」で持って行って「他にお菓子買ってる人います?」でみんなに意見を振る。
  • まとめるタイミングで一回まとめて他に意見あるとか足らないところあると思う?とかって聞いてみる。
  • 「振ってべた褒めする」が一番基本。

サーバーについて

Railsを使うときに必ずと言っていいほど使用するコマンドの一つとして「rails s」というコマンドがあるこれは「rails server」の略なのだが、これは一体どういうことかというのを簡単に説明しようかと思う。Railsを学んだことがある人ならローカルホストに書かれている「welcome aboard」に親近感を持つ人も多いかと思うが、要はrailsを導入することによって自分のパソコンをサーバーにしているのだ。つまりrailsでいうlocalhost/3000というのはrailsを起動した後にちゃんとサーバー上にアクセスできるかというテストでもある。各サーバーにはパソコンと同じようにファイルが何個もありユーザーがそれを取捨選択してアクセスしているというイメージである。ただ自分のパソコンをサーバーとして用いる難点としては一度パソコンを閉じてしまうとサーバーも閉じてしまうということである。なので今となっては当たり前だが通常はレンタルサーバーを借りたり最近ではアマゾンが世界のどこかででっかいサーバーのある工場を持っておりそれをクラウド上でユーザーに貸しているとか。これを行うことによってサーバーを24時間動かし続けられるのである。
ちなみにサーバーにアクセスしたユーザーはqueneというリストによって先着順でアクセスできるようになっている。これがあまりにも人が多すぎてリストがパンクしたり、ユーザーは30秒以上待つと長いと思って切ってしまうらしいのでそういった行為が多発するとサーバーのシャットダウンに繋がったり、サーバーが極限に暑くなって物理的な故障に繋がってしまう。噂によるとサーバーを北極に置いているらしい…。

Ruby on Railsという概念

今やっているRORの基本のきくらいの感覚は大体掴んできた気がするのでこの機会にまとめてみようかなと思う。Ruby on RailsとはRubyを使ってRailsのルールに従って書く言語であるらしい俺もたった今さっきわかったwもっと詳しく説明するとRailsとはwebアプリケーションを作るためのフレームワークRails式のやり方で色々と行われている。
RailsにはDRYとCoC基本的な設計哲学というものがありDRYは"Don't Repeat Yourself"の略でCoCは"Convention over Configuration"という意味である。DRYは要するにコードの重複は避けましょうという意味でCoC柔軟性は維持しつつ出来るだけシンプルに。機会的な作業を増やすことによって不用意で無意味な決断などをどんどん排除しちゃいましょうっていうことである。もっと具体的に言うとRORでは最初に規約を書き上げてそれに伴って部品を組み立てていくという仕組みになっているのでまあやってみるとその哲学が手に取るようにわかるという感じ。
RailsにはMVCアーキテクチャという設計パターンに則ってプログラミングを行う。Mはmodel、VはView、CはControllerの略でありものすごく簡易的に言うと、バックエンドでModelを使ってデータベースからデータを引っ張ったり必要なデータを取ってくる作業を行い、Controllerで個々のリクエストに応じた処理を行い(railsアプリケーションの中核)、Viewを介してウェブ上に表示される内容をいじるといった具合である。Railsで何を作るにしてもデータが行き交う道筋をこの3つを通して作っていくいかなければならないというわけである。
先程から出ていてるデータベースという言葉についてだが、Rails(というか多分どの言語を使うにしても)データベースを持っていく必要がある。なぜかというと単純にデータベースがないとデータを貯蓄できないからである。もっと厳密に言うとRailsは一時的にデータを保存するのだがユーザーがそのページやアプリケーションを閉じた時点で自動的に削除されてしまう。そうならないように予めデータベースを構築しておく必要があるのだ。詳しくはこちらを参照。
一通り概念的なアプローチでRORを少し砕いて説明してみたけれども次回は実際にRORがどういった流れで動いているのかについて書いてみることにする。

Rubyを使って初歩的なことを色々やってみる#2

Sublime textが使いやすすぎていやというかこのブログだとhtml形式すらも打ちにくすぎて一回テキストでメモってから一気にこっちに貼り付けるっていう手法があまりにも楽ちんすぎるので…。


# ハッシュオブジェクトについて
# ハッシュは配列と同じように複数の値を管理するものだが、配列は値だけ管理するのに対してハッシュはそれにプラスして識別キーをつけることが可能
# 数値だけではなくそれが誰の売上だったのかを管理したい場合
sales = {"xxx" => 200, "yyy" => 300}
p sales["xxx"] # 200
# ちなみにキーが文字列だった場合にシンボルという書き方も可能
sales = {:xxx => 200, :yyy => 300} # こっちのほうが動作処理が早く広く使われている
sales = {xxx: 200, yyy: 300}
p sales[:xxx] # 200
# 以上の文は全て同じ意味
p sales.size # 要素数 2
p sales.keys # keyだけを返してくれる [:xxx, :yyy]
p sales.values # valueだけを返してくれる [200, 300]
p sales.has_key?(:xxx) # keyがあるかどうかを真偽値で返す true

# オブジェクトを相互に変換する方法
a = 10
b = "5" # 5というオブジェクト、数字ではない
p a + b # これを足し算してもオブジェクトが違うのでエラーになる
p a + b.to_i # 文字列を整数値に直したい場合 15で返ってくる
p a + b.to_f # 実数にしたい場合 15.0という形で返ってくる
p a.to_s + b # aの10を文字列に変えて105と連結させたい場合
h = {xxx: 100, yyy: 200} # ハッシュと配列の相互変換。これで配列に直ったよ
p h.to_a # [[:xxx, 100], [:yyy, 200]]
p h.to_h # ハッシュへの変換 {:xxx=>100, :yyy=>200}

# %記法 文字列や配列の別の書き方
s = "hello"
s = %Q(hello) # ちなみに括弧のところは記号でも波括弧でもよい。ダブルクオーテーションの場合は大文字のQを省略してもよい
s = "hel\"lo" # 文字列の中で"を使いたい場合は文字列との区別をつけるためにバックスラッシュをつけなければならない
s = %Q(hel"lo) # ただこちらの場合はバックスラッシュは要らない

s = 'hel\"lo'
s = %q(hel"lo) # シングルクォーテーションの場合はQを小文字に変える

a = ["a", "b", "c"] # 要素が文字列の時に%を使える
a = %W(a b c) # 上記と全く同じ意味

a = ['a', 'b', 'c'] # シングルクォーテーション
a = %w(a b c)


=begin

条件分岐 if

if 条件

else

end

> < より大きい、より小さい
>= <= 以上、以下
== != と等しい、と等しくない

それらの条件を組み合わせるための
&& (AND)

(OR)

! (NOT)

=end

socre = 80
if socre > 60
puts "Ok!"
elsif score > 40
puts "SOSO..." # それ以外で40より大きかったらこの処理。50点にvalueを変えるとSOSO...と出てくる
else
puts "NG!"
end # OK!と出るはず。これが60以下だとNG!となる

score > 40 && score < 60 # スコアが40より大きくて60より小さい

socre = 80
if socre > 60
puts "Ok!"
end
# 以上の式を短く書くためには
score = 80
puts "OK!" if score > 60 # OK!

# 真偽値と条件演算子
if x # == trueという演算子が省略されている。rubyならでは
puts "..."
end

=begin

true: それ以外 (0 '' を含む) *他の言語だと0とか空欄でもfalseになるがrubyは違うので注意
false: false nil(オブジェクトが存在しない)

条件演算子を使ってif else文を楽にかける
if 条件
a = b
else
a = c
end
を簡単に書くと、

a = 条件 ? b : c

=end

b = 10
c = 20
a = b > c ? b : c
puts a # 大きかった方をaに返す 20

b, c = 10, 20 # 多重代入

# 条件分岐 case
=begin
あるオブジェクトをいくつかの値と比較しながら処理を振り分けていく時に使える構文
頑張ればifels文でもかけるがこっちのほうがスッキリして見える

case 比較したいオブジェクト
when 値
処理
when 値
処理
when 値
処理
when 値
処理
else
処理
end
=end

signal = "red" # 信号の色によって処理を振り分ける

signal = "pink" # wrong signalと出るはず

case signal
when "red"
puts "STOP!"
when "green", "blue" # 複数指定可能
puts "GO!"
when "yellow"
puts "CAUTION!"
else
puts "wrong signal"
end

# 繰り返し処理
# times
# while
3.times do
puts "hello"
end # hello hello hello

3.times do |i|
puts "#{i}: hello"
end #で回数付きでhelloを表示してくれる。もちろん0から

i = 0
while i < 3 do
puts "#{i}: hello"
i += 1
end # 上記と全く同じ結果になる

# break: ループから抜けるための命令
# next: ループを一回スキップ

3.times do |i|
if i == 1
break
end
puts "#{i}: hello"
end # 0: hello 1以降処理がされてない

3.times do |i|
if i == 1
next
end
puts "#{i}: hello"
end # 1がスキップされて2になっている

# for
# each
for i in 0..2 do # 012を繰り返し表示させたいときのfor構文
puts i
end # 0から2までの範囲の数値を一つ一つiにいれて表示させている

for i in ["red", "blue", "pink"] do # 配列とかハッシュも使える
puts color
end # red blue pinkと表示される
# 配列とかハッシュに関してはforよりeachメソッドを使うことが多い
["red", "blue", "pink"].each do |color|
puts color
end # 上記と全く同じ処理

{"red"=>200, "blue"=>100, "pink"=>50}.each do |color, price|
puts "#{color}: #{price}" # 文字列の中で展開
end # red: 200, blue: 100, pink: 50とでる

# 関数的メソッドを作ってみる 直接的に呼び出せるメソッド

def sayHi # defの後に関数名を適当につけてあげるだけ
puts "hello!"
end

sayHi() # メソッド名の後に()をつけてあげることでメソッドと識別可能。hello!とでる

def sayHi(name) # メソッドにはオプションを持たせることが出来る。複数持っている場合はカンマ区切りで指定
puts "hello!" + name
end

sayHi("Tom")
sayHi("Bob")
# hello! Tom hello! Bobとなる

def sayHi(name = "Steve") # 引数には初期値を設定できる
puts "hello" + name
end # nameが設定されていない場合はSteveという初期値を使ってくれる

sayHi() # とするとhello! Steveとなってくれる

def sayHi(name = "Steve")
s = "hello!" + name # メソッドは返り値を持たせることも出来る。ここではsが返り値
return s # returnは省略可能
end
# 返り値を持つのでメソッドの結果を代入することが可能
greet = sayHi()
puts greet # hello! Steve

# このメソッドで定義された変数は外からアクセスできない!!
puts s # とやるとエラーを吐く

データベースのバックアップと復元

「mysqldump -u dbuser -p blog_app > blog_app.dump.sql」と打ってバックアップ。ちなみに最後のところは分かりやすい名前.sqlで大丈夫。「less blog_app.dump.sql」で確認可能。
バックアップファイルを復元するときは外部ファイルを取り込む時とほぼ同じやり方。「mysql -u dbuser -p blog_app < blog_app.dump.sql」でおっけー。