20210114のRubyに関する記事は23件です。

NoMethodError: undefined method `set_encoding' for

Failures:

  1) Product POST #create ログインしているユーザー productの数が一つ増えていること
     Failure/Error: expect {post products_path, params: product_params }.to change(Product, :count).by(1)

     NoMethodError:
       undefined method `set_encoding' for #<Product:0x0000000007fe4988>

ここからが改善策。まずは直す前

describe 'POST #create' do
??let(:product_params) { FactoryBot.create(:product,title: '新規投稿',user: user) }
    context 'ログインしているユーザー' do
      it 'productの数が一つ増えていること' do
        #ログインする
        sign_in_as(user)
        #POSTで投稿の新規作成,数が一つ増えているかexpect
        expect {post products_path, params: product_params }.to change(Product, :count).by(1)
      end
    end

改善策

describe 'POST #create' do
    #新しいproductを作る
    ??let(:product_params) do 
      { product: {
        title: "四皇",
        language: "PHP",
        detail: "ウオウオの実",
        period: "8年",
        user: user
       }
      }
    end
    context 'ログインしているユーザー' do
      it 'productの数が一つ増えていること' do
        #ログインする
        sign_in_as(user)
        #POSTで投稿の新規作成,数が一つ増えているかexpect
        expect {post products_path, params: product_params }.to change(Product, :count).by(1)
      end
    end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ruby]別のハッシュの値とキーを参照して、ハッシュに値を代入する方法

大したネタじゃないが、自分は最初結構こまったので。

例えば次のようなハッシュがあったとする。

key value
太郎 宮城
次郎 青森
花子 沖縄

これは単純にhash = {"太郎" => "宮城", "次郎" => "青森","花子" => "沖縄"}みたいに書けばいいだけだが、それと別にこんなハッシュもあるとする。

key value
宮城 400円
青森 700円
沖縄 1200円

各県送料がこのくらいなのかはよくわからないのでデタラメな数字なのは勘弁して欲しいが、まぁ各地の送料みたいな表のようなイメージだ。これもref = {"宮城" => 400 ,"青森" => 700 ,"沖縄" => 1200}みたいにかくとする。

これで名前と送料の組のハッシュに変換したいみたいな場合の記述が案外調べても出てこなかったので、備忘録的に。

コメントで頂いた方法

自分は一旦二次元配列になおしてもう一回ハッシュに戻すなんて面倒臭いことをやっていたが、ハッシュの値をすべて直接変更できるメソッドであるtransform_valuesを使ったほうが全然よかった。お教え頂きありがとうございます。

list = hash.transform_values{ |x| ref[x] }

p list
# { "太郎" => 400 , "次郎" => 700, "花子" => 1200 }

もしくは

hash.transform_values(&ref)

でもいいらしい。スマート!

自分でやってた方法

list = hash.to_a.each{|x| x[1] = ref[x[1]]}.to_h 

p list
# { "太郎" => 400 , "次郎" => 700, "花子" => 1200 }

順番に処理したいので、一旦to_aで二次元配列になおして、順番に二番目(x[1])に、refのハッシュのバリューを入れていって、最後はハッシュになおすだけ。

シゴク単純だが、意外とこれ迷うんだよね。ていうかもっと簡単な方法あったりしそうな気がする(ありました)。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

# 誤ってrails db:migrate:dropをした時の対処法

誤って

$ rails db:drop

してしまった時は

$ rails db:reset

で戻す。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】各桁の和を求める方法

目的

例えば、1,234という数値。この数値の各桁の和は、1 + 2 + 3 + 4で、答えは10になります。
これをRubyを使用して出力する方法が二通りあります。

演算子を使用する方法

一つは演算子を使用し、それぞれの桁の値を抽出し、全て足す方法です。

num = 1234

thousand = (num / 1000) % 10   # => 1
hundred = (num / 100) % 10     # => 2
ten = (num / 10) % 10          # => 3
one = num % 10                 # => 4

answer = thousand + hundred + ten + one

p answer
# => 10

使用した演算子

演算子 意味
+ 加算(足し算)
/ 除算(割り算)
% 剰余(余り)

解説

まず、一の位の値を出す方法
1234という数値の中の4だけが欲しい時、
1234から4を取り出す方法は、123410で割れば、その余りが一の位の4になります。

1234 ÷ 10 = 123.4   ===>    123 ・・・4

この余りを求める方法は、演算子の%を使用すれば可能です。

1234 % 10
# => 4

%は、商の整数部分を取り除き、余りのみを返してくれます。


次に、二桁以上の位の値を出す方法
十の位、百の位、それ以上の位の値を求めるには、求めたい値の位を一の位に持って来ることができれば、上記の一の位の値を出す方法で求めることができます。
つまり、1234

  • 十の位が欲しい時、 => 123.4 =小数点以下を切り捨て=> 123
  • 百の位が欲しい時、 => 12.34 =小数点以下を切り捨て=> 12
  • 千の位が欲しい時、 => 1.234 =小数点以下を切り捨て=> 1

このようにするには数値を求めたい桁の位で割れば可能です。

# 十の位
1234 ÷ 10 = 123.4
# 百の位
1234 ÷ 100 = 12.34
# 千の位
1234 ÷ 1000 = 1.234

演算子の除算は/を使用します。

# 十の位
1234 / 10
# => 123

# 百の位
1234 / 100
# => 12

# 千の位
1234 / 1000
# => 1

/は商の小数点以下を取り除き、整数部分のみ返してくれます。

これに上記の一の位の値を出す方法を組み合わせると、求めたい位の値を出すことができます。

# 百の位
(1234 / 100) % 10
# => 3

あとは計算で出た値を全て足すだけです。




メソッドを使用する方法

もう一つはメソッドを使用し、数値を配列にして合わせる方法です。

num = 1234
answer = num.digits.sum

p answer
# => 10

使用したメソッド

メソッド 役割
digits 数値を位ごとにバラバラにする
sum 配列の要素を合計する

解説

まず、digitsメソッドを使用して、位ごとに分割します。
digitsメソッドは位ごとに分割し、一の位から並べた配列を返してくれます。

1234.digits
# => [4, 3, 2, 1]

そして、sumメソッドで配列の各要素を足します。

[4, 3, 2, 1].sum
# => 10




最後に

各桁の値を出すのみであれば演算子で計算をすれば良いのですが、和を求める場合はメソッドを使用した方が簡単です。

ご覧いただき、ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】格桁の和を求める方法

目的

例えば、1,234という数値。この数値の格桁の和は、1 + 2 + 3 + 4で、答えは10になります。
これをRubyを使用して出力する方法が二通りあります。

演算子を使用する方法

一つは演算子を使用し、それぞれの桁の値を抽出し、全て足す方法です。

num = 1234

thousand = (num / 1000) % 10   # => 1
hundred = (num / 100) % 10     # => 2
ten = (num / 10) % 10          # => 3
one = num % 10                 # => 4

answer = thousand + hundred + ten + one

p answer
# => 10

使用した演算子

演算子 意味
+ 加算(足し算)
/ 除算(割り算)
% 剰余(余り)

解説

まず、一の位の値を出す方法
1234という数値の中の4だけが欲しい時、
1234から4を取り出す方法は、123410で割れば、その余りが一の位の4になります。

1234 ÷ 10 = 123.4   ===>    123 ・・・4

この余りを求める方法は、演算子の%を使用すれば可能です。

1234 % 10
# => 4

%は、商の整数部分を取り除き、余りのみを返してくれます。


次に、二桁以上の位の値を出す方法
十の位、百の位、それ以上の位の値を求めるには、求めたい値の位を一の位に持って来ることができれば、上記の一の位の値を出す方法で求めることができます。
つまり、1234

  • 十の位が欲しい時、 => 123.4 =小数点以下を切り捨て=> 123
  • 百の位が欲しい時、 => 12.34 =小数点以下を切り捨て=> 12
  • 千の位が欲しい時、 => 1.234 =小数点以下を切り捨て=> 1

このようにするには数値を求めたい桁の位で割れば可能です。

# 十の位
1234 ÷ 10 = 123.4
# 百の位
1234 ÷ 100 = 12.34
# 千の位
1234 ÷ 1000 = 1.234

演算子の除算は/を使用します。

# 十の位
1234 / 10
# => 123

# 百の位
1234 / 100
# => 12

# 千の位
1234 / 1000
# => 1

/は商の小数点以下を取り除き、整数部分のみ返してくれます。

これに上記の一の位の値を出す方法を組み合わせると、求めたい位の値を出すことができます。

# 百の位
(1234 / 100) % 10
# => 3

あとは計算で出た値を全て足すだけです。




メソッドを使用する方法

もう一つはメソッドを使用し、数値を配列にして合わせる方法です。

num = 1234
answer = num.to_s.split(//).map(&:to_i).sum

p answer
# => 10

使用したメソッド

メソッド 役割
to_s 数値を文字列にする
split 文字列を分割し、配列で返す
map 配列の各要素に対する繰り返し処理
to_i 文字列を数値にする
sum 配列の要素を合計する

解説

まず、to_sメソッドを使用して、数値を文字列に変換します。
これは、このあとsplitを使用するためです。(split文字列を分割する)

1234.to_s
# =>"1234"

次に、その文字列をsplitメソッドで一文字づつに分割します。
splitの()内に区切り文字として、//''を指定すれば分割され、配列として返されます。

"1234".split(//)
# => ["1", "2", "3", "4"]

返された配列にmapメソッドを使用。それぞれの文字列をto_iメソッドで数値に変換します。

["1", "2", "3", "4"].map(&:to_i)
# => [1, 2, 3, 4]

# 上記と同じ意味
["1", "2", "3", "4"].map{|num| num.to_i}

最後にsumメソッドで配列の各要素を足します。

[1, 2, 3, 4].sum
# => 10




最後に

桁数が少なければ演算子で計算できますが、桁数が多い時はメソッドを利用した方が簡単です。

ご覧いただき、ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby経験者がRustを使ってみて比較してみた 2020冬

少し前になりますが、お世話になっていた職場で新しい技術に触れさせて頂ける機会を頂いので、Rustを使ってみました。RustはRubyと世界観が似ていて、理解しやすい部分も多くありました。

今回は、Ruby/Railsの世界と比較して、やったことをまとめてみようと思います。

Rustのいいところ

そもそもなぜRustに興味を持ち、使ってみようと思ったのか。
Rust公式

  • コンパイル型言語のメリット
    • 使ってみた感想を後述
  • パフォーマンスが良い
    • 使ってみた感想を後述
  • 並列処理
    • 今回はたどり着けず
  • Web Assembly
    • 調べてみると、Rustだけではなく他言語も対応していてあまり興味をひかれず、対象外
  • CLIツール
    • 簡単に作れて配布が楽。
    • 使ってみた感想を後述

Rustを書いてみる

Rust のチュートリアル(The book)を読んで、Guessing gameという例題をプログラミングしました。

感想

  • 所有権で、変数のスコープ・ライフサイクルをより厳密に管理できる
    • 保守的にプログラミングすると自然に書けて、ケアレスミスを防いでくれるガイドのよう
  • C言語/C++、C#、Rubyっぽさもあり、バックグラウンドがあれば文法はそれほど難しくない
  • コンパイルすると、参照や定義がきちんと追跡できる。実装にも役立つし、読むのにも良い
  • Rubyみたいなダックタイピングでゆるふわコーディングはできないので、なれるまでコンパイルエラーは増えそう
  • buildしたものを実行するだけなら光速
  • 実行は速いが、バイナリのファイルサイズは大きくなる
  • 個人的には結構好き

Rubyと用語比較

Rubyがわかれば、これを見ればイメージつかめると思います。Gemに関連する使い勝手も結構似ていて使いやすいと思いました。

Ruby Rust
Gem Crate
Bundler Cargo
Class Struct
インスタンスメソッド メソッド
Hash Vector
array.each for x in array

APIサーバーの実装をRailsと比較する

簡単な例に習って、Rest APIサーバーを PostgreSQLで実装しました
https://github.com/Samemura/rust-web-api-with-db

感想

  • 小規模なら全然あり
  • buildや実行が速い。と思う
    • Railsみたいにライブラリが重くないからというのもありそう
  • アーキテクチャに熱い人は使い勝手が良さそう
  • テストしやすさは、評価できず

Railsとの比較

今回は、公式を見てRocketを使ってみた。後から教えてもらったが、実際に普及しているのはActix-webらしい。以降はRocketとRailsの比較。

項目 Rails Rocket
ORM ActiveRecord Diesel

ただし、DBによってライブラリを使い分ける必要がある。DieselはPostgreSQLとMySQL, SQLiteのみ。
ディレクトリ構成 厳格に決められている 自由

アーキテクチャやレイヤー構成を自分たちで決めて運用する必要がある
Routing routes.rbにDSLで記述 rocketをマウントする際に、controller的 functionを渡す
functionのattribute(プリプロセッサのようなもの)でパスを定義
Controller Controller クラスで実装 functionで実装。特に制限はなし
リクエストのパラメータは、Structを定義してparseする。parseはいい感じやってくれるので結構簡単。
Model Modelクラスで実装 Structで実装。特に制限はなし
ORMしたものとは別に、insert時に使うモデルやselectで取得したものを分けて扱える。
ActiveModelがいっぱいある感じ。似たようなものが増えそうだが、影響範囲が明確なので保守性は良さそう
Migration DSLで記述 Up/Downを分けてSQLを記述

SQLで書いた方が分かりやすい気がする。Up/Downも明確。

CLIツールを作ってみた

簡単に作れるとのことで、身近に使えるものが思いついたので作ってみた。
発表順などでランダムに順番決めるときに使える。
https://github.com/Samemura/kaiten-sushi

感想

  • crates.ioに公開するまではとても簡単にできた
    • 手順はこちら
    • インストールする人はcargo 使えば簡単に導入できる
  • バイナリを直接インストールする方法は結構大変だった
    • 手順に載っているので、軽くできそうで試してみる
    • TravisCI でプラットフォームごとにビルドして、Trustというライブラリのinstall.sh でインストールできるようにする必要がある
      • TravisCIでビルドするけど、デプロイタスクが失敗
      • macosはTrustでサポートされてない
      • 詰んだ?
    • ローカルでビルドすれば mac osのバイナリを作れる
      • Trustのinstall.shは GitHubのReleaseの最新版をの添付ファイルをプラットフォームに応じて取ってくる
      • TravisCIのスクリプト例を参考に、名前付け・アップロード
    • 結構大変だったけど、なんとかできた
    • 確かにCargoなしでもインストールは楽にできる
    • 後から検証してみると、rustcは必要っぽい。
  • CLIを作るのにライブラリのインターフェースは向いてるので、作りやすかった
  • npmでも使えるし、 Rubyからコールすることもできるので将来性ある(Routie)

まとめ

かなり雑なまとめではあるものの、Ruby経験者が雰囲気掴むのには良いかと思います。Trustでのインストールのあたりは、確かな情報があれば教えてもらえるとありがたいです。

英語情報の日本語化は結構されているけど、コミュニティーが英語メインのようで細かい情報はそちらを探す必要がありそうでした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby経験者がRustを触って比較してみた 2020冬

少し前になりますが、お世話になっていた職場で新しい技術に触れさせて頂ける機会を頂いので、Rustを使ってみました。RustはRubyと世界観が似ていて、理解しやすい部分も多くありました。

今回は、Ruby/Railsの世界と比較して、やったことをまとめてみようと思います。

Rustのいいところ

そもそもなぜRustに興味を持ち、使ってみようと思ったのか。
Rust公式

  • コンパイル型言語のメリット
    • 使ってみた感想を後述
  • パフォーマンスが良い
    • 使ってみた感想を後述
  • 並列処理
    • 今回はたどり着けず
  • Web Assembly
    • 調べてみると、Rustだけではなく他言語も対応していてあまり興味をひかれず、対象外
  • CLIツール
    • 簡単に作れて配布が楽。
    • 使ってみた感想を後述

Rustを書いてみる

Rust のチュートリアル(The book)を読んで、Guessing gameという例題をプログラミングしました。

感想

  • 所有権で、変数のスコープ・ライフサイクルをより厳密に管理できる
    • 保守的にプログラミングすると自然に書けて、ケアレスミスを防いでくれるガイドのよう
  • C言語/C++、C#、Rubyっぽさもあり、バックグラウンドがあれば文法はそれほど難しくない
  • コンパイルすると、参照や定義がきちんと追跡できる。実装にも役立つし、読むのにも良い
  • Rubyみたいなダックタイピングでゆるふわコーディングはできないので、なれるまでコンパイルエラーは増えそう
  • buildしたものを実行するだけなら光速
  • 実行は速いが、バイナリのファイルサイズは大きくなる
  • 個人的には結構好き

Rubyと用語比較

Rubyがわかれば、これを見ればイメージつかめると思います。Gemに関連する使い勝手も結構似ていて使いやすいと思いました。

Ruby Rust
Gem Crate
Bundler Cargo
Class Struct
インスタンスメソッド メソッド
Hash Vector
array.each for x in array

APIサーバーの実装をRailsと比較する

簡単な例に習って、Rest APIサーバーを PostgreSQLで実装しました
https://github.com/Samemura/rust-web-api-with-db

感想

  • 小規模なら全然あり
  • buildや実行が速い。と思う
    • Railsみたいにライブラリが重くないからというのもありそう
  • アーキテクチャに熱い人は使い勝手が良さそう
  • テストしやすさは、評価できず

Railsとの比較

今回は、公式を見てRocketを使ってみた。後から教えてもらったが、実際に普及しているのはActix-webらしい。以降はRocketとRailsの比較。

項目 Rails Rocket
ORM ActiveRecord Diesel

ただし、DBによってライブラリを使い分ける必要がある。DieselはPostgreSQLとMySQL, SQLiteのみ。
ディレクトリ構成 厳格に決められている 自由

アーキテクチャやレイヤー構成を自分たちで決めて運用する必要がある
Routing routes.rbにDSLで記述 rocketをマウントする際に、controller的 functionを渡す
functionのattribute(プリプロセッサのようなもの)でパスを定義
Controller Controller クラスで実装 functionで実装。特に制限はなし
リクエストのパラメータは、Structを定義してparseする。parseはいい感じやってくれるので結構簡単。
Model Modelクラスで実装 Structで実装。特に制限はなし
ORMしたものとは別に、insert時に使うモデルやselectで取得したものを分けて扱える。
ActiveModelがいっぱいある感じ。似たようなものが増えそうだが、影響範囲が明確なので保守性は良さそう
Migration DSLで記述 Up/Downを分けてSQLを記述

SQLで書いた方が分かりやすい気がする。Up/Downも明確。

CLIツールを作ってみた

簡単に作れるとのことで、身近に使えるものが思いついたので作ってみた。
発表順などでランダムに順番決めるときに使える。
https://github.com/Samemura/kaiten-sushi

感想

  • crates.ioに公開するまではとても簡単にできた
    • 手順はこちら
    • インストールする人はcargo 使えば簡単に導入できる
  • バイナリを直接インストールする方法は結構大変だった
    • 手順に載っているので、軽くできそうで試してみる
    • TravisCI でプラットフォームごとにビルドして、Trustというライブラリのinstall.sh でインストールできるようにする必要がある
      • TravisCIでビルドするけど、デプロイタスクが失敗
      • macosはTrustでサポートされてない
      • 詰んだ?
    • ローカルでビルドすれば mac osのバイナリを作れる
      • Trustのinstall.shは GitHubのReleaseの最新版をの添付ファイルをプラットフォームに応じて取ってくる
      • TravisCIのスクリプト例を参考に、名前付け・アップロード
    • 結構大変だったけど、なんとかできた
    • 確かにCargoなしでもインストールは楽にできる
    • 後から検証してみると、rustcは必要っぽい。
  • CLIを作るのにライブラリのインターフェースは向いてるので、作りやすかった
  • npmでも使えるし、 Rubyからコールすることもできるので将来性ある(Routie)

まとめ

かなり雑なまとめではあるものの、Ruby経験者が雰囲気掴むのには良いかと思います。Trustでのインストールのあたりは、確かな情報があれば教えてもらえるとありがたいです。

英語情報の日本語化は結構されているけど、コミュニティーが英語メインのようで細かい情報はそちらを探す必要がありそうでした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dry::Struct導入

参考

https://dry-rb.org/gems/dry-struct/1.0/
https://dry-rb.org/gems/dry-types/1.2/

やったこと

Gemfile
gem 'dry-struct'
gem 'dry-types'
bundle
app/models/xxxxx.rb
class Xxxxx < Dry::Struct
  module Types
    include Dry.Types
  end
end

結果

-> % bin/rails c
Running via Spring preloader in process 34185
Loading development environment (Rails 6.0.3.3)
[1] pry(main)> Dry::Struct
=> Dry::Struct
[2] pry(main)> Xxxxx
=> Xxxxx
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

買付代行サービスにRspecとFactoryBotを導入した

参考

https://qiita.com/Ushinji/items/522ed01c9c14b680222c
https://qiita.com/key_it6/items/fb94f229e9e45270c515

やったこと

Gemfile
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]

  gem 'factory_bot_rails' #追加
  gem 'rspec-rails' #追加
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'web-console', '>= 3.3.0'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-commands-rspec' #追加
  gem 'spring-watcher-listen', '~> 2.0.0'
end
Terminal
bundle

bin/rails generate rspec:install
spec/rails_helper.rb
省略
Dir[Rails.root.join('spec/support/**/*.rb')].sort.each { |f| require f }
省略
spec/support/factory_bot.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

結果

Terminal
-> % bin/rspec
Running via Spring preloader in process 32344
No examples found.


Finished in 0.00101 seconds (files took 0.49014 seconds to load)
0 examples, 0 failures
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubyのステップアップなら→ Udemy「はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう 」

エンジニアの学習って大変ですよね。私もよく予定を全て断ってプログラミングの勉強をしていました。
今はpythonとRubyを学習しているのですが、Rubyの学習でおすすめな教材があったので今回記事を書きました。
また、このRubyで学んだことはいま学習しているpythonの内容と合致する部分が多く、学習コストが低くなります。
求人数が多い言語として元々人気でしたが、他の言語にも移りやすく第一言語としても最適なので、今回はステップアップ講座ということで私も購入しました。

動画詳細

・・・・・・・・・・・・・・・・
動画詳細はこちら↓
はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう
https://px.a8.net/svt/ejp?a8mat=2TIO46+EOP6GA+3L4M+BW0YB&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fthe-ultimate-ruby-on-rails-bootcamp%2F
・・・・・・・・・・・・・・・・

学習メリット

Udemyではこのようにエンジニア向けの講座が沢山ありますが、今回の講座はステップアップできる講座で、なおかつ初心者向けでもあります。
また、Herokuといったサービスを使ってWEBサービスを公開するところまでサポートしてくれます。

プロゲートもで学習している人も、楽しくないならこの講座のような実践形式のものに勉強方法を変えてみるのも手だと思います。

おすすめ対象

・Ruby on Railsの参考書1冊終えた方
・Webサービスを作ってみたい方
・Webサービスの公開方法を知りたい方

とにかく、Rubyの知識はあった上での受講であるとより望ましいかも知れません。

学習内容

・Ruby on RailsとRubyを使った実践的な開発スキル
・Webサービスを公開する方法
・AWS Cloud9を使った開発環境の構築
・Ruby on RailsとRubyの違いを理解
・クラウドサービス、HerokuのPaaS(Platform as a Service)を使って自分のサービスをネット上に公開する方法を学ぶ
・Web系の企業転職の際に魅力的に映るポートフォリオサイトの作成

講義内容に関して

講師はプログラミングスクールを経験している方だったので、とても分かりやすく解説してくれるのでとても学びやすいです。
また、実際に作ったWebサービスをHeruku上に公開するまでを学習することができるので入門的な知識からステップアップする事もできます。

講義自体はAWSのcloud9を使って進めていますが、プログラムの基本的な書き方まで網羅してくれているのでとてもためになります。
実際に、演習問題ではFizzbuzz問題や条件分岐、繰り返し処理などもありましたが、私はコーディング面接の際にこのFizzbuzz問題が出題されたので、学習してよかったと思いました。
しかし、講師の入力はとても早いので、ついていけない人は動画の再生速度を下げたほうがいいかも知れません。

私はこの講義を参考にデモのSNSを作りましたが、基礎的なものとなにかの制作に必要なちしきはきちんとカバーされてますので、学習して損はないと思います。

動画詳細

・・・・・・・・・・・・・・・・
動画詳細はこちら↓
はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう
https://px.a8.net/svt/ejp?a8mat=2TIO46+EOP6GA+3L4M+BW0YB&a8ejpredirect=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fthe-ultimate-ruby-on-rails-bootcamp%2F
・・・・・・・・・・・・・・・・

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

File::Statクラスについて

概要

ファイル情報を取得する際にFile::Statクラスについて調べたことについて書きました。

File::Statクラスとは

File::Statクラスとは、ファイル容量やパーミッションなどの情報を取得する時に用いるメソッドです。

File::Statの属性メソッド

ファイル情報を取得する際にしようした属性メソッドについてまとめます。

  • mode
    ファイルモードを取得する
  • size
    ファイルサイズを取得する
  • atime
    最終アクセス時刻を取得する
  • mtime
    最終更新時刻を取得する

まとめ

属性メソッドは上記以外にもありますが、今回は実際に使用したメソッドについて書きました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Udemy「Web開発入門完全攻略コース – プログラミングをはじめて学び創れる人へ!未経験から現場で使える開発スキルを習得!」のすすめ。

この講義の特徴を最初に述べますと、「未経験に必要なフルスタックの知識が一本の動画で身につく。」といったところです。
独学でのデメリットとしては、自分でが空襲をする際の最短距離が通れないことにあります。
やはりみんな最初のうちはどの方法で勉強していけばいいのか、どれを勉強すればいいのかわからないですもんね。

今回の講座では、現役ITエンジニア兼プログラミング講師の中村祐太さんという方が講師を務められています。
そのような方に勉強のコースを組んでもらえるのは正に学習の最短距離を示して頂いてることに限りなく近いと思いますので、そこにこの動画を学習するメリットが有りました。

・・・・・・・・・・・・・・・・
動画詳細はこちら↓
ウェブ開発入門完全攻略コース - プログラミング をはじめて学び創れる人へ!未経験から現場で使える開発スキルを習得!
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjIypq3hZvuAhUH7WEKHcMUB84QFjAAegQIARAC&url=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fweb-application-development%2F&usg=AOvVaw04YLdSbEZFKplC1FRANR4A
・・・・・・・・・・・・・・・・

HTML,CSS

1.
学習内容としては、HTML/CSS から始まります。
Webサイト制作に必要不可欠であるHTMLとCSSから始まりますが、本当に基本的なことからしっかりと教えてくれるので、HTMLを全く知らないという人でも大丈夫です。
私もうろ覚えな部分が学習のタイミングでは多かったのですが、演習課題も豊富にあるので、基礎的な力を身につけることにつながった実感がとてもあります。

また実践として、このレクチャーでは架空のカフェのWebサイトも作成します。
CSS Cafe といった、サイトを作成するのですが、実務に近いコーディングをここで経験できるのでとても良いです。

その次はBootstrapの演習に移っていきます。
BootstrapはTwitter社が開発したWebフレームワークで、Bootstrapを導入する最大のメリットとしては、レスポンシブ対応のWebサイト
 →1つのWebサイトで PC、スマートフォン、タブレットなどに対応できるサイト
を簡単に作成できることが挙げられます。
そのレクチャーでは、フォトギャラリーのサイトを作成しながら学習してくのですが、私も自分でコーディングする際はよく使っていて、CSSの知識がなくても簡単にかけてしまうことをとても実感しています。
この前のブログサイト作成では、そのBootstrapの知識が活きてきて、簡単にデザインを整えることができました。

Javascript

2.
HTML及びCSSの学習が終わった後は、プログラミング言語のJavaScriptを学習していきます。
JavaScriptはテキストエディタとブラウザさえあれば書けるので、環境が整っていなくても勉強しやすい言語で、ほぼ全員のエンジニアが学習する上で通る道です。
この講座では、基本から時間をかけて丁寧に説明してくれる上に、演習課題もあるので、基礎的な力を身につけることができるかと思います。
ただし、一回でわかり切るといったことではないので、ある程度の復習は必要になってきます。
とはいっても、DOM操作などでよく使うところは解説してくれているので、大事なことろはわかります。
私もこれを参考に性格診断アプリを練習で作ってみました。

インフラ学習

3.
その後は、インフラの学習に入っていきます。
AWSのCloud9を学んでいきます。
AWSは、Amazon Web Serviceの略で、で、環境構築やアカウントの取得方法も丁寧に解説してくれるので、AWSを知らなかった私でも問題なくアカウントを取得できました。
ちなみにCloud9の料金は最初の1年間は無料、以降は月額制で料金が発生しますが、よほど使わない限りは月100~200円程度ですみます。また、一年経過する前に新しいアドレスで作成することもできるので、実質無料です。

4.
インフラのことを軽く触ったら、AWSCloud9でRubyの学習を行います。
RubyあJavaScriptなどの他の言語とは書き方が異なり、戸惑う点も多いのですが、3時間近い動画と豊富な演習があるので、時間をかければ基礎は理解できます。また、日本人が開発した言語なだけあってリソースも多いので、非常にわかりやすいです。後のRailsを使ったアプリ作成で使用するので、きちんと勉強したほうがいいです。

5.
その次は、MySQLを用いて、データベースの基本的操作を学習します。
この点に関しては基礎の部分しか触れられてませんが、私は他の教材で勉強するときにその知識が生かされてきてより学習効率があがりました。また、実務では必須スキルになってくるので、他の教材での学習が必要になってきますが、知識として入れておくことをおすすめします。

アプリ作成

6.
ここでやっと、Ruby on Railsでのアプリ作成をしてきます。
実際にWebアプリケーションを使いながら、WebフレームワークのRuby on Railsを学習していく形です。
ここではJavascriptも用いて簡単にTODOアプリを作成するのですが、その傍らでJQUERYにも軽く触れているので、簡単な知識も身につきます。
私は実際に性格診断アプリを講義をもとに作ってみたのですが、そこでもJQUERYは実際に使ったので本当に基礎手として頭に入れておくべきだと思います。

7.
アプリ作成後は、Gitの学習をしていきます。ここではGithubを用いて、ソフトウェア開発においてソースコードのバージョン管理に用いるGitの使い方を学習します。
基本はAWS Cloud9上での学習となり、後半からは無料のGithubアカウントを作成したうえで、フローの模擬体験を行う形です。この項目は働く上では必須項目になってくるので、抑えておきましょう。

・・・・・・・・・・・・・・・・・・・・・・・
このように、内容は基礎ですが、幅広い技術を18.5時間の動画で学びます。

学習にかける時間はプログラミング経験者で30時間程度、プログラミングの経験がない人は理解に時間がかかると思うので、40~60時間程度は必要になると思いますが、1回学んで終わりではなく、繰り返し学習することでより理解が深まるかたちです、復習はきちんと行いましょう。

私も、苦手なSQLやGitについては理解できていないので、改めて復習するつもりです。
元々は24,000円するこのコースですが、Udemyでは定期的にに割引セールが開催されており、セール中は1,400円で購入することができます。
この機会に学習することをおすすめします。

動画詳細

・・・・・・・・・・・・・・・・
動画詳細はこちら↓
ウェブ開発入門完全攻略コース - プログラミング をはじめて学び創れる人へ!未経験から現場で使える開発スキルを習得!
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjIypq3hZvuAhUH7WEKHcMUB84QFjAAegQIARAC&url=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fweb-application-development%2F&usg=AOvVaw04YLdSbEZFKplC1FRANR4A
・・・・・・・・・・・・・・・・

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

has_many throughで重複したデータをdistinctしたい

問題

例えばこういう関係のモデルがあったとして

class User < ApplicationRecord
  has_many :lists
end

class List < ApplicationRecord
  belongs_to :user
  belongs_to :product
end

class Product < ApplicationRecord
  has_many :lists
end

UserはListを複数持っていて、各ListはProductを参照していて...
Userに関連するProduct全部持ってきたい...

解決方法

class User < ApplicationRecord
  has_many :lists

  # これだとListの数分重複するProductが返ってくる
  # has_many :products, through: :lists 

  # distinctを差し込んでやる
  has_many :products, ->{ distinct }, through: :lists
end

すごく便利(ここを参照しました)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

まとめ:リンクをクリックした際に論理値が切り替わる機能の実装 [自身のアウトプット用]

概要

自身のポートフォリオ作成において備忘録として記載します。
今回はフラグとそれを使ってのタイトルの機能について記述します。初学者ですので、間違っている箇所、引っかかる箇所等ございましたら、ご指摘願います。

目次

  • フラグについて
  • フラグの立て方
  • フラグの切り替え
  • リンクをクリックした際に論理値が切り替わる機能の実装

フラグについて

論理値をとる属性で、この値がtrueかfalseかによって条件分岐ができたりします。
例)ユーザーが管理者かどうかの情報であるadmin属性をuserモデルに追加します。(adminフラグ)すると、
admin?メソッドを用いることができる様になります。これを用いるとユーザーが管理者かどうかを判定できます。下記のコードはtrueなら管理者であり、falseならそうでないユーザーだということです。

#current_userが管理者かどうか

current_user.admin?

フラグの立て方

モデルに属性を追加します。
私のポートフォリオでは、目標を達成したユーザーかを判別するためにUserモデルにcompleteフラグを立てることにしました。

$ rails generate migration add_complete_to_users complete:boolean

デフォルト値はfalseなのでマイグレーションファイルにdefault:falseを追加します。

class AddCompleteToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :complete, :boolean, default: false
  end
end
$ rails db:migrate

以上で、completeフラグが追加できました。

フラグの切り替え

私のポートフォリオでは、目標達成リンクをクリックしたときに、completeがtrueになるようにしたかったので、complete属性のfalseをtrueに変えるメソッドを作成することにしました。メソッド名は私のポートフォリオの機能から名付けました。

#completeフラグを切り換える
  def congratulations
    current_user.toggle(:complete)
    current_user.save!
  end

toggleを用いて、引数であるcomplete属性の真偽を反転させるという方法を取りました。
そしてsave!メソッドで保存しています。これでフラグを切り換えるメソッドができました。なお、自分は上記メソッドをusers_controller.rbに記述しました。

リンクをクリックした際にフラグが切り替わる機能の実装

ビューで下記コードを記載。

<%= link_to '目標達成' , controller: :users, action: :congratulations %>

これで目標達成リンクをクリックした際にusersコントローラーのcongratulationsアクション(上記で作成した真偽反転のメソッド)が実行される様になりました。あとは対象となるビューを作り、ルートを設定すれば完成です。

まとめ

Qiita初投稿です。アウトプットの大切さを思い知りました。特に今回実装した機能は自分の中でもどう実装すべきか、どういったメソッドを用いればいいのかについて長時間悩みましたので、忘れずに書いておこうと思った次第です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

renderとredirect_toの違い

render

viewを返す

redirect_to

routesに遷移し、引数に該当するroutesを探す

→使い道としては「エラーが起きた時などにエラー処理を新たにcontrollerで走らせたい」だったり、「viewには表示したくないけど、内部でcontrollerのactionを走らせたい」だったりの処理をしたい時に使う。

参考文献

https://qiita.com/january108/items/54143581ab1f03deefa1

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プロを目指す人のためのRuby入門 1

はじめに

今回インターン先でのrubyへの理解も必要になったのでプロを目指す人のためのRuby入門を勉強をはじめようとおもいます!
この本のrubyの基礎のみをこちらの記事にしていきます。
自分用のアウトプット記事にはなりますので、読みづらいとは思いますが、暖かく見ていただけると幸いです。

またバックエンドの言語もこれで初めてになるので丁寧に勉強していきたいと思います!

インストール(mac/linux)

ruby -v

rubyが入っているか確認!
rbenvはrubyのバージョン管理切り替えを行うパッケージ!
homebrewにてinstallしてください

irbでrubyがファイルが軌道して、ターミナルでrubyを実行できる!

irb

irb>a = "hello world"
=> "hello world"
irb>a
=> "hello world"

となる

exit

でirbから抜ける

次はファイルから実行 .rbの拡張子ファイルを作成

puts 1 + 2

a = "Hello world!"
puts a

b = "こんにちは"
puts b

//ターミナル
ruby ファイル名.rb
>3 
Hello world!
こんにちは

※引数として渡した値や変数を標準出力する

全てオブジェクト

rubyはオブジェクト指向言語。文字列や配列はもちろん、数値やnil(null)も含めて、全てがオブジェクトになる
その証拠に数値やnil、trueやfalseに対してもメソッドを呼び出せる

#文字列
'1'.to_s #=> "1"
#数値
1.to_s #=> "1"
#nil
nil.to_s #=> ""
#true
true.to_s #=> "true"
#false
false.to_s #=> "1"
#正規表現
/\d+/.to_s #=> "(?-mix:\\d+)"

呼び出し方

オブジェクト.メソッド(引数1、引数2、引数3)
オブジェクト.メソッド 引数1、引数2、引数3
オブジェクト.メソッド

文の区切り
基本的に開業が文の区切り
セミコロンで明示的に文の区切りを指定することもできる
バックスラッシュ(\)を使うと、文が続くことを示すことができる

コメント
#を使う。改行までがコメントになる
=beginと=endで複数行コメントにすることもできる

識別子
変数やメソッド、クラスなどにつける名前のこと
基本的にはアンダーバー(_)を使う

空白文字
空白はいくらあっても一つと判断される
いくら空白があってもまた空白がなくても正常に動作されることが多い

リテラル
数値や文字列をソースコードに直接埋め込むことができる値のことをレテラル

#数値
123
#文字列
"Hello"
#ハッシュ
{'japan => "yen", 'us' => 'dollar', 'india' => 'rupee'*
#正規表現
\/d+-\d+/

ハッシュ値はjavascriptのオブジェクトと同義!
コロンが矢印となって、値もそれぞれクオートで囲う

変数(ローカル変数)の宣言と代入
変数は宣言と代入を同時に行う!

変数名 = 式や値

変数名だけの変数を宣言するだけでは、エラーになる

x #=> エラー 
x = nil

変数名を小文字のスネークケースにするアンダーバー(_)

二つ以上の値を同時代入することもできる

a, b = 1, 2
a #=> 1
b #=> 2

c, d = 10
c #=> 10
d #=> nil

e, f = 100, 200, 300
e #=> 100
f #=> 200

二個以上の変数に同じ値を代入することもできる 非推奨

a = b = 100
a #=> 100
b #=> 100

ここでの変数はローカル変数と呼ばれる

文字列

**シングルクオートとダブルクオート
文字列に改行文字(\n)を入れたい場合は、ダブルクオートで囲う!

puts "こんにちわ\nさようなら"
#=> こんにちわ
さようなら

puts 'こんにちわ\nさようなら'
#=>こんにちわ\nさようなら

ほかにも\r(キャリッジリターン)や\t(タブ文字)がある
ダブルクオートを使うと式展開が使える
式展開を使う場合は、#{}の中に変数や式を書く

name = 'Alice'
puts "Hello #{name}" 
#=> Hello Alice!

i = 10
puts "#{i}は16進数にすると#{i.to_s(16)}です"
#=> 10は16進数にするとaです

#シングルクオートで行う場合
name = 'Alice'
puts 'Hello' + name + '!' 
#=>Hello Alice!

またダブルクオートで改行文字や式展開を打ち消したい場合は手前にバックスラッシュをつける

puts "こんにちわ\\nさようなら"
#=>こんにちわ\nさようなら

シングルクオートとダブルクオートの文字列の中でそれぞれのクオートを使いたい場合は、

puts 'he said, "Dont\'t speak."' #=> he said, Don't speak
puts "he said, ≠"Dont't speak."" #=> he said, "Don't speak"

文字列の比較

文字列が同じがどうかを調べる場合は、==を使う
異なるかどうかの場合は、!=を使う

'ruby' == 'ruby' #=> true
'ruby' == 'Ruby #=> false
'ruby' != 'perl' #=> true
'ruby' != 'ruby' #=> false

大小関係は、<, <=, >, >=を使って示す

'a' < 'b' #=> true
'a' < 'A' #=> false
'a' > A' #=> true
'abc' < 'def' #=> false
'abc' < 'ab' #=> true
'abc' < 'abed' #=> true
'あいうえお' < 'かきくけこ' #=> true

数値

数値には_を含められ、数値として認識されない
また通常通り数式も扱え、正の数、負の数(-)、少数も扱える
整数同士の割り算は整数になる。小数点以下は切り取られる。

10 + 20 #=> 30
100 - 25 #=> 75
12 * 5 #=> 60
20 / 5 #=> 4
1 / 2 #=> 0
8 % 3 #=> 2
3 ** 3 #=> 9
n = 1
-n #=> -1
#小数点が必要な場合はどちらか一つに小数点をつける
1.0 / 2 #=> 0.5

変数に整数が入っている場合は、to_fメソッドで呼ぶことで整数から少数に変更できる

n = 1
n.to_f #=> 1.0
n.to_f / 2 #=> 0.5

演算子による値の比較
<,<=,>,>=を使う

1 < 2 #=> true
1 <= 2 #=> true
1 > 2 #=> false
1 >= 2 #=> false
1 == 2 #=> false
1 == 1 #=> true
1 != 2 #=> true

演算子の優先順位
数学の四則演算と同じく、*と/は+と-よりも優先順位が高い

変数に格納された数値の増減
rubyには++や--はないその代わり+=と-=が用意されている

n = 1
#n = n + 1と同じ
n += 1 #=> 2
#n = n - 1と同じ
n -= 1 #=> 1

m = 2
#mを3倍
m *= 3 #=> 6
#mを2でわる
m /= 2 #=> 3
#mを2乗
m **= #=> 9

真偽値と条件分岐

rubyの真偽値

ルール
・falseまたはnilであれば偽
・それ以外は全て真

※nilも偽として扱われるという点に注意
これはデータのあるなしで条件分岐できるので便利と言える

data = find_data
if data
  'データあります'
else 
  'データありません'
end

シンプルにかける

論理演算子
&&や||のような論理演算子を使うと、複数の条件を一つにまとめらレル

条件1も条件2も真であれば真、それ以外は偽
条件1 && 条件2

条件1か条件2どちらかが真であれば真、両方偽であれば偽
条件1 || 条件2

組み合わせても使える

条件1 && 条件2 || 条件3 && 条件4

rubyの場合、優先順位は&&のほうが高いため、上の式は条件1かつ条件2が真、または条件3かつ条件4が真なら真となる
優先順位を変えたい場合は、()をつかう

条件1 && (条件2 || 条件3) && 条件4

条件1が真かつ、条件2または条件2が真かつ条件4が真なら真となる
!を使うと真偽値を反転させることができる

t1 = true
f1 = false
t1 && f1 #=> false
!(t1 && f1) #=> true

if文

if 条件a
  #条件aの時の処理
elsif 条件b
  #条件bの時の処理
elsif 条件c
  #条件cの時の処理
else
  #それ以外の処理
end

※else if やelseifではなくelsifである点に注意
またif文は戻り値返すため変数に代入することもできる

contry = 'italy'

greeting = 
if country == 'japan'
  'こんにちわ'
elsif country == 'us'
  'Helllo'
elsif country == 'italy'
  'ciao'
else
  '???'
end

greeting #=> "ciao"

またifとelsifの後ろにはthenを入れることできる

if 条件a then #条件aが真だった場合の処理
elsif 条件b then #条件bが真だった場合の処理
else
  #それ以外の処理
end

thenをいれると、条件式とその条件が真だった場合の処理を1行に押し込めることもできる

メソッドの定義

def メソッド名(引数1,引数2)
  #必要な処理
end

メソッド名はスネークケース(キャメルケースは使わない)
数字から始まるメソッド名を使わない!(エラーになる)

def add(a,b)
  a + b
end 
add(1, 2) #=> 3

メソッドの戻り値

rubyは最後に評価された式がメソッドの戻り値になる。そのためreturnのようなキーワードは必要ない!
書くこともできるが使わない方が主流!

def greeting(country)
  if country == 'japan'
    'こんにちわ'
  else 
    'hello'
  end
end

greeting('japan') #=> "こんにちわ"
greeting('us') #=> "hello"

rubyでのreturnは、主にメソッドからの脱出を使うときに使う

メソッド定義における引く数の()
引数がなければ次のように省略できる。

def greeting
  'こんにちわ'
end

()はつけてもつけなくてもいい!
また引数がある場合でも省略することはできるが、主流は()をつける

fizz_buzz

def fizz_buzz(n)
  if n % 15 == 0
    'Fizz Buzz'
  elsif n % 3 == 0
    'Fizz'
  elsif n % 5 == 0
    'Buzz'
  else
    n.to_s
  end
end

puts fizz_buzz(1)
puts fizz_buzz(2)
puts fizz_buzz(3)
puts fizz_buzz(4)
puts fizz_buzz(5)
puts fizz_buzz(6)
puts fizz_buzz(15)

#ターミナル
1
2
Fizz
4
Buzz
Fizz
Fizz Buzz

文字列について詳しく

文字列はStringクラスのオブジェクトになる

"abc".class #=> String

文字列はシングルクオートだけでなく%記法でもかける

#%q!!はシングルクオートで囲ったのと同じになる
puts %q!he said, "Don't speak."! #=> he said, "Don't speak"

#Q!!はダブルクオートで囲ったのと同じになる
samething = "Hello."
puts %Q!he said, "#{something}"! #=> he said, "Hello."

#%!!ダブルクオートと一緒

また ! だけでなく <>,{},[],() なども区切り文字として使える

**ヒアドキュメント(行思考文字列リテラル)

文字列は途中で改行することができる

a = <<TEXT
  これはヒアドキュメントです 
  複数行にわたる長い文字列を作成するのに便利です。
TEXT

puts a 
#=> これはヒアドキュメントです
#複数行にわたる長い文字列を作成するのに便利です。

識別子(上記でいうTEXT)は自由につけられる
しかし識別子名は、文字列の中に入れないようにする
また識別子に - をつけると最後の識別子をインデントさせることができる

<<-TEXT
以下省略
TEXT

また ~ をつけると内部の文字列をインデントさせても先頭の空白が無視される

そしてヒアドキュメントの中では、式展開が有効!
しかし識別子はダブルクオートで囲う必要がある
シングルクオートだと無効

name = 'Alice'
a = <<"TEXT"
  ようこそ、#{name}さん
  以下のメッセージをご覧下さい。
TEXT

puts a 
#=> ようこそ、Aliceさん!
# 以下のメッセージをご覧ください。

開始ラベルの識別子は1つの式としてみなされるためメソッドの引数として渡したり、識別子に対してメソッドを呼び出せる

a = 'Ruby'
#prependは渡された文字列は先頭に追加するメソッド
a.prepend(<<TEXT)
  Java
  PHP
TEXT

puts a
#=> Java 
PHP 
Ruby

#upcaseは文字列を全て大文字にするメソッド
b = <<TEXT,upcase
  Hello,
  Good-bye.
TEXT

puts b
#=> HELLO,
#GOOD-BYE

フォーマットを指定して文字列を作成

sprintfメソッドを使うと、指定されたフォーマットの文字列を作成することができる

#少数第3位まで数字を表示する文字列を作成するコード
sprintf('%0.3f',1.2) #=> "1.200"
'%0.3f' % 1.2 #=> "1.200"

sprintf('%0.3f + &0.3f', 1.2, 0.48) #=> "1.200 + 0.480"
'%0.3f + &0.3f' % [1.2, 0.48] #=> "1.200 + 0.480"

フォーマット文字列はたくさんあるためここでは省略!

その他文字列作成のいろいろ

#数値を文字列に
123.to_s #=> "123"

#配列を連結して1つの文字列に!
[10, 20, 30].join #=> "102030"

#*演算子を使って文字列を繰り返す
'Hi!' * 10 #=> "Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!Hi!"

#String.newを使って新しい文字列を作る(あまり使わない)
String.new('hello') #=> "hello"

文字列と文字に違いはない

数値についてもっと詳しく

10進数以外のリテラル

2進数の場合は0b
8進数の場合は0
16進数の場合は0x
を先頭につけると10真数以外の整数を作成できる

ビット演算

1.~ ビット反転
2.& ビット席
3.| ビット和
4.^ 排他的論理和
5.>> 右ビットシフト
6.<< 左ビットシフト

指数表現

rubyでは指数表現を使って浮動小数点数を表せる。

#2×10の-3乗
2e-3 #=> 0.002

数値のクラス
Intergerクラス、少数であればFloatクラスになる

10.class #=> Integer
1.5.class #=> Float

ほかにも有理数のRationalや複素数のComplexがある

真偽知と条件分岐について詳しく

真偽値の式を評価する際に真偽が決定したところで式の評価を終了し、そこでの値を返すようになる

1 && 2 && 3 #=> 3
1 && nil && 3 #=> nil
1 && false && 3 #=> false
nil || false #=> false
false || nil #=> nil
nil || false || 2 || 3 #=> 2

使い方としては

#Alice,Bob,Carolと順に検索し、最初に見つかったユーザー(nilまたはfalse以外の値)を変数に格納する
user = find_user('Alice') || find_user('Bob) || find_user('Carol')

#正常なユーザーであればメールを送信する(左辺が偽であればメール送信は実行されない)
user.valid? && send_email_to(user)

優先順位が低いand, or, not

他の演算子としてand or notがある
しかし優先順位が先ほどの&&, ||, !などとくらべて低いため同じように使うことはできない
またandとorの間に優先順位がなく左から順に真偽値として評価される。

unless文
ifの反対の意味を持つunless。
条件式が偽になった場合だけ処理を実行する
そのためif文で否定の条件を書いているときはunless文で置き換え可能である
使い方は、if文と同じでelsifとelseまたthenを使って同じ行に書くことも可能です!

case文
複数の条件を指定するときは、elsifを重ねるよりもcase文で書いた方がシンプルになる

coutry = "italy"
case coutry
  when 'japan'
    'こんにちわ'
  when 'us'
    'Hello'
  when 'italy'
    'ciao'
  else 
    '???'
end

#=> "ciao"

rubyのcase文ではwhen節に複数の値を指定し、どれかに一致すれば処理を実行するという条件分岐かける

coutry = "アメリカ"
case coutry
  when 'japan', '日本'
    'こんにちわ'
  when 'us', 'アメリカ'
    'Hello'
  when 'italy', 'イタリア'
    'ciao'
  else 
    '???'
end

#=> "Hello"

case文も最後に評価された式を戻り値して返すため、case分の結果を変数に入れることが可能である
そしてthenも同様に使うことができ、一行に省略できる。

条件演算子(参考演算子)

n = 11
if n > 10
  '10より大きい'
else 
  '10より小さい'
end
#=> "10より大きい"

#条件演算子子を使うとき
n > 10 ? '10より大きい' : '10より小さい'

#変数に代入
message = n > 10 ? '10より大きい' : '10より小さい'
message #=> 10より大きい

シンプルなif文であれば条件演算子の方すっきり書ける

メソッド定義について詳しく

rubyは、メソッドの引数にデフォルトの値を設定できる

def greeting(country = 'japan')
  if coutnry == "japan"
    'こんにちわ'
  else 
    'hello'
  end
end

greeting #=> "こんにちわ"
greeting(us) #=> "hello"

デフォルトの引数を設定しているときは、メソッド呼び出しの際は、引数はいらないが、デフォルト引数の値を設定していないときは、エラーになる。
またデファルト引数の値は、動的に変わるものでも大丈夫である。

def foo(time = Time.now, message = bar)
  puts "time: #{time}, message: #{message}"
end

def bar
  'Bar'
end

foo #=> time: 現在の時間, message: BAR

?で終わるメソッド
rubyのメソッド名は?や!で終わらせることができる。
?出終わるメソッドは慣習として真偽値を返すメソッドになっている。

#空文字列であればtrue、そうでなければfalse
"".empty? #=> true
'abe'.empty? #=> false

#引数の文字列が含まれていればtrue、そうでなければfalse
'watch'.include?('at') #=> true
'watch'.include?('in') #=> false

#奇数ならばtrue、偶数ならばfalse
1.odd? #=> true
2.odd? #=> false

#偶数ならばtrue、奇数ならばfalse
1.even? #=> false
2.even? #=> true

#オブジェクトがnilであればtrue、そうでなければfalse
nil.nil? #=> true
"abc".nil? #=> false
1.nil? #=> false

真偽知を返す目的のメソッドであれば、?で終わらせるようにした方がいい

def multiple_of_three?(n)
  n % 3 == 0
end

multiple_of_three?(4) #=> false
multiple_of_three?(5) #=> false
multiple_of_three?(6) #=> true

!で終わるメソッド

!を使うときは注意が必要。
例えばupcaseメソッドをupdate!メソッドで使う場合、どちらも文字列を大文字するメソッドですがupcaseメソッドは、大文字に変えた新しい文字列を作るのに対し、update!メソッドは呼び出した文字列自信を変更して大文字にします。

a = 'ruby'

a.upcase #=> 'RUBY'
a #=> 'ruby'

a.upcase! #=> 'RUBY'
a #=> 'RUBY'

このように呼び出したオブジェクト自体の状態を変更してしまうメソッドのことを破壊的メソッドという
そしてこちらも同様に自作の関数にも使うことができる。

※ちなみに変数名に?や!は使えない点に注意

その他の基礎知識

ガベージコレクション(GC)

rubyは使用されなくなったオブジェクトを回収し、自動的にメモリを解放します。このため、プログラマーはメモリ管理を意識する必要はない。このしくみをガベージコレクションという

エイリアスメソッド
rubyには同じメソッドでありながら複数の名前がついている場合がよくある
例)lengthメソッドとsizeメソッド これら二つは同じメソッド

このように同じメソッドであれながら名前の異なるメソッドをエイリアスメソッドという。

**式(Expression)と文(statement)
rubyでは他の言語では文とみなされるような要素が式になっていることが多い。
式と文の違いは

「値を返し、結果を変数に代入できるものが式」
「値を返さず、変数に代入しようとすると構文エラーになるものが文」

そのためif文やメソッド定義は式になる

# if文が値を返すので変数に代入できる
a = 
  if true 
    '真です'
   else 
    '偽です'
  end

a #=> '真です'

#メソッド定義も実は値(シンボル)を返している
b = def foo: and
b #=> :foo

擬似変数

nilとtrueとfalseのことを擬似変数と呼ぶ。(特殊な変数)

self オブジェクト自身
__FILE__ 現在のソースファイル名
__LINE__ 現在のソースファイル中の番号
__ENCODING__ 現在のソースファイルのスクリプトエンコーディング

擬似変数は文法上、変数のように見えますが、代入するとエラーが発生する。

参照の概念を理解する

rubyの変数にはオブジェクトそのものではなく、オブジェクトへの参照が格納されている。変数を他の変数に代入したり、メソッドの引数として渡したりすると、新しい変数やメソッドの引数は元の変数と同じオブジェクトを参照

変数がどのオブジェクトを参照しているのかはobject_idメソッドを使うとわかる

#aとbはどちらも同じ文字列だが、オブジェクトとしては別物
a = 'hello'
b = 'hello'
a.object_id #=> 70182231931400
b.object_id #=> 70182236321960

#cをbに代入する。bとcはどちらも同じオブジェクト
c = b
c.object_id #=> 70182236321960

#メソッドの引数にcを渡す。引数として受け取ったdはbと同じオブジェクト
def m(d)
  d.object_id
end
 m(c) #=> 70182236321960

#equal?メソッドを使って同じオブジェクトかどうか確認してもいい
a.equal?(b) #=> false
b.equal?(c) #=> true

また先ほどの変数自体を変更する!メソッドを使うとその変数と=されたものも変更となる

a = "hello"
b = "hello"
c = b

def m!(d)
  d.updase!
end

m!(c)

a #=> "hello"
b #=> "HELLO"
c #=> "HELLO"

組み込みライブラリ、標準ライブラリ

rubyでは最初から多くのライブラリが標準ライブラリとして用意されている。
その中でも特に頻度が高いライブラリは組み込みライブラリとして提供されている。

例)文字列のStringクラスや数値のIntegerクラス

標準ライブラリではあるものの組み込みライブラリではないものも存在する
例)Dateクラス

また外部ライブラリはgemと呼ばれるパッケージ管理を使ってインストールする

require
組み込みライブラリでない標準ライブラリやgemを利用する場合は、明示的にそのライブラリを読み込もう必要がある

require ライブラリ名

たとえばDateクラスを使いたい場合は、dateライブラリを読み込む

require "date"

Data.today #=> <Date: 2021-01-14 ....()>

require './sample.rb'
require './sample'

#拡張子は省略可能現在のディレクトリかルートディレクトリを使ってパスを指定

load

requireは一回しかライブラリやrbファイルを読み込まないという点に注意
requireを使って時にfalseが帰ってきた場合は、すでに読み込み済みであることを示している。
二回は呼び出せないということ
しかしloadを使うと毎回無条件に指定したファイルを読み込むことができる

load './sample.rb'
#loadを使うと拡張子の省略はできない

require_relative
requreiはrubyを実行しているディレクトリがパスの起点になりますが、require_relativeをつカツオ自分のファイルが存在するディレクトリがパスの起点になる。

#現在のファイルのパスは'foo/hello.rb'
require_relative "../bar/bye"
#これだとfooディレクトリから見たパスの指定になる。

putsメソッド、printメソッド、pメソッド
ターミナルへの出力でよく使われる、putsメソッド、printメソッド、pメソッドについて説明。
似ている3つとも微妙に挙動が異なる

putsメソッド
このメソッドのみ改行が含まれる
改行を加えて変数の内容やメソッドの戻り値をターミナルに出力。またputsメソッド自身の戻り値はnilになる

irb> puts 123
123 
=> nil
irb> putus "abc"
abc
=> nil

printメソッド
改行を加えない

irb>print 123
123 => nil
irb>print "abc"
abc => nil

pメソッド
putsメソッドと同じように改行を加えて出力する。ただし、文字列を出力すると、その文字列がダブルクオートで囲まれている点がputsメソッドとは異なる。また、pメソッドは引数で渡されたオブジェクトそのものがメソッドの戻り値になる

irb>p 123
123
=> 123
irb> p "abc"
"abc"
=> "abc"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】モデルの属性名を日本語化する

Rails のエラーメッセージを日本語化した際、モデルの属性名だけ英語のアルファベット表記になってしまう。。。という状況に陥ったので、解決するまでの道のりを記録しておきます。

①辞書によるデフォルトメッセージを日本語に

スクリーンショット 2021-01-14 16.46.27.png
config/initializers/配下に新しいファイルを作成(とりあえず locale.rb というファイル名にします)。下記のように記述。

config/initializers/locale.rb
I18n.config.available_locales = :ja
I18n.default_locale = :ja

②日本語の辞書ファイルを作成

config/locales/にja.ymlというファイルを作成。中に記述する内容を自分で書いてもいいのですが、すでに作成されたものがあるので、こちらをコピーするなりダウンロードするなりして保存します。

これで Rails サーバーを再起動。エラーが出るように、新規作成画面(空欄で登録しようとするとエラーになるバリデーションを設定済み)でわざと空欄のまま登録ボタンを押すと・・・
スクリーンショット 2021-01-14 16.06.48.png
確かに日本語になりましたが・・・Task name, Detail, Deadline がアルファベット表記のままです。

タイトルにも書きましたが、これらはデフォルトの日本語表記というわけではなく、自分が命名したモデルの属性名なので別扱いなのです。これらを日本語にするためには別のファイルを準備しなければなりません。

③モデル属性を日本語に

今度は config/locales/ に モデルを日本語表にする辞書 "model.ja.yml" を作成。

config/locales/model.ja.yml
ja:
  activerecord:
    models:
      task: ブログ
      user: ユーザー
    attributes:
      task:
        task_name: タスク名
        detail: 詳細
        deadline: 期限
      user:
        title: タイトル
        name: 名前
        email: メールアドレス
        current_password: 現在のパスワード
        password: パスワード
        password_confirmation: 確認用パスワード
        remember_me: ログインを記憶

このようにモデル属性に対応する日本語を記述します。これでサーバーを立ち上げなおして、先ほどと同じやり方でエラーを出してみると・・・
スクリーンショット 2021-01-14 16.36.41.png
モデル属性の部分も日本語になりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プログラミングスクール「RUNTEQ」は凄すぎました

RUNTEQに入校して1ヶ月

技術ではなく個人の体験ですが、プログラミングスクール「RUNTEQ」に入校して1ヶ月が経過したので、RUNTEQの感想を書きたいと思います。

結論から申し上げると「RUNTEQはすごくいいぞ」です。
他のスクールについて当然入校をしたことがないので他のスクールの質はよくわかりません。
ですが、未経験から転職を目指すならRUNTEQがベストだと自信を持って言えます!!

結論から申し上げると「RUNTEQはすごくいいぞ」です。
他のスクールについて当然入校をしたことがないので他のスクールの質はわかりません。
ですが、未経験から転職を目指すならRUNTEQがベストだと自信を持って言えます!!

RUNTEQ?何それ?

私がRUNTEQに入校を決めたのはちょうど1ヶ月ほど前でした。
それ以前はプログラミングを自分で学びながら、2ヶ月かけてたくさんのプログラミングスクールに関するネットの記事を読みあさっていました。
しかし、2ヶ月という期間がありながら、RUNTEQを見つけたのは入校する2週間前です。
つまり、2ヶ月間ずっと色々な記事を見てきたにもかかわらず、その間ほとんどRUNTEQを見かけていなかったのです。

理由は簡単で「広告をほとんど出してないから」です。

芸能人の小籔さんが年始から大々的に宣伝しているテックキャンプ。
厚切りジェイソンさんが宣伝しているTechAcademy[テックアカデミー]。

プログラミングスクールは今や数多く存在しているので、様々な広告が流れています。
でも、認知度が高いものは上述した2校ではないでしょうか。
つまり、至極当然ですが有名なプログラミングスクールは広告をめちゃくちゃ出してるから有名であり、広告を出していないRUNTEQは知名度が高くなかったんですね。

自分はRUNTEQを見つけた時には、別のスクールに入校を決めていました。
しかし、調べていく中でRUNTEQの評判がとても良かったので、説明会に申し込みました。

説明会前に得られた情報としては以下の2つだと思います。

1. スタートアップの自社開発企業に特化している
2. 想定の学習時間が900時間と他のスクールと比べて長いこと

スタートアップの自社開発企業に特化している

自社開発企業とは自社でサービスを持っている会社ですね。
例を挙げると、メルカリ、LINEとかに当てはまります。

しかし、そういった有名企業にいきなり未経験エンジニアが入るのは難しいです。
未経験エンジニアの間口自体も今非常に狭いので、未経験からそういった大企業に入るのはまず無理でしょう。

しかし、スタートアップ企業であれば間口は大手自社開発企業より広いので、まずスタートアップ企業に就職することを強く進めています。
実際、卒業生のほとんどはスタートアップの自社開発企業に行っています。

「え、他のプログラミングスクールなら卒業生で大手行ってるとこあるよ」
そう思うかもしれませんが、それは果たして自分に当てはまるでしょうか。

例えば、在校生が1万人いる大学から100人という1%の人が大手企業に入社できたという事実があるとします。
そして、その大学の説明会では「うちの大学の卒業生からはこのような大企業に合格している(1%だけだけど)」と事実を隠し聞こえのいいように紹介され、「ここに入れば自分もそういった大企業に行けるぞ」と思い込んでいるだけです。
実際入ってみると想像とは違うFラン企業に行かされる場合だってあるわけですね。

加えて言うと、Web系のスタートアップの自社開発企業に未経験エンジニアとして転職することは、間口が広いとはいえ非常に厳しいです。
新型コロナウイルスに伴って採用は縮小しているのに、エンジニアになってリモートワークで自由な働き方に憧れる人が増えて、現状エンジニアは買い手市場です。国内最大規模のエンジニアオンラインサロンを運営している勝俣健太さんは、「2000人エンジニアになりたいとしたら100人ぐらいしか自社開発企業に受からない」とおっしゃっていました。

話が脱線してしまいましたが、難易度が高くてもまずはスタートアップの自社開発企業に転職し、経験を積むことがRUNTEQの方針となります。

想定の学習時間が900時間と他のスクールと比べて長いこと

900時間って想像より長いです。
私は収入が途絶えてしまうのは現状リスクが高いと考え、働きながらプログラミングスクールを受講する予定でした。
働きながら時間を捻出して1ヶ月150時間勉強したとしても半年もかかります。

逆に他のスクールでは600時間程度がほとんどかと思います。
「600時間なら最短でエンジニアになれる」と私は考えていましたが、現状のエンジニア買い手市場を考慮すると、勉強時間が短いのは危険かと思いました。実際、エンジニアとして未経験から転職するなら1000時間の学習がないとおっしゃっている方々が多くいて、600時間では十分な実力に至らないと感じました。

説明会の内容

説明会当日は自分1人のために1時間の説明会を2人の担当者で行ってくださいました。
それまでに何校ものプログラミングスクールの説明会を受けていましたが、説明会は大体多くとも30分ほどで、形式もマンツーマンか、担当者1人対複数の参加者でしたので驚きました。

そして、実際にそのスクールのSlackの生徒の交流を見せてくれてたり、6ヶ月の長い期間の中でのカリキュラムの進め方など、とても具体的な説明を受けました。1時間と長い時間を取っているだけあって、疑問点がないように説明をしていただけました。
そのため、今までの説明会と違いスクールの実際の雰囲気や入校した後の自分のイメージができました。

説明会の中で以下の3点がRUNTEQの特徴として挙げられると思いました。

1. スクール内のコミュニティが活発
2. 1週間の学習時間の目安は25~30時間
3. 転職保証がない

スクール内のコミュニティが活発

RUNTEQで他のスクールと一線を画すと思ったのはコミュニティでした。
大きな違いは、「卒業生もそのコミュニティに永遠に参加し続けることができる」、です。

他のプログラミングスクールの卒業生の情報を見ると、卒業したらすぐ転職活動に入るため卒業したらコミュニティは解散というケースが多いという印象です。
しかし、RUNTEQでは見事未経験から自社開発企業に転職した先輩エンジニアがいつまでもそのコミュニティに参加を続け、受講生とかかわり続けています。
イメージとしては、高校の部活で最上級生は2つ上の先輩までですが、RUNTEQだと先輩の上の先輩とも容易に関わることが可能ということです!

基本的に他のプログラミングスクールだとコミュニティは同期という括りまでですが、RUNTEQは先輩も後輩も、さらには運営している方々も一つのコミュニティに参加しているので、オンラインサロンみたいな感じです。

1週間の学習時間の目安は25~30時間

わかってはいましたがそれ相応の勉強時間の確保はやはり必要だと説明されました。
30時間は、平日は仕事の時間を差し引くと1日3時間ほど、休日は7時間ほどやってやっと満たすことができます。
半年間遊ぶ時間はないですね(笑)

しかし、それぐらいの覚悟がないと未経験エンジニアとして転職できないということかなと改めて思いました。
1週間20時間のペースで短期間で学習した人と、1週間30時間のペースで長期間学習した人、どっちが成果を出せる可能性があるのかなんて聞く必要がないですね。後者です。
なのでむしろ自分がこのスクールに挑戦することでエンジニアとして生きていけるかどうかの足切りになるかと考えました。

転職保証がない

そしてこれは知らなかったのですが、RUNTEQは転職保証をしていないと説明を受けました。

「え!?!?!?転職保証ないの!?!?」と思われるかのしれませんが、自分は逆にすごく安心しました。
なぜなら、プログラミングスクールのたくさんの記事を読んだため、転職保証があるスクールが大体評判が良くなかったと感じたからです。(これは個人の意見ですのでどうかご容赦くださいませ)

転職保証。聞こえは必ず転職できるということで良いかもしれません。
ですが、紹介された企業には興味がなくても必ず面接に行かなければならない、内定が1つでも出たら転職保証は消えるなど、転職保証が
必ず良いことに繋がるとは限らないのです。むしろ、自分の希望しない企業に就職する確率が高まるかもしれません。

自分は現在SESに勤務しており、希望していた開発ではなくインフラの業務をしています。
他人任せで企業を紹介してもらうシステムはかなりうんざりしています。

なので、転職保証しないと明言していただいた方がかえって信頼できるなと安心しました。

これらの説明を受けて自分はRUNTEQで学んでみたいと強く思い入校することを決めました。
また、テックキャンプを返金しRUNTEQを受講している方の2校の比較動画もとても参考になりました。

比較動画

入学後のギャップはなし!!むしろ想像以上!

RUNTEQを入学して、期待とともに不安も当然ありました。
ある程度それまでにプログラミング学習を済ませていたので、申し込んだコースはある程度学習を済ませた方向けのコースを申し込みました。
そのため、受講額も最安値のプランで申し込めましたが、それでも新卒SES社員としては高額な支払いではありました。

しかし、入学後は説明会で聞かされていた内容の遥か上を行きました!

圧倒的に活発なコミュニティ

RUNTEQでは受講生との関わりがとても密です。

RUNTEQには受講生の個人用チャンネルを開設し、そのチャンネルに受講生やRUNTEQ講師陣が参加できる仕組みがあります。
そして、受講生は自分用のチャンネルをアウトプットのためにTwitterのように使用します。
他の受講生はそのアウトプットに対してコメントしたりスタンプを押したりしています。
結果、1人でプログラミング学習をするということはなく、後輩、先輩、講師が自分の学習を見てくれるのです。

加えて、イベントもとても盛んです。
DiscordというLINEとZOOMを足して2で割ったような便利なアプリがあるのですが、そこで毎週のように生徒が交流イベントがあったり、講師からの勉強会があったり、みんなでもくもく会も開いたりします。
RUNTEQのコミュニティがとてもラフなので、卒業生や生徒がイベントの集合をかけて集まったりもします。
この間は最近はやりのAmong usというゲームをやるだけの会が催され、ゲームを通して交流を深めることができました。(しかも運営の方も参加しました(笑))

プログラミングを1人で学習を続けることはとても辛いです。
コミュニティを提供するプログラミングスクールもオンラインのため教室が使えなくなり、他の生徒と交流できないことが多いのではないでしょうか。
そのような状況下でもRUNTEQのコミュニティは自分の学習の励みになりますし、友達や尊敬できる人がたくさん増え、めちゃくちゃモチベーションが上がりました。

受講している生徒のレベルの高さ

RUNTEQの受講生の評判はとどまることを知りません。

例えば、Twitterでバズったエンジニアチェッカーという受講生のポートフォリオがあります。
ご存じの方もいらっしゃるのではないでしょうか?
知らないという方は下記記事をご参照ください。エンジニアチェッカーを作成された方の記事です。

プログラミングを始めて3ヶ月半の未経験が「エンジニアチェッカー」を作ってインフルエンサーを撲滅してしまった話

卒業生もレベルは高いのですが、受講生もほんとにレベルが高いです。
例えば、自分より1ヶ月早い11月より受講している生徒で、すでにあるゲームのコミュニティサイトを運営されている方もいらっしゃいます。
こちらもサイト運営者の記事がありますので、詳しく知りたい方は下記記事を参照ください。

【未経験エンジニア必見】独学で作ったWebサービスを実際に運営してみたら世界が広がった話

やはり、週30時間の勉強時間というのはかなりきついと思うので、それだけ本気でエンジニアになりたい人だけが申し込むということでしょうか。
意識が高い人だけが集まるようにフィルタリングされているような気がします。

詳しくは説明会で!!

この記事ではカリキュラムについてはあまり触れていません。
詳しくは説明会を申し込んでください。
おそらく自分と同じように長い時間をかけて丁寧に説明してくださいると思います。

RUNTEQホームページ

これからもRUNTEQで学んだ課題のアウトプットもしていくとともに、RUNTEQの情報も定期的に伝えていけたらいいなと思います。
ひとます、ここまで読んでくださった皆様、ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Rails カラム追加、削除の方法

目的

テーブルを作ったはいいけどカラムを追加したいときにやり方あってるかな?と不安になるので書いてみた。

カラムの追加方法

ターミナルでコマンドを打ちます。

rails g migration Addカラム名Toテーブル名 カラム名:型

例えば、1つだけ増やしたい場合は、

 rails g migration AddNameToPosts name:string

複数の場合は、

 rails g migration AddColumnsToPosts name:string day:data

AddColumnsToPostsのColumnsのところはどんな名前でもOKです。

最後に、

 rails db:migrate

でOKです!

カラムの削除方法

カラムの削除方法も書いておきます。

rails g migration Removeカラム名Fromテーブル名 カラム名:型

例えば、1つだけ増やしたい場合は、

 rails g migration RemoveNameFromPosts name:string

複数の場合は、

 rails g migration RemoveColumnsFromPosts name:string day:data

こちらもRemoveColumnsFromPostsのColumnsのところはどんな名前でもOKです。

最後に、

 rails db:migrate

でOKです!

参考

https://qiita.com/ITmanbow/items/2bf4dfa4d9ca705b97df
とても参考になりました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails6】deviseによる新規登録・ログイン時のリダイレクト先変更

はじめに

ポートフォリオ作成中に詰まった点を備忘録として記述しています。
今回は、deviseにてユーザー新規登録・ログイン機能を実装しました。法人会員と個人会員の2種類のログインユーザーがおり、新規登録時及びログイン時には、法人or個人によって違う画面遷移にしたいと思い、リダイレクト先の変更を試みました。

deviseではデフォルトでリダイレクト先が指定されているため、deviseのコントローラーをカスタマイズする必要がありました。

環境

Ruby on Rails'6.0.0'
Ruby'2.6.5'

前提

deviseを使用し、ログイン機能を実装済み。

①controllerの作成

ターミナル
% rails g devise:controllers companies

上記コマンドにより、法人側deviseのcontrollerを編集することができます。app/controllers/companies側にファイルが生成されると思います。

②ルーティングの設定

rails routesでルーティングを確認すると、

ターミナル
new_company_session GET      /companies/sign_in(.:format)             devise/sessions#new
company_session POST       /companies/sign_in(.:format)            devise/sessions#create
(省略)
new_company_registration GET      /companies/sign_up(.:format)        devise/registrations#new

上記のように表示されます。devise/sessionsやdevise/registrationでは、反映されないため、ルーティングでカスタマイズを行います。

config/routes.rb
devise_for :companies, controllers: {
    sessions:      'companies/sessions',
    registrations: 'companies/registrations'
  }

カスタマイズを行い、再度rails routesを行うと下記のように表記が変わると思います。

ターミナル
new_company_session GET      /companies/sign_in(.:format)             companies/sessions#new
company_session POST       /companies/sign_in(.:format)            companies/sessions#create
(省略)
new_company_registration GET      /companies/sign_up(.:format)        companies/registrations#new

③controllerの編集

ここから、リダイレクト先を指定するメソッドを定義します。

app/controllers/companies/registrations_controller.rb
class Companies::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
  before_action :configure_account_update_params, only: [:update]

  def after_sign_up_path_for(_resource)
    companies_articles_path(リダイレクト先のpath)
  end
(省略)
end
app/controllers/companies/sessions_controller.rb
class Companies::SessionsController < Devise::SessionsController
  before_action :configure_sign_in_params, only: [:create]

  def after_sign_in_path_for(_resource)
    companies_articles_path(リダイレクト先のpath)
  end
(省略)
end

上記でリダイレクト先を指定することができました!!!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WSL環境のRubyにて、selenium(Firefox)を利用する

WSL環境のRubyにて、selenium(Firefox)を利用する

事前準備

必要なライブラリのインストール

firefoxをインストール

sudo apt-get update
sudo apt-get install -y firefox

firefoxのバージョンを確認

firefox --version

geckodriverをインストール

https://github.com/mozilla/geckodriver/releases

wget https://github.com/mozilla/geckodriver/releases/download/v0.28.0/geckodriver-v0.28.0-linux64.tar.gz
tar zxvf geckodriver-v0.28.0-linux64.tar.gz
chmod +x geckodriver
sudo mv -f geckodriver /usr/local/share/geckodriver
sudo ln -s /usr/local/share/geckodriver /usr/local/bin/geckodriver
sudo ln -s /usr/local/share/geckodriver /usr/bin/geckodriver

動作確認

  • パッケージの変更
Gemfile
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "webdriver"
gem "selenium-webdriver"
  • パッケージの反映
bundle install
  • Rubyのサンプルコード
test.rb
require "selenium-webdriver"

opts = Selenium::WebDriver::Firefox::Options.new(args: ['--headless'])
driver = Selenium::WebDriver.for(:firefox, options: opts)

driver.navigate.to "https://google.com/"

puts driver.title

driver.quit
  • 動作確認
ruby test.rb

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WSL環境のRubyにて、selenium(Chrome)を利用する

WSL環境のRubyにて、selenium(Chrome)を利用する

事前準備

必要なライブラリのインストール

sudo apt-get update
sudo apt-get install -y libappindicator1 fonts-liberation

ヘッドレスモードを使用できるchromeをインストール

sudo apt install gdebi-core wget unzip
sudo gdebi google-chrome-stable_current_amd64.deb

Chromeのバージョンを確認

google-chrome --version

chromedriverのインストール

現在インストールされている google-chrome に対応する chromedriver をダウンロードする
https://sites.google.com/a/chromium.org/chromedriver/

curl -O https://chromedriver.storage.googleapis.com/87.0.4280.88/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
chmod +x chromedriver
sudo mv -f chromedriver /usr/local/share/chromedriver
sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver

動作確認

  • パッケージの変更
Gemfile
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "webdriver"
gem "selenium-webdriver"
  • パッケージの反映
bundle install
  • Rubyのサンプルコード
test.rb
require "selenium-webdriver"

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')

driver = Selenium::WebDriver.for(
  :chrome,
  options: options
)
driver.navigate.to "https://www.google.com/"

puts driver.title

driver.quit
  • 動作確認
ruby test.rb

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PyCallがPyCall::PythonNotFoundで動かないとき

rbenvでインストールしたRubyで、pyenvでインストールしたPythonを、pycallで呼ぼうとしたときPyCall::PythonNotFoundで落ちた。find_libpythonメソッドでlibpythonが見つけられていない様子。

Traceback (most recent call last):
        5: from hoge.rb:4:in `<main>'
        4: from /Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall/import.rb:18:in `pyimport'
        3: from /Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall.rb:62:in `import_module'
        2: from /Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall/init.rb:16:in `const_missing'
        1: from /Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall/init.rb:35:in `init'
/Users/fuga/.anyenv/envs/rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/pycall-1.3.1/lib/pycall/libpython/finder.rb:95:in `find_libpython': PyCall::PythonNotFound (PyCall::PythonNotFound)

確認コマンドを実行する。

$ PYCALL_DEBUG_FIND_LIBPYTHON=1 ruby -rpycall -ePyCall.builtins
...
DEBUG(find_libpython) Fiddle::DLError: dlopen(libpython3.9.a, 9): image not found
DEBUG(find_libpython) Fiddle::DLError: dlopen(libpython3.9, 9): image not found
DEBUG(find_libpython) Fiddle::DLError: dlopen(libpython, 9): image not found

static libraryをdlopenしようとしていて失敗している。shared libraryなlibpythonがインストールされるように、pyenvでPythonをインストールしなおす。

$ CONFIGURE_OPTS="--enable-shared" pyenv install 3.9.1

これで無事に動いた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む