cookie(クッキー)、session(セッション)、あとついでにDB

どうした

Webエンジニアとしてクソなのでcookieとsessionの使い分け方がよくわかんない
調べた

概念としての(webでいうところの)session

WWWサービスで使用されるHTTPでは、request(リクエスト)単位で処理が行われる。
sessionは、ユーザがwebサービスの利用を開始してから終了するまで(これは初回アクセスからブラウザを閉じるまでであったり、ログインしてからログアウトするまでであったり)の複数のrequestをまとめた単位であるように見える。
見えると書いたのは、ブラウザやwebサービスによってsessionの定義は異なるようだから。
sessionの管理(同一session単位内のrequestであることの特定・データの持ち越し)は、cookieを用いたクライアント側に保存する方法と、cookieではsession名とsession識別子を扱いサーバ側のsession管理機能を使用する方法がある。(その他にもやり方はある)
このサーバ側でsessionのデータを管理する方を単に「session」と呼んだりするときもあるので、私にはよくわからなかった。

cookie(クッキー)

クライアント側(ブラウザなど)に保存されるデータ。
基本的にrequest headerにのせてサーバへ送信され。response headerにのせてクライアント側に送信される。
その有効期限の指定の有無によって、取扱いを変えるブラウザがある。IEはPersistent cookiesとPer-session cookiesの二種類で扱う。
有効期限が指定されているPersistent cookiesはファイルで保存し、指定のないPer-session cookiesはメモリ上で管理しブラウザを閉じると消えてしまう。
この有効期限の指定のないcookieを、セッションクッキーと呼ぶ人もたまにいる。IEでのCookie設定のところや、firebugでもこのクッキーをセッションクッキーと呼ぶ箇所がある。
ただ、Cookie関係のRFCでは特にそういう呼び方はしていないことや、PHPではsession idを保持しているクッキーをセッションクッキーと呼ぶので、文脈に注意すること。

性質

cookieを使用することで、requestに以前のrequestで得られたデータをのせることができるため、requestとsession単位を紐付けることができる。
ブラウザ側ではブラウザを閉じるまで、サーバ側ではsession idが破棄されるまでなど、クライアント側でいうsession単位と、サーバ側でいうsession単位の考え方が異なることに注意。
最終アクセス日時を表示したり、掲示板のユーザ名を保存しておく軽い感じの使い方(消えてもいいし、ユーザで改変してもサービス側に不利益がない)
後述するサーバ側の機能としてのsessionは、クライアント側からsession idを貰う必要があるため、session idの保存は主にこのcookieで行われる。(サービス内のリンクのURLのパラメータなどにも入れることも可能だが、さらに容易に改変できる上URLが長くなるのでcookie使わない縛りでもない限りやらない)(WebStorageで保存している例はあるのだろうか)

session(セッション)

ここではサーバのsession管理機能について書く。
概念としてのsessionを取り扱うために、cookieを使用
サーバ側に保存されるデータであり、メモリ上に置かれたりmemcacheやredisなどに置かれたりする。
基本的には発行したsession idをクライアント側のcookieにのせ、以降はrequest headerにのっているsession idからクライアントを判別し、そのrequestとsession単位を紐付けることができる。

使い分け

cookies

何度も入力する必要はあるが、サーバ側の機能には大して影響のないもの(掲示板のユーザ名など)
ログインなどの機能のあるサービスのsession id

session

最悪失っても許容できるが、普段はサーバ側のsession単位で保持しておきたいデータを保存する
ログイン状態など、改変が容易であるとセキュリティ対策コストが跳ね上がるもの
cookieの最大長を超えるもの(Amazonのカートはsessionで管理しているように見えるが、)

DB

不意のサーバダウンなどが起きても、永続的に利用したいデータを保存する
ユーザ情報、商品情報など

気になったこと

third party cookie

session id の保管場所(歴史がありそう)

webstorageの使い所

Smartyのregex_replaceで一致した部分を取り出す

どうした

何故か今Smartyを触っている謎はおいといて、正規表現でヒットした部分を取り出したいなーと思った。

問題

www.smarty.net
公式のドキュメントには特に書いてない。

d.hatena.ne.jp
ありがたい先人。

解決策

PHP: preg_replace - Manual
つまりpreg_replaceのreplacementの仕様と同じく$nで指定すれば良い。
一部を切り抜きたい場合は、前後もマッチングしてやれば良い。

{assign var="origin_text" value="this is origin text."}
{$origin_text}<br>
{$origin_text|regex_replace:'/^(.*)(o.*t)(.*)$/':'$2'}<br>
 this is origin text.
<br>
origin text
<br>

ゲームマーケット2015秋で手に入れたもの

どうした

ゲームマーケットいってきた。
国内外のアナログゲーム(ボードゲームとかカードゲームとか)の即売会っすね。gamemarket.jp
企業の出してるものから同人のものまでいろいろある。

この時に手に入れたもので遊んだり出来たので感想を書いておく。

ひらがなセンテンス

yyyacooo.com
お題(「てんごく」とか「にんげん」とか)を決めてから、
山札からひらがな一文字のカードを引いていき、5x5のマス目に配置して埋めていく。
25文字で埋め終わったら、一筆書きでお題に沿った文章を完成させるゲーム。
山札から引くひらがなの運要素と、ひらがなを配置する場所による戦略性と、最後の大喜利要素が絡みあう良ゲーム。
どんなにひどくても大喜利で挽回出来たりするので好き。

四コマ妖精DX

4コマ妖精 - 豚小屋
お題を決めて、1コマ目をみんなで描き、投票制で決定し、2コマ目・3コマ目とつづけて4コマ漫画を完成させるゲーム。
人数が多ければ多いほど楽しい。
三人よれば文殊の知恵というが、意外とネタが被らないもので、個々人の個性が光る。
徹夜でやるとよい。

アソxベxシャリ

goccogames.com
ゲームじゃなくて本。
ボードゲーム界隈の人たちにインタビューした感じの本。
ひらがなセンテンスの作者の人のインタビューもある。
こんなゲームおもしろかったわ!みたいな話が載っているので、これで気になったゲームをこんど探してみようと思う。
固有名詞がバンバンでてくるが、用語解説がページ下についているので読みやすい。

Aコードでいこう

Saashi & Saashi — Aコードで行こう
パッケージがかわいかったので購入。
ジャズセッションをモチーフとしたカードゲーム。
残念ながら未だプレイ出来ていない。

最後に

やろうアナログゲーム

マーズ・アタック!

1996年 アメリカ
監督 ティム・バートン
主演 ジャック・ニコルソン

マーズ・アタック! [Blu-ray]

マーズ・アタック! [Blu-ray]

マーズ・アタック! [DVD]

マーズ・アタック! [DVD]

 火星人が来たのでアメリカがわいわいする話。もちろん戦争になる。
 宇宙人が来て戦争になる映画は同年に(日本公開は年をまたぐけど)インデペンデンス・デイがあるんだけど、あっちがアメリカンジャスティスを喰らえ!アメリカ万歳!大統領万歳!に比べてこっちは偉そうな奴は大体「バーカ!死ね!」って感じで死んでいく。最高。
 ポワワ銃で政府のおっさんや陸軍が緑や赤の骨(彩色した骨格模型)になっていくし、この未曾有の事態中にスケベ心だしてる奴ら(専門家のイケメン(ピアース・ブロズナン 007ゴールデンアイのボンド)と頭のゆるい美人キャスター、あとマイケル・J・フォックス)はもちろんひどい目にあう。クソだなって思うやつは大体死ぬ。安心できる。
 全体的にB級映画のノリが漂うので、メリハリみたいなものはなくて全体を通すとダルさがあって(このシーンこんな長くいるか?みたいなのが多い)、真面目に見るものではなくけだるい休日の午後とかにだらだら見て欲しい。体調が悪い時に見る夢みたいな感じが得られる。
 最高に褒められる点は出てくる女性がみんなエロいところ。明らかに頭の大きい「一体何星人の変装なんだ……」みたいな女とか、大統領の娘(ナタリー・ポートマンとかいう天使)とか、エジプト風の衣装着てるカジノの店員とか良かった。
 あとトム・ジョーンズ役のトム・ジョーンズが良かった。また見たい。

RailsでDalliが使うmemcacheのポート番号を指定する

memcachedrailsから使いやすくしてくれるgem Dalli

mperham/dalli · GitHub
ありがたい。でもmemcachedのポート番号を変更したとき、どうやって設定するんだろう。

手順

  • config/environments/development.rb内のconfig.cache_storeを変更する
$ vim config/environments/development.rb 
  # memcached / dalli
  config.cache_store = :dalli_store, 'localhost:11212'

単純にサーバ指定してあげるところにポート番号も書いてあげれば良かった。

memcachedを同一サーバ上で異なるポートで複数走らせる on Ubuntu14.04

複数memcachedが欲しい

小規模な実験的開発なので、開発環境と本番環境が同一のサーバ上にある。
両方memcachedを使いたいけど、keyが同じだと混ざる。
環境名をkeyに入れるのもアレだなぁということで、memcachedを2つ走らせることにした。

環境

調査

起動スクリプトと設定ファイルをcpしてポートの数だけ増やしたり、起動スクリプト複数対応にしてあげたりしている。
起動スクリプトを見る。

$ cat /etc/init.d/memcached
FILES=(/etc/memcached_*.conf)
# check for alternative config schema
if [ -r "${FILES[0]}" ]; then
  CONFIGS=()
  for FILE in "${FILES[@]}";
  do
    # remove prefix
    NAME=${FILE#/etc/}
    # remove suffix
    NAME=${NAME%.conf}

    # check optional second param
    if [ $# -ne 2 ];
    then
      # add to config array
      CONFIGS+=($NAME)
    elif [ "memcached_$2" == "$NAME" ];
    then
      # use only one memcached
      CONFIGS=($NAME)
      break;
    fi;
  done;

  if [ ${#CONFIGS[@]} == 0 ];
  then
    echo "Config not exist for: $2" >&2
    exit 1
  fi;
else
  CONFIGS=(memcached)
fi;

あっ、なんか"memcached_$2"とか書いてあるし、さてはこれ複数設定ファイルに対応してる奴や。

手順

$ sudo cp memcached.conf memcached_2.conf
  • /etc/memcached_2の中のポート番号を書き換える
$ sudo vim memcached_2.conf
# Default connection port is 11211
-p 11212
$ sudo service memcached restart
Restarting memcached: memcached_2.
$ ps aux | grep memcached

ポートの部分が異なる2つのmemcachedが走っているのを確認。

PHPでOR書いて死ぬ話

どうした

 PHPで論理演算子orを使ってたらハマって死んだ。現象は以下の記事を参照。tech.aainc.co.jp

 orは=より評価順位が低いので気をつけようという話。
 python書いてからPHP書こうとすると、ついついorって書いちゃうけど、気をつけないとあかんね。ちなみにrubyPHPと同じような優先順位なので、言語を並行で触るときには意識して気をつけよう。