The longest day in my life

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

Dec 22

“「あいさつには名前をつけろ」(接客)
「アフターフォローは上客を呼ぶ」(保険業界)、
「うまい人より早い人が生き残る」(放送作家)
「オーナーがこだわりを捨てると店ははやる」(空間プロデュース)
「オレンジ色は食欲を刺激する」(食品業界)
「お客は靴と時計で見抜け」(ソムリエ)
「お久しぶりですね、は三流」(バーテンダー)
「お座敷では毎日の行いが出る」(花柳界)
「きれいなトイレは汚せない」(スーパーマーケット)
「クレームは最後まで聞く」(キャビンアテンダント)
「ゲームの発売日は木曜日」(ゲーム)
「コンビニおでんは秋に売れる」(コンビニ業界)
「スタッフには、指示ではなく相談する」(外食産業)
「ストーリーは三幕構成で山場を作れ」(映画業界)
「たらい回しにヒットあり」(出版業界)
「トップの椅子は3つある」(芸能界)
「ネタはお客の顔を見て決める」(落語家)。
「ネットの1行広告は13文字」(ネット通販業界)
「ヒット商品は多数決から生まれない」(飲食業界)
「ファーストクラスは態度がぶれない」(キャピンアテンダント)
「プリンターはインクで儲けろ」(プリンター業界)
「プレイング・マネージャーに名上司なし」(人材業界)
「プレスリリースは1枚にまとめろ」(広報マン)
「プレゼンの前日はホステスを口説け」(広告業界)
「プロジェクトが行き詰まっても、増員するな」(ソフトウエア業界)
「ホラー映画は不況に強い」(映画業界)
「メモのうまい美容師はカットもうまい」(美容師)
「ヤクルトおばさんが『これ、何?』と聞く映画はヒットする」(映画業界)
「飲食店の開業は1~2月が最適」(外食業界)
「汚い工場から、名品は生まれない」(製造業)
「家を売るなら奥さんを口説け」(不動産)
「家具店は外車ディーラーの近くがいい」(家具)
「会社の業績はトイレでわかる」(コンサル)
「怪我と弁当は自分持ち」(とび職)
「皆が嫌がる仕事ができて一人前」(町工場)
「階段は駆け上がるな」(アナウンサー)
「企画はコンプレックスをつけ」(出版業界)
「休日の飛行機でくつろげないなら一人前」(航空)
「泣き別れは商品価値を下げる」(家電量販店)
「給料日前は生活必需品、給料日後は嗜好品を値引け」小売業界
「金持ちは貧乏人から物は買わない」(宝石商)
「見積書は2つ持て」(商社)、
「交差点は左折」(タクシー業界)
「困ったときは動物と子ども」(広告業界)、
「混んできたら、BGMのテンポをあげろ」(外食業界)
「作業記録を開示せよ」 (航空)
「子ども番組の改編は4月じゃなくて1月」(テレビ業界)
「私も使っています」で信頼を得よ (販売)
「実車とすれ違う道は、吉」(タクシー業界)、
「社員は優良顧客」(自動車メーカー)
「酒が飲めないほうがバーテンダーは成功する」(バーテンダー)
「寿司は客を見てから握れ」(寿司職人)
「出店は、競合店の近くがいい」(居酒屋業界)
「準備のないところにチャンスは来ない」(舞台俳優)
「商品の色は3色に絞れ」(商業デザイン)
「上手い人より早い人が生き残る」(放送作家)
「人気商品は付属品で稼げ」(小売)
「声かけが盛んなスーパーは売れる」 (流通)
「全国ヒットを狙うなら、北海道を制せ」(食品業界)
「素材だけを使っても、フランス料理にはならない」(料理人)
「送料無料はネットで刺さるキーワード」(ネット通販業界)
「他業界からミスを学べ」(パイロット)
「大道芸は、美術館の近くが穴場」(大道芸人)
「棚には赤と緑の商品を交互に置け」スーパーマーケット
「段取り八分、仕事二分」(大工)
「値引きは二個目の商品から」 (スーパーマーケット)
「通販番組では、値段を最後に言え」(通販業界)、
「提案は3つ出せ」(ソフトウェア)
「適職は自分ではわからない」(人材業界)
「電話営業は月曜の朝に攻めろ」(テレマーケティング業界)
「『東大』は読者に刺さるキーワード」(出版)
「2時間ドラマは、10時またぎに濡れ場を入れろ」(テレビ業界)
「日本人はラス1に弱い」(キャビンアテンダント)
「売れる商品には適量がある」(食品業界)、
「売上が落ちたら値段を上げろ」(おむつメーカー)
「発想はポジティブに、詰めはネガティブに」(広告)
「発売延期をくり返すソフトに名作なし」(ゲーム業界)
「披露宴は洋食で儲けろ」(ホテル業界)、
「評論家は深く掘り下げると広くなる」(マスコミ業界)
「不器用な職人ほど大成する」(大工)
「不況になると鉄道本が売れる」(出版業界)
「福袋は松竹梅で売れ」(百貨店業界)
「名器は真似して学べ」(設計士)
「要約できない脚本にヒットなし」(映画業界)
「欲しい車はよく街で見かける」(放送作家)
「緑と紫のオモチャは売れない」(玩具メーカー)
「練習は本番のように。本番は練習のように」(サッカー選手)” —

「つまり5回」 ~業界のセオリーに思う - ■財務アナリストの雑感■  シーズン3 (via bo-rude)

shinodddddtigaからリブログしました

(via tatara2)

2013-06-19

(via mmtki)

(via kanouk)

Dec 21

ほほう。。。

これは。。。

注:2013年12月21日のできごとです。

Dec 11

まだ年末調整の書類を書いてない人のための、世界一簡単かもしれない「さくっと年末調整」

年末になりました。ベトナム・ホーチミン市でも、あちこちでイマイチなイルミネーションが目立つようになってきました。

今年も、クリスマス当日の街はバイクでいっぱいで、身動きができなくなるのではないかと思います。

日本では年末調整の季節でもあります。

あの、いまいち書き方がわからない、每年書くのに每年書き方忘れるやつです。

たいていの人はもう書き終わっている頃でしょう。

でも、「まだ書いていないよ」という人。いますよね。ここにも1人います。

そんな人のために、「さくっと年末調整」を作りました。

さくっと年末調整 - 年末調整をちゃんとしよう!

年末調整、ほんとうは簡単な事なんです。

あの、細々とした申告書が何となく難しい雰囲気がありますが、説明を読んで、やってみれば難しいことはありません。

でも、「説明を読むのが面倒」っていう人。わかります。

まずは「さくっと年末調整」試してみてください!

Dec 07

startupvitamins:

"Don’t worry about failure; you only have to be right once." -Drew Houston, Dropbox founder and CEO

失敗を恐れない!

startupvitamins:

"Don’t worry about failure; you only have to be right once." -Drew Houston, Dropbox founder and CEO

失敗を恐れない!

Nov 20

globalize3 を 0.3.1 にしたらRefineryCMSは壊れます

RefineryCMS はRails3.2 で使えるCMSです。

AWS S3 と連携してherokuでも使えるので、ホームページのCMSとして使っています。

先日、RefineryCMSを使ったサイトでページを作成したら、エラーになりました。

ページは登録できていますが、表示はNot Foundで何よりも、管理画面でページのリストが表示できなくなりました。

NoMethodError (undefined method `to_slug' for nil:NilClass):

ログを調べるとこのエラー。ソースをたどると、どうやらi18n関連で問題が起きている様子。

さらに調べたところ、こちらが問題の原因でした。

Gemをアップデートして globalize3を 3.0.1にしたところで問題が起きていたようです。