読者です 読者をやめる 読者になる 読者になる

今日の作業ログ

これは作業ログです。

作業内容

今日はwebpack hot module replacementの設定をしました。

今作っているやつのpackage.jsonとwebpack.config.jsを触っていました。

package.json

{
  "name": "frontend",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "webpack-dev-server",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "actioncable": "^5.0.0",
    "babel-core": "^6.18.2",
    "babel-loader": "^6.2.7",
    "babel-preset-es2015": "^6.18.0",
    "babel-preset-react": "^6.16.0",
    "material-ui": "^0.16.5",
    "normalize.css": "^5.0.0",
    "react": "^15.3.2",
    "react-dom": "^15.3.2",
    "react-redux": "^4.4.5",
    "react-tap-event-plugin": "^2.0.1",
    "redux": "^3.6.0",
    "redux-thunk": "^2.1.0",
    "webpack": "^1.13.3",
    "webpack-dev-server": "^1.16.2",
    "webpack-init": "^0.1.2",
    "whatwg-fetch": "^2.0.1"
  }
}

webpack.config.js

var webpack = require('webpack');

module.exports = {
  entry: './app/index.js',
  output: {
    path: '/',
    filename: 'bundle.js',
    publicPath: '/'
  },
  module: {
    loaders: [
      { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
    ]
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
  ],
  devServer: {
    port: '4000',
    contentBase: './build',
    inline: true,
    hot: true
  }
}

ハマったところ

f:id:kytiken:20170209234714p:plain

Uncaught Error: [HMR] Hot Module Replacement is disabled. とか言われてブチギレていました

  plugins: [
    new webpack.HotModuleReplacementPlugin(),
  ],

を書いていなかったのが原因でした。

以上

scaffolds.scssを作らなくする方法

あなたはRuby on Railsでアプリケーションを作るときにscaffolds.scssが要らないフレンズなんだね

ご無沙汰しています。

最近「けものフレンズ」というアニメにハマっているちけんです。

今日は小ネタです。

忙しい人のために、先に結論を書く

config/initializerに下記のファイルを置く

gist.github.com

以下詳細

概要

Rails

bundle exec rails g scaffold Hoge fuga

としたときに app/assets/stylesheets/scaffolds.scss というファイルが作られます。

このファイルは、例えばバリデーションを入れたときの表示をこのようにクソダサにしてくれます。

f:id:kytiken:20170208214841p:plain

要らないので生成しなくしたい。

方法

config/initializersに以下のようなファイルを作ったら作られないです

gist.github.com

参考

Rails scaffold without the css file? - Stack Overflow

以上

javascriptで3*0.1が0.30000000000000004になる件について(小数点つきの計算)

タイトルに書いたとおりですが、 javascriptで3*0.1が0.30000000000000004という結果が返ってきます。

そんなバカなと思って調べたのですが、どうやら仕様とのこと。

blog.asial.co.jp

そうは言っても僕は3*0.1をしたら0.3が返って欲しい。

そこでMath.jsというライブラリを導入して解決しました。

方法

今回はwebpackからMath.jsをインストールして計算する方法のサンプルを書きます。

今回のサンプルコードはこちら

javascript 3*0.1=0.30000000000000004 · GitHub

npmでインストールします。 mathjs.org

npm install mathjs --save

index.jsに下記を追加

var math = require('mathjs');
math.config({
  number: 'BigNumber',
  precision: 64
});

math.js | an extensive math library for JavaScript and Node.js

そしてこうすると0.3が返ってきました

math.eval('3*0.1')

完成版はこちら

gist.github.com

以上

macOS Sierraでメニューバーを暗くする

これを

f:id:kytiken:20161016221100p:plain

こうする

f:id:kytiken:20161016221133p:plain

 

方法

システム環境設定を開く

一般を開く

f:id:kytiken:20161016221403p:plain

「メニューバーとDockを暗くする」のチェックをつける

f:id:kytiken:20161016221528p:plain

以上

最近pocketを使うようになりました。

いまさらですが、pocketを活用するようになった話。

あとで読む系のサービスの定番pocketですが、アカウントをとりあえず登録してはいたものの、あまり使わずに放置していました。

そんな僕がなぜいまさら使うようになったのかという話をします。

getpocket.com

 

最近の僕の情報収集(ネットで)

僕の情報収集は主に2系統になっています。

Twitterfacebookで流れてくるURLを開くパターンとgoogleで検索して出てきたページを開くパターン。

このパターンは昔から変わってないのですが、最近の僕の傾向としてはiPhonechromesafariのタブで開くということが多くなっていました。

その中であとから読まなさそうというものはタブを消して、読みそうなものはタブを残すというのをしていました。

あとで読もうと思っているものをタブで開いて残す運用

そんなことをしていたら当然chromeのタブは増える一方でして、増えていくタブの個数を見ながら「あぁ〜なにかの拍子にiPhonechromeがクラッシュしたらまずいなぁ〜」とか思いながらも、「まあ今までなんとかなってるんだし大丈夫でしょう」なんて楽観的に考えていました。

余談ですが、iPhonechromeは今開いているタブの個数が見えるようになっていますが、100個目以降は「:)」になってしまって、今何個タブを開いているのかわからない仕様になっています。

pocketに全部ぶち込んだ

そんなことをやっていたのですけど、いくつか理由があってpocketに開いているタブを入れました。

その理由ですがだいたい下記のようなもの

・さすがに前時代的すぎるだろう

iPhoneで読んでいたページをiPadで読みたいという場面が出てくるようになった

・「あの記事なんだっけ?」といって思い出す場面が増えてきた。

よかったこと

chromeのタブが消えた

iPhoneで読んでいたページをiPadで読むのが楽になった

スマホ対応じゃないページが読みやすくなった

・5割くらい読んでよさそうだったらpocketに入れてあとで読むというのはやっぱり楽

悪かったこと

・記事の取得ができないものがある

・URLだけ記録するほうがいい場面では不向き

 

まとめ

pocket便利

 

もう何回目かわからないけれど、ブログ再開しよう

しばらくブログを更新していないと、「いまさらブログ再開してもしょうがない」という気持ちが働いて、なかなか書く気が怒らなかったのだけれど、頑張って書こうと思います。

 

カジュアルに記事を投稿したい。

Deviseの登録情報をカスタマイズ

ご無沙汰しています。ちけんです。

 

Railsのユーザー認証に使われるDeviseというGemがあります。

f:id:kytiken:20160501152022p:plain

GitHub - plataformatec/devise: Flexible authentication solution for Rails with Warden.

ジェネレータで作られる登録フォームは"email"と"password"と"password confirm"しか作られません。

 

この記事では、登録フォームをカスタマイズして独自の項目を保存できるようにする方法を紹介します。

 

なぜしようと思ったか

そもそもDeviseのジェネレータで作られる登録フォームは最小限です。

例えばTwitterの登録画面と比較してみると、結構違うことがわかります。

f:id:kytiken:20160501122808p:plain

私たちはTwitterの登録画面を作りたいわけではないですが、しかし、しばしばユーザーの名前を追加したかったり、電話番号を追加したかったりします。

 

僕がDeviseで作ったUserモデルに名前と電話番号を追加するのに、どうしたのかを書いていこうと思います。

 

Railsアプリケーションを作る

サンプルとなるRailsアプリケーションを作ります。

ここでは例としてhogefugapiyoアプリケーションというのを作って解説しようと思います。

ちなみにバージョンは下記のとおり

Rails 4.2.6

Devise 4.0.1

 

rails new hogefugapiyo
cd hogefugapiyo
# Gemfileにdeviseを追加
echo "\ngem 'devise'" >> Gemfile
bundle install
bin/rails generate devise:install
# Userモデルを作る
bin/rails generate devise user

 カラムを追加する

何はともあれ、名前と電話番号をUserモデルに追加します。

bin/rails generate migration AddNameAndTelToUsers name tel
bin/rake db:migrate

フォームを変更する

Deviseのカスタムビューを生成します。

bin/rails generate devise:views user

 すると下記のようなapp/views/users以下にファイルが作られます。

f:id:kytiken:20160501135041p:plain

いろいろファイルがありますが、登録フォームはapp/views/users/registrationsの2ファイルです。

名前と電話番号を追加します。

 

edit.html.erb

gist582ea89584651909f7921c357f96e129

 

new.html.erb

gistbfe64cf9867b6102a5fb6d6fd0bd84c4

 

こんなふうになる

f:id:kytiken:20160501153820p:plain

保存処理を変更する

保存処理を変更するためにカスタムのコントローラーを作ります。

rails g devise:controllers users

 

config/routes.rbを修正して登録処理にカスタムのコントローラーを使用するようにします。

gist3ce1e703a0bd6d1fb351fe1bf9623972

 

app/controllers/users/registrations_controller.rbを編集します。

 

registrations_controller.rb

gistf2478670bf287af9fd640add0db5ca08

 

registrations_controller.rbの解説 

ポイントとなるのは以下の部分

before_action :configure_sign_up_params, only: [:create]
before_action :configure_account_update_params, only: [:update]
(中略)
 # If you have extra params to permit, append them to the sanitizer.
  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end

  # If you have extra params to permit, append them to the sanitizer.
  def configure_account_update_params
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
  end

ここで新たにフォームに追加したnameを追加しています。

 

    
  def build_resource(hash=nil)
    super(hash)
    if params['tel'].present?
      first_number = params['tel']['first']
      center_number = params['tel']['center']
      last_number = params['tel']['last']
    end
    self.resource.tel = "#{first_number}-#{center_number}-#{last_number}"
  end

  def update_resource(resource, params)
    super(resource, params)
    if params['tel'].present?
      first_number = params['tel']['first']
      center_number = params['tel']['center']
      last_number = params['tel']['last']
    end
    self.resource.tel = "#{first_number}-#{center_number}-#{last_number}"
  end

この部分でtelを設定しています。

ストロングパラメーターを使わずに値を設定したいのでこのようにしています。

 

親クラス(Devise::RegistrationsController)のメソッドを上書きして、こんなような処理を実現するようにしています。

 

おわりに

僕はこんなふうにしましたが、もっと良いやり方があれば教えてほしいので、だれか記事にしてください。

registration_controller.rbのbuild_resourceとupdate_resourceを上書きしていますが、デフォルトのコメントに入ってなかったのであんまりいいやり方ではないのかもしれません。