海賊とよばれた男

海賊とよばれた男 上

海賊とよばれた男 上

海賊とよばれた男 下

海賊とよばれた男 下

読んだ。

前半の会社の立ち上げ、特に軌道にのせるまでの国岡鐵造のなりふりかまわん感じがよかった。

会社や働く人そのものを好きになり、仕事が楽しく、サービスを良くするために自然とコミットする
そんな会社はどうやったら作れるのか。

国岡鐵造のような、人間性に人がついていくという感覚は未だにピンとこない感がある。


起業や経営を題材にした本は好きでよく読むけれど、どうも
あきらめず、信念を持って死ぬほどがんばったという所におもしろさを感じがちで
もっとテクニック的な所を本から学ぶようにしないとなと思った。

起業家

起業家

起業家

  • 作者:藤田 晋
  • 発売日: 2013/04/12
  • メディア: 単行本

読んだ。
アメーバの立ち上げ期が赤裸々に綴られていて、リアルだった。
共感したことはやはりサービスに熱狂するということ。


今自分達も起業しサービスを立ち上げて運営している。
全員が背水の陣でのぞみ日夜サービスをよりよくするために
熱狂と執着を繰り返しながらハッスルしている。


会社に勤めていたときも、担当するサービスに責任感を持ちコミットしていたつもりだけど、
やはり、今はその時とは比べられない程、熱狂していると思う。

熱狂できるものがあるというのはそれだけで、よいものだ。

感心した話 | 渋谷ではたらく社長のアメブロ

にも書かれていたけど、強い執着心と覇王色の覇気でこれからもがんばろうと思った。

サービスをつくる

何かをつくるということはとても楽しい。


仕事でも個人でもいくつかWEBサービスをつくってきたけど
今はとても充実していると言える。


エンジニアになって業務系やBtoCのシステム
インフラなど、やりがいのある仕事をこれまでもしてきたけど
どうしてもCtoCのサービスをやりたかった。


初めて本格的にインターネットに触れたのは高校生の時やったけど
あのときyahooやgoogle mixi 2chなどを見てこんな便利で楽しいものが
あるのかと感じたのが思いの原点だったような気がする。

あのとき自分が感じた便利だとか、おもしろいとかそういう感情を
他の人も抱いてくれるようなサービスが作りたいと思った。


でも実際やってみるとかなり大変です。


問い合わせや不具合の連絡は毎日くるし、考えないといけないことはたくさんあるけど
今のチームはどれも前向きに且つ、本質的にサービスを作っていけている。
これは何よりすばらしい。


大変だけど、ユーザー同士のやりとりや
レビューからサービスがキチンと使われていることが分かる。
自分が作っているものが役に立っている瞬間を垣間見れるのがいい、エンジニア冥利につきる。


自分がいつも使っている今は誰もが知ってるサービスも
最初はどっかのガレージでユーザーーからのフィードバックに一喜一憂しながら作られたんだろう。


ユーザーの期待を裏切らないよう引き続き精進したい。

rails mysqlでiPhoneアプリの絵文字対応

超久しぶりの更新 大丈夫生きてます。

色々あって今iPhoneアプリを作っていて
そのアプリで絵文字を使いたくて結構はまったので、対応したメモを残しておく。

ユーザーがDBに突っ込んでくるテキストに絵文字が入っていてrailsとDBはmysqlを使ってる。

Mysql2

railsでmysql2を使ってるが、gem mysql2がutf8mb4に対応していないので
下記を参考にbundleで入れたmoduleに手を入れた。

AWS - Rails + Mysql(utf8mb4) on Amazon RDS - Qiita
add utf8mb4 charset · f535df8 · brianmario/mysql2 · GitHub

mysql2の更新が待たれる。。。

Gemfileに下記を追加してもいいかも

gem 'mysql2', :git => 'git://github.com/tmtm/mysql2.git', :branch => 'utf8mb4'

database.ymlを変更しエンコードをutf8 -> utf8mb4に変更する

production:
  adapter: mysql2
  database: test
  encoding: utf8mb4

databaseをutf8mb4で作成する

create database test DEFAULT CHARACTER SET utf8mb4;

DBをマイグレーションする
※ utf8(3バイト) -> utf8mb4(4バイト)になったことにより
primary key, unique keyインデックスのbyteが767以上になってしまうカラムがあるのでVARCHARカラムなどは適切な値で正規化する

MySQLのUNIQUEなINDEXには長さ767byteまでしか使えない件と対策 - tanamonの日記

railsがデフォルトで作るschema_migration用のversionカラムも上記に該当するのでversionカラムをVARCHAR(15)に変更する

Rails3 と MySQL な環境で Unicode の絵文字を使う - SmallStyle(2011-12-05)

/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/schema_statements.rb
419行目を修正

schema_migrations_table.column :version, :string, :null => false, :limit => 15


railsからはJSONでアプリにレスポンスを返す仕様
jsonで出力する際にrailsがマルチバイト文字をescapeしている。
※下記が該当コード
http://blog.sosedoff.com/2012/04/26/emoji-and-rails-json-output-issue/

しかしこれは \u{123}とか\u{12345}みたいな4バイト以上の文字はescapeをミスる
Emoji range encoded in JSON mangled · Issue #3727 · rails/rails · GitHub

escapeを行っている ActiveSupport::JSON::Encodingを下記のようなファイルを作って対応

config/initializers/active_support_encoding.rb

module ActiveSupport::JSON::Encoding
  class << self
    def escape(string)
      if string.respond_to?(:force_encoding)
        string = string.encode(::Encoding::UTF_8, :undef => :replace).force_encoding(::Encoding::BINARY)
      end
      json = string.gsub(escape_regex) { |s| ESCAPED_CHARS[s] }
      json = %("#{json}")
      json.force_encoding(::Encoding::UTF_8) if json.respond_to?(:force_encoding)
      json
    end
  end
end

参考 : http://blog.sosedoff.com/2012/04/26/emoji-and-rails-json-output-issue/

これでなんとか対応できた。

googleのGoをインストール

今年のGoogle Developer Day 2011のdevquizgoogleが開発した
プログラミング言語Goの問題があったので、ついカッとなってインストールしてみた。

Mercurialが必要とのことなのでpythonを入れてみる。
バージョン管理システムsubversionとgitしか使ったことがない。
Mercurialもいい機会なので使ってみようと思う。

なんかpythonは普通に入ってたのでpython-setuptoolsを入れる。

yum install python-setuptools

Mercurialのインストール

easy_install mercurial
...
error: Setup script exited with Python headers are required to build Mercurial

なんか怒られた。。。

python-develも入れなきゃダメだった。

yum install python-devel

これでMercurialが入った。

hg version
Mercurial Distributed SCM (version 1.9.1)
(see http://mercurial.selenic.com for more information)

Copyright (C) 2005-2011 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ここからはGoの設定

32bit か 64bitか確認

getconf LONG_BIT
32

環境変数を設定する。.bashrcに下記を追加

export GOROOT=$HOME/htdocs/go
export GOOS=linux
export GOARCH=386
export GOBIN=$HOME/bin
export PATH=$PATH:$GOBIN

確認

source .bashrc
env | grep '^GO'

binディレクトリ作成

cd; mkdir bin

Goをリポジトリから入手

hg clone -r release https://go.googlecode.com/hg/ $GOROOT

いよいよGoのインストール!

cd htdocs/go/src
./all.bash

ちょっと時間かかって....

N known bugs; 0 unexpected bugs

インストール完了っ!
mkdirしたbinの中にバイナリファイルができてる。

ls
6cov  6prof  8c  8l   ebnflint  godoc  gofmt      gomake  gopprof  gotry   govet   hgpatch
6nm   8a     8g  cgo  godefs    gofix  goinstall  gopack  gotest   gotype  goyacc  quietgcc

サンプルスクリプトを動かしてみる。

hello.go

package main
 
import fmt "fmt"  // 入出力フォーマットを実装したパッケージ
 
func main() {
  fmt.Printf("Hello, world\n")
}

32bitなので8g 8lを使用する。

8g hello.go
ls
hello.8   hello.go
8l hello.8
ls 8.out  hello.8  hello.go 

できたー。あとは実行!

./8.out 
Hello, world

動いたー!
ちょっとこれで色々やってみようと思う。

rubyスクリプト内でタイムアウトした時にプロセスをKILLする

お仕事でいろんな監視スクリプトを組んでミドルウェアやデーモンなどの監視をしています。
大体がrubyスクリプトで作っているのですが、そこで一部はまったことを記録しておきます。

監視の本体はHobbitというツールを使っています。
監視のスクリプトは各サーバで実行され、実行結果をHobbitのマスターに送信するという感じになっています。

今回は定期的にapacheのmod_statusのデータを取得し、httpdのプロセスの状態を監視するスクリプトで起きた現象です。

スクリプト自体はたいしたことをしていなくて

  1. mod_statusのデータを取得
  2. データを加工して欲しい情報に整形
  3. システムコマンドを叩いて追加データの取得
  4. hobbitにデータ送信

なんてことをしています。

問題はスクリプトがTimeOutした時に起こります。

timeout_time = 60
retry_count  = 3

begin
  timeout(timeout_time) {
    # ここにアレやコレや(上記の1〜3)の処理
  }
rescue Timeout::Error => ex
  retry_count -= 1
  puts Time.now.to_s + "=>" + retry_count.to_s

  if retry_count > 0
    sleep 5
    retry
  end
end

スクリプトではTimeOutした時はエラーをキャッチしてリトライ処理をするようにしています。

大体はリトライで正常終了するのですが、リトライが掛かった時にシステムコマンドで起動したプロセスがスクリプト終了時も残ってしまい、psコマンドを打つと監視スクリプトから呼び出されたプロセスで一杯になってしまっていました。
※ プロセスが生成されるのは上述のシステムコマンドを叩いて追加データを取得するタイミング

対策として、スクリプトから起動したプロセスのpidを取得し、タイムアウト時にKILLするように修正しました。

pidを取るように修正

io = IO.popen('ps --no-headers -C php-cgi | wc -l')
pid = io.pid
cgi = io.read.chomp

プロセスをKILLするように修正

rescue Timeout::Error => ex
  retry_count -= 1
  puts Time.now.to_s + " => " + retry_count.to_s

  # kill timeout process
  if pid > 0
    puts "kill timeout process => " + pid.to_s
    Process.kill('KILL', pid)
  end

  if retry_count > 0
    sleep 5
    retry
  end
end

これでタイムアウト時にプロセスをKILLすることができました。

フェイスブック 若き天才の野望

遅ればせながら読んだ。

僕は起業本とか結構好きで何本か読んでいたんですが、この本には結構しびれた。

特にfacebookを立ち上げる学生時代の話や
facebookが大きくなるまでの過程、
シリコンバレーの雰囲気が伝わってきました。

もちろん映画も見たけど
本からの方がザッカーバーグの考えや意思が理解できた気がした。

なにより、自分も何かやらなくてはという気持ちと
シリコンバレー行きたい!と強く思うようになりました。

なので今年は夏休みをとってシリコンバレーにいく。

ザッカーバーグfacebookを作った歳やインターネットの世界を
考えると、そんなに自分も若く無い。

いろんな可能性を見てこようと思う。
パロアルトのfacebook本社も見てくるぜ!