pockestrap

Web Programmer's memo

Ruby

AOJ 0506 をゴルフした

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0506 久しぶりにゴルフをやりたくなったのでやった。AOJの仕様上、コードを短くしても自分の他の解答より実行時間が速くなければランキングにのらない様で、悲しかったのでブログ記事にした。 な…

コマンドを打ち間違えるとコマンドが走るコマンド

Installation 1. banner コマンドをインストールする パッケージマネージャでインストール出来ると思います。 # Arch Linux の例 $ sudo pacman -S banner 2. flowterm という gem をインストールする。 github.com $ gem install flowterm 3. ~/.zshrc に以…

db/schema.rb のコンフリクトを勝手に解決する git merge driver を作った

解決したい課題 Ruby on Rails を使って開発している方の中で、db/schema.rbがコンフリクトした経験がある方は多いのではないでしょうか? 特にスキーマのバージョンはよくコンフリクトします。 diff --cc db/schema.rb index bdb07db,da150fc..0000000 --- …

RuboCop の Collaborator になりました

こんにちは。 RuboCop の Collaborator になりました。Collaborator とは、GitHub でマージボタンを押せる人です。 Promote @pocke to a Core RuboCop developer · bbatsov/rubocop@468835f · GitHub RuboCop とは Ruby のスタイルを検査/修正したり、バグに…

RuboCop の Lint/UnreachableCode を直した

なにそれ RuboCop には Lint/UnreachableCode という便利 Cop がある。 その名の通り、unreachable な code を検出してくれる。 def foo do_something return do_anything # このコードは絶対に実行されない! end 上記のような絶対に実行されないコードをつ…

RuboCop で `#each` がブロックの戻り値を使わないことを思い出せるようにした

問題 以下のようなコードは、恐らくバグになります。 json = users.each do |user| id = user.id full_name = user.full_name { id: id, full_name: full_name, } end render json: json これはidとfull_nameをもったオブジェクトの配列をjsonでrenderするよ…

Reek 4.7.0 から、Syntax Error の扱いが変わります。

Reek 4.7.0 から、解析対象のファイルに Syntax Error が含まれている場合の挙動が変わります。 TL;DR Syntax Error も、ひとつの警告として検出されます。 歴史 Reek における Syntax Error の扱いは、ここ最近の間に2度変更されています。 ~ v4.5.6 v4.5.6…

Reek の Collaborateur になりました

こんにちは。 先日、Reek の Collaborateur になりました。Collaborateur とは、GitHub でマージボタンを押せる人です。 結構うれしいので、ブログを書きました。 TL;DR ある朝起きたら Reek のコミット権をもらっていた。 Reek とは? github.com Reek は R…

RuboCop 0.49.0 のCHANGELOGを読む

RuboCop のバージョン 0.49.0 がリリースされました。 https://github.com/bbatsov/rubocop/releases/tag/v0.49.0 CHANGELOG から変更を見ていこうと思います。 破壊的変更 Layout Department PR: https://github.com/bbatsov/rubocop/pull/4278 今回のリリ…

StrongJSON の高速化実装、MightyJSON を作っている話

soutaro さんが作っている StrongJSON をより高速に実行する MightyJSON を作っています。 github.com github.com StrongJSON とは StrongJSON とは、JSON の型チェックを行う便利Gemです。 # スキーマ定義 s = StrongJSON.new do let :item, object(id: num…

Ruby用オンラインパーサーのBacon Cannonに、URLのシェア機能を追加しました

Bacon Cannon とは? bacon-cannon.herokuapp.com Ruby 用のオンラインパーサーです。Web上から Ripper 及び Parser gem を使用して Ruby のコードをパースし、AST を眺めることが出来ます。 シェア機能 今回は、この Bacon Cannon にパース結果をシェアする…

Gem として提供されているコマンドのベンチマーク

github.com 先程、RuboCop にパフォーマンス改善の Pull-Request を投げました。3%ぐらい速くなります。 この Pull-Request の効果を検証する際に用いたベンチマークの方法が、わりと面白くて便利(自画自賛)だったので、紹介します。 そもそもの問題 Gem で…

Mry を使って RuboCop のアップデートを楽しよう

TL;DR GitHub - pocke/mry: Mry Migrates .Rubocop.Yml Mry を使うと、コマンド一発で非互換にやられた.rubocop.ymlをアップデート出来る 前置き RuboCop のバージョンをご存知でしょうか? 現在(2017/04/24)の RuboCop の最新バージョンは、0.48.1 です。バ…

Rails 5.1 の System test を試した

bacon-cannon.herokuapp.com bacon-cannon で試した。 該当の Pull-Request はこれ。 github.com 環境 Ruby 2.4.1 Ruby on Rails 5.1.0.rc1 Webpacker 1.1 capybara-webkit 1.14.0 Travis CI やったこと Pull-Request に書いてあるけど、その背景とかの補足…

デバッグのためにコメントアウトして死ぬのをやめたい

タイトルのようなバグと戦うためのツールを作成した。 この記事はその宣伝である。 TL;DR github.com バグとの出会い 先日、おもしろバグに出会った。 Rails を使用しているプロジェクトで、本来必要なbefore_actionがコメントアウトされていた。 # こんなか…

Bacon Cannon のアーキテクチャ

先日、Bacon Cannon というアプリケーションをリリースしました。 bacon-cannon.herokuapp.com 一言で説明すると、Ruby のオンラインパーサーです。アプリケーションについては以下の記事をご覧ください。 pocke.hatenablog.com この記事では、Bacon Cannon …

Ruby 用オンラインパーサーを作っている

Ruby のソースコードを Ripper(1.9 ~ 2.4) or parser gem(1.8 ~ 2.4)を使ってパースした結果を眺められる Web サービスを作った— Pocke (@p_ck_) 2017年4月8日 その名も Bacon Cannon です。こちらからアクセスできます。 https://bacon-cannon.herokuapp.co…

lib/hogehoge/version.rb の編集に消耗しない為のツールを作った

github.com Rubygems に gem を公開していると、当然バージョンを上げたくなることがある。 その際に発生するオペレーションの一つとして lib/hogehoge/version.rb を編集する必要がある。 例 class Hogehoge # この数値を上げたい! VERSION = '0.1.0' end …

Heroku で1つの GitHub リポジトリで複数バージョンの Ruby を使う

目的 Heroku を使いたい 同じコードを複数のバージョンの Ruby で実行したい そのためにバージョンの数だけレポジトリを作るとかはやりたくない 解決法 手順1 Gemfileに以下を追記する if v = ENV['CUSTOM_RUBY_VERSION'] ruby v end 手順2 Heroku の管理画…

Battle Conference U30 に参加、登壇してきました

battleconference-u30.connpass.com bcu30.jp 登壇内容 「自分の足を撃たない技術」というタイトルで登壇しました。 資料 qiita.com 内容 実は、私がいいたいことの8割ぐらいは id:sinsoku さんのこのツイートに集約されていると思っています。 各社がレビュ…

プログラムのコードを書き換えずにRubyプログラムをStackprof付きで実行する、stackprof-run というGemを作りました。

github.com こんにちは。 id:Pocke です。 Stackprofを便利に使うGemを作成したので紹介しようと思います。 Stackprof とは 下記参照 github.com Stackprof を使う際の問題点 コマンドラインツールに対してStackprofを使用する際、通常だと以下のようなコー…

Shibart 作成の軌跡

あけましておめでとうございます。 id:Pocke です。 今年の目標は、人の顔を覚えることです。人のことを服の色で覚えてしまうので、この季節はコートを脱ぎ着すると人の判別ができなくなってしまうのを今年こそは直そうと考えています。 昨年末、Shibartとい…

Performance/RegexpMatch Cop の概要と実装

こんにちは。id:Pocke です。 先日、RuboCop に Performance/RegexpMatch という Cop が追加されました。 Add new Performance/RegexpMatch cop by pocke · Pull Request #3824 · bbatsov/rubocop このCopは、Ruby 2.4 で追加された match? メソッドに対応す…

Cookpad Tech Internship ~ Summer 2016 ~ に参加しました!

Cookpad Tech Internship 2016 – Summer – | クックパッド株式会社 採用情報 真面目な記事はこちら www.wantedly.com 写真で振り返るインターンシップ 太るインターン pic.twitter.com/xEQ7b8s5QE— Pocke (@p_ck_) 2016年8月10日 太るインターン pic.twitter…

RSpecでexitを含むコードをテストする

TL;DR expect{subject}.to raise_error SystemExit exitをテストする状況はそもそも筋が悪い 前置き こんにちは。私は最近miというRails用のマイグレーションジェネレータを作っています。 github.com Railsのジェネレータは内部でThorというライブラリを使…

Rails Best Practices を3~4倍ぐらい速くした話、あるいはStackProf入門

github.com TL;DR StackProf でボトルネック検出 String#present?は遅いから使わない。 何度も呼び出される毎回同じ値を返すメソッドをメモ化 上記により3~4倍のパフォーマンス改善 はじめに Rails Best PracticesはRailsに特化したコードメトリックツールで…

Rails 4, 5 両方対応のGemをTravisでテストした話

先日、Railsのマイグレーションファイルをもっと便利に生成するGem、miのバージョン1.0.0をリリースしました。 github.com pocke.hatenablog.com このGemではRailsの4と5両方に対応しており、また4と5では挙動が異なります。 このため4と5両方のバージョンで…

Railsのマイグレーション生成をもっともっとImprovementする! mi gem version 1.0.0 をリリースしました!

こんにちは! RuboCop大好きpockeです。 最近はRuboCopにPRを投げるのが趣味みたいになってきました。 Railsにおけるマイグレーションファイルの生成をもっともっと楽にするGem、miのバージョン1.0.0をリリースしたので、今回はその紹介をしようと思います! g…

rails-apiでcookieを使う

最近、rails-apiでcookieを使うような機会が何度かあったので、その方法をメモしておきます。 tl;dr rails-api with cookie · pocke/rails-api-with-cookie-sample@11ccaf1 前置き rails-apiのデフォルトでは、cookieが無効化されています。 そのため、セッ…

テストの際にいい感じにbinding.pryするGem PryTestcase を作った

github.com Rubygems: pry_testcase | RubyGems.org | your community gem host 前置き # Twitter にメッセージを投稿する def say(msg, param) opt = to_opt(param) opt.message = msg send_to_twitter(opt) end describe '#say' do context 'case1' do it …

Ripperをコマンドラインから簡単に使うラッパー rpr を作った

github.com RubyGems: rpr | RubyGems.org | your community gem host 作った動機 私は現在仕事としてSideCIというコードレビューを自動化するサービスを開発しています。 SideCIではRubocopなどの静的解析ツールを使用しています。 静的解析ツールの拡張の…

もっと便利に rails g migration する

前置き Railsには、DBのマイグレーションファイルを作成する為のジェネレータ、rails g migrationがあります。 例えば、usersテーブルにemailカラムを追加したい場合、このジェネレータは以下のように使います。 $ bin/rails g migration AddEmailToUsers em…

都道府県のマスタテーブルを作るGemを作った

つくりました github.com todofuken | RubyGems.org | your community gem host Ruby on Rails 用に、都道府県のマスタテーブルを作成するGemです。 Rails の generator を利用しています。 Installation 普通のGemと同じように、Gemfileに以下を記載します…

ruby の begin-resuce-end で囲むVimプラグイン作った

こんな感じ Installation GitHub で公開されているので、NeoBundleなどを使用してインストールすることが出来ます。 github.com NeoBundle "kana/vim-operator-user" NeoBundle "pocke/vim-operator-ruby-rescue" Usage Vim の Operator プラグインとして動…

Rails のモデル内のメソッドをソートするRubocop Extension を作った

Rubocop、使っていますか? RubocopはRubyコードを静的に解析して問題を指摘します。 更にauto-correct機能を使うことで、指摘した内容を自動で修正することも可能です。 bbatsov/rubocop RuboCopの自動修正がSideCI上から行えるようになりました。 - SideCI …

今月読んだ技術書 2016年2月版

先月分 pocke.hatenablog.com UNIX という考え方 UNIXという考え方―その設計思想と哲学作者: Mike Gancarz,芳尾桂出版社/メーカー: オーム社発売日: 2001/02メディア: 単行本購入: 40人 クリック: 498回この商品を含むブログ (142件) を見る 誕生日プレゼン…

TDDBC in Tokyo 2016-02 に参加した

tddbc.doorkeeper.jp 経緯 多分 dots 経由で知ったと思う。 行こうかな―って迷っているうちに補欠登録になってしまったけど、繰り上がりで参加できてよかった。 TDDBC、ちょっと悩んでから登録したせいでキャンセル待ちになってしまった…。あとGoやりたい ht…

Ruby on Rails で、スキーマ定義からモデルのファイルを生成する

Migration だけ先にがーーーっと書いたらモデルを作るのがめんどくさくなったので、Rakeのタスクを書きました。 gist.github.com 上記ファイルをlib/tasks/model_from_schema.rakeなどとして保存して、下記のようにコマンドを実行すると使用することが出来ま…

Railsで、Layoutを適用した静的なエラーページを生成してみた

こんにちは。私は現在 bearfruits という GitHub と連携した就活支援Webサービスを作成、運営しています。 bearfruits はRuby on Railsで開発しています。 エラーページがRailsデフォルトのままだったのを改善したので、手順をまとめます。 環境 Ruby on Rai…

Serverspec を書きやすくする Vim プラグインをつくった

github.com 経緯 会社で Serverspec 作成 GUI アプリケーションを作る Serverspec 作成補助アプリケーションをリリースしました | サバカン屋テックブログ ↓ 幼女「GUIめんどい、Vimだったら使う」 @p_ck_ ごくまれに書くー 記事を読んだ感想だと、全く新規…

vlc だけじゃない! みくったーちゃんもサンタ帽をかぶる

こんにちは。いよいよクリスマスも近づいてきました。 クリスマスといえば vlc です。 vlc はクリスマスになるとサンタ帽をかぶります! 今年も、動画再生アプリ「VLC」のアイコンがクリスマス仕様に変更される でも、カラーコーンは美少女ではありません。ど…

require しないで Ruby を書く -- import.rb というアプローチ

import.rbという Gem をリリースしました。 pocke/import.rb · GitHub import.rb | RubyGems.org | your community gem host この Gem について解説したいと思います。 import.rb の目的 Kernel.requireを置き換えること。 Kernel.require とは 外部ファイル…

mikutter から ActiveRecord の validates を使う

mikutter とは、Ruby で書かれた Linux 向け Twitter クライアントです。 というのは表向きの顔で、実際は Plugin で高度に拡張可能な Twitter アプリケーションフレームワークです。 ともなれば、mikutter で Web アプリケーションを作りたくなるのは必然で…

Vim で Ruby を書くならこれを使え!

私は開発環境を整えるのが大好きなのですが、今まであまり発信をすることがなかったのでこの記事を書きました。 少しでも Vim で Ruby を書くのが快適になれば幸いです。 なお、煽り気味のタイトルですが、それだけ私の独断と偏見で便利だと思っているもので…

Rubyでdo-while

TwitterのTLでdo-whileが賑わっていたので。 調べてみたらbegin-endとwhile修飾子で出来るらしい。キモい(かなり) 制御構造 while 修飾子 (中略) 左辺の式が begin 節である場合にはそれを最初に一回評価してから繰り返します。 cond = false begin puts 'fo…

paiza で pizza もぐもぐしてきた

12月14日【IT系就活生向けプログラミング試験対策勉強会】開催決定! - paiza開発日誌 これいってきました。ピザおいしかった。 で、事前課題で 天才火消しエンジニア霧島「もしPMおじさんが丸投げを覚えたら」|paizaオンラインハッカソンLite を解くとのこ…

RubyのArray#include?, Array#bsearch, Set#include? をベンチマークしてみた

2014-11-28 追記. Rubyのバージョンを記すのを忘れていました。 $ ruby -v ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux] 追記ここまで コード Array#include?, Array#bsearch, Set#include? benchm ... 計測方法 偶数の集合に対して、同じ範…

neocomplete用のjQueryの辞書を作った

辞書の使い方とかはneocomplete用にRubyの辞書を作った(るりま編) - pockestrapを見れば良いと思います。 Script require 'open-uri' require 'json' url_base = 'https://api.github.com' owner = 'jquery' repo = 'api.jquery.com' ep_base = "#{url_base}…

neocomplete用にRubyの辞書を作った(るりま編)

vim用にrubyの辞書が欲しかったので用意した | blog: takahiro okumura などを読んでRubyの辞書を作りたくなりました。 しかし、先ほどのコードはrbenv前提であり私はrbenvを使っていないため、るりまから辞書を作成しました。 「辞書」とは 単語を改行区切…

paiza Online Hackathon 解いてみた

天才火消しエンジニア霧島「もしPMおじさんが丸投げを覚えたら」|paizaオンラインハッカソンLite 以下ネタバレ注意 Rubyで解いてみました。早い人で0.02秒とか出てるの、どうやってるんだろう… pockeさんの採点結果[100点] 完璧ぃぃ!|paizaオンラインハッ…