- 投稿日:2021-06-20T22:22:12+09:00
「TestTube」をようこそ
TestTubeを紹介したい ? この簡単なテストツールはSpectusのエンジンだ。 使うために、マッチャーがいる。 例えば、Matchiから、コレクションがある。 今のは、このマッチャーを使う: class BeTheAnswer def matches? 42.equal?(yield) end end それに、このブロックを定義する: block_of_code = -> { "101010".to_i(2) } 今、結果を見てみよう: experiment = TestTube.invoke( block_of_code, isolation: false, matcher: BeTheAnswer.new, negate: false ) experiment.actual # => 42 experiment.error # => nil experiment.got # => true 成功!よくやった! 読んでくれてありがとう。
- 投稿日:2021-06-20T22:22:12+09:00
「TestTube」にようこそ
TestTubeを紹介したい ? この簡単なテストツールはSpectusのエンジンだ。 使うために、マッチャーがいる。 例えば、Matchiから、コレクションがある。 今のは、このマッチャーを使う: class BeTheAnswer def matches? 42.equal?(yield) end end それに、このブロックを定義する: block_of_code = -> { "101010".to_i(2) } 今、結果を見てみよう: experiment = TestTube.invoke( block_of_code, isolation: false, matcher: BeTheAnswer.new, negate: false ) experiment.actual # => 42 experiment.error # => nil experiment.got # => true 成功!よくやった! 読んでくれてありがとう。
- 投稿日:2021-06-20T22:16:04+09:00
herokuデプロイ後のエラー uninitialized constant ApplicationCable::ActionCable (NameError)
やっとherokuにデプロイできたのに 数々のエラーを解決してやっとの思いでherokuへデプロイ後 uninitialized constant ApplicationCable::ActionCable (NameError) こんなエラーメッセージが出てきたので解決方法を書き留めておきます。 heroku openするとエラー画面が ここに書いてあることを簡単に訳すと 「アプリケーションでエラーが出たので、次のコマンドでログを確認してください。」ということです。 $ heroku logs --tail ちなみに翻訳はこちらのDeepLがおすすめです! DeepLトップページ 「Google翻訳」よりも制度の高い日本語に翻訳してくれます。 そこで上記のコマンドを打ってログを見てみました。 ログを眺めてみる 今回はログの中にこんなエラーが表示されていました。 2021-06-20T11:17:05.170313+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=obscure-fjord-38948.herokuapp.com request_id=b4d66ca2-5f24-4cb8-996b-4b386d3b83fa fwd="126.255.41.232" dyno= connect= service= status=503 bytes= protocol=https これを調べてみたところ「アプリケーションが起動できず、ページを表示できない」とのこと。 参考 Heroku Dev Center そこで起動できない原因を探すためにログを見ると下記エラーが見つかりました。 /app/app/channels/application_cable/channel.rb:2:in `<module:ApplicationCable>': uninitialized constant ApplicationCable::ActionCable (NameError) このエラーを元に検索し、下記を追加することで解決です。 config/application.rb require "action_cable" [Rails-5] uninitialized constant ApplicationCable::ActionCable #23183 おわりに 最近エラー続きでしたが、エラー文やログをきちんと見るのって大切なんだなと実感しています。 書き忘れていましたが、herokuへデプロイ後すぐに $ heroku run rails db:migrate こちらを行っています。 以上、herokuデプロイ後のエラーを解決した方法でした。
- 投稿日:2021-06-20T22:07:20+09:00
AtCoder問題の復習(Ruby) 6/19開催AtCoder Beginner Contest 206(Sponsored by Panasonic)
6/20に行われたAtCoder Beginner Contest 206(Sponsored by Panasonic)の問題の復習です。 Rubyを学習してきたので、Rubyで回答しています。 始めたばかりでまだまだレーティングが低く、AB問題はだいたい問題なく解け、CD問題は解けたり解けなかったり、EFはほぼ解けないという状態のため、ABCD問題について復習がてら自分の解答をまとめてみました。 A Maxi-Buying (https://atcoder.jp/contests/abc206/tasks/abc206_a) ABC国の消費税率は8パーセントです。 ABC国にはエナジードリンク屋さんがあります。ここでは、エナジードリンク1本を、税抜きN円で販売しています。 ここに消費税を加算した後の金額は|1.08×N|円となります。 ただし、実数xに対し、|x|はx以下の最大の整数を表します。 この金額が定価の206円より安いなら Yay! 、定価と等しいなら so-so 、定価より高いなら :( と出力して下さい。 Nは整数 入力 N 出力 答え 解答 入力した数値に税率1.08をかけて小数点以下を切り捨てるfloorメソッドを使って数字を整えました。 その結果をもとに条件式でYay!、so-so、:(の3つから出力するものを決める記述を行いました。 N = gets.to_i sum = (N * 1.08).floor if sum < 206 puts "Yay!" elsif sum > 206 puts ":(" else puts "so-so" end B Saving (https://atcoder.jp/contests/abc206/tasks/abc206_b) シカのAtCoDeerくんは、空の貯金箱を持っています。 AtCoDeerくんは、その貯金箱に、 1日目の朝に1円、2日目の朝に2円… というように、i日目の朝にi円を貯金箱に入れます。 また、AtCoDeerくんは、毎日夜に貯金箱にいくら入っているかを確認します。 AtCoDeerくんが貯金箱にN円以上入っていることを初めて確認するのは、何日目の夜でしょうか? 入力 N 出力 答え 解答 貯金の合計値がNよりも大きくなるまで貯金をする繰り返し処理を行います。 貯金額がNより大きくなった時に繰り返し処理をした回数が答えになります。 貯金額の合計値をsum、繰り返し処理をした回数をiと定義し、sumがNを超えた時に処理を止め、その時のiを出力する記述にしました。 N = gets.to_i sum = 0 i = 0 until N <= sum do i += 1 sum += i end puts i C Swappable (https://atcoder.jp/contests/abc206/tasks/abc206_c) N個の整数からなる配列A=(A1,A2,...,AN)が与えられるので、 次の条件を全て満たす整数組 (i,j)の数を求めてください。 1≤i<j≤N Ai≠Aj 入力 N A1 A2 A3 .... AN 出力 答え 解答 時間制限で不可となった解答 (A1,A2),(A1,A3)...(A1,AN) (A2,A3),(A2,A4)...(A2,AN) の組み合わせ全てに対してAi≠Ajを満たす組み合わせをすべて抽出し、その中で同じ組み合わせになっていないものをカウントして出力しようと考えた。 N個の数値があるので、(Ai,Aj)となるときのAi側の数値を1~Nとした時にAjはN-i個分の個数を確認すればよい。 そこでAi側に対してN回繰り返し処理を行わせ、Aj側にはN-i回の繰り返し処理を行わせ、A1~ANすべての値を使った組み合わせる処理を記述した。 その中でAi ≠ Ajとなる組み合わせを配列combiに格納し、その個数を出力することで答えを得ようと考えた。 答え自体は出力例と同じ答えがでるが、処理時間が長すぎて誤りとなってしまった。 N = gets.to_i array = gets.split.map(&:to_i) combi = [] N.times do |i| (N-i).times do |j| if (array[i] != array[j+i]) combi << [array[i],array[j+i]] end end end p combi.length 時間制限をクリアできる記述方法 すべての組み合わせの内、条件を満たさない組み合わせを考えて減算することで答えを出す方法 入力した値N個に対して考えられる組み合わせの数はN個から2つの数字を選ぶのでNC2となり、 N*(N-1) / 2 です。 このすべての組み合わせから Ai=Aj となる組み合わせを減算すれば答えになります。 例えば 2,2,3,4,4,4という数値が与えられた場合は 2に対しては2C2つまり1通りがAi = Ajとなります。 3に対してはすべての組み合わせが有効 4に対しては3C2つまり3通りがAi = Ajとなります。 よってこの場合はすべての組み合わせは6この要素から2つの要素を選ぶ組み合わせになるため、6C2ですべての組み合わせが表せます。その中から同じ要素があるものに対してはそれぞれ減算を行うことで答えを得ることができます。 6C2 - 2C2 - 3C2 = (6*5/2*1) - (2*1/2*1) - (3*2/2*1) = 15 - 1 - 3 = 11 よってこの場合の答えは11通りとなります。 この流れを記述します。 入力されたN個の数値をsort!メソッドを使って小さい順に並べ替えます。 数値に絶対に入力されることのない0を小さい順に並べ替えた後に格納します。(処理の上で必要な操作になるので、後述します。) 同じ要素の個数をカウントするためcntを定義します。 後述しますが、並べ替えられた数値を比較するための最初の値としてbefore=0で定義します。 入力されたN個の数値の組み合わせはsumで定義します。 入力されたN個の値を配列arrayに格納します。 beforeに対して同じ数値であればcntを1つ増やします。 beforeとnumが違う場合は違う組み合わせとなるまでカウントしたcntを使って、cnt*(cnt-1)/2の組み合わせ分がAi=Ajとなるため、sumからこの数を減算します。 その後cntは1に戻し、比較するbeforeの数値をnumに置き換えます。 その後はまた同じように処理を繰り返します。 この結果残ったsumの値が問題文の条件を満たす要素の個数となり、この問題の答えとなります。 N = gets.to_i array = gets.split.map(&:to_i) array.sort! array << 0 cnt = 1 before = 0 sum = N * (N-1) / 2 array.each do |num| if num == before cnt += 1 else sum -= cnt * (cnt-1) / 2 cnt = 1 before = num end end puts sum まとめ AB問題はすぐに溶けたのですが、C問題は処理の時間制限にかかり不適切な解答となってしまった。 D問題以降は時間が足りず回答できずに終了 Cまでは最低ラインとして回答できるように学習していきます!
- 投稿日:2021-06-20T21:35:16+09:00
【Ruby】配列を条件に基づいて分割したい
概要 Enumerable#partitionメソッド使って、条件に当てはまるものとそうでないものに分類できます。 結果が真(true)の組みと偽(true以外)の組みの2つの要素からなる配列を返します。 array = [1,2,3,6,7,8] array_partition = array.partition {|i| i < 5} array_partition #=> [[1, 2, 3], [6, 7, 8]] array_partition[0] #=> [1, 2, 3] array_partition[1] #=> [6, 7, 8] どんな時に使うと便利? 数値などでpartitionメソッドを使って分割すると、真(true)の組みと偽(true以外)の組みに分割した配列を作成できて便利に使用できます。 例:3で割り切れる数値の配列とそうでない配列に分割 array = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] array_partition = array.partition {|i| i % 3 == 0 } array_partition #=> [[9, 6, 3, 0], [10, 8, 7, 5, 4, 2, 1]] # 3で割り切れる数値の配列 array_partition[0] #=> [9, 6, 3, 0] # 3で割り切れない数値の配列 array_partition[1] #=> [10, 8, 7, 5, 4, 2, 1] 参考資料 Ruby 3.0.0 リファレンスマニュアルEnumerable#partition
- 投稿日:2021-06-20T21:26:58+09:00
【Ruby】 クラス、インスタンスとは?違いなどをプログラミング初心者のために解説!
背景 未経験からエンジニアを目指し勉強中です。 自分ひとりでWebアプリケーションを作ってみたり、日々精進しているところですが、 まだまだ精進が足りないと感じたため、理解できそうでいまいちできない「クラス」と「インスタンス」について、 私自身の備忘録も兼ねて、解説しようと思います。 また、本記事は「クラスとインスタンスついてざっくりと理解しよう」というコンセプトで執筆しておりますので、 発展的な内容に関しては別の記事で解説していこうと思います。 記事が出来次第こちらの記事からも飛べるようにいたします。 最後になりますが、初学者故に、至らぬ点が多々あるとは思いますが、温かく見守っていただけますと幸いです。 なお、何かお気づきの点があればコメントにてご指摘ください。 クラスとインスタンスの関係 クラスとは「モノを作る際の設計図」です。 例えば、人間というモノを作成するときの場合は以下のようになります。 皆さんもご存知の通り、人間にはそれぞれ個性があって、DNAから何から何まで全て同じ人は存在しません。 ですが、人間には共通しているところもありますよね。例えば、 身長があること 体重があること 目や口が存在すること などです。また、このような機能面以外にも、 食べる 笑う 走る などのアクション面も共通しています。 このように、「モノ」を作成するにあたって、もとになるような共通事項をまとめてあるものをクラスと言います。 この設計図をもとに「インスタンス」と呼ばれる実際の「モノ」を作成していくわけですね。 まとめ ざっくりとした説明ではありますが、これでクラスとインスタンスについての解説は以上になります。 同じプログラミング初心者の方にとって少しでも参考になれば幸いです。 ここまでご覧いただき誠にありがとうございました。 必要があれば、修正・追記をいたしますので、 何かお気づきの点などございましたら、コメントにてご連絡ください。 参考文献 クラスとオブジェクトとインスタンスの関係 【Ruby】クラスとかインスタンスについて改めて学習してみた 上記の記事を参考にさせていただきました。こちらの記事の方が詳しく書いていることもありますので、 そちらも是非参考にしてみてください。
- 投稿日:2021-06-20T20:05:16+09:00
N+1問題の解決法(Ruby on Rails)
N+1問題とは 1つのテーブルへのSQL発行と。N回の関連デーブルへのSQL発行が発生してしまうこと。 データ量が多い大規模サービスで顕著に低いパフォーマンスが現れてしまう。 対象のモデル N+1問題を確認するモデルは,tag_categoryモデルとtagモデル。 以下の2つのモデルは1対多の関係になっている。 SQL発行のタイミング 例えば以下の処理をコンソールから入力したとする。 Ruby Tag.find(1) このコードでは、Tagsテーブルのレコードからidが1のものを検索しTagモデルのインスタンスを生成している。 関連するモデルの値を生成するSQL Ruby Tag.find(1).tag_category このコードを実行すると。 1. idが1のレコードをTagsテーブルから取得する 2. 検索結果のレコードからtag_catory_idを取得する 3. tag_categorysテーブルから2で検索したtag_category_idのレコードを取り出す 4. 検索したレコードからtag_categoryインスタンスを生成する N+1問題が起こる仕組み ループによってインスタンスを複数生成する場合にN+1問題が発生する。 Ruby Tag.limit(5).each do |tag| tag.tag_category end 以下のコードを実行すると、 1. Tagテーブルから5件のレコードを取得する 2. ブロック内で書くTagインスタンスに基づくtag_categoryインスタンスを取得するループ処理を行う よって、このコードでは5+1回SQLの発行が行われN+1問題が発生している。 N+1問題を解消する方法 アクティブレコードで以下のメソッドを使用してSQLを発行する。 1. joins 2. left_outer_joins 3. eager_load 4. preload 5. includes
- 投稿日:2021-06-20T19:11:34+09:00
Rails現場に入ってわからなかったコードまとめ
はじめに 内容は、タイトルの通りになります。 結構Rubyの学習に近い内容になっています。 : : ::を使用することで、クラスを参照・呼び出すことができる。 呼び出したいクラス class V2::Hoge end 呼び出す時 def hoge run(V2::Hoge) end キーワード引数 キーワード引数を使用することで、値に引数名を指定して、渡すことできる。 def hello(name: ) name end p hello(name: "hello") => hello **(変数名) キーワード引数の書き方の一つ。 定義に存在しない値をハッシュオブジェクトとして受け取ることができる。 def hoge(a: 0,**num) [a,num] end p hoge(a: 1,x:10) => [1,{:x=>10}] attr_reader インスタンス変数読み取り用メソッドが定義できる このようにインスタンス変数を読み取るだけのメソッドを簡略化できるのが、attr_reader def name @name end attr_readerメソッドを使用したやり方 attr_reader :name 同じ内容の意味になる。 reject 各要素やブロックに対して、偽であったものに対して、処理を行い、配列として返す。 (1..6).reject {|i| i % 2 == 0 } # => [1, 3, 5] Ruby 3.0.0 リファレンスマニュアル map(&: ) 簡略系 普通の書き方 hoge.map{|i| i.length) map(&:)を用いた書き方 hoge.map(&:length) nonzero 0の時にnilを返しそれ以外の時は、selfを返す。 0.nonzero? => nil 10.nonzero? => 10 まとめ まだまだ、わからないコード・書き方がたくさんあるので、随時更新していこうと思います。 参考記事 Ruby on Railsの現場でよく見る書き方【実例あり】 Rubyのキーワード引数はシンボルっぽく定義するけど、シンボルそのものではない、という話 Ruby 3.0.0 リファレンスマニュアル
- 投稿日:2021-06-20T18:32:02+09:00
RAILS_ENV=production rails db:create db:migrate コマンドがエラーになる時の対処法
Railsアプリのpriduction環境用のデータベースを作成するときに、RAILS_ENV=production rails db:create db:migrateコマンドを実行したのですがエラーが発生しました。 $ RAILS_ENV=production rails db:create db:migrate FATAL: Peer authentication failed for user "test_2" Couldn't create 'hello_rails_production' database. Please check your configuration. rails aborted! PG::ConnectionBad: FATAL: Peer authentication failed for user "test_2" /home/horikoshi5/hello_rails/bin/rails:9:in `<top (required)>' /home/horikoshi5/hello_rails/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => db:create (See full trace by running task with --trace) これを解決するには、/etc/postgresql/11/main/pg_hba.confファイル(11の所は入っているpostgresqlのバージョンによって異なります)の local all all peer を下記のように変更すれ必要があります。 local all all md5 そして最後にpostgresqlを再起動すれば完了です。 $ sudo systemctl restart postgresql.service 参考 [https://ryotatake.hatenablog.com/entry/2019/05/03/postgresql_peer_authentication_failed:title]
- 投稿日:2021-06-20T17:48:30+09:00
[Ruby on Rails] N+1問題の解決法(joinsメソッド編)
はじめに 今回ポートフォリオ(以後PF)制作で、 日本各地の名所を投稿できるサイトを制作しました。 実際に製作したサイトと、コード(GitHub)は下記のURLからご覧ください。 ・サイトURL : https://japansiteinfo.com (今後予告なく公開停止する場合があります。ご了承ください。) ・GitHubのURL : https://github.com/yuta-pharmacy2359/dwc_JapanSiteInfo_app 今回は前回も取り上げた「N+1問題」に関して、includesメソッドで解決できないものについて joinsメソッドを用いた解決法を紹介したいと思います。 本題 1. 「N+1問題」と前回のおさらい 「N+1問題」とは、「データベースからデータを取り出す際、不要なSQLが発行される」ことで、 パフォーマンスの低下を招くため、実際のサイトでは解決することが必要不可欠となります。 前回の記事 (https://qiita.com/yuta-pharmacy2359/items/61cff1aed171fedeff6e) では includesメソッドによる解決法を紹介しました。 基本的に、「単に2つ以上のテーブルの情報を表示するような一覧画面」などは、 以下の式でN+1問題を解決することができます。 モデル名.includes(:関連名) しかし、以下に挙げるような、 「別のテーブルで計算(合計、平均など)した結果を表示する」場合は includesメソッドでは解決することができません。 ・(ユーザー詳細画面における)1人のユーザーが獲得した総いいね数表示 ・(キーワード一覧画面において)1つのキーワードにおけるスポット評価の平均 ・ランキング機能(ユーザー1人ごとの総獲得いいね数)における1人のユーザーの総いいね数表示 ・ランキング機能(ユーザー1人ごとの総獲得いいね数)における1人のユーザーの総スポット数表示 ・フォロー数、フォロワー数表示 ・(フォロー・フォロワー画面における)各ユーザーの最終更新日表示 今回は上記のうち、「(ユーザー詳細画面における)1人のユーザーが獲得した総いいね数表示」機能におけるN+1問題の解決法を、 joinsメソッド用いて解決していきたいと思います。 2. 実際に発生した問題 当PFでは、ユーザー詳細画面でそのユーザーが獲得した総いいね数を表示しています。 そのカウントの仕組みを模式的に表したのが下図です。 この図の場合、id = 1のユーザーが投稿したスポットのidを外部キーとして持ついいねの数を合計した値を 「1人のユーザーが獲得した総いいね数」として表示しています。 この機能をN+1問題を考慮しないで実装する場合、usersコントローラーおよびshowビューファイルでの記述は以下の通りになります。 (もちろん、記述方法は他にもあると思いますので、あくまで一例とお考えいただければと思います。) users_controller.rb # showアクションのうち、今回の機能に関係のある部分のみ抜粋 def show @user = User.find(params[:id]) @user_all_spots = @user.spots @user_all_favorites_count = 0 @user_all_spots.each do |spot| @user_all_favorites_count += spot.favorites.count end end users/show.html.erb <!--今回の機能に関係のある部分のみ抜粋--> <tr> <td>総いいね数</td> <td class="user-favorite-count-<%= @user.id %>"><%= @user_all_favorites_count %></td> </tr> コントローラーファイルに関して簡単に説明すると、showアクションの中身において 【1行目】 当該のユーザーidのユーザーを選択 【2行目】 対象のユーザー(@user)のスポットを@user_all_spotsに代入 (上図の例では、id=1のユーザーのスポット(id=2,13,28,144,186,207)を代入) 【3行目】 @user_all_favorites_countに0を代入して値をリセット 【4~6行目】 対象のユーザーの各スポットが獲得したいいね数を 順に@user_all_favorites_countに加算していく (上図の例では spot_id=2 => いいね数3 spot_id=13 => いいね数2 spot_id=28 => いいね数1 spot_id=144 => いいね数2 spot_id=186 => いいね数1 spot_id=207 => いいね数3 @user_all_favorites_count=3+2+1+2+1+3=12) となります。【4~6行目】の説明を見て薄々お気づきかと思いますが、 この記述では、以下のようなアクセスが行われています。 User Load (0.2ms) SELECT "users".* FROM "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] Spot Load (0.2ms) SELECT "spots".* FROM "spots" WHERE "spots"."user_id" = ? [["user_id", 1]] (0.2ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 2]] (0.2ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 13]] (0.1ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 28]] (0.1ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 144]] (0.1ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 186]] (0.1ms) SELECT COUNT(*) FROM "favorites" WHERE "favorites"."spot_id" = ? [["spot_id", 207]] SQL2行目では、showアクションの【4行目】に則り、 user_id=1の全スポットが呼び出されています。 そしてSQL3行目以降では、showアクションの【5行目】に則り、 user_id=1の各スポットにそれぞれ紐づけられたいいねの情報が呼び出されています。 まさに「N+1問題」が発生している状況ですね。 そして、今回の例ではスポット数が6でしたので、アクセス回数は7で済んでいますが、 極端な例ですが「三度の飯より旅行」なユーザーが1000件、10000件投稿していたとしたら... 想像するだけで頭が痛くなってしまいますね。 それでは、この問題を解決する記述方法を紹介したいと思います。 3. 解決法 users_controller.rb # showアクションのうち、今回の機能に関係のある部分のみ抜粋 def show @user = User.find(params[:id]) @user_all_spots = @user.spots @user_all_favorites_count = @user_all_spots.joins(:favorites).count end 早速usersコントローラーでの記述から紹介しました。(showのビューファイルは変更なし) showアクションの中身において、【1~2行目】は先ほどと同じです。 問題の【3行目】に関して、順を追って説明していきます。 ここで出てきたjoinsメソッドは、「関連するテーブル同士を内部結合するメソッド」です。 基本的な定義は以下の通りです。 モデル名.joins(:関連名) 引数は、includesメソッドと同じく関連名(モデルファイルでhas_many、またはbelongs_toの後ろに記述した名前)ですのでご注意ください。 「結合」とは、一言で言えば「結合条件に従って複数のテーブルを1つのテーブルとして結合させること」です。 そして結合も「内部結合」および「外部結合」の2種類に大別されますが、今回のテーマからそれてしまうため、 詳しい説明は省略させていただきます。 (簡単に言えば、複数のテーブルを1つにした際に、 ・「内部結合」・・・片方のテーブルに情報が入ってない場合、もう片方のテーブルに情報があっても表示されない ・「外部結合」・・・片方のテーブルに情報が入ってない場合でも、もう片方のテーブルの情報があれば、それを表示する です。機会があれば取り上げたいと思います。) ひとまず今回は、下図のようなイメージを持っていただければと思います。 ここで、「spotsテーブルにおけるid」と「favoritesテーブルにおけるspot_id」は同じ内容であることに着目すると、 これら2つのテーブルを結合した際に上図の右側のようにデータが配置され、あたかも 「id=4,16,39...348,371,397のいいねは全てid=1のユーザーに対して付与されたもの」 と捉えることができます。これがミソであり、今まで1人のユーザーが獲得したいいね数をカウントする場合は、 「id=1のユーザーが投稿したのはid=2,13,28,144,186,207のスポットである。そしてそれぞれのスポットが獲得したいいね数は3,2,1,2,1,3なので、id=1のユーザーが獲得した総いいね数は12である。」 と考える必要があったのが、 「結合後の旧spotテーブル側において、user_id=1であるレコード数は12なので、id=1のユーザーが獲得した総いいね数は12である。」 と捉えることができるようになります。 (要は「手順を挟まずにダイレクトに集計できるようになる」ということです。) あとは結合後のレコード数を数えれば良いので、countメソッドを用いればOKです。 この記述に変更し、再度ターミナルのログを確認すると、 User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] (0.2ms) SELECT COUNT(*) FROM "spots" INNER JOIN "favorites" ON "favorites"."spot_id" = "spots"."id" WHERE "spots"."user_id" = ? [["user_id", 1]] 無事「N+1問題」を解決することができました。 終わりに 今回は、includesメソッドで「N+1問題」を解決できない機能のうち、「(ユーザー詳細画面における)1人のユーザーが獲得した総いいね数表示機能」について、joinsメソッドを用いてN+1問題を解決しました。 残りの5項目に関しては、joinsメソッドの他にgroupメソッドを使用する必要があります。それに関してはまた記事を上げたいと思っています。 使用画像素材 ・いらすとや(https://www.irasutoya.com/) ・ぱくたそ(https://www.pakutaso.com/)
- 投稿日:2021-06-20T13:27:11+09:00
mysql2をbundle installできないし、brew info opensslでも解決できない
どうしたの? 状況: - Gemfileにmysql2をbundle installしようとしたところで、インストールエラーが発生。 やりたいこと: - デプロイ用のDBをPostgreSQLからMySQLに変更したく、まずはGemをインストールしたい。 環境: - Rails 6.0.2 - Ruby 2.6.5 - gem mysql2(バージョン指定なし) - AWSのEC2インスタンス内で操作(SSHを使用してインスタンスに接続) もう少し説明 mysql2 gemをGemfileに記述し、bundle installをすると以下が発生 ターミナル $ bundle Your Gemfile lists the gem devise (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem omniauth-google-oauth2 (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem dotenv-rails (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Fetching gem metadata from https://rubygems.org/............ Resolving dependencies... Using rake 13.0.1 Using concurrent-ruby 1.1.6 Using i18n 1.8.3 Using minitest 5.14.1 Using thread_safe 0.3.6 Using tzinfo 1.2.7 Using zeitwerk 2.3.0 Using activesupport 6.0.3.1 Using builder 3.2.4 Using erubi 1.9.0 Using mini_portile2 2.4.0 Using nokogiri 1.10.9 Using rails-dom-testing 2.0.3 Using crass 1.0.6 Using loofah 2.6.0 Using rails-html-sanitizer 1.3.0 Using actionview 6.0.3.1 Using rack 2.2.3 Using rack-test 1.1.0 Using actionpack 6.0.3.1 Using nio4r 2.5.2 Using websocket-extensions 0.1.5 Using websocket-driver 0.7.2 Using actioncable 6.0.3.1 Using globalid 0.4.2 Using activejob 6.0.3.1 Using activemodel 6.0.3.1 Using activerecord 6.0.3.1 Using mimemagic 0.3.10 Using marcel 0.3.3 Using activestorage 6.0.3.1 Using mini_mime 1.0.2 Using mail 2.7.1 Using actionmailbox 6.0.3.1 Using actionmailer 6.0.3.1 Using actiontext 6.0.3.1 Using arbre 1.2.1 Using formtastic 3.1.5 Using formtastic_i18n 0.6.0 Using has_scope 0.7.2 Using method_source 1.0.0 Using thor 1.0.1 Using railties 6.0.3.1 Using responders 3.0.1 Using inherited_resources 1.11.0 Using jquery-rails 4.4.0 Using kaminari-core 1.2.1 Using kaminari-actionview 1.2.1 Using kaminari-activerecord 1.2.1 Using kaminari 1.2.1 Using polyamorous 2.3.2 Using ransack 2.3.2 Using ffi 1.13.1 Using sassc 2.4.0 Using sprockets 4.0.2 Using sprockets-rails 3.2.1 Using tilt 2.0.10 Using sassc-rails 2.1.2 Using activeadmin 2.7.0 Using execjs 2.7.0 Using autoprefixer-rails 9.7.6 Using bcrypt 3.1.13 Using bindex 0.8.1 Using msgpack 1.3.3 Using bootsnap 1.4.6 Using popper_js 1.16.0 Using bootstrap 4.5.0 Using bundler 2.2.20 Using byebug 11.1.3 Using coderay 1.1.3 Using orm_adapter 0.5.0 Using warden 1.2.8 Using devise 4.7.2 Using dotenv 2.7.6 Using dotenv-rails 2.7.6 Using multipart-post 2.1.1 Using faraday 1.0.1 Using hashie 4.1.0 Using jbuilder 2.10.0 Using jwt 2.2.1 Using kgio 2.11.4 Using libv8 7.3.492.27.1 (x86_64-linux) Using rb-fsevent 0.10.4 Using rb-inotify 0.10.1 Using ruby_dep 1.5.0 Using listen 3.1.5 Using mini_racer 0.2.14 Using multi_json 1.14.1 Using multi_xml 0.6.0 Fetching mysql2 0.5.3 Installing mysql2 0.5.3 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2 /home/tako_zhangyu/.rbenv/versions/2.6.5/bin/ruby -I /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/2.6.0 -r ./siteconf20210620-23114-pervwr.rb extconf.rb --with-ldflags\=-L/usr/local/opt/openssl@1.1/lib --with-cppflags\=-I/usr/local/opt/openssl@1.1/include checking for rb_absint_size()... yes checking for rb_absint_singlebit_p()... yes checking for rb_wait_for_single_fd()... yes checking for -lmysqlclient... no ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/home/tako_zhangyu/.rbenv/versions/2.6.5/bin/$(RUBY_BASE_NAME) --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysql-config --without-mysql-config --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysqlclientlib --without-mysqlclientlib To see why this extension failed to compile, please check the mkmf.log which can be found here: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for inspection. Results logged to /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/gem_make.out An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: mysql2 立ち向かう ひとまず以下のエラー文で検索をかけてみる Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. 以下のコマンドで解決というような記事がたくさんあったが、まずssh内にbrewがなかったので実行できず ターミナル $ brew info openssl 以下コマンドでbrewをインストール ターミナル $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" PATHを2つ通す ターミナル $ echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/tako_zhangyu/.bash_profile $ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" Homebrewがインストールされているかを確認する意味を込めて以下を実行 ターミナル $ brew -v Homebrew 3.1.12 バージョンが表示されたのでOK 以下を実行 ターミナル $ brew info openssl openssl@1.1: stable 1.1.1k (bottled) 表示された。 別ルートの解決 ここからは多くの記事のように以下コマンドを打つなどの解決策があると思いますが ターミナル $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib --with-cppflags=-I/usr/local/opt/openssl@1.1/include" なんやかんやで違うルートで解決したので記録します。 最初のエラー文の中にある以下の記述を実行してみる ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- 結果的に有効だったのは以下コマンドのみ ターミナル $ sudo yum install mysql-devel 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd 依存性の解決をしています 〜〜〜〜省略〜〜〜〜 インストール: mariadb-devel.x86_64 1:5.5.68-1.amzn2 依存性関連をインストールしました: mariadb-libs.x86_64 1:5.5.68-1.amzn2 完了しました! bundle installを実行 ターミナル $ bundle ~~~~省略~~~~ Bundle complete! 26 Gemfile dependencies, 109 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. できた
- 投稿日:2021-06-20T13:27:11+09:00
mysql2をbundle installできないし、brew info opensslも動かない
どうしたの? 状況: - Gemfileにmysql2をbundle installしようとしたところで、インストールエラーが発生。 - ググると$ brew info opensslを勧められるも動かない やりたいこと: - デプロイ用のDBをPostgreSQLからMySQLに変更したく、まずはGemをインストールしたい。 環境: - Rails 6.0.2 - Ruby 2.6.5 - gem mysql2(バージョン指定なし) - AWSのEC2インスタンス内で操作(SSHを使用してインスタンスに接続) もう少し説明 mysql2 gemをGemfileに記述し、bundle installをすると以下が発生 ターミナル $ bundle Your Gemfile lists the gem devise (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem omniauth-google-oauth2 (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Your Gemfile lists the gem dotenv-rails (>= 0) more than once. You should probably keep only one of them. Remove any duplicate entries and specify the gem only once. While it's not a problem now, it could cause errors if you change the version of one of them later. Fetching gem metadata from https://rubygems.org/............ Resolving dependencies... Using rake 13.0.1 Using concurrent-ruby 1.1.6 Using i18n 1.8.3 Using minitest 5.14.1 Using thread_safe 0.3.6 Using tzinfo 1.2.7 Using zeitwerk 2.3.0 Using activesupport 6.0.3.1 Using builder 3.2.4 Using erubi 1.9.0 Using mini_portile2 2.4.0 Using nokogiri 1.10.9 Using rails-dom-testing 2.0.3 Using crass 1.0.6 Using loofah 2.6.0 Using rails-html-sanitizer 1.3.0 Using actionview 6.0.3.1 Using rack 2.2.3 Using rack-test 1.1.0 Using actionpack 6.0.3.1 Using nio4r 2.5.2 Using websocket-extensions 0.1.5 Using websocket-driver 0.7.2 Using actioncable 6.0.3.1 Using globalid 0.4.2 Using activejob 6.0.3.1 Using activemodel 6.0.3.1 Using activerecord 6.0.3.1 Using mimemagic 0.3.10 Using marcel 0.3.3 Using activestorage 6.0.3.1 Using mini_mime 1.0.2 Using mail 2.7.1 Using actionmailbox 6.0.3.1 Using actionmailer 6.0.3.1 Using actiontext 6.0.3.1 Using arbre 1.2.1 Using formtastic 3.1.5 Using formtastic_i18n 0.6.0 Using has_scope 0.7.2 Using method_source 1.0.0 Using thor 1.0.1 Using railties 6.0.3.1 Using responders 3.0.1 Using inherited_resources 1.11.0 Using jquery-rails 4.4.0 Using kaminari-core 1.2.1 Using kaminari-actionview 1.2.1 Using kaminari-activerecord 1.2.1 Using kaminari 1.2.1 Using polyamorous 2.3.2 Using ransack 2.3.2 Using ffi 1.13.1 Using sassc 2.4.0 Using sprockets 4.0.2 Using sprockets-rails 3.2.1 Using tilt 2.0.10 Using sassc-rails 2.1.2 Using activeadmin 2.7.0 Using execjs 2.7.0 Using autoprefixer-rails 9.7.6 Using bcrypt 3.1.13 Using bindex 0.8.1 Using msgpack 1.3.3 Using bootsnap 1.4.6 Using popper_js 1.16.0 Using bootstrap 4.5.0 Using bundler 2.2.20 Using byebug 11.1.3 Using coderay 1.1.3 Using orm_adapter 0.5.0 Using warden 1.2.8 Using devise 4.7.2 Using dotenv 2.7.6 Using dotenv-rails 2.7.6 Using multipart-post 2.1.1 Using faraday 1.0.1 Using hashie 4.1.0 Using jbuilder 2.10.0 Using jwt 2.2.1 Using kgio 2.11.4 Using libv8 7.3.492.27.1 (x86_64-linux) Using rb-fsevent 0.10.4 Using rb-inotify 0.10.1 Using ruby_dep 1.5.0 Using listen 3.1.5 Using mini_racer 0.2.14 Using multi_json 1.14.1 Using multi_xml 0.6.0 Fetching mysql2 0.5.3 Installing mysql2 0.5.3 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2 /home/tako_zhangyu/.rbenv/versions/2.6.5/bin/ruby -I /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/2.6.0 -r ./siteconf20210620-23114-pervwr.rb extconf.rb --with-ldflags\=-L/usr/local/opt/openssl@1.1/lib --with-cppflags\=-I/usr/local/opt/openssl@1.1/include checking for rb_absint_size()... yes checking for rb_absint_singlebit_p()... yes checking for rb_wait_for_single_fd()... yes checking for -lmysqlclient... no ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/home/tako_zhangyu/.rbenv/versions/2.6.5/bin/$(RUBY_BASE_NAME) --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysql-config --without-mysql-config --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysqlclientlib --without-mysqlclientlib To see why this extension failed to compile, please check the mkmf.log which can be found here: /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for inspection. Results logged to /home/tako_zhangyu/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/extensions/x86_64-linux/2.6.0/mysql2-0.5.3/gem_make.out An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: mysql2 立ち向かう ひとまず以下のエラー文で検索をかけてみる Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling. 以下のコマンドで解決というような記事がたくさんあったが、まずssh内にbrewがなかったので実行できず ターミナル $ brew info openssl 以下コマンドでbrewをインストール ターミナル $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" PATHを2つ通す ターミナル $ echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/tako_zhangyu/.bash_profile $ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" Homebrewがインストールされているかを確認する意味を込めて以下を実行 ターミナル $ brew -v Homebrew 3.1.12 バージョンが表示されたのでOK 以下を実行 ターミナル $ brew info openssl openssl@1.1: stable 1.1.1k (bottled) 表示された。 別ルートの解決 ここからは多くの記事のように以下コマンドを打つなどの解決策があると思いますが ターミナル $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib --with-cppflags=-I/usr/local/opt/openssl@1.1/include" なんやかんやで違うルートで解決したので記録します。 最初のエラー文の中にある以下の記述を実行してみる ----- mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again. ----- 結果的に有効だったのは以下コマンドのみ ターミナル $ sudo yum install mysql-devel 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd 依存性の解決をしています 〜〜〜〜省略〜〜〜〜 インストール: mariadb-devel.x86_64 1:5.5.68-1.amzn2 依存性関連をインストールしました: mariadb-libs.x86_64 1:5.5.68-1.amzn2 完了しました! bundle installを実行 ターミナル $ bundle ~~~~省略~~~~ Bundle complete! 26 Gemfile dependencies, 109 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. できた
- 投稿日:2021-06-20T12:39:51+09:00
高卒26歳未経験がエンジニア内定を貰うまでのストーリー
初めに こんちにはこんばんは。 この度、プログラミング学習と就職活動の末、 合計3社から内定を頂くことが出来ました。 ありがたいことに学習方法などを教えて欲しいとの声が1件だけあったので せっかくなのでQiita記事にします。 使用した市販教材や無料サイトとかも記載します。 これからプログラミングとかアプリの勉強をして転職したいとか思っている方の 参考…になるかはわかりませんが私の学習内容を語っていきます。 ちょっとだけは美化させてくださいね。 学習期間 2021/1~3 就職活動期間 2021/4 私がエンジニアを目指したきっかけ とりあえず、入りはITかっこいいでした笑 スマホの普及だったり業務でもシステム代替えとかを見に染みて感じていました。 前職は大手メーカーの工場の製造現場で設備製造管理、改善、他従業員の残業や勤務シフトの管理等々をやってきました。 私自身、業務の中では特に何かを改善するという事が好きでした。 なんか上手くいった事例では年間○○○万円のコスト削減で社内表彰とかとか。 専門知識の国家資格では県での最優秀賞社表彰もされました。 そんな私が将来を見つめた時に、まぁ何か開発や設計をしていくんだろうなと考えました。 そこで同じ業界での専門性を高めるよりも様々な業界の開発等々をしたいなと思って見つけた業種がエンジニアでした。 学習から内定までの大きな流れ ①目標設定 やりたいことをきめる 「WEBアプリを開発する!」「WEBサイトを作成する」など ②目標に必要な言語や知識を調べる。 ③それぞれについて学ぶ。学びながら必ず何かしらのアウトプットをする。 ④学習した言語での開発を楽にするフレームワーク等々について学ぶ。 ⑤学習した内容を用いて実際にポートフォリオアプリ開発を進める ⑥完成したポートフォリオアプリを用いて転職活動 ※③、④は技術や言語の回数分反復します! 例 HTML/CSS→Bootstrap JavaScript→jQuery/vue.js Ruby→Ruby on Railsなど 無事、内定入社。 ①~⑤まではオンラインのプログラミングスクールSAMURAI ENGINEERさんで現役のエンジニア講師さんにサポートしていただきました。目標達成にはこういう事をこういう順番で学んだ方が良いなど ※SAMURAIさんは他の授業形式のスクールさんとは違い基本自習ベース+週1で講師さんからのレビュー軌道修正って感じなんで、自走能力をつけたい方にはおすすめです。 ①目標設定 まず、自分が何をやりたいかが重要で私の場合は 「Webアプリケーションを開発して、それをポートフォリオとして入社する」でした。 開発したアプリは両親の○○を解決するものでした。それはアプリの開発段階の話にも紐つきます。 もっと簡略化すると「Webアプリケーションを開発する」ですね。 ここでやんわりとどういうアプリを開発したいかは構想しました。 ②目標に必要な言語や知識を調べる。 Webアプリケーション開発にはざっくりこれらが必要かと 領域 必要言語や技術 フレームワークやライブラリ,使用技術など フロントエンド(ブラウザの見える部分) HTML/CSS/JavaScript Bootstrap/jQuery バックエンド(処理をする部分) Ruby Ruby on Rails インフラ周り(DBやWebサーバー等含む) Heroku使用/PostgreSQL(DB) バージョン管理 Gitコマンド GitHub コンピューター操作 Linuxコマンド MacならTerminal フロントエンド(見える部分)にHTML/CSSのマークアップ言語 それを動かしたり動的にするにはJavaScriptが必要です。 バックエンド(処理する部分)にプログラミング言語のRuby DBやWebサーバー等々を簡単に用意してくれるHerokuというサービスを使用しました。 バージョン管理等々はGitHubを使用。 コードの書き方を楽にしたりしてくれるフレームワークやライブラリが BootstrapやjQuery,Ruby on Railsなどです。 GitHubを使用するにあたりGitコマンドが必要です。 コンピューター操作にはLinuxコマンド等々も必要。 他にも細かい知識は必要ですが、割愛させていただきます。 ③それぞれについて学ぶ。学びながら必ずアウトプットをする。 必要知識についてそれぞれ学んでいきます。 大切なのは都度アプトプットをすることでした。 簡単なものでもいいので、その知識を用いて自分で何か作ることが本当に大切です。 全てのものに対して、教材内容+自分で工夫して展開してみるとかもやりました。 下記にそれぞれの言語技術に使用した教材やサイトを掲載します。 ーHTML/CSS 学習サイト「Progate」 このサイトは本当に有能サイトです。 環境構築が不要でWeb上で学びながら制作できます。 書籍「HTML5/CSS3モダンコーディング フロントエンドエンジニアが教える3つの本格レイアウト スタンダード・グリッド・シングルページレイアウトの作り方」 プロゲートあがりでなにか制作したい場合はこちらがおすすめ。 ブログ風サイトやシングルページレイアウト、グリッドレイアウトのそれぞれの制作ノウハウが詰まってます。実際にテキストエディタやブラウザを用いて制作できます。 学びながら制作するので2周もしたら、結構制作できるようになります。 サンプルコードもダウンロードできるので答え合わせできます。 サイト模写 自分できになったサイトを模写してみたりしました。 プロゲートの内容をローカル環境で模写して答え合わせをするなどもしました。 ここでBootstrapについても学びますが、④学習した言語での・・・に詳しく書きます。 ーJavaScript 学習サイト「Progate」 書籍「確かな力が身につくJavaScript「超」入門 第2版」 こちらもローカル環境で実際に開発する形式ですね。 断片的にこういう動きの場合はこうするっていうところが載っているので そのまま横展開もありです。 こちらもサンプルコードありでした。 ここでjQueryについても学びますが、④学習した言語での・・・に詳しく書きます。 ーRuby 学習サイト「Progate」 最初はプロゲートでやんわり掴んで書籍にステップアップみたいな感じです笑 Rubyを実際に使ってみた 実際にスクレイピングや正規表現を使ってブラウザ上の情報を抜き取ってCSVファイルにする。とかやりました。こちらは書籍とかではなく、自分でググって頑張りました。 ↑上記サイトは参考にしたサイトのひとつです。 書籍「作りながら学ぶRuby入門」 これは結構古い書籍ですが、 Rubyの基礎が詰まってる感じがします。 素のRubyでアプリケーションを開発していくので力がつくと思います。 ここが一番挫折しそうになったところかも。 めっちゃ難しかった。>< Railsをすぐ学べば楽になりますが、基礎のRubyを知らないとダメというアドバイス貰ったのでしっかりやりました。 たしか、サンプルコードそのまま写しても動作しない部分があったのでそこはレッツトライです。笑 たしか文字コード関係のところ。 -Gitについて GitHub 学習サイト「Progate」 サイト内でディレクトリやGitコマンドの関係を学べてとてもいいです。 学習サイト「サル先生のGit入門」 本当は「サルでもわかるGit」みたいなサイト名だったらしいのですが、動物愛護か何かの関係で改名したとか笑 実際に自分でGitHub上にリポジトリ作成したり、なんだりできるので実践形式です。 ーLinuxコマンド 学習サイト「Progate」 学習サイト「侍エンジニアブログ」 コマンドはまぁ覚えるって感じですね。 出来なくてもマウスで操作できることもありますが、後々サーバーアクセスとかした際にコマンドが打てないと 話にならないので覚えました。 ④学習した言語での開発を楽にするフレームワーク等々について学ぶ。 -HTML/CSS → Bootstrap 書籍「Bootstrap4 フロントエンド開発の教科書」 ぶっちゃけCSS知らなくてもBootstrap知っていればレイアウト構築はできる・・・かもしれませんが ブラックボックスになるのは避けたいのでHTML/CSSはしっかり理解した上でフレームワークは使いましょう。 こちらの書籍は実践形式ではなく、それぞれの説明って感じです。 公式のサイトもあります↓ Verや英語表記、日本語表記で内容が違うので注意しましょう。 私は最終的にBootstrap5を使用しました。 4→5の違いもあったのでご注意を!! ーJavaScript → jQuery 学習サイト「Progate」 書籍「jQuery標準デザイン講座」 サンプルコードありで、作りながら学べます。 JSの書籍と似た形式です^^ ーRuby → Ruby on Rails 学習サイト「Progate」 Progate自体がRailsで構築されているの、気合のはいったコースだと思います!笑 内容はたしか、Twitterアプリみたいなの作る感じだったかと。 progateはRails5です。 最新のRailsは6なので変更点等は注意しましょう。 書籍「Railsの教科書」 サイト「小学生でもわかるRuby」 ごめんなさい><こちら調べたらサイトにアクセスできませんでした。 Railsは本当に便利で、コマンド一発で必要なディレクトリやファイル群を生成してくれます。 中には、コードや機能もほぼ網羅して生成してくれるコマンドも存在します。 例:あるデータを作成、読み込み、更新、削除をする。など RubyにはGemといって簡単に使用可能になる機能があります。 フレームワークは便利=ブラックボックスになりやすいのですが、、、 上記の書籍とサイトではそちらの細かい背景や意味を述べているのでおすすめです〜。 サイト「Railsチュートリアル 」 このサイトはまじでおすすめです。これができれば大体開発できると思います。いや本当に。 ただ、最初から触ると挫折するくらい難しいのでprogateや他入門書籍で基礎固めをしてから取り掛かるのが吉ですね。 ⑤学習した内容を用いて実際にポートフォリオアプリ開発を進める 今までの勉強してきた知識を総動員してアプリ開発に取り掛かります。 ここの内容はほぼ割愛させていただきます。 こういうサイトを見て頑張りましょう! とはいえ、載せたサイトや書籍を網羅していれば大体開発イメージはついてると思います。 あとは、自分の作りたいことをプログラムで形にする。 そのために必要な知識を補填しながら進めていく。 一般的な手順は ①要件定義 ②設計 ③開発 ④検査 ですね。 ちなみにこのサイトで モックアップ(サイトレイアウト)やER図(サイトマップ)、データベース設計はしました。 サイトマップやデータベース設計などは「サイトマップ作成 方法」「データベース設計 方法」 で調べれば出てきます^^ 僕はデータベースの正規化など勉強しましたね。 サイトマップとかは感覚で頑張りました。 細かい話なんですけど、LINEと連携して通知やログイン機能をつけたり RedisやSideKiq(なんやねんそれ)を使ってDB内を定時監視したり、、、とか 他の人がやらなさそうなことややってみました。 Railsアプリの開発についての詳細は後日載せたいと思います。 テキトーな説明でごめんさない!! ⑥完成したポートフォリオアプリを用いて転職活動 この辺も割愛します。 面接についてさらっと話すと 今までの経験ゴリ押し 未経験だけど頑張ってアプリ作ったアピール すべての事に対する理由付け なんでRubyを選んだか?なんでそのアプリにした?なんでエンジニアになった? なんで転職したい?なんで?なんで?なんで? 全て自問自答して答えられるようにしました。 面接は頭の中のことを100%出す努力 を意識しました。 企業選定理由とかも後々に!! こちらもテキトーですみません。 最後に 最後になりますが、これらの教材を使って私は学びました。 もちろん、教材外でググって学んだことも沢山あります。 全体的にProgateで基礎とイメージを掴む→書籍などでステップアップ→アウトプットでしたね。 SAMURAIの講師のY.Fさん(本名はまずいと思うので笑)も3ヶ月間自分の悩みや問題に一緒に付き合ってくれました。 youtubeも見たりしました。 堀口セイトさん!プログラミングに対する楽しさを感じることができる動画ばかりです。 ここからは勝手な持論です。 Progate周回はしない方がいいという意見がとても多いですが、私的には個人差あるので周回OKだと思います。 現に私は2周してます。 ただ、Progateは検索等々が用意に行えるので後から基礎的な辞書代わりとしても使えるので その辺は頭にいれて学んでいくのが良いと思います。 2周目はローカル環境でやってみる…とかとか。 沢山の意味わからない呪文みたいなのが出てきて頭パンクしそうになりましたが 何が変数(値が格納されている)?で何がメソッド関数? その変数には何の値がはいってるの?そのメソッド関数の意味は?を分けて見れるようになるとグッと理解できるように なる… いや、なった感触がありましたね。 落ち着いてみると全部繋がっています。プログラミングなので。 私自身はRubyを学びましたが、入社した企業様ではPHP,Java,Pythonを使うことになるので 頑張ってキャッチアップしていきます^^ ここまで見てくださりありがとうございました。 以上
- 投稿日:2021-06-20T12:31:06+09:00
[Ruby on Rails] Seedファイルの作成
データを作成する db/seeds.rb User.create!( email: 'kinpachi@test.com', first_name: '金八', last_name: '坂本', profile_image: File.open('./app/assets/images/kinpachi.jpeg'), password: '123456', history_status: 20, prefecture_code: 20 ) それぞれのカラムに情報を入れる。 特に画像にデータを入れる時は File.open(~~~)で記述する。 複数人のデータを一括作成する。 db 20.times do |n| User.create!( email: "test#{n + 1}@test.com", first_name: "名前#{n + 1}", last_name: "苗字#{n + 1}", profile_image: File.open('./app/assets/images/test.jpg'), password: '123456', history_status: 2, prefecture_code: 2 ) end 20人分のデータを作成している。 emailと名前を別々にしてわかりやすくするために、n + 1として足し算を繰り返す。 1:Nの情報を作成する db/seeds.rb User.all.find_each do |user| user.posts.create!( genre_id: '1', post_image: File.open('./app/assets/images/hoge.png'), title: 'タイトル', content: 'テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト' ) end
- 投稿日:2021-06-20T12:10:21+09:00
初学者が「rails new 〜」 で起きたエラー
環境構築をし、ブラウザで「Hello World」を表示させようとしたときに起きた話 スペック macOS Big Sur バージョン11.3.1 MacBook Air (M1, 2020) を2021年5月に購入しました。それまではWindowsをずっと使っていました。 手順 ●rails環境構築 1、Command Line Toolsをインストール 2,Homebrewをインストール(ver 3.1.12) 3,rbenvをインストール(ver 1.1.2) 4,Rubyをインストール(ver 3.0.1) 5,railsをインストール(ver 6.1.3.2) 6,yarnをインストール(ver 1.22.10) ●プロジェクト作成 1、railsでプロジェクト作成 % mkdir ruby_project % cd ruby_project % rails new hello_app 2、hello_appをvscodeで開く 3、「Hello World」実行 起きたエラー % rails new hello_app . . . Argumenterror: method name must be a Symbol but Falseclass is given . . . 訳: Argumenterror:メソッド名はSymbolである必要がありますが、Falseclassが指定されています んー、よくわからない… どこで指定されているのかもわからない… とりあえずインストールしたものを上からバージョンを確認していったところ、 rubyのバージョンが古いものをインストールしている事が判明(最新のをインストールしたつもり…) ruby 3.0.1 をインストールし、railsとyarnも一応再インストールすると 今度はなんの問題もなく、プロジェクト作成に成功 application_controller.rb class ApplicationController < ActionController::Base def hello render html: "Hello World" end end routers.rb Rails.application.routes.draw do # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html root 'application#hello' end と変更し、rails sでサーバーを立ち上げ 見事「Hello World」に成功!!!! その他 hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch <name> hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m <name> warning webpack-dev-server > sockjs > uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. warning webpack-dev-server > webpack-log > uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. プロジェクト作成が上手くいったものの、途中でこんなログが表示された。 gitやwebpackのことが書かれているので、こちらも調べて改善していきたい。 感想 M1Macに環境構築するのは初学者では躓いてしまう可能性があると言われている中購入したので 不安はありましたが、今の所なんとかやれているので、大丈夫そうです これからもいろいろな壁にぶつかると思いますが、めげずに頑張りたいと思います。 Qiitaにもアウトプットしていき、同じようなところで躓いている初学者の方のためになったらいいなと思います。
- 投稿日:2021-06-20T11:51:09+09:00
BITCOIN COREの使い方
BITCOIN COREの使い方 Bitcoin Coreとは Bitcoin Coreは、コミュニティによって運営されているフリーソフトウェアプロジェクトであり、MITライセンスの元に公開されています。 Bitcoin Coreをインストールし、Bitcoin Coreが立ち上がった状態で8333ポートを開け、PCを起動したままにする事で、ビットコインのネットワークの維持に協力できます。 前提条件 Bitcoin Coreの初期同期では、長い時間をかけて大量のデータがダウンロードされます。 全ブロックチェーンをダウンロードする上では、アップロード速度が毎秒400kbps(50kb)以上のブロードバンドインターネット接続とストレージ容量(350GB以上)がある事が前提となります。 また、ノードの実行中はスクリーンセーバーの設定を確認し、自動「スリープ」または「一時停止」オプションを無効にして、コンピューターが実行されているときはいつでもネットワークをサポートしている必要があります。 環境 今回、実際に使用した環境は以下の通りです。 【OS】Windows 10 Home 64bit 【CPU】Corei7-8700 @3.20GHz 【RAM】16[GB] 【HDD】Dドライブに1[TB]以上の空き インストールの手順 1.Windowsでは、公式サイトよりインストールパッケージをダウンロードします。 2.インストーラを実行して、インストール先を指定します。 今回は、Dドライブ直下にBITCOINというフォルダを作成し、そこへインストールしました。 3.インストール完了後、はじめてBitcoin Coreを起動すると、空のブロックチェーンのデータを格納するデータベースが作成されます。続いて、ビットコインネットワーク上で稼働している他のノードからブロックチェーンのデータを受け取りはじめます。このデータ転送は、自分のノードのブロゥクチェーンの内容がビットコイン・ネットワークの他のノードと同じ動きになるまで続きます。これをIDB(初期ブロックダウンロード)といいます。 この間、残りブロック数と現在の動機の進捗状況が表示されますが、同期が完了するのには数時間かかります。 同期が完了したらPCを再起動します。 4.
- 投稿日:2021-06-20T11:51:09+09:00
Bitcoin Coreの使い方
Bitcoin Coreの使い方 Bitcoin Coreとは Bitcoin Coreは、コミュニティによって運営されているフリーソフトウェアプロジェクトであり、MITライセンスの元に公開されています。 Bitcoin Coreをインストールし、Bitcoin Coreが立ち上がった状態で8333ポートを開け、PCを起動したままにする事で、ビットコインのネットワークの維持に協力できます。 前提条件 Bitcoin Coreの初期同期では、長い時間をかけて大量のデータがダウンロードされます。 全ブロックチェーンをダウンロードする上では、アップロード速度が毎秒400kbps(50kb)以上のブロードバンドインターネット接続とストレージ容量(350GB以上)がある事が前提となります。 また、ノードの実行中はスクリーンセーバーの設定を確認し、自動「スリープ」または「一時停止」オプションを無効にして、コンピューターが実行されているときはいつでもネットワークをサポートしている必要があります。 環境 今回、実際に使用した環境は以下の通りです。 【OS】Windows 10 Home 64bit 【CPU】Corei7-8700 @3.20GHz 【RAM】16[GB] 【HDD】Dドライブに1[TB]以上の空き インストールの手順 1.Windowsでは、公式サイトよりインストールパッケージをダウンロードします。 2.インストーラを実行して、インストール先を指定します。 今回は、Dドライブ直下にBITCOINというフォルダを作成し、そこへインストールしました。 3.Bitcoin Coreを起動します。 インストール完了後、はじめてBitcoin Coreを起動すると、空のブロックチェーンのデータを格納するデータベースが作成されます。続いて、ビットコインネットワーク上で稼働している他のノードからブロックチェーンのデータを受け取りはじめます。このデータ転送は、自分のノードのブロゥクチェーンの内容がビットコイン・ネットワークの他のノードと同じ動きになるまで続きます。これをIDB(初期ブロックダウンロード)といいます。 この間、残りブロック数と現在の動機の進捗状況が表示されますが、同期が完了するのには数時間かかります。 同期が完了したらPCを再起動します。 4. 5.Bitcoin Coreのアップグレード 古いバージョンを実行している場合は、一旦シャットダウンして、Windowsの場合インストーラを実行します。 (古いバージョンでは数分かかる場合がありますので、完全にシャットダウンするまで待ちます) データディレクトリ内のブロックチェーンファイルとウォレットファイルは、バージョン間で互換性があるため、アップグレード時にデータディレクトリに変更を加える必要はありません。 これらのファイルの形式が変更されることがありますが、新しいビットコインコアバージョンには、ファイルを新しい形式に自動的にアップグレードするコードが含まれているため、手動による変更は必要ありません。
- 投稿日:2021-06-20T11:51:09+09:00
投稿のテスト MARKDOWN
投稿のテスト これはH1タグです これはH2タグです これはH6タグです 打ち消し線を使うには ~~ で囲みます。 打ち消し 追加情報としたい内容を、detailsタグで囲みます。そして、要約として表示したい文章をsummaryタグで記載します。 Qiitaとは Qiita(キータ)は、プログラマのための技術情報共有サービスです。プログラミングに関することをどんどん投稿して、知識を記録、共有しましょう。 Qiitaに投稿すると、自分のコードやノウハウを見やすい形で残すことができます。 技術情報はテキストファイルへのメモではなく、タグを付けた文章、シンタックスハイライトされたコードで保存することで初めて再利用可能な知識になる、そうQiitaでは考えています。 リンゴ 赤いフルーツ オレンジ 橙色のフルーツ リンゴ とても **赤い** フルーツ リンゴ とても赤いフルーツ タスク1 タスク2 Markdown: Qiita 結果: Qiita Markdown: Left align Right align Center align This This This column column column will will will be be be left right center aligned aligned aligned chu☆ Qiita Advent Calendar 2020 開催のお知らせ?おかげさまで今年で開催10周年となりました!今年は例年以上に楽しんでいただけるようにお楽しみ企画を多数ご用意しています?詳細はBlogよりご覧ください。みなさんのご参加お待ちしています?https://t.co/zR5SdARdbB— Qiita (キータ) 公式 (@Qiita) November 2, 2020 See the Pen dJgNLK by Tomoya Chiba (@tomoasleep) on CodePen.
- 投稿日:2021-06-20T10:10:39+09:00
【第4章】Railsチュートリアルで手が止まった箇所まとめ(range、inspect、ファイル作成)
Railsチュートリアル第4章(第6版)で、少し悩んだ点を挙げる。 ①-4.2 文字列とメソッド- にて ● nanoエディタからCtrl-Xで離脱する際、yキーを押して保存したあと、下記画面で何をすればいいのか分からなかった。 →Enterを押せば良いだけだった。 ② -4.3.1 配列と範囲演算子- にて ● 範囲(range)の0..9は省略した説明だと思い、(0123456789).to_aなどと入力してエラーが発生した。 →テキストのまま(0..9).to_aで良かった。 ③-4.3.3 ハッシュとシンボル- にて ● いきなりinspectメソッドが使用されていた為、どういうメソッドか一生懸命調べていた。 →説明が後述されていた。こういうこともあるので、悩んだら後に書かれていないか見てみよう。 ④-4.3.5 ユーザークラス- にて ● ルートディレクトリにexample_user.rbファイルを作成しようとするのだが、コマンド何だったっけ?と思った。 前章に戻って調べてみたが、これまで出てきていないようだ。 この時はCloud9から、対象フォルダにNew Fileで追加した。 →後で調べるとtouch ファイル名で作成できることが分かったが、Railsチュートリアルのこれまでの丁寧な説明を考えると、違和感があった。 まとめ ①②③④で手が止まったが、すぐに解決できた。
- 投稿日:2021-06-20T10:04:51+09:00
【Ruby】キーワード引数をハッシュ変数として受け取る
やりたいこと このようなメソッドがあるとする。 def my_method(key1:, key2:) # do something end このメソッドの中で {key1: 引数値, key2: 引数値} のような hash が欲しい。 まずはメソッドの引数の定義情報を得る 定義したメソッドの引数名の一覧は Method#parameters で得られる。 def my_method(key1:, key2:, key3:) p method(__method__).parameters # => [[:keyreq, :key1], [:keyreq, :key2], [:keyreq, :key3]] end my_method(key1: "val1", key2: "val2", key3: "val3") 上記の様に Method#parameters は引数の数だけの要素数の配列を返す。各要素の1つ目の要素は 引数の種類を表すシンボル、2つ目の要素は 引数名 となる。実際の引数の値は含まれない点に留意する。 今回はキーワード引数のデフォルト値を定義してない為、各1つ目の要素は「必須のキーワード引数」を表す :keyreq となっている。 キーワード引数を表すシンボルは :keyreq か :key なので、これらに一致する変数をハッシュに変換できれば実現できそう。 ということで実現方法は以下。 キーワード引数をハッシュとして受け取る方法 eval で変数名を評価した結果(つまり変数の値)をハッシュに入れていく。 def my_method(key1:, key2:) named_params = method(__method__).parameters.each_with_object({}) do |p, h| parameter_type, name = p is_keyword_parameter = [:key, :keyreq].include? parameter_type next unless is_keyword_parameter h[name] = eval(name.to_s) end p named_params # => {:key1=>"val1", :key2=>"val2"} end my_method(key1: "val1", key2: "val2") ワンライナー版 def my_method(key1:, key2:) named_params = method(__method__).parameters.each_with_object({}) do |p, h| h[p[1]] = eval(p[1].to_s) if [:key, :keyreq].include? p[0] end p named_params # => {:key1=>"val1", :key2=>"val2"} end my_method(key1: "val1", key2: "val2") 参考 Method#parameters (Ruby 3.0.0 リファレンスマニュアル) ruby - How can I get named parameters into a Hash? - Stack Overflow
- 投稿日:2021-06-20T04:44:52+09:00
Railsをガイドに沿って基礎から学ぶ③
はじめに この記事はスキルアップを目的とした記録です。 分からない部分を自分なりに補足して書いてます。 前回はデータベースとのやり取りを実現しました。 今回はCRUD操作について学習していきます。 CRUD操作 CRUD操作とは、データベースに対する作成、読込、更新、削除の事を指します。アプリケーションを作成する上で非常に非常に重要な部分になります。 1.記事を表示する 前回の学習では、すべての記事を表示するように作成しました。 ここでは全ての記事1件毎に対応した画面(タイトルと本文を表示させる)を作成します。 新しい画面を用意するために、controller、routesを編集してviewを追加します。 C:\blog\app\controllers\articles_controller.rb class ArticlesController < ApplicationController def index <省略> end def show @article = Article.find(params[:id]) end end アクションメソッド(show)を追加しました。 これでshowが呼び出されたときにArticlesテーブルから一意であるidカラムを元にデータを取得し、article変数に格納しています。 Controllerにアクションの追加をしたら次はルーティングの設定です。 C:\blog\config\routes.rb Rails.application.routes.draw do root "articles#index" get "/articles" , to: "articles#index" get "/articles/:id" , to: "articles#show" end ここで注意すべきはパスの末尾に[:id]が追加されているところです。 これはルーティングのパラメーターを指定します。 ルーティングのパラメーターはリクエストのパスに含まれる特定の値を取得して、その値をparamsというハッシュに保存する。 次にViewです。 C:\blog\app\views\articles\show.html.erb <h1><%= @article.title %></h1> <p><%= @article.body %></p> ここではcontrollerで作成したarticle変数を使用して、記事に対するタイトルと本文を表示するようになっています。 これで、 http://localhost:3000/articles/1 を開くと記事を閲覧することが出来ます。 このように上にタイトル、下に本文が表示されていれば成功です。 2.リソースフルルーティング ここまでにCRUD操作のREADを行いました。 ここではRailsのresourcesメソッドを使用してルーティングを書き直します。 C:\blog\config\routes.rb Rails.application.routes.draw do root "articles#index" resources :articles end 先ほどはアクション名毎にルーティングの設定をしていましたが、このresourcesメソッドを使用すると簡単にアクショ名とURLを紐づけることが出来ます。 ルーティングを表示するには以下のコマンドを実行します。 $rails routes ↓結果 Prefix Verb URI Pattern Controller#Action root GET / articles#index articles GET /articles(.:format) articles#index new_article GET /articles/new(.:format) articles#new article GET /articles/:id(.:format) articles#show POST /articles(.:format) articles#create edit_article GET /articles/:id/edit(.:format) articles#edit PATCH /articles/:id(.:format) articles#update DELETE /articles/:id(.:format) articles#destro <以下省略> 様々なURIパターンとアクションが紐づいていることがわかります。 簡潔に書ける上にルールに従って生成されるため、ルールを覚えれば非常にわかりやすいですね。 更にresourceメソッドで宣言したルーティングにはパスヘルパーメソッドというものも設定します。 パスヘルパーとはPrefixに記している文字列に「_path」などを追加した形で利用ができ、それに紐づいたURLを返します。 このパスヘルパーを用いてindexからshow:idに飛べるようにリンクを張ります。 C:\blog\app\views\articles\index.html.erb <h1>Articles</h1> <ul> <% @articles.each do |article| %> <li> <%= link_to article.title, article %> </li> <% end %> </ul> <%= link_to ariticle.title, article %>の部分で第1引数に表示する文字列、第2引数にリンク先を指定できます。 1.3記事を作成する 次はCRUDのCです。 Railsアプリケーションでは新しくデータを作る際にはnewアクションとcreateアクションを組み合わせて扱うため、2つのアクションをコントローラーに追加します。 C:\blog\app\controllers\articles_controller.rb class ArticlesController < ApplicationController <省略> def new @article = Article.new end def create @article = Article.new(title: "...", body: "...") if @article.save redirect_to @article else render :new end end end それぞれのメソッドについて、newアクションは新しい記事を1件インスタンス化しますがデータベースには保存しません。 createアクションは新しい記事を1件データベースに保存をします。 1.4フォームビルダーを使う ここではフォームビルダーという機能を使います。 フォームビルダーを使えば最小限のコードで設定がすべてできたフォームを表示することが出来る上に、Railsの規約に沿ったものが出来上がります。 先ほどコントローラーにアクションを追加したnewについて書いていきます。 C:\blog\app\views\articles\new.html.erb <h1>New Article</h1> <%= form_with model: @article do |form| %> <div> <%= form.label :title %><br> <%= form.text_field :title %> </div> <div> <%= form.label :body %><br> <%= form.text_area :body %> </div> <div> <%= form.submit %> </div> <% end %> form_withを利用してarticlesテーブルに対するフォームを生成しました。 http://localhost:3000/articles/new にアクセスすると このように入力フォームが出来上がります。
- 投稿日:2021-06-20T00:44:39+09:00
初学者がM1 Mac でRuby,Railsの環境構築をした時に起きたエラー
Qiita初投稿を環境構築でつまずいた話にさせていただきます。 スペック macOS Big Sur バージョン11.3.1 MacBook Air (M1, 2020) を2021年5月に購入しました。それまではWindowsをずっと使っていました。 環境構築の手順 まずRubyとRailsの環境構築をするために、次の動画を参考にしました。 https://youtu.be/z3pjRoHuhEc なぜこの動画かというと、「m1 mac ruby rails 環境構築」で一番上に出てきたからです。 01:08 M1Macの環境はIntelMac環境と大きく違うことに注意しよう 04:10 Rosetta上なのかARMアーキテクチャ上なのか意識しよう 07:22 実践編スタート 07:37 ①前提 09:37 Rubyの文法だけ試したい人におすすめな環境 11:53 いまRosseta上かARMアーキテクチャ上か確認コマンド 13:39 ②rbenvでRubyをインストールスタート 13:54 CommandLineToolsをインストール 15:30 Homebrewとは?パッケージマネージャーとは? 17:13 Homebrewをインストールしよう 18:11 brewコマンドが使えるか確認しよう 19:30 Homebrewのバージョンに気をつけよう 21:15 rbenvをインストール 24:03 パスを通して初期化しよう(.zshrc編集) 29:37 rbenvコマンド使えるか確認しよう 31:51 Rubyをインストール 38:45 ③RailsでHelloWorldまでスタート 39:02 railsをインストール 42:07 yarnをインストール 44:24 railsでプロジェクト作成 49:17 HelloWorld実行 エラー 動画と全く同じように構築していき、しっかりそれぞれコマンドも使えるか確認しながら進め、 rails new hello_app でプロジェクト作成をし、 それでvscodeのターミナルを開いてみると… 「/Users/xxxxxxx/.zshrc:23: command not found: rbenv 」 が表示されてしまう。 調べてみても、海外の記事ばかりで、解決策をすべて試してみても全く変わらず… よくパス(PATH)という言葉が出てきたので、「PATHとは」で検索してみたり… そこで動画をじっくり見てると、homebrewのパスが通っていない可能性を見つけ 「export PATH="/opt/homebrew/bin:$PATH"」 を.zshrcに追加(投稿者の方はここの説明はしていなかった)が状況は変わらず… もう一度エラー文をみてみると「.zshrc:23」が目に入り、ここで.zshrcファイルの23行目が おかしいからエラーが起きているということに気がつく。 そこに書いてあったのが「eval "$(rbenv init -)"」 動画で追加をしようといわれ、わけもわからず追加した次の文 export PATH="$HOME/rbenv/bin:$PATH" eval "$(rbenv init -)" 何度もみて、同じことをしているから間違ってはいないはず。 Qiitaで質問 ここで遂にQiitaを使って質問することにした。その記事のURLを下に掲載。 https://qiita.com/falconao/questions/3102843ca983c1ef3265#answer-c8feb9b6f7a39219592f そこで一度rbenvをアンインストールし、大元の記事を見ながら再インストールすることを勧められた。 もう一度やり直してみると、 「/Users/xxxxxxx/.zshrc:23: command not found: rbenv 」 「/Users/xxxxxxx/.zshrc:24: command not found: rbenv 」 とエラーが起きた。 そこでもう一度じっくり.zshrcファイルを見ると export PATH="$HOME/rbenv/bin:$PATH" eval "$(rbenv init -)" eval "$(rbenv init -)" export RBENV_ROOT=$(brew --prefix rbenv) export PATH=$RBENV_ROOT/bin:$PATH eval "$(rbenv init -)" と2箇所で似ているような記述があった。 前者は動画を見て追加し、後者はおそらく何かの記事をみて独自で付け足したものである。 ここで23、24行目がおかしいと言われていることはわかったため、その2行を消去した。 そしたら「command not found: rbenv」は表示されなくなり、解決した。 感想 なんとかRuby,Railsの環境構築することができました。 PATHの理解がまだ不十分であるので勉強しなければならないなと思いました。 Qiitaの記事や質問の投稿の仕方もより良いものにできるよう頑張ります。
- 投稿日:2021-06-20T00:34:57+09:00
初学者がM1 Mac でRuby,Railsの環境構築をした時に起きたエラー
Qiita初投稿を環境構築でつまずいた話にさせていただきます。 macOS Big Sur バージョン11.3.1 MacBook Air (M1, 2020) を2021年5月に購入しました。それまではWindowsをずっと使っていました。 まずRubyとRailsの環境構築をするために、次の動画を参考にしました。 https://youtu.be/z3pjRoHuhEc なぜこの動画かというと、「m1 mac ruby rails 環境構築」で一番上に出てきたからです。 01:08 M1Macの環境はIntelMac環境と大きく違うことに注意しよう 04:10 Rosetta上なのかARMアーキテクチャ上なのか意識しよう 07:22 実践編スタート 07:37 ①前提 09:37 Rubyの文法だけ試したい人におすすめな環境 11:53 いまRosseta上かARMアーキテクチャ上か確認コマンド 13:39 ②rbenvでRubyをインストールスタート 13:54 CommandLineToolsをインストール 15:30 Homebrewとは?パッケージマネージャーとは? 17:13 Homebrewをインストールしよう 18:11 brewコマンドが使えるか確認しよう 19:30 Homebrewのバージョンに気をつけよう 21:15 rbenvをインストール 24:03 パスを通して初期化しよう(.zshrc編集) 29:37 rbenvコマンド使えるか確認しよう 31:51 Rubyをインストール 38:45 ③RailsでHelloWorldまでスタート 39:02 railsをインストール 42:07 yarnをインストール 44:24 railsでプロジェクト作成 49:17 HelloWorld実行 動画と全く同じように構築していき、しっかりそれぞれコマンドも使えるか確認しながら進め、 rails new hello_app でプロジェクト作成をし、 それでvscodeのターミナルを開いてみると… 「/Users/xxxxxxx/.zshrc:23: command not found: rbenv 」 が表示されてしまう。 調べてみても、海外の記事ばかりで、解決策をすべて試してみても全く変わらず… よくパス(PATH)という言葉が出てきたので、「PATHとは」で検索してみたり… そこで動画をじっくり見てると、homebrewのパスが通っていない可能性を見つけ 「export PATH="/opt/homebrew/bin:$PATH"」 を.zshrcに追加(投稿者の方はここの説明はしていなかった)が状況は変わらず… もう一度エラー文をみてみると「.zshrc:23」が目に入り、ここで.zshrcファイルの23行目が おかしいからエラーが起きているということに気がつく。 そこに書いてあったのが「eval "$(rbenv init -)"」 動画で追加をしようといわれ、わけもわからず追加した次の文 export PATH="$HOME/rbenv/bin:$PATH" eval "$(rbenv init -)" 何度もみて、同じことをしているから間違ってはいないはず。 ここで遂にQiitaを使って質問することにした。その記事のURLを下に掲載。 https://qiita.com/falconao/questions/3102843ca983c1ef3265#answer-c8feb9b6f7a39219592f そこで一度rbenvをアンインストールし、大元の記事を見ながら再インストールすることを勧められた。 もう一度やり直してみると、 「/Users/xxxxxxx/.zshrc:23: command not found: rbenv 」 「/Users/xxxxxxx/.zshrc:24: command not found: rbenv 」 とエラーが起きた。 そこでもう一度じっくり.zshrcファイルを見ると export PATH="$HOME/rbenv/bin:$PATH" eval "$(rbenv init -)" eval "$(rbenv init -)" export RBENV_ROOT=$(brew --prefix rbenv) export PATH=$RBENV_ROOT/bin:$PATH eval "$(rbenv init -)" と2箇所で似ているような記述があった。 前者は動画を見て追加し、後者はおそらく何かの記事をみて独自で付け足したものである。 ここで23、24行目がおかしいと言われていることはわかったため、その2行を消去した。 そしたら「command not found: rbenv」は表示されなくなり、解決した。 なんとかRuby,Railsの環境構築することができました。 PATHの理解がまだ不十分であるので勉強しなければならないなと思いました。 Qiitaの記事や質問の投稿の仕方もより良いものにできるよう頑張ります。
- 投稿日:2021-06-20T00:22:35+09:00
この記事ではCentOS 6.5にインストールしたRuby 2.2を使っています
この記事ではCentOS 6.5にインストールしたRuby 2.2を使っています
- 投稿日:2021-06-20T00:12:25+09:00
【Rails】device使用してURLにアクセス時に、422 Unprocessable Entityと気の対処法
症状 Advanced REST clientを使用して、URLにPOSTでAPIを叩くと、以下のエラーが発生してしましました。 error 422 Unprocessable Entity 422 Unprocessable Entityは、サーバーが要求本文のコンテンツ型を理解でき、要求本文の構文が正しいものの、中に含まれている指示が処理できなかったことを表します(引用) つまり、postしたbodyの記述が間違っているようです post { email:"nekonekonekko", password:"123456" } 解決方法 jspmの左側の文字を""で囲むことで解決しました。 post { "email":"nekonekonekko", "password":"123456" } 参考