【Ruby】コピペしたtextの書式や改行などをviewで崩したくない【Rails】

monochrome photo of math formulas

今店舗内での通達などに使えるアプリを作ろうと思っております。

よく行うのが通達もとの会社のページをコピペをしてみんなに共有する事です、

なので例えばこんなページがあったとします(自分のブログ)

これを画像のようにコピペして

自分の作ったこんなページに投稿するとします

「内容」のカラムはtextタイプです。

viewの内容はこんな感じ

そうすると何がおきるか?

こんな感じになります・・・・最悪

ということでこちらのページを参考にさせていただきました。

結論

simple_formatを使う、です。

<%= simple_format(@todo.content) %>

とすると以下のようになりました。

これで通達するときにわかりやすくコピペができます!

【Ruby on Rails】viewにてテーブルデータの有無で表示を変えたい

wood camera writing typography

なんか検索してもそれっぽいものが出てこなかったので投稿

やりたい事は単純

「特定のテーブルの表示のありなしでview表示を変えたい」

コントローラーが以下の状態

  def index
    @items = Item.all
  end

viewはこうすればデータのある無しによって表示を変えられます。

<% if @items.empty? %>
   <div>あああああ</div> 
<% end %>

上の場合、Itemsにデータがある場合は表示させず、データが無ければ表示させます。

以上

【Ruby on Rails】to be valid, but got errors: User can’t be blank 【RSpec】が解決できなかった件

wood camera writing typography

今回私、こちらのエラーで死ぬほどひっかかりました。

※途中長々と書いてますが見当違いな事もあったので最後らへんまで飛ばす事をオススメします…

というのも、テックキャンプでの最終課題「商品出品機能」にて、

単体テストコードを実装するという事で、今までそんな詰まったことがなかったので

鼻をほじりながら作業をしていたのですが、めちゃくちゃにやられました。

得意の検索をしまくっても全くこれについての有力な情報がなかったので

今後困るであろう方たちの為に、自分が検索しまくったワードを下記に並べておきますね

(あとはここでハマったエラー群をもうがっつり貼っときます)

ーーー

Item

  商品出品機能

    できる時

      全て問題の無い状態であれば登録に成功する (FAILED – 1)

    できない時

      ○○だと出来ない

Failures:

  1) Item 商品出品機能 できる時 全て問題の無い状態であれば登録に成功する

     Failure/Error: expect(@item).to be_valid

       expected #<Item id: nil, item_name: “あああ”, description: “test”, category_id: 2, condition_id: 2, shipping_charge_id: 2, prefecture_id: 2, shipping_time_id: 2, price: 5000, user_id: nil, created_at: nil, updated_at: nil> to be valid, but got errors: User can’t be blank

     # ./spec/models/item_spec.rb:13:in `block (4 levels) in <top (required)>’

Finished in 0.16702 seconds (files took 0.89731 seconds to load)

2 examples, 1 failure

Failed examples:

rspec ./spec/models/item_spec.rb:12 # Item 商品出品機能 できる時 全て問題の無い状態であれば登録に成功する

ーーー

テストコード 単体 Rails できない

ActiveHash FactoryBot 連携方法

ActiveHash ファクトリーBOT エラー 解決できない

  factory :item do
    item_name { "あああ" }
    description {'test'}
    price {5000}
    category_id {2}
    condition_id {2}
    shipping_charge_id {2}
    prefecture_id {2}
    shipping_time_id {2}

ーーー

association :user テストコード 単体 エラー できない

Active Storage FactoryBot 成功しない 連携方法

ーーーーーーーーーー

さてさて、長くなりましたが、要は上での検索単語、自分が何をしたかったのか?どこにあたりをつけていたのか?です。

最終課題での商品出品機能には今までのテスト(ユーザー等)では違う要素がいくつかあります。

1、ActiveHashを使用している

2、Active Storageを使用している

3、ユーザー情報と連携している(user_id)

テストコードを実装する際、とりあえず「全て成功している状態」を作るのが第一です。

でなければその後に行う「全て成功したものから削ぎ落として失敗を作る」事ができないからです。

自分は今回、その部分でひっかかりました。

もちろん、手動でのDB登録はこの時点では成功しています。

でもテストコードで成功しない・・・上の3つを切り分けたいがどれがどれでどこから手をつけて良いのかわかりません・・・・

という事で、ここからはうだうだ書きません、上記の問題だと思っていた成功例を書きます。

1、ActiveHashについて

    category_id {2}
    condition_id {2}
    shipping_charge_id {2}
    prefecture_id {2}
    shipping_time_id {2}

みたいなのでOKです(カラム名は恐らく似通ってますが個々人で違うはずなので)

少し解説すれば、単純にActiveHashはIDでカテゴリ選択を行って判別してますので、それを入れてあげれば良いだけです。

2、Active Storageについて 

以下を記述

    after(:build) do |item|
      item.image.attach(io: File.open('public/images/timage.png'), filename: 'timage.png')
    end

3、ユーザー連携について
association :user と書いて @item = FactoryBot.build(:item)

ではなく

@item = FactoryBot.create(:item) と記述するで解決しました。

ーーー以下はそれでもわからない方向けの補足となります。

まずはコード構成ですが

/spec/models/item_spec.rb

require 'rails_helper'
RSpec.describe Item, type: :model do
  before do
    @item = FactoryBot.create(:item)
  end
  describe '商品出品機能' do
    context 'できる時' do
      it '全て問題の無い状態であれば登録に成功する' do
        expect(@item).to be_valid
      end
    end
    context 'できない時' do
      it '○○だと出来ない' do
      end
    end
  end
end

/spec/factories/items.rb

FactoryBot.define do
  factory :item do
    item_name { "あああ" }
    description {'test'}
    price {5000}
    category_id {2}
    condition_id {2}
    shipping_charge_id {2}
    prefecture_id {2}
    shipping_time_id {2}
    association :user 
    after(:build) do |item|
      item.image.attach(io: File.open('public/images/timage.png'), filename: 'timage.png')
    end
  end
end

これで一旦は通ります。

もっと補足というかアウトプット

今回の問題はbuildか?createか?というところが問題だったようです。

そもそも最初に検索ワードを羅列しましたが、実はすぐに

「user_idってどうすんねん、user_id{1}とかでもブランクになるしわからん・・」

となりましたが、教材にその部分の答えはあるのです。

/spec/factories/items.rb に association :user を入れろ、というものです。

ここまでは恐らく誰でもたどり着くのですが

この後が問題で、教材にはずーーとbuildと使われているのです。

だから問題だとすら思いませんでした。

エラーに直面したその日は顔真っ赤でActiveHashか???これのせいか?なんでだ?画像か?ユーザー連携か????

となってましたが次の日冷静にエラーを見れば

expected #<Item id: nil, item_name: “あああ”, description: “test”, category_id: 2, condition_id: 2, shipping_charge_id: 2, prefecture_id: 2, shipping_time_id: 2, price: 5000, user_id: nil, created_at: nil, updated_at: nil> to be valid, but got errors: User must exist, User can’t be blank

expected #<Item id: nil, item_name: “あああ”, description: “test”, category_id: 2, condition_id: 2, shipping_charge_id: 2, prefecture_id: 2, shipping_time_id: 2, price: 5000, user_id: nil, created_at: nil, updated_at: nil>

「ここまではデータとしてそれぞれ把握しましたよ」

to be valid, but got errors: User must exist, User can’t be blank

「全てマッチしませんね、なぜならuser_idが空だからです。と言われてます。」

その後、ふと目に止まったどっかの記事で

「必ずbuildではなくcreateにして下さい」という文面

その記事は全くの別問題の解決方法が書いてあったのでスルーしてましたが

まさかと思い自分のところを変えたらそのまま通りました・・・・長かった・・・

一応ですが、テストコードに於けるbuildとcreateの違いは

「DBにアクセスするかしないか?」だそうです、buildはアクセスしない為、速度が早いんだとか

今回、DBにアクセスする必要がある理由は、一度DBへ「user_idってそもそもどんな情報もってんの?」とカラムの確認をしにいっているようです。

その後、多分ですがこの前に行ったuserのテストコードへアクセスしています。

そのテストコードでは更にuserテストが実行され、全ての情報が問題ないと確認された後Itemに戻ってきます。

ここまでの情報が無いとuser_idはクリアできないんですねー

「ItemDBのuser_idカラムが数値で埋まってりゃいいんだろ!」とはいかないわけです。

ということで、長々となりましたが、誰かの役に立てば幸いです。


2021/08/10 追記 超恥ずかしい

上で色々言ってましたが、buildでもテストコードが通りました・・・

メンターさんから指摘がありましたが

バリデーションの段階でuesr_idを入れていた為、失敗していたようです。

それを消したあとに、buildに変更したところ成功しましたので、これも追記しておきます。

createじゃなくてbuildにした理由ですが

createだとテストする度にテストした結果がDBに書き込まれます。

どんどん無駄データが増えてしまうわけですね

今回バリデーションをuse_idにかけていたので、ユーザーデータまでテストする必要がありましたが

そこにバリデーションをかけていなければ、ユーザーデータまでテスト参照しなくて良いわけですね

あと、地味にコントローラーのnewの部分を

:newに変更したことも大きいですね

まだまだ、学ばなければいけないことが多そうです。

パソコンが数秒で再起動を繰り返す件について

ーー昨日

朝一でドスパラへ、そしてワンコイン修理とかいうので即治りました…さすがプロ

原因はマザボのボタン電池だったみたいでその場で起動確認がとれる

尚且つ前のSSDが逝ったと思ってたことも、完全放電による時刻合わせをしていなかったからSSDを読み込まなかっただけの模様

なんとも知識不足というのは困ったものです。

とりあえず、昨日はそのまま仕事だったので何もできませんでしたが

本日今から自宅にてパソコン復旧作業へ

はぁ、なんか余裕ない日が続きます。

サイバーパンク2077 nvidia geforce rtx 2070 レビュー

ということでサイトの意図とは全く別の記事ですが買ってしまいましたサイバーパンク2077

PS4と非常に迷ったのですが、自分のパソコンスペックでいけるんじゃないか…?

詳しい数値など無しでのレビューですが一旦ご了承下さい。

とりあえず、検索すると「RTX2070 SUPER 」の記事ばかり…俺の2070ノーマルはどうすれば?しかもベンチマークも無いし確かめすらできん!

となっていたのですが我慢出来ずに購入

まずはnvidia様のホームページでドライバを最新にして下さい

私はアップデートせずにプレイして即ゲーム終了しました。(一敗)

最新にするとnvidiaのソフトでサイバーパンクが出てくるので最適化

なんと、全て設定「高」「ウルトラ」「レイトレーシングオン」という強気設定に…

いざプレイしてみると若干遅延が気になる感じ…微妙

レイトレオンオフとか試したんですがなんかあまり動作は変わらず…このまま満足にプレイできないのか?

と思っていたところ

一番下にある「DLSS」の設定をオンにしたら(デフォはオフ)大して見た目のクオリティも下がらず

物凄いヌルヌルになりました。

これでかなり満足にプレイできます!!

但し、何分か置きにCPU使用率が100%越えてガクガクになる現象は我慢して下さい!

シーンは全く関係ない模様、群衆が沢山いようがドンパチしてようが通常はヌルヌルなんですが

ただの会話パートでも定期的に急にガクガクになります。

グラフィック落とせば大丈夫そうですがなんかそれは悔しいのでそのままプレイしますが…

ーーー結論ーーー

「nvidia geforce rtx 2070 でも感動できる程の画質とプレイは可能(DLSSオン時)だが、時たまガクガクするのを我慢できれば買い」

です!ひとまずは以上!

(FPSとかの計測や自分のパソコンスペックは余裕あったら追記していきます。)

[Python]csvの年月日を別の列にしたい

今回はこうです。これを、

こうしたい!!↓

ということでまとめていきます。

ついでに、エラー

AttributeError: Can only use .dt accessor with datetimelike values

という方も解決できると思いますので宜しくお願い致します。

一応、元のCSVサンプルです。

さて多くは語らず「とりあえず動かしたい!」という方向けに結論から書きます。こうです!!

import pandas as pd

df = pd.read_csv("jikan.csv",encoding="cp932") 
df["営業日変換"]=pd.to_datetime(df["営業日"])#営業日の日付けstr型をtimestamp型に変換、同時に「営業日変換」列を作る
df["営業日年"]=df["営業日変換"].dt.year #営業日変換から年を取り出して尚且つdfに「営業日年」という列を作る
df["営業日月"]=df["営業日変換"].dt.month #営業日月を作る
df["営業日日"]=df["営業日変換"].dt.day #営業日日 を作る

df = df[["営業日年","営業日月","営業日日"]]#都合が良いように列を抽出する

df

#---ここから↓は特に必要なし
df.to_csv("tekitou.csv",index=False,encoding="cp932") #自由な名前でcsvに出力

以上

サンプルのcsvと同じ階層で上のコードを実行するだけでできます!簡単ですね!

一応、解説的なもの

まず、最初の方に挙げたエラー[AttributeError: Can only use .dt accessor with datetimelike values]ですが、一番最初のデータファイルの年月日の型がstr型だったんですね

なので、途中str型からdatetime64[ns]型に変換しております。

動作のイメージはこうです。

  1. csvを読み込んで「df」(任意)という関数を作ります。
  2. dfの中にある「営業日」列を検索
  3. 「営業日」列をdatetime64[ns]型に変換してdfに新しい列「営業日変換」列を作ります。
  4. 「営業日変換」列から年の部分を取り出し「営業日年」列を作る
  5. 月 作る
  6. 日 作る
  7. 「df」関数に表示させたい列を順番に抽出する
  8. csv出力

といった感じです、動作的に「営業日」列を入れ替えることは出来ず

新しく色々作ってそれだけを取り出しあたかも入れ替えたように見せているだけ

といった具合です。

【Python】大量のCSVファイルを縦に逆順に結合する

関連記事 Python 大量のcsvファイルを縦に結合したい場合

上記記事までは良いんですが、今回自分はそれを逆順に繋げたいと思い検索

とりあえずうまくいったものがコレ

import pandas as pd
import glob
csv_files = glob.glob('*.csv')
list = []#リストの初期化
for file in csv_files: #←ここに代入 →この数分繰り返す
    list.append(pd.read_csv(file,encoding="cp932"))#リストにcsvファイルを追加していく

list.reverse() #ここを追加

df = pd.concat(list)
df.to_csv("total.csv",index=False,encoding="cp932")

とりあえず、これだけで縦にCSVファイルを結合したい場合は解決!終わり!

関連記事 【エラー】UnicodeDecodeError: ‘shift_jis’ codec can’t decode byte 0x87 in position 3340: illegal multibyte sequence が出た場合

参考記事 https://note.nkmk.me/python-reverse-reversed/

【エラー】UnicodeDecodeError: ‘shift_jis’ codec can’t decode byte 0x87 in position 3340: illegal multibyte sequence が出た場合

UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x87 in position 3340: illegal multibyte sequence

自分の場合はread_csv(file,encoding=”SHIFT-JIS”)で読み込もうとしたところ発生

その時の対処法はread_csv(file,encoding=”cp932″)にしたところ解決

これについては検索すると多岐に渡る環境や元ファイルの要因がある為、解説などはしませんが

utf_8等に変更する事でも解決する可能性あり

Python 大量のcsvファイルを縦に結合したい場合

詳しい説明や動作は別のサイト様に任せて「とりあえず動かしてぇ!」という方向けです。

※pyファイルとcsvファイルが同フォルダにある事が前提

※データ整形などしていないので、綺麗なデータをとりあえずくっつけたい方向け

これが一番うまくいったもの、とりあえず動く

import pandas as pd
import glob
csv_files = glob.glob('*.csv')
list = []#リストの初期化
for file in csv_files: #←ここに代入 →この数分繰り返す
    list.append(pd.read_csv(file,encoding="cp932"))#リストにcsvファイルを追加していく

df = pd.concat(list)
df.to_csv("total.csv",index=False,encoding="cp932")

一応、動作説明

1、globでフォルダ内の.csvファイルの情報を取得

2、リストの宣言(入れモノを用意しないとね)

3、globで取得したファイル数分の操作のくりかえし+リストにファイルを追加していく

4、結合、今回はtotalって名前にして同フォルダに出力

関連リンク 【エラー】UnicodeDecodeError: ‘shift_jis’ codec can’t decode byte 0x87 in position 3340: illegal multibyte sequence が出た場合

超初心者向け Pythonを5分で始められる方法

analysis blackboard board bubble

こちらはGoogle Colaboratorの使い方を紹介するページとなります。

さて、本日はやっとプログラミングらしい話をしますが、

Pythonを始めるにあたって、全く何もわからない人はこう思うと思います。

「色々なコードやら出来る事が書いてあるけども、どこで実行して良いかわからない」

「Pythonで検索すると既に常識を知っている前提で話が始まっている」

「環境構築ってどうやるんだ・・・」等々

上記はまぁ、自分がまず思いました。

そして、どのページも詳しく説明してくれてはいるのですが

横文字や用語ばかりでぶっちゃけよくわからん、というのが正直なところでした。

なので、このページでは絵や図を使ってゆるくやり方を紹介していこうと思っております。

そもそもGoogle Colaboratoryとは?

Googleが提供している無料で使えるサービスとなります。超簡潔に表現するとこんな感じです。(もっと詳しく知りたい方は他のサイトを参考にして下さい)

因みに通常はこんな感じです↓

ということで、Colaboratoryを使う要件としては「インターネットにつながっている事」です。

実際に使ってみる      

では早速使ってみましょう、以下にアクセスして下さい。

https://colab.research.google.com/

もしGoogleのアカウントでログインしていた場合、自動でログインとなりますが

ログインしていない場合は右上のログインボタンからGoogleアカウントにログインしましょう。(自分はダークテーマを使っているので黒いですが、恐らく通常は白で表示されています。)

ログインした状態

これでもう色々と使える状態になっていますが、

わかりやすく使う為、左上のファイルを選択し、一番上の「ノートブックを新規作成」を選択しましょう

もうこの状態になれば、巷にあふれている「Pythonのコード」を入力して実行すれば

教科書通りの結果が得られるはずです。※但し、多少環境やバージョンに左右されることはご了承下さい。

マシンスペックに左右されず、しかも無料で使える為、ノートパソコンとネット環境があればどこでもコードが書けますので、ぜひ使ってみましょう!