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

hakobera's blog

技術メモ。たまに雑談

海外カンファレンスの CFP の書き方 - RubyConf Taiwan 2016 の事例

この記事は Recruit Engineers Advent Calendar 2016 の15日目の記事です。 12月2〜3日に開催された RubyConf Taiwan 2016 にスピーカーとして参加してきました。 この記事ではカンファレンスそのものではなく、その前段階の CFP の書き方について、実際に R…

スタディサプリ on Quipper プラットフォームを支える技術

前置き hakobera.hatenablog.com この記事を公開した当時はまだオープンにできなかったのですが、実はこの記事は2月25日にリリースされたスタディサプリ(受験サプリ)を Quipper のプラットフォームに載せ替えるという移行プロジェクトを前提として内容も含…

Quipper の DevOps のお仕事と技術的課題

技術的課題を書くと、それを解決してくれるエンジニアが採用できるって話は本当ですか?というのは冗談としても、今の技術的課題をブログにまとめて公開するノーガード戦法も良いかと思う。— Kazuyuki Honda (@hakobera) May 25, 2015 このツイートがそれな…

Heroku アプリのログを fluentd で ElasticSearch に突っ込んで Kibana で監視する方法

目的 Kibana で Heroku アプリのログを可視化したい。ただし、レスポンスタイムとかは New Relic でも見れるので、ここではアプリが出力したらログを可視化する方法を紹介する。 また、今回、アプリからの出力を可能な限りに簡単にするために、アプリからは …

thunkify する時に注意すべきたった1つのこと

結論 thunkifyをオブジェクトのメソッドに適用する時は、元のメソッドに代入するか、thisを元のオブジェクトにbindすること。 fs.readFile = thunkify(fs.readFile) // または var readFile = thunkify(fs.readFile.bind(fs)); ただし、fs.readFileはvar rea…

ワンクリックで Chrome のスクリーンショットを Gyazo で共有できる Chrome Extension を作りました

インストール方法 Chrome ウェブストアで公開中です。 Gyazo Shot ソース Github上で開発しています。問題報告やプルリクエストなど大歓迎です。 https://github.com/hakobera/gyazo-shot 開発動機および機能 開発中の画面とかをサクッと共有するのに、Gyazo…

Android の DatePickerDialog で「年月」のみ選択させる方法

こんな Fragment を作れば良いと思う。 import android.app.DatePickerDialog; import android.app.Dialog; import android.content.Context; import android.content.res.Resources; import android.os.Bundle; import android.support.v4.app.DialogFragme…

Github Issues を利用したリリースマネージャのお仕事

最近、Quipper という会社で「リリースマネージャ」という名前のお仕事をしています。開発以外の仕事は久しぶりだったので大変でしたが、最終的にそれなり上手く行った方法を振り返りとしてブログに書いておくことにします。 経緯 自分のチームとは別のチー…

Node.js の Heroku 環境におけるパフォーマンス

Heroku で Node.js を動かしても絶対的なパフォーマンスは得られないのだけれど、最近仕事で Node.js on Heroku をやっているので、実際にどれくらいのパフォーマンスがでるのか測ってみました。 今回調べたのは、主に3点。 2X Dyno (CPUとメモリが2倍のDyn…

YAND (Yet Another Node.js Documentation) のソースを公開しました

1年前にこんなエントリを書きました。 僕の考えた最強の Node.js Document Viewer - hakobera's blog YAND 自体は結構使っていたのですが、色々あって Node.js v0.6.10 で更新を止めていました。 が、さすがに v0.8 用のものが欲しくなってきたので、v0.8.18…

EventEmitter.emit() によくある勘違い

突然ですが、Node.jsで次のプログラムを実行した結果を答えてください。 var EventEmitter = require('events').EventEmitter; var event = new EventEmitter(); console.log('1'); event.on('open', function () { console.log('2'); }); event.emit('open'…

「Node.jsは静的コンテンツには向いていない」のか?

この記事は東京Node学園祭2012 アドベントカレンダーの8日目の記事です。 この記事を書こうと思った理由 Node.jsに関するWeb上の記事を読んでいると、「Node.jsは静的コンテンツに弱い」とだけ書いてある記事をよく見かけます。有名なところだと、LinkedInの…

Tuppari コミュニティ始めました & IE に対応しました

Tuppari コミュニティについて これまで個人で Tuppari を書いていましたが、@seratch が Ruby ライブラリ書いてくれてので、これを機にコミュニティ体制に移行しました。Tuppari の Ruby クライアントを書きました - case class HatenaDiary(id: Symbol = ’…

Tuppari の Java クライアントを作った

Tuppari - WebSocket on Your Cloud - - Scalaとlift のはずだった ・・・前回、Node.js で構築した Tuppari (コンセプトは Pusher クローン)を紹介しましたが、実は API 仕様が公開されていて、Node.js 以外の言語/環境でもクライアントを作ることができ…

Tuppari - WebSocket on Your Cloud -

Tuppari とは 東京Node学園 6時限目で発表した Node.js で作られた Pusher クローンです。 簡単に言うと WebSocket を利用した大規模 Broadcast に特化したサービスです。インフラとしては Amazon Web Services (以降、AWS)上で動かすことに最適化されてい…

簡単にレーダーチャートが描けるライブラリ Raphael-Radar

最近は Google Chart Tools や Highcharts のように綺麗なグラフがかけるライブラリが増えてきましたが、レーダーチャートをサポートしているものがあまりなく、あっても用途にマッチしなかったので jQuery と Raphael を使って、レーダーチャートが描けるラ…

Router-Line はじめました

4/18 に開催された 東京Node学園 5時限目 で @KOBA789 さんが自作のルータである Router-Line を紹介していました。その時から便利そうとは思っていたのですが、最近ちょっとした API サーバを書く時に実際に Router-Line を使ってみて、改めて良いなと思っ…

鹿駆動勉強会に参加してきました

4/29 に奈良の能楽ホール(重要文化財!)で開催された 鹿駆動勉強会 に参加して、LTしてきました。関東以外の勉強会に参加したのは初めてでしたが、懇親会で twitter でしか知らなかった方々と直接お話できたりして、とても楽しかったです。当日の流れや各L…

WebSocket で PNG 画像をバイナリ転送して、JavaScript で展開して表示してみた

Node.js で WebSocket-Node を使って実装しました。 転送するめぼしい画像が見当たらなかったので、デスクトップをスクリーンキャプチャして転送してみました。ブラウザはChrome 17以上か、Firefox 11以上が必要です。サーバ側は scrrencapture コマンドを利…

Node.js vs Play vs SAStruts

前置き Experiences with Node.js: Porting a RESTful Service Written in Java - ZiggyTech上記記事では、実験的にJava (Jersey + Hibernate on Tomcat) で実装された REST API サーバを Node.js で書きなおしてみたら、少ないリソース(CPU/メモリ使用量)…

Play の evolutions を Heroku で使おうとしてハマった

Database-Driven Web Apps with Play! | Heroku Dev Center (we don’t recommend setting jpa.ddl to update for a real world production app. Use Play!’s database evolutions instead.) Heroku の Play のチュートリアル記事に「jpa.ddl=update が許され…

Heroku で package.json で指定した任意のバージョンの Node.js を 動かす方法

2012/8/7 追記Heroku が公式で package.json での Node.js/NPM のバージョン指定に対応したので、現在は以下の方法は必要ありません。普通に package.json の engines に利用したいバージョンを書けばOKです。以下の情報は古いです。本日、開催された Heroku…

nvmw で npm がインストールできない問題を修正しました

hakobera/nvmw · GitHub1週間前に対応したんですが、念のため、こちらでも告知しておきます。 主な変更点は以下の通りです。 npm がインストールできなくなっていた問題を修正 npm の git リポジトリの構成変更に伴いインストール方法を変更 npm をビルドし…

Play Framework で複数データベースに接続する方法

Play Framework 1.2.4 では、標準の機能で複数データベースに接続することができません。 ただし、希望としては上がっていて、実は 1.3 では実装される予定です。#706 Multiple database/JPA support - Play framework 1.0 (now in maintenance mode) - play…

僕の考えた最強の Node.js Document Viewer

自分がNode.js でプログラミングをする際に、必ず参考にするページがあります。それは Node.js の公式ドキュメントです。 Node.js v0.8.12 Manual & Documentationバージョンアップにも追随して、最新の情報が得られるので、書いている人には頭が上がりませ…

uglify-me : UglifyJS のフロントエンドを作った

既にあるような気もするのですが、ちょっとだけ特殊な要件に対応したかったので、uglify-me という JS 圧縮ライブラリである UglifyJS のフロントエンドを Node.js で組んでみました。hakobera/uglify-me · GitHub デモ以下のようなケースにマッチします。 …

tail.io - 標準入力をブラウザで tail -f できる htmlcat のクローンを Node.js + Socket.IO で作った

標準入力をブラウザで tail -f できる htmlcat というのを書いた - NaN days - subtechこの記事をみて便利そうだったのですが、Perl 詳しくなくて動かし方がよくわからなかったので、勉強がてらに Node.js + Socket.IO でクローンを作ってみました。npm モジ…

Node.js 入門者向けチュートリアル テストもあるよ

先月、学生向けの無料講義を開催している TechHUB.jp で Node.js の講義をやりました。そこで利用した講義資料(正確には補足資料)を、最新の Express と mocha でも動くように修正したので、せっかくなのでブログでも周知しておきます。Node.js で作るリア…

さくらのクラウドで Node.js v0.6 を動かすメモ

サーバの作成とSSH公開鍵の登録は済んでいるものとする。 OS は Ubuntu 10.04 LTS 64bit(随時追記予定) 初期設定 ログイン 普通の Ubuntu と違って root ユーザでログインする点に注意 なんとなく気持ち悪いので、一般ユーザを作成。sudo 権限を設定。SSH…

Titanium で ImageView の Cache をアプリ起動時に削除する方法

Titanium 1.8 では ImageView に表示したリモートの画像は自動的に Cache されて、オフラインでも閲覧できて、とても便利なのですが、致命的な欠点があります。 永遠に削除されない キャッシュをクリアするメソッドが提供されていない もしかしたらバグで今…

Node.js と Titanium で SlideShare リモコンを作ってみた

2012/1/11 に開催した 「Node塾 講義その5 Node.js × Titanium」の発表用に SlideConcert というアプリを作って、実際にそれを利用して発表してきました。個人的にLTをする時に便利だなと思うを機能を実装してみました。 スライド発表時は結構歩きまわるたち…

Play framework の writeChunk で UTF-8 以外の文字列を送信するとレスポンスが止まってしまう問題の回避策

2012/7/9 追記 この問題は Playframework 1.2.5 で修正されました。以下は 1.2.4 以下を使う場合にのみ適用して下さい。最近、仕事で Play framework を本格的に使い始めて、結構惚れ込んでおります。 で、既存のアプリをどんどん Play で書きなおしているん…

2012年の目標

みなさま、あけましておめでとうございます。 忘れないうちに、今年の目標を書いておきたいと思います。 Node.js でサービスを作る 個人でも仕事でも良いのですが、仕事として実現できる方向で頑張っていきたいと思います。 Node塾 を一年間継続して開催する…

2011 年の振り返り

今年は自分にとって色々と転換点だったので、2011年を振り返ってみて、やったこと、思ったことなどをメモとして書いておこうと思います。 MacBook Air 今までメインで使っていた Thinkpad X61 の HDD が壊れたために、Apple Store の初売りセールで MacBook …

mocha と Jenkins で Node.js の CI 環境を構築する

最近、mocha をつかってテストを書くのが楽しくなってきました。でも、テストの数が増えてくるとローカルでの実行だけでなく、CI 環境が欲しくなりますよね。github にあげられるようなプロジェクトだったら、Travis CI も良いですが、実際に仕事で使うとな…

東京Node学園3時限目でLTしてきました

12/14 に開催された東京Node学園3時限目で 「Node v0.6 on Heroku」という LT をしてきました。スライドは以下においてあります。Node v0.6 on Heroku内容としては、Buildpack という仕組みを利用して、Node.js v0.6.5 を Heroku でも使えるようにするための…

Node Version Manager for Windows を作ってみた

これは JavaScript Advent Calendar 2011 (Node.js/WebSocketsコース) の1日目の記事です。 nvmw (Node Version Manager for Windows) とは Mac OS や Linux など Unix 系の OS で利用できる nvm (Node Version Manager) の Windows 版とするべく私 @hakobe…

Connect ソースコードリーディング(6) - 組込み middleware 紹介

第6回目は、標準でバンドルされている組込み middleware の一挙に紹介します。API の詳細は公式サイトやソースコードを参照してもらうとして、ここでは概要レベルの詳細にします。昨日紹介した TJ の記事に基づいて、フィルタとプロバイダの2つに分類して…

Connect ソースコードリーディング(5) - 小ネタをちょこちょこ

あまり時間が取れなかったので、第5回は小ネタをちょこちょこと。 HTTPServer の prototype チェーン(継承関係) net.Server |- http.Server |- connect.HTTPServer - [mix-in] -> connect.HTTPSServer なので、net.Server や http.Server のメソッドが普通…

Connect ソースコードリーディング(4) - bodyParser

bodyParser middleware 第4回目は Connect の組込み middleware である bodyParser を読んでいきたいと思います。 Node の http.ServerRequest は Java の HttpServletRequest などよりもかなりローレベルです。特に POST データはそのまま送信されてくるだ…

Connect ソースコードリーディング(3) - middleware の作成方法

前置き 今回は、前回までのソースコードリーディングで得た知識を利用して、実際に Connect の middleware を作成してみます。ソースは以下においてあります。 hakobera/connect-middleware-sample · GitHub 作成するもの GET リクエストにのみ対応した Expr…

Connect ソースコードリーディング(2) - 基本処理フロー

はじめに 今回は、以下の Connect を使ったコードが内部的にどのように初期化され、リクエストの処理がどのように行われていくのかを解説します。 var connect = require('connect'); var server = connect.createServer( connect.logger(), connect.static(…

Connect ソースコードリーディング(1) - ソースコードの依存関係

前置き Node.js で一番よく使われている Webフレームワークといえば、Express です。で、その Express が大きく依存しているのが Connect です。Express を制するにはまずは Connect から、というわけで、Connect のソースコードを読み始めました。 対象とす…

Heroku のローカル開発環境で環境変数を簡単に指定する方法

Heroku で開発していると、APIやセッションの秘密鍵などを環境変数に格納することになります。例えば、以下のようなコードです。 new MemorySession({ key: process.env.SESSION_KEY });Heroku でこれを使うには以下の設定をします。 $ heroku config:add SE…

JavaScript で for/while 文を使わないで1から10までの合計を求める方法

Node.js 初心者に非同期(ネットワーク)、コールバック、ECMAScript5 について理解してもらうのにいいネタはないか考えてみた。その結果、「for 文を使わないで1から10までの合計を求める」プログラムを書いてもらうのはいいんじゃないか、と思ったので、思…

Node.js の Cluster のベンチマークをとってみた

Node.js v0.6 から新規標準モジュールとして導入された Cluster のベンチマークを取ってみました。 測定環境 Server CPU: AMD PhenomII X6 1090T (6コア) MEM: DDR3 16GB (4GB*4) Client MacBook Pro 15 (Early 2011) CPU: Intel Core i7 2.0GHz (4コア) MEM…

Node.js v0.6 で npm がインストール出来なくっている件の暫定対応

本日 Node.js v0.6 が予告より通りリリースされました!ただし、表題の通り、パッケージマネージャである npm が 2011/11/5 21:00 現在、インストールできません。 2011/11/6に npm v1.0.104 でこの問題は修正されました。 fails with node-v0.6.0 · Issue #…

Heroku 上の Express で Basic 認証をかける

テスト環境などで公開したくない場合に、Basic 認証をかけたいことがあると思うが、Exress でそれをやる方法。基本的に Express は Connect ラッパーなので、やり方は Connect と同じ。 Connect - basicAuth 注意したいのは app.use(app.router) の前に書か…

Node.js on Heroku で Redis をキャッシュサーバとして使うためのモジュールを書いた

ソース Heroku 上の Redis をキャッシュとして使うためのモジュール — Gistset, get, remove, clear の4メソッドのみ。set には有効期限 (TTL) が設定できる。それだけしかできない。 書いた理由 memcached が使えなかったから。Heroku には memcached Add-o…

Node の simpledb モジュールで Amazon SimpleDB の接続先を Tokyo Region にする方法

Node の Amazon SimpleDB クライアントに simpledb モジュールがあるが、これのデフォルトの接続先は US East Region だ。これを Tokyo Region に変えるには、インスタンス生成時に host オプションで指定すれば良い。 var SimpleDB = require('simpledb').S…