- 投稿日:2021-08-09T22:37:09+09:00
【条件分岐】商品が売却されていたら処理をする方法
今回覚えたことをメモします。 ◇実装内容 商品購入機能後の条件分岐 ◇結論◇ ビューファイルに、「item.purchase」と記述をすると「商品に紐づく購入履歴」という形で処理をしてくれた。 そこにif文を加えて「もし、その商品を購入していたら〜処理〜」とうい記述ができた。 ※モデル名で名前は変わる。 ↓は「もし、その商品を購入していたらSold Out!!を表示させる」 index.html.erb <% if item.purchase %> <div class='sold-out'> <span>Sold Out!!</span> </div> <% end %> ◇前提◇ 2つはアソシエーションが組まれている 商品情報:itemモデル 購入履歴:purchaseモデル カラム:user_id :item_id ◇別の例◇ ↓コントローラーに記述。before_actionメゾットで編集ページは商品が購入されたら、root_pathへ戻る形になる。 items_controller.rb before_action :item_purchase ,only: :edit def edit @item = Item.find(params[:id]) end def item_purchase @item = Item.find(params[:id]) if @item.purchase redirect_to root_path end end 本日は以上です。
- 投稿日:2021-08-09T22:22:51+09:00
Rubyを用いた逆数和のコーディングテスト
某プログラミングスクールに通っていた転職生の備忘録 どもお久しぶりです!最近転職活動に注力している転職生です。 今回は、僕が受けたコーディングテストで少し厄介だなと思ったコーディングテストの一部を 紹介していきたいと思います! では早速いきましょう!! 指定の値になるまで逆数を足していくプログラム はてはて、どういったものか。ズバリ、1/1 + 1/2 + 1/3 ・・・ と繰り返していき、足した数がある数になるまで繰り返すというプログラムテストです! んで、そのある数になったタイミングで、逆数、つまり分数の母数(下の数)がいくらになっているのか 答えを出すといったような問題です!個人的にめんどくさくて、Rubyでの答えがあんまり載ってなかったので 参考になればなと思います! プログラムコード(答え) total = 0 num = 0 while total < 15 num += 1 total += (1.0 / (num)) end puts total puts num 以上が今回の逆数和を求めるコードになります! ※おまけ Javaのコードでのプログラム class sample1 { public static void main(String[] args) { double ans = 0.0; int count = 0; for(double i = 1.0; ans <= 15; i++) { count += 1; ans += 1 / i; } System.out.println(ans); System.out.println(count) ; } } それではまたお会いしましょう!!
- 投稿日:2021-08-09T20:55:46+09:00
[Rails] 自作のアクションのルーティング設定(memberとcollection)
はじめに 検索機能の実装過程で新しい気づきがあったので記事に残しておきます。 よろしくお願いします。 自作のアクション ここではRailsの7つのアクションとされるもの以外に、自分で作ったアクションのことを「自作のアクション」と呼んでいます。 今回検索機能を実装するにあたって、新たにコントローラーに「search」アクションというものを作成しました。 def search @tweets = Tweet.search(params[:keyword]) end コントローラーの中にこんな感じで記述しました。 モデルの方でこの中で使われているsearchメソッドは定義されていますが、今回は特に説明はしません。 memberとcollection memberとcollectionはルーティングを設定するときに使用できる、URLや実行されるコントローラーを任意にカスタムできるものです。 例えばmemberを使ってルーティングを設定すると下記のようになります。 Rails.application.routes.draw do resources :tweets do member do get 'search' end end end rails routesすると↓ Prefix Verb URI Pattern search_tweet GET /tweets/:id/search(.:format) tweets#search collectionを使用すると下記のようになります。 Rails.application.routes.draw do resources :tweets do collection do get 'search' end end end rails routesでルーティング確認すると↓ Prefix Verb URI Pattern search_tweets GET /tweets/search(.:format) tweets#search この二つの違いは、URLの指定先に:idが含まれているか否かになります。 memberは:idあり。 collectionは:idなし。 終わりに 実装途中にこれ大事だ!と思い取り急ぎ記事にしました。 実際に実装した検索機能の手順は追って記事にしたいと思います。
- 投稿日:2021-08-09T17:32:57+09:00
1周目 railsチュートリアル第4章
目次 1.はじめに 2.用語のまとめ 4.感想 5.おわりに 1. はじめに 第4章からは有料です webテキストを読み込んだあとに動画を見たほうが良い。 第4章はruby内容となるためwebページの画面遷移などはほとんどない。 有料のため限定したところでしか書き留めれない。 2. 用語のまとめ 用語 内容 組み込みヘルパー 予めrailsに組み込まれたメソッドのこと カスタムヘルパー 自分で作ったメソッドのこと 文字列(String) ”ダブルクォーテーションで囲むもの" to_aメソッド a=('a'..'z').to_aやa=(0..9).to_a などの使い方をされる splitメソッド 分割させるメソッド Hash(ハッシュ) キーとバリューを関連付けるもの Hash名[キー]=バリュー シンボル 文字列の先頭に「 : 」コロンをつけたもの ダブルクォーテーションとシングルクォーテーションの違い 式展開ができるもの、できないものの違いである。 式展開ができる city = "新宿区" prefecture = "東京都" puts "#{prefecture} #{city}" 結果 東京都 新宿区 式展開ができない city = "新宿区" prefecture = "東京都" puts '#{prefecture} #{city}' 結果 #{city} #{prefecture} 4. 感想 ハッシュとシンボルまで終わったけど、まだある長い 第4章の後半 クラス継承など難しすぎる、やはり1周目はスピード重視が良さそうな気がする メモ 一度削除したアプリケーションのディレクトリでUser.newが表示されない件 git clone url ディレクトリ名 でダウンロード rails cをするも動かないため、求められているbundle install --without productionとyarnを実行。 まだrails cが起動できない。 UserDBは作成済みのため、rails db:migrateを実行したことにより rails c の User.newを実行で解決。 5. おわりに
- 投稿日:2021-08-09T16:52:12+09:00
Điều hòa, máy giặt, bình nóng lạnh, tủ lạnh chính hãng giá rẻ
- 投稿日:2021-08-09T16:17:47+09:00
[ABC Metric] ソフトウェアメトリックを使ってクソコードを滅ぼす
1. はじめに リーダブル秋山です。私達の世界にはクソコードという言葉があり、品質の低いコードを貶めるワードとして日々親しまれています。しかし、私達は一体どのようにクソコードを見分けているのでしょうか。その一つの指標として、ソフトウェアメトリックと呼ばれるコードの品質を測る方法論があります。 クソコードの定義は人により様々ですが、ここでは「複雑性の高いコード」と定義します。最も美しいコードはゼロ行のコードという極論が示唆するように、コードは可能な限り簡潔であるべきです。その理由として、コードの複雑性は可読性を下げ、再利用性を下げ、凝集度を下げ、拡張性を下げ、バグの温床になることが挙げられます1。 本記事ではソフトウェアメトリックについて概説した後、その中でも汎用的なABC Metricという手法を実例を交えて紹介し、どのようにクソコードとの戦いに活かすか検討します。 2. ソフトウェアメトリックとは何か 広義のソフトウェアメトリックは、ソフトウェア開発にまつわる様々なプロセスを定量評価できるあらゆる指標を指します。粒度が小さい順に例を挙げると、関数の行数、テストカバレッジ、応答速度、CPU使用率などがあります。ほか、ソフトウェア開発において定量評価できるものはソフトウェアメトリックと呼んで差し支えないでしょう。 表題であるクソコードと戦うためには、ソフトウェアメトリックの中でも、コードの複雑性を評価できる必要があります。そのような手法として、コード行数、FP、LCOMなど様々なものが発表されていますが、ここでは汎用性と実効性のバランスに優れたABC Metricと呼ばれる手法を取り上げます。 (LCOMについては下の記事で解説しています) 3. ABC Metricとは何か C++ Report誌上で1997年に発表された、コードの複雑性を測る指標です2。コードの行数よりも実用的な指標として考案されました。 ABC Metricは、簡単に言えばコード内の命令の個数です。命令を代入(Assignemnt)、分岐(Branch)、条件(Conditional)の3種類に分けカウントします。 それら3種類の命令の個数をそれぞれ$A, B, C$とすれば、ABC Metricは次式のベクトルとして表すことができます。 \overrightarrow{ABC} = (A, B, C) 通常はこのベクトルの絶対値を最終的なABC Metricの値として用います。 \rm{ABC} = |\overrightarrow{ABC}| = \sqrt{A^2 + B^2 + C^2} $\rm{ABC}$の値が大きいほど、複雑性の高いコードと見做します。 実際に各$A, B, C$をどのように計算するかは、言語毎にルールを定める必要があります。原文ではC言語、C++言語、Java言語に対してどのようなルールを設定するべきか示しており、それらを考慮すると次のような共通ルールを抽出できます。 命令の種類 ルール トークン例 $A$ 定数定義を除く代入演算 = *= /= %= += &= $A$ インクリメント/デクリメント ++ -- $B$ 関数呼び出し func() $B$ new/delete new Classdelete hoge $C$ 比較演算 == != <= >= < > $C$ 条件キーワード try else case default ? $C$ 単項条件式 if (a) という式の a の部分 このルールに従い、実際のコードについて計算してみましょう。 4. 計算例 ここではRubyとTypeScriptで書かれたコードを例に計算します。 4-1. Rubyでの計算例 Railsのレポジトリから次のコードを引用し計算します。 # rails/activerecord/lib/arel/table.rb (一部改変) def initialize(name, as: nil, klass: nil, type_caster: klass&.type_caster) @name = name.to_s # AB @klass = klass # A @type_caster = type_caster # A if as.to_s == @name # BC as = nil # A end @table_alias = as # A end したがって、ABC Metricの値は次のようになります。 \overrightarrow{ABC} = (5, 2, 1) \\ \rm{ABC} = |\overrightarrow{ABC}| = \sqrt{5^2 + 2^2 + 1^2} = 5.48 4-2. TypeScriptでの計算例 material-uiというレポジトリから、deepmergeを行う関数を引用し計算します。 // material-ui/packages/material-ui-utils/src/deepmerge.ts (一部改変) export default function deepmerge<T>( target: T, source: unknown, options: DeepmergeOptions = { clone: true }, ): T { const output = options.clone ? { ...target } : target; // ACC (三項演算子はif-elseと解釈) if (isPlainObject(target) && isPlainObject(source)) { // BB Object.keys(source).forEach((key) => { // BB // Avoid prototype pollution if (key === '__proto__') { // C return; } if (isPlainObject(source[key]) && // B key in target && // B isPlainObject(target[key]) // B ) { (output as Record<keyof any, unknown>)[key] = // A deepmerge(target[key], source[key], options); // B } else { // C (output as Record<keyof any, unknown>)[key] = source[key]; // A } }); } return output; } したがって、ABC Metricの値は次のようになります。 \overrightarrow{ABC} = (3, 8, 4) \\ \rm{ABC} = |\overrightarrow{ABC}| = \sqrt{3^2 + 8^2 + 4^2} = 9.43 このようにABC Metricはスカラ値として算出できるため、事前に閾値を定めておき、それを超えたら警告を出すという運用がなされます。 5. なぜABC Metricなのか コードの複雑性を測る指標として、ABC Metircの持つ利点は次の3つです。 5-1. 言語非依存 上の例で見てきたように、ABC Metricは特定の言語に依存しません。例えばコードの複雑性を測る指標としてFlogがありますが、これはRuby言語に特化しています。また凝集度を判定するLCOMという指標がありますが、これはJavaやSwiftのようなクラスモジュールを基本とする言語でなければ有効に機能せず、TypeScriptやGoのような関数ベースの言語には適用できないものです。 その点、ABC Metricは代入、分岐、条件といった、実用的な言語であれば必ず備えている要素を評価対象としているため、あらゆる言語に適用することができます。 5-2. 説明の容易さ ABC Metricは命令をカウントするだけという非常に分かりやすいアイデアであることは勿論ですが、命令を代入、分岐、条件に分けていることも重要です。ABC Metricのベクトル表現を見れば、代入、分岐、条件のいずれに比重が偏っているかが分かります。そのためプログラマはどの命令を減らすべきか容易に分かります。 5-3. 柔軟性 本記事ではABC Metricをスカラ値として表す際、単に絶対値を計算しましたが、次式のように重みベクトル$W$を設定することも可能です。私も実際に試したことはないですし、原著者も可能性について言及しているだけですが、面白いアイデアだと思います。 \overrightarrow{ABC} = (A, B, C) \\ \overrightarrow{W} = (W_A, W_B, W_C) \\ \rm{ABC} = |\overrightarrow{ABC} \,\cdot\, \overrightarrow{W}| = \sqrt{(AW_A)^2 + (AW_B)^2 + (AW_C)^2} 例えばGo言語ではエラーハンドリングの都合上、A(代入)とC(条件)のカウントが増えるため、これらを減じる重みを設定するという使い方が可能です。 6. で、実際にどう導入するの? ここまで丁寧にABC Metricについて見てきましたが、残念ながら主要なLinterの中でABC Metricのルールを備えているものはRubyのRuboCopしか知りません(他に知っていたら教えてください)。 Rubyistの方は引き続きRuboCopの恩恵に預かりましょう。他の言語の方はLinterのルールプラグインをぜひ作ってください(他力本願)。 7. おわりに コードの複雑性を定量評価できると何が嬉しいのかというと、自動化が可能になるからです。クソコードを避けるためには、SOLID原則をはじめとする経験則や、DDDに代表されるアーキテクチャパターンについて知っており、さらにある程度の実装経験を積んでいることが求められます。そのためクソコードを避けるためには膨大な時間がかかり、さらにコードレビューやモブプログラミングなどを通じてベテランから知識を引き出すことも必要になります。 定量評価のメリットは、そのようにベテランの手を借りることなく、クソコードに対して機械的に警告を受けられることにあります。警告の種類は限定的ではありますが、それでもゼロコストでコードの複雑性を減らしてくれるツールを利用しない手はないように思えます。 ABC Metricが考案されたのは20年以上前ですが、そのシンプルなアイデアは現代のプログラミングでも十分に活用でき、コードの複雑性を測る指標として再考されるべきものの一つだと言えます。 Twitter:リーダブル秋山@aki202 プログラマのプロとアマを分ける一つのポイントは、ソフトウェアを構成するコードベースから如何に複雑性を取り除けるかにあると思っています。動作するソフトウェアを構築するだけであれば誰にでもできますが、バグの発生率を抑え、将来の拡張性を見越した実装能力は、一長一短で身につくものではありません。これこそがコードで飯を食う我々に期待される能力かと思います。 ↩ 原文では "software size" を測る指標と言っていますが、ここでは簡単のために複雑性の指標と読み替えます。 ↩
- 投稿日:2021-08-09T16:17:47+09:00
[ABC Metric] ソフトウェアメトリックを導入してクソコードを滅ぼす
1. はじめに 私達の世界にはクソコードという言葉があり、品質の低いコードを貶めるワードとして日々親しまれています。しかし、私達は一体どのようにクソコードを見分けているのでしょうか。その一つの指標として、ソフトウェアメトリックと呼ばれるコードの品質を測る方法論があります。 クソコードの定義は人により様々ですが、ここでは「複雑性の高いコード」と定義します。最も美しいコードはゼロ行のコードという極論が示唆するように、コードは可能な限り簡潔であるべきです。その理由として、コードの複雑性は可読性を下げ、再利用性を下げ、凝集度を下げ、拡張性を下げ、バグの温床になることが挙げられます。 本記事ではソフトウェアメトリックについて概説した後、その中でも汎用的なABC Metricという手法を実例を交えて紹介し、どのようにクソコードとの戦いに活かすか検討します。 2. ソフトウェアメトリックとは何か 広義のソフトウェアメトリックは、ソフトウェア開発にまつわる様々なプロセスを定量評価できるあらゆる指標を指します。粒度が小さい順に例を挙げると、関数の行数、テストカバレッジ、応答速度、CPU使用率などがあります。ほか、ソフトウェア開発において定量評価できるものはソフトウェアメトリックと呼んで差し支えないでしょう。 表題であるクソコードと戦うためには、ソフトウェアメトリックの中でも、コードの複雑性を評価できる必要があります。そのような手法として、コード行数、FP、LCOMなど様々なものが発表されていますが、ここでは汎用性と実効性のバランスに優れたABC Metricと呼ばれる手法を取り上げます。 (LCOMについては下の記事で解説しています) 3. ABC Metricとは何か C++ Report誌上で1997年に発表された、コードの複雑性を測る指標です1。コードの行数よりも実用的な指標として考案されました。 ABC Metricは、簡単に言えばコード内の命令の個数です。命令を代入(Assignemnt)、分岐(Branch)、条件(Conditional)の3種類に分けカウントします。 それら3種類の命令の個数をそれぞれ$A, B, C$とすれば、ABC Metricは次式のベクトルとして表すことができます。 \overrightarrow{ABC} = (A, B, C) 通常はこのベクトルの絶対値を最終的なABC Metricの値として用います。 \rm{ABC} = |\overrightarrow{ABC}| = \sqrt{A^2 + B^2 + C^2} $\rm{ABC}$の値が大きいほど、複雑性の高いコードと見做します。 実際に各$A, B, C$をどのように計算するかは、言語毎にルールを定める必要があります。原文ではC言語、C++言語、Java言語に対してどのようなルールを設定するべきか示しており、それらを考慮すると次のような共通ルールを抽出できます。 命令の種類 ルール トークン例 $A$ 定数定義を除く代入演算 = *= /= %= += &= $A$ インクリメント/デクリメント ++ -- $B$ 関数呼び出し func() $B$ new/delete new Classdelete hoge $C$ 比較演算 == != <= >= < > $C$ 条件キーワード try else case default ? $C$ 単項条件式 if (a) という式の a の部分 このルールに従い、実際のコードについて計算してみましょう。 4. 計算例 ここではRubyとTypeScriptで書かれたコードを例に計算します。 4-1. Rubyでの計算例 Railsのレポジトリから次のコードを引用し計算します。 # rails/activerecord/lib/arel/table.rb (一部改変) def initialize(name, as: nil, klass: nil, type_caster: klass&.type_caster) @name = name.to_s # AB @klass = klass # A @type_caster = type_caster # A if as.to_s == @name # BC as = nil # A end @table_alias = as # A end したがって、ABC Metricの値は次のようになります。 \overrightarrow{ABC} = (5, 2, 1) \\ \rm{ABC} = |\overrightarrow{ABC}| = \sqrt{5^2 + 2^2 + 1^2} = 5.48 4-2. TypeScriptでの計算例 material-uiというレポジトリから、deepmergeを行う関数を引用し計算します。 // material-ui/packages/material-ui-utils/src/deepmerge.ts (一部改変) export default function deepmerge<T>( target: T, source: unknown, options: DeepmergeOptions = { clone: true }, ): T { const output = options.clone ? { ...target } : target; // ACC (三項演算子はif-elseと解釈) if (isPlainObject(target) && isPlainObject(source)) { // BB Object.keys(source).forEach((key) => { // BB // Avoid prototype pollution if (key === '__proto__') { // C return; } if (isPlainObject(source[key]) && // B key in target && // B isPlainObject(target[key]) // B ) { (output as Record<keyof any, unknown>)[key] = // A deepmerge(target[key], source[key], options); // B } else { // C (output as Record<keyof any, unknown>)[key] = source[key]; // A } }); } return output; } したがって、ABC Metricの値は次のようになります。 \overrightarrow{ABC} = (3, 8, 4) \\ \rm{ABC} = |\overrightarrow{ABC}| = \sqrt{3^2 + 8^2 + 4^2} = 9.43 このようにABC Metricはスカラ値として算出できるため、事前に閾値を定めておき、それを超えたら警告を出すという運用がなされます。 5. なぜABC Metricなのか コードの複雑性を測る指標として、ABC Metircの持つ利点は次の3つです。 5-1. 言語非依存 上の例で見てきたように、ABC Metricは特定の言語に依存しません。例えばコードの複雑性を測る指標としてFlogがありますが、これはRuby言語に特化しています。また凝集度を判定するLCOMという指標がありますが、これはJavaやSwiftのようなクラスモジュールを基本とする言語でなければ有効に機能せず、TypeScriptやGoのような関数ベースの言語には適用できないものです。 その点、ABC Metricは代入、分岐、条件といった、実用的な言語であれば必ず備えている要素を評価対象としているため、あらゆる言語に適用することができます。 5-2. 説明の容易さ ABC Metricは命令をカウントするだけという非常に分かりやすいアイデアであることは勿論ですが、命令を代入、分岐、条件に分けていることも重要です。ABC Metricのベクトル表現を見れば、代入、分岐、条件のいずれに比重が偏っているかが分かります。そのためプログラマはどの命令を減らすべきか容易に分かります。 5-3. 柔軟性 本記事ではABC Metricをスカラ値として表す際、単に絶対値を計算しましたが、次式のように重みベクトル$W$を設定することも可能です。私も実際に試したことはないですし、原著者も可能性について言及しているだけですが、面白いアイデアだと思います。 \overrightarrow{ABC} = (A, B, C) \\ \overrightarrow{W} = (W_A, W_B, W_C) \\ \rm{ABC} = |\overrightarrow{ABC} \,\cdot\, \overrightarrow{W}| = \sqrt{(AW_A)^2 + (AW_B)^2 + (AW_C)^2} 例えばGo言語ではエラーハンドリングの都合上、A(代入)とC(条件)のカウントが増えるため、これらを減じる重みを設定するという使い方が可能です。 6. で、実際にどう導入するの? ここまで丁寧にABC Metricについて見てきましたが、残念ながら主要なLinterの中でABC Metricのルールを備えているものはRubyのRuboCopしか知りません(他に知っていたら教えてください)。 Rubyistの方は引き続きRuboCopの恩恵に預かりましょう。他の言語の方はLinterのルールプラグインをぜひ作ってください(他力本願)。 7. おわりに コードの複雑性を定量評価できると何が嬉しいのかというと、自動化が可能になるからです。クソコードを避けるためには、SOLID原則をはじめとする経験則や、DDDに代表されるアーキテクチャパターンについて知っており、さらにある程度の実装経験を積んでいることが求められます。そのためクソコードを避けるためには膨大な時間がかかり、さらにコードレビューやモブプログラミングなどを通じてベテランから知識を引き出すことも必要になります。 定量評価のメリットは、そのようにベテランの手を借りることなく、クソコードに対して機械的に警告を受けられることにあります。警告の種類は限定的ではありますが、それでもゼロコストでコードの複雑性を減らしてくれるツールを利用しない手はないように思えます。 ABC Metricが考案されたのは20年以上前ですが、そのシンプルなアイデアは現代のプログラミングでも十分に活用でき、コードの複雑性を測る指標として再考されるべきものの一つだと言えます。 Twitter:リーダブル秋山@aki202 原文では "software size" を測る指標と言っていますが、ここでは簡単のために複雑性の指標と読み替えます。 ↩
- 投稿日:2021-08-09T16:06:55+09:00
routes.rbにnamespaceを設定した際のコントローラーの対応
Railsのroutesに以下のとおりnamespaceを追加設定した際に、それまで動いていたcontrollerが動かなくなってしまった。なお、コントローラのファイルはapp/controllers/api配下に移動済み。 routes.rb(変更前) Rails.application.routes.draw do resources :posts end routes.rb(変更後) Rails.application.routes.draw do namespace :api do resources :posts end end 事象 namespace設定までは、例えば以下のURLへのGETに対し合致するデータをJSONで返していた。 $ curl localhost:5000/posts/1 namespace設定後はURLが変わるだけかと思っていたが、エラーを返すようになってしまった。 $ curl localhost:5000/api/posts/1 ~ TypeError (superclass mismatch for class PostsController): 解決策 コントローラのクラス名も、ルーティングのnamespaceに合わせて「Api::」と階層を明示する必要があった。 posts_controller.rb(変更前) class PostsController < ApplicationController def show @post = Post.find(params[:id]) render json: { data: @post } end end posts_controller.rb(変更後) class Api::PostsController < ApplicationController def show @post = Post.find(params[:id]) render json: { data: @post } end end 補足 API::の代わりにmoduleで囲っても動いた。 posts_controller.rb module Api class SavingDetailsController < ApplicationController def show @saving_detail = SavingDetail.find(params[:id]) render json: { data: @saving_detail } end end end routesのnamespaceを先に書いてからコントローラをgenerateしていたら、最初から適切なクラス名にしてくれていたんだろうか?
- 投稿日:2021-08-09T12:46:41+09:00
Rubyの基本的文法について
テーマ 今回は、rubyの中で基本となる以下のことについて説明します。 出力 入力 変数 出力 みなさんお馴染みの"Hello World"を出力してみましょう。Rubyで値を出力する方法は様々ありますが、今回は、print,puts,p,printfについて見ていきましょう。 printf printを使うと、改行を入れずに指定した値を出力できます。 puts putsを使うと、末尾に改行が入る形で出力されます。 p pを使うと、出力する値とともにその値の型情報(文字列型や数値型など)を出力します。改行文字も入るため、出力する値が改行されます。 printf printfは書式を設定して出力するものです。これまでとは異なり、()で出力内容をくくります。異なる型の値をまとめて出力するときに便利です。%dは、数値型を代入する引数の型であり、%sは文字列を代入する引数の方です。 実行例 print "Hello " print "World!" #出力結果 改行されずに出力されていることがわかります。 #=> Hello World! puts "Hello " puts "World!" #出力結果 今度は、Helloの後ろに改行が入って出力されていることがわかります。 #=> Hello #=> World! p "Hello World!" p 2021 #出力結果 #=> "Hello World!" #=> 2021 #Hello World!が,""とともに出力されており、値が文字列型であることがわかります。 #2021はそのまま出力されており、整数型の値であることがわかるかと思います。 printf("今年は%d年で、%s年です.",2021,"丑") #出力結果 #=> 今年は2021年で、丑年です. #数値型の2021が%dに、文字列型の%sが"丑"に対応して、出力されていることがわかると思います。 入力 キーボードから入力する代表的なものは、gets(),gets.to_i(),gets.to_f()です。 表記方法 出力内容 gets() キーボードから文字列として入力します gets.to_i() キーボードで入力した値を整数値に変換します。 gets.to_f() キーボードで入力した値を小数値に変換します。 違いがわかるようにコードを書いて見ました。 puts "---値の入力---" num1 = gets() num2 = gets.to_i() num3 = gets.to_f() puts "---出力結果---" p num1 p num2 p num3 以下が出力結果です。それぞれのメソッドに対して、適切な出力がされていることがわかります。 ---値の入力--- 100 100 100 ---出力結果--- "100\n" 100 100.0 変数 変数は、値を入れておく箱のようなものです。今回は、変数を文字列の中に埋め込む変数展開を見ていきます。#{変数名}を文字列の中に入れることで、変数を代入している値に置き換えて出力します。 以下のコードをみてみましょう。 puts "---値の入力---" num1 = gets() num2 = gets.to_i() num3 = gets.to_f() puts "---出力結果---" puts "入力された値:#{num1}" puts "入力された値:#{num2}" puts "入力された値:#{num3}" 出力結果は以下のようになります。putsの中に#{変数名}を埋め込むことで、キーボードから入力した値が適切に出力されていることがわかると思います。 ---値の入力--- 1 1 1 ---出力結果--- 入力された値:1 入力された値:1 入力された値:1.0 最後に 今回はここら辺で終わりにしたいと思います。次は、条件分岐や繰り返し構文などを投稿したいと思います。ありがとうございました。
- 投稿日:2021-08-09T12:42:27+09:00
Rails+Docker+MySQLのアプリをHerokuへデプロイする手順とエラーになったポイント
この記事では、Herokuへのデプロイ手順と私が引っかかったエラーを書き留めています。 説明不足、理解不足なところもあるかと思いますので、その際はご教授いただけると嬉しいです。 バージョン Rails 6.1.3 Ruby 2.6.8 MySQL 8.0 ストレージ AWS S3 Herokuへのデプロイでエラーになったポイント 最終的に以下の2つのポイントが原因でHerokuデプロイ時にエラーが出ていました。 bundlerバージョンが違う Herokuではデフォルトのbundlerバージョンが指定されています。 Gemfile.lockの末尾で確認できるBUNDLED WITHが 2.〜の場合はbundler2.0.2が、 1.〜の場合はbundler1.17.3が 指定がない場合はbundler1.17.3のバージョンが使われます。 私の場合、Ruby 2.6を使用していたため、bundlerバージョン1.17.2が入っており、これがHerokuデフォルトのbundlerバージョンである1.17.3より古いバージョンであることが原因で、デプロイ時エラーになっていたことが考えられます。 また、Ruby2.6からbundlerは組み込みになったため、bundlerの追加はできても、組み込みのbundlerバージョン自体は削除できません。 そのため、原則はRubyに組み込まれているbundlerのバージョンのままHerokuにデプロイするのが良さそうです。 環境変数の未設定 これはHerokuの仕組みをよく理解していないことから起こったイージーミスでした。。 環境変数の設定は下記で順番に説明していきます。 また、すでにHerokuにはログインしている前提で話を進めていきます。 config/database.yml を設定する config/database.yml production: <<: *default database: <%= ENV['APP_DATABASE'] %> username: <%= ENV['APP_DATABASE_USERNAME'] %> password: <%= ENV['APP_DATABASE_PASSWORD'] %> host: <%= ENV['APP_DATABASE_HOST'] %> まずこのように環境変数を設定します。 なお、環境変数は任意の名前で設定します。 私の場合は「APP_DATABASE〜」としています。 Herokuにアプリを作成 $ heroku create アプリ名 これでHerokuにアプリが登録されます。 このアプリ名は世界中で名前がカブらないように設定しないとエラーになります。 $ heroku create また、アプリ名を指定しなければ、Herokuがカブらないアプリ名を自動で作成してくれます。 Herokuにデータベースを作成 $ heroku addons:create jawsdb:kitefin 私は開発環境でMySQL8.0を使用しており、本番環境でもバージョンを統一させるためにjawsDBを選択しました。 (ちなみにclearDBがMySQL5.7まで対応のためです) 今回は説明用のため無料プランであるkitefinを入力しています。 $ heroku addons:create jawsdb:kitefin -a herokuのアプリ名 --version=8.0 またこのように入力すればバージョンの指定もできます。 現在のjawsDB MySQLデフォルトのデータベースバージョンは8.0となっているため、コマンドで指定しなくても8.0がcreateされます。 Herokuに各環境変数をセットする 環境変数の設定作業はHeroku上からでも設定できますが、今回はコマンド入力で進めていきます。 Heroku上で設定する場合、Herokuのアプリを開き、Settingsの中の「Config Vars」というところから環境変数をAddできます。 データベースURL $ heroku config:get CLEARDB_DATABASE_URL まずはこちらのコマンドを入力し、DB接続情報を確認します。 表示された情報を元に下記コマンドでMySQL2のURLをセットします。 $ heroku config:set DATABASE_URL='mysql2://ユーザー名:パスワード@ホスト名/データベース名?reconnect=true' ユーザー名 続いて先程のユーザー名の部分をコピーして次のように変数をセットします。 $ heroku config:add APP_DATABASE='ユーザー名' -a アプリ名 パスワード $ heroku config:add APP_DATABASE_PASSWORD='パスワード' -a アプリ名 パスワードも同じように入力します。 ホスト名 $ heroku config:add APP_DATABASE_HOST='ホスト名' -a アプリ名 ホストも同じように入力します。 データベース名 $ heroku config:add APP_DATABASE_HOST='データベース名' -a アプリ名 続いてデータベース名も入力。 S3アクセスキーID AWS S3をストレージとして使用している場合も同じように環境変数を設定していきます。 $ heroku config:add AWS_ACCESS_KEY_ID='アクセスキーID' -a アプリ名 S3シークレットアクセスキー $ heroku config:add AWS_SECRET_ACCESS_KEY='アクセスキーID' -a アプリ名 もし、Google mapなどのAPIをアプリケーションで使っているなら、そちらのAPIキーも同じように入力していけばOKです。 Herokuにアプリをデプロイする 環境変数の設定ができたら、いよいよデプロイに入ります! $ git add . ステージング環境にaddします。 $ git commit -m "heroku first commit" ローカルリポジトリにコミットして $ git remote add heroku Herokuのgit URL Herokuと繋ぎます。 git URLはHerokuのアプリページの中のSettingsで確認することができます。 (コマンドを入力したあと、error: remote heroku already exists.と出たらすでにこの作業は完了しています。) https://git.heroku.com/アプリ名.git URLはこのようになっています。 $ git push heroku master あとはHerokuにpushすればアプリのデプロイは完了です。 ブランチを切って作業している場合は $ git push heroku ブランチ名:master こちらのコマンドでpushします。 最終的には環境変数の設定は以下のようになりました。 JAWSDB_URL以下の環境変数はデプロイ時に設定されたものです。 最後にrails db:migrate 上記の設定でデータベースの作成までが完了しているため、最後に $ heroku run rails db:migrate こちらのコマンドを入力すれば、デプロイしたアプリケーションが正常に起動するはずです! もし、エラーが出たときは、その都度 $ heroku logs --tail こちらのコマンドでlogを確認してエラーの原因を探ります。 また、エラーを確認するために便利なaddons(papertrailなど)も用意されていますので、ご興味の有る方は調べてみてください。 この記事が、Herokuデプロイで困っている方の助けになると嬉しいです。 また誤っている箇所があれば、ご指摘いただけると非常に助かります。 参考
- 投稿日:2021-08-09T12:38:38+09:00
【第10章】Railsチュートリアルでbcryptとfixtureについて忘れていたので復習した
Railsチュートリアル第10章(第6版)でhelper関連の演習が解けなかったので復習した。 ①ヘルパー ・Railsのビューでは膨大な数の組み込み関数が使える。 ・新しく作ることもでき、新しく作成したメソッドのことをカスタムヘルパーという。 ・Webサイトのレイアウトで使うコンパクトなヘルパーメソッドでは、メソッド定義、変数割り当て、論理評価、制御フロー、文字列の式展開 など、Rubyの様々な要素が投入されている。 ・デフォルトでは、ヘルパーファイルで定義されているメソッドは自動的にすべてのビューで利用できる。 ・ヘルパーメソッドはテストから呼び出せない。 ③まとめ ①で忘れていた箇所を思い出せた。
- 投稿日:2021-08-09T11:56:52+09:00
Ruby で Natural Language API を叩く
ゴール https://cloud.google.com/natural-language?hl=ja を ruby から叩く API 呼び出すための準備 ドキュメント見ながら「SDK と認証をテストする」まで https://cloud.google.com/natural-language/docs/setup?hl=ja 基本的には、Google Cloud Console からポチポチするだけ Cloud SDK のインストールで pyenv を入れるところ少しハマった 個人記事ではなくドキュメント見ましょう(自戒) https://github.com/pyenv/pyenv#installation Gem から API を叩く 前提 エンティティ分析で試す https://cloud.google.com/natural-language/docs/analyzing-entities?hl=ja リクエスト・レスポンス仕様 https://cloud.google.com/natural-language/docs/reference/rest/v1/documents/analyzeEntities?hl=ja ドキュメントに倣う google-api-client が書かれている https://cloud.google.com/natural-language/docs/reference/libraries?hl=ja https://github.com/googleapis/google-api-ruby-client API キーを使うので、Google Cloud Console から発行 https://cloud.google.com/docs/authentication/api-keys?hl=ja 諸々決まったら、制限は設定した方がいい require 'google/apis/language_v1' # Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/CloudNaturalLanguageService.html service = Google::Apis::LanguageV1::CloudNaturalLanguageService.new service.key = '...' # リクエスト仕様を確認しつつ設定 attrs = { document: { type: 'PLAIN_TEXT', language: 'ja', content: 'テスト', }, encoding_type: 'UTF8' } # Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/AnalyzeEntitiesRequest.html request = Google::Apis::LanguageV1::AnalyzeEntitiesRequest.new(attrs) # Doc: https://googleapis.dev/ruby/google-api-client/v0.23.6/Google/Apis/LanguageV1/AnalyzeEntitiesResponse.html response = service.analyze_document_entities(request) response.entities[0].type response.entities[0].salience response.entities[0].metadata['wikipedia_url'] ... それ以外のやり方 他にも Gem がある https://github.com/googleapis/google-cloud-ruby/tree/master/google-cloud-language こっちはサービスアカウントでの認証が出来た https://qiita.com/drafts/9076c2ffe31749c8ae5b/edit#api-%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%81%9F%E3%82%81%E3%81%AE%E6%BA%96%E5%82%99 でダウンロードした json パスの環境変数を読み込んでくれる # Doc: https://googleapis.dev/ruby/google-cloud-language-v1/latest/index.html require "google/cloud/language/v1" # Doc: https://googleapis.dev/ruby/google-cloud-language-v1/latest/Google/Cloud/Language/V1/LanguageService/Client.html # .configure から、リトライ・タイムアウト等設定できるっぽい client = ::Google::Cloud::Language::V1::LanguageService::Client.new # リクエスト仕様を確認しつつ設定 attrs = { document: { type: 'PLAIN_TEXT', language: 'ja', content: 'テスト', }, encoding_type: 'UTF8' } # Doc: https://googleapis.dev/ruby/google-cloud-language-v1/latest/Google/Cloud/Language/V1/AnalyzeEntitiesRequest.html request = ::Google::Cloud::Language::V1::AnalyzeEntitiesRequest.new(attrs) # Doc: https://googleapis.dev/ruby/google-cloud-language-v1/latest/Google/Cloud/Language/V1/AnalyzeEntitiesResponse.html response = client.analyze_entities(request)
- 投稿日:2021-08-09T10:41:41+09:00
【Ruby】二桁の整数問題
二桁以上の整数を入力すると、十の位と一の位の数字の足し算、十の位と一の位の数字の掛け算をそれぞれ行い、最後に2つの結果を足し合わせて出力するプログラムをRubyで作成する。 という問題で私の最初の回答がこちら。 puts "二桁の整数を入力してください" sum = gets.to_i if sum >= 10 num1 = sum / 10 % 10 num2 = sum % 10 total = (num1 + num2) + (num1 * num2) puts total end 実行して数値を入力すると確かに要件通り動くように思われますが... 記述のスマートさがありません。 よって下記のようにするといいみたいです。 def addition(a, b) a + b end def multiplication(a,b) a * b end def slice_num(num) tens_place = (num / 10) % 10 ones_place = num % 10 return tens_place, ones_place end puts "二桁の整数を入力してください" input = gets.to_i X, Y = slice_num(input) add_result = addition(X, Y) multiple_result = multiplication(X, Y) puts "足し算結果と掛け算結果の合計値は#{add_result + multiple_result}です" ポイントは下記2点 1.整数同士(integer型)の計算だと返り値は整数 2.変数の定義をカンマ区切りにすることで、複数の変数を一度に定義している 感想 Rubyの基礎的なアルゴリズム問題ですが、メソッドへの意識がまだ低いため最初のような回答になったんだと思います。 「考え工夫する」ということ常に意識していきたいです。
- 投稿日:2021-08-09T10:29:49+09:00
`require': cannot load such file -- rexml/document (LoadError)
メイラーの機能をつけるためrails g mailerを実行して その後の工程を進めていき rails s サーバー起動しようと思い実行すると なんだか果てしないエラー文がお出まし^^; ターミナルエラー文一部抜粋 ~省略~ `require':cannot load such file -- rexml/document (LoadError) ~省略~ 長文を読み解くと多分ここが原因かな...?と その後もいろいろrails コマンドを試しても 全てrailsコマンドは死亡(全部エラー吐く これでエラーが出るようになるという事は 毎回追加しないといけないgemっぽいのでメモ 参考サイト&日記 記事 gemサイト Gemファイルに追記 gem 'rexml', '~> 3.2', '>= 3.2.5' 追記後 bundle install このgemを入れたら問題は解決しましたが、 なんか理由が明確にわからないから不安、、、 どなたか理由が分かる方いたらコメントで教えていただきたいです! 環境 rails6.1.4 ruby3.0.1
- 投稿日:2021-08-09T10:29:49+09:00
`require': cannot load such file -- rexml/document (LoadError)の対処法
メイラーの機能をつけるためrails g mailerを実行して その後の工程を進めていき rails s サーバー起動しようと思い実行すると なんだか果てしないエラー文がお出まし^^; ターミナルエラー文一部抜粋 #~省略~ `require':cannot load such file -- rexml/document (LoadError) #~省略~ 長文を読み解くと多分ここが原因かな...?と その後もいろいろrails コマンドを試しても 全てrailsコマンドは死亡(全部エラー吐く これでエラーが出るようになるという事は 毎回追加しないといけないgemっぽいのでメモ 参考サイト 記事 gemサイト Gemファイルに追記 gem 'rexml', '~> 3.2', '>= 3.2.5' 追記後 bundle install このgemを入れたら問題は解決しましたが、 なんか理由が明確にわからないから不安、、、 どなたか理由が分かる方いたらコメントで教えていただきたいです! 環境 rails6.1.4 ruby3.0.1
- 投稿日:2021-08-09T09:40:42+09:00
[個人開発]Discordの使用時間を計測するアプリ 「Discord-Log」を作りました
はじめに この度、Discordのボイスチャンネルの使用時間を自動で計測するアプリ「Discord-Log」をリリースしました。 このアプリは、RUNTEQというプログラミングスクール内限定でリリースしているアプリになりますので、サービスリンクは載せていません。 ご了承ください。 Discord-Log このサービスを作った背景 結論からお伝えすると、私がDiscordのボイスチャンネルにいる時間=学習時間であったため、簡単にその時間を計測できるサービスが欲しいなと感じたからです。 私自身、学習時間を計測する習慣はありませんでしたが、学習するときはDiscordを使うようにしていました。 そのため、Discordのボイスチャンネルを使用した時間を計測できれば、学習時間がわかるよね。ってことで、このアプリを作りました。 ※ここからは少し長いので、興味がない方は次章へ進んでください。サービスを作った背景を語ります。 みなさんは、こんな言葉を聞いたことはありませんか? 「エンジニア転職に必要な学習時間 1000時間」 私のアプリの構想はこの言葉から始まりました。 その時、既にプログラミングを学習し始めて5ヶ月が過ぎていました。 その当時の私は学習時間を計測する習慣がなく、 「自分って今どれくらい学習をしてきてるんだろう。」 「5ヶ月過ぎてるってことはそろそろ1000時間に近づいてきているのかな?」 「てか、本当にプログラミングの力が、身についているのかな?」 「はあ、、、自分はエンジニアになれるのだろうか。。。」 なんてことを考えながら、自分の現在地がわからなかったり、自分のやってきたことに自信が持てなくなり、日々の学習に対するモチベーションが乱高下していました。 学習時間を計測することと、モチベーションには相関関係があります。 東大生が教える!時間を計って勉強すると圧倒的に勉強効率が上がる5つの理由 私自身もそのことを知って、タイマーやポモドーロテクニックのような学習法を試してみたのですが、タイマーを押し忘れたり、記録をするのが面倒になってやめたりと、そう長くは続きませんでした。 RUNTEQでは、コミュニティのコミュニケーションツールとしてDiscordを使用しています。 Discordでは、受講生や卒業生、運営チームと気軽にお話をすることができます。 また、自習室のようにみんなで集まって勉強したり、議論したり、先輩に相談してみたり、勉強の息抜きとして他の受講生と雑談したりなどなど、24時間365日好きなときに利用することができます。 毎日のようにたくさんの受講生や卒業生、運営チームが交流をしています! いいですよね!! 私も学習の場として、Discordを使用していました。 そんな時に思ったのが、「Discordの使用時間を自動で測ってくれるアプリがあれば、学習時間を記録せずに済むな」と、 そう思いました。 私自身やRUNTEQ受講生が日々の学習やコミュニケーションの場として使っているDiscordで、使用している時間を計測して視覚化することがができれば、「時間を測ること」と「時間を記録すること」の2つの作業を自動で行うことができます。これは正しく一石二鳥、一挙両全です!! よし!これだ!! こうして「Discord-Log」を作ってみようと決意しました! だらだらと、すいません。 お付き合いくださった方ありがとうございます。大好きです。 サービス概要 Discord-Logは、登録したDiscordアカウントのボイスチャンネルの使用時間を自動で計算して、グラフとして視覚化するアプリです。 このアプリは、Rubyで作成したDiscordのBotアプリと、Railsで作成した「Discord-Log」の合わせ技になっております。 ターゲットユーザー RUNTEQの受講生 望む未来 このアプリを通じて、1人でも多くの人がモチベーションの波を抑えて1000時間の学習到達目標に到達し、エンジニア転職を成功させること。 使い方 Discord-Log Discordのボイスチャンネルに入室して退出後、画面をリロードすると時間が計測され表示されます 1.アプリの登録の仕方 サーバーの管理者の場合 ①「サーバーにBotを登録する」 サーバーの管理者の方は、自身が管理者になっているサーバーにBotを登録してください。 このBotは、ボイスチャンネルの入室・退出の際にRailsアプリのエンドポイントに対してPOSTリクエストを送信しています。 (※サーバーにBotが登録されていないと使用時間を計測することはできません。) ② Discordアプリの「サーバー設定」 → 「ウィジェット」 → 「ウィジェットを有効化」をクリック このウィジェットを有効化することにより、サーバー内のチャンネル情報を取得することができるようになります。 サーバーの管理者の方とその他のユーザーの共通処理 ① アプリの「Discord-Logを使う」より、「認証」を行ってください。「認証」が済みますと、アプリに登録したことになります。 認証からマイページ画面に行く間に、認証処理でユーザーを登録し、DiscordAPIの「ユーザーが所属している全てのサーバー」と「それらサーバーの全てのボイスチャンネル」を取得するエンドポイントに対してGETリクエストを送信しています。 そして、遷移後にはそれらの情報が表示されるようになっています。 2.機能の紹介 ①マイページ ログイン後に遷移する画面になります。 この画面では、ログインユーザーの全サーバーのボイスチャンネルの使用時間を確認することができます。 サイドバーには、ログインユーザーが所属している全てのサーバーが表示されます。 その下には、そのサーバー内にある、ボイスチャンネルが表示されるようになっています。 (この時、登録されているサーバーやチャンネルが表示されていない時は、「アプリの登録の仕方」の「ウィジェットを有効化」する処理ができてない可能性がありますので、ご確認ください。) ②サーバー詳細ページ サイドバーにある、サーバー名のボタンリンクをクリックすることで、サーバーの詳細ページへ遷移することができます。 この画面では、そのサーバー内にある、ボイスチャンネルの使用時間を確認することができます。 ③ボイスチャンネル詳細ページ 同じく、サイドバーにある、ボイスチャンネル名のボタンリンクをクリックすることで、ボイスチャンネルの詳細ページへ遷移することができます。 この画面では、そのボイスチャンネルの使用時間を確認することができます。 使用技術 ○Railsアプリ(Discord-Log) Ruby 2.6.6 Ruby on Rails 6.0.3 Discord API slim sorcery chartkick Bootstrap config dotenv-rails ○Rubyアプリ(Botアプリ) Ruby 2.6.6 discordrb net/http uri json 開発期間 約1.5ヶ月 ER図 工夫したこと 1.アプリの継続利用における障壁を無くすこと コンセプトとしては、「めんどくさがり屋な自分でも使いたいと思えるか?」ということを念頭に置いて、自問自答しながら作成しました。 このアプリに、一度登録すると、自動的にBotとRailsアプリのDBに時間が保存・計測されます。 なので、ユーザーは一度登録をして、Discordの使用時間を振り返りたいと思ったタイミングで再度アプリに訪問するだけで、それまでの使用時間が表示されます。 これによって、毎日の学習時間を自分で記録する手間が省けます。 これならめんどくさがり屋な私でも、使いやすいですよね! 2.Discordを普段と同じように使って、時間が計測されるようにすること DiscordのBotは、サーバー内のユーザーの音声ステータスが変更された時に動いています。 (音声ステータスとは、DiscordのカメラのON・OFFやミュートのON・OFF、スピーカーのON・OFFなどです。) このユーザーの音声ステータスが変わったタイミングで、そのユーザーがボイスチャンネルにいるかどうかBotが確認しています。 ボイスチャンネルにユーザーが居ればどのユーザーが、どのチャンネルに入室したかの入室処理を、ユーザーが居なければどのユーザーが、どのチャンネルを退出したかをRailsアプリにPOSTリクエストで送信しています。 チャンネルに入室・退出した際は必ずこれらのアクションが行われるため、このBotのイベントが発火します。 しかし、以下のように2つの問題が起きました。 ①音声ステータスが変わるごとに入室リクエストが送られてしまう問題 ②ボイスチャンネルの横移動をしたら前居たボイスチャンネルが退出処理されていない問題 これらを解決しない限り、普段通りにDiscordを使いながら簡単に学習時間の計測ができません。 なのでめんどくさがり屋な私は使いたくないなと思いました。 どのように解決したのかは、長くなるので割愛しますが、これらを解決することで、Discordを普段通りに使用しても時間が計測されるようになりました。 3.サーバーやボイスチャンネル名の名前の変更や削除に対応すること Discordアプリで、サーバーやボイスチャンネルの名前を変更したり、削除したりすることはよくあると思います。 変更の場合は、DBにあるデータをログイン時のAPIを叩いたタイミングで更新するようにしました。 削除の場合は、ログイン時のAPIを叩いたタイミングでDBにあるサーバー(もしくはチャンネル)のIDだけを配列をまず取得します。それらをAPIを叩いて取得した情報と照らし合わせ、取得してきた情報があれば配列から削除します。最後に配列から残ったIDをDBから削除するようにしました。 終わりに 初めての投稿で、拙い文章で申し訳ないです。 それでも、最後まで読んでくださりありがとうございました。 もし大人数のサーバーで勉強するのが中々難しいよって人もいると思います。 その時は、個人でサーバーを作って、使用することもできます。(ちなみに僕もそうやって最初は使っていました。) 僕のように自分の現在地がわからずにモチベーションを下げてしまうことなく、学習を続けてくれる受講生が1人でも増えればいいなって思っています。
- 投稿日:2021-08-09T03:14:26+09:00
ruby on rails Windows10 64ビットインストール Railsサーバー起動までlocalhost:3000
ruby on railsの設定方法について色々ぐぐったりしたけどほとんど間違っている内容だったので、正しいやり方を書きます。 rubyのダウンロード https://rubyinstaller.org/downloads/ インストール# 「Ruby+Devkit 2.7.4-1 (x64)」 です。 最新版をインストールするのは辞めました。 最新版が良いという方は最新版でやってみると良いかもしれません。 WITH DEVKITを選ぶ理由はツールがまとめられてるからです。 自分が使ってるWindows10が32ビットか64ビット数を間違えないように注意します。 自分が使っているWindowsのビット数の確認方法は Windowsのシステムからビット数を確認できます。 確認方法 コントロール パネル\すべてのコントロール パネル項目\システム Windowsの左下の検索バーで「コントロールパネル」を入力 Windows10 64bit=(x64) Windows10 32bit=(x86) インストールまでの作業 MSYS2にチェックを入れて次へ進む ※インストール後にこの記事を作成しており、すでにインストールされているというATTENTIONが表示されています。 ※MSYS2とは 公式日本語訳 MSYS2 MSYS2は、ネイティブWindowsソフトウェアを構築、インストール、および実行するための使いやすい環境を提供するツールとライブラリのコレクションです。これは、mintty、bashと呼ばれるコマンドライン端末 、gitやsubversionなどのバージョン管理システム、tarやawkなどのツール、さらにはautotoolsなどのビルドシステムで構成され、すべてCygwinの修正バージョンに基づいています。これらの中心的な部分のいくつかはCygwinに基づいていますが、MSYS2の主な焦点は、ネイティブWindowsソフトウェアのビルド環境を提供することであり、Cygwinを使用する部分は最小限に抑えられています。MSYS2は、ほんの数例を挙げると、GCC、mingw-w64、CPython、CMake、Meson、OpenSSL、FFmpeg、Rust、Rubyの最新のネイティブビルドを提供します。パッケージの簡単なインストールとそれらを最新の状態に保つ方法を提供するために、ArchLinuxユーザーにはなじみのあるPacmanと呼ばれるパッケージ管理システムを備えてい ます。依存関係の解決や単純な完全なシステムアップグレードなどの多くの強力な機能に加えて、簡単で再現性のあるパッケージ構築をもたらします。私たちのパッケージリポジトリには、インストールの準備ができている2000以上のビルド済みパッケージが含まれています。https://www.msys2.org/ コマンドプロント MSYS2のインストール RUbyinstaller 1-base installation 2-system update(optional) 3-and MINGW development toolchain ここで[1,2,3]の選択がありますが、 1,2,3とまとめて入力してENTERを押します。 その後、10分ほどインストールに時間を要します。 完了した後、また 1-base installation 2-system update(optional) 3-and MINGW development toolchain と出ますが、無視してENTERを押すとコマンドプロントが閉じされます。 これでRubyやMSYS2のインストールは終わりです。 Rubyがインストールされているのかruby -vで確認する コマンドプロントを起動させます。Windowsの左下の検索ボックスから「cmd」を入れてコマンドプロントを呼び出します。 Ruby -v と入力してENTER Railsのインストール コマンドプロントを起動 cmd gem install rails ※rubyに何かをインストールするときはgem installと最初に入れればOK しばらく待つとインストールが完了します。 railsがインストールされているのかrails -vで確認 インストール完了後に-vを入れて確認 rails -v SQLite3をインストールする SQLite3のライブラリをインストールします。 コマンドプロントを起動 cmd gem install sqlite3 しばらく待つとインストールが完了します。 SQLite3のEXEファイルやDLLなどを用意 ここでダウンロードします。 https://www.sqlite.org/download.html ダウンロードページに移動後、少し下へスクロールすると、 Precompiled Binaries for Windowsという項目があります、。 それがWindows用のファイルです。 私はWindows 64ビットだったので(sqlite-dll-win64-x64-3360000.zip)を選びました。 32ビットの人は上(sqlite-dll-win32-x86-3360000.zip)を選んでください。 次にexeファイル(実行ファイル)である sqlite-tools-win32-x86-3360000.zipをダウンロードします。 ※なぜ実行ファイルは32ビットしかないのか不明ですがこれを使います。 ダウンロードしたフォルダを解凍 ZIPファイルなので通常はダブルクリックで中身を取り出せると思います。 sqlite3.dllやexeファイルをrubyのbinフォルダへ移動 まずはsqlite3.dllだけを選びます。 exeファイル 中に三つあるので全部binフォルダへ移動させます。 sqlite3.exeだけ入れるといったことが書かれてているサイトなどがあり、その通りに何回やっても失敗しましたが、全部入れたらうまくできました。 移動先 Rubyのフォルダを開きbinへ rubyは通常Cドライブにあります。 一番上にbinフォルダがあるので、ここへさっきのdllファイルを入れます。 Rubyのbinフォルダへ移す 合計4つ移動させます。 Node.jsをインストール Node.jsの公式サイトでファイルをダウンロードします。 https://nodejs.org/ja/ 左の推奨版をダウンロード すべてNEXTを押してインストールを進めます。 ※途中、チェックボックスがありますが、チェック入れました。 Windowsのシステムの環境変数でNode.jsの実行ファイルのパスを通す 左下のWindowsのアイコン上で右クリックしてシステムを選択します。 少し下へスクロールすると関連設定にシステム情報があるのでそれをクリックします。 次に「システムの詳細設定」があるのでそれをクリック 次にシステムプロパティの詳細設定タブが表示されているので、一番下にある「環境変数」をクリック。 ユーザーの環境変数のところにPathがあるのでそれをダブルクリック ※以前にrubyの最新を入れて失敗したのでその時のパスが残ってます。 Node.jsの実行ファイルパスを入力します。 参照をクリックして、C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin Program Filesは Program FilesとProgram Files(x86)があります。node.jsは前者にあります。 これの設定にあたってはこちらのURLを参考にしました。 https://note.affi-sapo-sv.com/nodejs-windows-setting-knowledge.php 設定後は「OK」を押して環境変数のウインドウを閉じます。 node.jsのバージョンを確認 node.js -v バージョンが表示されたらインストール完了です。 yarnをインストールします(作業はnode.jsと同じ) yarn公式ページ Windowsインストーラーダウンロードページ https://classic.yarnpkg.com/en/docs/install#windows-stable 公式ページに移動後少し下へスクロールします。 コマンド入力でなく、 「Alternatives」 Click to expand / collapse でクリックします。 OSは「Windows」バージョンは「classic stabke」 インストールはすべてNEXTを選べばよいと思います。 環境変数でyarnのpathを通します。 参照から、C:\Program Files (x86)\Yarn\bin でOKです。こちらのプログラムファイルはx86の方を選びました。 yarnがインストールされているか確認 yarn-v Rails アプリを作成 rails new アプリケーション名 かなり長いですが しばらく待つと完了します。 Railsを起動させる rails s これで表示されます。
- 投稿日:2021-08-09T00:47:52+09:00
[テスト]FactoryBotにimageを記述する
はじめに 本記事は、テストコードに関するもので、 FactoryBotにimageを記述する方法(factoriesディレクトリ)を記述します。 本日、何時間も悩んだものになるので、 短いですが、アウトプットしたいと思います。 単体テストコードに関する記事は、以下も参照してください。 内容的には、ターミナルにて以下を記述後のこととなっております。 % rails g rspec:model テーブル名 FactoryBotにActiveStorageの記述をする 例 早速ですが、例文です。 FactoryBot.define do factory :tweet do content {Faker::Lorem.sentence} association :user after(:build) do |tweet| tweet.image.attach(io: File.open('ディレクトリ名/画像ファイル名'), filename: 'ファイル名') end end end afterメソッド 任意の処理の後(ここでは、(:build))の後に、 指定の処理((:build)以降の処理)を実行することができます。 io: File.open ここで設定したパスのファイル('ディレクトリ名/画像ファイル名')をfilenameを'ファイル名'として実行しています。 association 今回の趣旨とは、やや離れますが、 対象のテーブルとのアソシエーションも忘れずに記述しましょう。 association :user 実際にしてしまったミス ①テーブルのカラムに存在すると勘違いしてしまい、 今回の例文に沿って記述すると // (注意)謝った記述です。 FactoryBot.define do factory :tweet do image {'ディレクトリ名/ファイル名'} ←間違い!! content {Faker::Lorem.sentence} association :user end end と記述してしまった。 ②カラムに存在しないことがわかり、アソシエーションするのかと勘違いした。 // (注意)謝った記述です。 FactoryBot.define do factory :tweet do content {Faker::Lorem.sentence} association :user association :image ←間違い!! end end 終わりに 学習したことでしたが、全く初見のように思えてしまいました。 このようなことは今後も増えてきてしまうかと思いました。 しかし、忘れているのなら、 次は、理解して覚えていたら良いことです。 後ろは、フィードバックする時以外は向かず、 新しく出てきたものや、再度登場してきたものをどんどん理解していきたいと思います。 それでは、 明日も頑張りましょう!!