技術系ブログ

とにかく小ネタで

【SQL】攻略(初心者)

私が利用した教材&順序

攻略方法

まずはselect * from テーブル名;で全ての列を取得してから少しづつ条件を絞っていく

select * from テーブル名;

条件を指定する場合

select カラム名 from  テーブル名 where 条件式;

比較演算子の種類

=   等しい
>   より大きい
>=  以上
<   より小さい
<=  以下
<>,!= 等しくない
in()  ある値が含まれている場合 
not in() ある値が含まれていない場合
is null 値がnull
is not null 値がnullでない
like  文字列に含まれているか
between..and.... 値が範囲の中に含まれているか  〇〇から〇〇まで

ワイルドカード文字

  • '%'・・・0文字以上の任意の文字列
'中%' '中'で始まる文字列
'%中%' '中'を含む文字列
'%子' '子'で終わる文字列
  • '_'任意の1文字
'__子' なにかしらの2文字から始まり'子'で終わる文字列

取得件数

select * from テーブル名 limit 10,100;
10から100件 11番目から111番目まで

重複を排除した行を数える場合

count(distinct カラム名)

記述順序

1.select
2.from
3.where
4.group by
5.having
6.order by
7.limit

実行順序

1.from
2.where
3.group by
4.having
5.select
6.order by
7.limit

文字列の演算

concat(文字列1,文字列2)
例
select concat(last_name,'',first_name,'様')from users;

MySQLWorkbench使い方

【ruby】アルゴリズム

array = [1,2,3,4,5]
max = array[0]
# puts max
array.length.times{|i|
  if max < array[i]
    max = array[i]
    puts max
  end
}
puts "maxは#{max}"

暫定的に最大値を変数(max)に格納して、他の配列データ一つ一つと比較して、
暫定的なデータよりも小さかったら、何もしない。
暫定的なデータよりも大きかったら、そちらを変数(max)に格納する。という方法でやっていきましょう。

指定の数よりも少ない数を集める

ar = [1,2,3,4,5,6,7,10]
min = []

ar.length.times{|i|
  if ar[i] < 4
    min << ar[i]
  end
}
p min

集めたものを降順に並び替える

ar = [1,2,3,4,5,6,7,10]
min = []

ar.length.times{|i|
  if ar[i] < 4
    min << ar[i]
  end
}
p min.sort.reverse

49点以下を2つ以上取ったの人物を洗い出す

csv = CSV.table("sample.csv")
csv.size.times{|i|
  # p csv[i]
  if csv[i][1..5].select{|n| n <= 49}.size >= 2
    puts "落第#{csv[i][0]}"
  end
5

* csv[i][1..5].select{|n| n <= 49}で49点以下をだし、.sizeで要素数を把握して >=2と比較

# 結果
落第Will
落第Alyssa
落第Carter

それぞれの平均点を出してトップとドベを出す

  csv = CSV.table("sample.csv")
    avg = []
    csv.size.times{|i|
      avg << {avg: (csv[i][1..5].sum / 5.00).round(2)}
      csv[i] << avg[-1]
    }
    csv.size.times{|n|
      if csv[:avg].min == csv[n][6]
        puts "#{csv[n][0]},#{csv[n][6]}"
      end
    }
    csv.size.times{|n|
      if csv[:avg].max == csv[n][6]
        puts "#{csv[n][0]},#{csv[n][6]}"
      end
    }
  • まずは(csv[i][1..5].sum / 5.00)でそれぞれの平均点をだし.round(2)で小数点以下2 桁の四捨五入をし、それを予め作っていたavg = []にheader付きで格納。
  • それから、csv[i]avgの最後の要素のavg[-1]を追加する。
    これでcsv[0]なら#<CSV::Row name:"Adam" mathematics:100 science:80 english:60 japanese:50 history:40 avg:66.0>という感じになる。
  • 平均点のドベはとドベを取った人を紐付けるには、行数が同じでになればいいので csv[:avg].min == csv[n][6]で互いに最小数が同じなときは行数も同じなのでこれでOK
  • トップも同じように出せる
# 結果
Carter,21.0
Catherine,93.6

【ruby】csv読み込み操作

RubyからCSVを扱う

標準添付ライブラリがあるのでrequire 'csv'で使える。

実際にやってみよう!

  • ローカル環境にmain.rbsample.csvを同じディレクトリに作成
  • sample.csvにデータをコピペ
  • テストの点数表をで試してみます。
#sample.csv
name,Mathematics,Science,English,Japanese,History
Adam,100,80,60,50,40
Will,34,77,43,90,30
Alyssa,66,78,33,99,1
Eve,89,56,45,89,100
Emma,55,90,68,96,92
Carter,13,16,17,24,35
Gabrielle,55,78,56,54,57
Quinn,76,78,75,79,69
Catherine,99,96,90,94,89

CSVファイルの読み込み

一行ずつ読み込む(foreach)

# main.rb
require 'csv'

CSV.foreach("sample.csv") do |row|
    p row
end
  • ターミナルでruby main.rbを実行
#結果
["name", "Mathematics", "Science", "English", "Japanese", "History"]
["Adam", "100", "80", "60", "50", "40"]
["Will", "34", "77", "43", "90", "30"]
["Alyssa", "66", "78", "33", "99", "1"]
["Eve", "89", "56", "45", "89", "100"]
["Emma", "55", "90", "68", "96", "92"]
["Carter", "13", "16", "17", "24", "35"]
["Gabrielle", "55", "78", "56", "54", "57"]
["Quinn", "76", "78", "75", "79", "69"]
["Catherine", "99", "96", "90", "94", "89"]

p,puts違い

p・・・引数のオブジェクトをわかりやすく標準出力に出力。
デバッグ用です
文字列ならダブルクオートで囲まれる
puts・・・引数のオブジェクトを文字列に変換し、改行を加えて標準出力に出力。

一列目を取り出す

  • 配列なので要素の指定もできます。
# main.rb
require 'csv'

CSV.foreach("sample.csv") do |row|
    puts row[0]
end
  • ターミナルでruby main.rbを実行
#結果
name
Adam
Will
Alyssa
Eve
Emma
Carter
Gabrielle
Quinn
Catherine

全体を読み込む(read)

# main.rb

require 'csv'
p CSV.read("sample.csv")
  • ターミナルでruby main.rbを実行
#結果
[["name", "Mathematics", "Science", "English", "Japanese", "History"], ["Adam", "100", "80", "60", "50", "40"],
 ["Will", "34", "77", "43", "90", "30"], ["Alyssa", "66", "78", "33", "99", "1"], ["Eve", "89", "56", "45", "89
", "100"], ["Emma", "55", "90", "68", "96", "92"], ["Carter", "13", "16", "17", "24", "35"], ["Gabrielle", "55"
, "78", "56", "54", "57"], ["Quinn", "76", "78", "75", "79", "69"], ["Catherine", "99", "96", "90", "94", "89"]
]
  • 二次元配列に値が格納されているのでより細かく抜き出せる

    一行目を取り出す

# main.rb

require 'csv'

require 'csv'
puts CSV.read("sample.csv")[0]
  • ターミナルでruby main.rbを実行
# 結果
name
Mathematics
Science
English
Japanese
History

Adamを取り出す

# main.rb

require 'csv'

puts CSV.read("sample.csv")[1][0]
                        #[行数][列数]
  • ターミナルでruby main.rbを実行
# 結果
Adam

tableメソッド

  • tableメソッドは、「ヘッダー」「列」「行」の三つを取得できるメソッド
  • これが一番便利らしい。
# main.rb
require 'csv'

csv = CSV.table("sample.csv")
p csv.headers
p csv[1]
p csv[1][0]
p csv[:name]
  • ターミナルでruby main.rbを実行
p csv.headers
  →[:name, :mathematics, :science, :english, :japanese, :history]
p csv[1]
  →#<CSV::Row name:"Will" mathematics:34 science:77 english:43 japanese:90 history:30>
p csv[1][0]
  →"Will"
p csv[:name]
  →["Adam", "Will", "Alyssa", "Eve", "Emma", "Carter", "Gabrielle", "Quinn", "Catherine"]

応用編

# main.rb
require 'csv'

csv = CSV.table("sample.csv")

p csv.size
p csv[:science].sum
p csv[:science].sum / csv.size
p csv[0].size
p csv[0][1..5].sum / 5
p csv[0][1..5].sum
p csv[0][1..5]
p csv[0][1..5].size
[length、size、count メソッドの違いまとめ【Ruby】](https://qiita.com/motoki4917/items/ffc89d955e20b91d1014)
length と size は同じ。エイリアス。
機能としては下記のように配列の要素数、ハッシュの{key: value}のセット数、文字列の文字数を数値で返す。
全要素数、全{key: value}セット数、文字数を返す。それたけ。

結果
p csv.size
9
p csv[:science].sum
649
p csv[:science].sum / csv.size
72
p csv[0].size
6
p csv[0][1..5].sum / 5
66
p csv[0][1..5].sum
330
p csv[0][1..5]
[100, 80, 60, 50, 40]
p csv[0][1..5].length
5

追記

# main.rb
require 'csv'

csv = CSV.table("sample.csv")

csv.size.times{|i|
  p csv[i][1..5]
}
結果
[100, 80, 60, 50, 40]
[34, 77, 43, 90, 30]
[66, 78, 33, 99, 1]
[89, 56, 45, 89, 100]
[55, 90, 68, 96, 92]
[13, 16, 17, 24, 35]
[55, 78, 56, 54, 57]
[76, 78, 75, 79, 69]
[99, 96, 90, 94, 89]

この辺が限界ですね。

【rails】フォロー機能。 非同期編

前回まで
技術系ブログ【rails】フォロー機能。 - 技術系ブログ

非同期詳細  【rails】いいね機能 非同期編 - 技術系ブログ

remote:tureを追加

そしてjqueryで拾えるようにidを追加

#app/views/relationships/_form.html.slim

#follow
  =button_to current_user.active_relationships.build, params: { followed_id: @user.id }, remote: true do
    | フォローする
#app/views/relationships/_unform.html.slim

#unfollow
  =button_to current_user.active_relationships.find_by(followed_id: @user.id), method: :delete, remote: true do
    | 解除する

これでボタンを押すとapp/views/controller名/アクション名.リクエストの形式.js.erbを探すようになるので

.jsファイル作成

touch app/views/relationships/create.js.erb
touch app/views/relationships/destory.js.erb

#app/views/relationships/create.js.erb

$("#follow").html("<%= escape_javascript(render('users/follow_form')) %>");
$("#followers").html("<%= @user.followers.count %>");
#フォローボタンをの切り替えとフォロー人数の変更を非同期でやる
# app/views/relationships/destory.js.erb
$("#unfollow").html("<%= escape_javascript(render('users/follow_form')) %>");
$("#followers").html("<%= @user.followers.count %>");

コントローラー編

jsファイルのフォーマットがならjsファイルを探すようにする。  

#app/controller/relationships_controller
class RelationshipsController < ApplicationController
  def create
    @user = User.find(params[:followed_id])
    current_user.follow(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end

  def destroy
    @user = Relationship.find(params[:id]).followed
    current_user.unfollow(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end
end

おしまい

CI/CDとは

CI/CDとは

初心者向け説明CI/CID

CI(Continuous Integration)

  • 継続的インティグレーションとはコードの変更を常に自動でテストすること

    CD(Continuous Delivery)

  • 継続的デリバリーとは、テストをパスした変更を いつでも本番環境へリリース可能な状態にしておくこと
CI/CDは1つの技術を指すものでなく、ソフトウェアの変更を常にテストして自動で本番環境にリリース可能な状態にしておく、ソフトウェア開発の手法を意味します。
CI/CDを取り入れると、バグを素早く発見したり、変更を自動でリリースしたりできるようになります。

継続的デプロイ

  • CI/CDのその先、テストをパスした変更を自動で本番環境へデプロイすることでリリースの自動化を行います。

テスト自動化のメリット

GitHubなどのVCS(バージョン管理システム)サービスと連携していて、開発者が変更を加えるたびに、CI/CDが自動でテストを実行してくれます。
また連携するCI/CD上ですべてのテストをパスしないと変更をメインのブランチにマージできないような機能もあり、これを活用すればテストが失敗したとき、その変更点を作成した開発者に修正を強制できるので、リグレッションなどを防ぎやすくなります。

リリース自動化のメリット

  • いかに効率良く最低限の機能を持った試作品を作り、顧客からフィードバックを得るかがスタートアップビジネス成功の鍵

  • MVP(実用最小限の機能)を作り、それをリリースして、フィードバックを得る。このループを素早く繰り返すことで、ユーザーが本当に求めるプロダクトを効率的に開発できるようになります。

  • 10の仮説をテスト環境で検証するよりも、1度のリリースをして本番環境で検証するほうが効率的な場合は多々あります

【rails】本番環境でもエラー文を表示させる

#config/environments/produciton.rb
config.consider_all_requests_local   = true

config関連のファイルを変更したときは,サーバを再起動する必要があることをお忘れなく.

sudo nginx -s reload
おしまい

【エラー解決】Uglifier::Error:To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).

awsへデプロイしたら、productionのlogにタイトルのようなエラーが出たので残しておきます。

解決方法

#config/environments/production.rb

- config.assets.js_compressor = :uglifier
+ config.assets.js_compressor = Uglifier.new(harmony: true)

です。
参考:Rails で ES6 のコンパイルが失敗する場合 - 約束の地   

uglifier の ES6部分におけるエラー [Rails] - ハッキングバカ  

Uglifierとは

jsのコンプレッサーらしいです。ES5ではそのまま使えますが、ES6も含まれる文がある場合は、
上記のようなコードを追加することで、サポートをするらしいです。
GitHub - lautis/uglifier: Ruby wrapper for UglifyJS JavaScript compressor.