Qiita初投稿です。初めまして、yosuke_furukawaと申します。
Node.jsでスクレイピングというとjsdomなんかが有名ですよね。
以下のやり方が参考になると思います。
node.jsとjQueryでスクレイピングするウェブアプリの作り方 | さくらたんどっとびーず
でも実際に外部サイトをスクレイピングしようとすると、requestモジュール使うかsuperagentモジュール使うかしなきゃいけなくて若干面倒です。これがScraperを使えばもう少し簡潔に記述できます。
Scraperの強力さを試すために東京Node学園祭で出た問題を紹介します。
Node.jsを使って、リクルートテクノロージズ社のサイトをスクレイピングしてください。
"recruit"もしくは"リクルート"の文字が何文字あるかワード件数を求めよ。
ただし、aタグのものは除去してカウントすること。
これ、Scraperを使えば簡単に回答できます。以下のようなスクリプトになります。
(ただし、本当はこの問題は当日の14時までに提出する必要があったのですが、すっかり見落としていて、時間内に回答できなかったので合っているかどうかは保証できませんが。。。)
var scraper = require('scraper');
scraper('http://recruit-tech.co.jp/', function(err, $) {
if (err) {throw err;}
$('a').remove();
var ans = $('html').html().match(/リクルート|recruit/ig).length;
console.log(ans);
});
上記のスクリプトを実行すると 2012/12/08 現在で 33 という回答が返ってきます。
これだけでも簡潔に記述できる事がわかってもらえると思いますが、Scraperにはさらに以下の様な機能が備わっています。
- 複数ページアクセス機能
- ユーザーエージェント指定機能
- リクエストタイミング指定機能
複数ページアクセス機能
以下のように配列形式でURLを指定することで複数ページに指定することが可能です。
var scraper = require('scraper');
scraper([
'http://qiita.com/advent-calendar/2012/javascript-mechanco-tips',
'http://qiita.com/advent-calendar/2012/ruby',
'http://qiita.com/advent-calendar/2012/vm'
], function(err, $) {
// ….
});
ユーザーエージェント指定機能
URLを渡すだけじゃなく、ユーザーエージェントを指定することが可能です。以下のようにします。
var scraper = require('scraper');
scraper(
{
'uri': 'http://search.twitter.com/search?q=nodejs',
'headers': {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
}
}, function(err, $) {
if (err) {throw err}
$('.msg').each(function() {
console.log($(this).text().trim()+'\n');
});
}
);
headersオブジェクトにユーザーエージェントを指定すればOK。
リクエストタイミング指定機能
複数ページから一気に同じサイトのページにアクセスするとDoS攻撃とみなされてしまう可能性もあります。
その時のためにsetTimeoutとかでタイミングを調整する必要があるのですが、そのタイミングをライブラリ側で指定できるという機能です。
var scraper = require('scraper');
scraper(
[
'http://search.twitter.com/search?q=javascript'
, 'http://search.twitter.com/search?q=css'
, 'http://search.twitter.com/search?q=html5'
], function(err, $) {
if (err) {throw err;}
$('.msg').each(function() {
console.log($(this).text().trim()+'\n');
});
}, {
'reqPerSec': 0.2 // 5秒間隔でページにアクセスしに行きます。1000/reqPerSecをして、そのミリ秒の間、setTimeoutで待つようです。
}
);
欠点
こんな風に簡潔に記載できて色々機能があるscraperですが、大変残念なことに2年前で開発が止まっていて、以下の様な欠点があります。
- jQueryのバージョンが v1.6と多少古い。 v1.8とかの新機能は使えません。
- デフォルトのユーザーエージェントが'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'になっており、MacユーザーやChromeユーザーからすると自分たちのブラウザで見ているものと違うものが返ってきている可能性があります。
ユーザーエージェントを指定するのは多少面倒なので簡易的に指定できる方法があるとより便利なのですが。この辺りの欠点についてはセルフアップデートするしか今のところは無さそうです。機会があればPullRequest投げてみます。
Qiitaアドベントカレンダーをスクレイピング
最後にこれまでのQiitaアドベントカレンダーをスクレイピングして一覧を作ってみました。以下のスクリプトで取得できます。
var scraper = require('scraper');
scraper('http://qiita.com/advent-calendar', function(err, $) {
var cal_links = [];
$('section li h2 a').each(function(){
var cal_link = 'http://qiita.com' + $(this).attr('href');
cal_links.push(cal_link);
});
scraper(cal_links, function(err, $) {
if (err) {throw err;}
var title = $('#adcal-title').text().trim();
console.log();
console.log('#'+title);
var i = 0;
$('.user a').each(function() {
var username = $(this).attr('href').replace(/users|@github|href|\//g, '');
var itemTitle = $('.right:eq('+i+') :not(div)').html().trim();
var comment = $('.right:eq('+i+') .comment a').attr('href');
var link = $('.right:eq('+i+') a').attr('href');
if (link.indexOf('item') < 0) {
link = comment;
} else {
link = 'http://qiita.com'+link;
}
if (link && link != '') {
itemTitle = itemTitle && itemTitle != '' ? itemTitle : link;
console.log('- %sさん:[%s](%s)', username, itemTitle, link);
}
i++;
});
});
});
実行すると以下のようになります。
#伺か Advent Calendar 2012
- nikolatさん:http://nikolat.phpfogapp.com/ukagaka/links-of-ukagaka/
- nikolatさん:http://d.hatena.ne.jp/nobml/20121202
- nikolatさん:http://nikolat.phpfogapp.com/ukagaka/show-ghost-forground/
- nikolatさん:http://nikolat.phpfogapp.com/ukagaka/show-banner-of-portalsites/
- nikolatさん:http://nikolat.phpfogapp.com/ukagaka/without-surface-png/
- nikolatさん:http://nikolat.phpfogapp.com/ukagaka/get-balloon-size/
- nikolatさん:http://nikolat.phpfogapp.com/ukagaka/earthquake-on-desktop/
#Ruby Advent Calendar 2012
- Linda_ppさん:Vim で Ruby を書くためのプラグイン3つ書いた
- jugyoさん:♥Enumerator を使ったシンプルな FizzBuzz♥
- awakiaさん:セマンティック・バージョニングと、Gemfileのバージョン指定方法 - Gemfileでよく見る
~>
を使いこなす - yaottiさん:pry/irbの
_
- kitaindiaさん:gem Koalaをつかってユーザーが特定のページに「いいね!」しているかどうかをチェック
- ujmさん:VimでRubyのrequire_relativeのファイル名を自動補完する
#XOOPS Themes and Templates Advent Calendar 2012
- mikauさん:http://ryus.co.jp/modules/d3blog/details.php?bid=364
- nouphetさん:XOOPS Cube の管理画面から使うCMS Theme Finderの紹介。
- fabiminoさん:XOOPSはPHPなんか分からなくとも何とかなるさあ(1)
- mikauさん:http://ryus.co.jp/modules/d3blog/details.php?bid=365
- naaoさん:http://bit.ly/SDI5fN
- nouphetさん:テーマでアバターとログインIDを表示する
- kilicaさん:http://qiita.com/items/3e386c93bc8db161796d
#Google Apps Script Advent Calendar 2012
- soundTrickerさん:5分で始めるGoogle Apps Script
- sucre1008さん:Googleスプレッドシートとスクリプトでサクッと作る地域の便利マップ
- soundTrickerさん:Spreadsheetの独自関数をGASで作るよ☆
- soundTrickerさん:GASのライブラリを使って楽したい① とりあえず使ってみる_(:3」∠)_
- soundTrickerさん:GASのライブラリを使って楽したい② 外部のJSライブラリを使ってみる(:3」[_]
- soundTrickerさん:GASのライブラリを使って楽したい③ 自分でライブラリを作ってみる(:3っ)っ -=三[布団]
- soundTrickerさん:よく使うTime Triggerのテンプレ
#VM Advent Calendar 2012
- nothingcosmosさん:http://nothingcosmos.github.com/DartVM/src/advent20121201.html
- nothingcosmosさん:http://nothingcosmos.github.com/DartVM/src/advent20121202.html
- nothingcosmosさん:http://nothingcosmos.github.com/DartVM/src/advent20121203.html
- nothingcosmosさん:http://nothingcosmos.github.com/DartVM/src/advent20121204.html
- nothingcosmosさん:http://nothingcosmos.github.com/DartVM/src/advent20121205.html
- Constellationさん:http://constellation.hatenablog.com/entry/2012/12/06/121144
- nothingcosmosさん:http://nothingcosmos.github.com/DartVM/src/advent20121207.html
- nothingcosmosさん:http://nothingcosmos.github.com/DartVM/src/advent20121208.html
#Objective-C Advent Calendar 2012
- odenさん:Methodの処理を差し替える - MethodSwizzling
- odenさん:シミュレータでも実機でも動く、なんちゃってUniversal Framework
- psihyさん:NSStringから絵文字を外す
- odenさん:プロトコル実装における菱形継承問題
- yaakaitoさん:http://yaakaito.github.com/blog/2012/12/06/adv-nui-css-like-uikit/
- shu223さん:Method Swizzling をうまく使っている実用例
#Machine Learning Advent Calendar 2012
- naoya_tさん:Metropolis-Hastingsアルゴリズム
- yagaysさん:PRML 11章 二変量正規分布からのギブスサンプリング
- niamさん:LIBSVMをマルチコア環境で速くする方法 using OpenMP+おまけ
- smlyさん:劣モジュラ関数最大化のおはなし
- Prunus1350さん:SASでk-means法を書いてみる
- koh_tさん:議員の政治的スタンスを記名式投票から見える化する話
- torotokiさん:計算論的神経科学と機械学習
- tomerunさん:https://twitter.com/tomerun/status/9729721761
#zsh Advent Calendar 2012
- mollifierさん:zsh で cd ../ したときにカレントディレクトリを補完候補から除く
- yaottiさん:深いディレクトリに移動するとき楽する方法
- dealforestさん:バージョンに依存した zshrc の書き方
- usamik26さん:よく使うディレクトリに別名をつける
- awakiaさん:
r
コマンドと言えば、統計だよねという全ての人のために - zshデフォルトのr
コマンドをオフにする方法 - aerealさん:使用頻度の低い Git のエイリアスを見つける
- y_uuki_さん:zshrcにWeb検索用のコマンドを定義しておくとドキュメントを引くときに便利
#Play or Scala Advent Calendar 2012
- puriketu99さん:Play&Sbt&Scalaのバージョン対応表
- ponkotuyさん:ScalaでCache
- kxbmapさん:Implicit Value ClassとUniversal Trait
- tototoshiさん:Slick ガイド
- k4200さん:Play! framework 2.0でのi18n関連
- kmizuさん:Weak Conformanceのはなし
- lyrical_logicalさん:View/Context Bounds の制約
- rabitarochanさん:Play2のevolutionスクリプトのコメントを表示するプラグインを書いた
- gkojaxさん:http://d.hatena.ne.jp/gkojax/20111212
#ドキュメント作成Tips Advent Calendar 2012
- sky_yさん:マインドマップから全てを紡ぎ出す - XMind+Pandocのドキュメント作成術 -
- kony_tさん:Kobitoのファイル連携機能をつかって書き捨てコードをドキュメントっぽく残す
- ayakixさん:TeXでの行間の調整方法
- takaxpさん:Org-modeのリンク機能で情報集約
- wtnabeさん:Docutils と Ruby で快適ドキュメント生活
#Lisp Reader Macro Advent Calendar 2012
- g000001さん:http://g000001.cddddr.org/3563308738
- garaemonさん:CommonLispでなんちゃって中置記法
- tk_ripleさん:http://compassoftime.blogspot.nl/2012/12/schemereader-macro.html
- ponkoreさん:Clojure のリーダーマクロについて
- sirohukuさん:http://kurohuku.blogspot.jp/2012/12/racketlang.html
- g000001さん:http://g000001.cddddr.org/3563708430
- g000001さん:http://g000001.cddddr.org/3563794801
- mgikenさん:http://mgiken.com/blog/2012/12/08/001611
#Corona SDK Advent Calendar 2012
- fakestarbabyさん:CoronaSDKの有益なリソースはココにある!
- u1tnkさん:CoronaSDKで死ぬ程ハマった落とし穴たち
#Emacs Advent Calendar 2012
- yaottiさん:文字列に同じ処理を繰り返し実行したい時に便利なキーボードマクロ
- awakiaさん:Emacsで1行の文字数が指定値をオーバーしていたらハイライトする
- kbkbkbkb1さん:Emacs で自動的にキーバインドをポップアップする guide-key
- takc923さん:Emacsの設定を便利に変えられるcustomize-groupの紹介
- ongaeshiさん:Emacsでリファクタリングに超絶便利なmark-multiple (複数行同時編集)
- takaxpさん:「タスク」から「予定」を分離してカレンダー表示,Org-mode仕立てで
- syohexさん:おすすめの helm拡張
#Perl6 Advent Calendar 2012
- VienosNotesさん:Perl6 Advent Calendar 1日目
- uasiさん:Perl 6 の関数は sub だけじゃない
- x19290さん:出力ストリームの再発明
- x19290さん:マッチオブジェクト超入門
- x19290さん:grammar 超入門
- x19290さん:Smalltalk 風 if
- x19290さん:Smalltalk 風 while
#zsh Advent Calendar 2012
- mollifierさん:zsh で cd ../ したときにカレントディレクトリを補完候補から除く
- yaottiさん:深いディレクトリに移動するとき楽する方法
- dealforestさん:バージョンに依存した zshrc の書き方
- usamik26さん:よく使うディレクトリに別名をつける
- awakiaさん:
r
コマンドと言えば、統計だよねという全ての人のために - zshデフォルトのr
コマンドをオフにする方法 - aerealさん:使用頻度の低い Git のエイリアスを見つける
- y_uuki_さん:zshrcにWeb検索用のコマンドを定義しておくとドキュメントを引くときに便利
#ドキュメント作成Tips Advent Calendar 2012
- sky_yさん:マインドマップから全てを紡ぎ出す - XMind+Pandocのドキュメント作成術 -
- kony_tさん:Kobitoのファイル連携機能をつかって書き捨てコードをドキュメントっぽく残す
- ayakixさん:TeXでの行間の調整方法
- takaxpさん:Org-modeのリンク機能で情報集約
- wtnabeさん:Docutils と Ruby で快適ドキュメント生活
#JBoss Advent Calendar 2012
- nekopさん:http://d.hatena.ne.jp/nekop/20121201/1354251344
- nekopさん:http://d.hatena.ne.jp/nekop/20121202/1354518027
- nekopさん:http://d.hatena.ne.jp/nekop/20121203/1354522404
- nekopさん:http://d.hatena.ne.jp/nekop/20121204/1354591287
- nekopさん:http://d.hatena.ne.jp/nekop/20121205/1354679929
- nekopさん:http://d.hatena.ne.jp/nekop/20121206/1354783052
- nekopさん:http://d.hatena.ne.jp/nekop/20121207/1354869727
#iOS Advent Calendar 2012 / Aug.
- puriketu99さん:html+css+javascriptでネイティブのiPhoneアプリをつくるPhoneGapの導入方法
- moriturusさん:便利なマクロ・カテゴリ・ライブラリまとめ
- happy_ryoさん:AppCodeについて色々
- yuch_iさん:iOSアプリ開発を捗らせるツールのまとめ
- KatagiriSoさん:クラスメソッド内でselfを使う
- kouchi67さん:Objective-Cでmultipart/form-data
- uasiさん:Xcode のスキームでビルド設定を切り替える
- ninjinkunさん:NSBlockOperationで手軽にキャンセル処理
- aguuuさん:NSUserDefaultsを使うときはWrapして使うと便利
- shu223さん:iOSアプリ開発に役立つTips100連発!
- miyakejさん:iOSで吹き出しを描こう
- feb19さん:iOS と Mac OS X 間を Bonjour で通信してちょっと楽しげなこと
- laisoさん:Clutch A/B TestingによるiOSアプリ向けA/Bテストソリューションのご提案
- yaakaitoさん:iOSライブラリの開発とテストと公開
- Keita_Shiyaさん:15分でCocosBuilderをさくっと試してみるまとめ
- mollifierさん:ON/OFF 切り替えスイッチを簡単に実装する
- dealforestさん:iOSでAPIのテストを気軽にかこう!
- corosuke_kさん:Blocksを使ったHTTP通信ライブラリを書いてみる
- inamiyさん:Core Animation 中級編
- yaakaitoさん:CoreDataのテストをシンプルに書こう
- yaakaitoさん:CocoaPodsで楽々ライブラリ管理
- yaakaitoさん:KiwiでiOSでもBDDしよう!
- yaakaitoさん:safariでもiOSアプリケーションを作ろう!
- laisoさん:最速podspec自炊研究会
- masarusanjpさん:sparrowライクなセルをスワイプすると出てくるメニュー
#あまり知られていないけど役に立つJavascript tips Advent Calendar 2012
- puriketu99さん:98%のプログラマはjsのテストを自動化していない(俺調べ)
- yaottiさん:色々なbreakpointを使ったJSデバッグ
- wgkoroさん:XMLHttpRequest Level2で異なるドメインへAjax通信する
- ukyoさん:crypto.getRandomValues
- ukyoさん:どの場面でどのundefined判定を使うか
- umezoさん:ブレイクポイントの編集を使ったちょっと変わったデバッグテク
#Play or Scala Advent Calendar 2012
- puriketu99さん:Play&Sbt&Scalaのバージョン対応表
- ponkotuyさん:ScalaでCache
- kxbmapさん:Implicit Value ClassとUniversal Trait
- tototoshiさん:Slick ガイド
- k4200さん:Play! framework 2.0でのi18n関連
- kmizuさん:Weak Conformanceのはなし
- lyrical_logicalさん:View/Context Bounds の制約
- rabitarochanさん:Play2のevolutionスクリプトのコメントを表示するプラグインを書いた
- gkojaxさん:http://d.hatena.ne.jp/gkojax/20111212
#Corona SDK Advent Calendar 2012
- fakestarbabyさん:CoronaSDKの有益なリソースはココにある!
- u1tnkさん:CoronaSDKで死ぬ程ハマった落とし穴たち
#D言語 Advent Calendar 2012
- repeatedlyさん:D言語 Language Update 2012
- youxkeiさん:ctpgはコンパイル時コンパイラコンパイラ?
- mono_shooさん:"Hello, world!"の話
- __DaLongさん:mixin すげーって思った話
- 9rnsrさん:2010からの2年で入った新機能4つの詳細解説
- ueshitaさん:ゲーム作る時のGCについて…
- repeatedlyさん:D言語で使えるテンプレートエンジン
#Git Advent Calendar 2012 / Jun.
- yaottiさん:GitHubユーザーのためのhubコマンド
- ongaeshiさん:Git習得のためのGithub入門
- ayakixさん:Gitブランチ関連コマンド
- skojiさん:Gitのリビジョン指定書式
- puriketu99さん:herokuにgitでリリースするまでを割と丁寧に解説する
- sotarokさん:Git submodule の基礎
- sugyanさん:get current branch name
- aerealさん:内容が空のファイルをインデックスに追加する
- KitaitiMakotoさん:ファイルの変更を監視するプログラムと仲良くする
- kyannyさん:Git における SSH オプション指定方法あれこれ
- tyabeさん:Tig の表示方法あれこれ
- T_Hashさん:怠惰にgitを使うためのシェル活用術、またはgst一族
- Cside_さん:ブランチ名 + 作業状態 + stash数 をzshのプロンプトに表示
- hyshhrykさん:vim-fugitiveがやっぱり便利
- ppworksさん:反則技 git push -f
- pecculさん:gitで便利なエイリアス達
- takc923さん:EmacsのGitクライアント:Magit
- y_uuki_さん:Gitのリビジョン番号(SHA-1のアレ)の正体をソースコードを読んで調べてみた
- fukajunさん:変更を一時的に退避!キメろgit stash
- potix2さん:綺麗なpull requestを送るための3つのポイント
- Spring_MTさん:git最強のオプション filter-branch
- uasiさん:もっと怠惰に Git を使うシェルの設定でもっとラクをする、あるいは賢い st の話。そしておまけ。
- usamik26さん:git bisect で問題箇所を特定する
- rosylillyさん:複数人での Git 開発に便利な 3 つのコマンド
- yuichielectricさん:gitslaveで複数のリポジトリを管理する
#Emacs Advent Calendar 2012
- yaottiさん:文字列に同じ処理を繰り返し実行したい時に便利なキーボードマクロ
- awakiaさん:Emacsで1行の文字数が指定値をオーバーしていたらハイライトする
- kbkbkbkb1さん:Emacs で自動的にキーバインドをポップアップする guide-key
- takc923さん:Emacsの設定を便利に変えられるcustomize-groupの紹介
- ongaeshiさん:Emacsでリファクタリングに超絶便利なmark-multiple (複数行同時編集)
- takaxpさん:「タスク」から「予定」を分離してカレンダー表示,Org-mode仕立てで
- syohexさん:おすすめの helm拡張
#Ruby on Rails Advent Calendar 2012 / Sep.
- y_uuki_さん:パフォーマンス監視サービスのNew Relicが超便利な件
- yaottiさん:rails-shを使って高速railsサブコマンド & rakeタスク実行
- rosylillyさん:Rails Plugin ことはじめ
- kitaindiaさん:Rails 3.2 Application Templatesを使って、速攻で良い感じのRailsのひな形を作る
- shu_0115さん:Rails開発で有用な便利Gem一覧
- toyoshiさん:Rails.vimでPartialを一瞬で作る方法
- tkawaさん:Arel でサブクエリ
- tachibaさん:RailsのApplication templateを使って開発の初速をあげよう!
- labochoさん:rack_after_reply でレスポンス後に処理を行う
- nysalorさん:kaminari徹底入門
- labochoさん:Rails で捕捉されない例外が発生したらメールを送る
- toyoshiさん:ActiveSupportで時間や日付を簡単に表現する
- toyoshiさん:Railsで大量のレコードに対してeachしたい時のfind_each
- kuboonさん:resources を nest するときは shallow を使うと幸せになれる
- shu_0115さん:Rails3.2.8 + Resque + Heroku(Redis To Go)
#Git Advent Calendar 2012
- yaottiさん:git checkoutでよくやる操作
- Takehiro-Adachiさん:github for macのここが便利
- awakiaさん:Git/Githubで、プロダクションと最新のmasterとの差分を表示する - Wantedlyのデプロイプロセスより
- ka_さん:Heroku にある Git リポジトリを楽に remote に設定する
- yaottiさん:git add -p / git checkout -pをよく使う人のための設定
- usamik26さん:git push の反対は git pull ではない
#Git Advent Calendar 2012 / Jun.
- yaottiさん:GitHubユーザーのためのhubコマンド
- ongaeshiさん:Git習得のためのGithub入門
- ayakixさん:Gitブランチ関連コマンド
- skojiさん:Gitのリビジョン指定書式
- puriketu99さん:herokuにgitでリリースするまでを割と丁寧に解説する
- sotarokさん:Git submodule の基礎
- sugyanさん:get current branch name
- aerealさん:内容が空のファイルをインデックスに追加する
- KitaitiMakotoさん:ファイルの変更を監視するプログラムと仲良くする
- kyannyさん:Git における SSH オプション指定方法あれこれ
- tyabeさん:Tig の表示方法あれこれ
- T_Hashさん:怠惰にgitを使うためのシェル活用術、またはgst一族
- Cside_さん:ブランチ名 + 作業状態 + stash数 をzshのプロンプトに表示
- hyshhrykさん:vim-fugitiveがやっぱり便利
- ppworksさん:反則技 git push -f
- pecculさん:gitで便利なエイリアス達
- takc923さん:EmacsのGitクライアント:Magit
- y_uuki_さん:Gitのリビジョン番号(SHA-1のアレ)の正体をソースコードを読んで調べてみた
- fukajunさん:変更を一時的に退避!キメろgit stash
- potix2さん:綺麗なpull requestを送るための3つのポイント
- Spring_MTさん:git最強のオプション filter-branch
- uasiさん:もっと怠惰に Git を使うシェルの設定でもっとラクをする、あるいは賢い st の話。そしておまけ。
- usamik26さん:git bisect で問題箇所を特定する
- rosylillyさん:複数人での Git 開発に便利な 3 つのコマンド
- yuichielectricさん:gitslaveで複数のリポジトリを管理する
#Ruby開発環境 Advent Calendar 2012 / Jul.
- yaottiさん:pryを使った快適なRubyライブラリのコードリーディング&開発方法
- puriketu99さん:RubyのTDDのベストプラクティス
- okitanさん:テストの自動実行あれこれ
- Daic_hさん:クラスメソッド定義のイディオム
- y_uuki_さん:Vimで快適なRailsライフを
- ongaeshiさん:pに一工夫加えて見やすくする
- sora_hさん:OS X で rbenv を使って ruby 1.9.3 の環境を作る
- joker1007さん:RubyとvimでQuick JUnit風にテスト実行
- aerealさん:Macを買って3秒で即開発
- rosylillyさん:Ruby で作る、簡単 CLI ツールのススメ
- tamootさん:Windows環境でRuby1.9.3+RsenseをWindowsサービスに >> 失敗orz
- toyoshiさん:Railsで無理なくVimに入門する方法
- kenchanさん:tappでプリントデバッグを便利に行う
- akisute3さん:Emacs における快適な Ruby 開発環境を求めて
- fakestarbabyさん:TextMate2さん、さようなら、SublimeText2さん、こんにちは!
- d6rkaizさん:pow + rbenvで手軽なRack環境構築
- naoty_kさん:tmuxinatorで一瞬で開発環境を起動する
- nysalorさん:Back to the…
#Backbone.js Advent Calendar 2011
- yaottiさん:動的に作られる要素にイベントをbindする
- taka84u9さん:ビューが画面に現れたら処理を実行する
- hamheiさん:『Backbone.jsの1番良いリファレンスを頼む』へのAwesomeな回答を翻訳してみた
- yaottiさん:underscore.js入門
- taka84u9さん:RailsアプリでBackbone.jsを使う
- yaottiさん:Backbone.jsでモデルとビューを分離しやすくするためにadd/resetイベントを活用
- taka84u9さん:コールバック関数内のthisを束縛する
- yaottiさん:JSDeferredでBackbone.jsのモデル更新を快適に
- taka84u9さん:Modelの一対多を実装する
- yaottiさん:Backbone.jsでのサーバーサイドデータ→クライアントサイドデータ変換
- taka84u9さん:Backbone.js入門 「Events」
- taka84u9さん:Backbone.js入門 「MVC」
- taka84u9さん:Backbone.js入門 「View」
- taka84u9さん:Backbone.js入門 「Model」
- taka84u9さん:Backbone.js入門 「View と Model の連携」
- taka84u9さん:Backbone.js入門 「Collection」
- taka84u9さん:Backbone.js入門 「View と Model と Collection の連携」
- taka84u9さん:Backbone.js入門 「Router と History」
- yaottiさん:複雑なHTMLを動的にロードするとき,JSテンプレートを利用するとよい
- hamheiさん:Backbone.jsのコードがスマフォで読める『CodeLibrary』をリリースしました^^
- yaottiさん:Backbone.jsでRailsのCSFR防止tokenをうまく扱う
- yaottiさん:自分で定義したBackbone.jsのクラスを拡張する
- yaottiさん:TwitterやQiitaのような自動更新タイムラインをBackbone.jsで作成
- kony_tさん:backbone-localstorage.jsを使うとかなり簡単にデータの保存ができる
- yaottiさん:RailsでBackbone.jsを使うときに使えるライブラリや資料など
#iOS Advent Calendar 2012 / Aug.
- puriketu99さん:html+css+javascriptでネイティブのiPhoneアプリをつくるPhoneGapの導入方法
- moriturusさん:便利なマクロ・カテゴリ・ライブラリまとめ
- happy_ryoさん:AppCodeについて色々
- yuch_iさん:iOSアプリ開発を捗らせるツールのまとめ
- KatagiriSoさん:クラスメソッド内でselfを使う
- kouchi67さん:Objective-Cでmultipart/form-data
- uasiさん:Xcode のスキームでビルド設定を切り替える
- ninjinkunさん:NSBlockOperationで手軽にキャンセル処理
- aguuuさん:NSUserDefaultsを使うときはWrapして使うと便利
- shu223さん:iOSアプリ開発に役立つTips100連発!
- miyakejさん:iOSで吹き出しを描こう
- feb19さん:iOS と Mac OS X 間を Bonjour で通信してちょっと楽しげなこと
- laisoさん:Clutch A/B TestingによるiOSアプリ向けA/Bテストソリューションのご提案
- yaakaitoさん:iOSライブラリの開発とテストと公開
- Keita_Shiyaさん:15分でCocosBuilderをさくっと試してみるまとめ
- mollifierさん:ON/OFF 切り替えスイッチを簡単に実装する
- dealforestさん:iOSでAPIのテストを気軽にかこう!
- corosuke_kさん:Blocksを使ったHTTP通信ライブラリを書いてみる
- inamiyさん:Core Animation 中級編
- yaakaitoさん:CoreDataのテストをシンプルに書こう
- yaakaitoさん:CocoaPodsで楽々ライブラリ管理
- yaakaitoさん:KiwiでiOSでもBDDしよう!
- yaakaitoさん:safariでもiOSアプリケーションを作ろう!
- laisoさん:最速podspec自炊研究会
- masarusanjpさん:sparrowライクなセルをスワイプすると出てくるメニュー