The longest day in my life

Jul 23

「#ココなう」は旅の出逢いを演出する、素敵すぎるサービスです。

「旅の楽しみ = 出会い」という話

昔から、旅行が好きでいろんなところに行くんですが、よく聞かれるのが、「どこが一番良かった?」という話です。

それで、どこが面白かったかなーとか思い出してみると、思い出すのは、

みたいな感じで、その旅先での出会いがより心に残ります。

チェンマイはいい街だと思いますが、マイケルの記憶しかないんです。。

そんなわけで、旅の出逢いを演出する「#ココなう」をリリースするに至りました。

いのうえくんとの出会い

いのうえくんに最初に出会ったのはいつなのか、忘れてしまったんですが、5年ほど前、ベトナムの旅行会社に彼が就職してきた時に知り合いました。

入社まもなく、「ホーチミン在住の日本人のコミュニティになるようなWebサービスをつくりたい」と言ってくるいのうえくんに「いいんじゃない!作ってみたら。」と割と気安く答えたんだと思います。

それから5年ほど経ち、ついに1つのサービスをリリースする事になったのは、まさに、偶然の出会いの産物です。そして5年越し!

偶然の出会いが人生を豊かにする

旅先の出会いがなぜ魅力的か、それは「偶然」だからだと思います。その偶然が運命を感じさせて、その出会いをより貴重なものに感じさせます。

じっさい、人生でたった一度しか行かない場所に行った時に、偶然、同じ場所にいる人との出会いって、奇跡ですよね。

そして、その奇跡の出会いがもっとたくさんの出会いを呼び、人生を豊かにします。

もっと、「偶然に出会う」ための#ココなう

そうです、もっとたくさん「偶然の出会い」「運命の出会い」を作りたい!という思いで作ったのが「#ココなう」です。

今日もたくさんの旅行者が「#ソウルなう」なんてつぶやいています。それは今、あなたがご飯を食べているソウルのブルゴキ屋の後ろの席でつぶやかれたのかもしれません。

そしてあなたも、 #ホーチミンなう とつぶやいてみてください。

そして、たくさん出会いを生み出しましょうー。

Jul 18

Virtualboxをたちあげたら「Device eth1 does not seem to be present, delaying initialization.」というエラーでネットワークが起動しない

という問題に遭遇しました。

結論から言うと、Vagrant: Broken Networking When Packaging Ubuntu Boxes - AbleCoder にある通り。

/etc/udev/rules.d/70-persistent-net.rules

このファイルを削除して、vritualboxを再起動すればOK

virtualboxを起動中に他のvirtualboxを作成、起動すると、MACADDRESSがちゃんと生成されずに eth1 がリネームされてしまうという問題?らしい。。

参考:

Jun 25

クラウドサーバー上の開発環境をvagrantに移した

ことのなりゆき

最初は、「開発環境はすべてクラウド上に」ということで、さくらのクラウドを契約し、そこに全ての開発環境を入れてました。

基本的にはPHP/MySQLなプロジェクトとRailsプロジェクトのどちらかで、nginx をWebサーバーにして、PHPプロジェクトはnginx をリバースプロキシにしたapache構成にしてました。

Rails はnginx上でvirtual hostを作り、PHPはapache上でvirtual hostを作る。データベースは Rails -> SQlite でPHP -> MySQLとたまたまPHP/MySQLの組み合わせばっかりだったので、OKでした。

全てのプロジェクトをBasic認証で保護してました。

良かった点

Railsプロジェクトをローカルに移住

ベトナムに住むようになって、以前からちょこちょこ問題に感じていた、ネットワークが繋がらない/遅い時につらい。という点が顕著になってきました。

特にベトナムではネットが遅いことが多く、ターミナルのレスポンスが一拍遅れてイライラ感が貯まることが多々あり、開発環境のローカル移住を考え始めました。

その他にいくつかの理由から、ローカル開発がしやすくなってきました。 で、Railsプロジェクトを徐々にローカルマシンに移住させました。 新しいプロジェクトは全てローカルマシン上に設定しています。

で、PHPプロジェクトはクラウド上に取り残されました。

vagrant を試してみる

vagrant を知ったのは半年くらい前だったんですが、何年か前に使ったことがある、VMwareとかそんな感じだっと思ってて、毎回立ち上げるとか面倒!とおもってスルーしてました。

が、徐々にプロジェクトが増えるに従い、ネットが遅いイライラ感だけではなく、PHPのバージョン/ライブラリ管理など、気持ちを落ち着けるだけでは済まされない問題が出てきました。

それで、移住を始めたわけです。

手順

  1. vagrant centos6.5を立ち上げる (box を取ってきて作成)
  2. MySQL, Apacheをインストール、基本設定した時点でパッケージ化
  3. 必要なバージョンのPHP/ライブラリをインストール
  4. ソースをgit clone する
  5. Virtual Hostの設定
  6. my.ini, php.ini など設定があれば反映
  7. データベース内のデータを移住
  8. Apache, MySQLを再起動
  9. 必要に応じて、cronなど設定

以上で終わり。プロジェクトによっては立ち上げたらエラーになって、特殊な設定をしないといけない場合もありますが。

残された課題

参考になったページ

Jun 18

Rails すごいね。

http://blog.eiel.info/blog/2013/07/20/not-in-on-rails/

うーん、すごい。Rails4!

Jun 11

音楽専門クラウドファンディング&交流サイト - muevo

井草さんと初めて顔を合わせたのは4月の中頃、このサービスの開発をお手伝いするようになって、3週間位経った後でした。

前任の開発者からプログラムといくつかの資料を引き継いで、すでにいくつかの機能の開発を進めていました。

初めてあった正直な印象は思ったより好青年って感じでした。

それほど長い時間ではなかったですが、昔バンドをやっていたこと、音楽業界にいくつかの不満を感じたこと、音楽業界から一度離れたこと、といった、経緯を聞き、あらためて、このサービスの意義、彼のやりたいことを聞きました。

自分にとって音楽は、中高時代のバンドブームの時に日本のバンドの曲を聞き、大学になってバイト仲間の影響で洋楽を聞くようになったり、研究室でFMラジオをひたすら聞いたりしていましたが、最近は新しい曲を聞くこともなくなり、カラオケに行っても2000年以降の曲はほぼ知らない、歌えないってかんじです。

ましてや、自分が演奏することに関してはトライした経験もほとんどなく、鼻歌も人には聞こえない大きさでするレベルです。

そういうわけで、最近の音楽業界といえば、CDが売れないとか、AKB的なこととかニュースでやるようなことしか知らず、音楽業界について考えたことなどありませんでした。

ただ、自分が打ち込んできたことに別の形で携わるという、彼の人生の選択はすごいなと思いました。ステキだなと思いました。

井草さんの新しい人生の目標、

『音楽業界をより素晴らしい物にする』

を実現するサービスを形にすること。
その目標に携わることができること。

偶然の出会いですが、井草さんと会えて、彼の夢の実現に携われたことに感謝です。

もう少しでスタートライン。

音楽専門クラウドファンディング&交流サイト - muevo

Apr 11

Grunt を使うためのチュートリアルメモ

とりあえずメモ。

Grunt のサイト

オフィシャルなページ。Getting Started をさらっと見る。

CSS Minifyをする

簡単にCSS Minifyをスタートするまでの方法

環境を作る

CentOSではNode.js はBuildしないとだめ。Python 2.7からインストールを始めます。

Mar 22

Rails好きのための、WordPressなサイトとのつきあい方

世の中はPHP案件にあふれていますね。ほんとに。 できればPHPとは距離をおいて生きていきたいんですが、そうもいかなくなってきています。 最近はWordPressをベースにWebシステムを作る、なんて話もけっこうあるらしく、「ほほぅ。」という感じで見ていますが、これがなかなかおもしろい。 とはいえ、Productionな運用を目指すなら、やっぱりRailsの方が楽なことが多いと思うんですよね。
  1. テストフレームワークが充実している
  2. ページキャッシュの自由度の高さ
  3. gem ‘exception_notification’
そんなわけで、案件をRails化しようと目論みつつ、WordPressなデータベースをRailsで扱ってみました。

とりあえず、コネクション

MySQLなコネクションを設定するだけなので、簡単です。 config/database.yml を適宜設定します。

ユーザーテーブル用のモデル

WordPressのユーザーは wp_users テーブルに保存されるので、そのためのUser を作ります。 wp_usersのprimary keyはIDですが、大文字小文字関係ないので、ほっときます。
class User < ActiveRecord::Base
  self.table_name = 'wp_users'
end

ユーザー情報テーブル用のモデル

WordPressのユーザーテーブルはものすごくあっさりしてます。
mysql> desc wp_users;
+---------------------+---------------------+------+-----+---------------------+----------------+
| Field               | Type                | Null | Key | Default             | Extra          |
+---------------------+---------------------+------+-----+---------------------+----------------+
| ID                  | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment | 
| user_login          | varchar(60)         | NO   | MUL |                     |                | 
| user_pass           | varchar(64)         | NO   |     |                     |                | 
| user_nicename       | varchar(50)         | NO   | MUL |                     |                | 
| user_email          | varchar(100)        | NO   |     |                     |                | 
| user_url            | varchar(100)        | NO   |     |                     |                | 
| user_registered     | datetime            | NO   |     | 0000-00-00 00:00:00 |                | 
| user_activation_key | varchar(60)         | NO   |     |                     |                | 
| user_status         | int(11)             | NO   |     | 0                   |                | 
| display_name        | varchar(250)        | NO   |     |                     |                | 
+---------------------+---------------------+------+-----+---------------------+----------------+
で、他の情報はどこにあるかって言うと、 wp_usermeta テーブルにあります。なかなかの自由度を持ったテーブルです。 モデルを作ります。
class UserMeta < ActiveRecord::Base
  self.table_name = 'wp_usermeta'
end
そして、 user.rb から参照できるようにメソッドを作ります。 こんな感じです。だんだん話がややこしくなってきましたが、これ以上進むと。。なので。これくらいで。
class User < ActiveRecord::Base
  self.table_name = 'wp_users'

  def meta key
    mt = metas.select{|m| m.meta_key == key.to_s }
    mt.blank? ? nil : mt[0].meta_value
  end

  def name
    [meta(:last_name), meta(:first_name)].join
  end
end

WordPressのユーザーでログインする

ユーザーテーブルの参照ができたので、やりたくなるのがログインです。 すでにデータベースに登録されたユーザーでログインしたいです。 session/cookie云々は割愛するとして、最近のWordPressのパスワードは PHPASS という暗号化方式で保存されているらしいです。 初めて聞いたので、「むむむっ!」と思いましたが、ちゃんとgem がありました。 uu59 さんすごい。 そして作った sessions_controller.rb はこんな感じです。 たった2行で認証できるんです。 ちなみに、「8」は wp-includes/pluggable.php 内にある wp_hash_password() という関数にある 8 です。
$wp_hasher = new PasswordHash(8, true);   
そして認証のコア部分はこの2行です。
phpass = Phpass.new(8)
phpass.check(params[:password], user.user_pass)

参考

Mar 05

どうでもいい、Homebrewのアイコンの話

MacBook使って2年ほど経ちます。
故障も出てきて、そろそろ限界を感じてますが、いまさら気が付きました。

brew install した時のアイコンが生ビール!

なんかうれしい。

Feb 16

Mongo Mapper をつかったサイトを Rails 4.0 にした

とあるサイトを思い立って、Rails 4.0 にアップグレードしました。 久しぶりすぎて、MongoDB (MongoHQ) を使っていることを忘れていたため、かなり軽い気持ちではじめましたが、これがなかなか。。 この辺を参考にして。

一般的なRailsのアップグレードで開発環境を立ち上げる

rake rails:update したり、config/routes.rb の match をpost/get に変更したり。

MongoMapperの対応

開発環境を立ち上げてみると、MongoMapperのコネクションエラー。 調べてみると、 stable なRails4 版はまだないんですね。。

MongoMapperのバージョンを指定

ベータ版を指定します。
gem 'mongo_mapper', :git => "git://github.com/mongomapper/mongomapper.git", :tag => "v0.13.0.beta2"

active_recordをはずす

config/application.rb の冒頭でrails 全てではなく、active_recordをのぞいてロードするように変更
require File.expand_path('../boot', __FILE__)

require "action_controller/railtie"
require "action_mailer/railtie"
#require "active_resource/railtie"
require "sprockets/railtie"
require "rails/test_unit/railtie"
require "image_size"
require "open-uri"
config/environments/development.rb にもactive_record の設定をしている箇所があるので、変更
  # Raise an error on page load if there are pending migrations
  # config.active_record.migration_error = :page_load

mongo.rb を削除

自動的に接続するように変更になったらしい。
$ rm config/initializers/mongo.rb

mongo.yml をURI表記に変更

データベース名とかユーザー名を個別に指定する方法だと接続できませんでした。謎。
development:
  uri: mongodb://:@.mongohq.com:/
#  database: 
#  host: .mongohq.com
#  port: 
#  user: 
#  password: 

で、クラッシュ

開発環境で立ち上がったので、本番環境にリリース。ってことでHeroku に push しました。 ほほう。。
$ heroku logs --app=xxxxx
2014-02-16T02:36:24.812184+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/articles/4fe1753f5e63882228000072/weather_chart/month host=vn.dash-news.com request_id=7d2fa4b5-e48d-463f-a1a4-3e1855cd6058 fwd="66.249.64.27" dyno= connect= service= status=503 bytes=
2014-02-16T02:35:45.610615+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/a/4fd0c22a5e63887908000068/month host=vn.dash-news.com request_id=66b5620e-fc6c-4616-8815-6c3384ce207f fwd="157.55.34.99" dyno= connect= service= status=503 bytes=
....
MongoMapperの接続がうまく行ってないんだろうなーとか思いながら、production.rb を確認したり、「mongomapper rails4 app crashed」で検索したり。 結局わからず、眠くなったので睡眠。

そして原因は。。

悶々とした一晩を過ごし、 rails c production を”やっと”、思いついた。。
$ rails c production
/Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/format.rb:46:in `check_options_validity': The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option? (ArgumentError)
	from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/format.rb:20:in `check_validity!'
	from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validator.rb:143:in `initialize'
	from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/with.rb:87:in `new'
	from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/with.rb:87:in `block in validates_with'
	from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/with.rb:86:in `each'
	from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/with.rb:86:in `validates_with'
	from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/format.rb:111:in `validates_format_of'
ArgumentError … ^ と $ はいけませんよ。と。
$ grep -r format app/models/*
app/models/article.rb:  key :url, String, :required => true, :format => URI::regexp(%w(http https))
app/models/category.rb:  before_validation :format_children
app/models/category.rb:  def format_children
app/models/contact.rb:  key :mail, String, :require => true, :format => /^([a-z0-9_.-]+)@(([a-z0-9.-]+\.)[a-z]{2,})$/i
app/models/link.rb:  key :url, String, :required => true, :format => URI::regexp(%w(http https))
app/models/link.rb:  before_validation :format_categories
app/models/link.rb:  def format_categories
app/models/source/google_currency.rb:  key :currency, String, :required => true, :format => /^[a-z]{3}$/
app/models/source/google_currency.rb:  key :local_currency, String, :required => true, :format => /^[a-z]{3}$/
app/models/user.rb:  key :mail, String, :require => true, :format => /^([a-z0-9_.-]+)@(([a-z0-9.-]+\.)[a-z]{2,})$/i
修正したら本番環境立ち上がった。。

Jan 04

startupvitamins:

Be narrow. It’s much better to mean a great deal to a few people. Than next to nothing to a huge amount. -David Hieatt is the Founder of Hiut Denim

startupvitamins:

Be narrow. It’s much better to mean a great deal to a few people. Than next to nothing to a huge amount. -David Hieatt is the Founder of Hiut Denim