ウェブサービスを作っています。

Git のコミット前に sass-lint を実行する

昨日の記事 の続きです。 sass-lint -v を手動で実行するのは大変なので、git commit 時に自動実行するようにします。 必要なツールのインストール。 yarn add lint-staged husky --dev package.json に以下を追加。 { "scripts": { "precommit": "lint-stag…

sass-lint を導入する

CSS は、Sass (*.sass) で書いているのですが、プロパティの順番をアルファベット順にしたくて sass-lint を導入してみました。 インストール npm install -g sass-lint .sass-lint.yml。便利そうな設定もいくつか追加。 必要最低限の設定にしたいので、merg…

法人本店移転の手順

一人で会社をやっていて、管轄法務局が変わる法人移転をする場合の方法メモです。 メインタスク 移転前の法務局に行く (相談窓口があります) 登記移転をする 「移転後」の法務局で、印鑑カードの交付申請をする 移転前の税務署に、異動届を出す 移転前の都税…

全角や空白を含む問い合わせ番号でも検索できる Elasticsearch の analyzer

elasticserach-rails での設定例です。 settings( analysis: { filter: { whitespace_remove: { type: 'pattern_replace', pattern: "\\p{javaWhitespace}", replacement: '' } }, analyzer: { my_code_analyzer: { type: 'custom', filter: [ 'icu_normaliz…

実際の DB データをテストで使用する

Rails で開発していると、実際に使っている DB のデータを、テストで使用したい場合があります。 そのような場合、seed_dump と activerecord-import を使ってうまく実現することができました。 Gemfile group :development do gem 'seed_dump' end group :t…

ふるさと納税の返礼品検索サイト「ふるふる」を作りました

ふるさと納税の返礼品を検索できる「ふるふる」というサービスを作りました。 ふるふる ふるさと納税のポータルサイトはいくつかありますが、 できるだけ多くの返礼品を検索できる ごちゃごちゃしていない 簡単に検索できる サイトがほしいと思い、開発に至…

elasticsearch-model で eager loading を行う

elasticsearch-model v0.1.9 で確認しました。 response = Article.search.tap { |r| r.records.options[:includes] = [:comments] } response.records.each do |article| article.comments # eager loaded end #records の引数で指定することもできます。 A…

Kaminari で、最大ページ数を指定する

Kaminari v0.17.0 で確認しました。 ページングされすぎて、サーバに負担がかかる場合などに便利です。 config/initializers/kaminari.rb Kaminari.configure do |config| config.max_pages = 100 end これで、ページネーション用のリンクなどが 100 ページ…

新生銀行に自動ログインする Google Chrome の拡張機能を作りました

以前、新生銀行に自動ログインするユーザースクリプトというものを書いたのですが、Chrome のセキュリティレベルが上がり、動かなくなってしまいました。 そこで今回、拡張機能としてきちんと作りなおしてみました。 Shinsei Power Direct AutoFill - Chrome…

「Elasticsearch: The Definitive Guide」が良い

検索まわりに強くなりたくて、最近は Elasticsearch の勉強をしています。 ただ、ブログの記事や日本語の書籍 (↓) は、情報が古かったり断片的な情報で、いまいち全体像をつかむことができませんでした。 高速スケーラブル検索エンジン ElasticSearch Server…

elasticsearch:import タスクで eager loading を行う

elasticsearch-rails には、DB のデータを Elasticsearch にインポートするelasticsearch:import という便利な rake タスクがあります。 ただ、has_many などで関連しているデータもインデックスしたい場合に rake environment elasticsearch:import:all FOR…

iTerm2 上の Emacs で、テーマの色を適切に表示する

mac

iTerm2 で Emacs を起動し (emacs -nw)、 テーマを選択すると、適切な色が表示されないことがあります。 調べたところ、iTerm2 の開発版と、パッチを当てた Emacs を使用することで直すことができました。 以下、Homebrew を使用していて、環境変数 TERM が …

できるだけ簡単に ActiveRecord で utf8mb4 を動かす

MySQL で絵文字を扱うのに必要な utf8mb4 の設定方法です。 新規にデータベースを構築する場合向けです。 Rails 4.2.6 で確認しています。 データベースの設定 config/database.yml default: &default adapter: mysql2 encoding: utf8mb4 collation: utf8mb4…

active_decorator-rspec gem が便利

Active Decorator の decorator 内で、ヘルパーのメソッドを使っていると、テストをうまく書けないという問題があります。 今までは、 active_decorator のdecoratorをrspecでテストする方法 - アジャイルSEを目指すブログ を参考にさせていただいていたので…

最新版の Redis を wercker で使う

wercker/install_redis.sh if [ ! -d "$WERCKER_CACHE_DIR/redis" ] then mkdir $WERCKER_CACHE_DIR/redis fi if [ ! -f "$WERCKER_CACHE_DIR/redis/redis-3.0.2.tar.gz" ] then cd $WERCKER_CACHE_DIR/redis wget http://download.redis.io/releases/redis-…

RSpec で Active Job のテストを書く

追記(2016/11/11 10:33): この記事の内容は古くなっており、あまりおすすめしません。RSpec 公式の方法をお使い下さい。 have_been_enqueued matcher - Matchers - RSpec Rails - RSpec - Relish have_enqueued_job matcher - Matchers - RSpec Rails - RSpe…

Chef Solo で全ノードに適用する

cd chef-repo find ./nodes -name "*.json" -type f | xargs -n 1 basename -s .json | xargs -n 1 knife solo cook

エラー監視サービス「Rollbar」を使う

エラー監視サービス「Rollbar」の設定メモです。 同種のサービスと比べて、無料なのにサイト登録数が無制限というメリットがあります。 エラー発生数によって課金されますが、監視頻度を設定することで、課金を抑えることができます。 タイムゾーンの設定 プ…

CarrierWave で ConoHa オブジェクトストレージを使う

転送量無料で 100GB あたり 450 円/月という ConoHa オブジェクトストレージ を CarrierWave から使う方法です。 公開設定にすることで、画像サーバとして使うことができます。 CarrierWave のバージョンは 0.10.0、fog のバージョンは 1.24.0 で確認してい…

jpmobile で、スマホビューが表示されるかどうかをコントローラから調べる

jpmobile のバージョン 4.1.2 で確認しています。 lookup_context.mobile.include?('smart_phone')

Sass でレスポンシブデザイン

@mixin sp-view @media only screen and (max-width: 767px) @content こういう mixin をつくっておくと、 .hoge @include sp-view text-align: center で、 @media only screen and (max-width: 767px) { .hoge { text-align: center; } } みたいに展開され…

ネイキッドドメイン + Amazon S3 Static Website Hosting を、VALUE DOMAIN の DNS で実現する

会社のサイト (userfirst.co.jp) をリニューアルして、Amazon S3 で運用するようにしました。 Middleman で作って、middleman-s3_sync でアップロードしています。 基本的な方法は、以下の記事が大変参考になりました。 Middlemanで生成したサイトをAmazon S…

Middleman で Pow を使う

試した Middleman のバージョンは 3.3.6 です。 プロジェクトディレクトリに config.ru を置く require 'rubygems' require 'middleman/rack' run Middleman.server Pow の設定 ln -s ~/middleman-project ~/.pow/middleman-project 基本的にはこれだけで良…

新生銀行に自動ログインするユーザースクリプト 2014年夏バージョン

追記(2016/06/29 18:10): 以下の方法は動かなくなったため、新しい記事を参照してください。 追記ここまで Chrome 36 で確認しています。 Chrome や新生銀行の仕様変更で動かなくなる可能性があります。 こちらを参考にさせていただきました。ありがとうござ…

RSpec で sleep を stub する

ruby - RSpec: stubbing Kernel::sleep? - Stack Overflow rspecでsleepをスタブする方法 - てへぺろ力 上記の方法でうまくいかない、ライブラリ内部などで sleep されている場合を考えてみました。 spec/support/stub_sleep.rb module Kernel def sleep_wit…

image_tag の alt をデフォルト nil にする

ApplicationHelper に image_alt メソッドを追加すれば OK。 Rails 4.1.4 で確認してます。 module ApplicationHelper def image_alt(src) nil end end

Sunspot の search ブロックをメソッドに分割する

Sunspot で複雑な検索を行う場合、検索ブロックが長くなることがあります。 Post.search(include: [:author, :comments]) do # complex1 if complex_conditions1 with :blog_id, 1 else with(:published_at).less_than Time.now end # complex2 if complex_c…

Trigram という gem を作りました

2 つの文字列の類似度を計算する Trigram という gem を作りました。 https://github.com/milk1000cc/trigram Trigram.compare 'he is genius', 'he is genius' # => 1 Trigram.compare 'he is genius', 'he is very genius' # => 0.5625 Trigram.compare 'h…

RSpec + VCR で HTTP テストデータを簡単に作成する

HTTP リクエストをスタブ化する WebMock というライブラリがあります。 これは便利なのですが、リクエストの数が増えてくると、テストデータの管理が大変な場合があります。 VCR を使うと、自動でテストデータを作成してくれて便利です。 参考: VCRを使うとR…

CarrierWave で Amazon S3 にアップロードする

img.example.com から配信 production 環境のみ という前提です。 CarrierWave のバージョンは 0.10.0 です。 Gemfile gem 'carrierwave' gem 'fog' gem 'dotenv-rails' config/initializers/carrierwave.rb CarrierWave.configure do |config| if Rails.env…

登録後からログインしたままにする Devise の設定

Devise (v3.2.2) で会員登録した後、ブラウザを閉じるとログアウト状態になってしまいます。 これを回避し、会員登録の直後から、常にログインしたままとする方法を考えてみました。 app/controllers/users/registrations_controller.rb class Users::Regist…

さくらのVPSでカスタムOSインストールができないとき

さくらの VPS で、カスタム OS インストールをしようとしたのですが、VNC コンソールが立ち上がりませんでした。 原因は、Java のセキュリティ設定でした。 以下、Mac の場合ですが、Windows などでも同様の手順で対処できると思います。 対処方法 最新版の …

Chef Solo 基本操作まとめ

初回の操作 必要ならば Virtualbox, Vagrant をインストールしておく。 gem インストール gem install chef # chef-solo, knife コマンドが入る knife configure # 空欄で OK gem install knife-solo # knife solo が使えるようになる レポジトリ作成 cd ~/d…

Chef でロケールを設定するレシピ

Debian / Ubuntu 用です。日本語に変えてみます。 bash 'locale-gen' do code 'locale-gen ja_JP.UTF-8' end bash 'update-locale' do code 'update-locale --reset LANG=ja_JP.UTF-8' end

Chef でタイムゾーンを設定するレシピ

Debian / Ubuntu 用です。 file '/etc/timezone' do content 'Asia/Tokyo' end bash 'update tzdata' do code 'dpkg-reconfigure -f noninteractive tzdata' end 参考 winhamwr/chef-timezone · GitHub

はてなブログに移行しました

何となく変えてみました。新しいものはいいですね。 Zen for Hatena Blog というテーマを使わせていただいています。 記事下のバナー広告がどうも気に入らなかったので、お金を払って広告非表示にしました。 今後とも、よろしくお願いいたします。

wercker + Capistrano で自動デプロイ

GitHub / Bitbucket のプライベートリポジトリも無料で CI し放題の wercker というサービスがあります。(2013/11/30 現在) サイトもきれいで素敵です。ビルド成功後、Capistrano でデプロイが自動実行される方法を書いておきます。 まず、アプリの設定で SS…

order メソッドをチェインしたときの挙動が Rails3 と Rails4.0.0 で逆

ActiveRecord の AR::Relation#order メソッドですが、チェインした場合の挙動が Rails4.0.0 で変更されていました。 追記(2013/11/7 18:00): Rails4.0.1 で、Rails3 の挙動に戻りましたので、この記事は Rails4.0.0 に対してのみ有用です。ご注意ください。…

git push されたら Jenkins でビルドする

まず、Jenkins を叩くスクリプトを ~/git/jenkins.rb などに置きます。 require 'net/http' require 'uri' Net::HTTP.version_1_2 unless ARGV[0] puts 'usage: ruby jenkins.rb [JOB_NAME]' exit 1 end user = "(Jenkins ユーザーID)" api_token = "(ユーザ…

Devise + OmniAuth で Facebook ログインしているユーザのウォールに自動で投稿する

Gemfile は、以下の通りです。koala gem は、Facebook を処理するライブラリです。 gem 'devise', '2.1.2' gem 'omniauth-facebook', '1.4.1' gem 'koala', '1.6.0' config/initializers/devise.rb の facebook 設定に、scope オプションを追加します。 ウォ…

capybara-webkit を debian の CI サーバで動かす (headless)

まず、Qt と xvfb を入れます。 sudo aptitude install libqt4-dev xvfb Gemfile に、headless gem を追加します。 group :test do ... gem 'capybara' gem 'database_cleaner' gem 'launchy' gem 'capybara-webkit' gem 'headless' ... end spec/spec_helpe…

Paperclip でユーザが画像をアップロード

ImageMagick 系のエラーを表示しない 画像以外のファイルをアップロードされたらエラーを表示する 最大サイズを 5MB に制限 という場合です。content_type はこれでいいのか、ちょっと自信がありません。 has_attached_file :photo, whiny: false # whiny: f…

SSSSLIDE にスライド検索機能がつきました

SlideShare や Speaker Deck のスライドを、縦に並べて表示する「SSSSLIDE」というサービスをやっています。 このたびリニューアルし、スライド検索機能を追加しました。 SSSSLIDE Twitter でつぶやかれたことのある、日本語スライドを中心に検索できます。 …

運用のための Sunspot 設定

Ruby on Rails で Solr による検索を行う Sunspot に関して、私が運用上設定している内容を公開します。 config/sunspot.yml の設定 Sunspot (v1.3.3 現在) では、ジョブやタスクでインデックスを追加・更新した場合、自動でコミットが行われません。 そのた…

rake "sunspot:solr:reindex[,Model]" ではなく rake "sunspot:reindex[,Model]"

Sunspot (v1.3.0) で特定のモデルを再インデックスする場合、 rake "sunspot:solr:reindex[,Model]" としろと README に書いてあるのですけれど、これだと [,Model] の設定が無視されるようです。 rake "sunspot:reindex[,Model]" なら大丈夫です。 関連 URL…

bundle exec と打たなくても済むようにする

~/.zshrc などに export PATH=./bin:$PATH を追記し、bundle install を binstubs オプション付きで実行。 最小限パターン % bundle install --binstubs rbenv を使っているとき % bundle install --binstubs --shebang ruby-local-exec rbenv 使用 + vendor…

perform の引数を破壊的に変更していると resque-retry の挙動がおかしい

Resque のプラグインで、Delayed::Job のように自動リトライをしてくれる resque-retry というものがあります。で、 Resque::Failure::MultipleWithRetrySuppression.classes = [Resque::Failure::Redis] Resque::Failure.backend = Resque::Failure::Multip…

スライドを縦に並べて表示する「SSSSLIDE」というサービスを作りました

SlideShare や Speaker Deck のスライドを、縦に並べて表示する「SSSSLIDE」というサービスを作りました。 SSSSLIDE SlideShare や Speaker Deck は大変素晴らしいサイトだと思うのですが、1 ページごとにポチポチとクリックする必要があり、ちょっと不便で…

ActsAsDigestedOn を Rails3 に対応

acts_as_digested_on という gem を 3 年前に作ったのですが、Rails 3.1 から動かなくなっていたので修正しました。 モデルに 1 行追加するだけで、SHA1 ハッシュを自動でカラムに保存するというものです。 https://rubygems.org/gems/acts_as_digested_on h…

URI のクエリを書き換える

Addressable::URI を使うと、割ときれいに書ける気がします。忘れるのでメモ。 require 'addressable/uri' uri = Addressable::URI.parse('http://example.com').normalize uri.query_values = (uri.query_values or {}).merge('a' => '2') uri.to_s # => "h…