memcached のインストール。作業メモ

作ったもの

  • memcached 環境作成(ローカルホスト)
  • telnet でアクセス
  • munin で監視
  • php からアクセス
  • php のセッションを memcached に保存
  • その他

memcached 環境作成(ローカルホスト)

環境は Cent 最新。

yum install -y memcached memcached-devel php-pecl-memcached
chkconfig memcached on
/etc/init.d/memcached start
/etc/init.d/httpd restart

とりあえずこれだけ。
設定ファイルは /etc 配下。 とりあえずデフォルトのまま。

% cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

telnet でアクセス

気の利いたクライアントソフトが無いので telnet でアクセスする。
memcached を入れると memcached-tool も勝手に入ってる。

詳細はこちら https://gist.github.com/4473665

munin で監視

プラグインフォルダに memcached_ というファイルがあるが、そのままでは動かないらしい。
こちらを参考に http://d.hatena.ne.jp/strkpy/20101106/1288975589

$ cd /etc/munin/plugins
$ ln -snf /usr/share/munin/plugins/memcached_ memcached_bytes
$ ln -snf /usr/share/munin/plugins/memcached_ memcached_counters
$ ln -snf /usr/share/munin/plugins/memcached_ memcached_rates

設定ファイルの追記

/etc/munin/plugin-conf.d/munin-node

[memcached_*]
env.host 127.0.0.1
env.port 11211

そして再起動。

php からアクセス

<?php
$memcache = new Memcached();
$memcache->addServer("localhost", 11211);

for ($i = 0; $i < 100; $i++) {
    $memcache->set("mykey" . $i, "myvalue". $i);
}

適当に100件程突っ込んでみる。
内容をリストアップするようなメソッドが無いので、内容の確認は memcached-tool dump で。

php のセッションを memcached に保存

yum でインストールすると、設定ファイルが作成されている。

$ cat /etc/php.d/memcached.ini 

; Enable memcached extension module
extension=memcached.so

; ----- Options to use the memcached session handler

;  Use memcache as a session handler
;session.save_handler=memcached
;  Defines a comma separated list of server urls to use for session storage
;session.save_path="localhost:11211"

ここのコメントアウトを外すと、セッション情報が memcached に保存される用になる。

その他

エディタ(Eclipse PDT) がPHP のメソッドを補完してくれないのでスケルトンを作成

https://gist.github.com/4472094

適当な場所に設置して読み込ませるとちゃんと補完してくれるようになる。

参考になった記事

運用ガイド。通信がセキュアじゃないらしいので、通信はサーバーの iptables か何かで制御。

memcache のメモリ管理についての詳細。

東京Node学園 6時限目の資料を雑にまとめる。

とりあえずリンクだけ。
後でゆっくり読む。

プレゼン資料

LT大会

JavaScript でイベント伝播の止め方いろいろ

JavaScript でイベント伝播の止め方いろいろ

  • event.preeventDefault()
  • event.stopPropagation()
  • jQuery.bind("…", function(){reutnr false;})

等の細かい挙動を確認.

結果

jQuery.bind
parent link bind2
指定なし
e.preventDefault() ×
e.stopPropagation() ×
return false; × ×
element.onclick
parent link
指定なし
e.preventDefault() ×
e.stopPropagation() ×
return false; ×

まとめ

  • preeventDefault() はブラウザのデフォルトの挙動をキャンセルする.
  • stopPropgation() は親要素へのイベント伝播を止める.
  • return false; の挙動は jQuery と onclick で変わるので注意
  • jQueryで、同じ要素に複数のリスナを bind した場合は、両方動く

( 止めたかったら独自のフラグを持たせるか、unbind する )


深く考えない時は、jQuery + return false; だけで書いておけば良さそうでしょうか?

検証コード

※ 検証時は、コメントアウトしながら切り替えてます。

Mac で ssh config を設定した後、 「Too many authentication failures for xxxx」エラーへの対応をして、さらに鍵使用時に毎回パスフレーズを訊かれないようにする。

一人でいろんな設定のサーバーと同時に戦う時のメモ。

1. ssh の設定を config で便利に管理

Mac / Linuxssh 接続をする際、~/.ssh/config ファイルの設定をすると、毎回接続するサーバーの設定のを打ち込む手間が省けます。

$ vi ~/.ssh/config

Host server1
  HostName 192.168.0.100 
  Port          22
  User         myuser
  IdentityFile ~/.ssh/id_rsa
# ログイン
$ ssh server1

ログイン用のシェルを書いてパスを通すか、aliasにでも書いたら? と思ったが、 rsync/scp/git 等のコマンドでも同じ設定が使えるので、こっちの方が俄然便利。

# scp も行ける。
$ scp server1:~/src.file dst

詳細はこちら
http://www.unixuser.org/~euske/doc/openssh/jman/ssh_config.html

踏み台とかもマニアックに設定できる。

2. config を使わないサーバーへ接続する際にエラーが出る際の対処

configの設定が多くなってくると、今度は普通にパスワードで入りたい時に

# 普通にログイン
$ ssh user@192.168.1.100
Received disconnect from 192.168.1.100: 2: Too many authentication failures for user

のエラーが頻発するようになる。

これは、サーバーに接続できなかった際に、config で設定されてるで接続を試すため、
失敗の上限に引っかかって起きるエラー。


これを避けるために ssh のオプションでパスワードを強制する。

$ ssh user@192.168.1.100 -o PreferredAuthentications=password

もしくは、~/.ssh/config に別の設定を試さないように指定

# 別のホストの設定を試さない
IdentitiesOnly yes 

の記述を追加すれば良い。

詳細はこちらのブログ
http://d.hatena.ne.jp/kou_i/20101121/1290352589

3. IdentitiesOnly を設定した際に、毎回パスフレーズを聴かれない様にする

上記のオプションを打つのが面倒なので、 config の設定を行うと、
パスフレーズ設定をしている ssh 鍵が、Macのキーチェーンを参照しなくなり、
毎回キーチェーンが起動するようになる。

※ 「パスワードをキーチェーンに保存」にチェックを入れても、効かない。

キーチェーンを使わないで済む様に、鍵ファイルにパスフレーズを書き込む

$ openssl rsa -in org.key -out new.key
# < パスフレーズの入力

( これは ApacheSSL自動起動設定をする時に使うヤツ )
( 当然、鍵のパーミッションは400で )

ここまで設定すると、キー登録しているホストへは一発で接続でき、普通にユーザー名とパスワードでログインしたいサーバーへは

$ ssh user@192.168.1.100
user@192.168.1.100s password: 


と普通にログインできるようになる。


めでたし。

MacでJSLintをの実行環境をいい感じに整える。

参考
http://d.hatena.ne.jp/shobonengine/20110806/1312588647

本体のダウンロード
https://github.com/douglascrockford/JSLint

実行環境の設定
https://gist.github.com/858343


同じディレクトリに放り込んでパスの微修正
( この辺の構成は好みで )

jslint.sh

JSLINT=`dirname $0`/jslint.js
JSC_WRAPPER=`dirname $0`/jsc_jslint_wrapper.js

パスを通す

$ alias jslint=/path/to/JSLint/jslint.sh 

ちゃんと動くようなら.bash_profile に書く。


このままだと、日本語のコメントが全て

ERRORS:
 3:8	Unsafe character.
	*    &#232;〓?#231;´&#160;&#227;′&#231;?#187;&#233;搦?#

みたいに怒られる

こちらのサイトを参考にしつつ、
http://d.hatena.ne.jp/m-hiyama/20080411/1207897935

削除するよりも、オプションでチェックを回避できるようにソースを修正

jslint.js

            if (at >= 0 && option.unsafechar) {
                warn_at('unsafe', line, at);
            }

jsc_jslint_wrapper.js

    goodPartsOptions = {devel: true,
        // (略)
        unsafechar: false
    },


せっかくだからフォークしてまとめてみた。
https://github.com/m-s-modified/JSLint

PHP の short_open_tag 爆発しろ。

PHPの short_open_tag の仕様がバージョンによってコロコロ変わるのでメモ。

まとめ

バージョン デフォルト 変更可能 備考
PHP 4.0.0 On PHP_INI_ALL "<?=" "<?" の両方に影響
PHP < 5.3 Off PHP_INI_PERDIR "<?=" "<?" の両方に影響
PHP 5.4 On PHP_INI_PERDIR "<?=" は常に使用可能 (設定を変更できない)

※ 一部、未検証です。
※ 一部サイトで、「5.4では short_open_tag ディレクティブが無くなる」というような書き方をしていますが、"<? " を使うかどうかの指定はできました。

備考、定数の説明

定数 説明
PHP_INI_USER 1 このエントリは、ユーザスクリプトから設定可能
PHP_INI_PERDIR 2 このエントリは、.htaccessおよび httpd.confのVHostディレクティブ内で設定可能
PHP_INI_SYSTEM 4 このエントリは、php.ini または httpd.conf (しかし、httpd.confのVHostブ ロック内では不可)で設定可能
PHP_INI_ALL 7 このエントリはどこでも設定可能

対策

  1. 誰が何と言おうと、設定がどうなっていようと、short_open_tag は使わない。
  2. XML 出力するときは Smarty を使う。

Basic 認証中のページで OGP のテストをする

Basic 認証中のサイトだと Facebook の OGP の確認ができない。
これは、「いいね!」ボタンを押した後に、Facebook のクローラが OGP を改めて読みにくるため。

なので、「Facebook のクローラには Basic 認証を適用しない」設定を追記すれば良い。

Facebook からのアクセスは

"GET / HTTP/1.1" 401 480 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"

こんな感じのログを残すので、 『UserAgent : facebookexternalhit』を許可する

# Basic の基本設定
AuthUserFile /path/to/.htaccess
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user

Satisfy Any
Order Allow,Deny


# 許可するIP 1
Allow from xxx.xxx.xxx.xxx
# 許可するIP 2
Allow from yyy.yyy.yyy.yyy

# FB のクローラを許可
SetEnvIf User-Agent "^facebookexternalhit.*$" fb_crawler
SetEnvIf User-Agent "^facebookplatform.*$" fb_crawler
Allow from env=fb_crawler

で、こんな感じ。