Mailがいちいち立ち上がってウザいのでmailto:ハンドラを処理するデフォルトのメーラーをGmailにしたい。

Google Notifierを入れてデフォルトメーラーに設定すればOK。

ただ、内容が長すぎるとURLに全部はいるのでエラーになってしまうのが使い辛い所。

undefined method `render_partial_with_logging'というエラーが時々出る。調べてみるとkaminariのthreadsafe系のissueが上がってた。ちょうどrails4アプリのweb serverをpumaにした所だったのでまさにコレっぽい。(heroku + rails4のアプリをpumaにしたらかなり速くなった)

undefined method `render_partial_with_logging' for class `#<Class:0x617ead84>' org/jruby/RubyModule.java:2256:in `alias_method' · Issue #214 · amatsuda/kaminari

上記のissueが修正されたのが4 months ago、kaminari最新の0.14.1がリリースされたのが去年。masterを指定するのは怖いので最後のcommitのrefを指定してアップ。

# Gemfile:
gem 'kaminari',
  git: 'git://github.com/amatsuda/kaminari.git',
  ref: '2ed8adfe378594ae1585ac4a457a6d01f04478eb'

@ko8「@komagataさん、ちょっと確認したいんですけど、僕って8月末までプログラミングを勉強して9月から就職活動する・・・んでいいんですよね?」

@komagata「え?そうなんじゃないの?」

@ko8「ちょっと迷ってて。7月末に前に話してた友達が日本に帰ってくるんですけど。」

@komagata「あの、一緒に起業するって言ってたのに裏切って就職するっていって香港に行ったというあの?」

@ko8「いや裏切ってないっすよ。良いヤツですよ。そいつが7月末に帰ってくるのでまた一緒に起業しようって。」

@komagata「え?香港で就職はどうなったの?」

@ko8「そいつは香港の会社でインターンしてたんですけど、就職したら日本の部署に配属になるからそれだったら嫌だって話になって。」

@komagata「へえ。それで起業って何するの?」

@ko8「前から考えてたんですけど、ニートとか引きこもりの人とかがこう・・・集まれる”場”が作りたいなって。プログラミングを教えてもらえたりする・・・」

@komagata「"場"?何かWebサービスでも作るの?」

@ko8「それもあるんですけど特にITにこだわってなくて、実際に来れる場所があってコーヒーが飲めて。月額で課金しようと思ってるんですよ。」

@komagata「ノマドカフェ・・・みたいな・・・コワーキングスペースをやるってこと?」

@ko8「そう・・・なんですかね?」

@komagata「金はどうすんの?5分前に生活費の金策の相談を受けたばかりだけど。友達が金持ってるの?」

@ko8「そいつは奨学金というか借金があります。まあ出資を受ける・・・?」

@komagata「そのあたまにうじがわいてるような案で???」

@ko8「え、駄目っすか?」

@komagata「マジで大丈夫?せっかくちょっとプログラムが書けるようになってきたのに急に何で?」

@ko8「僕プログラマーとして働いてるイメージが沸かないっていうか。会社員とか向いてないんじゃないかなーって。」

@komagata「コワーキングスペースを経営するイメージは沸くわけ?」

@ko8「・・・まあ。」

@komagata「それって完全にさ、最近職業訓練校で企業面談とかやりはじめたから就職が近づいてきてビビって逃げてるだけでしょ?別にコワーキングスペースそんなにやりたいわけじゃないんじゃない?ただ就職したくないだけでさ。」

@ko8「(しばらく考えて)・・・。@komagataさん。その通りです・・・。」

@komagata「あっ、もしかしてさ、前に留学の為の学校を辞めた時も表向きは留学するより実際の会社で働いてみたほうが良いって人に言われたとか言ってたけどそれとは別に何か逃げたくなるようなことがあったんじゃない?」

@ko8「あ、ありました!留学の為の学校で僕だけ英語の点数が悪くて、留学先でも数ヶ月英語の授業を受けなくちゃいけないということが判明して。なんかかっこ悪いなって。うわっ、ホントだ!」

@komagata「そうやって逃げ出したくなることがあるとすぐ他人の甘い言葉に飛びつくタイプなんだね。しかも無自覚に。」

@ko8「うわあ、どうしよう。友達にもちゃんと話さなきゃいけないし。」

@komagata「うーん、どうせその何だっけ、あたまにうじがわいてる・・・あたまうじお?と長時間話したらまた影響されて説得されちゃうんだろうしなあ。」

@ko8「そんなことないっすよ。」

@komagata「ちょっとどうなるか考えてみようか。」

----------------------------

まず7月末にそのUZO(うじお)と知らないけど深夜のファミレスで夜通し熱く話し合うことになるじゃん?UZOは日本で会ってた時とは全く違う価値観を香港で手に入れた的なことを言ってくるわけ。

UZO「ko8(こーや)もプログラムもいいけどさ、アッパークラスになるにはこれからはXXXXじゃなきゃ駄目だよ。」

みたいなこと言ってきて。@ko8くんも深夜のファミレスでその新しい価値観に感化されるわけ。

で、

UZO「俺の知り合いにXXXXっていう凄い人がいてさ、俺はその人のイベントで知り合ったカフェをやってる人にあってみて色々動いてみるよ。ko8(こーや)はプログラミングできるからさ、それでWebサイトとFacebookページを作ってよ。」

みたいな感じになるのよ。

で、”山形のあたまにうじがわいてる王”とか、”鳥取のうじわき野郎”とか、全国のあたまにうじがわいてる人の全国大会会場である渋谷のコワーキングスペースをUZOは回るんだけど、何人かに自分の案を話すと「それってちょっとかわったコワーキングスペースをやりたいってこと?」ってまとめてくれるわけ。

それで、知り合い経由で実際にコワーキングスペースをやってる人の話を聞きに行くと、かなり景気の悪い話もちらほら出てくるの。一番うまくいってそうなところですらトントンみたいな。中にはUZOの感覚からいったら不本意な、お金のための活動の話も出るわけ。「いやー実際大変だよ?」みたいな。

そのころ丁度@ko8くんの作ったWebサイトとFacebookページが公開されるんだけど、もちろんイマイチなスキルとユーザーのことを全く考えない、自分たちが良い感じで働きたいというためだけに作られたひとりよがりのサイトを誰もシェアしてくれないわけ。@ko8くん的にはかなり頑張って作って、はじめてにしてはちゃんと完成したじゃん。って感じなんだけど案がアレだから。

UZOのFacebook周辺の人々の反応も苦笑い的なものでさ。あれ?俺の思ってた感じと違うなって。もちろん@ko8くんとの定期的な話し合いではそんなテンションの下がることは言わないよ?

Facebookページの作り方とかわかってちょっとおもしろくなってきたところの@ko8くんとUZOの意識がそこでちょっとづつ離れてくるわけだ。

で、UZOの尊敬する凄い人はUZOの能力はともかく行動力はかってるわけ。

UZOの師匠「ところでUZO君、スペース借りるにもお金とか大丈夫なの?」

UZO「うーん、ある程度は貯めるとかしないと・・・(実際にコワーキングスペースを開くイメージはもうわいてない)」

UZOの師匠「だったらさ、XXXさんのところで人探してるみたいだから週2ぐらいでいいって言ってるから行ってみれば?」

そこはコワーキングスペースつながりで知り合った不動産屋なんだけど、UZOは週2で働き始める。そこはやっぱり長い時間いるコミュニティに絶対影響されるから不動産屋業界でUZOがかっこいいと思う働き方みたいな、ロールモデルがいるわけ。コワーキングスペースの話はもうどうでもよくなってて。

そして、

UZO「でさko8(こーや)、XXXXさん(不動産業界の凄い人)がほんとに凄いんだよ。俺もしばらく経験積んだらさ、独立してああゆうのをやろうと思ってさ。」

ってUZO&ko8(うじおあんどこーや)の起業計画はなんとなく終わるわけ。その時UZOはちゃんと不動産屋に就職できてるんだけど、それだけに注力してきた@ko8くんは高卒で25歳になってるからやばいよね。

----------------------------

@komagata「全部俺の妄想だけど、結論としては100歩譲ってコワーキングスペースをやるのはいいけどバイトなり就職なりキャリアをすてずにプログラマーをやりながらやったほうがいいんじゃない?」

@ko8「ですかねぇ・・・」

これsunzi recipeにした。

使い方

sunzi.ymlにremoteのrecipeを持ってくる設定を書く。 wordpress_domainにはwordpressで使うdomain名を書く。 wordpress_jaは日本語で使いたい時だけ必要。 eval_erbはテンプレート中でrubyを評価するのに必要。

sunzi.yml:

---
attributes:
  wordpress_domain: fjord.jp

recipes:
  wordpress: https://raw.github.com/komagata/sunzi-recipes/master/recipes/wordpress.sh
  wordpress_ja: https://raw.github.com/komagata/sunzi-recipes/master/recipes/wordpress_ja.sh

preferences:
  eval_erb: true

install.shで読み込む。

#!/bin/bash
set -e

export DEBIAN_FRONTEND=noninteractive
source recipes/sunzi.sh
sunzi.mute "apt-get update"
sunzi.mute "apt-get -y upgrade"
source recipes/wordpress_ja.sh

sunzi.installを使ってるのでsunzi.shもsourceする。日本語化の必要がなければwordpress.shだけをsourceすればいい。

$ sunzi deploy fjord.jp

便利。

いつもコマンド名忘れて手でやってたけどいい加減辞める。

% brew install ssh-copy-id
% ssh-copy-id root@198.199.104.49
/usr/local/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/local/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@198.199.104.49's password: 

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'root@198.199.104.49'"
and check to make sure that only the key(s) you wanted were added.

% ssh root@198.199.104.49
Linux fjord 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2+deb7u2 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Jul 22 09:15:47 2013 from 36-2-206-69.tokyo.ap.gmo-isp.jp
root@fjord:~#

Yay!

アップデートはdebian任せになるので楽だが最新を追っかけるのとどっちがセキュアなのかはわからない。

setup-mysqlというdebianのwordpress独自のスクリプトを使うのが面白い。

# DEBIAN_FRONTEND=noninteractive apt-get -y install mysql-server
# apt-get -y install wordpress
# cd /usr/share/doc/wordpress/examples
# gunzip setup-mysql.gz
# bash setup-mysql -n wordpress example.com
# vi /etc/apache2/sites-available/example.com
<virtualhost *:80>
    ServerName example.com
    UseCanonicalName Off
    VirtualDocumentRoot /usr/share/wordpress
    Options All

    # wp-content in /srv/www/wp-content/$0
    RewriteEngine On
    RewriteRule ^/wp-content/(.*)$ /srv/www/wp-content/%{HTTP_HOST}/$1
<VirtualHost>
# a2ensite example.com
# a2enmod rewrite
# a2enmod vhost_alias
# /etc/init.d/apache2 restart

日本語化する場合。

# sed -i "s/?>/define('WPLANG', 'ja');\n?>/" /etc/wordpress/config-example.com.php
$ open http://example.com

DebianでいっつもこのWarning出てて気になってた。

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "en_US:en",
        LC_ALL = (unset),
        LC_CTYPE = "UTF-8",
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

正しい直し方は多分これ。

$ vi sudo /etc/environment
LC_ALL=en_US.UTF-8
$ sudo reboot

日本語の場合はja_JP.UTF-8にする。

railsでscopeを色々チェインする時にそういや二回joinしたらどうなるんだろうと思ってやってみた。(rails4)

>> User.joins(:events).to_sql
=> "SELECT \"users\".* FROM \"users\" INNER JOIN \"events\" ON \"events\".\"user_id\" = \"users\".\"id\""
>> User.joins(:events).joins(:events).to_sql
=> "SELECT \"users\".* FROM \"users\" INNER JOIN \"events\" ON \"events\".\"user_id\" = \"users\".\"id\""

ホッ、変わらないみたい。

herokuでsmtpを使うためにsendgrid addonを入れる。(smtpにgmailを使う場合は要らない)

$ heroku addons:add sendgrid:starter
# config/environment.rb:

(snip)

ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => '587',                                                                                            
  :authentication => :plain,
  :user_name      => ENV['SENDGRID_USERNAME'],                                                                         
  :password       => ENV['SENDGRID_PASSWORD'],                                                                         
  :domain         => 'heroku.com',
  :enable_starttls_auto => true
}
# config/initializers/exception_notification.rb:
AppName::Application.config.middleware.use ExceptionNotification::Rack,
  :email => {
    :email_prefix => "[AppName] ",
    :sender_address => %{"notifier" <notifier@example.com>},
    :exception_recipients => %w{komagata@example.com}
  }
# Gemfile:
gem 'exception_notification'
# config/environments/production.rb:

(snip)

  # config.action_mailer.raise_delivery_errors = false
  config.action_mailer.raise_delivery_errors = true

(snip)

  config.action_mailer.perform_deliveries = true
end

modelのscope書く時、現在時間を使う時はテストしやすいようにデフォルト値ありの引数を与えることにしてるんだけど、

「あれ、引数だけ先に評価されちゃわなかったっけな?」

と心配になったので試してみた。

foo = ->(now = Time.now) {
  puts now, Time.now
}

sleep 10

foo.call
% ruby arg.rb
2013-07-11 16:07:16 +0900
2013-07-11 16:07:16 +0900

杞憂に終わった。