『マンモス 世界最大のSNSを創った男』

サブタイトルとジャケットから『ソーシャルネットワーク』みたいな要素を少し期待したら、SNSもネットベンチャーもまったく関係なかった。話は日常のすれ違いや後進国の社会問題を扱っててあんまり救いがない話なのにラストシーンで救いがあったかのように終わってた。

もっと上手に JavaScript を書くための 10 の Tips (10 tips to write better JavaScript)

この文章は、 Kinesis framework の公式ブログから "10 tips to write better JavaScript" という記事を翻訳したものです。今回は原文を並記してみます。実験的に GituHub で作業をしていたところsakuro さんからご指摘頂きました。GitHubは素晴らしいですね。

10 tips to write better JavaScript
http://kinesis.io/blog/10-tips-to-write-better-javascript/

1. セミコロンを忘れない(Don’t forget the semi-colons)

JavaScript allows developers the freedom to skip semi-colons in the source code. Most of us, being lazy as we are, tend to follow this.

However, the JavaScript compiler still needs them, so it is the parsers job to insert them whenever there is a parse error due to a missing semi-colon. It tries to execute the statement, and if it fails, it tries again with the semicolons

When you’re writing JavaScript, you should always include semicolons after statements.

JavaScript では、開発者がソースコード中のセミコロンを飛ばす自由がある。ほとんどの人は、私たちがそうであるように、怠け者なので、そうしがちだ。
しかし、JavaScriptコンパイラは依然としてセミコロンを必要としていて、セミコロンがないところでパースエラーがあると必ず、パーサがセミコロンを挿入する。ステートメントを実行しようとして失敗すると、セミコロンから実行を再開しようとする。

JavaScript を書くときは、ステートメントの後ろにかならずセミコロンを含めるべきだ。

2. 言語をよく知る(Know the language)

When we talk about Arrays and Objects in JavaScript, there are two ways to initializing them listed below.

JavaScript で Array とObject の話題といえば、以下のように、2 種類の初期化の方法がある。

var arr = [], obj = {};

var arr = new Array, obj = new Object;

だ。

Note that in modern browsers, the first way is faster and should be used.

モダンなブラウザでは、最初の方が高速なので、こちらを使うべきだ。

3. For ループ 対 For in ループ (For vs For in Loop)

The for in loop looks like

ループで使用する for はこんな感じだ。

for(item in obj) {
 //do something with item
}

This has a drawback. It will not just access the properties of “obj”, it will also include any properties inherited by the object through the prototype chain.

Therefore, most of the times, we have to use a if statement inside the loop along with the method “hasOwnProperty()” on the “obj”.

これには欠点がある。アクセスを許すプロパティが obj のものだけではないということだ。プロトタイプチェーンによって継承したプロパティをすべて含んでいるということでもある。

そのため、大抵は、ループ中の obj に対して hasOwnProperty() メソッドと一緒に if ステートメントを使わなくてはいけない。

4. == の代わりに === を使う(Use === instead of ==)

The identity (===) operator behaves identically to the equality (==) operator except no type conversion takes place. The types must be the same for === to return true.

The == operator will compare for equality after doing any necessary type conversions. The === operator will not do the conversion, so if two values are not the same type === will simply return false. It’s this case where === will be faster, and may return a different result than ==. In all other cases performance will be the same.

'===' 演算子は、等値か判断するのに必要な変換を行ってから比較を行う。'==' 演算子は変換をしない。2 つの値が同じ型でない場合、 '===' は単純に false を返す。'===' が速いのは事実だし、'==' と異なる結果を返すこともあるが、それ以外のすべての場合で、パフォーマンスは同じだ。

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

5. with の使用を避ける(Avoid using “with”)

JavaScript’s with statement was intended to provide a shorthand for writing recurring accesses to objects. So instead of writing

JavaScript の with ステートメントは、オブジェクトに繰り返しアクセスするための略記法を提供するためのものだ。次のように書く代わりに、

a.s.d.f.g.h.j.k.hello = true;
a.s.d.f.g.h.j.k.world = true;

You can write

このように書ける。

with (a.s.d.f.g.h.j.k) {
    hello = true;
    world = true;
}

How can you be sure if the variable a.s.d.f.g.h.j.k.hello is being set or a global variable named hello is being set.

Fortunately, we have a better way of doing this.

a.s.d.f.g.h.j.k.hello という変数がセットされるか、hello というグローバル変数がセットされるか自信を持って言えるだろうか。
幸運にも、これをやるよいやり方がある。

var obj = a.s.d.f.g.h.j.k;
obj.hello = true;
obj.world = true;

6. メソッド呼び出しを避ける(できるかぎり)(Avoid method calls (as much as you can))

Inline code is faster in all modern browsers that calling functions. I know that writing code in this manner can lead to clutter, but this is just one those JavaScript annoyances that we deal with.

インラインコードはすべてのモダンプラウザで関数呼び出しを行うよりも速い。私はこの方法が散らかりの元となると知ってはいるが、これは JavaScript のいらいらを扱う一つの方法でもある。

function explicitCall() {
  function cube(x) { return x * x * x };
  var i = 1000;

  while(i--) { console.info(cube(i)); }

}

function inlineCall() {
  var i = 1000;

  while(i--) { console.info(i * i * i); }

}

7. JSLinst を使う(Use JSLint)

http://www.jslint.com/ is The JavaScript Code Quality Tool.
Use this and check your JavaScript for errors as much as you can. Running your code through this is a great way to improve your code and follow the best practices.

http://www.jslint.com/JavaScript の品質測定ツールだ。
これを使って、 JavaScript のエラーをできるだけチェックしよう。この中に自分のコードを走らせれば、コードを改善し、ベストプラクティスに従う素晴らしい方法になる。

8. ドット記法と数値型(Dot Notation and Numbers)

There is a problem in the JavaScript parsers dot notation when dealing with numbers.

JavaScript のパーサは、数値を扱う際のドット記法に問題がある。

10.toString() //Error

The JavaScript parser expects a number to follow right after the first period. This causes a syntax error.

JavaScript のパーサは、最初のピリオドの右側に数字を期待している。これがシンタックスエラーを引き起こす。

To fix this, there are two ways of going forward

これを正すには、次のように 2 つのやり方がある。

(10).toString();
10..toString();

9. ブロックスコープが存在しない(No block scope)

There is no block scope in JavaScript.
Statements like if and for do not create a scope, and therefore variables can be overwritten.

In the following code, we will see how the value changes if the variable x

JavaScript にはブロックスコープが存在しない。
if や for といったステートメントはスコープを作らない。それため、変数は上書きされる可能性がある。

次のコードで、変数 x の値が変更される様子がわかるだろう。

var x = 1; // x = 1

if(true) {
 x = 2; // x = 2

 for(var i=0; i < 4; i++) {
  x = i; //i = 0,1,2,3
 }

}

So x is changing as the code executes.

変数 x がコードの実行とともに変化していく。

10. グローバル変数をキャッシュする(Cache Globals)

It is always better when caching globals in terms of execution time.

実行時間の観点から、グローバル変数はキャッシュした方がよい場合が多い。

function notcached() {
 var i = 1000;
 while (i--) window.test = 'test';
}

function cached() {
 var i = 1000;
 var w = window;
 while (i--) w.test = 'test';
}

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

The GitHub poweredby Agile渋谷で「参加のSOCIAL CODING」という題で発表しました。

このエントリは2週間後の7/7に書いています。

銀座だけどAgile渋谷

WEB+DB PRESS』vol.69の特集「詳解GitHub」に合わせて、著者で Agile渋谷の発起人でもある @HIROCASTER の頑張りで開催されたイベントでした。

The GitHub poweredby Agile渋谷
日本のSOCIAL CODINGの今を見る
http://atnd.org/events/30016

WEB+DB PRESS Vol.69

WEB+DB PRESS Vol.69

  • 作者: 大塚弘記,渡辺修司,堤智代,森田創,中島聡,A-Listers,はまちや2,川添貴生,井上誠一郎,近藤宇智朗,ヒノケン,後藤秀宣,佐藤鉄平,mala,奥野幹也,伊藤智章,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2012/06/23
  • メディア: 大型本
  • 購入: 13人 クリック: 143回
  • この商品を含むブログ (18件) を見る

例によって、職人のレポートを引用。

The GitHub poweredby Agile渋谷 に参加してきた #Agile渋谷
http://d.hatena.ne.jp/absj31/20120623/1340463425

申し込みに出遅れたけど 、「パインアメ提供するから入れて」と冗談半分で言ったら「いいよ」という話だったのですが、それはさすがにどうよ?ということで、ちょうどタイムリーなネタを提供させて頂きました。

私のスライドはこちら。

https://speakerdeck.com/u/suginoy/p/social-coding

人前で話すのが本当に苦手で、前日とかスライドまとまらなくてヤダなーとか思ってました。なので、自分のプレゼンの出来については不問としますw。Keynoteに多少慣れたのでLTなどに挑戦しやすくなったかな。

気になる Pull Request の内容

スライドではあえて述べなかったのですが、僕のPull Request はほんと小さなバグフィックスで自慢できるようなものではなかったのですが、みなさんを高揚させたくて、あえて大げさな話にしました。このバグフィックスについては別エントリでそのうち書きたいと思います。僕個人は次の Pull Request をキメられるように精進します。

『情熱プログラマー

しゃれで引用した、『情熱プログラマー』ですが、この本には、藤村さんのプレゼンにもあったように、GitHub共同創設者のTom Preston-Werner氏による「GutHubに専念するためにMicrosoftからの30万ドルを断った」という刺激的なインタビューが掲載されているので、合わせて読まれると面白いと思います。

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

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

「参加」について

スライドのタイトルにも入れた「参加」というキーワードについて、『パターン、Wiki、XP』を引用しました。最初は『エクストリームプログラミング 第2版』(とくに第23章「時を超えたプログラミングの道」)から引用しようと考えていたのですが、この本には「参加」というキーワード直接使った記述がなく、意外でした。『パターン、Wiki、XP』は、何かのスキルが上がるわけではないですが、アジャイル開発をしようと思う人には是非読んでもらいたい本です。

XPエクストリーム・プログラミング入門―変化を受け入れる

XPエクストリーム・プログラミング入門―変化を受け入れる

パターン、Wiki、XP ~時を超えた創造の原則 (WEB+DB PRESS plusシリーズ)

パターン、Wiki、XP ~時を超えた創造の原則 (WEB+DB PRESS plusシリーズ)

例の動画

イベント開催後、一部の暴徒化したファンがアングラにプロモーション動画を流通させ、Twitterでステルスマーケティングを展開していますが、僕はその動画出てくるようなことは言ってませんので、ご注意ください。

ついでの話を。

今回は、某渋谷のMatzもどきの人が休憩時間に突然LTをはじめたり、某ジョジョエヴァンジェリストが乱入LTで参戦したりというイベントだったのですが、LTで発表させてくれという人なら人気の勉強会も飛び入り参加できるといいんじゃないかなぁと思いました。プロスポーツにはワイルドカード(主催者推薦枠)というのがあったりして、勉強会もそういうのが広まればいいなぁと思ったりしました。

RubyRailsコミュニティのみなさん、話を聞いてくだった参加者のみなさん、機会をくれた大塚さん、ありがとうございました。

Keep, よかったこと

  • ミニセッションを持った
  • 大場さんにフォローされた
  • GitHubを前より見るようになった
  • パインアメを提供した

Problem

  • プレゼンは気が重い
  • 実はGit力が足りない
  • 「はじめてのPull Request」企画にCollaboratorとして追加されてしまっていた
  • 行く先々でネタにされる

Try

  • 「はじめてのPull Request」企画の Collaborator 活動する
  • GItの勉強する
  • Gistを積極的に使う
  • 懇親会で借りたお金返す
  • 大場さん主催のxxx

Rails for Beginners Vol.0 にサポートとして参加しました。

Rails for Biginners Vol.0 (ビギナー枠) にサポートエンジニアとして参加させてもらい、ついでに Rails 3 本ソムリエなトークをしました。

Rails for Beginners Vol.0 (ビギナー枠)
http://atnd.org/events/28948

松本瞬さんによる初の試みでしたが、参加枠 10 人に対し、18 人の申し込みがあり、全員の参加が無理だったものの、プログラマではないけど意欲があるという方も参加されていてよかったなと思います。

当日何をやるかについて、主催者は、

というわけで半ば丸投げwでした。

環境構築組のサポートということで、僕とペアを組まれた方は、HTML などを少しづつ学んでいる方ということで、説明などは割とアバウトな感じで。3〜4時間しかない一日イベントでしたし。

エラーメッセージを見ると、

  • Rails Installer は /private/etc/profile の権限に 0440 を要求していたが、 0666 になっていた。(理由は不明)

/private/etc/profile というのは、 /etc/profile と i ノード番号が同じだったので、ハードリンクのようですね。
それはさておき、権限を変更することに。ちなみに、隣の主催者ペアは rvm や gem でインストールする作戦に切り替えた模様。

その際に、ターミナルの操作にそれほど慣れていないということだったので、

  • ls -ltr コマンド
  • Ctrl + P と Ctrl + N でターミナルの履歴を行き来できること

などといった小ネタをはさみつつ、僕も忘れていたのだが、Mac は デフォルトでは su コマンド使えないので、

を説明し、ちょっとビビリつつ、

  • passwd root で root パスワードを設定
  • chmod コマンド で 0440 に設定

という作業をして、再度インストールに挑戦。

ちなみに、LinuxMac OS などの UNIX 系 OS の入門には『UNIX先生』をオススメしています。表紙はかなりあやしげですが。

UNIX先生

UNIX先生

インストールを待つ間、僕の方の PC を使って説明。

当日は、家にある Rails 3の日本語書籍を大量に持ち込んでいたので、次の本を参考に進めました。重かった。

1人でつくる「Ruby on Rails3」アプリケーション―Webアプリケーションの開発から公開まで! (I・O BOOKS)

1人でつくる「Ruby on Rails3」アプリケーション―Webアプリケーションの開発から公開まで! (I・O BOOKS)

  • rails newコマンド
  • rails new したときに最後に bundle install が走ること
  • rails serverコマンド
  • WEBRick が簡易Webサーバであること
  • アクセスしたときログに出るステータスコード200の意味。Ctrl + C で停止できること
  • RDBMSExcel のようなものであること(笑)、デフォルトで SQLite を使うこと
  • RailsMVC やテーブルやモデル、コントローラの命名規則
  • MVC フレームワークについて、パーツ分割するという程度のこと
  • rails generate saffold
  • rake db:migrate
  • マイグレーションファイルについて、ターゲットDBMSの型と Rails での表現がマッピングされているということ
  • rake db:rollback
  • rails dbconsole で マイグレーションファイルの日付が schema_migrations テーブルに挿入されていること、rake db:rollback 時に実際にテーブルが削除されること(教えていて、あらためて気づきましたが、マイグレーションファイルの日付ってlocale の時刻じゃないんですね。)
  • ブックマークアプリ画面から入力後、rails console で、Bookmark.all 、 Bookmark.first 、 Bookmark.last 、Bookmark.where(name: => "hoge")を試す

rails console を試した理由を尋ねられ、一瞬固まってしまいましたが、

  • SQLについては、そういうデータベース問合せ言語がありますよという程度
  • MVCのファイルの配置とマッピング命名規則、コントローラの@bookmarks に Bookmark.all が格納されること、それがビューに渡ってくるところ
  • scaffold のURLとコントローラのメソッド、html.erbファイルと対応
  • URLの対応をroutes.rb で定義していること
  • Asset Pipeline について、SCSSが上手く説明できなかった(要復習w)

このあたりは、 Minami.rb のスライドなどを予習してきてもらえればよかったなと、あとで気づきました。次回移行の課題ですかね。

Rails初心者レッスン lesson1
http://www.slideshare.net/satomicchy/rails-lesson1

終盤は、環境構築組で是非ということで、heroku にアップロードをやりました。

  • Git がバージョン管理ツールであること
  • Rails には、デフォルトで developmet/test/production環境があること
  • Heroku では、PostgreSQL を使うこと、 Gemfile に修正が必要なこと

Gemfile については『基礎Ruby on Rails』で軽く触れられています。bundle install とbundle update の違いを知らない方はご一読を。このあたりも僕がこの本を薦める理由です。

改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

残念なことに、git init する前に、 heroku create をしてしまい、作業をやり直していてタイプアップとなりました。この辺りは僕の課題として、よく素振りしておきたいところです。Heroku で自分が作ったものが Web に公開されるのは、とてもインパクトがあるようですね。

git はほんとの最初の一歩としてならドットインストールをオススメします。かくいう僕も git 弱者で現在学習中です。

gitの基礎 - ドットインストール
dotinstall.com/lessons/basic_git

終了後に番外編として、日本語で書かれた Rails 3 本をすべて紹介するミニトークをしました。これについては、独断と偏見による身勝手トークなので、参加者のみの特典ということにしておこうかと。トークで触れませんでしたが、英語にアレルギーがなければ、Rails Tutorial もオススメです。最近 3.2 対応に改訂されていて、有料版のScreecast は RSpec を使ったTDD(テスト駆動開発)を学ぶのに最高の教材です。周辺ツールも一番使っていますしね。たまに Railscasts のようなボーナストラックが送られてきたりします。

Rails Tutorial
http://ruby.railstutorial.org/

僕自身も勉強になったし、いい刺激にもなり、面白い時間でした。OmniAuth やAamazon S3 やってたテーブルの話も聞いてみたかったなぁ。

最後にお役立ちな小ネタを 1 つ。

RailsCasts は Github リポジトリから git clone して自分で試しながらやるのがオススメ

Railscasts という素晴らしいサイトがあります。最新のRailsの情報が学べます。時間も長過ぎず、Podcast 、多様なファイル形式(mp4/m4v/webm/ogv)、 iPhone アプリに文字起こし版のASCIIcasts といたせりつくせりです。最近は、改訂版の revised 、月額の Pro 版も始まりました。

RailsCasts
http://itunes.apple.com/jp/podcast/railscasts/id218282043

RailsCasts (Mobile)
http://itunes.apple.com/jp/podcast/railscasts-mobile/id253867754

RailsCasts Revised Episodes
http://railscasts.com/?type=revised

RailsCasts Pro Episodes
http://railscasts.com/?type=pro

iPhone App (無料)
http://itunes.apple.com/jp/app/railscasts/id366039826?mt=8

Podcast に登録している人も多いと思うのですが、実際にソースをいじりながら試すと、ただ見るだけよりも身に付いたので、やり方を紹介します。

今回は 271: Resque を試しました。
http://railscasts.com/episodes/271-resque

ASCIIcasts は、素晴らしいことに日本語化もされています。今回のエピソードは Naomi Fujimoto さんの翻訳によるものです。
http://ja.asciicasts.com/episodes/271-resque

各エピソードのページから zip 形式で ソースがダウンロードできるのですが、Githubリポジトリがあるので、そちらの方が楽だと思います。

Githubリポジトリは以下。
https://github.com/ryanb/railscasts-episodes

git clone します。

% git clone https://github.com/ryanb/railscasts-episodes
% cd railscasts-episodes/episode-271
% ls
README			coderbits-after		coderbits-before

episode毎に xxx-before / xxx-after というフォルダが用意されていて、それぞれに Rails アプリソース一式があるので、修正前の xxx-before ディレクトリで bundle install します。

% cd coderbits-before
% bundle install --path vender/bundler
(省略)

あとは、Railscasts と ASCIIcasts を見ながら、自分で修正して試しましょう。上手く行かなければ、git status してみたり、 xxx-after のファイルと差分を取ってみたり、 xxx-after のアプリを直接 bundle exec rails server してみるのもよいと思います。

『これでiPhoneアプリが1000万本売れた』

2011年4月の本なので1年以上前ではあるが、読んでみた。この手の書籍は個人開発者がモチベーションを維持するために読むためにあるのかも。App Store の概要やどうやって収益をあげるか、どういうアプリを作ればよいか、どう開発するか、といった話。巻頭に仕様書が付いてくるので、企画などをやる人は目安として参考にするとよいかも。

これでiPhoneアプリが1000万本売れた

これでiPhoneアプリが1000万本売れた