技術ブログっぽいなにか

Ruby・Railsメインでいろんなこと書きます

deviseのflashをBootstrap対応にする

deviseとBootstrapを組み合わせて使っていると、deviseとBootstrapで表現が違うため色がいい感じにならない時がある
での、それを解決します

application.html.erb

<% flash.each do |name, msg| %>
    <div id="alert" class="col-xs-11 alert alert-<%= bootstrap_class_for(name) %> alert-dismissible fade" >
      <a class="close" data-dismiss="alert" aria-label="Close">×</a>
      <%= msg %>
    </div>
<% end %>

application_helper.rb

module ApplicationHelper
  def bootstrap_class_for(flash_type)
      case flash_type
          when "success"
          "success"
          when "error"
          "danger"
          when "alert"
          "warning"
          when "notice"
          "info"
          else
          flash_type.to_s
      end
  end
end

こうしておくと、これから色の種類が増えても修正が楽になるね!

参考

hitori-programming.org

【Active Record】値が保存できなかった

メッセージがお気に入りされたらFavoriteテーブルにそのメッセージのidが保存されるようにしたかった
けど、なぜか保存されなかった。

関係ありそうな場所

Controller

class FavoriteController < ApplicationController

  def create
    @user_id = current_user.id
    @favorite = Favorite.new(message_id: params[:id], user_id: current_user.id)


    if @favorite.save
      redirect_to home_path, success: 'お気に入り登録しました!'
    else
      redirect_to home_path, danger: 'お気に入り登録ができませんでした'
    end
  end

  def destroy
    @favorite = Favorite.find(params[:id])
    if @favorite.destroy
      redirect_to home_path
    end
  end

end

createメソッドがうまくいってないっぽい。

原因

カラム名が複数形になっていた。
他テーブルの主キーとジョインするカラムは テーブル名(単数系)_idじゃないとダメらしい
参考:データベースオブジェクトの命名規約 - Qiita

ActiveRecord::Schema.define(version: 20171231015724) do

  create_table "favorites", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.integer  "user_id",    null: false
    t.integer  "messages_id", null: false  #<=ここ
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["message_id"], name: "index_favorites_on_message_id", using: :btree
    t.index ["user_id"], name: "index_favorites_on_user_id", using: :btree
  end

  create_table "messages", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.integer  "user_id"
    t.string   "contents"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
  end

end

解決策

$ rails g migration RenameMessagesIdColumnToFavoritesマイグレーションファイルを作ってmigrateする。

class RenameMessagesIdColumnToFavorites < ActiveRecord::Migration[5.0]
  def change
    rename_column :favorites, :messages_id, :message_id
  end
end
$ rails db:migrate

終わり。

Rails命名規則、あんまり覚えていないせいでいちいちググっているので、ちゃんとまとめたい…

参考

qiita.com

HerokuのDBをPostgreSQLからMySQLに変更する


Railsでアプリ作ってて、デフォルトのPostgreSQLを使ってたけど
中身をSequelで見たいなあと思ったのでPostgreSQLからMySQLに変更することにした。


ググったらたくさん記事が出てくるからラクショーじゃん!と思っていたけどかなり時間がかかってしまったし、
次も同じ目に遭いそうだなと思ったのでメモ。

Gemfileにmysqlを追加する

#gemfile
gem 'mysql2',       '~> 0.3.20'

database.ymlの設定を変更する

#database.yml
default: &default
  adapter: mysql2
  pool: 5
  timeout: 5000

development:
  <<: *default
  adapter: mysql2
  database: appname_development
  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default

production:
  <<: *default
  adapter: mysql2
  pool: 5
  timeout: 5000

bundle installする

$ bundle install

ここでGemfile.lockに差分ができるので、Gemfileとともにコミットする。
私はこれをやってなくて2日くらい悩んでいた。なんと無駄な・・・
うまくいったらHerokuにpushする。

HerkouのアドオンにClearDBを追加する

$ heroku addons:add cleardb 

もしかしたらアプリ名指定しろよって言われるかも?

DATABASEの設定を削除する

$ heroku addons:destroy heroku-postgresql -a appname

ググった時に出てくる記事だとheroku addons:detach DATABASE -a appnameでもいいっぽいのだけど、それだとなぜか通らなかった。 destroyだといけた。 アプリの名前入れてくれーって言われるので入れてあげると削除してくれる。

DATABASE_URLをCLEARDATABASE_URLのものに書き換える

$  heroku config:set DATABASE_URL='mysql2://xxxxx?reconnect=true' --app appname

mysqlmysql2に変えることを忘れずに。

いちおうdb:migrateしてheroku openする

$ rails db:migrate
$ heorku open




おわり。
大変だった…また次もつまづきそうだ…

Herokuにデプロイしたら背景が真っ白になった話

 

久しぶりにHerokuにサイトをデプロイしたら背景が真っ白になった。

あーこれ知ってる。アセットプリコンパイルだ。
でも背景以外の画像はちゃんと表示できてる。

とりあえずコマンド叩いてみた。 

~/w/r_portfolio ❯❯❯ heroku run rake assets:precompile
Running rake assets:precompile on ⬢ tsumi-portfolio... up, run.9433 (Free)
Error waiting for network: Resource temporarily unavailable
~/w/r_portfolio ❯❯❯ heroku run rake assets:precompile
Running rake assets:precompile on ⬢ tsumi-portfolio... up, run.7788 (Free)


実はこのコマンド叩いたの1年前が最初で最後で、
記憶を頼りに適当に叩いたら合っててびっくりした。

まあ、うまくいかなかったけど。

一応ググったら環境変数指定しないといけなかったっぽい。
それのせいなのか、怒られているリソースがなんとかってせいなのかはわからない。


production.rbの設定変えるらしい

ということがわかったので、production.rbを開いてconfig.assets.compileを確認。


falseになってた・・・

f:id:tmicha:20170918163844p:plain

なおして再びpush。

解決!

Rubyの練習問題を解いた話【累乗】


あるサイトの、Rubyの練習問題を解きました。
正解率90%超えの問題を選んだんだけど、まあまあ難しかった気がします。

2つの数字が入力されるので、それぞれを3乗した数字の差を求めなさいという問題。

自分の書いたコード↓

input_lines = gets
r = input_lines.split("\s")
r_1 = r[0].to_i
r_2 = r[1].to_i
puts (r_1 ** 3) - (r_2 ** 3)


まずinput_lines = getsで入力されたものを変数に入れる。 input_linesはStringなので、.splitで指定した文字ごとに区切って配列にする。なので、rはArrayになる。
ただ、Arrayの要素ひとつひとつは文字列なので、to_iしてから計算する。


サイトだとプログラムがテストデータで計算してくれるようなので、自分でもコンソールで叩いてみた。↓

irb(main):001:0> input_lines = gets
5 3
=> "5 3\n"
irb(main):002:0> r = input_lines.split("\s")
=> ["5", "3"]
irb(main):003:0> r_1 = r[0].to_i
=> 5
irb(main):004:0> r_2 = r[1].to_i
=> 3
irb(main):005:0> puts (r_1 ** 3) - (r_2 ** 3)
98
=> nil

べき乗(累乗)ってアスタリスク2つつけるの知らなかった。
いや、見たことはあるけど使ったことなかったからすっかり忘れてた…

良い勉強になりました!

グロースハックについて調べてまとめた話

 

 

31日ぶりの更新になってしまった。
TEDはというと、見てノートに書いてはいるもののこっちに投稿できていない…

そのままでもいいんだけど、考えや頭の中を整理できてない感じがしてよくない気がするのでそのうちちゃんと書こうと思ってます。

 

ところで今日は、インターン先でグロースハックについて学びました。

最近ネットでよく見かけはしていたものの、IoTとかデザイン思考みたいに「なんか使ってるとかっこいいしそれっぽい流行語」みたいな感じがして勝手に抵抗感を感じていたけど、
これから大事になる概念だと言われたのでこの機会にしっかり理解しておこうと思い、そして忘れないようにここに書き留めようと思ったのです。

 

なお、今回はVASILY社のブログを参考にさせていただきました。
とてもわかりやすかった。

 

growthhack.vasily.jp

  

そもそもグロースハックとは?

一言でいえば、 「数値やユーザーの声を分析し、ユーザーの数や質をGrowthさせる仕組みをプロダクトの中に組み込んでしまうこと

 

数値をもとに分析してサービスを成長させようという手法のことらしい。
サービスをある程度運営させていくとデータが溜まってくるし、それを使って改善すべきところを改善すれば利益も上がりそう。ふむふむ。

 

グロースハックのための分析フレームワーク"AARRRモデル"

 

なんかすごい名前だけど、グロースハックのための分析フレームワークがあるらしい。

・Acquisition(ユーザー獲得:登録や訪問など)
・Activation(ユーザー活性化:初めての利用でユーザーにプロダクトを面白い!と感じてもらう)
・Retention(継続:ユーザーが繰り返しサービスを使うようにする)
・Referral(紹介:ユーザーがサービスを周りに紹介するようにする)
・Revenue(収益:ユーザーがより多く課金行動を取るようにする)

 

ざっくり言うと、この5つの中で改善の優先順位をつけて、そこにフォーカスして高速にPDCAを回していく。
なので最初にどこがネックになっているのかを分析して、仮説とKPIを設定し、設計して検証して…、ということのよう。

マーケティングに関してだけでなく、開発に関してもこれが適用できる。というか、一緒に考えないと意味がない。
UIだったりUXだったり、極論言うとサービスの仕様がガラッと変わったりすることもある。

 

この手法で成功しているのが、TwitterFacebookDropboxなど(探すとたくさん出てくる)。
Twitterなんか最近アップデートするたびに改悪だのなんだのボロクソ言われているけれど、やっぱりすごいサービスなんだな。

 

おわりに

 

どんなサービスでも成長し続けていかないといけないので、この手法や概念は会社やサービスの大小に関わらず大事だな、と感じましたし、よくわからない先入観で好き嫌いするの意味わかんないしやめた方がいいな…と反省しました。

自分がこれからエンジニアとして働く時にも意識していきたいです。

とりあえず今回は軽くまとめたので、時間がある時に勉強したり、インターン先でも実務と共にさらに勉強できたらいいなと思います。

 

あと、こちらの記事も参考になりました(図がとてもわかりやすかったです)

dentsu-ho.com

 

 

 

【TED】The mind behind Linux

 

初めてのTEDはこちら。

"The mind behind LinuxLinuxの背後にある精神)"

www.ted.com

 

リーナス・トーバルズ
LinuxとGitを作った人。

その彼に質問者がいろいろ聞いていくという、対話形式のTEDだった(珍しい)。

 

3点まとめ

LinuxやGitは自分のために作っていたプロジェクトだった。

オープンソースの好きな点は、「異なる人が一緒に働けること」

・彼は、自分が「ビジョナリー」ではなく「エンジニア」なので、技術やトレンドがこの先どうなるかを予想するのではなく、今目の前の問題を解決したいと思っている

 

感想

まず彼の人柄がいい。


すごいことをやっている人なのに、傲ることもなく、かといって卑下するわけでもなく。

それと少し気になったのが、彼のワークスペースがとてもシンプル。
動画の中に写真が出てくるんだけど、机の上にディスプレイとキーボードとライトだけ置いてあって、本体は離れた場所にある。

壁は薄い緑色で(本人はこれを「精神病院で使われる色」と言ってた(笑))、とても目に優しい。

これらは彼がそうしたくてやっていることで、
例えばPC本体のファンの音が嫌だから遠くに置いていたり、目への刺激を少なくするために薄緑色の壁にしている。
しかも机は、立って操作するような高さにある。立って作業する派なんでしょうね。

 

思ったより「プログラミングが楽しいと思っている普通のエンジニア」だった

Linuxはもともと彼自身が自分のためにやっていたプロジェクトだった。
自分が欲しくて、あるいはやってみたくて作っていた。

でもやっているうちに「これ作ったから見て!」と周りに見せてフィードバックが欲しくなった。
公開していたらいろんな人が集まって来てフィードバックくれていい感じになって、ついにオープンソース化。
プロジェクトに関わる人数も増えていき、徐々に成長していった。

 

この流れって、エンジニアだけじゃなくクリエイターなら誰でもありえるというか、「わかる」ってなることだと思う。
さすがにオープンソース化まではそうそう行かないけど。

でも自分が作ったものを見せたくなるのも、フィードバックもらってブラッシュアップしていくのも、ものづくりもする人ならやりたくなることだと思うのでとても共感できた。

それ以外にも彼が普通にエンジニアだなあと思える部分がいくつかあって、
例えば彼はもともとプログラミングを楽しみながらやっていたこと。
最初から偉大ですごいもの作るぞ!って決めて始めたんじゃなく、楽しいから、好きだからという気持ちでやっていた。

あとは技術にまっすぐで、リアルなコミュニケーションがあまり好きではないところ。
理系やエンジニアにはいわゆる「コミュ障」みたいなイメージが持たれているし実際そういう人は多いんだろうけど、彼も人付き合いは得意ではないらしくて、
「やり取りはメールの方がいい」と言っていたし、なんというかそれっぽさがあった笑。

 LinuxとかGitなんてすごいもの作った人なんだから、もっとこうジョブズみたく堂々としている人で、大きな問題解決に積極的に取り組んでいる人だと勝手に想像してた…

 

彼の見習いたい部分

私が彼のことを見習いたいと思ったところは、彼自身が言っていた「諦めない、頑固なところ」。
作っている途中で「もういいや、他のいけてるものを作ろう」とはならないらしい。

これ結構大事だと思うし私はそこまで我慢強くないので真似したいなあと思った。

  

プログラミングにおける「センス」

って私みたいな理系じゃないのにプログラミングをやっている人にとってとてもひやりとすることで、
楽しくてやっているけど向いていない可能性もある。

彼は、プログラミングにおけるセンスとは「ある問題を、違った見方をして書き換えることで、特殊ケースを一般ケースに変えられること(=いいコードを書くこと)。また、大きなパターンを見て取って、直感的に正しいやり方がわかること」って言ってる。

前者は少し難しいけど、後者はわかる。
わからないとクソコード量産することになるし…

彼はセンスと言ってるけど、私は磨いて伸ばせる部分だと思うんですけどね。

オープンソースという考え方はもうすっかり実現されているか

彼は「どっちとも言えないな〜」って言っている。

個人的には、ただ動くコードを公開したりするだけでなく、新しいオープンソースの形が生まれるんじゃないかなと思っている。

それはIT・エンジニアリングの世界だけでなく、他の業界でもありえることだし、
もっと世の中にオープンソースのものが増えればさらに多くの画期的なコンテンツが生まれて豊かになるんじゃないかなと。

利益やビジネスの問題は置いといて。

 

最後に

この動画、16分くらいあって実は途中で寝ながら聞いてた笑。

それと書いていて思ったのは、文章書くの下手だなーってことと語彙力がないなってこと。

そもそも考えたことを吐き出しているだけなので美しくて読みやすいものでないのはそうなんだけど、
伝わりやすいようにどういった書き方をするのか、ってことが全く考えられていないような感じがする。。
動画見終わってからはうお〜〜〜ってたくさん頭の中で思考がぐるぐるするんだけど、それをうまく言語化してアウトプットできない。
文系なのに相手に伝わる文章書けないとか終わってる(文系理系の問題ではないが)。

 

でもまあ、それはおいおい書きながら訓練していきたい。

 

おわり