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」でほとんど問題ないと思われるが、状況に応じて色々使い分けると更に楽になるかもしれない。

AWS-UG 千葉支部 Vol.3 -AWSスタートアップあるあるに参加しました!

JAWS-UG 千葉支部 Vol.3 -AWSスタートアップあるあるに参加してきた。
新浦安、思ったよりよさ気なところだったけど遠い…

以下セッションの内容

スタートアップのためのAWSピーク対策入門

スタートアップ支援されているAWSの高山さんによるスタートアップ向けのお話。
全般的にスタートアップを考えている人は知っといたほうがいい感じの内容だった。
特に

  • テレビ露出をなめないほうがよい
  • サーバーを20台増やして使用率10%なら笑い話だけど増やさずに落ちたら大変

なのでメディア露出時は思い切って増やしましょうって話は経験者は語る的な感じですごく説得力があったw
あと個人的にはランディングページをS3に置くって発想がなかったのでいいなと思った。

eXcaleによるAWSの利用方法

うちのボスの西谷さんがeXcaleのAWS事情について話しました。

AWSの困った話とバッドノウハウ

アールラーニングの小田島さんのAWSバッドノウハウの話…になるはずが話せなくなったとのことw
良いパターンとかhogehogeを実現した方法って情報として出まわるけど、ネガティブな情報とか完成に至るまでにハマったところとかってなかなか見つからなかったりするのでバッドノウハウ聞きたかった…

スタートアップの成長とAWSの活用

freeeの横路さんがスタートアップから今までのインフラ史を語ってくれていた。
freeeの場合はセキュリティ要件があってHerokuからAWSに移行して、その後色々置き換えて今に至るって感じらしい。
最近の自分はスタートアップに興味があって、色々試行錯誤してインフラが成長していくさまをしれたのはすごく良かった。
横路さんには懇親会でも色々お話を伺いました。ありがとうございました。

AWSでセキュリティをここまで高められる〜PCI DSS運用もAWSで〜

cloudpackの吉田さんのお話。
本題とは別に話されていた先日のJAWS DaysでやっていたCTOトークセッションのまとめや、iretさんの初期のお話がおもしろかった。
あと非公表ながらRIインスタンスについての調査結果がすごく参考になった。
自分もベンチマークとか料金とかのみんなが気になるデータを調査して発信するようなことしたいなーとか思ったり。

FluentdとAWSを使ったログ運用

今回はeXcaleがスポンサーだったので簡単なFluentd使ったAWS上でのログ運用についてLT枠でお話させていただいた。
喋っている人みんな凄かったので内容のレベル間が合わなくて若干辛かったw
まぁそこはLTだからということで。

Node.js でS3にアクセスしてみよう。

蛭田 聡司(@web_se)さんのお話。
タイトルの本題より最近のクラウドサービス事情のお話の方が長かったようなw
GoogleComputeEngineとか自分はまったく触ったことないので新鮮だった。

opsworks本番前提でopsworksを使わないで開発する話

AWSの荒木さんの俺流opsworks(?)のお話。
開発環境でopsworks使うとお金がかかるので、開発環境でダミーopsworksを使う方法について話されていた。
開発環境と本番環境の差異ってできるだけ無くしたいけどいろいろな事情で完全に差異なしってのは難しくてこういうノウハウは勉強になるなー

まとめ

スタートアップでAWSを選択するのはもはや必然に近い状況なんじゃないかなーと思ったり。
最初はPaaSっていう選択肢もあるけど、ある程度成長したら卒業するものだと思うしいずれはAWSに乗ることになるんじゃないかな。
そのときに引っ越しするときとか、AWSの乗った後で各マネージドサービスに移す際のノウハウなんかが共有できるといいんじゃないかなーと思います。

Markdownエディタ「Haroopad」を使ってみた

経緯

僕はブログ記事をMarkdownで書いている。
当初はvimで書こうと思っていたのだけども、プレビューを表示させようとすると色々限界があって、使っていなかった。
かといってソフトをわざわざインストールするまでもないだろうということで、今まではオンライン上のツールを使っていた。

だが先日オンライン上で書いてる途中で事故で消してしまったこともあってローカルでやるべきだと思い知ることとなる。
今回はそのお試し1号としてHaroopadを試してみる。

ダウンロード

ダウンロードは下記サイトから

http://pad.haroopress.com/

Mac版があるのでそれをダウンロード。
dmgで落ちて来るので開くと以下のような感じでドラッグドロップすれば良い。

f:id:syguer:20140320214943p:plain

起動するときに以下のような画面がでたらcommandを押しながらopenするお約束

f:id:syguer:20140320214908p:plain

使い方

開くと一般的なMarkdownエディタと同じくエディタとプレビューが並んだ感じになる。

f:id:syguer:20140320214926p:plain

vimキーバインドを使うときは以下のオプションを有効に。

f:id:syguer:20140320214958p:plain

行数を表示するときは以下のオプションを有効にする。

f:id:syguer:20140320215014p:plain

使い心地

編集自体は普通なのだが、Google日本語入力と相性が悪いのか、日本語入力をしている時にスペースを叩いても変換候補が出てこなくて2回叩く必要がある。
これは若干使いづらい…
他は特に問題なし。
普段Markdownで書いてるとかいいつつもハイライト忘れたりするんだけどメニューから挿入できるのは良い。

f:id:syguer:20140320215035p:plain

まぁこの程度の機能は他のMarkdownエディタにもついてるだろうけど

結論

日本語変換の候補がなぜかスペース一発ででないのは残念極まりない。
他のものも試してみようと思う。