タグ

ブックマーク / kazuhooku.hatenadiary.org (27)

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

    若い人たちは、「文字列型」があるプログラミング言語しか知らないかもしれない。だが、汎用的な文字列型が一般的になったのは、プログラミング言語の歴史の中でも比較的最近のことである。 たとえば、1972年に誕生したC言語には文字列型がない。1980年代に良く使われていたPascalの文字列型は最大255文字しか格納できなかった。 なぜか? それはメモリが貴重なリソースだったから。 1980年代のPCの搭載メモリは多くて数メガバイト。これに対し、長編小説の長さは1MB程度に達する*1。 当時、メモリはとても貴重な資源であり、テキストを処理するプログラムを開発するにあたっては、文字列をどのようにメモリ内に展開するかプログラマが細かくコーディングする必要があった。 だから、汎用的な「文字列型」というのは「夢」にすぎなかった。CあるいはPascalにおける文字列(CのASCIIZ文字列あるいはPasca

    「今日使われているプログラミング言語の多くは、なぜ1990年前後に誕生したものなのか」に関する一考察 - kazuhoのメモ置き場
    riywo
    riywo 2013/12/21
  • ソフトウェアのアップデートとウェブサービス運用における継続性リスクについて - kazuhoのメモ置き場

    Webサービスのようなプロダクトについての議論について教えて下さい - Kentaro Kuribayashi's blog で呼ばれたような気がしてたけど放置してた。でも今日、express という node.js 上で動作するメジャーなウェブアプリケーションフレームワークを作っているチームが、次世代の製品に取り組み始めたと聞いたので、メモを以下に貼ります。 ------------------------------ ✂ ------------------------------ ソフトウェア技術の配布手法のトレンドは以下のように推移してきた。 プロプライエタリ(仕様も実装もベンダー固有) オープンシステム(仕様は共通、実装はベンダー固有) オープンソース(実装を皆で共有) ハードウェアにしても、プロプライエタリから業界標準主導なアプローチにかわってきている。 つまり、時代とともに、

    ソフトウェアのアップデートとウェブサービス運用における継続性リスクについて - kazuhoのメモ置き場
    riywo
    riywo 2013/12/19
  • 個人サーバのファイアウォールを活かしつつ、どこからでもログインする方法 (CGI編) - kazuhoのメモ置き場

    以前、 いつでもどこからでもサーバにログインしたくなるときってありますよね。かといって、サーバの sshd への接続を全世界から可能にしておくというのは、たとえパスワード認証を無効化していても避けたいところ。 Dynamic DNS を使って SSH アクセスを制限する方法 - kazuhoのメモ置き場 ということでDynamic DNSを使う方法でやってきてたんだけど、いろいろ不便があったので、HTTPベースに変えた。具体的に言うと、 #! /usr/bin/perl use strict; use warnings; my $TARGET_FILE = '/etc/hosts.allow.d/www/update_addr_cgi'; print "Content-Type: text/plain\r\n\r\n"; my $remote_addr = $ENV{REMOTE_ADDR

    個人サーバのファイアウォールを活かしつつ、どこからでもログインする方法 (CGI編) - kazuhoのメモ置き場
    riywo
    riywo 2013/11/28
    なるほど。。。
  • オレオレ認証局の適切な運用とName Constraints - kazuhoのメモ置き場

    オレオレ認証局が忌避されるべきものとされてきた理由は、X.509 PKIが保証する安全性は、最も信頼性が低い認証局(trusted root)のそれに等しいからです。 しかし、X.509 v3以降ではName Constraintsが導入され、「特定のドメインに対してのみ証明書を発行可能な認証局」を定義できるようになっており、同constraintをcritical key usage extension*1として宣言したルート証明書を安全な経路で配布、インストールすることができれば、上記のようなX.509 PKIの系全体に対する影響は発生しないことになります*2。 ここで問題になるのは、どの程度のウェブブラウザがName Constraintsに対応しているのか、という点になりますがhttps://news.ycombinator.com/item?id=5194103によると、Chro

    オレオレ認証局の適切な運用とName Constraints - kazuhoのメモ置き場
    riywo
    riywo 2013/11/26
  • サーバサイドからクライアントサイドのJavaScriptを呼び出す際のベストプラクティス - kazuhoのメモ置き場

    JavaScript文字列のエスケープ – yohgaki's blog に対して、 最近だと id="hoge" data-foo="<% bar %>" しておいて $("#hoge").data('foo') でとりだすのが主流かと思います。 はてなブックマーク - JavaScript文字列のエスケープ – yohgaki's blog のように、 そもそもJavaScriptコードを動的生成すべきでない JavaScriptコードに渡す変数はHTMLノードを経由すべきだ というような反論がついています。 が、はたしてそうでしょうか。 僕には、元の記事の手法も、HTMLノードを経由する手法もあまり好ましくない*1ように思えます。 そもそも、HTML生成時にXSS脆弱性が発生しがちなのは、 タグや静的な文字列と動的に生成される文字列が混在し 埋め込まれる多数の文字列を正しくエスケープ

    サーバサイドからクライアントサイドのJavaScriptを呼び出す際のベストプラクティス - kazuhoのメモ置き場
    riywo
    riywo 2013/11/06
  • mmapのほうがreadより速いという迷信について - kazuhoのメモ置き場

    @ITに以下のような記事が出て、 今回からしばらくの間は、まったく逆の例、つまり使うとプログラムの処理性能が上がるというシステムコールを紹介していく。システムコールを呼ぶ回数は少ない方が処理性能は高くなるという原則は変わらないが、呼び出しておくと処理性能が向上するシステムコールというものが存在するのだ。こうしたシステムコールを使わないでいることは、とてももったいない。 今回紹介するシステムコールは「mmap(2)」だ。ここでは詳しく仕組みを解説しないが、mmap(2)は、プログラムの処理性能に必ず良い影響を与える。 やはりあった? 高速化に効くシステムコール (1/2):知ってトクするシステムコール(3) - @IT それを真に受けたのか、「Go言語でmmapシステムコールを使ったファイル読み込みの高速化検討とC言語のコンパイラの話 - ryochack.blog」のようなブログエントリも

    mmapのほうがreadより速いという迷信について - kazuhoのメモ置き場
    riywo
    riywo 2013/10/11
  • 30秒でわかるオープンソースライセンスまとめ - kazuhoのメモ置き場

    「よくわかるFOSSライセンスまとめなんてないよねー」と煽られたので3分で書く。 オープンソースライセンスは、以下の3種類に大別される。 代表的なライセンス 改変部分のソースコードの開示が必要 リンクして使う、他のソフトウェアのソースコード開示が必要 GPL (コピーレフト型) ○ ○ LGPL /MPL (準コピーレフト型) ○ × BSDL / MITL (非コピーレフト型) × × 自作のソフトウェアをオープンソースで公開する場合、 コピーレフト型にする場合は「GPLv2以上」 準コピーレフト型にする場合は「LGPL兼MPL」 とするのが無難。非コピーレフト型はMITLのほうがBSDLよりも明確だと言われることが多い(そしてどちらを選んでも問題ない)。 ※表の出典は OSS ライセンスの比較および利用動向ならびに係争に関する調査 より詳しく知りたい方へ: ライセンスの解釈については、

    30秒でわかるオープンソースライセンスまとめ - kazuhoのメモ置き場
    riywo
    riywo 2013/10/04
  • MySQL用にランキング専用ストレージエンジンを作る話 - kazuhoのメモ置き場

    前提: ゲームに限らずランキング機能が必要になるケースは多い つまり需要はある だが、MySQLで高速なランキング表示は難しい 具体的に言うと、以下の要件を満たすのが不可能 1行の更新コストが要素数Nに対して O(log N) 以下 任意のランキング位置周辺のSELECTコストが O(log N) 以下 ならば、専用のストレージエンジンを作ればいいのではないか いつやるか? 今でしょ! 以下理由 MySQL 5.5以降?だとストレージエンジンをまたぐトランザクションがまともになってるはず*1 ランキング専用でいいから、テーブル構造とか固定でいい(つまり実装が簡単!) ランキング専用だから、テーブル・ロックで十分(つまり実装が簡単!) 更新すると順位がずれる(つまりテーブルの大部分に影響がある)ので行ロック実装するメリットが小さい*2 ランキング専用でいいから、全データをメモリにもっても問題

    MySQL用にランキング専用ストレージエンジンを作る話 - kazuhoのメモ置き場
    riywo
    riywo 2013/10/01
  • 同時にwrite(2)すると混ざるかどうか - kazuhoのメモ置き場

    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 writers sending data to a single reader. Applications need to know how large a write request can be expected to be performed atomically. This maximum is called {PIPE_BUF}. This volume of

    同時にwrite(2)すると混ざるかどうか - kazuhoのメモ置き場
    riywo
    riywo 2013/10/01
  • Monoceros雑感 - kazuhoのメモ置き場

    Monoceros は @kazeburo さんが開発してる Plack 用ウェブサーバ。prefork型だけど、待機中の接続をイベントドリブンのマネージャで管理することで、同時接続10,000とか行ける(ソケットの受け渡しは SCM_RIGHTS とか使う)。 で、雑感 大好き!!! Starletより遅い問題は、以下のようにすれば解決できると思う listen するソケットに TCP_DEFER_ACCEPT つけて、accept(2) は worker でのみ実行する worker は HTTP レスポンス送信後に read(2) してみて、後続のリクエストが来てない場合にのみ、マネージャプロセスにソケットを返還する (追記) 「返還」ではなく、マネージャプロセスが管理しているソケットのいずれかにデータがきている場合のみ、そのソケットとworkerのソケットを「交換」する、とすれば

    Monoceros雑感 - kazuhoのメモ置き場
    riywo
    riywo 2013/04/25
  • なぜ動的型付けの言語が流行ったのか (Re 静的型付けと動的型付けのどちらが優れているかという話) - kazuhoのメモ置き場

    静的型付けと動的型付けのどっちが優れているか。どのようなプログラムを書いているかによって答えはかわるんじゃないの? たとえば、自社で開発・運用しているウェブサービスなら「問題が出たら修正」すればいいんだし、バグがないことを保証するよりも迅速に開発できるプログラミング言語(つまり動的型付けの言語)がいい。 逆に、客先への納品が発生するソフトウェア製品なら「バグがない形で出荷する(様々な状況・環境下でちゃんと動作する)」ことが重要だから、静的型付けの言語を使うことで品質を高めるというのは合理的な選択*1。 細かな論点はいろいろあるだろうけど、基的には、このようなソフトウェア開発に対するスタンスの違いで決まる話だと思います。 別の言い方をすると、動的型付けの言語は流行ったのは、ウェブには前者のアプローチが適していたからだし、スマホアプリには静的型付けの言語がむいていると言えるのでしょうね。それ

    なぜ動的型付けの言語が流行ったのか (Re 静的型付けと動的型付けのどちらが優れているかという話) - kazuhoのメモ置き場
    riywo
    riywo 2013/03/29
  • gzipされたcore-fileをスパースファイルとして展開する方法 - kazuhoのメモ置き場

    開発者の皆さんは、gzipされたcore-fileを送りつけられた経験をお持ちのことだと思います。ですが、ディスク容量に厳しいSSDやVM上で作業していると、展開すると数10GBにもなるコアファイルを受け取ってもどうしようもありません。 で!も! コアファイルをスパースファイルとして展開すれば解決☆ gunzip - < ../core.12345.gz | cp --sparse=always /proc/self/fd/0 core.12345具体的にいうとこんな感じですね。なんか一仕事終えた感あります。まだ解析してないんですけど。

    gzipされたcore-fileをスパースファイルとして展開する方法 - kazuhoのメモ置き場
    riywo
    riywo 2013/03/29
  • asm.jsの評価(JVM,PNaClとの比較、および、現在の問題と今後の可能性について) - kazuhoのメモ置き場

    asm.jsに関する客観的意見があまりないようなので、ツイートをまとめてメモ。 現時点での機能はC/C++コードの移植に特化している 文字列にもオブジェクトにも配列にもアクセスできない JavaScriptの値で使えるのは数値だけ*1 typedarrayについては、同時に1つだけ*2アクセスできる GCがない オブジェクトにアクセスできないと書いたけど、当然newもできない 自分でmalloc/freeから実装する必要がある 関数ポインタすらない 定義された関数呼び出しは可能 つまりは、フラットなデータメモリ、シンボルベースのコード空間と、数値演算機能のみがある、とても低レベルな仮想マシンということ。ネイティブコードをJavaScriptに変換した場合に高速に動く環境を作ろうとしていることは明らかだし、それ以外の目的では非常に使いにくい。 既存の他のアプローチ(JVM, PNaCl)と比

    asm.jsの評価(JVM,PNaClとの比較、および、現在の問題と今後の可能性について) - kazuhoのメモ置き場
    riywo
    riywo 2013/03/29
  • もふったーのコンシューマシークレット問題について、鍵はプログラム中に安全に埋め込めるはず。だが… - kazuhoのメモ置き場

    超軽量Twitterクライアント「もふったー」コンシューマシークレットキー難読化最後の挑戦 - GIGAZINE もふったーコンシューマシークレットキー難読化最後の挑戦 ・ω・ - Windows 2000 Blog あたりの話について。記憶に頼って書いてるので間違ってたらごめんなさい。 問:鍵を隠すことができるか 答:以下の理由から可能なはず。 HMACのキーは前置型でハッシュ関数のブロックサイズ SHA-1*1はMerkle-Damgaard法で構築される ブロックをまたぐ際のステート値はファイナライズ処理を除けば最終的なハッシュ値と同じ 以上より、鍵のハッシュを演算後の内部ステートをもつ、鍵ごとに特化したHMAC関数(正確に言うと、鍵ごとに特化したハッシュ値同様の安全性をもつ(つまり鍵を回復することのできないステート値)を生成し、鍵のかわりに、そのステート値を埋め込んだ専用HMAC

    もふったーのコンシューマシークレット問題について、鍵はプログラム中に安全に埋め込めるはず。だが… - kazuhoのメモ置き場
    riywo
    riywo 2013/03/29
  • git branch の結果を時間順にソート - kazuhoのメモ置き場

    ランチが大量にあると、git branch の結果を最終更新時間でソートして表示したくなりますよね。以下のワンライナーでできます。 (for i in `git branch | colrm 1 2` ; do echo `git log --date=iso8601 -n 1 --pretty="format:[%ai] %h" $i` $i ; done) | sort -r git branch を最終更新の日付でソートするオプションがほしい Kazuho Oku on Twitter: "git branch を最終更新の日付でソートするオプションがほしい" ってツイートしたら、@likk さんに、 @kazuho https://gist.github.com/Likk/9af89b10fd0008df91ad … ワンライナー書いたのでこれをgitのエイリアスに。 永遠に

    git branch の結果を時間順にソート - kazuhoのメモ置き場
    riywo
    riywo 2013/02/05
  • direnvを使って実行環境(perlとか)の切り替え - kazuhoのメモ置き場

    plenv の話を聞いていて、別解もありそうだなと思ってググったらあった。以下手順 direnv をインストールする .bashrc あるいは .zshrc の末尾に "eval `direnv hook $0`" と書いておく 適当なディレクトリに perl とかをインストールする 実行したいディレクトリに .envrc ってファイルを作って "PATH_add <上のディレクトリ名>" とか書いておく こうすると、cd すると自動的に .envrc の内容がロードアンロードされて、適切なスクリプトが起動されるようになる。 プロダクション環境で使う場合は、上記 2 のかわりに "direnv exec <プログラム>" とか書いておくと、ディレクトリ依存の環境設定をロードしてからプログラムを起動してくれる。

    direnvを使って実行環境(perlとか)の切り替え - kazuhoのメモ置き場
    riywo
    riywo 2013/01/23
    これはありですね
  • なぜ daemontools を使うのか - kazuhoのメモ置き場

    _ djb が自作ツールの更新を放棄してからずいぶんたって、qmail やら djbdns やらはゆっくりと置き替えが進んでいるようだ。が、いまだに使い続けられているものもある。具体的には daemontools。いまだに daemontools を 使うネタが書かれているのを見て絶望した。代替物はほかにもあるのに。 (中略) _ そんなわけで、わしのことを anti djb だと思っている一部の方々が飽きて燃料投下を望んでいるような声をだいぶ前にどっか(どこだか忘れた)で見かけたので、要望に答えて若干 djb を dis り気味に runit と ipsvd を解説してみました。わしゃ別に「いいものを使う」というだけで、djb が嫌いなわけでもなんでもないんだけどね。ちなみに、自分自身では好き嫌い以前に必要性を感じてないので使っておりませぬ(これ書くために何年かぶりにインストールした)。

    なぜ daemontools を使うのか - kazuhoのメモ置き場
    riywo
    riywo 2012/08/28
  • perl & EINTR - kazuhoのメモ置き場

    Restartable system calls On systems that supported it, older versions of Perl used the SA_RESTART flag when installing %SIG handlers. This meant that restartable system calls would continue rather than returning when a signal arrived. In order to deliver deferred signals promptly, Perl 5.7.3 and later do not use SA_RESTART. Consequently, restartable system calls can fail (with $! set to "EINTR") i

    perl & EINTR - kazuhoのメモ置き場
    riywo
    riywo 2012/08/15
    改めて
  • プログラム中に HTML とか埋め込むためのテンプレートエンジン picotemplate を作った件 - kazuhoのメモ置き場

    たとえばドキュメント生成ツールなんかを作ってると、HTML をプログラムの中で生成したい!ってことは良くあると思います。でも、そのためにいちいちテンプレートエンジンを使うのは大げさな場合も多いですよね。たとえば、ちょっとリストを出力するとき。以下のような感じのコードを書いたことがある人は多いと思います。 std::string mylistToHTML(const std::vector<std::string>& list) { std::string r("<ul class=\"mylist\">\n"); for (auto i = list.begin(); i != list.end(); ++i) { r += std::string("<li class=\"mylist-item\">") + escapeHTML(*i) + "</li>\n"; } r += "</u

    プログラム中に HTML とか埋め込むためのテンプレートエンジン picotemplate を作った件 - kazuhoのメモ置き場
    riywo
    riywo 2012/07/26
  • JSXにテンプレート型サポート入れ始めた - kazuhoのメモ置き場

    まだ master にはマージしてないですが kazuho/user-defined-templates ブランチのやつを使うと、 class Adder.<T> { static function f(x : T, y : T) : T { return x + y; } } class Test { static function run() : void { var n = Adder.<number>.f(1, 3); log n; var s = Adder.<string>.f("abc", "def"); log s; } } が、最適化オプション (--optimize inline,fold-const) でコンパイル後に Test.run$ = function () { /** @type {!number} */ var n; /** @type {!string}

    JSXにテンプレート型サポート入れ始めた - kazuhoのメモ置き場
    riywo
    riywo 2012/06/05