ドグサレ初心者のへっぽこビッグウェーブ

地球の底辺にいるゴミがプログラミングとか音楽とかを語るクソブログ

音楽も甘いものとしょっぱいものを交互に聴きたくなる的なのある

色々環境が変わってあまり書く時間がなくなってしまった。

いかんいかん。


エロフェス行ってから最近仕事中によく打首獄門同好会聞くようになった。

www.youtube.com


そして88のどうでしょう再現度が完璧すぎてやばいwww.youtube.com




けどずっとこれ聴いているとくどくなってくるので、たまに星野源

www.youtube.com




ポテチとチョコを交互に食べるあれね。


あーコードかきたい

クッキーとかセッションとかよく聞くけどいまいちわかってなかった

状態管理してみる

サービスをWeb上にアップしたのはいいものの、誰が作ったかぐらいはわかるようにしたい。
けど、ユーザ管理とか面倒なのでやりたくない。

ふーむ、どうしたものか、と考えて基礎の本を読んでたら、
「状態管理」という項目がありました。
クッキーとかセッションとかのやつ。

そうだ!これを入れてみよう!!
というわけで頑張ってみよう。

qiita.com
とりあえずはこれを参照。

モデルを作成、セッションにuser ID挿入

IDを入れるためのuserテーブルを作成する。

$ rails generate model user name:string lastlogin:date
      invoke  active_record
      create    db/migrate/20151020073924_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
$ rake db:migrate                                                                          
== 20151020073924 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0020s
== 20151020073924 CreateUsers: migrated (0.0021s) =============================

で、
[ application_controller.rb ]

  before_action :login
  def login
    # new session
    if session[:user_id].blank?
      user = User.create
      session[:user_id] = user.id
    end
    @user_id = session[:user_id]
  end

とりあえずこれで、新規セッションの場合には
「user IDを発行 → セッションに挿入」
というフローができました。
次はこれを他テーブルの要素にも入れる必要があるんだよなぁ。

既存テーブルにカラムを追加する

ruby on railsのデータベースのテーブルにカラムを追加、削除する
基本的には「Addカラム名Toテーブル名」でいけるもよう。

$ rails generate migration AddUser_idToAnime_titles user_id:string                        
      invoke  active_record
      create    db/migrate/20151020084600_add_user_id_to_anime_titles.rb
b-kt-01:musico kt$ rake db:migrate
== 20151020084600 AddUserIdToAnimeTitles: migrating ===========================
-- add_column(:anime_titles, :user_id, :string)
   -> 0.0009s
== 20151020084600 AddUserIdToAnimeTitles: migrated (0.0010s) ==================

ってやったら、カラムの順番が一番最後になってしまって、ちょっとイケてない。。。
削除してやり直そう。


stackoverflow.com

と思ったらマイグレーションファイルに追記すればいいだけだった。しにたい。

もういちどやりなおし

モデルを削除してマイグレーション

$ rails generate migration RemoveUser_idFromAnime_titles user_id:string
      invoke  active_record
      create    db/migrate/20151020085338_remove_user_id_from_anime_titles.rb
$ rake db:migrate

モデル削除用のマイグレーションファイルがあるとモデル作れないのでデリる

$ rails destroy migration RemoveUser_idFromAnime_titles
      invoke  active_record
      remove    db/migrate/20151020091023_remove_user_id_from_anime_titles.rb

カラム追加のマイグレーションファイルを強制上書き
(identicalってなるので2回やった)

$ rails generate migration AddUser_idToAnime_titles user_id:string --force
      invoke  active_record
      remove    db/migrate/20151020090845_add_user_id_to_anime_titles.rb
      create    db/migrate/20151020091329_add_user_id_to_anime_titles.rb

"after: "をつけてもっかいやってみる

$ rake db:migrate
== 20151020091329 AddUserIdToAnimeTitles: migrating ===========================
-- add_column(:anime_titles, :user_id, :string, {:after=>:icon})
   -> 0.0023s
== 20151020091329 AddUserIdToAnimeTitles: migrated (0.0024s) ==================

ってできてねえ!!なんでやねん!!

マイグレーションロールバック

www.rubylife.jp

とりあえずマイグレーションロールバックできるコマンドがあったのでいそいそと戻す。

$ rake db:version
Current version: 20151020091329
$ rake db:rollback
== 20151020091329 AddUserIdToAnimeTitles: reverting ===========================
-- remove_column(:anime_titles, :user_id, :string, {:after=>:icon})
   -> 0.0134s
== 20151020091329 AddUserIdToAnimeTitles: reverted (0.0236s) ==================

$ rake db:version
Current version: 20151020091023

なんかマイグレーションファイル消したり強制上書きしたのでバージョンがおかしい。
よくわからないのでもう初期化しよう。




初期化してafterつけたのマイグレートしたのにできてないんだが?


なぜだ。なぜできないのだぉぉぉぉ


あきらめますた。

gitをもうちょっとクールにつかいたい

これまでは、git push origin masterで全部本チャンにぶちこんできてたけど、
そろそろブランチとかそういうプロジェクトっぽい機能使ってみたい。

というわけで頑張ってみる。


http://www.backlog.jp/git-guide/img/post/stepup/capture_stepup1_5_6.png

トピックブランチと統合ブランチでの運用例【ブランチ】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ


猿並みの自分でもよくわかりました。
とりあえず、developブランチがあればいいかな。

ブランチを作成
$ git branch
* master
$ git branch develop
$ git branch
  develop
* master
developにチェックアウト
$ git checkout develop
Switched to branch 'develop'
$ git branch
* develop
  master

うん変わってる。

コミット

適当なファイルにコメントアウトして変更を加え、コミットする。

$ git add app/views/home/about.html.erb
$ git commit
[develop 3971b26] テストでコメントアウトしてみる
 1 file changed, 2 insertions(+)
ブランチをマージ

マージは親ブランチでやる必要があるので、一旦masterに入ってから実施すること。

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git branch
  develop
* master

確かに書いたコメントがなくなってる。

$ git merge develop
Updating 0ae9760..3971b26
Fast-forward
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
 app/views/home/about.html.erb | 2 ++
 1 file changed, 2 insertions(+)

削除は。。。多分しないから、まだいいかな。

ETERNAL ROCK CITY 2015 行ってきました

通称エロフェス。

エターナルロックシティだから略称はエロシティな気もするけど。まぁフェスだし。


というわけでもっとナウなヤングにバカウケのミュージックとはなんぞや

というのを合言葉にサーキットフェスにいってきました。

http://eternal-rock-city.info/images/ero_main3.png
eternal-rock-city.info



ヤーシブですよヤーシブ。

ホテル街のど真ん中に鎮座するO-EASTO-WESTを行ったりきたり中臣鎌足してました。


チョイスしたバンドがアレだったのか、ジャンルがなかなか統一感のないカオスな状態で
それはそれでとても面白かったのですよ。
ほとんど初見のバンドだったのもあり新鮮。ロキノン系なのかな。どうなのかな。

あと全体的に女の子が多かったからか、一部のバンド以外はみんな大人しかった。
結構いろんなバンドがコール&レスポンスしようとしてたけど、そこまでウオアーもせず。


以下見たバンド。



愛はズボーン

見たバンドとか言っておきながら遅刻したから見てない。入場規制入ってた。www.youtube.com



HINTO

おしゃれファンク。ギターがオヨオヨ言っててすごいカッコよかった。www.youtube.com



OGRE YOU ASSHOLE

トリップ系。朝とか空が白んできたときに聞いたら深く落ちれそうな感じ。www.youtube.com




バックドロップシンデレラ

メタル x スカコア x ハードコアみたいな。「ウンザウンザ」ってジャンルらしい。なにそれ。www.youtube.com




Kidori Kidori

音源聞いて一番みたかったバンド。ライブだとエフェクトの関係なのかまた違って聞こえた。
昔と比べて最近はかなり曲調変わってるけど、最近のが評価されてる、らしい。www.youtube.com



打首獄門同好会

ステージにプロジェクタくくりつけて踊りながらリモコンで歌詞をリアルタイムで出すVJがいた。
一番イロモノで笑った。www.youtube.comwww.youtube.com




夜の本気ダンス

テレフォンズとカナブーンを足して2で割った感じ。ちゃんとダンスしてる曲だった。
ボーカルがかっこいいのび太だった。ドラムがチンピラだった。www.youtube.com



やっぱり音楽って本当にいいですよね。


それではこのへんで。さよなら、さよなら、   さよなら

ちょいちょい見た目の手直しをする

fixtureでハイフン使うとエラーが起こる

$ rake db:fixtures:load
rake aborted!
ActiveRecord::Fixture::FormatError: a YAML error occurred parsing /Users/xx/xxxx/musico/test/fixtures/anime_details.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Please have a look at http://www.yaml.org/faq.html

どうやらエスケープしないといけないもよう。はい。
と言っても "" で囲むだけなんだけど。

タイトル一覧テーブルのページを追加

タイトルを一覧で削除するところがなかったので、scaffoldぽくテーブルを作って編集削除できるインデックスページを作る。

[aninme_title_controller.rb]

...
  # GET /anime_titles/titlelist
  def titlelist
    @anime_titles = AnimeTitle.all   #renderよりも先に書いておく
    render layout: 'applicationtitles'
  end
...

[titlelist.html.erb]
※ファイル作っただけなのでブランクページ。


ってコントローラとビュー作ってみたものの、ルーティングでエラー。
新しくアクションを追加する方法ってどうやるんだ。

アクション追加はルートを編集

techracho.bpsinc.jp

routes.rbでタイトルの中に一覧ページへのルートを指定するべし。
memberとcollectionの違いについては、

複数形はidなし、単数形はidあり」と同じ考え方で、「collection(集合)はidなし、member(個別)はidあり」と覚えましょう。

今回は一覧なのでid振ってページ複数作らない → collectionでよさそう。

[routes.rb]

  resources :anime_titles do
    resources :anime_details
    collection do
      get :titlelist
    end
  end
$ rake routes
...
       titlelist_anime_titles GET    /anime_titles/titlelist(.:format)                              anime_titles#titlelist
...

ルート作れました。

ページ内容

基本的にはanime_detail/indexのコピペ。
グリッドは多分おかしいけど、とりあえず表示できればいいので放置。

<div id="animetitlewrap" style="background-image: url(/assets/back.jpg);">
  <div class="container">
    <div class="row">
      <div class="col-lg-6 col-lg-offset-3">
        <h1>アニメタイトルリスト</h1>
        <h4>主に確認用</h4>
      </div>
    </div><! --/row -->
  </div> <!-- /container -->
</div><! --/headerwrap -->

<div class="container">
  <h1>Listing Anime Titles</h1>
  <p id="notice"><%= notice %></p>

  <div class="table-responsive">
    <table class="table table-striped table-bordered table-condensed newline">
      <thead>
      <tr>
        <!-- ヘッダ -->
        <th colspan="1"></th>
        <th class="col-xs-2 col-ms-2 col-md-2 col-lg-1">ID</th>
        <th class="col-xs-2 col-ms-2 col-md-2 col-lg-2">title</th>
        <th class="col-xs-2 col-ms-2 col-md-2 col-lg-3">icon_url</th>
        <th class="col-xs-1 col-ms-1 col-md-1 col-lg-1">icon</th>
        <th class="col-xs-2 col-ms-2 col-md-2 col-lg-2">created_at</th>
        <th class="col-xs-1 col-ms-1 col-md-1 col-lg-2">updated_at</th>
      </tr>
      </thead>

      <tbody>
      <% @anime_titles.each do |anime_title| %>
        <tr>
          <!-- anime_titleリスト %-->
          <td class="col-xs-1 col-ms-1 col-md-1 col-lg-1">
            <%= link_to '表示', action: :show, id: anime_title.id %><br>
            <%= link_to '編集', action: :edit, id: anime_title.id %><br>
            <%= link_to '削除', {action: :destroy, id: anime_title.id}, {method: :delete, data: {confirm: '削除してよろしいですか?'}} %>
          </td>
          <td class="col-xs-2 col-ms-2 col-md-2 col-lg-1"><%= anime_title.id %></td>
          <td class="col-xs-2 col-ms-2 col-md-2 col-lg-2"><%= anime_title.title %></td>
          <td class="col-xs-2 col-ms-2 col-md-2 col-lg-3"><%= anime_title.icon_url %></td>
          <td class="col-xs-1 col-ms-1 col-md-1 col-lg-1"><%= anime_title.icon %></td>
          <td class="col-xs-2 col-ms-2 col-md-2 col-lg-2"><%= anime_title.created_at %></td>
          <td class="col-xs-1 col-ms-1 col-md-1 col-lg-2"><%= anime_title.updated_at %></td>
        </tr>
      <% end %>
      </tbody>
    </table>
  </div>
</div>


<br>

<%= link_to 'New Anime Title', action: :new %>

<hr>
<%= link_to 'アニメタイトル一覧', anime_titles_path %>  |
<%= link_to 'トップへ', root_path %>

コントローラで自ら開けた穴にハマる

scaffoldで作ると作成されるprivateメソッドの「set_anime_title」が反応してエラー出てる。
「AnimeTitle.find(params[:id])」のidがねーぞ、って。ここ読まなくていいのになんで反応してるん。

と思ってたら

  before_action :set_anime_title, only: [:show, :edit, :update, :destroy, :titlelist]

自分で読み込むようにbefore_actionに追加してたってオチ。馬鹿か。

:titlelist消したら表示できました。めでたし。

タイトル一覧では最新のものから表示させる

現状はanime_titleのID順(DB入った順?)でゴリゴリ表示させてるんだけど、これを登録タイミング順にする。

って調べてみたけど、titlelistの場所でだけ、みたいに特定の場所で取り出し順序変える方法がわからぬ。

techracho.bpsinc.jp

どうせID順で使うことないし、とりあえずdefault_scopeを使ってモデル自体の取り出し順序を変える。

[models/anime_title.rb]

class AnimeTitle < ActiveRecord::Base
  has_many :anime_details, dependent: :destroy
  accepts_nested_attributes_for :anime_details
  default_scope { order("created_at DESC")}
end

DESCをつけることで、最新順になりました。

副次的にindexとかいろんなページのリストが最新順で表示された。

トップページは最新6件のみ表示する

今はrootであるhome#indexと、anime_titles#indexではほぼ同じ内容を表示している。
これをトップページでは件数制限をかけて、「もっと見る」とかで全部見れるようにしたい。

qa.atmarkit.co.jp

ループ指定は「.first(取得する個数)」をeach doに追加すれば頭から取ってこれる。カンタン。
「もっと見る」はとりあえずボタンを置いとけばいいや説。

んで、変更したものは_newestの部分テンプレートにして、_highlightから差し替え。

[ home/index.html.erb ]

<div id="headerwrap">
  <div class="container">
    <div class="row">
      <div class="col-lg-6 col-lg-offset-3">
        <h4>HELLO PEOPLE, MY NAME IS MUSICO!</h4>
        <h1>アニメのOPとEDをあつめるところ</h1>
        <h4>とりあえずつくってみた</h4>
      </div>
    </div><! --/row -->
  </div> <!-- /container -->
</div><! --/headerwrap -->

<section id="works"></section>
<div class="container">
  <div class="row centered mt mb">
    <h1>New entry Anime Titles</h1>
    <%= render partial: 'newest', locals: { anime_titles: @anime_titles } %>
  </div><! --/row -->
  <div class="row centered mb">
    <div>
      <%= link_to('タイトルをもっと見る', {controller: :anime_titles, action: :index}, :class => 'btn btn-default btn-lg' ) %>
    </div>
  </div>
</div><! --/container -->

[ home/_newest.html.erb ]

<!-- list 6 newest image -->
<ul>
  <% anime_titles.first(6).each do |anime_title| %>
    <div class="col-lg-4 col-md-4 col-sm-4 gallery backgroundbrink">
      <%= link_to({:controller => "anime_titles", :action => "show", :id => anime_title.id}) do %>
        <div style = "background: url(<%= anime_title.icon_url %>) 50% 20% no-repeat;
          background-size: cover; width: auto; height: 250px;">
          <div class="btn btn-success thumbbutton">
            <%= anime_title.title %>
          </div>
        </div>
      <% end %>
    </div>
  <% end %>
</ul>


なんとか形になりまっした。

herokuでデプロイしたけどよくわかってなかった

herokuでデプロイ完了したけどプランとかどういう体系なのか全然確認できてなかったので確認する。

sideci.hatenablog.com

最近変わったのね。

Freeプランの変更内容・影響

一番ユーザ数的にインパクトがあるのは無料プランの変更でしょうか。30分アクセスがなければDynoがSleepするというのは今まで通りですが、「1日6時間以上スリープする必要がある」と変更になっています。

これってこっちでスリープする時間帯を指定できないのかな。
自分が使いたい時に使えないのアレだし。


sota1235.hatenablog.com


というのは誰しも考えることで、Process Schedulerというアドオンがあるもよう。

設定しようとしたら「クレカ登録しないとアドオン使いないんでゲスよ(ゲス顏)」と言われた。

もしやこのアドオン、お金がかかるのでゲスか?


まぁとりあえずクレカ設定してみて、Process Schedulerをアドオンしてみる。

アプリのAPIキーとか聞かれる。ちょっと怖い。



が、普通にそれっぽく使えました。2:00 ~ 8:00をスリープ期間にする。


多分これで大丈夫、な、気がする。

herokuに上げたらニコニコ動画が取ってこれなくなった〜httpsは魔物でござるの巻〜

はてさて無事herokuにデプロイはできたのですが。

いざデータを入れてみると、youtubeエンベッドはできたのですが、ニコニコのエンベッドが動かない。

デプロイするときに色々消したのがまずったのかな…と思ったけど、ローカルでは普通に動いてる。


Developerツールを覗いてみると、以下のエラーが。

Mixed Content: The page at 'https://musico.herokuapp.com/anime_titles/9' was loaded over HTTPS,
but requested an insecure script 'http://ext.nicovideo.jp/thumb_watch/sm8539552'.
This request has been blocked; the content must be served over HTTPS.

httpsとhttpがミックスコンテンツ。

。。。。。。


プロに聞いたところ。
基本的にhttpsはセキュアにする性質上、httpsからhttpのサイトを呼び出すことはできない。

んで、herokuではhttpでもhttpsでもどっちでも対応しているんだけれども、デプロイ後のリンクはhttpsで張られているため、期せずしてhttpsでページを見ていたようです。

httpでアクセスしなおしたところ、表示されました。


ちなみにプログラムの中でURLソース指定するときには、

<script type="text/javascript" src="//ext.nicovideo.jp/thumb_watch/<%= $1 %>"></script>

というように、頭のhttp部分を抜くと、自分のページに依存させることができるらしいです。
(呼び出し元のページがhttpならhttp://~~~httpsならhttps://~~~、といった形)



ニコニコ動画httpsでアクセスできないようでしたが。

とりあえず、http環境では動いたのでよしとします。