新しいRailsプロジェクトを作成する

何も思い出せなかったので、自分のメモ用です。
こうしたほうがいいよって部分があれば教えていただきたいです。

前提

  • rbenvを使用している
  • 既存のRailsプロジェクトとは違うバージョンのRailsを使用する
  • Ruby2.3.0+Rails4.2.5を使用する
  • 作成するアプリ名は「hoge」とする

実際の作業

現在のRubyのバージョンを確認。

$ rbenv versions
  system
  2.1.2
* 2.1.5
  2.2.2

2.3.0がインストールできるバージョンの一覧にない。

$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  ・・・(略)・・・
  2.2.0
  2.2.1
  2.2.2
  2.2.3
  2.3.0-dev
  jruby-master+graal-dev
  jruby-1.5.6
  ・・・(略)・・・

ruby-buildをupdateする。

$ brew upgrade ruby-build
==> Upgrading 1 outdated package, with result:
ruby-build 20160130
==> Upgrading ruby-build
==> Installing dependencies for ruby-build: pkg-config, openssl
・・・(略)・・・
🍺  /usr/local/Cellar/ruby-build/20160130: 196 files, 110.1K, built in 4 seconds

2.3.0がインストールできるバージョンの一覧に出た!

$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  ・・・(略)・・・
  2.2.4
  2.3.0-dev
  2.3.0-preview1
  2.3.0-preview2
  2.3.0
  2.4.0-dev
  jruby-1.5.6
  jruby-1.6.3
  ・・・(略)・・・

Ruby 2.3.0をインストール

$ rbenv install 2.3.0
Downloading ruby-2.3.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.bz2
Installing ruby-2.3.0...
Installed ruby-2.3.0 to /Users/****/.rbenv/versions/2.3.0

インストールされたことを確認

$ rbenv versions
  system
  2.1.2
* 2.1.5
  2.2.2
  2.3.0

使用するRubyのバージョンを2.3.0に切り替える

$ rbenv global
2.1.5
$ rbenv global 2.3.0
$
$ rbenv versions
  system
  2.1.2
  2.1.5
  2.2.2
* 2.3.0

Railsのgemをインストール(最新が欲しかったので、バージョン指定なし)

$ gem install rails --no-document
Fetching: railties-4.2.5.1.gem (100%)
Successfully installed railties-4.2.5.1
Fetching: rails-4.2.5.1.gem (100%)
Successfully installed rails-4.2.5.1
2 gems installed

--no-document については下記URLを参照。
gemのインストールで`--no-document`を付けると77倍早い - Qiita

カレントディレクトリにRailsアプリケーションを作成(READMEのみのリポジトリが作成されていたため、事前にgit cloneしておいた)

$ rails new . -d mysql
       exist  
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      create  app/assets/javascripts/application.js
      create  app/assets/stylesheets/application.css
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      ・・・(略)・・・
         run  bundle install
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies.....
Installing rake 10.5.0
・・・(略)・・・

起動してみる

$ rails s
=> Booting WEBrick
=> Rails 4.2.5.1 application starting in development on http://localhost:3000
・・・(略)・・・

ActiveRecord::NoDatabaseErrorになる。
→まだDBを作成してないから当たり前。

DBを作成する。

$ rake db:create
$ 
$ #databeseが作成されたことを、mysqlコンソールから確認する。
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.6.27 Homebrew

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+----------------------------------------+
| Database                               |
+----------------------------------------+
| mysql                                  |
| hoge_development                       |
| hoge_test                              |
+----------------------------------------+

再度 rails s で起動し、http://localhost:3000/ にアクセスすると、下記のような画面が表示される。

f:id:maetoo11:20160223144247p:plain

アプリケーションの作成はここまで。

Geek Women New Years Party 2016 でLTをしました

Geek Women New Years Party 2016というイベントが先週の金曜日(1/15)に開催され、 イベントの中でLTをさせていただきました。

eventdots.jp

LT内容について

www.slideshare.net

私が働いている会社のCTOについてお話しました。
発表後に「CTO素敵ですね!」と声をかけていただいたのが嬉しかったです。
ほんとうに、うちのCTOは素敵なんですよ!!!

ペコッターについて

よくお声がけしていただくのですが、 私はペコッターの開発者ではありません。
ペコッターのキャラクター「はらぺこ君」が大好きすぎて、はらぺこエヴァンジェリストを勝手に名乗っています。

お菓子神社について

下記の記事を参考に、社内にオフィスグリコのようなお菓子置き場を作っています。
チーム開発 - 3年くらいお菓子神社運営してきた - Qiita
オフィスグリコよりも、もっと少量を気軽に食べられる状態をつくりたいと思って始めました。


女性がたくさん集まったキラキラしたイベントでした(・∀・)
女性のコミュニティ、色々あるんですねー。

重複したレコードのINSERTを防止する

前にやっていたブログから移行してきた記事です。

idとcreated_atだけが異なるレコードが重複して登録されることがあって困っていた。
同じレコードがないときはINSERT、同じレコードがある場合はUPDATEが実行されるようにしたい。
例として以下の様なテーブルを用いて説明する。

work_itemsテーブル

id created_at work item user
1 2015-08-25 14:59:00 1 ホチキス やまだ
2 2015-08-28 19:04:00 1 はさみ たなか
3 2015-08-28 19:35:00 2 はさみ やまだ
4 2015-08-28 21:15:00 2 はさみ たなか

※例のためのテーブルなので構成がテーブルとしておかしいです。

下記を参考に実装する。
MySQL で INSERT と UPDATE を1文で実現する ~ ON DUPLICATE KEY UPDATE 編~ | UB Lab.

MySQLのユニーク制約とは?
ユニークキー制約(UNIQUE) - テーブルの作成 - MySQLの使い方

今回はworkとitem両方が同じものは登録したくない。
→workとitemの2つでユニークになるようにしたい。

複数カラムにユニーク制約をつけたい!
ActiveRecord4のバリデーションで複数カラムにユニーク制約を付ける方法
Rails でユニーク制約 - @tmtms のメモ

元々存在するテーブルなので、ユニーク制約を追加する。

class AddUniqueToWorkItem < ActiveRecord::Migration
  def change
    add_index :work_items, [:work, :item], :unique=>true
  end
end


・・・ちょっとまった!!!
元々workとitemが重複しているレコードがあるのに後からユニーク制約つけようとしたらmigrateはどうなるんだ?!?!

実際にやってみた!

Mysql2::Error: Duplicate entry '21-3' for key 'index_chat_work_items_on_work_and_item': CREATE UNIQUE INDEX `index_chat_work_items_on_work_and_item`  ON `work_items` (`work`, `item`) /test/db/migrate/20150831000000_add_unique_to_work_items.rb:3:in `change'

わーい(∩´∀`)∩ワーイ
落ちたー!

『ALTER IGNORE』を使えば大丈夫そうだ!
複数カラムでユニークキーを作る - 揮発性のメモ

過去データが書き換わってしまう(重複していた場合は先にあるほうが残る)がOKであるかはサービスやプロジェクトによると思います!

class AddUniqueToWorkItem < ActiveRecord::Migration
  def up
    sql = "ALTER IGNORE TABLE work_item ADD UNIQUE duplicate_prevent (work, item);"
    ActiveRecord::Base.connection.execute(sql)
  end

  def down
    sql = "ALTER TABLE work_item DROP INDEX duplicate_prevent;"
    ActiveRecord::Base.connection.execute(sql)
  end
end


これであとはINSERTするときにON DUPLICATE KEY UPDATEすればOKだ♪

now = Time.now.strftime("%Y-%m-%d %H:%M:%S")
query = "INSERT INTO `work_items` (`created_at`, `work`, `item`, `user`) VALUES ('%s', %d, %s, %s) ON DUPLICATE KEY UPDATE created_at = `%s`"
query = query % [
  now,
  [workの値],
  [itemの値],
  [userの値],
  now
]
ActiveRecord::Base.connection.execute(query)


・・・と思ったら、パーティションロックがかかるらしいorz
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5.3 INSERT ... ON DUPLICATE KEY UPDATE 構文

該当テーブルのINSERTでユニーク制約違反例外が発生したときに無視する、という方針に変更。

begin
  WorkItem.create(
    work:    [workの値],
    item:     [itemの値],
    user:     [userの値]
  )
rescue ActiveRecord::RecordNotUnique => exception
  # ユニーク制約違反は無視する
end

これで重複記録はなくなるはず。


メモ

hubotをHerokuからAWSのEC2へお引っ越し、そして常駐化

前にやっていたブログから移行してきた記事です。

Herokuが課金されちゃうよ☆というメールが来るのでEC2へお引っ越しすることに。
EC2はセットアップ済みでした。

こちらを参考にしました。
Hubot を Amazon EC2 にセットアップし、Slack と連携する! - Qiita


Amazon Linuxにログインする。
hubot用のディレクトリを作成し、botのコードをgithubからpull。

Node.jsをインストール

$ sudo yum -y install nodejs npm --enablerepo=epel

※npmがないとhubotさんやCoffeScriptがインストールできない。

HubotとCoffeeScriptをインストール

$ npm install -g hubot coffee-script


botのディレクトリでnpm install

$ npm install

下記のようなエラーが出たので、node-gypをインストール

> node-gyp rebuild
Traceback (most recent call last):
  File "/usr/bin/gyp", line 15, in <module>
    import gyp
ImportError: No module named gyp
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit 
・・・
$ npm install -g node-gyp

bin/hubotで起動しようとしたらWarningが出て起動しないので、momentをインストール。

hubot> [Wed Aug 12 2015 03:14:08 GMT+0000 (UTC)] ERROR Unable to load /home/ec2-user/mybot/scripts/example: Error: Cannot find module 'moment'
  at Function.Module._resolveFilename (module.js:338:15)
  at Function.Module._load (module.js:280:25)
  at Module.require (module.js:364:17)
  at require (module.js:380:17)
・・・

※下記を参考にしました。
Node.js - throw new Error("Cannot find module '" + request + "'"); - Stack Overflow

$ npm install moment --save


無事起動!!ヽ(=´▽`=)ノ

Slack用アダプタをインストール

$ npm install hubot-slack --save


Slackのトークンを設定
一番上に貼ったQiitaの記事だとSlack側の設定画面とか内容がちょっと古いので下記を参考にしました。
SlackのHubot Integrationが知らぬ間にアップデートされてた - Qiita

$ export HUBOT_SLACK_TOKEN=Slackの設定画面で指定されたトークン


hubotを起動

$ bin/hubot -a slack

f:id:maetoo11:20160103212703p:plain

これで引っ越し完了!
・・・と思ったらこいつ常駐化しない∑(゚д゚lll)ガーン
定期的に落ちるorz

下記を参考に常駐化させます。
Hubotをインストール、hipchatと連携し、foreverでデーモン化(CentOS6.4) - Qiita

foreverをインストール

$ npm install forever -g


起動用のシェルrun.shを作成

#!/bin/bash

export HUBOT_SLACK_TOKEN=Slackの設定画面で指定されたトークン
forever start -c coffee node_modules/.bin/hubot --name hubot -a slack

botのディレクトリ直下に作成しました。

run.shを実行するとhubotが常駐化します。

$ ./run.sh

プロジェクトのRubyバージョンがアップデートされていたときにやったこと

前にやっていたブログから移行してきた記事です。

しばらく見ていない間にプロジェクトのRubyバージョンがアップデートされていました。
どうすればいいか分からなくなって焦ったのでまとめておきます。

rbenvやらHomebrewやらはインストールされている前提。

# バージョン一覧の表示
$ rbenv install --list
Available versions:
  1.8.6-p383
  1.8.6-p420
  ・・・
  2.1.5 ←今回は2.1.5をインストールします
  2.1.6
  2.2.0-dev

# Rubyのインストール
$ rbenv install -v 2.1.5
Downloading ruby-2.1.5.tar.gz...
HTTP/1.1 200 OK
・・・
Installing ruby-2.1.5...
checking build system type...
checking xxxxxxx
・・・

# bundlerをインストール
$ gem install bundler
Fetching: bundler-1.10.6.gem (100%)
・・・

# 必要なバージョンのgemをinstall
$ bundle install
Fetching gem metadata from http://rubygems.org/........
・・・
Installing rake 10.3.2
Installing i18n 0.6.9
Installing xxxxxxxxx
・・・

# 使用するRubyのバージョンを切り替える
$ rbenv rehash
$ rbenv versions
  system
* 2.1.2
  2.1.5 (set by /Users/hoge/.rbenv/version)
$ rbenv global 2.1.5
$ rbenv versions
  system
  2.1.2
* 2.1.5 (set by /Users/hoge/.rbenv/version)

以上です!


上記とは別の話ですが、各アプリはこまめにアップデートしたほうがよいのですね。

# Homebrewでインストールしたものをアップデート
$ brew upgrade

homebrewアップデート/アンインストール - CROSS HOPE

レディなエンジニアへ!ネイルのススメ♡

この記事は
Geek Women Advent Calendar 2015 - Adventar
2日目の記事です。


みなさんは「ネイル」というとどのようなことを思い浮かべますか?
私は「ネイル=キラキラ女子がするもの」というイメージを持っていました。
しかし、今年の8月頃に何事もチャレンジ!という思いでジェルネイルをしてみたところ、キラキラ女子じゃないエンジニアとしてもメリットがあったので女性エンジニアのみなさんにオススメしたいと思います。

筆者情報

  • 女性エンジニア
  • ベンチャー企業勤務
  • 最近オフィスが表参道になりました
  • キラキラ女子度: 低めです
    具体例)週の半分くらいはほぼスッピンで出社しています

ネイルをしてよかったこと

綺麗とか可愛いという利点は置いていて、それ以外の良かったことを書き出します。
ちなみに、ネイルをしたおかげで昨日まで動かなかったコードが動くようになったというような奇跡は起こりませんでした。

爪をむいたり噛んだりする癖がなくなった

ジェルネイルは爪にジェルを塗り、専用のライトをあてて硬質化させます。
そのため、そのままの爪に比べ、爪が丈夫になるのです。

私には小さい頃から、考え事をしたりイライラしたりすると爪をむいたり噛んだりしてしまう癖がありました。
残念なことにそれは就職してからも直らず、エラーログを追いながら爪をむく、思い通りに動かないスクリプトデバッグしながら爪を噛むなどしており、1ヶ月の半分くらいは爪がボロボロという状態でした。
しかし、ジェルネイルをしてからは硬くてつるつるの爪なのでむくことも噛むこともしなくなりました。

ネイルが女性と話すきっかけになる

爪を綺麗にしていると、女性と話すきっかけになります。
「わーネイル可愛いですね」と話しかけてもらったときは、ファッション誌でしか見たことなかった会話が自分の身にも起こった!と感動しました。

タイピングで爪が割れなくなった

私はタイピングが荒い上に爪が弱くて、タイピング中に爪が欠けたり割れたりすることがありました。
ネイルを始めてからはまだ1回も割れていないです。

残念ながら、タイピングがソフトになったわけではなさそうです。
(たまにEnterキーを押す勢いで机が揺れています)

ネイルを続ける方法

でもネイルサロンってこまめに通わなきゃいけないんでしょ?面倒だなぁ・・・。と思ったあなた!
はい、通うのは面倒です。
ここでは面倒くさがりな私なりに考えたネイルを続ける方法を紹介します。

自宅最寄り駅からの帰り道中にあるネイルサロンに通う

帰宅途中に寄れるのであれば、通う面倒くささが1/3くらい減ります。

ネイルブックでデザインをあらかじめ選ぶ

ネイルサロンでかかる時間を短縮するために、デザインをあらかじめ決めてからサロンに向かうのがオススメです。
ネイルをオフ(落とす)時間や爪をケアする時間は減らせませんが、デザインを決める時間は減らせます。

私は、ネイルブックというネイルデザインを集めたアプリを使用して、こういうデザインにチャレンジしたいというのを隙間時間に考えておきました。
ネイルブックは、自分の気に入ったデザインをクリップ(お気に入り登録)しておくことができるので便利です。

nailbook.jp

Web予約

電話をしなくて済むので予約の気持ち的なハードルが下がります。

チャレンジしたネイル

ここでは私がチャレンジしたネイルのデザインを紹介します。
初回の写真は撮っていなかったのでありません。

2回目 3回目
4回目 5回目
6回目

まとめ

可愛いだけじゃない、女性エンジニアとしてもメリットがあるネイル。
皆さんもはじめてみませんか?
綺麗な指先から生み出されるコードはきっと美しいはず・・・!

女性エンジニア+ネイル=レディなエンジニア
を目指したいと思います♡

♡おまけ♡

ネイルで爪を綺麗にしたら、ちょっと良いお店にご飯を食べに行きましょう!
そんなときにはペコッターというグルメQ&Aアプリでお店を探すのがオススメです☆
素敵なネイルで楽しい女子会♡というのもいいかもしれないですね。

pecotter.jp