移転しました

今後はメモも含めKazuho's Weblogに書いて行こうと思います。

OSSの開発モデルを、そのまま社内に持ち込むのは止めたほうがいい(もしくはコードレビューの話)

以前以下のようにツイートした話だけど、OSSの開発モデルを社内開発にそのまま持ち込むのは危険。 チーム開発の場合、簡単にコメント返せないようなPR送られた時点で負けだと思ってる。無駄なコードが生産されないよう事前に設計を詰める作業をすべき / “雑…

MacBookのCPUクロックを表示する方法(Intel Power Gadget)

Intel Power Gadgetをインストールすると、手元のMacのCPUクロックやGPUクロックを表示することができる。以下は同ツールをMacBook Pro(Early 2013; 2.4GHz Core i7)で実行している画面だが、負荷をかけた際に定格の2.4GHzを上回る3.2GHzで動作していること…

WebSocketsでの送信処理に関する注意点(CLOSINGステートとcloseイベントに関する疑問)

WebSocketsの接続状態には、CONNECTING / OPEN / CLOSING / CLOSEDのステートが定められている。一方、CLOSING状態への遷移に対応するイベントは存在せず、CLOSE状態へ遷移した際にcloseイベントが発生するとされている。つまり、「closeイベントが来るまで…

DRY(don't repeat yourself)するかしないか、その判断基準について

「過剰なDRYが技術的負債を生む」みたいな内容の記事を書きたいが、うまく言語化できない。「過剰な食事制限が健康を損なう」程度の内容に成り下がりそうだけど、そんなんじゃないんだよ… @methane 実装におけるDRYみたいなものを考えていて、そうすると前者…

クローズドソースなnode.jsライブラリの依存関係をdedupeする話

node.jsで開発してると、社内で作ってるライブラリの依存関係がごちゃごちゃしてくることがありますよね。 app --+--> libA ----> libB | +--> libBみたいな。こういうときlibBがnpmに登録されたモジュールであればnpm dedupeコマンド一発でlibBをひとまとめ…

トピックブランチ内の変更を無視してgit bisectする方法

merge commitについては1st parentのみをたどりながらgit bisectしたいことってありますよね? (参照: テストファーストなGitワークフローについて - kazuhoのメモ置き場)そういうとき、1st parent以外に属するcommitをgit bisect skipするの、どうやったら…

テストファーストなGitワークフローについて

Gitのワークフローに関する話題が、また盛り上がっているようなので、僕が好んで使っているワークフローについて書きます。対象としているソフトウェアは、GitHubやGitHub Enterprise等を使って開発されている、リリースブランチを切らずにmasterにリリース…

npm (node package manager)の菱形依存問題とdedupeと社内モジュールとJSX

npmで色々コードを書いていると、以下のような依存関係ができてしまうことがある*1。 a +-- b <-- depends on c@1.0.x | `-- c@1.0.3 `-- d <-- depends on c@~1.0.9 `-- c@1.0.10このように「bが依存するc」と「dが依存するc」が異なるものになってしまうと…

WebSocket(RFC 6455)上で使用するプロトコル設計についての備忘録

一般論として、全二重の通信プロトコルを実装するにあたっては、いくつか注意すべき点があって、具体的には、到達確認と切断シーケンスについて定めておかないと、送達されたはずのメッセージがロストしていたり、切断タイミングによってエラーが発生*1した…

自社サービスからエコシステムへ進化する話 (Re: UI変更批判バトルと複数のバージョンのウェブサービスを同時に配信することについて - hitode909の日記)

ウェブサービス,UI変えると,改悪とか,元に戻してとか,そういう意見が出る. サービス提供する側の立場では,新しいUIのほうが使いやすかったり,機能が増えたり,収益が増えたりするので,新しい方を多くの人に提供することに価値がある.使いやすいかと…

「今日使われているプログラミング言語の多くは、なぜ1990年前後に誕生したものなのか」に関する一考察

若い人たちは、「文字列型」があるプログラミング言語しか知らないかもしれない。だが、汎用的な文字列型が一般的になったのは、プログラミング言語の歴史の中でも比較的最近のことである。たとえば、1972年に誕生したC言語には文字列型がない。1980年代に良…

GCとかロケット科学すぎてウェブサービス屋さんには似合わない

※タイトルは釣りです。先のエントリで、 採るべき技術的アプローチに関しては、ソフトウェアの修正コストによってかわるという議論があって、ウェブサービスの場合にはソフトウェア製品(やSI)と比べて圧倒的に修正コストが安い。ウェブサービスの場合にロケ…

ソフトウェアのアップデートとウェブサービス運用における継続性リスクについて

Webサービスのようなプロダクトについての議論について教えて下さい - Kentaro Kuribayashi's blog で呼ばれたような気がしてたけど放置してた。でも今日、express という node.js 上で動作するメジャーなウェブアプリケーションフレームワークを作っている…

JSXコンパイラのオプション詳説(もしくは --executable の機能)

※この記事はJSX Advent Calendar 2013の一部です。アドベントカレンダーの目的は、関連情報を増やすこと。だったら公式ドキュメントを増やせばいいじゃん!!!!! もしかしてオレ天才ちゃう?ということで今日はCompiler Reference - Documents - JSXを書…

Test::Mocha::PhantomJSを書いた

Test::Mocha::PhantomJSというPerlモジュールをリリースしました。一言でいうと、Perlで書いたサーバサイドロジックを、PhantomJS上で動くMochaのテストコードで検証するためのモジュールです。具体的な手順としては、 t/ 以下に次のようなテストコードを書…

JSXでプログラムを書く上で参考になるドキュメント

※この記事はJSX Advent Calendar 2013の一部です。JSXでプログラムを書く上で参考になるドキュメントといえば、なんといっても公式ドキュメントです。量は少ないですが、チュートリアルや型に関するリファレンスはhttp://jsx.github.io/doc.htmlにあります。…

コンストラクタから他のコンストラクタを呼び出す方法

JSX

※この記事はJSX Advent Calendar 2013の一部です。JSXでは「this(...)」と書くことで、あるコンストラクタから別のコンストラクタを呼び出すことができます。下の例はJSXのコンパイラからの抜粋。 class NodePlatform extends Platform { function construct…

JavaScriptバインディングの書き方

JSX

※この記事はJSX Advent Calendar 2013の一部です。JSXでは、JavaScriptで定義されているオブジェクトをJSXのクラスとして簡単に取り込めるようになっています。やりかたは簡単。「native」属性を付与してクラス定義を書くだけです。たとえばJavaScriptの組み…

オレオレ認証局の適切な運用とName Constraints

オレオレ認証局が忌避されるべきものとされてきた理由は、X.509 PKIが保証する安全性は、最も信頼性が低い認証局(trusted root)のそれに等しいからです。しかし、X.509 v3以降ではName Constraintsが導入され、「特定のドメインに対してのみ証明書を発行可…

個人サーバのファイアウォールを活かしつつ、どこからでもログインする方法 (CGI編)

以前、 いつでもどこからでもサーバにログインしたくなるときってありますよね。かといって、サーバの sshd への接続を全世界から可能にしておくというのは、たとえパスワード認証を無効化していても避けたいところ。 Dynamic DNS を使って SSH アクセスを制…

パスワードをソルトつきハッシュ化してDBに保存するのがベストプラクティス…とは限らないという話

フレームワークの責務とセキュリティ - MugeSoの日記についての感想文です。世の中にはたくさんの通信プロトコルが存在し、中には、特定の条件でパスワードを含む文字列をハッシュ化した値を検証しなければならないものも含まれています。例えば、HTTP Diges…

Inline JSONPの長所について (続: サーバサイドからクライアントサイドのJavaScriptを呼び出す際のベストプラクティス)

サーバサイドからクライアントサイドのJavaScriptを呼び出す際のベストプラクティス - kazuhoのメモ置き場 の件、id:tokuhirom がさくっと HTML::CallJS というモジュールを書いて公開してくれた (Shipped HTML::CallJS - tokuhirom's blog 参照) ので、どう…

サーバサイドからクライアントサイドのJavaScriptを呼び出す際のベストプラクティス

JavaScript文字列のエスケープ – yohgaki's blog に対して、 最近だと id="hoge" data-foo="" しておいて $("#hoge").data('foo') でとりだすのが主流かと思います。 はてなブックマーク - JavaScript文字列のエスケープ – yohgaki's blog のように、 そもそ…

ディレクトリの変更を監視して、任意のコマンドを再起動する話

plackup -R とか grunt-contrib-watch とか、ウェブアプリケーションの処理系とかビルドツールには、割とこの手のものが組み込まれているんだけど、Windows を無視できるなら、*1外部ツールを使えばいいわけで。具体的には App-watcher-0.11 - watch the fil…

mmapのほうがreadより速いという迷信について

@ITに以下のような記事が出て、 今回からしばらくの間は、まったく逆の例、つまり使うとプログラムの処理性能が上がるというシステムコールを紹介していく。システムコールを呼ぶ回数は少ない方が処理性能は高くなるという原則は変わらないが、呼び出してお…

30秒でわかるオープンソースライセンスまとめ

「よくわかるFOSSライセンスまとめなんてないよねー」と煽られたので3分で書く。オープンソースライセンスは、以下の3種類に大別される。 代表的なライセンス 改変部分のソースコードの開示が必要 リンクして使う、他のソフトウェアのソースコード開示が必…

MySQL用にランキング専用ストレージエンジンを作る話

前提: ゲームに限らずランキング機能が必要になるケースは多い つまり需要はある だが、MySQLで高速なランキング表示は難しい 具体的に言うと、以下の要件を満たすのが不可能 1行の更新コストが要素数Nに対して O(log N) 以下 任意のランキング位置周辺のSE…

同時にwrite(2)すると混ざるかどうか

Linux のシステムコールである write(2) の ドキュメントを読むと Atomic/non-atomic: A write is atomic if the whole amount written in one operation is not interleaved with data from any other process. This is useful when there are multiple wri…

JavaScriptのTyped Arrayのコピー

JavaScriptのTyped Arrayにおいて、JavaのSystem.arraycopy相当の関数は以下のような形で実装することができる。 function arraycopy(src, srcPos, dest, destPos, length) { dest.set(src.subarray(srcPos, length), destPos); }