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))
と「引数に渡される数があっていませんよ!」というエラーが起こります。
問題4
これはTimeクラスに加算が使えるのかどうかの問題です。
下記のサイトで詳しく説明がされていますが、Timeクラスのオブジェクトは+を利用して加算を行うことができます。(/や*、%での計算はエラーが起こります。)
問題5
ローカル変数の名前の付け方についての問題です。
1. 1文字目は英小文字かアンダーバー(_) 2. 2文字目以降は英数文字、アンダーバー 3. 予約語は使用できない
注意点は3つ目の「予約語は使用できない」という点。なのでbreak
などは使えません。
まとめ
今回は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つだけ紹介。
参考
こちらの動画は通っているプログラミングスクールRUNTEQさんがあげているAPI紹介のYoutubeの動画です。今回はこちらから1つピックアップしました
API
auth0
認証・認可をやってくれるAPI。
などが可能になります。
料金
7000ユーザーまで無料で、1万ユーザーを超えると月23ドルかかります。
今後もいいAPIがあったらまとめていきます!
Ruby技術面接に向けて #2
概要
#1に引き続き、下記のサイトを利用してRubyの技術面接対策を行います。Q47〜Q53
参考サイト
[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という勉強したことを投稿するサイトに投稿することも考えたのですが、他の方に教えたいというよりも自分の学んだことのまとめや転職のこと、日常生活のことも投稿したいと思ったのでブログという形を選びました。
終わりに
まだまだ拙い文章ですが、どうか暖かく見守っていただければと思います。