ムーのしょ〜もない様でしょ〜もなくもないブログ

プログラミング未経験だけど、エンジニアになりたい、IT関係の仕事がしたい方向けに情報を発信しています!あっ!けどプログラミング以外にも皆さんに有益になる様な情報も発信しますよー!

railsでローカルアクセスした時にエラーになる(node)

railsで0.0.0.0:3000/postsにアクセスした時にエラーになったので

その対処法をメモ!

こちらの記事を参照

qiita.com

$ rails s

でローカルに繋ぐとなにやらこんなエラーが出た

ActionView::Template::Error (dyld: Library not loaded: /usr/local/opt/icu
4c/lib/libicui18n.62.dylib
  Referenced from: /usr/local/bin/node
  Reason: image not found

調べて見るとmacOSでは、libicucore.dylib というライブラリが提供されていて、

icu4cをインストールする必要がなくなっている。

しかし、nodeをインストールする時に、icu4cを含めてインストールしたため、

libicucore.dylib と icu4c が相互干渉してしまい、エラーが出た模様。

いくつか対処法がなっていたが自分が解決した方法はこちら

$ node -v

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib
  Referenced from: /usr/local/bin/node
  Reason: image not found
Abort trap: 6
$ brew reinstall node

これでズラーッと出て最後に

==> Pouring node-11.3.0_1.high_sierra.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/node/11.3.0_1: 3,936 files, 47MB

こんな感じになってから再度

$ rails s

をしたらエラーが解消されていた(☝︎ ՞ਊ ՞)☝︎

LINE Message APIで10分間隔でメッセージが通知されるまでのメモ

おうむ返しが出来る様になり、次は自分が設定したメッセージが

10分間隔で送られて来る様に設定する!

おうむ返しで作成したのをそのまま使う

もしおうむ返しをしてみたい方はこちらの記事をどうぞ

LINE Message APIでRailsを使っておうむ返し - ムーのしょ〜もない様でしょ〜もなくもないブログ


まずはherokuの設定から

herokuのResourcesから、Add-onsでHeroku Schedulerを検索

そして10分間隔に設定

f:id:muuuuukun:20181213223206p:plain


次にrailsの設定

この時にrailsのrake taskを勉強

rake taskって何?って方は下の記事をお読みください 何回も何回も読みました

・rakeタスクについて

railsで定期的にバッチ回すwhenever

https://qiita.com/yumiyon/items388fbb84450f49a6ab0d

railsでrakeタスクの作成

https://qiita.com/suzuki_koya/items/787b5562d2ae1a215d94

railsのrakeについて

https://qiita.com/you8/items/ce893fa27b19fd6da031

rakeとは

http://opiyotan.hatenablog.com/entry/rails-rake-task

rake taskの作り方と、意外とハマりがちな引数の扱い

https://bottoms-programming.com/archives/rake-task-handling-of-arguments.html

rakeタスクの作り方

https://yatta47.hateblo.jp/entry/2016/02/19/232718


タスクを生成

$ rails g task reminder_task

次にコントローラーを生成

$ rails g controller webhook kokodayo

description(説明)とtask(タスク)を記述

lib/tasks/reminder_task.rake

namespace :reminder_task do
  desc "ここにタスクのお題"
  task :koko => :environment do
    webhook = WebhookController.new
    puts webhook.kokodayo
  end
end

見てきた記事でモデルにアクセスする時はenvironmentが

必要と書いてて、てっきりモデルはMVCのMの事だと思っていた

けどそうではないみたい


次にWebhookcontrollerのアクションを定義

app/controllers/webhook_controller.rb

def kokodayo
    puts "メッセージ"
end

ここでrakeタスクに追加されているか確認

$ rake -T
rake reminder_task:koko               # ここにタスクのお題

追加されているか確認が出来たら

$ rake reminder_task:koko

「メッセージ」が出力されたら成功!!

色々調べてエラーとの戦いやったから出力された時嬉しかった(☝︎ ՞ਊ ՞)☝︎


次に、今のままだとLINE Message API

コードを書き込んだ時にローカルで確認が出来ないから

環境変数を設定してローカルでも確認出来る様する。

環境変数に関する記事はこちらを参考にしました

【Ruby on Rails】GitHubに公開したくない変数や値を隠してpushする方法 - Qiita

Ruby | dotenv gem で 環境変数をスマートに管理 #ruby #dotenv - Qiita

環境変数の設定

rails環境変数を設定するには

gem 'dotenv-rails'

をインストールだけどもう既にインストールしてあるから

今回はしなくても大丈夫!

環境変数を定義

dotenvでは.envというファイルの中に書いてあるデータを参照

.envをアプリケーションディレクトリのルートディレクト

(appやdbやGemfileがあるディレクトリ)に作成し、

公開したくないデータを定義します。

LINE チャネルのTOKEN SECRET IDをセットする。

LINE_CHANNEL_SECRET='xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
LINE_CHANNEL_TOKEN='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
LINE_USER_ID='zzzzzzzzzzzzzzzzzzzzzz'

.gitignore

/.env

Webhookcontrollerのkokodayoアクションを書き換える

LINE Message APIドキュメントに記載されているコードを参照する

Messaging API

app/controller/webhook_controller.rb

class WebhookController < ApplicationController
  require 'line/bot'

def kokodayo
  message = {
            "type": "text",
            "text": "メッセージ"
           }
            client = Line::Bot::Client.new { |config|
              config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
              config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
           }
  response = client.push_message(ENV["LINE_USER_ID"], message)
  end
end

これでherokuにpushをしたら10分間隔で通知が来るはず!

こない!こない!こない!

herokuの環境変数を設定し直したり、チャネルの設定を見直したり、自分のコードを見直したり

それでも通知がこない!

そこでherokuスケジューラーの設定を変更

f:id:muuuuukun:20181224205717p:plain

rake reminder_task

rake reminder_task:koko

にしたらしっかりと10分間隔で通知が出来ました。

2020年プログラミング必修化に先手!家庭で学べるレゴ ロボット。

Ruby On Rails SQLite テーブルの作成

postsテーブルを作ったが、postsテーブルを削除して

もう一回作り直した時のメモです!

まずは

$ rails dbconsole

そして

sqlite> create table posts(id integer primary key, content text, image text);

作られたか確認

sqlite> select * from posts;
id            content         image
--------     --------------   -----------


sqlite>

テーブルの中身にもうデータを入れてしまったので

その時の状態をコピーできなかったから

確認した時は確かこんな感じだった気が(/ _ ; )


テーブルを作る時のINTEGER PRIMARY KEY

データを追加した時にカラムの値を指定しないと自動的に値が格納され

自動的に格納される値は、対象のカラムに格納されている

最大の値に1を加えた値となります。

この値は以前に割り当てられたことがあるかどうか関係がないため、

データの追加と削除を繰り返していると以前に格納されたことがある値

が再度カラムに格納される場合があります。


どーゆー事かとゆうと、INTEGER PRIMARY KEYを設定しなかったら

DBの中身を削除してから新しくデータを追加した時に

idが削除したはずの次のidから保存されてしまう。

???

よく分からん説明だ!

もうちょっと噛み砕いてゆうと

10個のデータを削除した

削除した10のデータはid1~10になっている

そして新しくデータを10個追加したら普通はidがまた1~10で登録されるはずが

id11~20で登録されてしまうとゆう事!

これを回避する為にINTEGER PRIMARY KEYを設定してあげると

新しくデータを追加した場合idが1~10に登録されるみたい!

それをしたくてINTEGER PRIMARY KEYで設定したらしっかりと、元から保存されました(☝︎ ՞ਊ ՞)☝︎

【heroku】のDBをリセットしたくて......できた!

herokuのpostgresのDBをリセットしたくて色々実行したら

案外簡単に出来たけど、また次したら忘れてしまいそう

だからメモ!


まずは失敗をメモ

$ heroku run rake db:reset

をしたら最初は出来てたけど途中からエラーになった

ActiveRecord::ProtectedEnvironmentError: You are attempting to run a dest
ructive action against your 'production' database.
If you are sure you want to continue, run the same command with the envir
onment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1

これはRails5からproductionモードではDBを破壊する系のコマンド実行

を防止する機能が追加されたみたい。


次に成功メモ

$ heroku pg:reset DATABASE_URL

 ▸    WARNING: Destructive action
 ▸    postgresql-colorful-91908 will lose all of its data
 ▸
 ▸    To proceed, type herokuのアプリ名 or
 ▸    re-run this command with --confirm
 ▸    herokuのアプリ名

> herokuのアプリ名

これで成功したと思われる!


ドキドキしながら実行してみる

$ heroku run rails db:migrate

ズラーッと出てきて成功!!

よしっと思い次はseedsファイルの初期データを追加する

$ heroku run rails db:seed

これもズラーッと出てきて成功!!


更に確認しておこう

$ heroku pg:psql-a herokuのアプリ名
.
.
.
.
DATABASE=>select * from posts;

そしたらpostsテーブルの内容がズラーッと出てきた! 良かった良かった(☝︎ ՞ਊ ՞)☝︎

Ruby On Rails テーブルに新しいカラムを追加

$ rails g migration Addカラム名To追加テーブル名 追加カラム名:型

Addから、追加テーブル名に空白はない。 カラム名と追加テーブル名は先頭を大文字にする。 例えば

$ rails g migration AddImageToPosts image:text

そしたら忘れる事なく

$ rake db:migrate

これでpostsデーブルにtext型のimageテーブルが出来上がり!

【キングダム】痺れる!!

こんばんは!みなさんキングダムは既にお読みですか?


はっきり言ってこんなに面白くてカッコよくて痺れる漫画はないですよ!!

女性にも結構人気のある漫画です!!

舞台は中国の春秋戦国時代のお話です

三国志も有名ですよね?その三国志の400年程前の物語です

この時代の中国は7つの国に分かれていて日々戦争をしていたんです!!

そして熾烈の戦いの末に中国を統一しました!!

それが始皇帝です!!

始皇帝暗殺って有名ですよね

暗殺されちゃうなんて悲しいです( )

なんかもーネタバレみたいになってますけど、これはネタバレではなく史実なんです

けどこの時代の史実の資料はほとんど存在していなくて、作者の原泰久先生が

アレンジして描かれています!

ただこのアレンジの描き方が尋常なく面白くて昔の戦争って本当にこんな感じなのかなって

細かな部分まで描かれていて、それがまた色々考えさせられるってゆうか、、、ってゆうか

本当に凄いんです!!(☝︎ ՞ਊ ՞)☝︎

https://haishin.ebookjapan.jp/contents/special/image/ranking/title/132898/busyou/busyou_3_2_2.png

僕もこのシーン震えました

おしっこちびりました( ´▽`)

おしっこちびるシーンが本当にいっぱいあります!!

自分も実際にこの現場にいたら本間にこんな風になるんだろうなって思いながら見れるんですよね!!

魅力的なキャラがたくさんいてどいつもこいつもマジでカッコイイんです!!

主人公の信が本当にマジでカッコいいんですよねー!!

味方の危機の時にうりゃー!!って感じで登場するんですけど

その登場のシーンがマジ痺れる!! f:id:muuuuukun:20181217213850j:plain

あっ因みにこのシーンはうりゃー!!

って感じではないですけど笑

主人公の信は後の始皇帝の右腕の存在なんです

後の始皇帝は、政って名前なんですけど政と信は固い絆で結ばれていて2人とも

信頼しあっていてこれがまたなんかめっちゃいい感じなんですよね〜

こちらが政です

f:id:muuuuukun:20181217214639j:plain

このシーンなんですけど、あまり言うとネタバレになっちゃうんで言えないんですけど

国民を奮い立たせる場面で少しずつ少しずつ国民に問いかけて

そしたら国民も少しずつ少しずつテンションが上がってきて

僕も少しずつテンションが上がってきて

最後には言葉では言い表せないぐらいみんなのテンションMAXになります!!

.........ホント文章考えるの下手だから全く伝わってない気がする( ・∇・)

もうとりあえず見て欲しいって感じなんですよ!!

ここに載せた痺れるシーンなんかはほんの一握りで

まっだまだ痺れるシーンがいっぱいあります!!

絵も最初の時と比べ段々と上手になってきて

それと同時に描き方も、上手になってきて

それと同時に面白さも、痺れる具合もドン!ドン!ドン!と押し寄せてきます!!

是非!!一度見て欲しいなって思います!!

一緒にキングダムを読みましょー!! f:id:muuuuukun:20181217220608j:plain


Rubyで便利だなって思うあれこれ

正規表現で文字列の中から数字だけを取り出す

a = gets.chomp
↓
AWBWCWDWEWFWGWH
puts a.gsub(/[AEGIOSZ]/,"A" => "a", "B" => "b",
                       "C" => "c", "D" => "d", "F" => "f",
                       "G" => "g", "H" => "h")
↓
aWBWCWDWWFWgWH

[AEGIOSZ]←はこの中で当てはまるものだけって事


・1部分の文字を正規表現で消す(破壊的)

a = "aaabbbcccddd"
puts a.gsub!(/ccc+/, '')
↓
aaabbbddd

正規表現で文字列の置き換え

a = gets.chomp
↓
kamukayakarakauy
puts a.gsub(/(ka)/, "///")
↓
///mu///ya///ra///uy

・文字列になっている数字を数値に変換する

a = ["9", "9", "8", "6", "1"]
a.map(&:to_i)
↓
[9, 9, 8, 6, 1]

・配列に入っている数値の合計を求める

a = [9, 9, 8, 6, 1]
a.inject(:+)
↓
33

・配列の要素を半角スペース区切りで出力する

・1次元配列の場合

array = ["aaa", "bbb", "ccc"]
puts array.join(' ')
↓
aaa bbb ccc

・多次元配列の場合も一緒

array = ["aa", ["bb", "cc", ["dd", "ee"]], ["ff", "gg"]]
puts array.join(' ')
↓
aa bb cc dd ee ff gg

・絶対値を求める

a = gets.chomp.to_i
↓
-1 -98 5
p a.abs
↓
1 98 5

・printで空白スペースで出力したい

print 'foo',
print 123,
print 'bar'
↓
foo 123 bar

・繰り返し処理で横に出力したい時はprintメソッドを使う。

そして空白を空けたい時は

(i,(' '))

な書き方にする。

1.upto 5 do |i|
  print(i,(' '))
end
↓
1 2 3 4 5空白

けどこの時,5の横に空白がある状態,空白がない様に出力したい時は

1.upto 4 do |i|
  print(i,(' '))
end
5.upto 5 do |i|
  print i
end
↓
1 2 3 4 5

・配列のインデックス番号を全部取得したい時

ary = [5, 4, 1, 7, 3, 8]

p ary.each_with_index.select{|e, i| e >= 5}.map{|e| e[1]}
↓
[0, 3, 5]

他にも色々あるみたい

ary.each_with_index.each_with_object([]){|(e, i), acc| acc << i if e >= 5}

ary.each_with_index.select{|e, i| e >= 5}.map{|e| e[1]}

ary.each_with_index.each_with_object([]){|(e, i), acc| acc << i if e >= 5}

ary.flat_map.with_index{|e,i|e>=5 ? i : []}