$yuzu->log();

技術ネタなど。

マルコフ連鎖の実験のためにMeCabをCentOSにインストール

マルコフ連鎖の実験をしたいがために、 京都大学情報学研究科と日本電信電話株式会社コミュニケーション科学基礎研究所が開発しているオープンソース形態素解析エンジン「MeCab」 (和布蕪 めかぶ)をインストールするためのメモです。

本体をインストール

$ cd /tmp
$ wget https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE
$ tar zxfv mecab-X.X.tar.gz
$ cd mecab-X.X
$ ./configure --enable-utf8-only
$ make
$ make check
# make install

辞書ファイルをインストール

$ cd /tmp
$ wget https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM
$ tar zxfv mecab-ipadic-2.7.0-XXXX.tar.gz
$ cd mecab-ipadic-2.7.0-XXXX
$ ./configure --with-charset=utf8
$ make
# make install

試してみる

$ mecab
すもももももももものうち
すもも   名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち  名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

うまくいってるっぽい。 このライブラリを使って今後マルコフ連鎖の実験をしていく。

入門 自然言語処理

入門 自然言語処理

jQueryで$(form).submit()でフォームが送信されない場合の対処法

jQueryで、$(form).submit()などを使っても下記のようなボタンにするとフォームが送信されない場合があります。

<input type="submit" id="submit"  value="post" />
<input type="submit" class="submit"  value="post" />
<input type="submit" name="submit"  value="post" />

submitボタンのid,class,name属性に「submit」という名前を使用すると送信できないので、使わないようにしましょう。

jQueryを使ってフォームの二重送信を防止する方法 複数ボタンの場合編

前回1つのフォームに1つのボタンがあった場合のフォーム2重送信防止方法を記しました。 今回は1つのフォームに複数ボタンが有る場合の2重送信を防止する方法を記します。

<form class="multiBtnForm">
<input class="disableMultiBtn" type="submit" name="post" value="post">
<input class="disableMultiBtn" type="submit" name="back" value="back">
</form>
<script>
    $('.disableMultiBtn').on('click', function(){
        $('<input />').attr('type', 'hidden')
            .attr('name', $(this).attr('name'))
            .attr('value', $(this).val())
            .appendTo('.multiBtnForm');
        $(this).text('please wait...');
        $(this).attr('disabled', true);
        $(this).closest('form').submit();
    });
</script>

フォームを送信する前にsubmitボタンにある要素を使って、hiddenタグを作成。 その後ボタンをdisabledにして、送信しています。

ボタンタグにある情報を付加するとフォームが送信できなくなります。 その注意点はこちら

jQueryを使ってフォームの二重送信を防止する方法

サーバーサイド側で2重送信されないように処理するのが一般的ですが、 jQueryを使ってsubmitボタンをダブルクリックを防止するサンプルを記します。

<input type="submit" class="disableBtn" value="post">
<script>
    $('.disableBtn').on('click', function(){
        $(this).text('please wait...');
        $(this).attr('disabled', true);
        $(this).closest('form').submit();
    });
</script>

クリックするとボタンの表示が「post」から「please wait...」に変わり、ボタンがクリックできなくなっていることがわかります。

通常なら上記の方法で2重送信を防止することができますが、1つのフォームに複数ボタンがあって、name属性で処理を変更している場合、jQueryの仕様上、submitボタンのname属性が拾えず、上記の方法では対応できません。 その場合の対処法はこちら

composer install と composer update の違い

PHPの依存管理ツールにComposerついて。installとupdateの違いについてまとめます。

各ファイルの説明

composer.json

必要となるライブラリを記載します。

composer.lock

composer.jsonを元にインストールした各ライブラリのバージョンが記載されています。

コマンドについての説明

composer update

composer.jsonをもとに各ライブラリを最新版に更新します。
その際、composer.lockが生成されます。
カレントディレクトリにcomposer.lockがあっても、そこに記載されているバージョン関係なしに最新版にします。

composer install

composer.lockを元にライブラリをインストールします。
composer.lockが存在しない場合、composer updateと同じくライブラリを最新版にします。

まとめ

composer.lockをチーム内で共有してcomposer installすればライブラリのバージョンは揃いますね。

パーフェクトPHP (PERFECT SERIES 3)

パーフェクトPHP (PERFECT SERIES 3)

Apacheのmod_expiresというキャッシュモジュールを使ってWEBサイトを高速化しよう

Apacheにはmod_expiresというキャッシュモジュールがあります。 クライアント側で画像やCSSなどファイルをキャッシュさせるモジュールです。 これを利用し、転送量を減少させてWEBサイトの負荷対策します。 キャッシュを利用すると負荷対策ばかりか、表示速度も向上します。

mod_expiresが組み込まれているか確認

通常の方法でApacheをインストールしていた場合、mod_expiresはデフォルトで組み込まれています。 CentOSの場合/etc/httpd/conf/httpd.confに以下の行があることを確認してください。

LoadModule expires_module modules/mod_expires.so

mod_expiresの設定方法

httpd.confの377行目付近に以下を追加してください。

<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/png "access plus 12 hours"
ExpiresByType image/jpeg "access plus 12 hours"
ExpiresByType image/gif "access plus 12 hours"
ExpiresByType text/css "access plus 12 hours"
ExpiresByType text/javascript "access plus 12 hours"
</IfModule>

これはpng,jpg,gif,css,javascriptを12時間という期限でキャッシュさせるという宣言です。 Apacheを再起動されば反映されます。

mod_expiresの設定が反映されているか確認

Chromeのdev toolで画像のレスポンスヘッダを確認してみましょう。

f:id:yuzurus:20150208015804p:plain

max-age=43200なので43200秒、つまり12時間にちゃんと設定されていることが確認できました。

mod_expiresの設定するにあたっての注意

もしjavascriptなどに変更があり、更新した場合、クライアント側にキャッシュが残っており表示が意図しなくなる場合があります。
その場合はhoge-v1.jsなどファイル名でバージョン管理するか、hoge.js?123456などパラメータにタイムスタンプなどを付与すれば解決します。(モダンなWEBアプリケーションフレームワークにはこのような機能が含まれていると思います。)

ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール

ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール

gzip圧縮を使ってWEBサイトを高速化しよう

WEBサイトの高速化にはいろんな手法があります。
今回はその中でApacheやNginxなどWEBサーバの機能、gzip圧縮を使って、コンテンツを圧縮、高速化を実現する方法をお送りします。

gzip圧縮とは?

gzip圧縮によるWEBサイト高速化のイメージは下記になります。

f:id:yuzurus:20150207010811p:plain

  1. クライアントから、index.htmlのリクエストを投げた時に、"Accept-Encoding: gzip" でブラウザーgzipをサポートしていることを通知。
  2. もしサーバがgzip対応していた場合コンテンツをgzip圧縮し、レスポンスヘッダに"Content-Encoding: gzip" を添えて返却。
  3. クライアントがレスポンスを受信したら"Content-Encoding: gzip"にもとづいて、ページを解凍。

圧縮によってデータの転送量を減らすことができるので、WEBサイトの高速化につながります。 主要のモダンブラウザはgzipに対応しています。

Apacheでのgzip圧縮設定方法

/etc/httpd/conf.d/gzip.confというファイルを新規に作成し、下記をコピペしてください。

<IfModule deflate_module>
        DeflateFilterNote Input instream
        DeflateFilterNote Output outstream
        DeflateFilterNote Ratio ratio
        LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
        CustomLog logs/deflate.log deflate

        DeflateCompressionLevel 1

        <Location />
                AddOutputFilterByType DEFLATE  \
                    text/plain \
                    text/html \
                    text/xml \
                    text/css \
                    application/xml \
                    application/xhtml+xml \
                    application/rss+xml \
                    application/atom_xml \
                    application/javascript \
                    application/x-javascript \
                    application/x-httpd-php

                # Netscape 4.x has some problems...
                BrowserMatch ^Mozilla/4 gzip-only-text/html

                # Netscape 4.06-4.08 have some more problems
                BrowserMatch ^Mozilla/4\.0[678] no-gzip

                # MSIE masquerades as Netscape, but it is fine
                BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

                BrowserMatch "\bMSIE [1-6]\." no-gzip

                # Don't compress images
                SetEnvIfNoCase Request_URI \
                \.(?:gif|jpe?g|png)$ no-gzip dont-vary

                <IfModule headers_module>
                        # Make sure proxies don't deliver the wrong content
                        Header append Vary User-Agent env=!dont-vary
                </IfModule>
        </Location>
</IfModule>

DeflateCompressionLevel ディレクティブは圧縮の程度を設定します。大きな値では、より圧縮が行なわれますが、 CPU 資源を消費します。 値は1(低圧縮) から2(高圧縮) です。 とりあえず1で良いと思います。 設定したら再起動すれば反映されます。

chromeのdev toolで確認するとちゃんと反映されてますね。

f:id:yuzurus:20150207013334p:plain

まとめ

もちろん圧縮することによってCPUは通常より消費しますが、ネットワーク帯域に比べれば気にすることはないでしょう。 各々で色々テストして最適な値を見つけてください。

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)