タグ

ブックマーク / qiita.com/cubicdaiya (20)

  • gonp〜Goによるdiffのアルゴリズム実装〜 - Qiita

    この記事は、2015年のGo Advent Calendarの25日目の記事です。 Go Advent Calendarのその2とその3ができる前、最終日だけ空いてて滑り込みで登録したのはいいけど、なんかネタないかなーと思いつつ、自分のgithubリポジトリを漁っていたらdiffのアルゴリズムをGoで実装したやつが出てきたので紹介してみます。 gonpはGoによるdiffのアルゴリズム実装です。元々は昔々C++で書いたdtlというdiffライブラリの簡易移植で、diffを取るのに必要な以下の要素を求めることができます。 編集距離(Edit Distance) LCS(Longest Common Subsequence) SES(Shortest Edit Script) diffのアルゴリズムにはさまざまな種類があり、中でもdiffに限らず様々な用途に応用可能な動的計画法が有名です。ただ

    gonp〜Goによるdiffのアルゴリズム実装〜 - Qiita
  • 既存のnginxモジュールを動的モジュール化するための手順 - Qiita

    nginx-1.9.11から動的モジュールの仕組みが導入されたので、自分がメンテしているngx_small_lightやngx_dynamic_upstreamでも動的ローディングに対応してみた。手順は公式のWiki(↓)に綺麗にまとまっており、すんなり対応することができた。 Converting Static Modules to Dynamic Modules 実際に、「Hello, World!」を返すだけの簡単なnginxモジュールを動的モジュール化する手順について紹介してみる。 ngx_http_hello_worldモジュールを動的ロードに対応する ngx_http_hello_worldは単に「Hello, World!」を返すだけのモジュールである。例えば、以下のnginx.confのlocationにアクセスすると「Hello, World!」が返ってくる。

    既存のnginxモジュールを動的モジュール化するための手順 - Qiita
  • nginxのdynamic modules - Qiita

    以前から家のブログ等でもアナウンスされていたnginxのモジュールの動的組み込みの仕組みが先日リリースされた1.9.11で入りました。昨年のnginx.confでも中の人によるDynamic Modules Developmentという発表がありましたが、ほぼこちらに沿う形で導入されています。 追加されたconfigureオプション 以下はnginx-1.9.10と1.9.11でのconfigure --helpの差分です。 --- 1.9.10 2016-02-10 09:47:05.000000000 +0900 +++ 1.9.11 2016-02-10 09:47:18.000000000 +0900 @@ -3,6 +3,7 @@ --prefix=PATH set installation prefix --sbin-path=PATH set nginx binary pa

    nginxのdynamic modules - Qiita
  • TengineでHTTP/2とSPDYを両方サポートする - Qiita

    nginxのHTTP/2サポート開始とSPDYサポート停止 nginxは1.9.5からHTTP/2をサポートするようになりましたが、一方で同時にSPDY/3.1のサポートを打ち切っています。以下はnginx-1.9.5のChangeLogの抜粋です。(nginxの変更履歴はこちら) *) Feature: the ngx_http_v2_module (replaces ngx_http_spdy_module). Thanks to Dropbox and Automattic for sponsoring this work. 1.9.4までは--with-http_spdy_moduleというオプションが用意されていましたが、1.9.5以降ではこのオプションおよびSPDY/3.1の実装自体が削除されてかわりに--with-http_v2_moduleというオプションとHTTP/2の実

    TengineでHTTP/2とSPDYを両方サポートする - Qiita
  • コンテンツキャッシュとVaryヘッダとnginx - Qiita

    Varyヘッダは前段のキャッシュサーバに対して、指定したヘッダの内容ごとにキャッシュを分ける必要があることを伝えるためのものです。例えばサーバがVary: Accept-Encodingをレスポンスヘッダに付加しておくと、キャッシュサーバはAccept-Encodingヘッダの内容に応じたキャッシュを保持します。 こうすることでクライアントのAccept-Encodingヘッダの内容に応じたキャッシュデータをキャッシュサーバは返すことができるというわけです。 nginxにおけるgzip圧縮とVaryヘッダ さて、題です。上記のような事情からかApacheのmod_deflateやh2oなんかはコンテンツのgzip圧縮を有効にすると、自動的にVary: Accept-Encodingをレスポンスヘッダに付加します。一方我らがnginxは設定ファイルにgzip_vary on;と書かないとV

    コンテンツキャッシュとVaryヘッダとnginx - Qiita
  • 新しい圧縮アルゴリズムBrotliをnginxで試す - Qiita

    BrotliはGoogleが最近公開した新しい圧縮アルゴリズムとその実装です。zopfliと違って従来のよく利用されているdeflateアルゴリズムと互換性はありませんが、deflateアルゴリズムと同じくくらい高速でなおかつ圧縮率がさらに向上しているのが特徴です。 今回はこのBrotliによるコンテンツ圧縮をnginxで利用する方法について紹介します。 ngx_brotli ngx_brotliはngx_http_gzip_moduleおよびngx_http_gzip_static_moduleのbrotli版に相当するnginxモジュールです。以下のようにnginxでgzip圧縮をしたことがある人ならなんとなくどう使うかわかるディレクティブがあります。(ディレクティブはほかにもいろいろとあります。詳しくはngx_brotliのREADME.mdを参照して下さい) ディレクティブ名 値

    新しい圧縮アルゴリズムBrotliをnginxで試す - Qiita
  • nginxでApacheのMaxRequestsPerChild相当の機能を実現する - Qiita

    ついカッとなって書いた。 タイトルにもある通り、ngx_bumpylifeはnginxでApache HTTP ServerのMaxRequestsPerChildに相当する挙動を実現するための拡張モジュールです。 さらに言うとap-mod_bumpy_lifeがやってるようなMaxRequestsPerChildの値を一定範囲内でランダムにする機能も合わせて提供します。bumpylifeという名前はこちらのモジュールから来ています。 使い方と動作解説 こんな感じで設定します。 ngx_bumpylifeは以下の3つのディレクティブを提供します。 bumpylife -> ngx_bumpylifeを有効/無効にする bumpylife_min -> nginxの各ワーカプロセスが終了するまでに処理するリクエスト数の下限値 bumpylife_max -> nginxの各ワーカプロセスが終

    nginxでApacheのMaxRequestsPerChild相当の機能を実現する - Qiita
  • nginScriptで遊んでみた - Qiita

    nginxJavaScriptで拡張できるnginScriptがローンチされたので軽く触ってみた。 nginScriptをビルド nginScriptは今のところnginx家のMercurialリポジトリからcloneすることができる。また、nginxモジュールの実装とnginScriptの実装が一緒に含まれているため、まずはnginScriptをビルドする。

    nginScriptで遊んでみた - Qiita
  • Test::Nginxでnginxモジュールのテストを自動化する - Qiita

    use lib 'lib'; use Test::Nginx::Socket; #repeat_each(2); plan tests => repeat_each() * 2 * blocks(); run_tests(); __DATA__ === TEST 1: list --- http_config upstream backends { zone zone_for_backends 128k; server 127.0.0.1:6001; server 127.0.0.1:6002; server 127.0.0.1:6003; } --- config location /dynamic { dynamic_upstream; } --- request GET /dynamic?upstream=zone_for_backends --- response_body 127

    Test::Nginxでnginxモジュールのテストを自動化する - Qiita
    clavier
    clavier 2015/05/22
    Test::Nginxでnginxモジュールのテストを自動化する - Qiita
  • ngx_dynamic_upstreamでnginxのアップストリームを動的に変更する - Qiita

    nginxのアップストリームを変更する 通常nginxでアップストリームの変更をするにはnginx.confを変更した後、nginxをreloadないしはrestartしなければなりません。例えば以下のようにアップストリームが定義されている場合、

    ngx_dynamic_upstreamでnginxのアップストリームを動的に変更する - Qiita
  • nginxのパラメータチューニングとh2o - Qiita

    (追記:タイトルが少々煽り気味な気がしたので微妙に変更しました。) h2oとnginxの性能比較 nginxよりも速いとされるh2oですが、実際に自分でもローカルでベンチマークを取ってみました。環境は以下の通りです。 EC2のc4.8xlargeインスタンス gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16) Linux ip-172-31-13-40 3.14.35-28.38.amzn1.x86_64 #1 SMP Wed Mar 11 22:50:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux nginx-1.8.0 h2o-1.2.1-alpha1 wrk(ベンチマーク) ベンチマークコマンド 実行するベンチマークコマンドは以下になります。なお、オプションはできるだけRequest/secが大きくなるように調

    nginxのパラメータチューニングとh2o - Qiita
  • nginxのリクエストボディのバッファリングに関する問題とその改善策 - Qiita

    nginxのデフォルトの動作ではクライアントから受け取ったリクエストボディをメモリにバッファリングするようになっています。 このメモリバッファのサイズはclient_body_buffer_sizeで変更することができ、リクエストボディのサイズがこのバッファのサイズを越えた場合はclient_body_temp_pathにファイルとして書き出されます。 ログレベルがwarn以上の場合はエラーログにa client request body is buffered ...という警告が出ます。 2015/03/29 14:02:20 [warn] 6965#0: *1 a client request body is buffered to a temporary file /etc/nginx/client_body_temp/0000000001, client: x.x.x.x, ser

    nginxのリクエストボディのバッファリングに関する問題とその改善策 - Qiita
  • nginxソースコードリーディング その4〜コアAPI(メモリプール)〜 - Qiita

    CのようにGCを持たない言語ではヒープから確保したメモリの開放はプログラマの責任で行う必要がある。しかし、実際にCやC++でプログラミングしたことがあるならわかるように確保したメモリを適切なタイミングで解放するのはとても難しいとまでは言わないまでもあまり簡単なことではない。 単にfreeを呼び出すのを忘れたり、もしくはリストやツリーのような少しでも複雑なデータ構造を扱う際に割り当てられたメモリを適切に解放できずにリークしてしまうようなことは普通に起こりうる。 モダンなOSではプログラム終了後にそのプログラムに割り当てられたメモリをOS側で解放してくれるので、走らせてすぐ終了するようなプログラムではこのようなメモリリークは特に問題にならないこともあるが、nginxのように常時動き続けるようなソフトウェアでのメモリリークは致命的な問題を引き起こす。 Cプログラムでこの問題に対処するためのアプロ

    nginxソースコードリーディング その4〜コアAPI(メモリプール)〜 - Qiita
  • nginxソースコードリーディング その1〜nginx起動〜 - Qiita

    $ global -x main main 202 src/core/nginx.c main(int argc, char *const *argv) $ int ngx_cdecl main(int argc, char *const *argv) { ・ ・ ngx_debug_init(); ・ ・ ngx_time_init(); ・ ・ #if (NGX_PCRE) ngx_regex_init(); #endif ・ ・ log = ngx_log_init(ngx_prefix); ・ ・ if (ngx_init_signals(cycle->log) != NGX_OK) { return 1; } ・ ・

    nginxソースコードリーディング その1〜nginx起動〜 - Qiita
  • cachectldでOSのページキャッシュ削除を自動化 - Qiita

    サーバを運用していると時々全然メモリが余っているはずなのにスワップが起きてしまうことがあります。この場合よくあるケースは非常に大きなログファイルがあってそのログファイルのために大量のページキャッシュが利用されていることです。 ログファイルなんて滅多に読まないので、そんなのにメモリ使うぐらいだったらもっと別のアプリケーションにちゃんと割り当ててくれよと思うのですが、なかなかうまくいかないものです。 そこで効果的なのがposix_fadivseをラップして指定したファイルのページキャッシュを解放するツールです。 ページキャッシュがどんどん増えている…そんな時に役立つワンライナー ファイル指定で、ページキャッシュにのっているか確認したり追い出したり 私の場合、今まではnocacheというツールをちょこっと改造して使っていましたが、最近もうちょっと便利な風に改造したいと思うようになってきました。例

    cachectldでOSのページキャッシュ削除を自動化 - Qiita
  • ngx_mrubyとngx_lua - Qiita

    今年の秋頃に将来nginxJavaScriptが書けるようになるという話が出ましたが、nginxには元々サードパーティモジュールの中でも有名なngx_luaがあります。また、Advent Calendarを見るにngx_mrubyも盛り上がってきているようです。 そこで両者の比較エントリを書いてみようと思います。 まずngx_mrubyについてはこのカレンダーでさんざん語られてるのでngx_luaについて。 ngx_luaは簡単に言うとngx_mrubyと同じようなこと(あるいはそれ以上のこと)がLuaでできるnginxのサードパーティモジュールです。 例えば「Hello, World!」はこんな感じで書けます。 ngx_luaで利用できるLua処理系 ngx_luaではLua5.1とLua5.1互換のLuaJITが利用できます。逆に言うとLua5.2以上だとビルドできないので注意しまし

    ngx_mrubyとngx_lua - Qiita
  • nginxパフォーマンスチューニング〜静的コンテンツ配信編〜 - Qiita

    今回はHTMLCSSJavascriptといった比較的軽量な静的コンテンツの配信をnginxでやるケースに絞ってチューニングする際のポイントについて紹介しようかと思います。 (注:worker_rlimit_nofileやsysctl.confのネットワーク周りの設定のような定石的なチューニングについてはあえて解説しないのであらかじめご了承ください。) コンテンツをgzip圧縮する 何はともあれgzip圧縮です。ネットワーク帯域に比べればCPUリソースなんて安いものです。 しかし、多くの場合これだけでは十分ではありません。何故ならnginxはデフォルトではContent-Typeがtext/htmlのコンテンツしか圧縮しないためです。圧縮対象のContent-Typeを増やすにはgzip_typesを使います。 単純なWebサイトであれば上記の設定で十分ですが、場合によってはappli

    nginxパフォーマンスチューニング〜静的コンテンツ配信編〜 - Qiita
  • Goサーバのモニタリング - Qiita

    5日目担当の@cubicdaiyaです。先月末のGoConではGoのカンファレンスなのにほぼnginxをビルドする話しかしてなかったので今日はちゃんとGoの話をします。 Goで書くサーバプログラム Goではサーバプログラムを書くためのユーティリティが豊富に揃ってる上に、ゴルーチンやチャネルを利用することで高いパフォーマンスが要求される環境でも十分な性能を発揮することができます。いつだったか「あれはHTTPサーバ書くための言語ですよ」なんて話をとあるエンジニアから聞いたことがあるくらいです。 例えば「Hello, World!」を返すだけのHTTPサーバであれば標準ライブラリのnet/httpを利用することで以下のように書くことが出来ます。 package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter,

    Goサーバのモニタリング - Qiita
  • nginx-buildでnginxをビルドしよう - Qiita

    nginx-buildGoで書かれたnginxをビルドするためのツールです。Goの環境が整っていればgo getでインストールすることができます。 また、Goがインストールされてない環境向けに↓でビルド済みバイナリ(linuxmacの64bit版)を用意しています。 nginx-buildにできること nginx-buildは主にnginxのビルドにまつわる以下のタスクの大部分を自動化します。 nginxのソースコードのダウンロード configureのオプション指定 依存ライブラリ(PCRE、ZLIB、OpenSSL)のダウンロード、組み込み サードパーティーモジュールのダウンロード、組み込み、バージョン管理 筆者は過去にnginxのサードパーティモジュールを開発したり、数十台のnginxサーバを運用していたので、これらのタスクを頻繁に実行していました。しかし、ある時あまりにも面倒に

    nginx-buildでnginxをビルドしよう - Qiita
  • nginxソースコードリーディング その3〜コアAPI(文字列)〜 - Qiita

    Qiitaの中の人も楽しみにしているらしい連載ですが、今回からnginxが持つ内部のAPIについて解説していきます。 このあたりの知識はnginxの内部実装を理解するだけでなく、拡張モジュールを開発するのにも役立つと思います。 前回 nginxソースコードリーディング その2〜イベント駆動エンジン〜 リビジョン 5428:fcecb9c6a057 Cにおけるデータ型とアルゴリズム PythonRubyといったLLとは違い、Cは文字列、リスト、ハッシュテーブル、キューといった非常によく使う基的なデータ構造やアルゴリズムの実装を処理系に含んでいない。 かといってどこでも使える汎用的なライブラリというのもこれまた難しいので、Cで書かれているソフトウェアは各々独自の実装を持っていることが非常によくある。僕自身何度連結リストをCで実装したかわからない。 nginxが持つデータ型 nginxもこ

    nginxソースコードリーディング その3〜コアAPI(文字列)〜 - Qiita
  • 1