TECH 　DAY　6

勉強した項目：　git, Github, scraping
時間： 10:00
内容：

＊学習アウトプットです。なにぶん間違いなんかもあります。気をつけますがその際はご指摘いただけますと幸いです＊

###[Git]
Gitはソースコードの変更履歴、バージョン等を記録するツール
最大の特徴は、分散型の名の通り、ローカル環境に、全ての変更履歴を含む完全なリポジトリの複製が作成されるということである。　　　　
（リポジトリ：複数のデータや情報などが体系立てて保管されているデータベース）

###[Github]
Gitの仕組みを利用して、世界中の人々が自分のプログラムコードやデザインデータなどを保存、公開することができるようにしたウェブサービスの名称である。
エンジニアの履歴書のような役割

###[git clone]
外部のサーバーにあるGitで管理されたソースコードを自分のパソコン（ローカル環境）にダウンロードするコマンド
`git clone リポジトリURL ディレクトリ名`という形でターミナルで実行する

###[lsコマンド]
lsコマンドは`linux`コマンドの一つ
lsコマンドを使用すると、現在のディレクトリにあるファイルを表示することができる、`lsは「list segments」`の略

###[bundlerによるgem管理]
bundlerを利用してインストールしたgemは、Railsの各プロジェクトではなく、Rubyのバージョンごとにある保存場所にインストールされる
`bundle show [gemの名前]`というコマンドを実行でどこに保存されているのか確認することができる

###[bundle execコマンド]
bundle exec は2つ以上のrailsアプリケーションを同じバージョンのRubyを利用して作成している際に必要となるコマンド
→同じRubyのバージョンで複数のアプリケーションを開発していると、同じ名前のgemでもアプリケーションごとにバージョンが異なることがあるため

###[スクレイピング]
ウェブサイト上のHTMLからある特定のデータを抜き出す処理のこと
→　<ul><li>の中にある値を取り出すこと

###[Mechanize]
スクレイピングを行うためのGem
Mechanizeクラスが使えるようになり、スクレイピングをするための様々なメソッドが存在する

Gemfileの最後の行に

```ruby:Gemfile
gem 'mechanize'
```
記載する。
Gemfileに記述されたGemをインストールするにはターミナルでコマンド`bundle install`を打ち込むことを忘れないようにする。

###[getメソッド]
Mechanizeクラスのインスタンスメソッド
get("スクレイピングしたいウェブサイトのURL")と引数にURLの文字列を指定することで、そのURLのウェブサイトのHTMLを取得できる

```ruby:
 agent = Mechanize.new
  page = agent.get("http://naru-taka-kokua.com") # naru-taka-kokua.comのHTMLを取得
```

pageは単なるHTMLの文字列ではなくそのウェブサイトのHTMLの情報を持った`Mechanize::Pageオブジェクト`である

###[searchメソッド]
getメソッドで取得したページの情報が入ったオブジェクトに対して使用
→取得したウェブサイトのHTML情報の中から指定したHTML要素の内容を検索できる

```ruby
elements = Mechanize::Pageオブジェクト.search('セレクタ')
```
引数のセレクタとはCSSのようにHTMLのタグの要素名を指定し、`'h1'や'li a'`のような指定
クラス名でも`.hoge`のように指定することができる

```ruby
  agent = Mechanize.new
  page = agent.get("http://naru-taka-kokua.com/")
  elements = page.search('h2')
 # h2要素を検索
  puts elements
```

###[inner_textメソッド]
`searchメソッド`で得られたHTML情報のテキストを取得したい場合、`inner_textメソッド`を使う

```ruby
 agent = Mechanize.new
  page = agent.get("http://naru-taka-kokua.com/")
  elements = page.search('h2 a') # h2要素の下のa要素を検索
  puts elements
```

###[get_attributeメソッド]
`aタグ要素`のHTMLはリンク先のURLを値とする属性`href`を持っているので、このHTMLの属性の値を取得したい場合、`get_attribute`メソッドを使う

```ruby
  agent = Mechanize.new
  page = agent.get("http://naru-taka-kokua.com/")
  elements = page.search('h2 a') # h2要素の下のa要素を検索

  elements.each do |ele|
    puts ele.get_attribute('href') # puts ele[:href]としても良い
  end
```

###[スクレイピングの手順 簡潔に]
1/Mechanizeクラスのインスタンスを生成
2/Mechanizeクラスのインスタンスメソッドget(情報を取得したいウェブサイトのURL)で、ウェブサイトのHTML情報を取得
3/欲しいデータのあるタグ要素をsearchメソッドで指定して取得
4/取得したタグ要素のHTML情報にたいしてinner_textメソッド、またはget_attributeメソッドを使って欲しい値を取得

実際のHTMLを確認には、`[command] + [option] + [u]`を押してソースコードを表示できる

`element = page.search('.etc div)` の　`etc`がクラス名

###[atメソッド]
searchメソッドと同じようにセレクタを指定して、該当するHTML要素を取得するメソッド
→searchメソッドのように該当するものが複数あってもすべて取得はせず、最初の１つしか取得しない

`ele.get_attribute('src') `は、` ele[:src]` と書くことも可能

###[reload!]
コンソール起動中にコードを修正・追記した際、コンソールはリアルタイムで変更内容を反映してくれないので再起動する必要がある
→これをreload! コマンドを実行すると毎回exitの再起動しなくてもコンソールがコードの変更内容を読み込んでくれる

###[first_or_initializeメソッド]
`whereメソッド`とともに使うことで、`where`で検索した条件のレコードがあればそのレコードのインスタンスを返し、なければ新しくインスタンスを作るメソッド

###[rails generate migrationコマンド]
テーブルにカラムを追加したり、削除するようなテーブルの構造を変えたいときもマイグレーションファイルを作成する

```ruby:ターミナル
  $ bundle exec rails g migration AddRateToApps
  # => マイグレーションファイルの作成
```

これだと、Appsのマイグレーションファイルが作られる

###[add_column]
`add_column`をマイグレーションファイルの`changeメソッド`内に書くとカラムの追加ができる

```ruby
add_column :テーブル名, :カラム名, :カラムの型
```

複数のカラムを追加する場合は段落分けて記述する

```ruby
add_column :テーブル名, :カラム名, :カラムの型
add_column :テーブル名, :カラム名, :カラムの型
add_column :テーブル名, :カラム名, :カラムの型
```

###[remove_column]
changeメソッドではカラムを追加だけでなく削除もできる

```ruby
remove_column :テーブル名, :カラム名, :カラムの型
```
**必ず、マイグレーションファイルを変更した場合は、ターミナルにて `rake db migarate` を実行する**

###[while文を抜け出すのは途中にbrakeを記載する]

###[orderメソッド]
データベースからデータ取得時にデータをどう並び替えるかというのが指定できる

```ruby
 モデル名.order('カラム名 順序')
```

| 実行例 | 詳細 |
|:--|:--|
| App.order('id DESC') | idを降順でAppデータ取得 |
| App.order('id ASC') | idを昇順でAppデータ取得 |

###[limitメソッド]
データをいくつ取得するかというのが指定できるメソッド

```ruby
データをいくつ取得するかというのが指定できるメソッド
```

```ruby
App.limit(20)   #Appを２０件まで取得する
```

`orderメソッド`を使うことによって最新順にデータを取り出すこともできる

```ruby
@app = App.order('id ASC').limit(20)
```

appテーブルをidで昇順に並べ替え、20件だけを取得し、それらを@appという変数に代入している

###[findメソッド]
findメソッドは引数に指定したidにあたる作品情報を1件だけ取得
→もし、そのidにあたる作品が存在しない場合、エラーが発生

例：idが10のappを取得する

```ruby
App.find(10)
# idが10のAppモデルのインスタンスが取得
# or
# idが10のAppモデルのインスタンスがない場合エラー
```

###[rake routesコマンド]
アプリケーションでアクセスできるHTTPリクエストの一覧を見ることのできるコマンド
→HTTPリクエストのメソッド(GET, POSTなど)とパス、それに対応するコントローラとアクション名が確認できる

表示されるコマンド例

```ruby:ターミナル
app GET  /apps/:id(.:format)                     apps#show
```

GETで/app/:id(:format)というHTTPリクエストが呼ばれた時にappsコントローラーのshowメソッドが呼ばれる

###[params[:id]]
HTTPリクエストが送られると、パス(/products/20)から作品idを取得することができる

作品idはパラメーターとして自動的にparamsというハッシュ型の変数に格納されコントローラに送られ、キーは/products/:idのid、バリューはアクセスしたパスの:idの箇所に一致する数字となる

###[LIKE句]
`あいまい`な文字列の検索をすることができるもので、`whereメソッド`と一緒に使う

使い方→

```ruby
モデルクラス名.where('検索するカラム名 LIKE(?)', "検索するキーワード")
```

**曖昧な文字列について**

| 文字列 | 意味 |
|:--|:--|
| % | 任意の文字列(空白文字列含む) |
| _ | 任意の1文字 |

`％ と　_ の位置に注意して`

| 実行例 | 詳細 |
|:--|:--|
| where('title LIKE(?)', "a%") | aから始まるタイトル |
| where('title LIKE(?)', "%b") | bで終わるタイトル |
| where('title LIKE(?)', "%c%") | cが含まれるタイトル |
| where('title LIKE(?)', "d_") | dで始まる2文字のタイトル |
| where('title LIKE(?)', "_e") | eで終わる2文字のタイトル |

###[resourcesメソッド]
対象となるリソース名(コントローラ名)を指定するだけで、Railsのリソースの7つのアクションで記載した7つのアクション名に対してのルーティングが自動的に設定できる

```ruby:config/routes.rb
 Rails.application.routes.draw do
  resources :app: 
```

ターミナルにて bundle exec rake routes コマンドを実行すると7つのルーティングが確認できる

```ruby
 Prefix Verb   URI Pattern               Controller#Action
     apps GET    /apps(.:format)          apps#index
          POST   /apps(.:format)          apps#create
  new_app GET    /apps/new(.:format)      apps#new
 edit_app GET    /apps/:id/edit(.:format) apps#edit
      app GET    /apps/:id(.:format)      apps#show
          PATCH  /apps/:id(.:format)      apps#update
          PUT    /apps/:id(.:format)      apps#update
          DELETE /apps/:id(.:format)      apps#destroy
```

###[resourcesメソッドのネスト]

```ruby:config/routes.rb
resources :apps do
  resources :reviews
end
```

###[form_for]
`form_for`は、特定のモデルを編集・追加するためのフォームを生成するヘルパーメソッド
→特定のテーブルにレコードだけを新規作成、更新するときに利用する

```ruby
<%= form_for(モデルクラスのインスタンス) do |f| %>
…
<% end %>
```

`form_for`内で使うメソッドは、`f.htmlタグ名 :カラム名`の形で指定

| メソッド | 用途 |
|:--|:--|
| f.label | labelのlabelタグを表示　 |
| f.text_field | textのinputタグを表示 |
| f.date_select | モデルで設定したフィールドをselectタグで選べるようにして表示 |
| f.check_box | checkboxのinputタグを表示 |
| f.number_field | numberのinputタグを表示 |
| f.submit | submitのinputタグを表示 |

一部です。

###[form_forとform_tag]
`form_for` と `form_tag` どちらを使うべきかは、基本的にモデルの有無で判断する

form_for→入力フォームで入力するデータのモデルがある　（投稿フォームなど）
form_tag→入力するデータが特にモデルを持っていない　（検索フォームなど）