ゆふいん源流太鼓を勝手に応援
太鼓って、なんか好きです
今年大分県である国民文化祭のプレイベントというのが、昨年末に大分駅前でやってまして。
第33回国民文化祭・おおいた2018 第18回全国障害者芸術・文化祭おおいた大会
お神楽とか太鼓とか来ると聞いていたので、ちょっと見てみようかと思って大分駅に寄りました。
最初は DRUM TAO て見たことないし、見よっかな、くらいだったのです。風もあって結構寒かったのですけど、ガスヒーターの横に陣取ってのんびり舞台を見ていました。
DRUM TAO は、世界で活躍しているというし、ネームバリューもあってやっぱり凄かったですね。迫力もあったし、ファンも来てたのか黄色い声援も上がってて「おお……(゚∀゚)」って感じでした。
TAOは文化芸能というより、エンターテイメントという感じでしたね。こういう魅せ方もあるんだなぁ、と。
けど、何ていうんですかね、ああいう……ビジュアル系……?になるんですかね。きらきらしい感じの……。
私はむしろプログラム中盤あたりでやっていた「ゆふいん源流太鼓」の方に心惹かれました(とか言ったらTAOのファンのお姉さま方にボコられそう……)。いえ、DRUM TAO も凄かったですよ。ホントに!でも、単に好みの問題ですかね。
ゆふいん源流太鼓は、はっぴにハチマキの、大立ち回りがあるわけでもない典型的といえる太鼓グループ(と言っても、専門家でもなんでもないので典型的が何たるやを知っているわけではありませんが)で、華やかさこそないかもしれませんが、しかしむしろその朴訥な感じがなんとも言えず、良い……!
↑イベントで演奏されるゆふいん源流太鼓の皆様
大太鼓?を叩いてるおじさまが「よっ!」とか掛け声かけたりするのがね、またたまらなく渋くて「かっこえええぇぇぇ………(*´ω`*)」ってなるわけなんです……!!
太鼓の種類とか笛の種類とか曲目とか、全然知らない素人なんですけども、なぜか「また観たいなぁ」と公演を観ながら胸がじわじわ熱くなりました。
それで、ゆふいん源流太鼓さんの次の公演とか近くであったら観に行きたい……とネットで探してみても、まあこれが情報が全然出てこなくて(泣)
検索してる漢字が間違ってる?とか思って色々試してみても、なかなか公演の情報に行き着かない。何でですかね?探し方が悪いんですかね?とTwitterで嘆いていたら、親切な方が情報を教えてくれました。
第25回大野町どんど焼き
今週の土曜日2月10日です!(近い…
大野町の冬の風物詩。3,000本の竹を組み上げた17mを超える「どんど」と一緒に、願い札や古い御札が焚き上げられ、一年間の無病息災、商売繁盛、家内安全、学業成就を祈願します。竹のはじける音と、白煙を上げながら一気に燃え上がる、炎の迫力は圧巻です。「どんど」の前には、庄内子供神楽やゆふいん源流太鼓、打上花火などのイベントも行われます。
とのこと!
私は生まれも育ちも大分ですが、両親が大分の人間ではないし、地元の行事とか本当に疎いんですよね……きっと色んな行事があるんだろうなぁ。色々行ってみたい。
今週10日は予報では大寒波は和らいだ後くらいですが、雨の予報になってます……。小雨決行となってますが、流石に土砂降りじゃやらないのかな。一度も行ったことが無いどころか行事の名前すら聞いたことがなかったお祭り?行事?なので全然詳しくありませんが。
とにかく、豊後大野は結構近いし行ってみたいと思います。
そして勝手に応援します。
ゆふいん源流太鼓の皆様、がんばってください!公演日も寒そうですが、どうぞ体調など崩されませんように……!
Python を勉強してみる(導入だけ)
そう言えば
明日にはまた Progate で課金が発生するので、一旦退会したいんですけど、その前にPython の勉強をしとこう、ということで。
Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
今回もこちらでお勉強。
行ける所まで行こうかなーということで。
Python のレッスン1
▼Python について
▼文字出力
# コメントはシャープ記号 print('Hello World')
▼変数
- 変数名はスネークケースで書く
user_name = 'にんじゃわんこ' print(user_name)
▼文字連結
my_name = 'にんじゃわんこ' print('私は' + my_name + 'です')
▼型変換
- str():文字列へ変換
- int():数値へ変換
age = 24 print('私は' + str(age) + '歳です') count = '5' print(int(count) + 1)
▼if文
- 処理がif文の中にあるかどうかはインデントによって判別される
if x == 70: print('xは70です') if y != 40: print('yは40ではありません') if money >= apple_price: print('りんごを買うことができます') elif money == apple_price: print('りんごを買うことができますが所持金が0になります') else: print('お金が足りません') if x >= 10 and x <= 30: print('xは10以上30以下です') if y < 10 or y > 30: print('yは10未満または30より大きいです') if not z == 77: print('zは77ではありません')
▼標準入力を受け取る
- input():標準入力した値が返る
input_count = input('購入するりんごの個数を入力してください:')
やっぱり
行ける所まで行こうかな、と思いましたけれども。
うーん、Pythonを使ってすぐに何かを作るというわけではないので、結局身につかないよな……という気もして来ました。今は rails やってるので Python も一緒にやれるほど器用な脳ミソじゃないし……。
ということで、とりあえず今日は導入のみにしました。ここまで1時間弱。
言語が違うというのは結局の所、書き方(=手段)が違うだけで、目的は一緒なんだよなぁ、と。
手段を多く持つのはそれだけ利用出来るシーンが増えて、良いことだとは思いますが。その言語によって得意不得意があるので、使い分けが出来るようにもなるし。
だけど、考えてみればそんなに一度に色々やったって、脳ミソが付いていかない&身につかないんじゃ意味ないな、とやりながら考え出してしまい……。焦らない、焦らない。
ログインは自作しない
gem の devise を使ってみる
rails 触るのまだおっかなびっくりですが、フロントのレイアウトが出来たので、とりあえず管理画面側のログインを作っていきます。
Progate ではログイン機構を手作りしましたが、今回はログイン回りで検索してよく見かける gem の devise というのを使ってみます。
いえ、もちろん自作してもいいんです。いいんですけど、それ全部自作してたらそもそも何でフレームワーク使ってる?ってなりません?(言い訳
どなたかが作ったパッケージを使う方が安心出来るぽんこつですみません。
そういえば devise って普通最後 c だと思うんですけど、なんで devise って s なんですかね?誰か教えて。
人様にお教え出来る内容でもないので、私はこんな手順でやりました、こんなエラーでこんな対処しました、という履歴のようなメモです。
手順
1.devise をインストール
Gemfileに追記
gem 'devise'
インストール
$ bundle install
出来た。
$ bundle info devise
* devise (4.4.0) Summary: Flexible authentication solution for Rails with Warden Homepage: https://github.com/plataformatec/devise Path: /usr/local/rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/devise-4.4.0
2.rails へインストールするコマンドだろうか?を叩くと、
$ rails g devise:install
べろっと何か出て来るので、言われてる通りに設定していく。
2.1 メーラーのルートの設定?
Some setup you must do manually if you haven't yet:
1. Ensure you have defined default url options in your environments files. Here
is an example of default_url_options appropriate for a development environment
in config/environments/development.rb:config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
In production, :host should be set to the actual host of your application.
ふむふむ。
in config/environments/development.rb:
ファイルに以下を追加しろと書いてある。vagrantだとどうするんだろうな…?
とりあえず何も追記しないでおいた。
2.2 次はルートを設定。
2. Ensure you have defined root_url to *something* in your config/routes.rb.
For example:
root to: "home#index"
ルートははもう設定してるので飛ばす。
2.3 フラッシュメッセージの設定
3. Ensure you have flash messages in app/views/layouts/application.html.erb.
For example:
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
これも後でいいや。
2.4 次はコマンド叩いてビューを作る(作ってもらう)
4. You can copy Devise views (for customization) to your app by running:
rails g devise:views
とあるので、これを叩く。
$ rails g devise:views
なんか超いっぱい出来た。
$ rails g devise:views
/usr/local/rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/app_loader.rb:40: warning: Insecure world writable dir /usr/local/rbenv/versions/2.4.3/bin in PATH, mode 040777
Running via Spring preloader in process 14703
invoke Devise::Generators::SharedViewsGenerator
create app/views/devise/shared
create app/views/devise/shared/_links.html.erb
invoke form_for
create app/views/devise/confirmations
create app/views/devise/confirmations/new.html.erb
create app/views/devise/passwords
create app/views/devise/passwords/edit.html.erb
create app/views/devise/passwords/new.html.erb
create app/views/devise/registrations
create app/views/devise/registrations/edit.html.erb
create app/views/devise/registrations/new.html.erb
create app/views/devise/sessions
create app/views/devise/sessions/new.html.erb
create app/views/devise/unlocks
create app/views/devise/unlocks/new.html.erb
invoke erb
create app/views/devise/mailer
create app/views/devise/mailer/confirmation_instructions.html.erb
create app/views/devise/mailer/email_changed.html.erb
create app/views/devise/mailer/password_change.html.erb
create app/views/devise/mailer/reset_password_instructions.html.erb
create app/views/devise/mailer/unlock_instructions.html.erb
あれ、4つある内の結局1つしか実行してないな?
3.ログイン用ユーザのモデルやらマイグレーションやら作成(してもらう)
$ rails g devise User
/usr/local/rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/railties-5.1.4/lib/rails/app_loader.rb:40: warning: Insecure world writable dir /usr/local/rbenv/versions/2.4.3/bin in PATH, mode 040777
Running via Spring preloader in process 15128
invoke active_record
create db/migrate/20180113152748_devise_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
insert app/models/user.rb
route devise_for :users
おー。勝手にusersテーブル用のmigrationファイルを作ってくれた。
とりあえずデフォルトのまま migration ファイルを走らせてみる。
$ rails db:migrate
usersテーブルが出来ました。
Viewも作ってくれたっぽい。CSSも何もないから超左に寄ってる。あとはこれを適当に編集していく感じかな。
ためしに Sign up からユーザ登録したら、簡単にユーザ登録出来て、ログイン処理までしてくれてたようだ。
なんだー rails にもコマンド一つで色々やってくれる親切なのあるじゃないですかー。
途中でちょっと怒られたよー
いざログイン画面表示させようとした際に怒られたのが、これ。
undefined method `devise_for' for #<ActionDispatch::Routing::Mapper:0x00007f93d1ad79d0>
んんん…?勝手に route.erb に追加されてたルーティングのメソッドが怒られてる。
これはそもそもインストールした devise が認識されてない?
と思ったら案の定そうだったっぽい。
routing - undefined method `devise_for' in rails action controller - Stack Overflow
apache 再起動で治った。えええーー……そんなに頻繁にwebサーバの再起動が必要なの……dumpautoload 的なものはないの……。
参考URL
GitHub落ちてた
GitHubが落ちてました
いえ、ホントそれだけなんですけど。初めて見たので、なんとなく。
以前、GitLabが落ちた時に障害復旧の様子をライブストリーミングしてて「面白れー」と思って見てたことがありましたけど、GitHubもそういうのしないかな。
macOS High Sierra で 外付けハードディスクをフォーマットする
デフォルトだとちょっと躓くHDDフォーマットの仕方
年内にしようと思っていて結局今頃になって外付けHDDをフォーマットしていたら、なんかよく分からない所で躓いたので、外付けHDDのフォーマットの手順をメモメモ。
そんな大した設定がいるわけではありませんが、知らないとコケるなんとも物悲しいやつです。
ディスクユーティリティを使った「消去」
macOS High Sierra (10.13.2) で外部HDDを初期化するのに、以下の手順で行いました。
- Launchpad から「その他」→「ディスクユーティリティ」
別にディスクユーティリティを選択出来ればどこから行ってもいんですが、私の場合はこれが一番早かったので…。
-
左上の「表示」メニューから「全てのデバイスを表示」を選択。これ大事!
これを選択することで、サイドバーのディスクの表示が変わります。この表示でないと、なぜか正常にフォーマット出来ないという落とし穴が…。 - ディスクを選択
ディスクは、HDD名でなくて、その一つ上のおおもとを選択してください。
- 「消去」
- 名前や設定を選択→「消去」
名前やフォーマットは自分の環境に合わせてください。
フォーマットも色々ありますので、用途に合わせて選択してください。私は Windows と Mac 両方で HDD を使える必要がありましたので、exFat にしました。
セキュリティオプションはお好みでいいと思います。
私は別に復元出来てもいい(フォーマットした後も自分で使いますし、HDD 廃棄するときは物理破壊する)ので、「最も速い」を選択しました。
この設定だと一瞬でフォーマットが終わります。 -
完了
この画面まで行けば完了です。
フォーマットしてる間に風呂でも入ってこようかなとか思ってたら一瞬で終わったのでΣ(゚Д゚)ってなりました。フォーマットってそんなに速く出来るんだ……。
注意点
手順の 2.で、「全てのデバイスを表示」を選択せずに、表示されたデバイスを選択しただけで「消去」を行うと、以下のエラーが出てフォーマットにコケます。
消去プロセスを完了できませんでした。
Unmounting diskMediaKit reports not enough space on device for requested operation.
操作が失敗しました...
なんとも理不尽な。
初期状態のデバイスを選択しただけだと、消去中にディスクがアンマウントされるっぽくて、それでエラーになってるのか…?
それなら最初っから全てのデバイス表示してくれていればいいものを……と文句を行った所で始まらないので、粛々と表示を確かめましょう。
これでHDDのフォーマットは終わりです!
あとはバックアップの設定だなぁ。
なんか Time Machine がめちゃ重たいという記事も見かけたので、もうフリーのシンプルなバックアップソフトにでもしようかな…。
Ruby on Rails5 のローカル環境出来た!
ローカル環境
Progate で Ruby on Rails5 のレッスンを終えたので、今度はローカルで環境作りました。
最終的に出来た環境はこんな感じ。
環境
- Vagrant
- CentOS6.9
- MySQL5.5
- Apache2.2
- Ruby2.4.3
- Ruby on Rails 5.1.4
Apacheのモジュールは passenger なるツールを使って準備しました。いまいち passenger が何者か分かってませんが、コマンド叩いてあとは指示通りにすれば Apache で ruby 使うためのモジュールが使えるようになっているという優れもの。
いいツールが揃ってますねー。
余談ですけど、CentOS7 は主要なコマンドすら変わってたりして色々と地味に時間を取られるので、もうローカルの標準は CentOS6.9 でいいんじゃないかなーと思ったりして。。。
Ruby on Rails5 のプロジェクト作るまでの手順
叩いたコマンド全て載せようかと思いましたが、色々足りないものがあったりディレクトリの権限が足りなくて寄り道したりして、あんまりスマートでない感じだったので、大雑把な手順だけメモ代わりに載せることにします。
今回は、Apache2.2 で ruby2.4.3 を使う方法です。あと、gem 使って rails 入れて、プロジェクトの新規作成する所まで行きました。
- rbenv を clone してくる
- rbenv コマンドが使えるように、パスを通す
- rbenv のプラグイン rbenv-build を clone してくる
- インストール出来る ruby のバージョン確認したら、ruby をインストールして、使うバージョンを指定
- 最新の 2.5.0 入れようとしたらエラー。どうやら ruby のバグっぽい? - 必要なパッケージ(bundlerとか)を入れる
- passenger を入れる
- passenger を使って Apache のモジュールを準備
- ここで足りないパッケージがあるよーってインストールのコマンド付きで警告が出たので、一旦コンソールに戻って寄り道 - Apache の設定ファイルに準備したモジュールを使うように設定追加して、バーチャルホストを追加して、Apache再起動
- gem 使って rails を入れる
- mysql の関連パッケージ?も gem で入れようと思ったら mysql-devel が足りなくてまた寄り道 - nodejs が無いと ruby は動かないらしいので、これも入れる
- rails プロジェクト新規作成
あとは hosts に書いて、アクセス。
出来たーーー!!
紆余曲折しなくても環境作れるようになったら、その内コマンドとか詳しい解説とか入れながらまた記事書きたいです。
気になった所
- rbenv を入れるのに、今回は /user/local の下に入れたんですけど、なんかディレクトリの権限が足りなくてコケる事があったんですよね。~/.rbenv に入れるとするサイトがあったりして、そっちでも良かったのかな?と思ったり。Apache はどっちにしても vagrant ユーザで起動してるから、~/.rbenv の方が権限の問題がなくてよかったんじゃないかなーと思ったり。次はそれで試してみよう。
- CentOS6.9 で rbenv-build を使って ruby2.5.0 をビルドしようとしたら、変なエラーが出てちょっと詰まった。調べて見たら、Ruby のサイトにチケット立ってた。
Bug #14234: Failed to build on CentOS 6.9 - Ruby trunk - Ruby Issue Tracking System
もしかして ruby のバグとかそういうやつだったのかな……。結局バージョンを ruby 2.4.3 に落としたらうまくいきました。
参考にしたサイト
http://kimagureneet.hatenablog.com/entry/2016/08/31/180636
さーてもりもり
アプリ作るぞー。今回はイベントとかの告知サイト?のCMSっぽいものを作ってみようかと。
しかし、.ignore に入れるべきものを最初から入れといて欲しいもんだ。。。そのためのGit 管理するべき .sample ファイルとか最初から作っておいてほしいもんだ。。。とか言ったらいけないんですよね、すみません。
アプリは GitHub にリポジトリ作ってバージョン管理する予定。
うちの会社では書かないテストを、今回は勉強しながら書くのだ……自動テストとか出来るようにするのだ……!
Ruby on Rails5 のレッスンに突入 その3(完)
Ruby on Rails5
さて、昨日はRuby on Rails5 レッスンでのログイン回りや認可を実装しました。
使う学習サイトは同じく Progate です。今日で Ruby on Rails5 のレッスンを終わらせる予定です。
- Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
- 途中から有料です。月額980円(税込)
履修してるレッスン
- Ruby on Rails5
- 目標:TweetApp(TwiiterみたいなSNS)を作ること
昨日は「Ruby on Rails5」のレッスン8と道場3まで進みました。
今日はレッスン9から最後まで進めていきます。DBのリレーションなどをやるようですね。
リレーション…?(1対多)
- リレーションをするのかと思いきや、やっぱりこっちも自作。あるぇ…?ORMがもしかして、ない…?流石にそれはないか?まだやらないだけ、かな……?
- Post モデルの中で投稿ユーザの情報を返すインスタンスメソッドを定義する
class Post < ApplicationRecord
...
def user
return User.find_by(id: self.user_id)
end
end - 呼び出し側は、post から user を呼び出せる
def show
@post = Post.find_by(id: params[:id])
@user = @post.user
end - 逆に、user に紐づく posts を引く時には Userモデルに posts メソッドを定義する
class User < ApplicationRecord
...
def posts
return Post.where(user_id: self.id)
end
end - 使う時は@user に対して posts メソッドを呼び出す
<% @user.posts.each do |post| %>
- flash[:notice] に〜を代入してください、の時に"" ダブルクオートが付いてたり付いてなかったりするのは、これは注意力を付けるためにわざとやってるんだろうか…。
リレーション…?(多対多)
- 中間テーブルに該当の値があるかどうか見る
<% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
…そんまんまですね。(そしてまたここで {method: "post"} になってる)
いいね!済み
<% else %>
<%= link_to("いいね!", "/likes/#{@post.id}/create", {method: "post"}) %>
<% end %>
find_by は何もない場合の戻り値が nil なので判定に使える、ということらしい。 - ajaxを使うのかと思ったらそんな事はなかった。流石にないか。
モデル
- destroy メソッド。以前も出てきたけど復習も兼ねて。
@like.destroy
ソフトデリートってあるのかなぁ。 - where メソッドとcount メソッド
@likes_count = Like.where(post_id: params[:id]).count
Font Awesome と link_to
- link_toメソッドをHTMLに対して使う場合には少し異なった書き方をする
- 文字列に対して
<%= link_to("リンクテキスト", "/posts/index") %>
- HTMLに対して
<%= link_to("/likes/#{@post.id}/create", {method: "post"}) do %>
<span class="fa fa-heart like-btn"></span>
<% end %>
gem(ジェム)
- gemとは
RubyやRailsでプログラミングをする際に「よく使う機能」をパッケージ化したものです。Railsにインストールすることで使用することができます。
- ほおほお。Composerのようなものか。CentOS上でコマンドを見たことだけはある。
- Gemfile :インストールしたいgemを記述するファイル
へえー。composer.json みたいなものか。gem 'rails', '5.0.3'
バージョン名を省略すると、最新版をインストールする
gem 'bcrypt' - Gemfile.lock :自動生成されるファイル。composer.lock みたいなもんですね、きっと。
- gem インストール実行
$ bundle install
bcrypt パッケージ
- has_sercure_password メソッドというメソッドが使えるので、モデルに設定する。use も何もいらないらしい。また、has_secure_password は presence (存在するかどうか)のバリデーションも一緒に行う。
class User < ApplicationRecord
has_sercure_password
... - 項目名が password の中身を、save 時にbcrypt を通して「password_digest」カラムに入れてくれるので、項目名は password のままでよい
- ログインさせるには、そのメールアドレスを持つユーザが存在し、かつ、bcrypt の authenticate メソッドを使ってパスワードが一致するかを確認して、通す
@user = User.find_by(email: params[:email])
if @user && @user.authenticate(params[:password])
session[:user_id] = @user.id
....
else
....
end
余談:気がついた事
CakePHPとRuby on Railsでは、バリデーションはモデルに記述し、モデルのsaveメソッドが走る時に行われる。
Laravel では、バリデーションは基本自分で設定するのでモデルに書いてもコントローラに書いても良くて、いつのタイミングでも掛けられる。私は大体、フォームからデータが渡ってきたタイミングでバリデーション掛けていたので、今回ちょっと違和感があって気が付きました。
どっちがいいんでしょうね。
私はLaravelでも良くモデルにバリデーションを配列で返すメソッド作ってたので、結局やってることは変わらない気がしますけども。save メソッドで呼び出された際にバリデーション通すか、その前に通すかの違いですかね。
でもCakePHPでは特定の項目だけ特定の場合にバリデーション掛けたくないシチュエーションがあった時に、ちょっと別オプション指定してあげたりが面倒だったので、Laravel の方が自分でタイミングと項目を設定出来る分、融通が効くと言えなくもないけど、結局全部手動だからなぁ。
一長一短ですかね。
Ruby on Rails5 のレッスンを修了!
レッスン6〜8と、道場3の合わせて4つを修了し、Ruby on Rails5 のレッスン全てが終わりました。ここまで3時間強でした。
さすがにパスワードの暗号化は出てきましたね。
DBのリレーションを張るのかと思いきや、ORMでなく手動だったのは少し驚きました。レッスンに入り切らなかったんですかね。どっちにしてもORMはいずれ格闘しなきゃいけないと思いますので、概念だけおさらいするという意味でいい復習になりました。
デバッグの仕方くらい教えてくれたら嬉しかったなーと思いましたが、別にそんくらい調べればすぐ分かることなので、あとは自分でなんとかしましょうってことですね。
次はローカル環境作って、公式ドキュメント見ながらORMとかソフトデリートとか探しつつ色々試してみようかと思います。とりあえず Multiauth やらねば。
正月休み中しっかり勉強したし、明日は1日遊んで、明後日からまた仕事ですね。正月明け早々に出張です……。
兎にも角にも、Ruby on Rails5 のレッスンは無事修了〜。
Progate さんありがとうございました。
折角だからjQueryとPythonもやるだけやってみようかな。
Ruby on Rails5 のレッスンに突入 その2
Ruby on Rails5
さて、昨日はRuby on Rails5のレッスンに入っていきました。
引き続き今日はレッスンを進めて行きます。使う学習サイトは同じく Progate です。
- Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
- 途中から有料です。月額980円(税込)
あ、そういえば、明けましておめでとうございます。
履修してるレッスン
- Ruby on Rails5
- 目標:TweetApp(TwiiterみたいなSNS)を作ること
「Ruby on Rails5」のレッスン5と道場2まで進みました。今日はレッスン6からです。「Ruby on Rails5」のレッスン通してTwitterっぽいSNS作るということで、昨日まではルーティング、モデル、コントローラ、ビューの関係とか書き方を学びました。
レッスン6からはログイン機能を付けて行くようですね。
別にこの辺からはProgateでなくても良いような……とか思わなくもないですが笑 折角課金しましたので、このレッスン修了までは使ってみます。
ユーザ管理機能
- 昨日も出てきましたが、復習も兼ねて。モデルとマイグレーション作成コマンドとマイグレートコマンド。やっぱりUserモデルのファイルが小文字なのがなんか気持ち悪い…
$ rails g User name:string email:string
$ rails db:migrate - Laravelみたいにコマンドで勝手にログイン機構を全部作ってくれたりは……しないのか。残念。
- バリデーションのユニーク制約:
validates :email, { uniqueness: true }
- コントローラ名が複数形……でした、そう言えば。
- ビューのnewとeditを一つにしたいな……
- render()の引数はURIだと思ってたけど、ビューのパスだったっぽい。ユーザの新規作成画面のURIは /users/signup だけどrenderで指定する場合は
render("users/new")
- ページをめくるごとに設定していたname属性を消されて、知らずにブラウザで試して怒られるの巻\(^o^)/
- お、もしかして編集の際のユニーク制約は、何もしなくても自分のID以外に検索をかけてくれてる?これは便利だ!何で判定してるんだろう。アクション名?
- しかし、編集の際にDBのトランザクション張らなくていいんだろうか。また別のレッスンでやるのかな。
画像アップロード機能
- 画像データはpublicディレクトリに保存
- マイグレーションファイルの作成コマンド
$ rails g migration add_image_to_users
- マイグレーションファイルの書き方
class AddImageNameToUsers < ActiveRecord::Migration[5.0]
def change
add_colums :users, :image_name, :string
end
end - HTMLヘルパーのようなものはないのかな…?
- ファイル送信の際には、form_tagメソッドの第二引数に {multipart: true} 渡す。よく忘れるやつですね注意。
- Ruby標準のFileクラスでファイルを書き込み出来る
File.write("public/sample.txt""public/sample.txt""public/sample.txt""public/sample.txt", "Hello World")
だと、sample.text に文字を書き込める。
public ディレクトリに書き込む際もpublic から指定する必要がある事に注意。 - 画像ファイル保存の場合には File.binwrite メソッドと、画像の read メソッドを使う
@user.image_name = "#{@user.id}.jpg"
image = params[:image]
File.binwrite("public/images/#{@user.image_name}", image.read) - 画像表示の際には、
<img src="<%= "/user_images/#{@user.image_name}" %>">
ダブルクオートの中にダブルクオートを入れるのがなんか……不思議ですが。
ログイン機能
- ログインのアクション命名規則。URIは両方 /login
ログイン画面(GET) :login_form
ログイン実行(POST):login - んんんwwパスワード平文入ってるんですけど、最初だからですよね??ww
- form_tagメソッドはデフォルトでポストのルーティングを探す
<%= form_tag("/login") do %>
それにしても do をよく忘れてしまう… - Railsのログインはだいぶめんどくさいなぁ……ログイントレイトみたいなの欲しい……!
- ログイン処理=「セッションの user_id キーにユーザIDを持たせること」
session[:user_id] = @user.id
変数名に入れるだけでセッションに入れてくれる機構があるんだな… - ログイン判定をして、ログイン中の場合に某かの値を出力
<% if session[:user_id] %>
うん、シンプルですね。これガードとかの判定出来るんかな。
ログイン中ユーザーのid: <%= session[:user_id] %>
<% end %> - ログアウトは逆にセッションのuser_idキーを空にするだけ。
session[:user_id] = nil
……うん、シンプルですね。 - 以前のレッスンでは link_to メソッドでポストのルーティングを指定する際には第3引数に
{method: "post"}
を指定してください、とあったのに、何の前置きもなく今度は{method: :post}
を指定してください、になってたでござる……びっくりしたでござる。どっちでもいいみたいでござる。どっちでもいいよって書いてあったの私が見逃したかな…? - なるほど、連想配列…じゃなくてハッシュのキーを "key" ってのを :key に出来る、っていうだけの意味かと思ってたけど、これはもしかして "" ダブルクオートを : コロンで書くことが出来るってことだったのかな。なるほど、それで「省略して掛ける」って言ってたのか。ちょっと納得。
だからPost.all.order(created_at: :desc) とかちょっと変な書き方だなあと思ったんですけど、そういうことだったのか……な……?え、今更?どんくさくてすみません…… - 親クラスでメソッドとコントローラ呼び出し前に一括してメソッドを呼び出すことが出来る
親クラス:application_controllerclass ApplicationController < ActionController::Base
と書けば、全てのControllerでアクション前にログイン中のユーザが取得出来る(=いちいち全てのControllerに書かなくて良い)。
before_action :set_current_user
#...
def set_current_user
@current_user = User.find_by(id: session[:user_id])
end
end
ビュー側では普通にcontrollerで指定したように<% if @current_user %>
で利用出来る。
<%= link_to(@current_user.name, "/user/#{@current_user.id}/edit") %>
<% end %> - @変数は、
@変数で定義した変数は同じクラスの異なるメソッド間で共通して使用することが可能です
- なので、親クラスのapplication_controllerで先に
before_action :set_current_user
としておけば、application_controller 内の他のアクションでも @current_user が使えるよ、と。 - 「ログイン済みしか見られない」ページを指定したい場合
def authenticate_user
if @current_user == nil
flash[:notice] = "ログインが必要です"
redirect_to("/login")
end
end - ログイン済みの場合に「見せないようにしたい」場合
def forbid_login_user
if @current_user
flash[:notice] = "すでにログインしています"
redirect_to("/posts/index")
end
end - で、各コントローラで、アクションの前に親クラスのメソッドを通す。このアクションでだけ通したい、という場合は only で指定出来る。
before_action :authenticate_user, {only: [:index, :show]}
- ログイン済みか否かでログイン画面表示さすかどうか、っての、全部自作かぁ……トレイトほしい。せめてミドルウェアほしい。
レッスンを4つ修了
レッスン6〜8と、道場3の合わせて4つを修了しました。ここまでで4時間半くらい。
昨日まではMVCの基本と表示部分の使い方などでそんなに難しい感じはありませんでしたが、ログイン回りは基本は変わりませんけどRailsっぽい書き方というか、今までとちょっと違ったので時間がかかりましたね。
Railsもコマンド叩けばログイン回り全部作ってくれればいいのに…!あとトレイトとミドルウェア欲しいです。ミドルウェアという概念は無いのかな…?あとで調べてみよう。
さすがに今日あと4つするの大変なので、今日はここまでにします。明日、Ruby on Rails5 のレッスンを最後まで行ければと。
ログイン回りを折角してるので、Multiauthもやってくれたら手間が省けて嬉しい。
Progateは本当に細かく丁寧に教えてくれるので、他のフレームワークしてる人には少し退屈かもしれませんが、初めてフレームワーク触る人にはとても優しい仕様になってますね。
ただ欲を言えば、レベルアップをお知らせしてくれるのは嬉しいけど、結構さくさくレベル上がってその度にいちいち閉じるボタン押すのが面倒なので、出来れば「もう表示しない」機能を付けてもらって、その場合は簡単なポップアップか何かだけでレベルアップを通知してくれると嬉しいなぁ…。
あと、エディタ画面でタブの入れ替え出来るとすごく嬉しい。
とりあえず、Ruby on Rails5 もあと少しでお終いですよー。
Ruby on Rails5 のレッスンに突入
Ruby on Rails5
さて、昨日はRubyの基礎を勉強しました。
引き続き今日はいよいよRuby on Rails5の学習に入っていきます。使う学習サイトは同じく Progate です。
- Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
- 途中から有料です。月額980円(税込)
自分のメモ代わりに、重要なポイントとかをまとめて見ます。
履修するレッスン
- Ruby on Rails5
- 目標:TweetApp(TwiiterみたいなSNS)を作ること
今回はブラウザ上で全て完結出来るみたいなので、ローカルの環境作ったりはしないんですね…ちょっと残念。まあいいか。Progate上のRuby on Rails5のレッスン終わったらローカルで環境作ってアプリ作ってみようかな。
ワガママ言うと、背景が黒なのが目がチカチカしてキツい‥‥背景色変えられる機能欲しいです Progate さん……。背景が黒いとカーソルをよく見失うし……。プリーズ!
基礎
- railsのアプリ生成コマンド
$ rails new App名
- サーバ起動(ビルトインサーバかな?)
$ rails server
- Railsの初期画面可愛いなぁ
- トップページ生成コマンド。と思ったら、これはコントローラ作成コマンドで、デフォルトのアクションを一つ指定出来るというもののようです。ルーティングやメソッドやビューやassetsのJSまで作ってくれてる。
$ rails generate controller home top
↓ 省略Ver
$ rails g controller home top - Controllerのファイル名がスネークケースなのがだいぶ気持ち悪い…
- Viewのディレクトリの命名規則はCakePHPみたい。
コントローラと同じ名前のビューフォルダから、アクションと同じ名前のHTMLファイルを探してブラウザに返します。
なのにルーティングがいるのか…? - いるらしい。ルーティングに書かれていないとビューを表示出来ない。
- rails のCSSファイルは、
「stylesheets」フォルダの中に保存されているCSSファイルにコードを書けば、すべてのビューにCSSが適用されます。
と書かれているけど、これ、コントローラ名.cssは、そのコントローラに紐付いた全てのビューに適用されます、ってわけじゃないのかな…?
作成されたデフォルトのCSSにはコメントアウトで
// Place all the styles related to the posts controller here.
// They will automatically be included in application.css.と書かれているけど…。単純にファイル名を分かりやすく区別してるだけなのかな?あとで確認してみよ。
- ビューファイルの拡張子「erb」は「Embedded Ruby(埋め込みRuby)」の略
- この拡張子のビューファイルでは、<% %> で囲むとrubyコードが記述出来る。
- 変数を出力する場合は<%= %>を使う。これでechoしてくれるんですな
- コントローラからビューに値を渡すのは、
変数名を「@」から始めることでこの変数は特殊な変数となり、ビューファイルでも使用することができます
らしい。これは便利だ!わざわざ渡さなくていいんですね。ビュー側で使う場合も<% @posts.each do |posts| %>
になるらしい。 - フラッシュメッセージは flash[:notice] = "メッセージ"
- ビューで使う時も <%= flash[:notice] %>
ルーティング
- ルーティングの基本
Rails.application.routes.draw do
get "/" => "home#index"
get "/about" => "home#about"
get "/post/:id" => "post#show"
end - idなどのパラメータを指定する場合
「posts/:id」というルーティングは「posts/index」より下に書かなければいけません。ルーティングは合致するURLを上から順に探します。そのため「posts/index」よりも上に書くと、「localhost:3000/posts/index」というURLは「posts/:id」というルーティングに合致してしまいます。
あ、これあれですね、地味にハマるやつですね分かります… - link_to メソッドは get のルーティングを探す
- post のルーティングを探す場合はlink_toメソッドの第三引数に {method: "post"} を渡す必要がある→追記:のちに {method: :post} という書き方も出てきた
- Railsでのアクション命名規則
一覧:index
新規作成がLaravelと違うからちょっとごっちゃになりそう…
新規作成画面:new
新規作成実行:create
編集画面:edit
編集実行:update
詳細画面:show
削除:destroy
rails console
- rails console を使ってrubyのコマンドを使うことが出来る。へー。rails consoleの起動は
$ rails console
- 変数も使えて、quit するまで記憶される
- rails consoleからDBへレコード追加も出来る
post1 = Post.new(content: "コンテンツテキスト")
post1.save
フォーム
- form_tagメソッドはFormヘルパーみたいなものっぽい。定義の仕方は
<%= form_tag("/posts/create") do %>
<div class="form">
<div class="form-body">
<textarea name="content"></textarea>
<input type="submit" value="投稿">
</div>
</div>
<% end %>
DB
- モデルの生成。一緒にマイグレーションも生成してくれるらしい。
$ rails g model Post content:text
- Railsでのマイグレーションの性質
データベースに反映されていないマイグレーションファイルが存在する状態で、どこかのページにアクセスすると以下のようなマイグレーションエラーが発生してしまいます。そのため、マイグレーションファイルを作成した場合は必ず「rails db:migrate」を実行する必要があります。
- マイグレーションの実行。Laravel と一緒だー
$ rails db:migrate
- バリデーションはモデルに記述する
class Post < ApplicationRecord
おお、見慣れない感じ…
validates :content, {presence: true, length: {maximum: 140}}
end
Ruby on Rails5のレッスンを7つ修了
15レッスンということだったので5つずつ消化しようかと思ってたら、内4つは復習用のレッスンみたいだったので、キリがいい所まで進めました。なので今日は7つです。概ね4時間半程度かかりました。
DBを使った追加・表示・編集・削除までですかね。あとはレイアウトを使った表示の仕方。
思ったよりもLaravelに似てる感じがして、まだそれほど書き辛いとか難しいとかいうイメージは無いですね。いえ、あくまで「まだ」でしょうけども。
フレームワークってみんなこんな感じなんでしょうかね?フレームワーク3つ目なのでまだよく分かりません…。
でもバリデーションの書き方は、なんか、めんどくさそう間違えやすそう。
あと、ルーティングとアクションの命名規則が分かったのが良かったです。やっぱり郷に入れば郷に従えで、そのフレームワークらしい書き方ってあると思うので、倣うのが大事だと思うのですよね。
以前Laravel始めた当初に「CakePHPっぽい書き方しないでよ」と言われたことがありましたけど、今度はそうならないように・ω・
さて、あと1日で終わらせるか、2日に分けるか。早くローカル環境作りたいなー。
Rubyの勉強を始めました
Ruby
年末年始で時間があるので、気になっていたRubyの勉強を始めました。
今回使う入門サイトは Progate というサイト。
- Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
- 途中から有料です。月額980円(税込)
ブラウザ上でRubyを実行した結果が確認出来るのがいいですね。あとサイトの雰囲気やキャラクターが可愛いし、学習者のレベルで表示されたり、レベルアップした時にポップアップが出てSNSで簡単に共有出来るようになってたりと、学習者が飽きないような工夫が色々あって好感が持てます。
しかし「Ruby」のレッスンに関して言えば、プログラミングの初学者向けの内容ですので、当然基本的な部分(文字列と数値は別物ですので区別しましょうとか、if文の中では字下げしましょうとか)もきっちりやります。最初は少し退屈な部分もありそうだな、と思いつつ…。
でも「Ruby on Rails5」というレッスンもあるので、1月3日までにこれ修了出来るといいな。アプリ作りたいよアプリ。
この記事では、学習する中でPHPとの違いとか、へぇ〜と思った箇所を、自分のメモ代わりに書き出してみます。
Rubyの基礎
- 文末は何もない。; (セミコロン)で終わらないので少し違和感
- 文字連結は +(加算記号)。JSみたい
- 数値と文字列は +(加算記号)で連結出来ない
- 命名規則:変数はスネークケースで書く
- 頭に何も付けなくても変数として使える。JSみたい
- 変数展開出来るのは "(ダブルクオート)の中のみ
- Rubyにはインクリメント演算子が無いらしい
- 型変換は明示的にしてあげる必要がある
- PHPで言う null は、Rubyでは nil
条件分岐
- if にカッコが無い……違和感
- else if のスペルが…!? elsif だって……
配列とハッシュ
- 配列は fruits = ["apple", "orange"]
- 配列の使い方は概ね同じ感覚でいけそう
- と思ったら違った。PHPで言う連想配列は、Rubyでは配列ではなくハッシュというらしい。そもそも配列とは別物として扱うようだ…。定義する際の記号も { } を使う。
user = {"name" => "suzuki", "age" => 20 }
- でも使う際には配列のように user["name"] と、[ ] こっちのカッコを使うらしい。紛らわしい。
- シンボル(:name)という新しい概念:文字列≒シンボル
- ハッシュのキーをシンボルで置き換えられる。その場合、呼び出す時もシンボルで記述する必要がある
- そうすると、ハッシュを
user = { name: "suzuki", age: 20 }
という省略した書き方が出来る。なるほど、確かに見やすい。呼び出す時は user[:name] でコロンを前につけて呼び出す。 - 配列の中にハッシュを入れられる……?JSONじゃん……?てかもうハッシュも含めて全部「配列」で良くないですか。要は多次元配列じゃないですか……とか思ってはいけないのですよねすみません。
- foreachの書き方が全然違う…
languages.each do |language|
puts "#{language}を話せます"
end
メソッド
- メソッド定義は function ではなくて、def
- 引数がない場合にはメソッドを呼び出す際でも (カッコ) を省略出来る
- メソッド名もスネークケースが一般的なのかな??
- メソッドから返る値は「戻り値」と言う
- bool値を返すメソッド名末尾、カッコの前に?(クエスチョンマーク)を付ける慣習があるそうな。へえ〜。
def negative?(number)
return number < 0
end - キーワード引数という新しい概念:引数を指定する際に
def introduce(name:, age:)
...
endというふうにコロンを後ろに付けて指定する。そうすると、メソッドを呼び出す時に
introduce(name: "suzuki", age: 20)
値の前にキーワードを付けて呼び出せる。引数が多くなった時にわかりやすくていいよねってことらしい。確かに分かりやすい。PHPStormの自動表示機能みたいだな。
クラス
- インスタンスの生成には クラス名.new を使う
menu1 = Menu.new
- インスタンスメソッドなどの考え方はPHPと同じ。呼び出し方は
menu1.name
みたいに .(ドット)でつなぐ - PHPで言うところのコンストラクタは、Rubyでは initializeメソッド と言う
- クラスの継承は
class Food < Memu
と書く。なんか新鮮。 - オーバーライドの概念はPHPと同じようだ
- super()が一瞬「ん?」ってなったけど……。要は単純にオーバーライドする元メソッドを呼び出してるだけですね。
- クラスメソッド(=静的メソッド)を生成する場合
class Menu
...
def Menu.is_discount_day?
today = Date.today
return today.sunday?
end
end
Ruby標準ライブラリの Dateメソッド
- 私の誕生日は日曜日ではなかったらしい
- 段々スキット内のネコの返しが雑になって来てる笑
「Ruby」レッスンは修了
基礎修了までざっと3時間ちょいでした。こんなもんですかね…?
まあオブジェクト指向なのは変わんないから、手段が変わっただけってことですね。基本を理解してれば難しくありません。Rubyの書き方を覚えなければという所ですが、アプリ作ってればその内慣れるでしょう、って範囲を出ない気がします。良かった。
キーワード引数とシンボルは絶対何度も間違えるでしょうけど。
あとはRubyのメソッドとか覚えなければですが、今日はここまで。
今度は、ついに!
Ruby on Rails に入って行くぞー(゚∀゚)