tech.kayac.com

この記事は tech.kayac.com Advent Calendar 2014 24日目です。

tech.kayac.com アドベントカレンダー、いかがでしたか?

こんにちは、@acidlemon です。今日はクリスマスイブ! 今年のtech.kayac.com Advent Calendar はお楽しみいただけたでしょうか? Unityあり、Golangあり、Rubyあり、Javascript/ECMAScriptあり、Perlありとバラエティに富んだ内容でしたね。個人的にはSwiftがなかったのが心残りなのですが…。まぁ来年若者にがんばってもらいます。

また、1日目でご紹介した、ぼくがノリで11月末にIKEAで買ってきたリアルアドベントカレンダーも無事ぼくの手元に帰ってきました。チョコおいしいです。

リアルアドベントカレンダー
※心に余裕がなかったらしく、「書いたら」が「買いたら」になっている…

さて、今年も残すところあと1週間あまりとなりました。先週金曜日まで仕事が多忙を極めて個人的にたいへんあらぶっておりましたが、ようやく落ち着きを取り戻して平穏なクリスマスイブを過ごしています(ひとりです)。

mirageがコンテナ内で動くようになりました

本日の記事は、今年の8月くらいにこのブログで記事にしたmirageの話の続きです。

あの記事以来社内でじわじわと使われ始めまして、先行プロジェクトによるバグ出しもおおよそ終わって安定期に入りました。弊社では主にCentOS6を使っていたため、CentOS6でのDockerは色々ハマリどころが多いという外部の知見から、なかなか開発環境のDocker化が進んでいませんでした。ただ、ちょうど来年上半期にいくつかのプロジェクトのdevサーバが移転するのに合わせて普及が進んでいきそうです。

今ぼくが考えてたのは導入を楽にするというところでして、当初はrpmパッケージを作ったらいいのではないかと思っていました。ただ、その後考え直しまして、お手軽に試すならDockerの中でmirageが動けばよいのでは? ということでこのたびDockerfileを用意してみました。

Dockerコンテナを管理するのをDockerコンテナ内からやるというのはだいぶ不思議な感じではありますが、DockerにアクセスするためのUnix Socketをdocker run -v /var/run/docker.sock:/var/run/docker.sockでコンテナに渡してやれば普通に管理できます。

あと、mirageはcgo要らずのPure Go実装な簡易データベースとしてleveldb-goを使っていますので、これの永続化も必要です。そこで、あらかじめサンプルとして用意したdocker_run.shでは-v /mirageでData Volumeを指定してDockerさんに/mirageを永続化するようにお願いしてあります。

この辺は昨日ドキュメントとにらめっこしてこれでいけるはず! という感じでスクリプトにしましたが、実際の細かい検証はインフラチームの頼れる若者、@tkuchikiにお願いしてやってもらいました。まいどありがとうございます。

その検証結果によると、docker run -v /mirageで永続化したものはdocker rm <container id>でコンテナを削除しても消えないが、docker rm -v <container id>で-v(--volume=true)を指定すると消えるとのことです。ご留意ください。

mirageは来年以降も任意のパラメータ渡せるようにするなどのアップデート計画があります。引き続きよろしくおねがいします。

mirage 開発秘話

さて! 事務的な話がやっと終わったので、ここからはなぜmirageが生まれたのかという小話をお届けします。クリスマスの読み物としてお楽しみください。

弊社の開発フローはチームごとに異なりますが、開発からリリースまでの流れで言うと、大体devサイトにまずデプロイして開発者(デザイナーなども含みます)が自分で確認し、stagingサイトにデプロイしてチームチェック/QAなどを行い、最後に本番サーバにデプロイしてリリース、という流れになっています。

devサイトは複数用意してあり、複数の開発ラインが同時で走っても大丈夫というような感じになっています。gitを利用していますので、gitでブランチを切り替えればすぐdevサイトもそのブランチの内容に切り替わるのでgit便利ですね。

しかし、いくつか問題もあります。一番大きいのはDBのスキーマが変わるときでしょうか。コマンド一発でスキーマをマイグレーションできるようにはなっていますが、そうはいってもテストデータを毎回クリアしているわけではないためマイグレーションに失敗してエンジニアが時間を取られることもしばしばあります。

また、いくつかのdevサイトを使い回して利用するのにはもう一つ問題があり、「最後に使ったのは誰か」「このdevサイトまだその人が使ってるのか」という非常に人間くさい問題があります。

新しい機能/デザインを作ったクリエイターがサーバで確認するために「dev01使ってるひといますかー?」「13時までに返事がなかったら使いますよー」などと毎回やるので、非効率です。常に全員がチャットを見ているわけでもないので、リアルタイムに「あ、今使ってます」と反応できないことも多いです。

この問題の解決のために、社内ではいろいろ策が講じられてきました。たとえばコレです。

風船部長

映っているのは弊社の技術部長の庄司です。背中になにか②と書かれた風船をつけていますね…。そうです。これは「オレが今dev02サーバを使ってるぞ風船」なのです。

なるほど! 風船置き場に風船があればそのdevサーバは使われていない、誰かの背中に風船がついていればその人がそのdevサーバを使っている! すばらしい! アナログ! エレガント!

しかしこの方法には問題がありました。

「風船は、いつか、しぼむ」

この写真は9月のチャレンジのときで、ちゃんとしたヘリウムの漏れづらい風船なのですが、それでもやっぱりそのうちしぼみます。

また、これに先立ち7月にトライラルしたときはちゃんとした風船では無く、デカイビニール袋にヘリウム入れて浮かせてみた、みたいな感じだったためこんな会話もありました。

17:03:08 fujiwara: ゴミ袋浮かんでるのは美観的にどうなのw
17:09:52 handlename: 頭いい方法ではありますねw
17:09:56 handlename: リーズナブルで目立つ
17:10:46 acidlemon: |'-')?
17:10:57 fujiwara: 今ヘリウム高いんだけどなw
17:11:24 acidlemon: 猿山より目視にて浮くゴミ袋を確認
17:11:40 acidlemon: 割り箸鉄砲で撃墜したい
17:12:08 syoji: 真下に俺いるから辞めてw
17:12:14 gs: w
17:12:22 acidlemon: 余計にやる気がUP

しかし、翌日にはゴミ袋はしぼみました。噂ではfujiwaraさんが会社に来ると空気の抜けた風船がインフラチームに流れ着いて落ちていたとかなんとか…

16:35:47 acidlemon: 風船作戦1日で終了か
16:36:00 gs: 全部沈没しました
16:37:18 fujiwara: ドメインを [username].dev.lobi.co みたいにして
16:37:33 fujiwara: 一人ずつdevを起動できるようにしたい…
16:38:07 acidlemon: さっきXXくん(PM)とDockerの話したらYYY(当時のプロジェクト)でも同じようにカジュアルにDockerで自分のdev建てたいって話になった
16:38:26 handlename: テストしてると人依存じゃなかったりするので、各自複数台用意できるようにしないと・・・

そうです! この会話がmirageの開発のきっかけでした。

そんなわけで生まれたmirage、意外とこういった悩みはどこのチームにもあるのではないかと思います。どうぞご利用ください。

こんばんは、@takashicompanyこと、タックルです。
普段はUnityでゲーム作ってます。
この記事は、tech.kayac.com Advent Calendar 2014 23日目となります。 がんばります。

100.png101.gif

ふと思い立って、弊社の象徴・マスコットキャラクターであるコンチ勝手に3Dドット絵にしたので、3Dドット絵を作るときのフローを紹介したいと思います。

ちなみに、出来合いのものはGitHubに一式あがっているので、もし欲しい方いたらどうぞ。

今回紹介する3Dドット絵作成フローはUnityのMecanimで人間のアニメーションそのまま適用できるようにしました。

下絵を描く

00.png

まずは、3Dモデルを制作する際の下絵から描いていきます。
下絵を描くツールは、特に指定はありません。なんでも良いです。
陰影や枠線などはつけず、全体象を捉えられるくらいでOKです。
できたら.png形式で保存しましょう。

3Dドット絵をつくる

01.png

今回はQubicle 2.0を使います。
Qubicle 2.0はフリーで利用可能(エクスポートなどはライセンスを購入する必要あり)です。
Windows/Mac版がリリースされており、Windowsのペイント感覚で3Dドット絵(ボクセルアート)を作ることができます。

201.gif

1. Qubicleに下絵をインポート

まずは、下絵をQubicleに取り込みます。 File > Import > PNG で選択できます。

取り込むとこんな感じで表示されるはず。
02.png

下絵で透過されていた部分が灰色になって表示されるので、魔法の杖ツールなどで選択して消してしまいましょう。
03.png

2. 下絵から3Dドット絵を削り出していく

下絵に奥(Z方向)に引き伸ばし、3Dモデルを削りだしていきたいと思います。
Tools > Extrude Tools を選択して、引き伸ばしを行います。
04.png

引き伸ばしができたら、後は鉛筆・消しゴムツールなどで、モデルを削って行きたいと思います。
04_a.png

完成したコンチはこんな感じ。
05.png

正面・側面・上面・斜めから見て自分のイメージとあっているかをチェックしながら微調整をするのがコツです。

3. 関節ごとに3Dドット絵を分割する

3Dドット絵モデルができたら、関節ごとに部品を分割します。

分割したいボクセルを選択して、Modify > Detatched > Sprit offで分割することができます。
今回、コンチはこんな感じで分割しました。
06.png
(画像は分割をわかりやすくするため各パーツを離して配置していますが、本来は元の位置のまま分割します)

分割の区分は下記になります。

  • 上腕(左右)
  • 下腕(左右)
  • 上脚(左右)
  • 下脚(左右)

4. .obj形式でエクスポート

分割ができたら、.obj形式でエクスポートしましょう。
(書き出しはQubicleのライセンスの購入が必要になります。)
書き出しの際の設定は↓になります。
07.png

  • <ファイル名>.mtl
  • <ファイル名>.obj
  • Materials/<ファイル名>_Atlas_tex.png

が書き出されれば成功です。

3Dドット絵モデルにボーンをつける

10.png
ここからは Blenderを使います。

1. Blenderにobjファイルをインポート

生成した .objファイルをBlenderに取り込みたいと思います。
File > Import > Wavefront (.obj) で.objファイルを選択してください。

3Dドット絵モデルがBlender上に表示されます。
11.png

ドットがボケて表示されてしまう場合は、レンダリング時には解消されるので、そのままで大丈夫です。

2. ボーンを作成する

3Dドット絵モデルにあったアーマチュア(ボーン)を作成します。
12.png

ボーンの階層構成はUnityのMecanimの仕様に沿ったものにします。 13.png

ここではボーンを作るところまででOKです!

3. 関節ごとにVertex Groupを作成する

頂点をグループ化(Vertex Group)して、 7.で作ったボーンとメッシュを適用する下準備をしたいと思います。
関節ごとに分割された状態でBlenderにメッシュがインポートされているかと思うので、それをそのままVertex Groupとして登録します。
14.png

全ての関節をVertex Group化します。

4. 各メッシュ(関節)を一つのオブジェクトにまとめる

全ての関節のVertex Group登録が終わったら、メッシュを一つのオブジェクトにまとめます。
15.png

メッシュオブジェクトを全て選択した状態でCtrl + Jを実行すると、メッシュがひとつのオブジェクトにまとまります。 16.png

17.png

5. ボーンとメッシュを結合する

続いて、ボーンとメッシュを結合します。
アーマチュアの子階層にメッシュを配置する感じとなります。

メッシュ → ボーン(アーマチュア)の順で選択してCtrl + P > Armature Deform > With Empty Groupsを実行します。
18.png

6. ボーンと関節のVertex Groupを連携させる

メッシュを選択した状態でEditModeに切り替えると、Vertex Groupsの項目に各ボーン名と同じVertexGroupが空の状態で定義されています。
このVertex Groupに頂点を登録すると、ボーンを動かした際に登録した頂点(メッシュ)が動きます。
3.で設定したVertex Groupをそれぞれのボーンに設定(Assign)します。
19.png

今回の3Dドット絵では、ドットの粒感を出すために、自動のウェイトペイントではなく、手動で頂点ごとに設定する方式を採用しました。
自動ウェイトペイントを使うと、また違った動きをする3Dドット絵ができあがるので、試してみても良いかもしれません。

7. 関節が正しく動いているかを確認する

PoseModeでボーンを動して、確認をしましょう。
20.png

Unityに3Dドット絵モデルをインポートする

細かい手順についてはこちらをご覧ください。

注意点としては

  • 3DモデルをBlenderから.fbx形式でエクスポートした後に、Unityにインポートする際に、.obj生成時に作られたpngファイルもインポートし、マテリアルに設定する
    • .fbxをインポートしただけだと、マテリアルにテクスチャーが設定されない
  • マテリアルのテクスチャのテクスチャー設定でFilter ModeをPointに設定する
    • 設定しないとドットがぼやけて表示されることがある

を忘れずに!

ボーンの構造がUnityのMecanimの仕様に合わせているので、人間用に作られたアニメーションを適用することができます。
102.gif
腕が短いため、剣の両手持ちとかはできないですが…(-_-;)

ちなみに、3Dドット絵コンチの頂点数は1088なので、ダイナミックバッチングの適用外ですが、比較的軽い3Dモデルではないでしょうか。
103.png

明日はゆるふわぽわわ系エンジニア、acidlemon氏がフィナーレを飾ります!
これは期待ですね!!!!

この記事は tech.kayac.com Advent Calendar 2014 22日目です。

こんにちは。Rubyを書いている @yumiyon です。

今回は、Railsプロジェクトで「○○がしたい!」と思った際に、自分がよく利用するGemを機能ごとに分けて10個ほどご紹介します。日頃からRailsで開発を行なっている方は既知のものばかりかもしれませんが、Railsを始めたばかりの方や、自分のための備忘録として。

目次

  • Gemとは
  • 1、画像をアップロードしたい(CarrierWave)
  • 2、管理画面を作成したい(ActiveAdmin)
  • 3、環境毎に定数を管理したい(rails_config)
  • 4、crontabを管理したい(Whenever)
  • 5、スプレッドシートにアクセス(google_drive)
  • 6、ページャーを実装したい(kaminari)
  • 7、非同期処理を使いたい:ジョブキュー(sidekiq)
  • 8、スクレイピングしたい(Mechanize)
  • 9、ソーシャル上でシェアされた数を取得(social_counter)
  • 10、Amazonで商品を検索(amazon-ecs)
  • 最後に

Gemとは

そもそも「Gem」とは、Rubyで書かれたライブラリやアプリケーションを、パッケージ化したもののことを指します。GemはRubyGemsと呼ばれるパッケージ管理システムを利用して、好きなGemをインストールすることができます。

gems.png

それではさっそく機能ごとに紹介していきます。

1. 画像をアップロードしたい(CarrierWave)

# Gemfile
source 'https://rubygems.org'

gem 'carrierwave'
gem 'fog'
gem 'rmagick'

CarrierWaveは、画像アップロードする際に利用する便利なgemです。

RMagick を使うことができるので、画像処理でリサイズなどちょっと凝ったことをすることもできます。さらにfogというGemを利用すれば、Amazonが提供するS3に、簡単にアップロードすることも可能です。

使い方はこちらにまとめました。 Railsで画像をリサイズしてS3にアップロードする方法

公式リポジトリ

CarrierWave
fog
RMagick

使い方

Railsで画像をリサイズしてS3にアップロードする方法

2. 管理画面を作成したい(ActiveAdmin)

gem 'activeadmin', github: 'gregbell/active_admin’ 

続いてご紹介するのは、Railsプロジェクトで管理画面を簡単に作成できるGemパッケージ「Active Admin」です。

非エンジニアでも簡単にデータにアクセスできりようにするために、管理画面は何かと必要になることが多いと思います。カスタマイズがしやすくデザインも整っているので、今回はRailsAdminではなくActive Adminを選びました(githubのstarの数も少しactiveadminの方が多かったり)。

画面イメージ

activeadmin01.png

ライブラリを追加するだけで、CRUD(データの作成、読み出し、更新、削除)の機能が使えるようになります。また、検索やレコードをCSV、XML、JSON形式で出力することができるので便利です。ライブラリを追加した際に、管理者ログインの機能も一緒に追加されます。

インストールなどの手順はこちらにまとめました。 Railsでシンプルな管理画面をサクッとつくれる「ActiveAdmin」

公式リポジトリ

Active Admin
Active Admin Wiki

使い方

Railsでシンプルな管理画面をサクッとつくれる「ActiveAdmin」

3. 環境毎に定数を管理したい(rails_config)

gem ‘rails_config'

Settingslogic というGemでもいいのですが、管理する定数の数が増えてきた時にも対処するため、最近では環境ごとにファイルを分けられる「rails_config」を利用しています。

開発環境ごとに、定数をYAMLファイルで管理できます。使用したい環境に応じて編集するファイルを変更できるのが特徴的。環境ごとに読み込む定数を変更できるので便利です。

rails_config.png

使い方

Railsで定数を環境ごとに管理するrails_config

公式リポジトリ

rails_config

4. crontabを管理したい(Whenever)

gem 'whenever', :require => false

Railsプロジェクトで、バッチ処理を書く際に便利なGemが「Whenever」です。

cronのバッチを作成して、定期的にバッチ回すことができます。Capistranoでのデプロイする際のCapistranoのレシピなんかも用意されているので、本番環境のcrontabへの設定反映もスムーズです。使い方はこちらにまとめました。 Railsで定期的にバッチ回す「Whenever」

$ bundle exec wheneverize . 
    [add] writing `./config/schedule.rb'
    [done] wheneverized! 

上記のコマンドをたたいて設定ファイル(config/schedule.rb)を作成して、設定を記述していきます。

require File.expand_path(File.dirname(__FILE__) + "/environment")
set :output, 'log/cron.log'

# 1分毎に回す
every 1.minute do
  command "echo 'test'"
end

あとはcrontabに反映させれば完了です。

# cronにデータを反映
$ bundle exec whenever --update-crontab 

# cronからデータを削除
$  bundle exec whenever --clear-crontab

CapistranoでWhenever

デプロイ時に、本番環境にもcronの値をセットしたい時は、Capistranoの設定ファイルに下記を追記します。

# config/deploy.rb

set :whenever_command, "bundle exec whenever"
require "whenever/capistrano"

これで cap deploy を行なえば、デプロイ先のcrontabに値が反映されます。

公式リポジトリ

Whenever

使い方

Railsで定期的にバッチ回す「Whenever」

5. スプレッドシートにアクセス(google_drive)

gem 'google_drive'

Googleのスプレッドシートは、Excel代わりに使えたりと何かと便利です。

sp.png

スプレッドシートをrubyで自由にアクセスして操作できたら… なんて時は「google_drive」というGemが使えます。 Google Drive の spreadsheet に、rubyでアクセスしたい時に使える便利Gemです。

使い方はこちらにまとめました。 Google DriveのスプレッドシートにRubyでアクセスする方法

OAuth2.0を利用してアクセスしています。

class HomeController < ApplicationController
require "rubygems"
require "google_drive"

  def show
    client_id     = "クライアント ID"
    client_secret = "クライアント シークレット"
    refresh_token = "リフレッシュトークン"
    client = OAuth2::Client.new(
        client_id,
        client_secret,
        site: "https://accounts.google.com",
        token_url: "/o/oauth2/token",
        authorize_url: "/o/oauth2/auth")
    auth_token = OAuth2::AccessToken.from_hash(client, {
        :refresh_token => refresh_token, 
        :expires_at => 3600
    })
    auth_token = auth_token.refresh!
    session = GoogleDrive.login_with_oauth(auth_token.token)
    ws = session.spreadsheet_by_key("1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0").worksheets[0]

    # レコード数を取得
    p ws.num_rows
    # カラム数を取得
    p ws.num_cols
  end
end

"1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0" の部分は、アクセスしたいスプレッドシートのURL https://docs.google.com/spreadsheets/d/1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0/edit の "1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0" の部分を使用します。

アクセスすると見事「7」「3」と表示されました。

公式リポジトリ

google_drive

6. ページャーを実装したい(kaminari)

gem 'kaminari'

Railsのでページャーを実装したい時の定番Gemといえば「kaminari」。

page.png

コードを「数行」追加するだけで、上記のようなページャーが簡単に作成できます。

# app/controllers/home_controller.rb

class HomeController < ApplicationController
  def show
    @books = Book.page(params[:page])
  end
end
# app/views/home/show.html.erb

<% @books.each do |book| %>
<%= book.title %>
<% end %>
<%= paginate(@books) %>

paginateの部分にページャーができました。シンプル。

公式リポジトリ

kaminari

使い方

Railsでページャーを簡単に実装できるGem「kaminari」

7. 非同期処理を使いたい:ジョブキュー(sidekiq)

gem 'sidekiq'
gem 'sinatra', require: false  # ダッシュボードを利用するため

Railsで非同期処理を行いたい際に使うライブラリ「Sidekiq 」です。

side.png

Sidekiqは、resquedelayed_job などのような非同期処理を行いたい時に使うライブラリです。複数のジョブを同時に実行することができます。

Sidekiq には、Redisがバックグラウンド(ジョブ管理)に必要なのでインストールしておきます。管理画面のようなモニターを作成して、いまの状態を確認することもできます。

使い方はこちらにまとめております。Railsで非同期処理を行なえる「Sidekiq」

サーバー側とクライアント側の2種類の設定を追記します。

# config/initializers/sidekiq.rb

Sidekiq.configure_server do |config|
    config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end

Sidekiq.configure_client do |config|
    config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end

デプロイ時には、sidekiqがロードしているコードが更新されないため、capistranoを使っている場合は設定を追記して、デプロイと同時に起動・再起動をできるようにしましょう。

require 'sidekiq/capistrano’ 
set :sidekiq_role, :web

状態がみれるモニター

# config/routes.rb

require 'sidekiq/web'
 mount Sidekiq::Web, at: "/sidekiq"

モニターを作成するためにmountします。http://localhost:3000/sidekiq にアクセスすると...

sidekiq_mount.png

こういった綺麗な画面がつくられます。

公式リポジトリ

sidekiq

sidekiqのwiki

sidekiqのwiki

使い方

Railsで非同期処理を行なえる「Sidekiq」

8. スクレイピングしたい(Mechanize)

gem 'mechanize'

試しに、KAYACの公式Webサイトから「タイトル」と「URL」を取得してみます。

スクリプト

# app/controllers/home_controller.rb

class HomeController < ApplicationController
require 'mechanize'

  def mechanize
    agent = Mechanize.new
    page = agent.get('http://www.kayac.com/')
    p page.title
    p page.at("a").attributes["href"].text
  end

end

実行結果

Processing by HomeController#mechanize as HTML
"面白法人カヤック"
"http://www.kayac.com/"

さくっと取得できました。さらにMechanizeを使えば、POSTをすることも可能です。

POSTの仕方はこちらに書きました。RubyのMechanizeで画像をPOSTする方法

# run.rb

require 'mechanize'

# 画像のpathを指定
IMAGE_PATH  = '/path/to/sample.png'
# POSTするURLを指定
REQUEST_URL = 'http://moss.moss/api/image/uploader'

agent = Mechanize.new

# 処理を10回繰り返す
10.times do |i|
  response = agent.post(REQUEST_URL, {
    text: 'mossmossmoss', # 一緒にPOSTしたいデータがある時
    image:  File.open(IMAGE_PATH),
  })

  # responseがある場合にprintされる
  print "#{i+1}: #{response.code} #{response.body}\n"

  sleep 3 
end

公式リポジトリ

mechanize

------------------ おまけ ------------------

9. ソーシャル上でシェアされた数を取得(social_counter)

# Gemfile
source 'https://rubygems.org'

gem 'social_counter'

social_counterは、あるWebサイトがTwitter、Facebook などのソーシャルメディア上で「どれくらいシェアされているか」を知りたい時に使えます。

スクリプト

require 'social_counter'

# 引数でもらう
url = ARGV[0]
@sc = SocialCounter.new(url)
p "タイトル:#{@sc.title}"
p "Twitter:#{@sc.twitter_count}"
p "Facebook:#{@sc.facebook_count}"
p "Hatena:#{@sc.hatena_count}"
p "Pocket:#{@sc.pocket_count}"
p "Google:#{@sc.google_count}"

実行結果

"タイトル:もすもす"
"Twitter:2300"
"Facebook:8338"
"Hatena:422"
"Pocket:501"
"Google:62"

調べられるSNS一覧

  • Twitter
  • Facebook
  • Hatena Bookmark
  • Google Plus
  • Pocket
  • Linkedin
  • Delicious
  • Pinterest
  • Reddit

公式リポジトリ

social_counter

使い方

ソーシャル上でシェアされている数が一発でわかるRubyGem「social_counter」

10. Amazonで商品を検索(amazon-ecs)

# Gemfile
source 'https://rubygems.org'

gem 'amazon-ecs'

サービスをつくっているときに、Amazonの商品を使いと時があるかと思います。そんなときにAmazon APIが使える便利Gem「amazon-ecs」。

使い方はこちらにまとめました。RailsでAmazon APIを使って商品を検索する方法

公式リポジトリ

amazon-ecs

最後に

Gemは本当に便利で「こういう機能がほしい」思った時に、RubyGems.org やWebで検索してみると、過去の偉人達がつくった Gem を見つけることができ、簡単に実装することができます。

どのGemが人気なのかがわかる「The Ruby Toolbox」なんてサービスも便利です。(The Ruby Toolboxは、Ruby開発者が利用している gem をカテゴリごとに分類して、ランキング形式で紹介しているサイト)

とても便利なGemですが、開発者が開発から離れてしまったために、保守されていないものも世の中にはたくさんあります。Gemを選ぶ時は、利用している人が多く、最終更新日がなるべく新しいものを選ぶようにしましょう。

明日は @satotakashi パイセンです!!