ぽんぽんぽぽぽん

”ぽん”が色々書きます。(ITのことや、ソシャゲ、スロットのこととかw...etc)

MySQLでカンマ区切りのフィールド検索に非常に便利!(find_in_set)

こんにちは。ぽんです。

みなさんはこんな場合にどうやって対応するでしょうか?

スーパーにりんごとみかん、ぶどうが売っています。

それぞれ記号で置いて、以下とします。

りんご = 1

みかん = 2

ぶどう = 3

Aさんはりんごとみかんを購入し、Bさんはりんごとぶどうを購入しました。

テーブルに格納すると、

★購入情報テーブル

購入者 購入したもの
A りんご,みかん
B りんご,ぶどう

↓記号で置き換えてみる

購入者 購入したもの
A 1,2
B 1,3

りんごを買った人はだれか?というのを抽出するためによくやりがち(?あんまりいないか)なのが、

select 購入者 from 購入情報テーブル where 購入したもの like '%1%';

なんかこんな感じでやってた人がいた。

・・

・・・

・・・・

・・・・・

これじゃ取れないよ!笑

ぽんはいままでこういう設計は避けてきたので知らなかったんですけど MySQLにはfind_in_set()という便利な関数が存在する。

select 購入者 from 購入情報テーブル where find_in_set(1,購入したもの);

これで一発!

もしもっといい方法をご存知の方は教えて下さいーm( )m

今更ながらcronの多重起動の防止を調べてみた

システム開発していた際に何度も出てくるcronによる自動実行

多重起動防止として、

1.プロセス監視

2.lockファイルの作成(バッチ処理内で自前で作成)

上記2つを主に使ってきました。

最近作っているシステムで、「ロックファイルはいいんだけど、なんか簡単にできないの〜?できるでしょ?(・ω<)」 と言われちょっと検索してみることに。

するとcentos5からflockってコマンドがあるらしく どうやらそれを使うとcronの設定の中にロック処理を含めることができるらしい。

ということでテストしてみる。

以下のPHPソースでテスト

test.php
<?php
echo date("Y-m-d H:i:s");
sleep(60);
?>
# vi /etc/crontab
↓中身↓
-------------
* * * * * user /usr/bin/flock -n /tmp/test.lock php -f test.php >> /tmp/test.log 2>&1
-------------

結果・・・・

できた!!!

/var/log/cronの内容

Jun 18 19:35:01 local CROND[5793]: (user) CMD (/usr/bin/flock -n /tmp/test.lock php -f test.php >> /tmp/test.log 2>&1)
Jun 18 19:36:01 local CROND[5813]: (user) CMD (/usr/bin/flock -n /tmp/test.lock php -f test.php >> /tmp/test.log 2>&1)
Jun 18 19:37:01 local CROND[5816]: (user) CMD (/usr/bin/flock -n /tmp/test.lock php -f test.php >> /tmp/test.log 2>&1)

/tmp/test.logの内容

2015-06-18 19:35:01
2015-06-18 19:37:01

ほんとうごいてないわー。詳しくは見てないけどうごいてないわー。 いいわー。これを使おう。

vagrantで作成したvmdkファイルの容量を圧縮してみた話

Macの容量(256GB)がいつの間にか80%を超えていた!!

やばいやばい!オス、オラ悟空!

と思って何にそんなに使っているのかを検索

$ sudo du -g -x -d 5 / | awk '$1 >= 5{print}'

VirtualBox VMs/ がめっちゃ増えてるぅぅ!

1個80GBぐらいの.vmdkがある。ゲストOS内でdfしてみると30GBぐらい。

あーなんかの記事で一旦増えた.vmdkはサイズ戻らないとかってのを見た気がする。

じゃあ早速圧縮方法を調べる。 主に2パターンあった。

① vdiに変換してvirtualboxの圧縮コマンド実行

vagrant packageで再度作り直し

①はvdiファイルを作成する容量がなかったため断念。 80GB×2は無理だよorz

ということで②を試してみる。 流れは以下。

1.ゲストOSの空き容量を埋める

sudo dd if=/dev/zero of=/tmp/ZERO bs=1M

200GBあったので結構かかった。

その後/tmp/ZEROを削除

$ rm -f /tmp/ZERO

※これをやらないとpackage化したファイルを戻した時に「ちょっと奥さん!もうお腹一杯ですよ!」って怒られた。 もっといい方法ありそうだけど。

2.package.boxを作成

vagrant package

package.box自体は7GBぐらいに収まった。

3.package.boxを使ってbox addする

vagrant box add xxxx package.box

4.追加したboxを使って別環境を作る

mkdir resize
cd resize
vagrant init xxxx

5.元々のVagrantfileをコピー

新しく作成したVagrantfileに、元々のVagrantfileをまるまるコピーする ※環境は全く同じがよかったので。

6.新仮想マシンを作成

vagrant up

エラー発生。 「デバイス eth1 は存在しないようですので、初期化を遅らせます。」 検索すると HWADDRとのマッチングが行えていないことが原因のよう。

echo '' > /etc/udev/rules.d/70-persistent-net.rules

のファイルを空にしてvagrant reloadを実行

無事起動!!! サイズも25GBぐらいに減っている!!!

素晴らしい!!!終わり

【SLOT】やっとひけたーーーー!!!

SLOT 魔法少女まどかマギカ

 
とうとうやってやりましたよ!
 
ロングフリーズ!!
 
f:id:ponchikutanuki:20150506210437j:image
 

まさかよそ見してる最中に来るとは…

 
欲はいけないってことですかね?w
 
アルティメットバトルもようやく引けて思い残すことはありません!撤去される前でよかった(。´・_・`。)
 
 
f:id:ponchikutanuki:20150506210607j:image
 
今まで何G打ったんだろうか?100,000ぐらいかな?
 
あれ確か1/30000ぐらいでしたよね?引き弱過ぎ!
 
 
 
まぁ引いても8連で終わったんですけどね_| ̄|○

CakePHP(ver_2.6)でログイン成功しているにも関わらずログイン画面に戻される対応

数時間潰してしまいました・・・。今後同じようなことをしないようにメモorz

事象

CakePHPでログイン自体は成功するのに、 ログイン後の画面でなぜかログイン画面に速攻で戻されるという事象が発生しました。

なんでだろうなぁと悩み試行錯誤した結果。

Cookieにドットが使われているとダメになるという現象を発見!!!

しらべてみると、どうやらCookieコンポーネントの挙動で

$this->Cookie->write([name], [value], [encrypt]);

のencryptをtrueにしないとドットが入っているものは利用できないみたい。

たぶんAuthComponentの中にそういう記述があるんだろうけどあとで調査

ということで、 .(ドット)を_(アンダーバー)に変更することで対応

HTTP⇒HTTPSへの移行対応の時にやらなかったことを対応した

HSTSの設定

HSTS(HTTP Strict Transport Security)という仕組みを利用するといいらしい。

HSTSってなんぞ?って思ったので調べたら載ってた。

「このサイトにはHTTPではなくHTTPSで必ず接続するように」と、サーバーがブラウザに指示するHTTPヘッダー。この指示を受け取ったブラウザは、その情報を記録しておき、以降は、そのサイトに対してアクセスするのにHTTPを使わず自動的にHTTPSで接続するようにする。

なるほどね!一回HTTPでアクセスされることもなくなるわけか。セキュリティ的にもいいんじゃないですか。

よし。ではさっそく組み込み。

.htaccessに以下を記述

Header set Strict-Transport-Security "max-age=31536000;"

デベロッパツールで確認すると確かに付与されている。

よしよし。

ここである疑問が。

初回は??

更に調べるとどうやら「プリロードHSTS」となるものがあるらしい。

このサイトに登録しておくとChrome,Firefox,Safariからは初回訪問を含めてHTTPSでのアクセスを標準にする。らしい。

さっそく対応。

なんかもろもろエラーが表示・・・orz

調べるとさっき追加したHeaderには情報が足りないらしく以下で動作した。

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

無事動いた(・∀・)

HTTPSに変更してから少し順位が落ちてきているので再度様子見★

2015/04/28 追記 preload hstsに登録すると、サブドメインまで勝手にHTTPSに置き換わろうとする現象が発生 一部SSLを利用していないサブドメインが存在していたので問題に。。。

とりあえずHeaderを最初のに戻すことで対応

【初投稿】ブログはじめました!

みなさま、はじめまして”ぽん”です♪

今更ですが、ブログはじめました。

プログラミングのこととか、 楽しんでるソシャゲのこととか、 ジャンル問わずに色々書いていこうと思います。

文章書く練習も兼ねてなので温かい目で見守ってください!

(^O^)