- 1. rubyのAPI問題
- 2. 色々な言語でファイルIOを競って速度比較
- 3. rails db:migrateが失敗!
- 4. RSpecでCSVの値をチェックする
- 5. クッキー、セッション、キャッシュを簡単にまとめ
- 6. 【rails g.error】
- 7. 【Railsチュートリアル 5章】レイアウトを作成する
- 8. 【Ruby】each_with_indexとsearchを組み合わせたプログラム・考え方
- 9. herokuへアップロードできない
- 10. 【Railsチュートリアル 4章】Rails風味のRuby
- 11. operator does not exist: timestamp without time zone ~~ unknownというエラーの対処
- 12. rails g controller コマンドで作成されるファイルを制限
- 13. テーブル設計(Active Hashを利用する)
- 14. (´-`).。oO(標準出力の『Hello』をお手軽に探したい。
- 15. 実装するにあたり、テストを記述したのち、処理をコーディングする
- 16. データベース(MySQL)の主キーを任意のカラムに変更する。
- 17. 【Rails】Amazon PA API v5.0 で書籍検索(非同期通信)
- 18. Ruby 預金システム、アルゴリズム問題
- 19. 半角スペースで区切られた2つの正の整数を足し算して出力する
- 20. 【Ruby】基本コマンド一覧
rubyのAPI問題
#### 問題.1
任意の3つの数値の合計を出力するメソッドを作りましょう。
ただし、同じ数が含まれている場合は
合計にカウントされません。※わからない場合はAPIを利用して問題を解きましょう。
参考URL: https://docs.ruby-lang.org/ja/search/##### 出力例:
lone_sum([1, 2, 3]) → 6
lone_sum([3, 2, 3]) → 2
lone_sum([3, 3, 3]) → 0今回の問題は、難しくって全く見当違いの回答でした!
引数が配列になっているのもよくわからなかったです。
ただ、傾向として配列が出てくる時にはeach文は鉄板のような気もします。以下回答です。
“`ruby
def lone_sum(ary)
# 配列から、重複しない要素のみ取り出す
uniq_nums = []
ary.each do |num|
count = 0
ary.each do |i|
if num == i
count += 1
end
色々な言語でファイルIOを競って速度比較
複数のプログラミング言語で約 1GB の CSV ファイルを Read/Write して時間を測定してみました!
# 共通ルール
– どの言語でも同じファイルを使用して確認すること
– ファイルは一行ずつ読み散り、一行ずつ書き込むこと
– OSの差を無くすため、Docker Image は全て base(Ubuntu 18.04 LTS)を使用すること# まずは結果
|言語|5回実行した平均タイム(秒)|
|:–|:–|
|C-lang|6.2962|
|C++|6.0538|
|C#|17.1798|
|Golang|10.3966|
|Java|21.0840|
|Python|32.6949|
|Ruby|30.7153|
|Scala|21.8364|やっぱりC/C++がダントツで早い!!
次点でGo言語# 実装サンプル
5年ぶりくらいにC++書いたので綺麗ではないと思いますが、一番早かったのでサンプルとして載せます。
他の言語でも以下の動作をベースとして実装しました。
– 5回実行した平均時間を計算
– 1行読んで1行書き込む“`c
#inc
rails db:migrateが失敗!
##rails db:migrateを実行した際のエラー
`rails db:migrate`を実行すると
以下のエラーが出ました!“`
StandardError: An error has occurred, all later migrations canceled:
“`
直訳すると以後の全てのマイグレーションでエラーが発生しキャンセルされましたという内容です。更に、こんなエラーも出ています。
“`
Mysql2::Error: Specified key was too long; max key length is 767 bytes
“`
こちらのエラーは指定したキーが長すぎるためエラーが発生しているようです。
maxのkeyの長さは767bytesのようです。##今回のエラーの仮説
keyの長さがmax767バイトなのに対し、keyが長すぎたためエラーが発生しているようです。railsでデフォルトで生成される255文字のVARCHER型の場合、
◎**utf8mb4は1文字4バイト**、
255×4バイト= 1020バイト
767
RSpecでCSVの値をチェックする
今参画しているプロジェクトでCSVのRSpecは
“`Ruby
expect(csv).to have_content(‘value’)
“`
のような形で書いていたのですが行毎の値を確認する必要が出てきたのでいろいろ調べていたんですが地味に検索で出てこなかったのでメモ。以下のようなcsvを想定
|column_0 |column_1 |
|—|—|
|value_1 |value_2 |
|value_3 |value_4 |“`Ruby
it ‘example’ do
csv_content = Sample.csv_content
csv = CSV.parse(csv_content)
# [行番号][列番号]
expect(csv[0][0]).to eq ‘value_1’
expect(csv[0][1]).to eq ‘value_2’
expect(csv[1][0]).to eq ‘value_3’
expect(csv[1][1]).to eq ‘value_4’# 行毎に比較もできる
クッキー、セッション、キャッシュを簡単にまとめ
## クッキー
・「誰が?」の情報を取得し、保存してる。
・passwordやuser_idなどがあるためセキュリティ上危険。そのためセッションにより安全に情報を保持する。
・保存場所は、自分のPC(主にブラウザ)
・クッキーは無効にできる。
## セッション
・「何をしたか?」という情報を取得し、保存してる。
・クッキーと連動して生成されてることが多い。
・保存場所はブラウザだけでなく、サーバーにも情報が保存されてるから、追える。
・セッションは無効にできない。
## キャッシュ
・よく使うデータへのアクセスを速くするために、より高速な記憶装置に一時的に保存する仕組み。
・高速化のための情報を保存してる。
## 3つの違い
キャッシュとクッキーおよびセッションとの大きな違いは、
キャッシュが表示の高速化のために情報を保存しているのに対して、
クッキーやセッションはユーザーの情報を保存していること。
【rails g.error】
◆ファイル作成時のスペルミス
・rails g model massege
上記でmodelでファイルを作成。その後、コントローラーで初期値の設定をできていないとエラーになり、プログラミング初心者の私は7時間かかって解決できませんでした。
次の日、通っているプログラミングスクールのメンターさんに解決していただきました。◆rails gでファイル名を指定して作成する時はスペルミスをするととんでもないことになりました。
qiitaで書くブログの情報発信らしい内容はまだまだ書けていませんが、有益な情報を発信できるように頑張って学習していきます。
【Railsチュートリアル 5章】レイアウトを作成する
# ナビゲーション
すべてHTMLはクラスとidの両方を指定することができる。
これらは単なるラベルであり、CSSでスタイルを指定するときに使用する。**クラスとidの違いはクラスはページ内で何度でも使用できるが、idは一回しか使用できない点です。**
下のheaderタグには、navbar, navba-fixed-top, navbar-inverseという3つのCSSクラスがスペース区切りで与えられています。
“`erb
“`
下のコードをみてください
. navタグは**内側がナビゲーションリンクである**という意図を明確に伝える役割があります。
. ulタグに付与されているnav,navbar-nav, navbar-rightクラスもBootstrapにおいて特別な意味を持ちます。“`erb
【Ruby】each_with_indexとsearchを組み合わせたプログラム・考え方
アウトプット用に記します。
`macOS Catalina10.15.6にインストールしたRuby 2.6.5を使用。`
#やりたいこと#
数を探して何番目に含まれているか結果を返すメソッドを**search**と**each_with_index**を用いて作成したいんよね。###まずこういう配列があるたいな###
“`
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
“`
###んで、こんな感じに使えるsearchにしたいわけたいな###
“`rubysearch(12, input)
=> 4番目にありますsearch(7, input)
=> その数は含まれていません
“`
###each_with_indexについて###
**each_with_index**はRubyに標準で組み込まれているメソッドの1つたいね。要素の繰り返し処理と同時に、その要素が何番目に処理されたのかも表せるんよ。“`ruby
#each_with_indexの使い方
配列名.ea
herokuへアップロードできない
#環境
・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15#あらすじ
`Rails`でWEBアプリを作成し初めて`heroku`へデプロイするときにうまくできなかったり画面が表示されず困ったのでケアレスミスもありますがその時の対処を載せます。#問題点1(アプリ名)
アプリ名やファイル名に`アンダーバー「_」`は使用できないということ。自分の場合はGithubへもPUSHができませんでした。
`ハイフン「-」`は利用できるので自分の場合はハイフンを変更することにより進みました!#問題点2(マイグレーション)
デプロイ後にマイグレーションしてなかった。初めてのことだったので、この単純な作業になかなか気づけませんでした。。。“`
git push heroku master
“`
その後にDBを作成を忘れずに!“`
heroku run rake db:migrate
“`#問題点3(DBの種類が違う)
`heroku`のDBは『PostgreSQL』であり自分の環境(MySQL)と異なっていたこ
【Railsチュートリアル 4章】Rails風味のRuby
# 引数のデフォルト値
メソッドを呼び出した時に指定した引数は、メソッド側で先頭から順に代入されていきます。
この時、代入するオブジェクトが無かった場合(呼び出し側で指定した引数の数が、メソッド定義側で指定した引数よりも少なかった場合)、
デフォルト値が設定されていればその値が代わりに代入されます。“`ruby
def printHello(msg=”No msg”, name=”No name”)
print(msg + “,” + name + “¥n”)
endprintHello(“こんにちは”, “佐藤”) #=>こんにちには,佐藤
printHello(“お元気ですか”) #=> お元気ですか,No name
printHello() #=> No msg, No name“`
“`ruby
def printHello(msg=”No msg”, name=”No name”)
print(Kconv.tosjis(msg + “,” + name + “¥n”))
end“`
# カスタムヘルパー
Railsのビューでは膨
operator does not exist: timestamp without time zone ~~ unknownというエラーの対処
#環境
・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15
・herokuへデプロイ#あらすじ
railsでWebアプリを作成しherokuへデプロイするときにエラーが発生した。heroku log でエラーを確認すると以下のような表示を発見
“`
operator does not exist: timestamp without time zone ~~ unknown
“`
エラー文は初めはよくわからなかったがtimestampとはカラムの型なので型のところで何かエラーが起こっていることがわかりさらに調べて見ました。そうするとDBの検索の条件文に問題点があることが判明。
もうすこし詳しくいうと、データの作成日時で検索をかけていたロジックが以下みたいに文字列(string型)で検索していたため問題が発生。“`
where(‘created_at: LIKE(?)’, “%%-%%-%%”) #左記は問題のコード
“`#原因
原因は端的にいえばherokuのDBは『PostgreSQL』であ
rails g controller コマンドで作成されるファイルを制限
*環境:rails 6.0.3*
`rails g controller <コントローラー名> <アクション名>`
を実行すると、`controller`と`view`以外の、**特に必要のないファイル**が作成される。これを回避するために、`rails`プロジェクト内に、次のファイルを作成すれば,
`controller`と`view`以外のファイルが作成されないようになる。“`ruby:config/initializers/generators.rb
Rails.application.config.generators do |g|
g.assets false
g.helper false
g.skip_routes true
end
“`上記ファイルの作成が面倒なときは、
`rails g controller`コマンドを実行時に下記3つのオプションを追加して実行する。“`ruby:
rails g controller <コントローラー名> <アクション名> –no-assets –no-helper –skip-routes
テーブル設計(Active Hashを利用する)
# 概要
今回は、フリマアプリのクローンサイトを作る上でテーブル設計をしていきました。
初めて自作で作るのでテーブル設計のクオリティはまだまだですが、とりあえずアウトプットということで見逃してください、、、## ER図
このようになりました。
![テーブル設計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696517/31a51428-7f87-6eaa-15b3-1ed426f07d13.png)ポイントとしては、既存のデータから選択させるような箇所はActive Hashを用いてファイルを用意しておくことです。
商品のコンディションや、購入時の届け先の都道府県など、、、
都道府県を表すprefectures(active_hash)テーブルに関しては発送元と届け先で二箇所利用しています。## Active Hashの使い方
### インストール
Gemfileに以下を記載してbundle installする。“`ruby:Gemfile
gem ‘active_hash’
“
(´-`).。oO(標準出力の『Hello』をお手軽に探したい。
Ruby初心者です。
今日は「Hello World」を出力するだけのrakeタスクを作りました。
“`
# rake hoge:hello
“Hello World”
“`
結果に「Hello」が含まれていることを確認するテストを書いてて、簡潔に文字列指定で探せる方法があれば良いと思ったのですが。。。## コード
“`hoge_spec.rb
require ‘rails_helper’
require ‘rake’RSpec.describe ‘Hoge’, type: :task do
# 中略
describe ‘rake hoge:hello’ do
let(:task) { ‘hoge:hello’ }context ‘標準出力のHelloを探せ’ do
it ‘標準出力でHello #1 outputマッチャーの引数に文字列’ do
# ※理想型。ただし完全一致しないので失敗する。。。
expect{ @rake[task].invoke() }.to output(‘H
実装するにあたり、テストを記述したのち、処理をコーディングする
### 背景
現場でのあるあるですが、普段は以下の流れで開発を進めることが多いと思います。
(1)設計→(2)処理のコーディング→(3)テストのコーディング→(4)単体テストなど…しかし、Railsチュートリアルでは、
(1)設計→(2)テストのコーディング→(3)処理のコーディング…
という流れで解説されていました。自分も少し勉強になったので、記事として掲載しようと思います。### 環境
| 項目 | 内容 |
|:—————–|:——————:|
| OS | aws #35-Ubuntu SMP(Cloud9)|
| Ruby | ruby 2.6.3p62 (2019-04-16 revision 67580) |
| Ruby On Rails |
データベース(MySQL)の主キーを任意のカラムに変更する。
# 初めに…
データベースでテーブルを作成すると必ず作成される主キー( `:id` カラム)ですが、デフォルトではレコードに登録された順番に1番から登録されていきます。ところが、既存のサービスを見てみると `https://www.uniqlo.com/jp/ja/products/E428313-000` のように商品番号が URL に入っていたり、ユーザー情報を閲覧できるページではユーザー名がパラメータとなっていたりします。
そこで、本投稿ではデータベース(MySQL)で主キーを任意のカラムに変更する方法をご紹介します。# データベース (MySQL) の主キーを任意のカラムに変更する方法
“`Ruby:db/migrate/_マイグレーションファイル.rb
class ● ● ● < ActiveRecord::Migration[5.2] def change create_table :テーブル名, id: false, primary_key: :主キーにするカラム名 do |t| # `id: false` は、このテーブルでは `:id
【Rails】Amazon PA API v5.0 で書籍検索(非同期通信)
[こちらの記事](https://qiita.com/koki_73/items/da9f2ed01aadd6394702)の続きです。
前回はAPI連携後にviewファイルを表示させていましたが、今回はajax通信でデータを取得して書籍検索結果を表示します。
(理由はこの方がかっこいいからです笑)## 完成イメージ
![ee6e3c4e9c998d33288b32bff916570d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/3c063769-d3c6-205e-7041-9167619e7586.gif)(cssで見た目を少し整えたので、前回の記事と少し見た目は変わってます)
## 処理の流れ
検索フォームに入力して検索ボタンを押す(submitする)と以下のように処理されます1. 検索フォームのキーワードを取得
2. json形式でデータ(キーワード)を持たせて、指定のURLにリクエスト(ajax通信)
3. コントローラでAPI連携の処理をし、jsonで
Ruby 預金システム、アルゴリズム問題
#### 問題.1
以下の条件を達成するプログラムを実装しなさい銀行口座に10万円の預金残高があり、お金を引き出すプログラムを作成します。
・お金を引き出すwithdrawメソッドを作成する
・お金を引き出すと手数料110円かかり、「◯◯円引き落としました。残高は◯◯円です」と表示する(残高は手数料を引いた額を表示します)
・もし預金残高より多く引き落としたら「残高不足です」と表示する
・以下にヒントを用意するので参考にしてください“`ruby
def withdraw(balance, amount)
fee = 110 # 手数料
# 引き落とし額と残高を表示する、もしくは残高より多く引き落としたら残高不足と表示
endbalance = 100000 # 残高
puts “いくら引き落としますか?(手数料110円かかります)”
money = gets.to_i
withdraw(balance, money)
“`比較的、わかりやすい問題でした。
以下が回答です。
“`ruby
def withdraw(balance, a
半角スペースで区切られた2つの正の整数を足し算して出力する
paizaDランク問題で、標準入力に半角スペースで入力して計算する方法が分からなかったのでメモ
“`ruby.rb
s = gets.split(‘ ‘).map(&:to_i) #splitで半角空けて配列を作り、map(&:to_i)で数値に変更
result = s[0] + s[1] #配列内の数値を足す
puts result
“`
これまで改行で区切られた問題しか解いていなかったので、標準入力で半角空けて2つ入力する方法を分かってなかった。
基礎固め大事。
【Ruby】基本コマンド一覧
#【Ruby】基本コマンド一覧
Rubyの基本コマンドの一覧と実例。##目次
1. [puts, print, pの違い](#puts-print-pの違い)
2. [定数](#定数)
3. [オブジェクトのクラス一覧表示(.class)](#オブジェクトのクラス一覧表示class)
4. [オブジェクトのメソッド一覧表示(.methods)](#オブジェクトのメソッド一覧表示methods)
5. [小数点以下の計算](#小数点以下の計算)
6. [小数点の表示桁数指定](#小数点の表示桁数指定)
7. [format(または sprintf)](#formatまたは-sprintf)
8. [round, ceil, floorメソッド](#round-ceil-floorメソッド)
9. [文字列](#文字列)
10. [式展開](#式展開)
11. [連結](#連結)
12. [繰り返し](#文字列の繰り返し)
13. [文字数カウント(.length)](#文字数カウントlength)
14. [文字列から数値に