- 0.1. 激安なDBの仕組み作りにチャレンジ 2回目
- 0.2. ページネーションレイアウト
- 0.3. 【Rails】Carrierwaveを用いてAWSのS3にPDFのアップロードとダウンロードを可能にする。
- 0.4. 激安なDBの仕組み作りにチャレンジ 1回目
- 0.5. Ruby 麻雀 配牌のシャンテン数をカウントしたい①
- 0.6. 紛らわしいRubyの@とselfについて
- 0.7. タグ機能をつけてみよう
- 0.8. Railsで削除してしまったデータを復元する
- 0.9. 6 Railsを用いた注文機能の作成方法
- 0.10. 1 Railsでエンドユーザーのサインアップとログイン機能、管理者のログイン機能を実装
- 0.11. $ rails generate devise:install 実行後の4つのセットアップ
- 0.12. chrubyの使い方
- 0.13. Ruby unlessとは
- 0.14. Ruby技術者認定試験 3.1 Silver受験した
- 0.15. Ruby モジュールとは
- 0.16. Ruby nilってnullと違うの?
- 0.17. 【Rails】bundle install Your Ruby version is 3.0.2, but your Gemfile specified 3.0.4の対処法
- 1. 症状
- 2. 解決策
- 3. 参考
激安なDBの仕組み作りにチャレンジ 2回目
# はじめに
[この](https://qiita.com/hiroaqi/items/fac3267c1a6d6b8b7fcc)記事の続きになります。
今回は、前回作成した仕組みのクライアント側(SQLと結果を受け取る)を作成していきます。主な処理の流れは、Cloud Pub/SubにSQLを含んだメッセージを送信して、その結果が出力されているCloud Storageから結果を受け取ります。
# クライアント側のコード
クライアントもRubyで書いていきます。Gemfileには次の2つのgemを追加します。
“`ruby:Gemfile
gem “google-cloud-pubsub”
gem “google-cloud-storage”
“`クライアント側のコードは次のようになります。
“`ruby:client.rb
require “google/cloud/pubsub”
require “google/cloud/storage”
require “json”
require “securerandom”def execute(query)
ページネーションレイアウト
## 初めに
前回はページネーションの実装について投稿しましたが今回はレイアウトについて投稿していきます。
すでに’kaminari’をGemfileに入れている方は 新たに’bootstrap4-kaminari-views’を入れてviewページの記述の所を見て貰って構いません。
まだ、’kaminari’をGemfileに入れていない場合は上から順にやって頂けたら幸いです。## Gemfile
まずGemfileに
“`
gem ‘kaminari’,’~> 1.2.1′
“`
“`
gem ‘bootstrap4-kaminari-views’
“`
上記の記述を入れてあげます。
記述をしたら忘れずに“`
bundle install
“`
をしましょう。
bundle installをしたら次にkaminariの設定ファイルを作成する為に下記のコマンドをターミナルに打ち込みます。
“`
$ rails g kaminari:config
“`
最後に、kaminariが利用するテンプレートを作成してあげます。
“`
$ rails g kami
【Rails】Carrierwaveを用いてAWSのS3にPDFのアップロードとダウンロードを可能にする。
# はじめに
PDF投稿機能。cloudinaryではpdfに対応していないので、AWSのS3を使ってPDF投稿を実現しました。
# 開発環境
– Ruby 3.0.4
– Rails 6.1.7# 前提
– tweetsコントローラーで投稿機能作成済み
– tweetsテーブルにはpdfカラムstringで用意
– [AWSアカウント登録済](https://aws.amazon.com/jp/free/?gclid=Cj0KCQjwqoibBhDUARIsAH2OpWjwD6i56zlT62LqzwhLLLs-Pwqdqo91PMZ_10Pre8KXy7wURDGgIOkaAuJXEALw_wcB&trk=94c18984-27d1-4395-8dae-cdbf523f1ae5&sc_channel=ps&s_kwcid=AL!4422!3!568105078079!e!!g!!aws&ef_id=Cj0KCQjwqoibBhDUARIsAH2OpWjwD6i56zlT62LqzwhLLLs-Pwqdqo91PMZ_10Pre8KXy7wURDGgIOkaAuJ
激安なDBの仕組み作りにチャレンジ 1回目
# はじめに
AWS(Amazon Web Services)やGCP(Google Cloud Platform)、AzureなどでもなかなかDBのコストは高いため(AWSのサーバーレスのRDSは安いかもしれません)、利用頻度の低いケースやレスポンスが遅くても大丈夫な場合を前提としたなるべくコストの安いDBの仕組みを作ってみようという記事になります。
まず1回目は、SQLのクエリを受け付ける箇所について作成していこうと思います。また、Google Cloud Platfromで構築していきます。使用するサービスは、もちろんCloud SQLは今回は使用できないのでコストの安そうなサービスを使用していきます。
# 仕組み
どのようにして低コストの仕組みを作るのか考えてみましたが、作りやすさ(コード量の少なさなど)を重視して次のようなサービスを利用していきます。
– Cloud Functions
– Cloud Storage
– Pub/Sub処理の流れは次の通りです。
1. SQLクエリの受付: Pub/Sub
1. Pub/Subに格納されたSQLを実行: Clo
Ruby 麻雀 配牌のシャンテン数をカウントしたい①
# 現状の課題
麻雀牌全種類から無作為に14枚取り出す構造はできたため、そこから取り出された値を見て
シャンテン数をカウントしたい。
これがいくら考えてもいい方法が思いつかない。。。
ただまずは今の配列データのままでは面子の判断も難しいので、配牌の萬子、筒子、索子、字牌がそれぞれどれくらいあるかのカウンターを作ってこれをもとに判定する機能を設けようかと考えました。# 作成コード
“`ruby:pia.rb
def shanten
mcounter = [0, 0, 0, 0, 0, 0, 0, 0, 0]
scounter = [0, 0, 0, 0, 0, 0, 0, 0, 0]
pcounter = [0, 0, 0, 0, 0, 0, 0, 0, 0]
zcounter = [0, 0, 0, 0, 0, 0, 0]
@haipai.each do |pai|
pai_num = pai.split(/\s*/)
val = pai_num[1].to_i – 1
case pai_num[0]
紛らわしいRubyの@とselfについて
Rubyのクラスについて紛らわしい@とselfの違いを自分の備忘録としてまとめます。
クラスの基本内容については[先日まとめた記事](https://qiita.com/bellmmm/items/a1292d5143d0f128c009)をご確認ください。
# 紛らわしい@とself
クラス内でインスタンス変数を参照するのに、例えば`@name`と`self.name`のように、@が使われる場合とselfが使われていることがあります。この違いは何なんでしょうか?# 前提知識
## インスタンス変数
`@name`のように最初に@が付いたものはインスタンス変数そのものを表しています。つまり、データの入れ物それ自体を表しています。## インスタンスメソッド
一方、`self.name()`のように最初にselfが付いたものはインスタンスメソッドの呼び出しを表しています。下に例を示します。“`ruby
class S
def calc
return 1+1
enddef call_calc
# クラス内でインスタンスメソッドを呼び出
タグ機能をつけてみよう
# はじめに
この記事ではいわゆるタグをつけて投稿し、そのタグによって検索できる仕組みを実装しています。
前提としてTweetモデルにて投稿機能を扱う状態からタグ機能を追加していきます。実装内容一覧
1. タグモデルの作成
2. モデルのアソシエーションの設定
3. デフォルトのタグをseedファイルで用意する
4. Tweet投稿の際、タグの投稿を可能にする
5. コントローラーでタグ配列を受け取れるようにする
6. 各Tweetにつけられたタグを表示する
7. 複数タグの検索をできるようにする
8. 新たなタグの追加をできるようにする
9. タグ機能に関するその他の記事# 1. タグモデルの作成
まず、今回使用するモデルは以下の3つになります。|Tweets|Tweet_tag_relations|Tags|
|—|—|—|
|id|id|id|
|title|tweet_id|name
|body|tag_id|– Tweets
– 投稿テーブル
– Tags
– タグに関するテーブル
– Tweet_tag_relatio
Railsで削除してしまったデータを復元する
# はじめに
最近3つあった案件が2つ急になくなってしまってピンチのフリーランスエンジニアの[藤井](https://twitter.com/YoshitsuguFujii)です。
えっ。不況?
最近は釣りばっかりしています。ということで時間があったのでQiita初投稿です。
# 道具箱を持とう
さていきなりですがみなさん道具箱お持ちでしょうか?
道具箱というのは自分が開発、運用、調査などをする際に便利に使える自分専用のツール類(主にcliツール)のことです。問題解決のためには、もちろんネットで探して既成のソフトを使ってもいいんですが、せっかく自分でコードを書けるのだから自分で作って自分の道具箱に追加しましょう。
特に新人の方はスキルも上達するのでおすすめです。
どこかから持ってきたコードを改造して使ったりしてみてもいいです。
日々使い続ける上で自分好みにカスタマイズしながら洗練させていきましょう。# 心構え
自分しか見ないし使わないのでコードは汚くていいんです。可読性なんて考えなくていいです。まさかりも飛んできません。 なのでPRで辛辣なことかかれません
6 Railsを用いた注文機能の作成方法
# 注文機能の流れ
###### 1 注文情報を入力
###### 2 注文情報を確認
###### 3 注文機能
###### 4 注文完了画面# 前提条件
## orderモデル , order_detailモデル , カラム,アソシエーションをこのように定義しましたorder.rb
“`Ruby
class Order < ApplicationRecord belongs_to :end_user has_many :order_details #enumによって、数字に意味を持たせることができる #今回の場合、0がcredit_card 1がtransferという意味。 #支払い方法 enum payment_method: {credit_card: 0, transfer: 1} #注文ステータス enum order_status: {wait_payment: 0, confirm_payment: 1, making: 2, preparing_ship: 3, finish_prepare: 4} end ``
1 Railsでエンドユーザーのサインアップとログイン機能、管理者のログイン機能を実装
## 1 Deviseの導入
#### (1)Gemfileに以下を追記する“`
gem ‘devise’
“`
#### (2) bundle intallを実行する## 2 顧客 , 管理者用のモデルを作成する
顧客のモデルを作成する
“`
rails g model devise Enduser
“`管理者用のモデルを作成する
“`
rails g model Admin
“`## 3 顧客 , 管理者用のテーブルを作成する
それぞれのマイグレーションファイルに以下を追記するdevise_create_end_users.rb
“`Ruby
t.string :first_name 名前 姓
t.string :katakana_first_name 名前 カナ 姓
t.string :last_name 名前 名
t.string :katakana_last_name 名前 カナ 名
t.string :postal_code 郵便番号
t.string :a
$ rails generate devise:install 実行後の4つのセットアップ
<開発環境>
・cloud9
・Rails:5.2.8.1
・Ruby : 2.6.3<きっかけ>
自主制作アプリにログイン機能を追加しようと
gemに’devise’を追記した後、4つのセットアップをした時のやり方。まずはgemfileに以下を追記。
“`
gem ‘devise’
“`
そしてターミナルで下記を実行する。
“`
$ rails generate devise:install
“`正常に実行されれば4つのセットアップの文が表示される。
ですが今回はエラーはないものの、正常にインストールしていなかったので
普段やるはずの以下の4つのセットアップ項目を追記していく。1つ目
アプリ名/config/environments/development.rb に下記を追記。
“`
config.action_mailer.default_url_options = { host: ‘localhost’, port: 3000 }
“`
2つ目
アプリ名/config/routes.rb に追記。
“`
root to:
chrubyの使い方
## chrubyのインストール
“`
ghq get postmodern/chruby
“`その後
“`bash
source “${HOME}/src/github.com/postmodern/chruby/share/chruby/chruby.sh”
source “${HOME}/src/github.com/postmodern/chruby/share/chruby/auto.sh”
“`を ~/.zshrc.local とかに追加 (2つ目は.ruby-version用)
## ruby-installのインストール
“`
ghq get postmodern/ruby-install
“`その後
“`bash
export PATH=”${PATH}:${HOME}/src/github.com/postmodern/ruby-install/bin”
“`を ~/.zshrc.local とかに追加
## Rubyのインストール
“`
ruby-install 3.1.2
“`## Rubyの一覧
“`
ch
Ruby unlessとは
PHPerがRuby on Railsを学んでいく中の備忘録
## unlessとは
unless文は、条件が「偽」の場合にその後の処理を実行するもの。## unlessの文法
“`unless.rb
unless 条件式 [then]
#条件式が偽の時に実行する処理
end
“`## unlessでelseは使える?
unlessでもelseを使うことができる
“`unless_example.rb
unless 条件式 [then]
#条件式が偽の時に実行する処理
else
#条件式が真の時に実行する処理
end
“`## 注意
可読性における観点から、ifで事足りる場合には、unlessでelseが使われることはほぼない。## 返り値
条件式の評価結果が偽である場合は評価結果を返し、条件式が真である場合は式が、nilを返す## 後置unless(unless修飾子)
3項演算子のように一行で記述することが可能
“`unless.rb
式 unless 式
“`
後置unlessは、右辺の条件が成立しない場合に、左辺の指揮を評価し、その
Ruby技術者認定試験 3.1 Silver受験した
試験のrubyバージョンが2020年10月から2から3に変わったのですが、
対策本が出ていなかったり、ネットの情報がないため受験するか迷っていました。
ただ、再受験無料キャンペーンがあるっぽいので、落ちた時のショックも少ないかなと思い受験しました。結果としては、version2の問題などで学習しても問題なかったです。
学習の際、整理した内容を記載します。## 使用した問題集
– [公式問題集 Ver3.0](https://github.com/ruby-association/prep-test/blob/version3/silver_ja.md) [(解答)](https://github.com/ruby-association/prep-test/blob/version3/silver_answers_ja.md)
– [公式問題集 Ver2.0](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0) [(解答)]()
– [ミニツク](http://www.minituku.net
Ruby モジュールとは
PHPerがRuby on Railsを書くことになったので、備忘録として
PHPをやってきて、モジュールという概念を知らなかったので## モジュールの書き方
“`module.rb
module モジュール名
処理
end
“`
モジュール名は必ず英数字の大文字で始める## モジュールとクラスの違い
・モジュールはインスタンスを作れない
・モジュールは継承できない## モジュールを使う目的
・名前空間の提供
・インスタンスメソッドとして取り込む(Mix-in)
・モジュールをオブジェクトに取り込む(extend)
・モジュール関数## モジュールを使った名前空間の提供
Ruby on Railsのコードを見ていて、この使い方が一番多いのかなという印象
PHPでいうところの名前空間(namespace)と同じ使われ方呼び出しは ::演算子を使い、モジュール名::モジュール名 またはモジュール名::クラス名 のように使う
## インスタンスメソッドとして取り込む(Mix-in)
PHPでいうところのtrait?
Rubyは多重継承を許さず、Mix-inとい
Ruby nilってnullと違うの?
元々PHPをやっていて、Rubyのnilというものが気になったのでメモ
## nilとは
Rubyでは「null」ではなく「nil」が利用されるRubyは全てがオブジェクトなので、nilは、NilClassに属している。
nilはNilClassの中の唯一のインスタンス。nil判定を行う際は、NilClassの中の定義されたメソッドを使用する必要がある。
→ こちらの件についての追記
nil? メソッドは確かに NilClassクラスに定義されていますが,Objectクラスにも定義されていて,どんなオブジェクトに対しても使えます。
でないと nil 以外のオブジェクトに対して NoMethodError が出て nil 判定できませんからね。
Object クラスの nil? メソッドは常に false を返しますが,NilClass クラスの nil? メソッドはそれを「常に true を返す」メソッドとして上書きしています。@scivolaさん、ご指摘ありがとうございました!
## nilの判定
### nil?
nil?では、対象オブジェクトがnilかどうかを確
【Rails】bundle install Your Ruby version is 3.0.2, but your Gemfile specified 3.0.4の対処法
症状
DockerでGemfileのrubyバージョンを変更した後、ローカルでサーバーを実行したとき、下記のエラーが発生しました
Gemfileのバージョンが違うと怒られているようです。
ただ、Docker側でバージョンが3.0.4で使っているので、できればGemfileのバージョンを変えたくない・・・。“`terminal:error
Your Ruby version is 3.0.2, but your Gemfile specified 3.0.4
“`“`ruby:Gemfile
ruby ‘3.0.4’
“`“`ruby:Gemfile.lock
RUBY VERSION
ruby 3.0.4p107
“`解決策
以下のサイトにアクセスして、ローカル環境に該当のバージョンのrubyを入れて、解決しました。
https://rubyinstaller.org/downloads/
参考
https://rubyinstaller.org/downloads/
6-3. オリジナル開発初期手引書
## 0. はじめに
企画面談お疲れ様でした!早速オリジナル開発を進めていきましょう!
このページは、オリジナル開発の第一歩を踏み出すときに使用します。
(“`rails new“`から削除機能まで)まず、自分の企画面談シートを開いておきます。
このページでは、企画面談サンプルシートを使って説明していきます!
# 目次
1.railsアプリケーションの作成 & 開発の下準備
2.モデルの作成
3.ルーティングの作成
4.コントローラーの作成
5.新規投稿機能
6.一覧ページの表示
7.ログイン機能の作成(任意)
8.開発を便利にしてくれるツールの紹介## 1. Railsアプリケーションの作成 & 開発の下準備
アクティブストレージを利用して複数枚の画像を投稿した際の単体テスト
アクティブストレージを利用して複数枚の画像投稿には成功した。
しかしテストコードで詰まったので記録。
結論
“`ruby
RSpec.describe Item, type: :model do
before do
@item = FactoryBot.build(:item)
@item.images = [ fixture_file_upload(“/files/test_image.jpg”)]
end
“`
このように書き換える。
画像1枚のときは fixture_file_uploadだけでよかったのですが、複数枚になったことで配列で渡す必要があったのですね。
エラーメッセージを日本語対応にする
フリマアプリ追加実装にてエラーメッセージを日本語対応にしたので記録。
まずは
config/application.rb
“`ruby
config.i18n.default_locale = :ja
“`
を追記。これしないとエラーでます。“`ruby
gem ‘rails-i18n’
“`
をgemファイル末尾に加えてbundle install(ローカル)
itemモデルのimageのところを
“`ruby
has_many_attached :images
“`
このようにhas_many_attachedに変える。image→imagesの複数形にすることも注意。
次にitemsコントローラー。
ストロングパラメーターを書き換える。
“`ruby
def item_params
params.require(:item).permit(:product_name,:product_description,:category_id,:condition_id,:contribution_id,:prefecture_id,:delivery_id,