ちわっす!

僕の会社フードフォトでは、一緒に働いてくれるエンジニア・デザイナーさんを大募集しています。

大歓迎なのは以下の4職種

  1. UI・Webデザイナー
  2. Railsエンジニア
  3. Titanium Mobile エンジニア
  4. サーバエンジニア

UI・Webデザイナーさんには、iPhoneアプリのUIやサービスのWebデザインを担当していただきます。

フードフォトは海外向けサービスですので、海外のiPhoneアプリやWebサービスが大好きな人大歓迎です。HTML5、CSS3など使いたい放題!

エンジニアさんは、二つ以上のスキルを持ち合わせた方を歓迎します。Railsとサーバ管理ができる!とかRailsとTitanium Mobileができる!とか。

現在は、上記にあげた職種の役割の7割くらいを僕が担当しており、わりとひーひー言っています。

海外で大きく成功することが目標です!一緒に夢を見たいという方、是非ご連絡を!

haga@foodfoto.jp

追記:

みなさんリツイートありがとうございます!

少し補足です。 雇用体系は正社員・アルバイト、どちらも可です。 オフィスは新宿タカシマヤにほど近いところにあります。

必須条件はGithubのアカウントがあることです(w)。

これは個人的な好みの問題ですが、いきなり面接・採用という感じでなく とりあえずお茶でも飲みながら、お互いに面白い!と思えるかどうか?TwitterやFacebookで緩く会話して、なんか良さそうねーというところから、一緒にやっていこう!と相思相愛になれるのがいいなと思ってます。

なので、別に今本気で入りたいわけじゃないけど、なんか気になるから話だけでも・・・とかでも全然OKだったりします。haga@foodfoto.jpか@func09までお気軽にどーぞ。

Posted in 日記 at 3月 28th, 2011. 1 Comment.

冴えないタイトルですみません。メモです。

Cucumber + Capybara で RESTful APIをテストする場合は

シナリオ: コメント投稿APIからコメントを投稿できる
  もし  パラメーター "body" に "こんにちは!" を設定する
  かつ  "コメント投稿API"を"POST"で送信する
  ならば ステータスコードは "201" であること
もし /^パラメーター "([^"]*)" に "([^"]*)" を設定する$/ do |param_name, value|
  @params ||= {}
  @params.merge!({
    param_name.to_sym => value
  })
end

もし /^"([^"]*)"を"([^"]*)"で送信する$/ do |page_name, http_method|
  send(http_method.downcase.to_sym, path_to(page_name), @params)
end

ならば /^ステータスコードは "([^"]*)" であること$/ do |status_code|
  response.status.should eq(status_code.to_i)
end

こんな感じでテストを書いています。(「コメント投稿API」はpath.rbで定義しておきます)

さて、本題ですが画像のアップロードでハマりました。
ハマった仮定は省きますが、CapybaraがRack::Testをドライバーとして使っているので、Rack::Test::UploadFile を使ってファイルアップロード周りのコードを簡略化できます。

シナリオ: コメント投稿APIから画像付きのコメントを投稿できる
  もし  パラメーター "body" に "こんにちは!" を設定する
  かつ  パラメーター "image" に "sample.png" をファイルとして設定する
  かつ  "コメント投稿API"を"POST"で送信する
  ならば ステータスコードは "201" であること
もし /^パラメーター "([^"]*)" に "([^"]*)" をファイルとして設定する$/ do |param_name, file_path|
  file = File.new(File.join(Rails.root, 'features/fixtures/images' file_path))
  content_type = MIME::Types.type_for(file.path)[0].to_s
  @params ||= {}
  @params.merge!({
    param_name.to_sym => Rack::Test::UploadedFile.new(file.path, content_type)
  })
end

Rack::Test::UpoadFileの使い方などは、Rack::TestのRSpecを見るとわかりやすかったです。
https://github.com/brynary/rack-test/blob/master/spec/rack/test/multipart_spec.rb

Posted in ruby, ruby on rails at 2月 16th, 2011. No Comments.

メモです。

RailsでMongoidを試していろいろやっているのですが、SQLでGROUPとか使う系の処理は、Mongoidに備わっているgroupメソッドよりもmap_reduceメソッドの方が良さそうなのでした。

MapReduce
http://www.mongodb.org/display/DOCSJP/MapReduce#MapReduce-map%E3%83%95%E3%82%A1%E3%83%B3%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3

map_reduce method in Class: Mongo::Collection
http://api.mongodb.org/ruby/current/Mongo/Collection.html#map_reduce-instance_method

例えばPointというコレクションがあって、ユーザーごとのポイントを集計してソートしたいという場合、以下のようなコードで集計&ソートできました。

m =<<-EOT
function(){
  emit(this.user_id, {
    point: this.point
  });
}
EOT

r =<<-EOT
function(key, values){
  var sum = 0;
  values.forEach(function(value){
    sum += value.point;
  });
  return {
    point: sum
  };
}
EOT
Point.collection.map_reduce(m,r).find.sort('value.point', :desc)

慣れればもっと複雑なことができるんだろうけど、mongodb自体よくわかってないので・・。

ここを参考にしました: MongoDB, Mongoid and Map/Reduce
http://nsaunders.wordpress.com/2010/08/09/mongodb-mongoid-and-mapreduce/

Posted in ruby, ruby on rails at 2月 13th, 2011. 2 Comments.

メモです。

非同期処理にResqueを使う場合、/resque にアクセスすることでResqueのジョブ管理画面を利用できます。

公開する場合、管理画面には認証をかけておきたいので、簡単にBasic認証をかけます。

Rails.root にあるconfig.ruを編集します。

require ::File.expand_path('../config/environment',  __FILE__)
require 'resque/server'
# run Rack::URLMap.new
#   "/"       => MyApp::Application,
#   "/resque" => Resque::Server.new

map '/' do
  run MyApp::Application
end

map '/resque' do
  use Rack::Auth::Basic do |user, passwd|
    user == 'admin' && passwd == 'passwd'
  end
  run Resque::Server.new
end%

これで「admin/passwd」で認証が掛かりました。

Rackって便利っすねー。

参考:http://akr97.com/capsule/?tag=ruby&paged=3

Posted in ruby, ruby on rails at 2月 4th, 2011. No Comments.

弊社フードフォトのコーポレートサイトをオープンしました。

http://foodfoto.jp

こちらは会社サイトということで、本サービスの方は鋭意作成中です。
3月のリリースを予定しまします。

まずは求人情報をぼちぼち載せていきますので、ご興味がある方は是非contact@foodfoto.jpまでご連絡ください。

今後とも弊社フードフォトをよろしくお願い致します。

そして今回は、CMSに純日本産のLokkaを利用し、デザインやコーディングもろもろをLokkaの開発を行っているフィヨルドさんに担当していただきました。

フィヨルドのデザイナー、町田さんとは好みのウェブデザインがあまりメジャーではない方向にことごとく被っていて、デザインテイストの意思伝達はとてもスムーズでした。

Posted in 日記 at 2月 1st, 2011. No Comments.

rspecで簡単にJSONの構造をテストしたい時に使えるTIPS

# spec/support/custom_matchers.rb
RSpec::Matchers.define :have_json do |selector|
  match do |response_body|
    selector.gsub!(/_/,'-')
    json = JSON.parse(response_body)
    prefix = case json
    when Array
      "/objects/object"
    when Hash
      "/hash"
    end
    doc = Nokogiri::XML(json.to_xml)
    doc.search(prefix + selector).size > 0
  end
end

have_jsonというカスタムマッチャを用意します。 JSONをXMLに変換し、nokogiriを使ってxpathで検索します。

# 試してないので動かないかも・・
# ex:response json
#  {
#    "hoge" :
#    {
#      "id" : 1,
#      "name" : "aaaaaa",
#      "body" : "bbbbbbbbbbbb",
#    }
#  }
describe HogesController
  context "GET /hoge/1.json"
    it "should have [:id, :name, :body] in response JSON" do
      get :show, :id => 1, :format => :json
      response.body.should have_json("/hoge/id")
      response.body.should have_json("/hoge/name")
      response.body.should have_json("/hoge/body")
    end
  end
end

サンプルはこんな感じ JSONの中身から、検索したいキーを、xpathで指定します。 キーが見つかれば、テストが通ります。

Posted in ruby at 1月 27th, 2011. No Comments.

最近Titanium Mobileをやってます。

http://developer.appcelerator.com/

Titaniumはとっても生産性が上がる素晴らしいツールなんですが 使っていくうちに、もう少しOOPっぽく楽に書きたいなと思うようになりました。

そのひとつの回答として「CoffeeScript」を使うというのがあるんですけど

CoffeeScriptを使ったTitanium Mobileアプリケーション開発

http://d.hatena.ne.jp/donayama/20110107/titanium_with_coffeescript

Objective-Cを生成するためのJavaScriptを生成するためのCoffeeScriptを書く というところに、どうしても抵抗があります(何をいまさら・・)。

複数人で、しかも学習しながら開発をしようと考えているので リファレンスやサンプルを一度CoffeeScriptに翻訳するというプロセスは 結構きついだろうと思いました。

そこでmootoolsを使います。

http://mootools.net/

mootoolsにはサーバサイド用のmootools-serverというのがあるので、それを使いましょう。

http://mootools.net/download

// app.js
Ti.include('mootools-core-1.3-server.js');
var Window = new Class({
    initialize: function(options){
        return Ti.UI.createWindow(options)
    }
});

var w = new Window({backgroundColor: '#fff'});
w.open();

こんな感じでクラスベースにコードを書いていくことができます。

Titaniumに適したJSライブラリを探している方、お試しアレ。

CM

僕が最近起こした会社FoodFotoでは、エンジニア、デザイナーを募集しています。

サーバインフラに強い方、Railsに詳しい方、TitaniumでiPhone開発したい方、iPhoneやWebサービスのデザインをしたい方、などなど募集中です。一緒に世界をめざそーぜ。

興味あるという方がいらっしゃいましたら、@func09haga@foodfoto.jp 宛にご連絡ください。

Posted in iPhone, javascript at 1月 13th, 2011. 1 Comment.

以前から考えていたことなんですが、デザイナーとエンジニアが個人レベルでWebサービスを作るためのチームを組むための場所が作りたい。

イメージ的にはWebサービスのためのルイーダ酒場。

インディーズバンドを組むくらいの気持ちで、Webサービスを作るパートナーを見つける出会いの場所です。

まずはそういうWebサービスを作って、いずれリアルな場所が作れるといいね。

もっともっと新しいサービスが立ち上がる機会が増えるといいな。

Posted in 日記 at 12月 12th, 2010. No Comments.

(この記事はRuby Advent Calendar jp: 2010 : ATNDの12日目です。前日はbash0C7さんでした。)

今日はRubyでイケてる管理画面を生成する「Typus」を紹介します。

Typusは

  • デザインがシンプルで素敵
  • 認証機能つき(認証なし・HTTP認証・DB認証から選べます)
  • ユーザーの権限制御が可能
  • Rails3で動く
  • テンプレートのカスタマイズが楽

という点でイケてます。

Rails2からRails3になって、様々なプラグインの定番が切り替わった印象を受けていますが、TypusもActiveScaffoldに変わって定番になるだろうなぁと思うので、是非使ってみてください。

https://github.com/fesplugas/typus

用意

まずは、Rails3で簡単なプロジェクトを作ります。ユーザーモデルとタスクモデルを生成します。

% rails new todo
% cd todo
% rails generate model user username:string
% rails generate model task title:string completed:boolean user_id:integer
% rake db:migrate

準備OKです。

Gemfile編集

Gemfileにtypusを追加します。

gem 'typus', :git => 'https://github.com/fesplugas/typus.git'

Bundleを更新します。

% bundle
Fetching https://github.com/fesplugas/typus.gitremote: Counting objects: 36226, done.
remote: Compressing objects: 100% (13705/13705), done.
remote: Total 36226 (delta 21273), reused 35447 (delta 20675)
Receiving objects: 100% (36226/36226), 3.81 MiB | 428 KiB/s, done.
Resolving deltas: 100% (21273/21273), done.
Fetching source index for http://rubygems.org/
Using rake (0.8.7)
… 略
Using typus (3.0.3) from https://github.com/fesplugas/typus.git (at master)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

ジェネレーターを実行して、管理画面を生成する

% rails g typus
create  config/typus/README
create  config/initializers/typus.rb
create  config/initializers/typus_resources.rb
以下略

できあがり! イヤッホゥ、超簡単!

さらにカスタムしたいなら

ドキュメントを参考のこと http://core.typuscms.com/

Posted in ruby, ruby on rails, 日記 at 12月 12th, 2010. 1 Comment.

はじめに

最近はてな界隈で、自分でWebサービスを作る人が話題になっていますね。

自分でWEBサービスを作りたいと思っている人へ

http://anond.hatelabo.jp/20101203150748

僕もこの元増田と同じように、数年前から自分でWebサービスを作りたいと考えるようになり、いくつかWebサービスを作りました。

その結果、サイバーエージェント・ベンチャーズ様から事業支援していただけるが決まり、起業することとなりました。

今日はそのご報告と、これまでやってきたことを改めてまとめようと思います。

僕と同じように個人でWebサービスを作りたいと思っていて、ゆくゆくは起業を考えている人の参考になれば・・・。

作る人間になりたい

数年前から、いろんな国内外のWebサービスが取り上げられたり使っているうちに、自分も同じようなアイデアを持っていたのになぁと考えるようになりました。

「そんなの俺も考えてた」みたいな事を言っていると、負け犬の遠吠えみたいでとてもむなしい気持ちになります。作らない人間と作る人間の差はとても大きいとわかっていたからです。

そんな時に『田口元の「ひとりで作るネットサービス」探訪』を見て、自分もとにかく作ってみようと決めました。

http://bizmakoto.jp/bizid/hitori_index.html

まずは必要なスキルを身につけなければならないと考えました。

作れるようになるまでにしたこと

当時僕はWebデザイナーだったので、デザイン周りはとりあえずできました。FlashでActionScriptも理解していたので、プログラミングの基本的な知識はありましたがサーバサイドのことはさっぱりでした。

そこで数ヶ月の間、強制的にPC環境をLinuxにしてみたり、Emacsを覚えたり、自宅サーバを立てて、サーバ管理の初歩を学びました。

またサーバサイドプログラミングにはRuby on Railsを選択しました。当時バージョンは1.2くらい(現在は3.0.3)だったと思います。 Railsを選んだ理由は、とにかく短期間にシステムが構築できるということ、フレームワークの設計がとても美しくてWebシステムのいろはを全く理解していなかった自分はRailsからノウハウを習得できそうだと思ったこと、そして何より楽しかったことが決め手です。

これからサーバサイドプログラミングを学ぼうという方は、Railsをオススメしておきます。 Railsは書籍も充実しているし、日本語の技術情報が豊富なので、自分で調べる力があればきっと作れるようになるはずです。

そういう環境があるのは、RubyやRailsを愛している人たちのコミットの積み重ねで成り立っているので どんな些細なことでもいいから、ブログにわかったことを書いてみたり、勉強会に参加してコミュニティを盛り上げていく人が 一人でも増えればうれしい。

僕自身ビギナーの頃にネット上の情報にとてもお世話になったので、ビギナーの人が参照できる情報がひとつでも増えるようにとブログに記事を書き続けています。

作れるようになってから

スキルを身につけただけではWebサービスは作れませんでした。

作りたいと思うアイデアを、とにかくメモしてメモして、空き時間に振り返ったり、サービス設計したり いろんなサービスを使ってみたり、新しいサービスはすぐ研究したり。 そういうことを続けていたら、自分のネタ帳はサービスにならなそうなものから、一人では作れなそうなものまで、たくさんストックされるようになりました。

アイデアはある、スキルもある、けれども作る時間がない・・・そんな考えを打ち消すために @komagata の書いた記事を何度も読んで、「とにかく作る!」と言い聞かせました。

個人でWebサービスを作る時に一番大変なこと http://labs.unoh.net/2007/03/komagata_1.html

目標に掲げたのが、「とにかくオープンすること。」 なんて低い目標だと驚かれるかもしれませんが、仕事で作るのとは違って個人でWebサービスを作る上で一番大変だったのは“やる気を継続させること”でした。

この時期は、ネット上で見つけたアワードに出すという目標を掲げることで、短い期間で一気に作る。という事をしていました。

ビジネスを考える

自分でWebサービスが作れるようになると、それだけでは物足りなくなってきました。

もっとたくさん人に使ってもらいたい、という気持ちが芽生えはじめてきて、

たくさんの人を満足させつづけるサービスにするために、ビジネスが乗っかるポテンシャルがあるようなネタを考えるようになりました。

このサービスがこうなったらこんなビジネス展開ができるよね、みたいな妄想のような感じです。

ビジネスになりそうもないものを作りながらも、いつか作りたいビジネスアイデアが溜まっていって

それを実現できる場を探していました。

起業支援プロジェクトに募集する

そんな時に知ったのがサイバーエージェント・ベンチャーズの主催する「Startups2010」でした。

http://www.cyberagentventures.com/startups2010/

自分でビジネスしてみたいと思いながら行動に移さないのは、

Webサービスを作ってみたいと思いながら何もしなかった当時を思い起こさせました。

そして、一番自信のあるビジネスプランを投稿しました。

FoodFotoというサービスを作ります

100組ほどの投稿があったなかで、最終的に選ばれた5組に入ることができました。

インターネットビジネス支援プロジェクト「Startups2010」支援5チームを決定 http://www.cyberagentventures.com/news51.html

[jp]サイバーエージェントがStartups2010の支援チームを発表、結果は5チーム

http://jp.techcrunch.com/archives/jp20101201cyberagent-pick-out-5-teams-for-startups2010/

サイバーエージェント・ベンチャーズ、「Startups2010」の支援企業5チームを決定 – CNET Japan

http://japan.cnet.com/news/business/story/0,3800104746,20423586,00.htm

個人で作っていたラペコ(http://rapeco.jp)というサービスを

スマートフォン、海外向けにチューニングした「FoodFoto」という事業で起業します。

やっとスタートラインに立ったという感じですが、とりあえず報告です。

まだまだ経営者として至らない点がたくさんありますが、今後とも宜しくお願いします。

一緒にFoodFotoを創りあげてくるパートナーを募集してます!

今回のFoodFotoを手伝っていただける人を絶賛募集しています!

  • ネイティブな英語ができる人
  • RailsやiPhone開発に明るいエンジニア
  • PC、iPhoneのUIデザイナー

我こそは!という方、お気軽に @func09 または、mitsuru.haga@gmail.com までご連絡ください!

謝辞

今回支援に至るまでのモック作成に2人の尊敬する人たちにご協力いただきました。

@kurasari はiPhoneクライアントの作成で協力していただきました。ありがとうございます!

株式会社4696(http://www.4696.co.jp/)の@9d さんにはUIデザインを作成していただきました!ありがとうございます!

本当にありがとうございました!

サイバーエージェント・ベンチャーズ様、事業支援ならびに様々なアドバイスありがとうございます。

今後FoodFotoの事業を成功させるために全力を尽くす所存ですので、よろしくお願い致します。

追記

Railsを今から始めたい人は以前書いたこちらの記事をどうぞ

Rails3でどう書けばいいかわからない時、参考になる7つのURL
http://kray.jp/blog/url_reference_for_rails3/

Posted in Webサービス, 日記 at 12月 10th, 2010. 8 Comments.