読者です 読者をやめる 読者になる 読者になる

ボクココ

サービス開発を成功させるまでの歩み

情熱プログラマーを読んで感じた学び続けることの重要性

書評

ども、@kimihomです。

週末は図書館で気になる本を読むのが最近の日課。地方の図書館だと学生ばかりいて、さながら受験勉強のような感じで読書ができる。

さて今回読んだのは 情熱プログラマーって本。

情熱プログラマー ソフトウェア開発者の幸せな生き方

情熱プログラマー ソフトウェア開発者の幸せな生き方

開発者としてあるべき姿的なのが書かれていた。

とにかく学び続ける

全体を通して感じたのは、好奇心を持って学び続けることの重要性。そして技術的なコミュニティやOSSに絡むことで、自分のブランドや、技術力そのものが向上できるといったことが書かれていた。

例えば日本では "今はとりあえず Java を学んどけば仕事に困らない" 的な流れがあると思うが、その風潮がいつ変わってもおかしくないし、特にJavaは企業プロダクトなのでその会社がダメになったどうなるのとかそういうリスクをはらんでいる。だから Java だけしか書けませんってのはリスクがある。 あと Java ならできますと言っておいて、JVMの細かいところを知らないような人が、Javaの専門家ですなんて名乗っていいのかってのも問題としてある。ほとんどのプログラマーはとりあえず書けるってだけで Java ができますと言ってしまう。これは問題だ。

Javaしかできないと言うのもやはり問題だ。どんだけその言語のプロフェッショナルでも他の概念を知らないと時代に取り残されることになる。 関数型言語とか動的な型付け言語を学んでみるとかそういうチャレンジが新しい発見につながる。全ての点が繋がり、本当に理解したプログラマーはどんな問題が起きても適切に対応する力を身につけることができる。

でも仕事じゃそこまで必要とされることがないから、それ以上は勉強しない。そんなエンジニアばかりが世の中に出回っている。技術が好きでなければ休日を利用してまで勉強するなんてことはできないから、エンジニアはできるできないの差が激しすぎる。できないエンジニアはプログラミング全行程を遅らせる要因にしかならない。ひどいソースコードはバグだらけのシステムを生み出す。

私ができないエンジニア100人よりできるエンジニア1人のほうが生産性が高いと思っているのはまさにこのこと。

仕事だけで燃え尽きるな

今回私が最も考えさせられたのは「仕事に全力になりすぎて学ぶことをおろそかにすると、それ以上のプロダクトはできない」ってことだ。今は自分は CallConnect の開発に100%注ぎ込んでいて、休日も開発していたりした。

ただこれだと今の自分の能力以上のプロダクトはできないんだよね。より高度な技術や専門的な知識がいるようなことは自分が休日を利用してサービス開発してでも作ることはできない。

だからこそ、自分を高める時間をもっと作らなければならないと痛感した。具体的には仕事はちゃんと時間通り終わらせて、そのあとは勉強に時間を使う。休日は開発ではなくて勉強に時間を使うといったことをやっていこうと思った。

それは以前の自分に似ている。企業に勤めていた頃は起業の準備に向けて必要な技術を空き時間で必死になって勉強した。それは誰かに言われてとかじゃなく、自分の使命感からくるモチベーションだった。今起業して自分でサービスを0から作っているが、基本的なことは全て独学で習得した。そしてこれからも独学で学ぶこと以上に効果的な技術の習得方法はないと思う。

"自分のサービス開発が大事だからこそ、時間を作って自分の技術力を高める。"

その思いを持って、これから過ごしていきたい。てことで、このブログも新しい技術を学んだ時のアウトプットの場として、利用していきたいと考えている。

はてなブログのデザインを本格的に開発できる環境を作ったよ

ども、@kimihom です。

はてなブログを本気でカスタマイズすれば、メディアのような UI を実現することも夢ではない。はてなブログは記事の管理やSNS、SEOなどは標準でうまいことできてるから、デザインだけ頑張れば良いことになる。ただ、通常のやり方ではてなブログをカスタマイズするとなると、とても手間になることが多い。

そこで自分の考える最高のはてなブログデザインのカスタマイズ環境を用意して Github に公開した。

github.com

実際の方法は上記のリンク先を見て確認していただきたい。

以下はプログラミングとか全くやったことない人向けにちょっと概要を説明する。

LESS とは?

LESS とは CSS をより効率良く書く為の言語。通常のCSSだと入れ子のような書き方ができなかったり、共通の値をそれぞれ直書きしないといけなかったりで効率が悪かった。LESS を使えばそのような課題を解決できる。

ただし、 LESS で書いたコードは最終的に CSS に変換しなければ、ブラウザが読み込んでくれない。そのためにLESSをCSSに変換するプログラムが必要だ。

Node.js, Grunt とは?

Node.js はプログラミング言語の一種。そのNode.jsを使って Grunt ってのは動いている。

Grunt を使うと、あらゆるタスクを定義することができる。今回は、 LESS コンパイラとLiveload が付属している。 LESSコンパイラはLESSからCSSに変換してくれるための仕組みだ。Liveload は、LESS ファイルを修正するだけで、その変更を察知し、特定のアクションを起こしてくれる仕組みのこと。今回はLESSファルが変更されたら、Dropbox上にコンパイルしたCSSを配置するってのを定義している。

てことで、諸々のセットアップが完了したら、grunt ってコマンドを叩くだけでDropboxへLESSから変換されたCSSがコピーされる仕組みが整う。

作ったらテーマストアに投稿してね

自分が作ったCSS集を公開できるストアがある。

テーマ ストア - はてなブログ

普通に考えたらせっかく自分が頑張って作ったブログが、他の人にパクられるんじゃないかってことになるかと思うんだけども、それがプログラミングにおけるオープンソースの考え方なんだ。自分が作ったCSSを他の誰かが作ってくれている。パクられたとかじゃなくて、そういうことに喜びを感じられるようになろう。

デザイナーツールは金ばっかりかかって、エンジニアツールは金がかからないのはそうした奉仕の精神がエンジニアにはあるからだ。これを理解できればきっとあなたはデザイナーから、生粋のエンジニアになることができるだろう。

俺は、世界を変える男だ。

スタートアップ

ども、@kimihomです。

今回はリーダー論について語ってみる。

掲題のタイトルを見て、皆さんはどう思っただろうか? その発言をした本人にただならぬ意志を感じたのではないだろうか。これが何の根拠がないことは明らかなのに、それを断言する人に強い意志を感じる。人はそう言う人のビジョンに惚れ、「この人と一緒にやれば自分も世界を変えられるんだ」という意思が芽生える。リーダーがしなければならないのは、相手を信じ込ませること。たったこれだけだ。

リーダーがビジョンを掲げると、それに共感した人たちがやってくる。共通の目標に向かってというよりかはその世界が実現できると"信じて"行動するだろう。この目的意識を持たせることが最も大切なことなのだ。目指すところをどれだけ大きくできるか。スケールが大きくても一人でも「はは、面白い。やってやろうじゃねぇか」と思ってくれるフォロワー(社員)がいれば、その夢の実現も不可能ではない。

マネジメント?そんなのクソ食らえだ。人を管理したところで管理された側は言われただけのことをするだけのポンコツにしかならない。私がマネジメントを嫌う理由はそこにある。指示待ち人間と、ビジョンを信じて行動する人間とでどちらが生産性が高いだろうか?答えは明確だろう。マニュアル化とか、属人性の排除とかはマニュアル人間を量産させる手段にすぎない。真の強い組織は、自分が世界を変えるという強い信念を持って仕事に取り組むのである。

俺は、世界を変える男だ。

根拠はないけれど、そう断言することのできる日本人が出てきたら面白い世界が始まると思う。

オナ禁アプリを2年間運用して得られた感動

雑談 Android

ども、@kimihomです。

あまりこのブログでは大っぴらに公開していないのだけども、私はオナ禁ストイックというアプリを2年前から運営している。まぁ別にこれは恥ずべきことではなく、世の中をよりよくするためにやっていることだと自負しているからこそ堂々と宣言しているけども。

play.google.com

このアプリを作ったきっかけは、自分が欲しいと思ったから。今の時代、エロサイトを作って広告貼れば儲かるみたいな感じでそっち方面で制作を頑張る人たちが多いんだけど、その流れに真っ向から対立してあえてエロを断ち切るコミュニティを作りたいと思った。みんなで見ないようにする努力ができれば、きっとその人の心の中で自信がつき、日々の生活がよりよくなるだろうと考えたのだ。

ネット社会の悪の根幹だと思う。ググって検索すれば一発でそういうサイトに行くことができる。私はこの問題を解決するには、一人一人がそういうサイトは悪であるという意識を持つしかないと思っている。そもそもググったりブックマークしないという意思を持たなければならない。

私のこの想いは間違っていなかった。今ではこのアプリの中で一種のムーブメントが起こり始めている。私のアプリに対する思いに共感してくれるユーザーが今では数万人もいるのだから。信じた者同士が、お互いを励ましあって克服しようとしている。

このアプリの"匿名掲示板"は最も素晴らしい機能だ(これがNGでiOSはBANになったが..)。掲示板の投稿を見ると、真剣に信じて耐え続けている男たちの生き様を見ることができる。投稿の中では"このアプリで人生を変えることができた"という報告が度々出てくるようになった。それを見た他のユーザーが励まされ、より良いコミュニティが形成されている。

この2年間、私がやってきたことは私が欲しいと思った機能を開発しただけだった。ユーザー数は私が何かをしなくても自然と増えていった。ぜひアプリをダウンロードせずとも、このアプリで成功した男たちのレビューを一度でいいから見ていただきたい。

同志を持つコミュニティに荒らしは無力

たまに長い文字を連投したりして荒らしをする暇人がいるんだけども、基本的にスルーするのが一番だった。時には一つ一つ投稿を手作業で消していたりしたけど、それがまた相手の心に火をつけてしまったようで一向に終わらないことがあった。掲示板利用者は皆モチベーションが高いので、スルーしたり投稿にbadをつけあって消す協調性があるので、自然とそういう投稿は浄化されていった。

同志が集まるコミュニティだからこそ、実現できる素晴らしい掲示板環境である。2chとかではまず無理だろう。

自分が欲しいと思った何かは、きっと他の誰かが欲しいと思う

ふと「こういうのがあればいいな」って思った時って、他の何万人もきっと同じことを思ってることなんだよね。そんな時は誰でもグーグルで検索したり、Playストアとかで検索するから。事実、自分と同じことを思った人が今 6万人以上いたからこそ、ここまで支持されるアプリになったのだ。世界中のファンによってあらゆる言語に翻訳され、今では10ヶ国語対応するアプリになった。

自分が欲しいと思ったアプリだからこそ、開発のモチベーションが全く違う。しっかり作れば自分が喜ぶのだから、頑張れて当然だ。人一倍こだわりを持つことができるだろう。

ユーザーの声を見る喜び

掲示板の投稿を見ると、「このアプリのおかげで彼女ができた」「人生が変わった」「ありがとう」と言ってくれる。日本そして世界のどこかの誰かの人生を自分のアプリが変えていると実感する時がある。

こういう体験ってネットが普及するまではほぼ不可能だったと思う。それができる今、アプリやWebの技術の進歩のありがたさを痛感する。

アプリ開発者として、私はそういうことに幸せを感じるのである。

RailsのActionCable と同時に IP メッセージングも知るべき理由

twilio Rails

ども、@kimihomです。

巷の Rails 界隈では 新しいバージョン 5 で登場した、ActionCable が話題になっている。いろいろな勉強会が開催され、Qiitaではこれから ActionCable を使ってみた 的なエントリーが大量に出現することだろう。

ActionCable を使えば、HTML5の WebSocket を使って"リアルタイム"なアプリケーションを作ることができるようになる。このリアルタイムの代名詞といえばチャット。誰かがメッセージを送った瞬間、受け手側にそのメッセージをリアルタイムで表示させるっていう方法は Web の構造上難しいものだった。それを ActionCable を使えば WebSocket を使って相手が送ったと同時に受け手側にメッセージが表示されるような仕組みを作ることができる。

今までのリアルタイムサービスは、基本的に Node.js の socket.io が一般的だった。最も手軽に作れるということで流行したけども、それが Ruby on Rails でも開発できるようになる、というだけの話である。なのにこの騒ぎようは、やはり Rails が人気であるということなので、いちRailsエンジニアとしては大変嬉しいことである。

だが、 ActionCable を使えるようになったところで、実際に本番サービスに投入することは可能だろうか?もしそのサービスがたくさんのユーザーを抱えるようになった時、自分でそのActionCableサーバーをスケールさせることはできるか? まだまだ出たばかりの技術をいきなり使って ActionCable にコントリビュートしたい方ならその選択も悪くはないだろう。私としてはそこで時間が取られてしまうのはやはり厳しいものがあった。今 ActionCable を実装して本番に組み込むというのはあまりにリスキーだったので手が出せなかった。

IP メッセージング

IP メッセージングは電話 API でお馴染みの Twilio が昨年出した新しいサービスだ。自分のWebサーバーとTwilioサービスを連携させて簡単にチャットのようなリアルタイムサービスが作れるようになる。

他の自前で リアルタイム処理サーバー を持ってしまったことによる運用の問題はすべて Twilio 側で受け持ってくれる。"メッセージング"と聞くと、チャットだけしか作れないように思われるかもしれないが、自分のWebサーバーから直接メッセージを送ることで、サーバーサイドからイベントをプッシュする仕組みも簡単に構築が可能だ。つまり、リアルタイム、サーバーサイドプッシュなどを実現したいサービスを基本何でも作れるだろう。

リアルタイムはリアルタイム専用のサーバーやサービスとして分けることで、基本となるWebサーバーの実装は極めてシンプルになる。ActionCable は確かに リアルタイムサーバーとして最低限のコードを書くだけで実現することが可能だが、それでもなおそれなりのコードを書かないと実現ができない。IP メッセージングを使えば、 Twilio が発行するトークンをWebサーバーで取得し、そのトークンを IP メッセージングのライブラリの呼び出しの引数にセットしてあげれば良いだけになる。あとはメッセージを受け取ったイベント時に必要なコードを書けば良いだけだ。

IP メッセージングの概要を聞いたところで、クラウドサービスに詳しい方なら Pusher というサービスをご存知かもしれない。基本的にはPusherと非常に近いものがある。ただし、Pusherの価格を見ればわかる通り、従量課金ではないプラン毎の課金スタイルになっているので、最低料金が$45とべらぼうに高い。 IP メッセージングは完全に従量課金であるため、スモールスタートには最適なサービスである。実際、現在のところ1メッセージ 0.0060 円という料金価格になっている。

ActionCable ばかりが注目されて、 IP メッセージングがほとんど注目されていないのは、きっとこうして発信する人がいないからだと考え、今回ブログ記事として上げてみた。

IP メッセージング勉強会開催します

最後に告知になるが、この IP メッセージングの勉強会を2月26日東京で開催する。

twiliojp-ug.doorkeeper.jp

私は実際、クラウド電話サービスの CallConnect で IP メッセージングを用いてサーバーサイドプッシュを実現させた。IP メッセージングの基本の解説に加えて、実例も紹介したいと思う。

ActionCable と IP メッセージング、是非比べてみていただければ幸いである。

得意を生む"きっかけ"はいつも単純だよね

雑談

ども、@kimihomです。

今回はふと思い立って自分のことについて書いてみることにした。

自分はまぁ今となっては根っからのエンジニアでスタートアップで働く人間という感じになっているけども、どうやってこんな風に至ったのかを考えてみる。得意・不得意ってそれぞれにおいて何かしらの衝撃的なきっかけがあり、それからどんどんと磨かれていってるんだなぁと改めて思う。

数学が好きになったきっかけ

自分は元はというと特に得意分野ってのはあまりなかった。数学は計算自体は早く解けていたけど、文章問題になったら途端に解けなくなるっていう典型的なパターンだった。

そんな中で一気に自分の数学熱が上がったのは、当時通っていた塾での出来事だった。

自分は中学になってからひたすら塾に通い続けたおかげで、塾の中の割と優秀な部類のクラスに居続けることができた。(当時は自分の才能だと思っていたが、改めて考えるとただ塾にずっと通って勉強させられていたからだったと気づくのはずいぶん後になってからだ。) まぁそんな訳で、学校では天才クラスだった自分も、塾に行けば他もみんな頭のいい人ばっかりだったので、そのクラスでは学力は下の方の部類に入っていた。

そんな中、とある数学の授業で忘れられない体験をした。当時は塾の数学の授業ですらついていくのに必死で、問題がわからないことも多く、指されないでくれ・・と祈る日々が続いていた。その時の先生が菊池先生っていうんだけど、ふとある時、問題を解くように言われた。

どんな問題だったかは忘れたんだけど、うまく問題を解けて、めっちゃ褒めてくれたんだよね。その時の喜びが今でも自分の心の中に残っていて、これが自分が数学が好きになったきっかけだった。それ以降は数学が好きになり、時間を忘れて勉強できるようになった。数学に関しては塾でも上位クラスに入るくらいになることができたのだ。

たったこれだけの体験で、まさか今後もずっと数学というか理系の人間になるなんて、きっかけって本当に突然のタイミングでくるものだな、と改めて感じる。

数学好きが功を奏して、プログラミングを学ぶきっかけを手に入れることができた。プログラミングを学ぶ時って、自分的には数式を説いている感覚に似ていて、自分なりの計算方法(プログラミング)をすれば答えが一つに決まる。

この感覚がとても好きで、"勉強させられている"というよりかは"自分から勉強している"感覚でプログラミングを覚えていくことができた。プログラミングで人から褒められたってことはあまりないんだけど、やっぱり数学で褒められたあの時から、今の自分のプログラミングの知識は形成されていったのだ。

美術が苦手、大嫌いになったきっかけ

私は逆に美術がとても苦手だった。このきっかけは小学生の時。全然書くアイディアが思いつかなくて、時間も無くなってきたから適当に絵を描き上げて提出した時があった。この時、先生にボロクソ怒られた。「こんなんで提出すんじゃねーよ!」と。

そのあと適当によくして提出できたものの、それ以降美術の授業が楽しいと思ったことは一度もなかった。

そのショックを今でも鮮明に覚えているってことは、やはり自分の人格を形作る上で大きな分岐点になったのだろうと思う。先生は何気なく言った一言だったのだろうけども、今でも自分が絵を描くことに関しては全くもって不得手である。

きっかけはいつも単純

きっと誰だってこう言う単純な出来事から得意なこと、不得意なことが形成されているのだろう。

小学生のあの時に、絵を描いて褒められたなら、今の自分はデザイナーになっていたかもしれない。センスってのはあることに対してずっと続けられるかどうかってだけの違いな訳で、そのモチベーションがどこから生まれたのかが違うだけの話なのだ。

これは今後、自分が教育者や親になっていった時に注意していきたいところである。ふとした一言がその人の今後の人生をも決める一打になるのだから。

中学生の時の数学の先生だった菊池先生のように、良い意味で相手に影響を与えられるようになりたいと思う。

ちなみになんで自分がスタートアップとか起業にこんなに熱気になれているか、ってのはまた別の高校時代のエピソードがある。何事にもマジで"きっかけ"てあるもんだね。

Node.js(JavaScript) でのクラスの定義について考え直してみた

JavaScript

ども、@kimihomです。

毎度 JavaScript でオブジェクト指向プログラミングをやろうとすると、どうやって書けばいいか悶々としていたが、最近ようやく定まってきたのでまとめてみる。調べるとnewを使ったり、prototypeを使ってメソッドを定義したりする方法もあるようだが、個人的には以下の方法が一番書きやすいし理解しやすかった。

JavaScript でのクラス定義

JavaScript はご存知の通り classキーワードが存在しない。そのため function オブジェクトを使って定義することになる。この実装でキーとなるのはメソッドの返り値にオブジェクトを返すところにある。

var MyClass = function(args) {
  var pVar = "Private 変数";
  var args = args; // コンストラクタの初期化

  var privateFunc = function() {
    //プライベート関数
  };

  return {
    publicFunc: function() {
        // パブリック関数。 privateFuncや pVar, args など参照できる。
    },
    publicFunc2: function() {
        this.publicFunc();  // this が必要。
    }
  };
};

module.exports = MyClass;

//
// 別ファイルで
var myClass = require('./myClass')(args); // ()付き!

上記のコードを見ると、なぜパブリックなメソッドとプライベートなメソッドがこれで定義できるのかも理解しやすいと思う。MyClass()を呼び出した時、返ってくるのはJavaScript のオブジェクトになる。つまり、別ファイルで定義したmyClassにはpublicFuncを持ったオブジェクトが返ってくることになる。 JavaScript のクロージャの仕組みによって、publicFunc()のコードの中にprivateFuncなどのメソッドを参照することができる。これにより、private, public なメソッドを定義することが可能になる。

(余談) クロージャって言葉を書くとそれなりに中・上級者っぽく見えるw。JavaScriptのapplyとか使いこなせるようになると、そのさらに上ってイメージ。

この方法の注意点

注意する必要があるのが2つある。 1つ目は、 Node.js で require した時、最後にメソッド呼び出しとして () をつける必要がある点だ。これでメソッド呼び出しをした戻り値(オブジェクト)がmyClassに格納されることになる。

2つ目は、publicメソッドの中でpublicメソッドを呼ぼうとすると、"そんなメソッドねーよ"とエラーになる点だ。// this が必要というコメントの部分にあたる。これは publicFuncpublicFunc2 JavaScript の オブジェクトで定義された値でしかないので、直接名前だけで呼び出すことができないため、thisを明示的に示さないとメソッドを見つけることができないのが原因だ。

この this ってのも曲者で、例えばpublicメソッドの中で無名関数を呼ぶと、そのthisの指すオブジェクトも変わってしまう。以下のような場合だ。

    publicFunc2: function() {
        this.publicFunc();  // this が必要。
        [1, 2, 3].forEach(function(val, index) {
            // this.publicFunc();  
        });
    }

forEach で括られた中の this は、MyClassで返すオブジェクトではない。forEachの中のオブジェクトを指してしまうので上記コードは正しく動作しない。てことでここでもクロージャを使ってthisの別名を作成する必要がある。

    publicFunc2: function() {
        this.publicFunc();  // this が必要。
        var self = this;
        [1, 2, 3].forEach(function(val, index) {
            self.publicFunc();   //OK!
        });
    }

this は無名関数の中に入ると気ままに向き先を変えてしまうので、注意しよう。

終わりに

それなりに大きな JavaScript プログラミングをするなら、オブジェクト指向でやらないと大変な目にあうだろう。JavaScirptコードが大きくなってきて、リファクタリングが必要だと感じられるようになってきた時に、このやり方を知っておけば JavaScript でも効率的なオブジェクト指向プログラミングが可能になると思う。

クラスって意味では今回紹介した方法はわかりにくい(継承がない)けども、JavaScript の性質をうまく利用したクラス定義方法であると思う。むしろ継承しにくい方がいいと思う。移譲、移譲、移譲って言われてるし。

てことで JavaScript でも Let's オブジェクト指向プログラミング!