この4月で@hrysd(永和システムマネジメント様入社おめでとうございます!)や知の巨人など、みんなインターンシップを卒業されたので新たに募集したいと思います。

思いつきで始めたリモート・ローカルインターンの仕組みですが、10ヶ月程運用してみて「意外と回るな」という感じだったのでWebアプリにしてみました。

256 INTERNS

256インターンとは

Webプログラマー・Webデザイナーのインターンシップをスムーズに行う仕組みです。インターンシップにはオフィスに通うローカルインターンとインターネット経由でのみ行うリモートインターンがあります。インターンは1週間交代で学習と作業を交互に行います。

インターンシップとは

インターンは職業訓練と就業体験を得、企業は見込み社員と労働力を得る仕組みです。

報酬について

インターンから見て「お金を払って職業訓練を得るスクール」と「お金を貰って職業訓練を得るアルバイト」の中間地点にはインターン・企業の両者に取って「お金のやり取りがゼロ円の地点があるのではないか」ということを考えました。

1週間毎に学習と作業を交換することで知識と作業の物々交換を行います。

具体的にどんなサービス?

要するに、学習週=Eラーニング、作業週=タスク管理システムを組み合わせたサービスです。(今のところタスク管理はオープンソースのFulcrumを使っていますが)

256インターンを使ってEラーニングができ、Lingrのチャットで質問したり教わったりすることができます。

参加企業募集

256インターンはその名の通り、256人でインターンを行うことを前提に作られました。まだ16人なので8倍必要です。企業側も弊社(フィヨルド)だけでなく、この仕組を使ってインターンシップを行いたい企業様を募集しています。

株式会社root様と今回合同で募集することになりました。株式会社root様はデザイナーとプランナーの方の会社なのでプログラマーのインターンを募集したくても、教えることができないという問題がありました。そこでこの仕組を使うことでプログラマーの勉強も可能にします。

ドッグフードを食べる

256インターン自体、作りながら運用しています。既にインターンの方がツールを改修しつつ勉強しています。ソースコードはこちらで公開しています。

fjordllc/interns · GitHub

ローカルインターン

ローカルインターンはオフィスの席の数に限りがあるので、今回は2名募集します。(リモートは無制限です) プログラミングが好きな方、是非ご応募お願いします!

アップロード画像に関してはこちら

画像をS3にアップする - komagata

残りのassetsもS3に置いていきます。

# Gemfile:
group :assets do
  gem 'asset_sync'
end
$ rails g asset_sync:install --use-yml --provider=AWS
# conifg/asset_sync.yml:
defaults: &defaults
  fog_provider: 'AWS'
  aws_access_key_id: "XXXXXXXX"
  aws_secret_access_key: "XXXXXXXXXXXXXXX"
  fog_directory: "kowabana-jp"
  fog_region: "ap-northeast-1"
  existing_remote_files: keep

development:
  <<: *defaults
  enabled: false

test:
  <<: *defaults
  enabled: false

staging:
  <<: *defaults
  fog_directory: "staging-kowabana-jp"

production:
  <<: *defaults

これだけでrake assets:precomipleした時にS3にアップしてくれます。便利ですね。

# config/environments/production.rb:
KowabanaJp::Application.configure do
  config.action_controller.asset_host = "//cdn.kowabana.jp"
end

こうするとimage_tagとかasset_pathとかが吐くURLがCDN(CloudFront)になってくれます。

Engine Yard Cloudならではの部分

特に無し。ey deployのデフォルトではrake assets:precompileが走るので特に気にしなくてもアップされます。楽だわあ。

% zip -e foo.zip foo.txt 
Enter password: 
Verify password: 
updating: foo.txt (deflated 70%)

あんまり使う機会ないけど、お客さんによっては社内規則になってたりするので。

paperclipで画像をアップロードしてた場合、S3に移行するのは簡単。paperclipはDB内にファイルのパスを持ってるわけじゃないので、サーバーファイルシステム上の画像を全部S3にコピーした上でアプリの設定を変えれば良い。

# Gemfile:
gem 'paperclip'
gem 'aws-s3'
gem 'aws-sdk'
# config/initializers/paperlicp.rb:
if Rails.env.production?       
  Paperclip::Attachment.default_options.update(
    storage: :s3,              
    s3_credentials: "#{Rails.root}/config/s3.yml",
    s3_host_alias: Settings.cdn_host,
    path: ":class/:id/:attachment/:style",
    url: ':s3_alias_url'
  )   
end
# config/s3.yml:
production:
  bucket: kowabana-jp
  access_key_id: xxx
  secret_access_key: xxx
  s3_host_name: s3-ap-northeast-1.amazonaws.com

development:
  bucket: bucket_name
  access_key_id: xxx
  secret_access_key: xxx
  s3_host_name: s3-ap-northeast-1.amazonaws.com

test:
  bucket: bucket_name
  access_key_id: xxx
  secret_access_key: xxx
  s3_host_name: s3-ap-northeast-1.amazonaws.com

modelのhas_attached_fileに渡すオプションが環境毎に違ってたりする場合はinitializers以下に書いた方がスッキリする。productionでだけS3(ここではCloudFrontを使うのもの一緒にやってます)にする場合は上記。(staging環境で何か動かす時にもS3に影響が出ちゃうので注意する)

environmentを作る時に選んだタイミング・回数分保存されてます。リンクからmysqldumpの内容がダウンロードできます。分かりやすいですね。

他の環境ではDBバックアップはdumper.ioが超オススメです。

管理画面から簡単に設定できる。怖話では毎日夜中の11時に怖い話をお届けするTwitterボットやランキングの集計にcronを使っている。

この画面から設定したcronjobはAppサーバーのMasterに反映されるようだ。mysqlcheckなど、DBサーバー上で実行したい場合は直接やった方がいいんだろうか。

HerokuのようにSendGridアドオンを使う。

アドオン画面からSendGridを選び、対象のアプリ/environmentを選んでactivateしておく。

Set it upの内容にしたがってey_configというgemを入れておく。これはEYCと連携した各種サービスのIDとかパスワードとかを良いように扱ってくれる。

メールはsendmailでサラッと送りたい気がするが、EC2上のIPはブロックされてたりするのでSendGridやGmailやSESを使うのが無難なようだ。SendGridは無料プランでは1日200通までなので若干不安ではある。

Set it upに書いてあるようにconfig/environments/production.rbに下記を追加する。

config.action_mailer.delivery_method = :smtp
config.action_mailer.default_charset = "utf-8" # NOT FOUND ON RAILS3.1
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.smtp_settings = {
     :authentication => :plain,
     :address => "smtp.sendgrid.net",
     :port => 587,
     :domain => "yourdomain.com",
     :user_name => EY::Config.get(:sendgrid, 'SENDGRID_USERNAME'),
     :password => EY::Config.get(:sendgrid, 'SENDGRID_PASSWORD')
}

EY::Config.getという部分でサーバー上に良い感じに置かれた設定ファイル(実際には/data/app_name/shared/config/ey_services_config_deploy.yml)から値を読みこんでくれる。

ここで罠なのが、config.action_mailer.default_charsetというメソッドはrails3.1以降は存在しないというところだ。うっかりproductionへデプロイするとサイトがエラーになる。stagingというenvironmentを同じ構成で用意し、試しにデプロイしてみてからの方が無難だろう。

$ ffmpeg -i movie.mp4 -vf scale=240:-1,thumbnail=20 -an -vsync 0 img%03d.png
$ convert -delay 20 -loop 0 *.png YJSNPI_WHO_LEAPT_THROUGHT_TIME.gif

ffmpegで20フレーム毎、横幅240pxアスペクト比固定でリサイズし、imagemagickでanime gif化する。

弊社(FJORD, LLC)がEngine Yardとパートナーシップ(的なもの)を結んで怖話Engine Yard Cloud(以後EYC)に移行しました。

(飽くまで”的なもの”で、ちゃんとしたパートナーシップはこういうの

トライアルで検討する

トライアルで試した件については以前こちらに書きました。

Engine Yard Cloudを試す - komagata

本契約前に

貧乏会社なので複数台サーバーなんていくら掛かるのか怖い。料金シュミレーターで予め見積もっときました。

さくらVPSから移行したのは複数台構成のためなので、ちょっと奮発してappサーバー2台+dbサーバー1台の構成にしてみました。高けー!

デプロイ

手順はトライアルの時と同じです。ただ、本契約の場合は東京リージョンが選べます。

アクセスしてみる

appサーバー2台あるけど、どのIPにアクセスしたらいいの?と思いましたが、Application Masterの方のSSHのリンクをクリックする時に出るURLにIPがハイフン区切りで出てるのでそこにアクセスします。(この場合は54.249.225.67)

dbの方もそれで直接dbのインスタンスにsshできます。ユーザー名はdeployでした。

アプリをEYCに合わせる

EYCに載せるに当ってアプリを修正しないといけない点が2点ありました。

rubyを1.9.3系にする

EYCはまだruby2.0.0に対応してないので1.9.3系に変更しました。あんまり変わらないだろうと思ってましたが、encodingのmagic commentが無くていくつかエラーが。泣く泣く追加しました。

ユーザーのアップロード画像をS3に移行

これはEYCだからではなく、appサーバーが複数台になるのでユーザーがアップする画像をローカルに保存してたら迷子になります。幸いpaperclipの画像保存先をS3にするのは簡単で1日あれば対応できました。

データベースの移行

$ ssh bodom "mysqldump -udeployer -pXXXXXXX kowabana_production" | ssh db.kowabana.jp "mysql -uroot kowabana" 

これはコマンド1行でOK。sshで入れるとこういうところが楽ですね。EYCのdb名はアプリ名と同じになるようです。mysqldumpは全テーブルロックするのでデータ量の大きなサイトではこういう雑な移行はオススメできません・・・。

railsアプリのdatabase.ymlの接続先は変えなきゃいけないんじゃないの?と思いましたが、EYCのdeployのレシピで良い感じにdatabase.ymlを生成してくれるそうです。便利。

サポートチャット

トライアルの時もお世話になったサポートチャットですが、グローバルの方は平日の8AM PST - 6PM PST(日本では1時から13時)がサポート時間です。

これは豆ですが、Engine Yardの日本法人のトップページのチャットから発信すれば日本人が日本時間で対応してくれます。

感想

まだ移行したばっかりなのでどうなるかわかりませんが、移行作業自体は思ったより早く簡単にできたなと思います。最近セキュリティ周りがキナ臭いのでその辺は安心感がありますね。(最近別の仕事でウィルスに感染したPHPのサイトの調査をやったばかりです。)

オープンネットワークラボにGithubのPJらが来た時のイベントで「初期のGithubはEngine Yardにサーバーを借りていた」という話を聞いてその後の懇親会でいきなり不躾にも「弊社にもサーバー貸してください!」と@yandoさんに無茶振りしたことから始まった話でしたが色々お手数をお掛けしつつ移行できてよかったです。ありがとうございます。

  1. おこ
  2. 激おこ
  3. 激おこぷんぷん丸
  4. ムカ着火ファイアー
  5. カム着火インフェルノ
  6. 激おこスティックファイナリアリティぷんぷんドリーム