2013年12月10日火曜日

Rails多言語対応

今日はRailsで日本語と英語の出し分けを実装してました。さすがRails、多言語対応も安定の簡単さ。グリーみたいにアラビア語対応とかしなくていいから更に楽です。ここ(Rails Internationalization (I18n) API)を見ながらちょいちょいと設定が済みました。 基本的にはI18nというオブジェクトですべてハンドルしております。 I18n.lでlocalize、I18n.tで翻訳をします。

2.0.0p247 :010 > I18n.l Time.now
 => "Tue, 03 Dec 2013 17:19:04 +0000" 
2.0.0p247 :022 > I18n.t "hello"
 => "こんにちわ世界" 
どのLocaleを利用するかはI18n.localeに格納されています。

2.0.0p247 :026 > I18n.locale
 => :jp 
2.0.0p247 :027 > I18n.default_locale
 => :en 
言語リソースはymlで用意する。config/locales/*.ymlというファイルを作るとRailsが自動的に読み込んでくれる。

en:
  hello: "Hello world"
jp:
  hello: "こんにちわ世界"
ちなみに階層化できるので、きれいにまとめましょう。

en:
  greeting:
    hi:
      world: "Hi World"
      ippei: "Hi Ippei"
.(ドット)でつなぎます。

2.0.0p247 :004 > I18n.t("greeting")
 => {:hi=>{:world=>"Hi World", :ippei=>"Hi Ippei"}} 
2.0.0p247 :005 > I18n.t("greeting.hi.world")
 => "Hi World" 
2.0.0p247 :006 > I18n.t("greeting.hi.ippei")
 => "Hi Ippei" 
若干ハマったのが、なぜかjp.ymlという言語リソースファイルを追加したのに読んでくれていない。Railsがconfig/locales/から自動的にロードしてくれるのだが、残念ながらファイルを追加した時には動的に呼んでないらしい。ファイルに新しいKeyをアペンドした時は読んでくれるんだけど。たぶんこのパラメータが起動時に作られるのだと思われる。

2.0.0p247 :001 > I18n.load_path
 => ["/Users/ippei/RubymineProjects/eneberg/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.1/lib/active_support/locale/en.yml", "/Users/ippei/Rubymine.....
また、application.rbからdefault_localeの変更やload_pathの追加をすることもできる。少なくともrails4.0.1では以下のようなComment OutされたエントリーがあるのでComment Inして任意の言語またはディレクトリを追加するだけ。

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de


問題はI18n.localeにどうやって任意の言語を入れてあげるか。つまりどうやって言語を判別するか。 大まかに以下の方法があると思います。組み合わせて使ったりもします。グリーはAccept-Languageだったはず。

  1. ドメインで識別 
    • jp.example.com
    • example.jp
  2. Query Stringで渡す
    • example.com?locale=jp
  3. Pathに追加する
    • example.com/jp
  4. Accept-Languageを見る
    • Accept-Language:en-US,en;q=0.8,ja;q=0.6
  5. GeoIP
  6. ユーザ毎に設定を持たせる

今回はお手軽にQuery StringとAccept-Languageで実装しました。


まずはQuery Stringから。ApplicationController.rbに下記を追加してQuery Stringで渡されたパラメーターをI18n.localeに設定するようにします。

before_action :set_locale
 
def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end
これだけだと画面遷移時にlocaleが引き継がれないので、以下のmethodをoverrideして常にlocaleパラメータを渡すようにします。

def default_url_options(options={})
  { locale: I18n.locale }
end
お次はAccept-Languageの実装です。残念ながらRails自体にはAccept-LanguageをParseする機能はないようなので、http_accept_languageというGemを使いました。 Gemfileに以下を追加します。
gem "http_accept_language", "~> 2.0.0"
そうするとこんな感じで準備したLocaleに対応する言語を返してくれます。
http_accept_language.compatible_language_from(I18n.available_locales)
Query Stringを優先させるので、終わってみるとApplication Controllerはこんな感じになりました。

  before_action :set_locale

  def default_url_options(options={})
    {:locale => I18n.locale}
  end

  def set_locale
    I18n.locale = extract_locale_from_params ||
        extract_locale_from_accept_language_header ||
        I18n.default_locale
  end

  private
  def extract_locale_from_params
    if params[:locale] and I18n.available_locales.index(params[:locale].to_sym)
      params[:locale]
    end
  end

  def extract_locale_from_accept_language_header
    http_accept_language.compatible_language_from(I18n.available_locales)
  end
後はja.ymlとen.ymlにひたすらリソースを追加して、Templateにせこせこと以下の文字を馬鹿みたいに埋め込み続けるだけの簡単なお仕事です。
<%= t('KEY') %>

2013年12月1日日曜日

DNSimpleでHerokuアプリのドメイン登録


Herokuとの連携が簡単そうだったのでDNSimpleというドメインサービスを利用してみたら死ぬほど簡単だったので紹介してみる。DocumentもSimpleにまとまっていて良い(DNSimple Support)。
HeokuのドキュメントもDNSimple推しでまとまってます(SSL Endpoint, Purchasing an SSL Certificate from DNSimple)。
まずはクレジットカードの登録をしてアカウントアクティベートしてみます。ドメインを追加します。フォームに打ち込むだけで取得できるかの確認や、Name Servreへの登録とかもやってくれて数分待っていれば名前が解決できるようになりました。

 
既にとられているドメインだと怒られる。


こんな感じでダッシュボードから登録の状況やALIAS、SOA、NS等の情報が確認できます。




Advance Editorという画面からRecordが登録できるので、サブドメインと一緒にHerokuのアプリへのALIASレコードを作ってやります。ALIASレコードはDNSimpleが追加してたCNAMEの拡張レコードのようなもの。Aレコードがなくてもdomain名からアドレスを解決してくれるものらしい。詳しくはこちら(What is an ALIAS record?, Introducing the ALIAS Record – Naked Domain Aliasing that Works!)。


後は、Herokuのアプリ設定で上で追加したDomainを追加してあげればOK。ここまでで、もう作ったばかりのサブドメインでアプリに接続できるようになりました。



お次はSSLの設定。これもしっかりまとまっています(Using an SSL Certificate with Heroku)。まずはダッシュボードからこんな感じでサブドメインを指定して証明書を購入します。これも一瞬で済みます。サブドメイン一つのみだと$20/year、ワイルドカードだと$100/yearっぽいです。



購入すると発行期間からemailでkeyが送られてくるので、こんな感じで証明書とPrivate Keyを設定。

$ heroku certs:add /tmp/server.crt /tmp/server.key /tmp/bundle.pem 
Resolving trust chain... done
Adding SSL Endpoint to .$oldapp.. done
$oldapp now served by $newapp
Certificate details:
Common Name(s): 
Expires At:.....

注意点としては$newapp.herokussl.comっていうアプリ名がSSL用のエンドポイントとして割り振られるので、ALIASの先をherokuapp.comから変更すること。じゃないと、証明書のドメインと一致しなくて激おこされます。こちらに書いてある通りです(Troubleshooting SSL error for *.heroku.com or *. herokuapp.com)。もともと非SSLのアプリへのALIASにしてあったので、キャッシュの関係で変更後もしばらくは怒られていましたが一晩おいといたらちゃんとアップデートされてhttpsでアクセスできるようになりました。

後は以下のようにConfigでProduction環境のみhttpsを強制するようにすれば終了。

--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -40,7 +40,7 @@Application.configure do
   # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
 
   # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
-  # config.force_ssl = true
+  config.force_ssl = true
という感じで初めての僕でも作業時間半日くらいでドメインを取得してサブドメインでSSL対応のWebアプリを公開するとこまでできてしまいました。もう一度やったら1-2時間で済みそう。ちなみにBatch Server用のAWSのドメイン登録もしたんだけど、こちらはPublic IPが割り振られているのでAレコードを追加するのみでした。

2013年11月27日水曜日

EC2とS3の設定してみた

Herokuで動作しているRuby on Railsアプリケーションで外部からのファイルを受け取るためにEC2とS3のセットアップをしてみました。HerokuはDyno単位で動作するという特性上、ファイルシステムをもっていません。だいたい皆さんS3を使っているみたいなので、以下の手順でファイルの受け渡しをしてみることにしました。
  1. EC2をSFTPサーバとして外部からファイルを受け取る
  2. EC2はファイルのバリデーションをしてS3と必要なデータをSync
  3. HerokuのアプリケーションがS3からデータ取得
ちなみに、むかーしにEC2のインスタンスをちょっと立てて放置したことがあるくらいで、AWSはほぼ初心者です。

Amazon S3


とりあえずS3の設定をしてみます。このチュートリアル(Get Started With Amazon Simple Storage Service)に従って進めたらBucketを作ってAmazonのコンソールからファイルをアップロードする所まではすぐにできました。

まずはBucketを作ります。



とりあえずRegionはHerokuに合わせてUSにしておく。


$heroku info
=== $server_name
Addons:        heroku-postgresql:dev
Git URL:       git@heroku.com:$server_name.git
Owner Email:   test@example.com
Region:        us
Repo Size:     2M
Slug Size:     36M
Stack:         cedar
Tier:          Legacy
Web URL:       http://$server_name.herokuapp.com/

Amzon S3のConsoleから管理ができる。

Amazon EC2

次にFTP Server / Batch Serverとして使うEC2の設定です。これも基本的にはAmazonのチュートリアル(Getting Started with Amazon EC2 Linux Instances)通りに進めればすぐにインスタンスが立てられます。

まずはOSを選ぶんですがAmazon Linux、Red Hat、SUSE、UbuntuからWindowsまで選択肢が多くて困る。Debianに慣れているしUbuntu AMIにしようかとも思ったけれども、無難にAmazon Linux AMIにした。とりあえず基本的なパッケージが安全に動けば良いし、AmazonのDocumentもAmazon Linuxを基準にしてあるみたいなので。



後はメモリやCPUやストレージサイズなどを適当に選んでいけばインスタンスが立ちます。最後にKey Pairが作れるのでそのPrivate Keyを使ってsshで接続すればすぐにLoginできます。


$ ssh -i ~/.ssh/amazon_ec2.pem ec2-user@pub_dns
Last login: Mon Nov 25 10:14:54 2013 from host

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|


これもAmazon EC2のConsoleからInstance増やしたりVolume追加したりなどの管理ができます。

ついでにEBS Volumeの作成とマウントもしといた。VolumeはEC2のコンソールから作るだけ。初回のみはVolumeのフォーマットが必要なので注意。でないとマウントでエラーになります。とりあえずext4にしといた。

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda1            7.9G 1023M  6.8G  13% /
tmpfs                 298M     0  298M   0% /dev/shm

$ sudo mkfs -t ext4 /dev/xvdf 
mke2fs 1.42.3 (14-May-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
 32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

$ sudo mkdir /mnt/ebs
$ sudo mount /dev/sdf /mnt/ebs

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda1            7.9G 1023M  6.8G  13% /
tmpfs                 298M     0  298M   0% /dev/shm
/dev/xvdf             5.0G  138M  4.6G   3% /mnt/ebs


EC2からS3へのデータ転送


まずは例のごとくAmazonのドキュメントを見ながらCliの初期設定をします(Getting Set Up with the AWS Command Line Interface)。Access Keyの設定とかPythonライブラリのインストールとかあって若干めんどくさい。

Pythonで書かれてるらしいんだけど、Localeの設定をしてあげないと以下のように盛大に死ぬので注意。

$ aws
Traceback (most recent call last):
  File "/usr/bin/aws", line 15, in
    import awscli.clidriver
  File "/usr/lib/python2.6/site-packages/awscli/clidriver.py", line 29, in
    from awscli.help import ProviderHelpCommand
  File "/usr/lib/python2.6/site-packages/awscli/help.py", line 20, in
    from docutils.core import publish_string
  File "/usr/lib/python2.6/site-packages/docutils/core.py", line 20, in
    from docutils import frontend, io, utils, readers, writers
  File "/usr/lib/python2.6/site-packages/docutils/frontend.py", line 41, in
    import docutils.utils
  File "/usr/lib/python2.6/site-packages/docutils/utils/__init__.py", line 20, in
    import docutils.io
  File "/usr/lib/python2.6/site-packages/docutils/io.py", line 18, in
    from docutils.utils.error_reporting import locale_encoding, ErrorString, ErrorOutput
  File "/usr/lib/python2.6/site-packages/docutils/utils/error_reporting.py", line 46, in
    locale_encoding = locale.getlocale()[1] or locale.getdefaultlocale()[1]
  File "/usr/lib64/python2.6/locale.py", line 478, in getdefaultlocale
    return _parse_localename(localename)
  File "/usr/lib64/python2.6/locale.py", line 410, in _parse_localename
    raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8

CredentialsのペアはSecurity Credentialの管理ページから作れる。aws configureでAccess Keyを設定すると~/.aws/configに設定ファイルが作られる。


$ aws configure
AWS Access Key ID [None]: $KEY_ID
AWS Secret Access Key [None]: $SECRET_KEY
Default region name [None]: us-west-2
Default output format [None]: json

やっとアクセスできるようになった。

 aws s3 ls s3://arita_test
2013-11-19 17:22:58        300 2013-11-19-17-22-57-69ED20ABB5DBF2F7
2013-11-19 17:27:56        326 2013-11-19-17-27-55-8498FB7A97E32996
2013-11-19 17:31:41        299 2013-11-19-17-31-40-81265F67425272DE
2013-11-19 17:33:08        584 2013-11-19-17-33-07-87A40B3132B18A50

regionの指定で少しハマったけど、US StandardではなくEC2と同じRegionでS3のBucketを作り直したら上手く行った。aws configureで指定したregionと違う場合は--regionオプションで指定してあげないと上手く行かない。

 $ aws s3 cp test s3://arita_test/  --region us-east-1
upload: ./test to s3://arita_test/test

 $ aws s3 sync s3://arita_test/  s3
download: s3://arita_test/test to s3/test

SFTP用のユーザ作成

さすがにec2-userでファイルを送るのは問題なので、SFTP用のユーザを作成。まぁ、これは素直にUnixのアカウントを作ってsshの設定をしてあげるだけ。
まずはユーザを作って

$ sudo adduser arita
$ sudo passwd arita
Changing password for user arita.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
公開鍵を置いてPerissionの設定。

$ su arita
Password: 
$ mkdir .ssh
$ chmod 700 .ssh/
$ vim .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
これでとりあえず、SFTPでデータを置いてS3にSyncするところまでは完成。

2013年10月19日土曜日

Facebook 広告を試してみる

会社の求人の広告をするためにFacebook広告を利用してみました。ターゲティングの詳細さに感動したのでちょっと紹介してみます。

まず、右上のアイコンから広告の作成ページに飛ぶ事ができます。




で、Headlineや説明や画像を設定したりできるのですが、ターゲティング機能が恐ろしくすごいです。

まずは市町村区単位での地域、年齢や性別の絞り込みは当然として、興味などでも絞り込みができます。例えば以下では東京都港区在住の30才以下でArsenalというサッカーチームに興味のある男女に絞り込んでいます。




また、利用しているアプリや恋愛関係のステータス、言語や学歴等でも絞り込む事ができます。婚活サイトや出会い系は独身者をターゲットに、転職エージェントは出身大学をターゲットにして広告を打っているといるんでしょう。「早稲田大学出身のあなたに」とかでてきますからね。



ちなみに、絞り込みを調整しながら、ターゲットの数が何人くらいになるのか、広告のクリック単価がいくらになるのかというのも確認する事ができます。



後は、予算と期間を決めて広告を出すだけです。



実際に広告がはじまると以下の画面からPVやらクリック数やらの詳細情報が見られるようになります。また、広告のストップなどもすぐに行う事ができます。




ところで、広告が始まった瞬間に以下のような画面が現れて、広告のアカウントが止められてしまうという問題が発生しました。サポートに怒りのメールを投げてみたら2日ほどで対応して直してくれました。どうやらPay PalのBilling Addresと僕の現在地や広告先が違っていたのが原因だったようです。





2013年10月18日金曜日

Rails Operation in Heoku

Heoku上でdeployとdbのマイグレーションやseedの流し込みをしたので簡単にまとめてみる。

基本的にはHeroku Toolbeltを利用してオペレーションをする事になり、簡単な運用方法はHeokuのサイトにまとまっています。

Getting Started with Rails 4.x on Heroku

けっこーな数のコマンドがあります。

$ heroku help
Usage: heroku COMMAND [--app APP] [command-specific-options]

Primary help topics, type "heroku help TOPIC" for more details:

  addons    #  manage addon resources
  apps      #  manage apps (create, destroy)
  auth      #  authentication (login, logout)
  config    #  manage app config vars
  domains   #  manage custom domains
  logs      #  display logs for an app
  ps        #  manage dynos (dynos, workers)
  releases  #  manage app releases
  run       #  run one-off commands (console, rake)
  sharing   #  manage collaborators on an app

Additional topics:

  account      #  manage heroku account options
  certs        #  manage ssl endpoints for an app
  drains       #  display syslog drains for an app
  fork         #  clone an existing app
  git          #  manage git for apps
  help         #  list commands and display help
  keys         #  manage authentication keys
  labs         #  manage optional features
  maintenance  #  manage maintenance mode for an app
  pg           #  manage heroku-postgresql databases
  pgbackups    #  manage backups of heroku postgresql databases
  plugins      #  manage plugins to the heroku gem
  regions      #  list available regions
  stack        #  manage the stack for an app
  status       #  check status of heroku platform
  update       #  update the heroku client
  version      #  display version


Dynoのステータスの確認

heroku ps
=== web (1X): `bin/rails server -p $PORT -e $RAILS_ENV`
web.1: up 2013/10/17 17:38:06 (~ 1h ago)

Rails Consoleもリモートの環境のものがこんな感じで使えてしまいます。

$ heroku run rails console
Running `rails console` attached to terminal... up, run.2213
Loading production environment (Rails 4.0.0)
irb(main):001:0> User.all
=> #<ActiveRecord::Relation [#<User id: 2, email: ...

rakeのCommandもheroku runとタイプするだけで走ってしまう。例えばdb:migrateだったらこんな感じ。

$  heroku run rake db:migrate
Running `rake db:migrate` attached to terminal... up, run.6382
Migrating to DeviseCreateUsers (20131014182214)
==  DeviseCreateUsers: migrating ==============================================
-- create_table(:users)
   -> 0.0243s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0076s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0087s
==  DeviseCreateUsers: migrated (0.0419s) =====================================

$  heroku run rake db:seed
Running `rake db:seed` attached to terminal... up, run.6750
ただ、rake db:migrate:resetとかのDBを書き換えちゃうようなコマンドはPermissionで怒られます。

$ heroku run rake db:migrate:reset
Running `rake db:migrate:reset` attached to terminal... up, run.2597
FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.
そんな時はheroku pgコマンドで対応できるっぽい。

$ heroku pg:reset DATABASE

 !    WARNING: Destructive Action
 !    This command will affect the app: $host
 !    To proceed, type "$host" or re-run this command with --confirm $host

> $host
Resetting HEROKU_POSTGRESQL_AMBER_URL (DATABASE_URL)... done

うーん。超簡単ですね。今後はDatabase周りの細かいオペレーションが必要になってくると思うので、この辺をみながらいじってみて勉強しとこっと。

2013年10月10日木曜日

RSpec with Rails4

今日はrspec-railsを使ってRails4にRSpecを導入してました。ここ(https://www.relishapp.com/rspec/)にドキュメントがすごくしっかりまとまっているので、これを見ながらやってました。

導入は相変わらず超簡単でGemfileにこんな感じで追加してbundle installした後にrails genearateで必要なファイルを生成するだけ。

# RSpec
group :development, :test do
  gem 'rspec-rails', '~> 2.0'
end

bundle install
rails generate rspec:install

モデルを作ると以下のようにTest:Unitの代わりにSpecを自動生成してくれる。
rails generate model test name:string
      invoke  active_record
      create    db/migrate/20131011100432_create_tests.rb
      create    app/models/test.rb
      invoke    rspec
      create      spec/models/test_spec.rb

Specだけ作りたい時はこんな感じ。
rails generate rspec:model user
      create  spec/models/user_spec.rb

こんな感じで他のSpecと同じように書けます。ちゃんとRubyMineで補完もしてくれる。

describe User do
  before :each do
    @testee = User.create! email:'hoge@hoge.com', password:'testtest'
  end

  it 'has fields' do
    expect(@testee.email).to eq('hoge@hoge.com')
    expect(@testee.password).to eq('testtest')
  end
end

bundle exec rspecで実行はできますが、.rpecファイルか引数でformat指定するとSpecの出力もしてくれて少し幸せになれる。

bundle exec rspec --format documentation

User
  has fields

Finished in 0.40579 seconds
1 examples, 0 failures

Randomized with seed 13270

という感じで安定のお手軽さに感動しました。

2013年10月9日水曜日

Railsでモデル生成のお勉強中

今日はこの辺りRails Guide - Getting Started with Rails#Adding a Second Modelを参考にしてrailsでmodelの実装をしてました。あまりの簡単さにびっくりした。

とりあえずrake generate modelでモデルの定義をするとmodel classとそのUnit Testとdbのmigration fileをわんさか作ってくれます。DBのmigration手順はここ(Rails Guide - Active Record Migrations)に良くまとまっていますが、必要に応じてindexやrelationなんかを追加しつつrake commandで簡単にDBを作る事ができます。rake db:migrateでdb/migrate以下に作られたmigration fileを元にじゃんじゃかテーブルを作ります。以下の順序で行われるっぽい。

  1. db/migrate以下のファイルからテーブルを作成
  2. データベースからdb/schema.rbを作る
また、rake db:migrate:resetを実行するとmigration filesからテーブルを作成してseed.rbを作り直す。db:resetだとseed.rbからテーブルを作るのでmigration fileを何回変更しても変わらない。
少しハマった…。

rakeのコマンドとかもまだ全く覚えていないのですが、rake --tasksで他のタスクがぞろぞろでてきてくれます。rake -Pで親タスクやその依存関係とかも出力してくれるっぽい。

例えば上記のdb:migrate:resetは3つのタスクを組み合わせたものらしい。

rake db:migrate:reset
    db:drop
    db:create
    db:migrate
また、rake test:allでUnit Testの全実行をしてくれるっぽい。

db/seed.rbに開発環境用のデータを用意できる。rake consoleから実行するのと同じように$class.new(:$field1 => $value)みたいな感じで書ける。RubyのScriptなのでファイルから読み込んでLoopでオブジェクト生成とかも非常に簡単にできそう。rake db:seedだと単純にseed.rbからデータをLoadする。rake db:setupだとスキーマごと作り直してからデータをLoadする。ちょこちょこデータファイルを変更する時は後者を使う。

あ、後作ったModelやそのObjectはrails consoleから確認してったら超効率よくできた。こんな感じで一通りモデルを作って、DBに反映させて、テストして、開発用データの準備までが半日かからずにできちゃいました。DBとModelの定義を固定して厳しい命名規則を受け入れるだけでこれだけの恩恵をうけられるとは。明日はRSpecを導入する予定。Rails楽しいね。

2013年10月8日火曜日

Cambridge到着

無事にTeir1 Visaもとれてケンブリッジに引っ越しをしました。人口も十万人少々しかいない小規模な町ですが生活に必要なものはすべて揃っているし、人々も親切で治安も良い非常に住みやすい町だと思います。緑が多く綺麗ですし、食べ物も想像していたよりずっと美味しいです。短くとも2年くらいは住む事になるはずなので、とても素敵な町で安心しています。



ケンブリッジで落ち着くまでの一ヶ月間は本当にドタバタでした。転職直後で慣れない仕事を進める傍ら、大学で授業を行いつつ、もろもろの住所変更やら部屋の引き払い等の引っ越し準備を行い、数多くの送別会でお別れを言いつつ、さらに父親が心筋梗塞で倒れるという災難まで重なり毎週名古屋に帰省するという、間違いなく僕の人生で一番大変だった訳の分からない一ヶ月間でした。幸い一度は心臓が止まった父親は後遺症もなく順調に回復し、僕も無事予定通りにケンブリッジに辿り着く事ができました。と思いきや初日というか飛行機の中から体調を崩して到着日に救急病院のお世話になるという超ドタバタが続き、体力的にも精神的にも疲弊しきっている状態だったのですが、仲間の支えもあり一週間たった今では十分に落ち着いて仕事に集中する環境ができています。

初めの週で銀行口座開設、携帯電話の契約、NHS(国民保険サービス)の登録、職場での環境設定、自転車購入などの必要最低限の生活インフラもひと通り整い、町にも少しずつ慣れてきました(まだけっこー迷うけど)。同じようなスタートアップ企業が集まるCo-Workingスペースが職場なのですが、早速他の会社の日本企業との商談を手伝ってあげたりして人間関係も非常に上手くいっています。

食べ物も思っていたよりは遥かにまともそうです。レストランもちょっと値段は高いけど十分美味しいし、スーパーも豊富にあるので近くのコリアンショップで肉を買って焼き肉をしたり、チキンを一匹オーブンで焼いて食べてみたり、日本のカレーライスを作ってみたりなどなどして食事を楽しんでいます。また、こちらは食べ物のデリバリーがすごく盛んなのでJUSTEATで調べれば数えきれないくらい多くデリバリー料理が見つかります。



父親の件もあり自分のこれからの人生や生死なんかについて一度落ち着いて考えてみたいななんて思ったりもする訳ですが、とりあえずは後悔のないように新しい仕事に全力で打ち込んでみたいと思います。街を案内できるくらいにはなっておくのでイギリスにお越しの際には是非お立ち寄りください。

2013年9月20日金曜日

Ruby2.0.0 & rails4 & Postgres on Herokuの環境づくり

Rails4をHerokuで動かす環境を整えた覚え書き。Postgresを使った一番スタンダードな仕様(のつもり)。


Ruby Mine
IntelliJに慣れつつある僕はRubyMineを使いたい。VimのKeybinding使えるし、デバッグしやすいし、安定しているし、良い!




Ruby on Rails
Homebrewとgemで適当にインストールした。超簡単なので覚え書きもしません。

RVM
その後、RVMでバージョン使い分けようとしたら少しはまった。たぶんHomebrewのと干渉したんだと思う。
https://rvm.io/

こんなエラーが出てしまった。
/Users/ippei/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/mkmf.rb:434:in `try_do': The compiler failed to generate an executable file. (RuntimeError)

You have to install development tools first.


以下をしてruby2.0.0とsqlite3をインストールし直したら直った。
rvm get head
rvm --force install 2.0.0
gem install bundle
gem install sqlite3

Postgres

Postgresはここを見ながら設定。Macでの設定はPostgres.appを使うと一瞬で済む。
https://devcenter.heroku.com/articles/heroku-postgresql

と思いきや何故かSocketのI/Oの場所がpgライブラリが見に行く場所と違ってエラーになるっぽいので、無理矢理以下のlinkを作って解決。

lrwxr-xr-x  1 root  wheel  4 Sep 10 09:14 /var/pgsql_socket -> /tmp

後はPostgresにアプリケーション名でユーザを作りつつ。
$ createuser -U ippei -P $user_name
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
rakeでDBを作る。
#rake db:create


Heroku


とりあえず、Herokuのインストラクションをみながら設定。すでにsqliteでひな形を作ってしまっていたので少しつまづいた。Herokuは基本Postgresぽいです。

以下のツールベルトというのがコマンドラインツール。いろいろ便利。
https://toolbelt.heroku.com/

上記の設定を済ませた上でHerokuのレポジトリにpushすれば動くはず。

Reference
https://devcenter.heroku.com/articles/rails4-getting-started
https://devcenter.heroku.com/articles/heroku-postgresql

2013年9月16日月曜日

非常勤講師@早稲田大学 - モバイルプログラミング

先週のJava(という名のScala)の授業に引き続き、今週はモバイルプログラミングというテーマで、Smart Phone向けのWeb Applicationを作るという授業を一週間行ってきました。今週は生徒が10名以上と多く一人一人のコードを細かく見る事ができなかったため、前回よりは講義形式に近い形で授業を進めました。本当は前回と同じようにGitHubのアカウントを作らせてpull requestで課題提出とか、作ったアプリをHerokuで公開して提出くらいまでしたかったですが、さすがに生徒数が多くそこまで手が回りませんでした。

でも授業の出来としては上々で、生徒全員が毎日出席してくれましたし、プログラミングの経験が乏しかった生徒達も最後の課題ではjQueryとTwitter Bootstrapを使ってレスポンシブなUIを作ったり、Google Chartsでグラフを作って利までできるようになりました。やはり皆さん若くて覚えが早いからかw、僕の期待よりは遥かに早いスピートで吸収してくれました。

今回のクラスでは「ドットインストール」をかなり活用しました。動画で学べる初心者向けのプログラミングサイトです。ドットインストールの動画を見せて、僕がライブコーディングをしてみて、生徒に実際に試してもらうというステップで進めてみました。やっぱり僕が空いた時間でちょこちょこ作った雑な資料なんかを使うより、より質の高い資料を生徒に会わせて上手く作った方が上手く教えられるという事が実感できました。これまでは教科書を使って授業という形が主でしたが、今後は授業によっては「Coursera」とかの外部の質の高い講義ごと利用しちゃったりした方が質の高い教育ができるんじゃないかななんて思ったりしました。そうすれば講師が個々の生徒のフォローに使える時間も増えそうですしね。

前回と同じように授業で使ったスライドとコードはSlideShareとGitHubで公開しています。また資料や生徒の課題はWebで公開してあります。

GitHub: https://github.com/peisan/WasedaMobileProgrammingClass
URL: http://mpwaseda.herokuapp.com/

2013年9月7日土曜日

非常勤講師@早稲田大学 - Java Programing上級

今週は夏期集中講義の非常勤講師として早稲田大学でJavaの授業を行なってきました。Javaといいつつ実は殆どをScalaで進めてしまったのですが。「Java Programing 上級」という授業だったのですが、やはり学生さんということで経験が浅く、準備した資料をアドホックに変更しながら初心者向けの授業にしました。

大学の先生達と同じ事をしていては面白くないので、IntelliJ、Github、Homebrewなどを導入して実際に僕がグリーで行っていた開発環境に近いような形で授業を進めてきました。最後の課題では素因数分解のプログラムを書いて貰ったりしたのですが、終了時にはPull Requestで提出してもらいました。

開発環境のセットアップに思った以上に時間がかかったりなど反省すべき点も多々ありましたが、生徒も楽しんで積極的に授業に参加してくれましたし、何よりどんどん吸収して上達していく生徒を見ているのが僕も楽しかったです。

ちなみに授業で使ったプログラムはgithubで公開、スライドはSlide Shareで公開しています。

github - https://github.com/peisan/WasedaAdvancedJavaClass

2013年9月5日木曜日

グリーで覚えた&忘れた単語リスト

GREEに入って覚えた言葉と忘れそうになった言葉をなんとなく羅列してみた。まぁ、何を学んで何を忘れていったのか何となく想像できますね。今度もう少し丁寧に整理してみようかな。

覚えた

  • CDN
  • LVS
  • Web Storage
  • App Cache
  • CSRF
  • SPOF
  • UX
  • DAU
  • MAU
  • UU
  • ささる
  • くばる
  • デグレる
  • 上長
  • リア充
  • ネト充
  • スイーツ()
  • ボトラー
  • 懐古虫
  • イカ娘
  • まどマギ
  • プギャー
  • モヒカン
  • マサカリ
  • ラブライブ
  • Homebrew
  • git-flow
  • Coffee Script
  • Tyepe Script
  • Zepto
  • node.js
  • PHP
  • Ethna
  • Shading
  • Master / Slave
  • play framework
  • finagle
  • sbt
  • Redis
  • DDD
  • Monad
  • Scrum

忘れそう

  • Bloomberg Tickers (jb/js/jl/...) 
  • Reconciliation
  • Tweak
  • PNL
  • Delta
  • FUTEQ
  • PVBP
  • Interpolation
  • fix / float leg
  • xccy
  • basis swap (e.g. 3m / 6m)
  • fixing risk
  • LIBOR / TIBOR / EURIBOR
  • Spring Framework
  • RMI
  • RMDS
  • dbunit


2013年8月25日日曜日

卒グリー(中退かも)

今月末で1年5ヶ月働いたグリー株式会社を退職することになりました。短い期間でしたが多くの大変貴重な経験をさせていただく事ができました。もう少し残ってさらにたくさんの事を吸収したかったというのが本音ですが、新たなチャレンジのために卒業(中退かも)させていただく事になりました。

思い起こせば入社時には、僕を採用してくれたはずの伊藤直也さんという有名なHackerが前日に退職しており、なんとドラクエ三昧になっているらしいという噂がなんてトラブルもありつつもオオヒダさんを初めとした他のメンバーがあたたかく迎え入れてくれたおかげで、投資銀行という全く異なる業界から来た僕も、すぐにチームになじむ事ができました。今はラクスルにいる山下雄太さん、山田あかねさんにも、当時は大変お世話になりました。

入社当時は、大手の証券会社という全く別の業界からきた事もあり、コミュニケーション面でも、技術面でも勝手が分からずおどおどしていたのを覚えています。「IRC?LVS?CDN?DAU?SPOF?なんだそれ?」みたいな。システムのリリース時にも何百台という単位のサーバにデプロイをするのはWeb業界のない僕には初めての経験で、初めは心臓バクバクでした。大きなミスをやらかしたりもしました。そんな僕でしたが数百万DAUという巨大Webサービスが如何にして運用させているのかというノウハウも少しずつ身につけ(実はけっこー日曜大工的ですw)、後半には海外のチームとの共同プロジェクトのマネジメントや、新規プロダクトの立ち上げ業務や、非常に技術力の高いエンジニア達のマネジメントも任せてもらえるようにまでなりました。特にかとじゅんや上村君の元ドワンゴ勢と一緒に仕事するのは本当に刺激的でした。本当はかとじゅんからもっと色々吸収したかったな。

グリーに入って一番感じた事は、技術好き、プロダクト好きの人の多さと、現場の裁量の大きさでした。やはりJPMorganという巨大な国際的大企業から、グリーという大きくなったとはいえまだベンチャー気質の残るインターネット企業への転職ですから、インパクトが大きかったのだと思います。

本当に技術が好きで、自分の作っているプロダクトが好きで、それが世に出てサービスとして使ってもらえる事を一番の喜びにしている人たちが本当に多かったです。プロダクトとかじゃなくて、常に自分の好きな技術を押し通してみたいな人達もいたしw。JPMorganにいた時は、モチベーションは「お金を稼ぐ」という人が殆どだったと思いますが、グリーは本当に多様で、モチベーションって人によってこんなに違うんだなというのを強く感じました。

裁量の面では、グリーでは与えられた仕事の枠をいくらでも広げたり壊したりできるというか、そもそも枠自体がすごく曖昧。というかテキトーすぎ!もう少しちゃんと決めろwむしろ枠を勝手に広げてしまえるような人が評価されていく感じ(もちろんちゃんと会社の利益になればだけどね)。JPMorganはやはりマネジメント主導の会社で、仕事の枠が予算とか上司や関係部署の承認などによってきっちり決められており、僕は前の職場で決められた仕事をサラリーマン的にこなしていくような働き方に慣れてしまっていたので、グリーの裁量の大きさはかなり衝撃でした。 今ではその裁量の大きさが僕のモチベーションの源泉になってしまっていますが。

あと、CTOの藤本さんにも驚かされました。CTOなのに現場レベルの仕事に自ら積極的に関わってくれている。僕も一度ヘマをした時に、付きっきりでフォローをして頂いた事がありました。マネジメントも現場のエンジニアを理解して、いかに僕らが仕事をしやすくするかを考えて進めてくれていました。憧れの存在です。

あ、なんかこう比べるとJPMorgan批判みたいになってしまいましたが(汗)、前職で身につけた能力があったおかげでグリーでもこれだけの事を吸収できたのだと思います。日本国内のエンジニア職であれだけグローバルな環境で働けたというのは本当にありがたい経験でした。国際感覚はかなり身につきましたし、証券業務のという複雑で専門性の高い知識、もちろんシステム開発や運用のスキルも身につきました。おかげで転職時も引く手数多でしたし:)

そうそう、最後に、グリーで働いたせいで「リア充」という言葉もしらないくらいリア充だった僕が、たった1年ちょっとでかなりWeb系のヲタの人達に順応してきてしまいました。朝会社こないし、短パンにサンダルだし、変な言葉いっぱい覚えたし、実は最近では変なアニメとかも見るようにまで…。グリーを突き抜けてドワンゴ化してしまいました。

それでは次のチャレンジへと進んでいきたいと思います。グリーでお世話になった方々、壮行会で暖かく追い出してくれた方々、どうも有り難うございました。おかげさまでいつも笑顔で楽しく働く事ができました。