【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読み込み操作
- wiki
- 【Ruby】CSVをデータベースのように扱う
- Ruby 2.7.0 リファレンスマニュアル
- 【Ruby入門】CSVファイルの読み込み・書き込み
CSVとは?
- Comma Separated Valueの略です。
- データがカンマ(,)で区切られていて拡張子が.csv
ヘッダ行
- ファイルの先頭には、オプションとして、通常のレコードと同一の書式の「ヘッダ行」があってもいい。ヘッダ行は、他のレコードと同じ個数のフィールドを持ち、フィールドの名称が書かれている。
ヘッダの注意点
- 日本語のヘッダは表示されない
- CSV.table では日本語のヘッダは表示されない
- ruby csv読み込み時に、ヘッダー情報を取得するには
- Ruby で CSV を扱う際に便利な gem である SmarterCSV
RubyからCSVを扱う
標準添付ライブラリがあるのでrequire '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(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.