Rubyのsortでハマった

某プログラミング問題サイトで回答のコード書いてたのだが、配列のソートを含むコードの挙動がどう考えてもおかしい感じになって軽くハマったのでメモ

例えば下記の例

["34","10","101"].sort

これは当然["10","34","101"]になるだろうと思いきや、

irb(main):001:0> ["34","10","101"].sort
=> ["10", "101", "34"]

こうなりますと。
分かる人には当たり前なんだろうけど、文字列だとこうなってしまうんですね…

正しくやるにはsortにブロック渡すか、数字に変換してからsortするとか

#sortにブロック渡す場合
["34","10","101"].sort {|a,b| a.to_i <=> b.to_i}
 #=> ["10", "34", "101"]

#数字に変換する場合
array = ["34","10","101"]
array.map! {|m| m.to_i}
array.sort 
# => [34, 10, 101]

ちなみに数字に変換する場合は結果がIntegerの配列になる。
文字列の配列であることに意味があるならブロックで渡すべきかも。

なんにせよこんなことにハマるなんて残念すぎた…

Rubyで簡単にAPIサーバーを作れるGrapeを使ってみた

やろうやろうと思ってやっていなかったのでやってみた。

Grapeについて

GrapeRubyREST APIサーバー書くときに使えるGem。
そのままRackでも動かせるし、SinatraとかRailsにマウントもできる。

使い方

Railsで使うときの使い方を紹介します。
環境は、

まずは普通にrailsアプリを作る

rails new hoge -d mysql

Gemfileに書いて

gem 'grape'

インストール

bundle install

事前にモデルを作っておく

rails g model huga value:string

APIを作る

ディレクトリはこんな感じで作るらしい

mkdir -p app/api/huga
vim app/api/huga/api.rb

実装はこんな感じ

module Hugas
  class API < Grape::API
    format :json

    resource :hugas do
      get '/' do
        Huga.all
      end

      params do
        requires :value, type: String
      end
      post '/' do
        Huga.create({
          value: params[:value]
        })
      end
    end
  end
end

リソースのブロックの中にget,post…とかって書いていく。
paramsを書いとくとバリデートとかもできる。

設定周り

  • ルーティング
    config/route.rbに以下のように追記
mount Hugas::API => '/'
  • パスを通す
    config/application.rbに追記
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
  • migrate(モデル作ったらすぐやっておいても可)
rake db:create && rake db:migrate

実行してみる

rails s

トップページはいつものRails画面のはずなので、「http://localhost:3000/hugas」にアクセスして空のJSONが返ってきてれば多分うまくいっている。

f:id:syguer:20140708235725p:plain

Chromepostmanとか使ってデータを登録してみる。

f:id:syguer:20140709000115p:plain

うまくいってるっぽい

f:id:syguer:20140709000135p:plain

他にも認証周りとかいろいろできるらしいので、もっと普通に使ってみたいところ。
ただ、そんなに規模が大きくないならSinatraで書くのと大差ない気もした

おまけ

ついでに前から触りたかったAngularJSを使ってAPIにアクセスするアプリを作ってみた。
といってもpublicの下にゴリゴリ書いてアクセスするだけだけれどもw
お題は異動になった同僚の送別会で渡す物を決めるために、候補の中からどれがいいか投票するアプリってやつ。

f:id:syguer:20140709000823p:plain

ソースはgithubにあります。
https://github.com/syguer/voter

そもそも設計がおかしいのを除いても多分色々イケてないのでプルリクお待ちしてます!

MacBookの矢印キーを無効にした

背景

去年の10月頃に実は自分はブラインドタッチ(今はタッチタイピングって言葉のほうが主流?)ができていないことに気づき、以来こそこそと練習していた。
今はほぼできているんだけども、矢印キーを使う癖が抜けずに右手が正しい位置より一個右に行ってしまうのが直らない。
これを矯正するために矢印キーを無効にしようと思い立った。

KeyRemap4MacBook

調べてみたらこのツールがでてきた。

https://pqrs.org/macosx/keyremap4macbook/index.html.ja

dmgが落ちて来るので流れのままにインストールする。

厳密にはキーを無効にするのではなくて、キーをFnキーにするというのを選択した。

f:id:syguer:20140707111121p:plain

効果

自分がどういうときに矢印キーを使っているのかがよくわかったのと、矢印キーがないと指の移動が大幅に減ることが実感できた。

はじめはシェルのコマンド履歴が使えなくて「うっ...」となったけど、そこはキーバインドを新しく覚えた。

↑ Ctrl-p (prev) → Ctrl-f (forward) ← Ctrl-b (back) ↓ Ctrl-n (next)

変えて知ったけど、このキーバインドって極めて一般的で、他でも普通に使えるっていうね。
いいことを知った

社内勉強会でCoreOSについて話した

先週社内勉強会があってCoreOSについてLTした

僕はGCEがCoreOSサポートしたって記事でCoreOSについて知った。
社内勉強会のテーマはDockerとVagrantだったんだけど、いい機会だからDocker関連でCoreOSについて調べて簡単にLTしたっていう経緯。 公式ドキュメント読んで軽く触っただけなので誤読とかあるかも。
間違いがあったらご指摘よろしくお願いします。

Dockerはインフラエンジニアもアプリエンジニアも嬉しいすげーいい道具だと思う。
世の中はどんどんコンテナ化していくだろうってところでCoreOSもどんどん使われていくんじゃないかなーと思ってる。
インフラはどんどんコード化しているし、物理はクラウド使えば考えなくていい感じなのでマジでインフラエンジニアっていう職種は薄くなっていく予感。
僕自身ももっとアプリやりたいし、今後はそっちのスキル伸ばしていけたらいいなーと思う今日このごろ。

今更ながらvim-easymotionを導入してみた

vim-easymotionとは

vimには様々なカーソル移動がデフォルトで用意されていて、ほとんどの場合はキーを数回叩けば目的地にたどり着けるようになっている。
だが、移動のために叩くキーを最小にしようとするとそれなりに考えないといけないことが辛い所。
スーパーハカーのみなさんはそれくらい朝飯前かもしれないし、それなりに場数を踏めば早くなるのだろうができることなら避けたいよねっていう。
そんな要望に応えるのがvim-easymotion。

vim-easymotionで何ができるの?

具体的に以下の状況を考えてみる

f:id:syguer:20140406194907p:plain

このとき、33行目のconsole.logの出力を変えるために移動したい。
vimの標準機能を駆使すると僕のミニマムブレインのなかでは以下の感じになると思われる。

10j10j10jjjwwwww
# 何も考えないとこんな感じで愚直に移動を・・・

32jfE 
# とりあえずjとwの連打をやめる

:33fE
# j使わないで直接33行目に移動。行間を暗算する手間が省けた

/E
#今回の例だとこれ1回で移動できるが、間にEがいっぱいあると更にnを複数回叩くことに

このようにキーの移動に対して思考のステップが必要だ。

そこでvim-easymotionを使った場合はどうなるか。
まずはおもむろにLeader(\キー) + wを押してみよう

f:id:syguer:20140406194928p:plain

何やら暗号チックな変換が行われて文字がハイライトされている。
このハイライトされている文字、これはキーボードのキーに対応している。
vim-easymotionはLeader(\キー) + wを押すと単語('w'ard)とキーボードをマッピングしてくれるのだ。
目的の位置は;cという2連続のキーにマッピングされているのがわかるだろうか。
移動してみる。

;を叩く。

f:id:syguer:20140406194947p:plain

親切に;と組み合わせになっているキーだけにハイライトが変わった。
cを叩く。

f:id:syguer:20140406194956p:plain

あっという間だ。何も考えなくてもよい。押したキー数も4キーだけだ。
ハイライトしてくれるので僕のようなGUI世代の情弱でもとても理解しやすい。

vim-easymotionの導入

僕はNeoBundleを使っているので.vimrcに以下のように追記して:NeoBundleInstallした。

NeoBundle 'Lokaltog/vim-easymotion'

次にキーバインドを登録する。以下のようにすると一括でデフォルトの操作を読み込んでくれる。

map  (easymotion-prefix)

これで準備完了。これだけでカーソル移動の悩みが解決できる素晴らしさ。

その他の操作

今回は「Leader(\キー) + w」を取り上げたが、w以外にも色々使える。
eなら単語の末尾にマッピングするし、f + characterでcharacterに当てはまるものにマッピングをする(Leader(\キー) + fa」とすればすべての"a"にキーをマッピングする)
「Leader(\キー) + w」でほとんど問題ないと思われるが、状況に応じて色々使い分けると更に楽になるかもしれない。