スパイスな人生

素敵な人生をおくるためのスパイスを届けていきたい、そんな想いで仕事をするspice lifeメンバーブログ

TMIXのRailsを4.2.5にアップデートしました。

f:id:yu_suke1994:20151222143828p:plain

TMIXエンジニアのうなすけです。ここ半年間、TMIXで作ったオリジナルTシャツやパーカーを着ていない日はないのではないかという生活をしています。先日も、とあるイベントのスタッフパーカー(TMIX製)の下に自分のTwitterアイコンを配置したTシャツ(TMIX製)を着て参加しました。

Rails 4.2.5

さて、すっかりTMIXRailsアップデート担当と化している僕ですが、やっぱりTMIXRails 4.2.5アップデートも僕が行いました。 Rails 4.2.5のリリースは2015年11月12日です。だいたいその辺りから作業を始めました。途中で合宿を挟んだりして出すタイミングを見失っていましたが、年内にアップデートできて嬉しい気持ちです。

アップグレード手順

今までのアップグレードはsynvertに頼っていました。

blog.spicelife.jp

blog.spicelife.jp

しかし、4.1系から4.2系へのアップデートは、synvertは対応していません。僕はこれを機能の不足とは思っていないので、 本家へのPull Requestも作成しませんでした。いつまでもsynvertには頼っていられません。自立の精神です。

読むべきはリリースノート

そう、Railsアップデート時に、真に読むべきはリリースノートです。

A Guide for Upgrading Ruby on Rails — Ruby on Rails Guides

railsguides.jp

僕は英語の方の記事を読みつつ、「はーわからんぞ」となった時は英語と日本語訳を交互に読み比べていく、というようにしてリリースノートを読み、アップデート作業を進めていきました。

とは言え、具体的に行った作業としては*_filter系を*_actionに置き換えたくらいで、大規模な修正は行う必要がありませんでした。

github.com

アップデートを終えて

やっと最新のRailsに追いついたと思ったら、12月18日にはなんとRails 5.0.0.beta1が登場しました。

Riding Rails: Rails 5.0.0.beta1: Action Cable, API mode, Rails command

それに、もうすぐやってくるクリスマスではRuby 2.3のリリースが予定されています。(Perl 6もね)

前へ前へと走り続けていきましょう!!

湯河原温泉「おんやど恵」の足湯フログラミングは開発合宿の新しいスタンダードになる

ある日、オフィスでメンバーとTMIXの新機能について議論していたところ、 「これは結構な大きさの機能だね」 「そうだね、真剣に議論する必要がある」 「じゃあ合宿いっとく?」 「いっとく?」 ということで、「開発合宿を実施する!(ででーん)」と高らかに宣言して勢いで合宿へ行きました。(ちゃんと稟議は通しました。)

開発合宿をやるにあたり、WiFiはじめ環境が超重要。いろんなブログを読んだり、行った人からの情報を収集したのですが、

  • WiFiは必須
  • 議論が盛り上がるとうるさくなるので、他の人の迷惑になりたくない
  • 長時間なので椅子に座って開発したい
  • 温泉は欲しいよね
  • ごはんがおいしいとさらにいいよね

の条件を満たすところがなかなかみつからず。そしていろいろ探して見つけました!湯河原温泉の旅館「おんやど恵」。

www.onyadomegumi.co.jp

ちゃんと開発合宿を歓迎してくれてる感があって安心感あります。masuidriveさんに聞いたらお勧めとのことで風呂にも期待が持てます。

話題の開発合宿温泉宿に「風呂グラマー」増井雄一郎氏と行ってみた - エンジニアtype

宿に電話で予約して、JRの切符も確保!品川から特急踊り子号で約1時間と楽にいけるのもありがたいです。

f:id:iga_k:20151217222028j:plain

合宿当日、天気晴れ、12月なのに暖かい日。湯河原駅から宿まではタクシーで1000円でした。予定時刻より早かったのですが会議室を使わせてくれました。会議室は7人だとかなり広くて、窓も大きくて明るく、良い環境。机と椅子にホワイトボード、さらにお茶やお水、おしぼりも用意してあって快適。珈琲も注文すると入れてくれます。あと、売店に駄菓子が売られてるのもポイント高い。ヤングドーナツmgmg。コンビニは10分くらい歩くとあります。ちなみにWiFiは会議室だけですが、会議室は24時間使えるのでいつでも使えます。速度は雑に計測して下り7Mbps、上り25Mbpsでした。特につながらない時間もなく快適でした。

f:id:iga_k:20151217222047j:plain

温泉は広い!弱アルカリ性の肌がすべすべする感じ。露天風呂もあってこりゃええわいです。いつでも入れるのも嬉しい!

そして素晴らしいのがお風呂へ続く道の中庭にある足湯!これがライフチェンジングな素晴らしさ。(※特殊な訓練を受けて撮影しております。水没にはくれぐれもご注意ください!)

f:id:iga_k:20151217222544j:plain

みんなで議論するも良し、1人で集中するも良し、アイスを食べるも良し。

f:id:iga_k:20151217222923j:plain

開発はたのしくて、メインの作業のほかに、ノリで小さな機能をみんなで作ったり。きゃっきゃいいながら作るたのしい時間でした。これの成果は追ってTMIXでお見せできると思います。

みっちり開発して、たのしみのごはんの時間。豪華!おいしゅうございました。

f:id:iga_k:20151217222626j:plain

f:id:iga_k:20151217222509j:plain

まとめると、開発合宿の宿としてとても素晴らしい環境でした。WiFiが安定していて、宿のスタッフのみなさんも開発合宿に理解があり優しく対応してくれ、個室で椅子で開発でき、温泉がいつでも入れ、足湯で集中でき、東京から電車で1時間で行ける。値段もリーズナブルで開発合宿プランは1人1泊2色付きで約10000円、会議室は1部屋1日約2万円。私たちはさらにモニタープランで割引きしてもらいました。

おんやど恵さん、素晴らしいので開発合宿の定宿にしたいです!ありがとうございました!

f:id:iga_k:20151217223231j:plain

良い天気に恵まれた良い合宿でした。弊社asonas撮影の空の動画。

FacebookCEOザッカーバーグもイクメンに

この前の週末にFacebookCEOザッカーバーグが2ヶ月の育児休暇を取るという記事が出ていました。

www.itmedia.co.jp

www.huffingtonpost.jp

 

実はスパイスライフも育児休暇としてではありませんが、リモートワークの仕組みでイクメン支援しています。

 

11/18にはエンジニアtypeにも掲載していただきました。

engineer.typemag.jp

 

日本のイクメン支援の現状と課題

厚生労働省の統計調査によると、平成25年10月1日までに育児休業を開始した者(育児休業の申出をしている者を含む。)の割合は 2.03%とのこと。

また、多くの男性が育児をしたくても育児休暇を取らずそのまま仕事をし続けることを選んでいます。その理由は、

  1. 経済的に負担となる
  2. 社内に代替要員がいない
  3. 出世にひびく
  4. 復帰後も復帰前と同じ環境で働けるか不安

などが挙げられていました。

 

多くの企業で育児したくても家計の状況や将来のことを考えて仕事を優先させている男性が多いようです。

 

このような現状を知り、スパイスライフではいまのところエンジニア職などのリモートワーク適用職のみですが、自宅で仕事をしながら育児参加できるようにすることで、イクメン支援しています。

 

新米パパ(イクメン)の実際の感想

実際にリモートワーク制度を利用している新米パパ(イクメン)に感想を聞いてみました。

「自宅にいながら仕事が行えるから、出社時間や帰宅時間を気にする事なく、妻と子供の状況を見ながら仕事ができる。

子供の初めて発した単語や寝返りした瞬間など一生で一度しか見れない子供の初めての成長を妻と一緒に見れるのは本当に幸せに感じる。

仕事についても他の社員とは無料のビデオ電話を通じてMTGができたり、チャットツールでコミュニケーションが毎日取れる。

ただ会社か自宅かの違いだけで、 普段と変わらずパフォーマンスを下げずに行える。 時には仕事しながら寝かしつけたり、ミルクをあげながらメールのチェックをしたりもしている。

世間のお父さんの中には、勤務内に仕事が終わらない→家に持ち帰る→子供を寝かしつける→また仕事→寝不足になる場合があると聞いた事がある。 体調なども考えるとリモートワークはありがたい。」

 

 

スパイスライフは、"育児か仕事か"ではなく"育児も仕事も"できるようにして社員の生活を支えることを通して働き方の多様化、少子化問題などに少しでも貢献したいと思っています。

引き続き社会価値と経済価値の双方を追求する企業として進んでいきます。

 

というわけで、spice life代表のヨシカワでした〜。

ネットサービスもブランディングが当たり前に?ニューヨークのECスタートアップに学んだこと

TMIX新ロゴ

こんにちは。spice life代表のヨシカワです。

 

オリジナルTシャツTMIX (ティーミックス)は11月5日にブランドイメージを一新しました。

今回はそのことについて書こうと思います。

 

TMIXは2009年1月19日に、

  • 商品はTシャツ1種類
  • カラーは5色
  • 前側のみプリント可能

というとても小さな形でローンチしました。

 2015年11月のいまでは、

  • 商品は45種類に
  • 商品×カラーバリエーションとなると400種以上
  • 前側だけでなく後ろ側もプリント可能
  • スマホからもデザイン可能
  • ショールームオープン

と大きく変わっています。

 

このように7年弱にわたって運営していますが、サイトデザインの変更などは定期的にやっていたものの、大きくブランドイメージを変えずにここまでやってきています。もっと言えば、始めてからこれまで、TMIXのブランドイメージそのものについてあまり考えずに続けてきたのです。

 

なぜいまブランドイメージを一新したのか?

きっかけは去年の2014年9月になります。なのでそこから考えると1年以上の時間をかけてきたことになります。

2014年9月、ニューヨークとサンフランシスコ(シリコンバレー)にビジネス視察に行っています。

そのうち、ニューヨークではECスタートアップが多いこともありアメリカのECスタートアップが取り組んでいることをテーマにして視察をしていました。

アメリカのECスタートアップの多数が取り組んでいることなら我々も取り組むべきではないかと考えたからです。

 

warby parkerワービーパーカーのオフィス併設ショールームとショップの様子

ニューヨークの代表的なECスタートアップのWARBY PARKER、BONOBOSなど視察する中で、ここが進んでいる、我々も取り組むべきかなと感じたことが3つありました。それは、

  1. ショールーム型ストア
  2. ブランディング
  3. 社会・地域貢献活動

です。

 

1.ショールーム型ストアについてはすでに今年の3月にオフィス併設型としてオープンしています(ブログ参照)。

 

そしてショールーム型ストアをオープンした際、ネットとリアルで統一されたイメージを作ることの難しさを感じ、TMIXは1つ1つの施策をバラバラに進めてきたために、1つ1つとしては成り立っているが全体としては統一されていない状態であると気づきました。まさにブランディングが必要であり、取り組むべきかな、から、取り組まなければならない、に変わったのです。

 

ただ、9月に行った時に感じたとはいえ、ブランディングが必要という視点ではなかったためボンヤリしていてどうしたら良いかわかりません。

そこで、ニューヨークに2015年6月に再度視察に行くことにしました。

この時は、事前に他のECスタートアップも調べ、効率よく回れるようにし、夜はその日見た感じたことをメンバーと共有、場合によっては翌日以降に同じ場所を再訪して確かめるなどとにかく現地でしか体験できないことを重視し深掘りしました。

 

そうした結果、やはり早急にブランディングに取り組むべきであると結論、エッセンスは収集できた、具体的な進め方は帰ってから考えよう、ということになったのです。

 

ちなみにですが、この時に行ったECスタートアップはWARBY PARKER、BONOBOS、HARRY'S、Casper、Rent the Runway、TRUNK CLUB、JACK ERWIN、normalなどです。

左はTRUNK CLUB、右上がnormal、右下がCasper。ショールームストアでの写真

 

ブランディングについて

ブランディングとは、”ケラーの戦略的ブランディング”という本によれば、

ブランディングは精神的な構造を創り出すこと、消費者が意思決定を単純化できるように、製品・サービスについての知識を整理すること」

ケビン・レーン・ケラー(著)

 

Wikipediaでは

ブランディング - Wikipedia 

 時代の流れやトレンドによる顧客ニーズの変化、また競合品・代替品の出現など刻々と変わる状況に対応するためブランドも新陳代謝を繰り返す。しかしそのどの場面においても焦点は『 顧客の頭の中に形成されるイメージ 』に合わせられており、時を経て蓄積されたそれら無形資産が消失・分散されることのないよう、注意深く計画・管理される。 ユーザーは様々な機会やメディア等を通じ商品情報と接触し、また店頭で目にし手に取り、実際に利用することでその品質を体感する。これら一連の中にユーザーの期待を裏切らない満足(価値)がある時、その商品はユーザーエクスペリエンス(新鮮で快適な良い体験)をもたらす商品として記憶され、さらなる注意が向けられるようになり情報収集と利用を繰り返すという循環が生まれる。このように商品とユーザーの間にできた体験を伴う良い関係が、商品に対する共感や信頼を育てユーザーの顧客化が起こり、徐々に顧客の頭の中に『 ブランドイメージ 』という行動を決定する力を持つ『 概念上の価値 』が構築されていく。

 

とあります。

 

つまり、

どこから知っても、TMIXのコンセプトや理念と提供するサービス・商品の価値がズレなくイメージが統一されている状態であり、いついかなる場合でも信頼を裏切らず顧客との関係を築く、と伝えていくことだと思います。

 

今までこのような考え方で運営できていたかというとそんなこともなかったのです。

はっきり言えば、機能追加や新商品の販売など1つ1つをスピード重視の考え方でやってきていて、ブランドとして統一されたイメージを持ってもらえるように考えてはいませんでした。顧客の頭のなかに形成されるイメージ、つまりどういったイメージを持ってもらいたいのかを真剣に考えたことはなかったのです。

 

しかしアメリカで見たECスタートアップは、比較的初期からブランディングの考えを取り入れ実行しています。

ブランディング - Wikipedia

顧客の視点から発想したコンセプトや理念を基に、常に顧客の期待や信頼に応えるよう行動し、良質な商品の供給を継続することでユーザーをはじめとしたステークホルダーの共感や支持を獲得・拡大していくこと、またそれに関連する一連の活動のことである。  

 を当たり前のように行っているのです。

 

TMIXのブランドイメージ

2015年6月の視察後、TMIXブランディングを進めると決めましたが、いままでやったこともなく社内のリソースも限られており、アメリカのECスタートアップのブランディングの考え方や取り組みを理解しなおかつチームと共有しながらスケジュールに落として具現化していくキーパーソンが必要でした。

そこで、NYCのスタートアップを独自で取材しトレンドを詳しく理解している江原理恵さんにお願いしました。

 

江原さんはスマートニュース株式会社のオフィスデザインのディレクションをしたり(参照:仕事する身体−−スマートニュースのオフィス移転物語 | スマートニュース株式会社)、ボタニカルデザイナーとして活躍されてる方で、NYCの視察も同行していただいたおかげで何倍も深い知識を得ることができたのです。

 

まず言われたことは、顧客にとってTMIXは一体なんなのか、我々の想いを具体的に言語化すべき、でした。

今まで言語化したことはありませんでした。

 

そこで、ミッション、キャッチフレーズをまずは言語化しようと、ホワイトボードに思いつくことを書き出したり、日を変え場所を変え何度も話をし、TMIXチームのメンバーと昔の話をしたりしながら浮かんでくることを書き溜めていきました。

 

 

ホワイトボードに書き出した様子

 

ミッション、キャッチフレーズを考えだしてから実際に決定するまでには1ヶ月以上かかりました。決まってみると、伝えたい事がストレートに伝わる文になりましたが、かなり試行錯誤しました。想いについて話すことはそれまでもしていましたが、それを1つの短い文章で伝えるとなると言葉がすっきり伝わらなかったり、スッと読めなかったり、ちょっと言葉を変えるだけで全体の印象が変わりイマイチになったりするのです。良くなったのか悪くなったのか考え続けすぎると判断が鈍るので数日寝かせたりしながら決めました。

 

TMIXのミッション、キャッチフレーズは以下に決まりました。

TMIXミッション 

世界中のあらゆる人々に、カスタマイズを通して、喜びや楽しみを提供する

 

TMIXキャッチフレーズ

Print Your Heart

 

 

他にも新しいロゴの作成やTMIXのカラーの選定などブランディングにはいろいろな要素があり苦労話もありますが、その話はまた別の機会にでも。

とにかくリリースしてみると周りの評判やユーザーの満足度が高く、本当にやってよかったと思ってます。

タイトなスケジュールのなか作り上げてくれたチームのみんなには本当に感謝です。

 

これからのTMIX

最後にこれからのTMIXについて少し話して終わりにします。

 

TMIXをローンチする前はフォトショやイラレがないとオリジナルTシャツが作れない、という時代でした。もちろん1枚から安価でオリジナルTシャツを作ることができる、ということもその頃ほとんど知られてなかったように思います。

2000年代の前半にTシャツプリント用のインクジェットプリンタが工場向けに多く出回り、1枚からフルカラーで安価で作れるようになっていたものの、それが一般の人に伝わってはいませんでした。

TMIXはインクジェットプリンタを生産している日本企業と協業しながらオリジナルTシャツを一般の人に気軽に作ってもらえるように、ウェブでデザインできるツールを用意することで、ウェブでカンタンに1枚から作れる、ことを日本で進めてきました。

 

ローンチ後から今までを、ウェブでデザインし作れる時代、とするならば、これからのTMIXは、

  • デザインしたことない人でも思い通りのデザインができる時代
  • デザインしていないのにデザインができる時代

に進んでいきたいと考えています。

このことについても、いつかまた話をできればと思います。

  

グーグルはミッションとして「世界中の情報を整理しアクセスして使えるようにする」ということを掲げています。

同じように、TMIXはTシャツデザインの情報を整理しデザインをしていないのにデザインが出来、利用もアレンジもできるようなサービスへと進化、カスタマイズを通して喜びや楽しみを提供できるような未来を描いています。

 

これからもTMIXチームは一歩一歩前に進んでいきます。

リモートライフ制度が新聞の1面記事に

こんにちは。spice life代表のヨシカワです。

 

昨日(8/27)発行の通販新聞第1524号のなんと1面にspice lifeのリモートライフ制度について特集頂きました!

紙面の3分の1も使っていただいてます。

1面記事は初めてだったし紙面も多く使っていたので見た時目ん玉飛び出そうになりました^^

 

spice lifeのリモートライフ制度

ネットでの記事はこちら。

www.tsuhanshinbun.com

 

モートライフ制度は2月に制度を作り、プレスリリースを配信してからいままでに多く取り上げていただいてます。

 

こんなに反響あると思っていなかったので正直驚いていますが、企業の働きやすい職場環境づくりや日本の働き方の多様化に貢献できればいいなと思っています。

 

 

今まで取り上げていただいた記事もまとめておきます。

数えたら10以上ありました。

本当にありがとうございます。

 

news.careerconnection.jp

news.careerconnection.jp

nlab.itmedia.co.jp

matome.naver.jp

healthcare.itmedia.co.jp

weekly.ascii.jp

blogs.itmedia.co.jp

w-kawara.jp

www.remotework-labo.jp

5xruby.tw

http://spicelife-jp.tumblr.com/post/127703230849/日本ネット経済新聞8月27号に弊社のリモートライフ制度の取り組みについて掲載していただきました

spicelife-jp.tumblr.com

 

TOKYO MX NEWS特集(TV放映)

 

追記:

r25.jp

追記2017/02/09

2017/01/31 NHK番組首都圏ネットワークニュースウォッチ9にて放映

2017/02/02 日本経済新聞夕刊に掲載 ネット記事:花粉に負けない一工夫 :日本経済新聞

2017.02.02 日テレ番組news every. にて放映

2017.02.10 通販新聞一面記事内に掲載 ネット記事:注目各社の〝職場作り〟 社員の働き方をより良く、労働環境の整備で効率アップも - 通販新聞

がんばらない動的画像変換サーバーのつくりかた

tmixエンジニアのid:ksssです。

今年の夏も暑いですね。 僕は最近tmixで作ったドライTシャツを着て、朝のランニングで体力づくりに取り組んでいます。

http://tmix.jp/designs/2052395

tshirt

このTシャツには、プログラマー界での有名な言葉をもじって「ぐだぐだ言ってないで、走れ!」という意味を込めていて、なまけがちな自分をとっとと走りに行かせようと意識をたかめています。

今回はここに表示されている画像の裏側についてお話したいと思います。

動的画像変換

このTシャツ画像はリクエストを受けたときに指定のサイズの画像を生成して返しています。

動的画像変換を使うと、管理するファイルの削減や、事前処理の単純化、デザインへの柔軟対応などのメリットがあり、tmixでも様々なページで使われています。

動的画像変換には様々な実装がありますが、tmixではあまりがんばらない動的画像変換アプリを自前で実装し、運用しています。

画像変換については様々な記事や実装を参考にさせていただきました。

pixivのサムネイル事情 - pixiv inside

料理を楽しくする画像配信システム

画像変換Nightでngx_small_lightの話をしました - 考える人、コードを書く人

kanoko

こうして実装した動的画像変換アプリはだれでも使えるように、オープンソースとして公開しています。

github.com

動的画像変換アプリでは長いので、「kanoko」と名づけました。*1

kanokoはふつうのRubysinatraで書いたRackアプリケーションになっていて、system(2)からImageMagickのconvert(1)を呼ぶだけのシンプルな実装になってます。

webサーバーでがんばらない

webサーバーとして有名なnginxはwebサーバーです。 epoll等でのI/O複数管理を基本とした大量のリクエストを瞬時に振り分ける、いわば司令塔的な役割です。

自らも静的ファイル配信などでプレイヤーとしても活躍しますが、プレイヤーとしての処理に時間を取られるとだいじな個性であるマネージャー的な能力が無駄になってしまいます。

今回はnginxのプロセスでがんばるのはやめて、専任のRackアプリケーションにリクエストを渡して画像処理することにしました。

画像処理をがんばらない

動的画像変換ではある程度の速度が求められます。

しかしどうしても画像処理は処理時間は長くなってしまいがち。

画像処理の分野だけでも恐ろしく奥が深いのですが、ここはがんばらずにImageMagickのconvert(1)を使うことにしました。

ImageMagickをそのまま使っているおかげで「ちょっと中央寄りにズームした感じの画像」や「セピア色に加工した画像」なんかも簡単に作ることができるようになりました。

処理速度をがんばらない

CのAPIを使うとfork/execによるオーバーヘッドがなくなり処理速度の向上が望めます。 しかし依存関係や実装が複雑になってしまいがちです。ここもがんばらずにsystem(2)によってconvert(1)を実行するだけというおてがるな実装にしました。

並列処理もRackサーバーも頑張らない

処理速度をがんばらないとはいえ、そこそこの速度は欲しいので、マシンリソースは有効に使いたいです。

マシンリソースを有効活用するためには並列動作ができるかどうかがとても重要です。

ImageMagickのconvert(1)を使う以上、並列化するには複数プロセスが有効そうです。

そのためsinatraアプリケーションを動かすRackサーバーは複数プロセスで動作するunicornを選択しました。

unicornのプロセスからそのままsystem(2)を呼んでconvert(1)用のプロセスにしてしまおうという魂胆です。

unicornは他のアプリケーションでも運用経験があるので、運用もがんばらずに済みそうです。

入力値チェックをがんばらない

動的画像処理でよくあるのは「1000000x1000000の画像ファイルをつくる命令が来るとすごく困る」というもの。 対策として最大サイズを制限して……取得リソース先も決められたとこだけに制限して……。と漏れのないバリデーションをかける方法も考えられます。

kanokoでは画像変換サーバーとアプリケーション、双方で秘密の言葉を共有して、入力値にdigestをかけることにしました。

これにより、URLから予測してパラメータを作られてもdigestが一致しないリクエストは全て弾くことができます。

全てのリクエストは信用したアプリケーションからのものなので入力値のチェックもがんばらなくてよくなりました。

URL生成方法もgemライブラリ化して、どのアプリケーションからでもかんたんに使えるようにしました。

CPUでがんばらない

全ての画像リクエストに対して毎回画像を生成していては、突然のスパイクアクセスにCPUが耐えられません。

ここはマシンを増やして対応したりはせず、CDN *2 を前段に置くことによって一度生成した画像の再生成をしなくてもいいようにしました。

動的画像生成とCDNは相性がいいのでよく使われる方法だと思います。

画像を更新した時にURLが変わるように気をつけてさえいれば、*3二度目以降のアクセスに対して高速に変換後の画像を配信することができます。

また、取得リソースの情報を活かせば表示しているブラウザ側でもうまくキャッシュしてくれるかもしれません。

ここはがんばらずに、取得リソースのレスポンスヘッダも引き継いでkanokoのレスポンスヘッダーとして使いまわすことによって、kanokoではなにもがんばらずにS3などがつけてくれたキャッシュヘッダーを流用することができます。etagヘッダーもそのまま返していますが、画像サイズが変わればURLが変わるので同じetagヘッダーがついていても気になりません。

運用をがんばらない

アプリ運用にはパフォーマンス監視・死活監視・ロギングなどが欠かせません。 これまでさまざまなことをがんばらずにいた結果、これまで運用してきたアプリケーションと同じ構成になったので、 運用も楽できそうです。

でもちょっとだけがんばる

指定されたリソースから画像データを落としてきて、いったん一時的なファイルとして書き出してからconvert(1)コマンドを発行するようにしていたのですが、容量が非常に少ない画像でのみ画像変換が失敗する現象に遭遇しました。

たまたまその時読んでいた書籍「UNIXプログラミングインターフェース」によると、 I/Oにはバッファがつきもので、読み書き回数を減らすためにある程度のデータ量が貯まるまで、たとえwrite(2)したとしても実際にHDDのファイルに書き込まない。 という動作をするようでした。

一時的なファイルにwrite(2)したはいいものの、情報はI/Oバッファにとどまりファイルに書き込まれていないまま、convert(1)していたのが問題だということがわかりました。

そこで、ファイルへの書き込みを確定させるfdatasync(2)を用いることによって問題を解決することができました。

解決した問題を公開して、一般化する

kanokoはしばらくprivateリポジトリに、ただの社内アプリとして動いていました。

privateにしている理由はcapistrano用のファイルやunicorn用のファイル、監視用のコードなどが含まれていて公開して誰でも使えるというようにはできていなかったためでした。

そんなときに、「問題解決を一般化する」ことの重要性を説いた記事*4に感化され、

「2つのリポジトリに分ければいいんじゃん」とおもいつき、アプリケーションとしての設定ファイルになるcapistranoファイルやunicornファイルを含んだprivateリポジトリと、 アプリの核になるsinatraアプリケーション部分を含んだpublicリポジトリとに分けることで、オープンソースとして公開することができました。

そんなわけで誰でも使えるように意識して作っているので、皆様の問題解決の助けになれれば嬉しいです。*5

*1:鹿の子編みが名前の由来です。

*2:今回はAWSのCloudFrontを採用

*3:レコードの更新時間をdigestしてパラメータにくっつけています。

*4:エンジニアとしていかに成長するかについて、GMOグループの新卒エンジニア・クリエータの皆さんにお話した - Kentaro Kuribayashi's blog

*5:僕も趣味アプリで使っています。実装例にどうぞ。 https://github.com/ksss/kanoko-app

新卒がまたtmixのRailsを4.1に上げた話

いつもtmixをご利用いただき、ありがとうございます。tmixRailsアップグレードを担当しているうなすけです。 4月にRailsのバージョンを4.0に上げた記事を書きましたが、その時点でRails 4.2がリリースされていたのはご存知かと思います。 時代に乗り遅れたくない!ということで、またまた僕がtmixRails 4.1対応をすることにしました。

アップグレード作業

gemのバージョンを上げる

まずはrails 4.1をインストールしないことには始まりません。

gem 'rails', '4.1.11'

さて、この頃、世間ではbundlerのversion 1.10による新機能、BUNDLED WITHについて話題になっていました。ちょうどいいやという気持ちになり、おもむろに

$ gem update bundler
$ bundler -v
Bundler version 1.10.4

と実行して、bundlerのバージョンを上げてしまいました。

synvert

前回に引き続き、synvertのお世話になりました。

$ gem install synvert
$ synvert --sync
$ synvert --run rails/upgrade_4_0_to_4_1

今回、文法の修正こそありませんでしたが、新しくconfig/secrets.ymlができました。秘密にしておきたいトークン達は、ここにまとめることになったようです。 ここに記述する長い文字列は、各環境(development、staging、productionなど)ごとに必要になるようですが、既存のRailsアプリケーションを4.1にアップグレードする際には新しく生成する必要が出てくるかもしれません。tmixでも必要になったので、以下のコマンドで生成しました。

$ bundle exec rake secret

セッションシリアライズ方式の変更

カタカナで書かれるとなんのこっちゃとなるかもしれません。今までのRailsは、セッションのデータをRubyオブジェクトをMarshal(Rubyのオブジェクトを文字列に書き出す方式)によってシリアライズしていました。これが、Rails4.1ではJSON形式でシリアライズするのが標準になりました。 その設定が、config/initializers/cookies_serializer.rbに以下のように記述されています。

Rails.application.config.action_dispatch.cookies_serializer = :json 

ですが、いきなり全てJSONでやりとりさせるようになると動かなくなる部分も出てきます。なので、以下のように指定して、Marshalしなければいけない部分はそのままに、JSONで出来る部分はJSONで処理を行うよう変更しました。

Rails.application.config.action_dispatch.cookies_serializer = :hybrid

outdated syntaxの書き換え

前回アップグレード時にfixできなかったoutdated syntaxがまだ残っており、エラーが出ていました。.find(:all).find(:lock => true)などが残っており、それぞれ.all.lock(true)に置き換えました。 また他にも、Activerecord::Relationからmap!などのミューテーターメソッドが含まれなくなった(本家PullRequest)ことによるエラーも発生したので、.to_aを挟むようにしました。

リリース

今回は、前回の3系から4系に上げる変更よりは軽微なので、確認、リリースも普段のリリースと同様に開発者のみで行いました。前回同様に目に見える変化はありませんが、tmixは確実に、着実に新しく変化しています。 f:id:yu_suke1994:20150713180528p:plain

アップグレードを振り返って :ok_cat:

今回のRailsアップグレードは、前回の「Rails4.0に上げてね」とお願いされた形ではなく、自分から「やるぞ!」と思って作業をはじめました。今後のtmixの戦力として活躍できるように、自分から進んでやりたいことをどんどんやっていこうかと思います。次はRails 4.2にするぞ!!!

f:id:yu_suke1994:20150713180711j:plain