超初心者がエンジニアになるまでの力戦奮闘の軌跡

プログラミングをメインで学んだことのアウトプットブログ

Ruby技術者認定試験 Silver試験の模擬問題集を解いてみた #1

概要

半年ほどRubyを使用してきましたが、現状Rubyをどれほど理解しているか気になったのでRubyの資格試験の模擬問題集を解いてまとめました。

※解説は用意されていたため、全ての問題の解説は行っておりません。分からないことなどがあった際に調べたことをアウトプットのためまとめた記事になっておりますのでご注意ください。

利用サイト

https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0

実践

問題1

予約語⋯キーワードや予約語は、ある内部処理のために使用される、またはいくつかの事前定義されたアクションを表す言語内の単語(例:ifやclassなど)

もし予約語の意味がわからなくても、この問題ではRubyで実装しているときによく使うものを選べば答えられます。

予約語に関してはこちらの記事で大変詳しく説明されていました。

問題2

これは引数を可変長引数とした処理に関しての問題でした。

可変長引数では引数にアスタリスク(※)をつけることで複数の引数を取り、配列を返します。

例:

def foo (*b)
    p b
end

foo(1,2,3,4)
# => [1,2,3,4]

今回の問題では第一引数に一つ目の数字が普通に入るだけなので1が入り、残りは*bに配列として入ります。

もしも今回の引数が*bではなくただのbだったらArgumentError (wrong number of arguments (given 3, expected 2))と「引数に渡される数があっていませんよ!」というエラーが起こります。

メソッドの引数にアスタリスク - Qiita

問題4

これはTimeクラスに加算が使えるのかどうかの問題です。

下記のサイトで詳しく説明がされていますが、Timeクラスのオブジェクトは+を利用して加算を行うことができます。(/や*、%での計算はエラーが起こります。)

時刻の加減算 - 時刻(Time)クラス - Ruby入門

問題5

ローカル変数の名前の付け方についての問題です。

1. 1文字目は英小文字かアンダーバー(_)
2. 2文字目以降は英数文字、アンダーバー
3. 予約語は使用できない

注意点は3つ目の「予約語は使用できない」という点。なのでbreakなどは使えません。

変数名 - 変数 - Ruby入門

まとめ

今回は1~5問までやりました。

基礎的な問題が多いのでこの辺りの問題はRubyを使う者としてスラスラと答えられるようにします。

テーブルにカラムを追加・削除など

概要

テーブルにカラムを追加や削除したい時などの操作をまとめます。 Railsではテーブル作成にマイグレーションファイルを作成しますが、テーブルを編集する際には過去に作成したマイグレーションファイルを編集するのではなく、変更するマイグレーションファイルを作成することによってテーブルを操作します。

カラムの追加

rails g migration Addカラム名Toテーブル名 カラム名:データ型という形でテーブルにカラムを追加します。

例)Usersテーブルにemailカラムを追加したい時

rails g migration AddEmailToUsers email:stringを実行します。

下記のファイルが作成されます。

class AddEmailToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :email, :string
  end
end

これでrails db:migrateを行うとテーブルにカラムが追加されます。

カラムを削除

rails g migration Removeカラム名Fromテーブル名 カラム名:データ型という形でテーブルのカラムを削除します。

例)Usersテーブルからemailカラムを削除する

rails g migration RemoveEmailFromUsers email:stringを実行します。

下記のファイルが作成されます。

class RemoveEmailToUsers < ActiveRecord::Migration[6.0]
  def change
     remove_column :users, :email, :string
  end
end

これでrails db:migrateを行うとテーブルのカラムが削除されます。

カラムにデフォルト値を追加する

rails g migration ChangeColumnDefaultToテーブル名でデフォルト値を設定するマイグレーションファイルを作成します。

例)Articlesテーブルにstatusカラムのデフォルト値で0を追加

rails g migration ChangeColumnDefaultToArticlesマイグレーションファイルを作成します。

すると下記のファイルが作成されるので、その中にfrom: 変更前のデフォルト値, to: 変更するデフォルト値を記述します。

class ChangeColumnDefaultToArticles < ActiveRecord::Migration[6.0]
  def change
    change_column_default :articles, :status, from: nil, to: "0"
  end
end

これでrails db:migrateを行うとカラムにデフォルト値のオプションが追加されます。

カラムにindexオプションを追加

rails g migration AddIndexToテーブル名カラム名という形でテーブルのカラムにindexを追加します。

例)Usersテーブルにemailでインデックスを作成

rails g migration AddIndexToUsersEmailマイグレーションファイルを作成します。

すると下記のファイルが作成され、unique属性を追加する場合は追記します。

class AddIndexToUsersEmail < ActiveRecord::Migration[6.0]
  def change
    add_index :users, :email, unique: true
  end
end

これでrails db:migrateを行うとindexが追加されます。

テーブル名を変更

例)UsesテーブルをUsersテーブルに変更する

マイグレーションファイル作成

rails g migration ChangeUsesToUsersマイグレーションファイルを作成します。

すると下記のファイルが作成されるので中に変更するテーブル名を記述します。

class ChangeUsesToUsers < ActiveRecord::Migration[6.0]
  def change
    rename_table :uses, :users
  end
end
②モデル修正

Use.rbでモデルファイルが作成されているので、User.rbに変更します。

それに応じてファイルの中身もclass Use < ApplicationRecordからclass User < ApplicationRecordに変更。

アソシエーションの設定をしている他のモデルがあればそちらも修正していきます。

③コントローラやビューの修正

必要に応じてコントローラやビューの中身も修正します。

ここは個人個人でかなり違ってくると思うので、VScodeの検索機能などで該当するものを探してもれなく修正しましょう。

マイグレーションファイルを適用する

rails db:migrateを忘れずに行い適用させます。

参考サイト

Railsでデータベースカラムの追加を行う方法 - Qiita

Rails - データベースのカラムにindexを追加する - fv17の日記 - Coding Every Day

Rails で既存カラムにdefault オプションを追加したい - Qiita

【Ruby on Rails】テーブル名の変更方法と変更時にやること一覧&ステップ - Qiita

感想

今回はテーブル周りの変更についてまとめました。

まだまだあると思うのでまた新しく出てきたらここに追記していきます。

Railsを使ったポートフォリオに追加したいAPI #1

概要

ポートフォリオを作成しているとき、もしくはすでに完成させて見直してみた時に「うーん、とりあえず作成してみたけど、転職活動でアピールする部分が少ないな」って思ったので、転職活動でもアピールできるようなAPIを追加してみようと思いました。 そう思っていた時にちょうど通っているプログラミングスクールでそのことについて言及した動画をあげていたのでそれを参考に1つずつ紹介していきたいと思います。

ただ、自分の作ったアプリで使えそうなものが1つしかなかったのでとりあえず今回は1つだけ紹介。

参考

www.youtube.com

こちらの動画は通っているプログラミングスクールRUNTEQさんがあげているAPI紹介のYoutubeの動画です。今回はこちらから1つピックアップしました

API

auth0

認証・認可をやってくれるAPI

  • SNSを利用してのログイン認証などの組み込み

  • 2段階認証の実装

  • Botの検知

などが可能になります。

料金

7000ユーザーまで無料で、1万ユーザーを超えると月23ドルかかります。

今後もいいAPIがあったらまとめていきます!

Ruby技術面接に向けて #2

概要

#1に引き続き、下記のサイトを利用してRubyの技術面接対策を行います。Q47〜Q53

techracho.bpsinc.jp

参考サイト 

[Q47] 【まとめ】インスタンス変数、クラス変数、クラスインスタンス変数 - Qiita

[Q49] map, select, collect, each の違いところ - Qiita

[Q52] 【Ruby入門】private と protected の使い方まとめ【メソッドのアクセス制御】 | 初心者向け完全無料プログラミング入門

[Q53] シングルトンパターン(Singleton) | Ruby デザインパターン | 酒と涙とRubyとRailsと 【Rubyによるデザインパターンまとめ10】シングルトンパターン - 銀行員からのRailsエンジニア

調べたことなど

インスタンス変数とクラス変数の違い(Q47)
  • インスタンス変数:変数の前に@をつけて定義します。オブジェクトの外からは直接変更などができません。なのでinitializeメソッドやインスタンスメソッドからのアクセスはできますが、クラスメソッドからのアクセスはできません

  • クラス変数:変数の前に@@をつけて定義します。そのクラス全体で共有されます。オブジェクト外から値の変更も可能。

「find」,「find_by」,「where」の違い(Q48)
  • find:引数とマッチする主キー(id)を持つデータを検索するメソッド。主キー以外の条件では検索できず、エラーが返ってくる。

  • find_by:主キー以外の条件でも検索でき(主キーも可)、複数の条件を指定できる。同じ条件を持つデータが複数ある場合、最初に見つかったデータ1件のみ取得する

  • where:検索した条件のデータを配列として取得する。そのため、複数のデータを取得できる。

「select」,「map」,「collect」の違い(Q49)

select:ブロック内の条件に合う要素を探して、ブロック内の処理を実行し戻り値を配列に入れる。もし要素に条件にあうものがなければ空の配列となる。

map:要素の数だけブロックの処理を実行し、その戻り値を配列に入れる。そのため戻り値がない場合はnilが入る。

collect:mapのエイリアス(別名)のためmapと同じ動きをする。

map!は破壊的メソッドで、今ある配列の中身を書き換えます。

a = [1,2,3]

a.map{|n| n*3 if n == 1}
#=>[3, nil, nil]

a
#=>[1,2,3]


a.map!{|n| n*3 if n == 1}
#=>[3, nil, nil]

a
#=>[3, nil, nil]

select!でも同様です。

CRUDのHTTP verb(動詞、メソッド)とそれに対応するアクション(Q50)
HTTP verb アクション
GET index
GET new
POST create
GET show
PATCH/PUT update
DELETE destroy
Rubyの3段階のアクセス制御に関して(Q52)

Rubyではクラスの中のメソッドを外部から直せるアクセスできないように制御する設定することができます。

  • public:デフォルトで設定されている任意のオブジェクトから呼び出せます=>制御しない設定です

  • private:設定されたメソッドは関数形式でしか呼び出せません。そのオブジェクト自身=>同じインスタンスからしか見えない設定です。レシーバーを指定できません。

  • protected:クラスの外からは呼び出せません。他のインスタンスでも同じクラスやサブクラスなら呼び出せます。

正直この問題に関してはまだ曖昧さが残っており、他のサイトなどの例などを見ながら理解していきたいと思います。

シングルトンとは(Q53)

シングルトンパターンを提供するモジュール。 シングルトンパターンとはクラスにインスタンスを1つしか持たせないデザインパターン。アプリケーションで一度しか使わないインスタンスを設定することができるので、newメソッドをprivateメソッドに設定して新しくインスタンスを作れなくします。

技術面接に向けて #1

技術面接に向けて

転職活動を開始して約一ヶ月、自己分析や職務経歴書、履歴書についてはいろいろ対応してきましたが、エンジニア職は技術面接がある企業が多いのでそちらの対策も必要になってきました。

自分はRailsポートフォリオを作ったので技術面接もRubyをメインに想定して対策していきたいと考えています。

利用したサイト

techracho.bpsinc.jp ↑プログラミングスクールでもこちらのサイトを勧められたので、こちらの質問に答えられるようにまずはなろうと考えました。

参考サイト

[Q42] ぢみへんプログラミング日誌 Rubyにおける多重代入について

[Q43] Rubyのextendメソッドの使い方を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン

[Q44] Rubyのmoduleの使い方とメリットを理解して脱初心者!|TECH PLAY Magazine [テックプレイマガジン]

[Q45] 【Rails】 モデルのスコープ機能(scope)の使い方を1から理解する | Pikawaka

調べたことなど

Q41までは事前に終えていたのでQ42以降の問いで調べたことをまとめていきたいと思います。

splat演算子について(Q42)

splat演算子は、メソッドに渡される引数の数を事前に決めておきたくない場合に使われます。Rubyにはsplat演算子*とdouble splat演算子**の2種類があります。

一度も見かけたことがなかったので難しそうと思いましたが調べてみるとそうでもありませんでした。

spalt演算子を使うことによってメソッドの引数が可変できるようになり、配列として引数に渡されます

def spl(*a)
  a.each {|x| puts x }
end

spl(1,2)

# => 1
# => 2
# => [1, 2]

特徴的な点として引数に何も渡さなくてもエラーは起こらず、空の配列が渡されます。

def spl(*a)
  a.each {|x| puts x }
end

spl(1,2)
1
2
=> [1, 2]

spl
# => [ ]

double splat演算子**もspalt演算子と似ていますが、こちらは配列ではなく引数にキーバリューを取ります。

def double(**x)
  x.each {|k,v| puts v }
end

double('a':1, 'b':2)
# => 1
# => 2
# => {:a=>1, :b=>2}

double
# => {}

includeとextendの違いについて(Q43)

どちらもミックスインでモジュールの機能を追加するために使われるものです。

違いはincludeメソッドは「あるクラスにモジュールを取り組む際に使用する」のでインスタンスメソッドとしてアクセスしますが、extendメソッドは「オブジェクトに取り組まれた後で呼び出す」のでクラスメソッドとしてアクセスします。

loadとrequireの違い(Q44)

どちらもファイルを読み込みますが、

  • loadの場合、何回でも同じファイルを読み込むことができますが、ファイルの拡張子.rbの記述が必要となります。(例:'./test.rb')

  • requireの場合、1つのファイルは一度だけ読み込むことができ、ファイルの拡張子.rbの記述は必要ありません。(例:'./test')

クラスとモジュールの違い(Q45)

  • クラスはインスタンスを生成でき、継承することができます

  • モジュールはインスタンスを生成できませんが、他のモジュールやクラスにミックスインできます

スコープについて(Q46)

スコープをモデルなどで設定することで、よく使用されるクエリを定義できます。 それにより、定義したクエリロジックをいろいろな箇所でよびだせるようになり、コードが短くなったり、修正する場合にスコープのロジックを変更するだけで良かったりします。

今回はここまで

アウトプットをして学習効果をアップさせる

このブログを書くにあたって

約八ヶ月、プログラミングスクールで勉強してきたが自分が成長できているのか、何を学んだのかが明確にならず、漠然とした不安に襲われました。

そんなときに、とあるYahooの記事で元警官の方がITエンジニアになったという記事を読みました。その中ではブログとしてアウトプットすることの重要性が書かれていたので自分も自分のために一度ブログを始めようと思いました。

 

なぜブログ?

エンジニアの方ならほとんどの方が知っていると思いますが、qiitaという勉強したことを投稿するサイトに投稿することも考えたのですが、他の方に教えたいというよりも自分の学んだことのまとめや転職のこと、日常生活のことも投稿したいと思ったのでブログという形を選びました。

 

終わりに

まだまだ拙い文章ですが、どうか暖かく見守っていただければと思います。