PITTAを使ってみた
○耳ひもの痛さ
花粉のシーズン中はずっと使うものなので、個人的に一番重視しているのがココ。
太さがあり、負担がかかりにくい。一体型なので、耳ひももウレタン性で柔軟性に富む。
結論から言うと、全く痛くない。これだけでリピートはほぼ決定。
○通気性
紙のマスクより若干通気性がよく感じる。
○隙間
あまり気にならない。
ただ、他のマスクと同じく息で眼鏡が曇る。
○耐久性
センターで貼り付ける構造なのだが、この部分の糊付けが若干弱い気がする。
何度か使用しているうちに、はがれてきてしまった(僕の顔がでかいからか)
○洗濯
この製品の売りの一つか。
洗濯後も使用感は変わりない。洗剤の匂いがするので、普段から匂いの強い洗剤を使っていると厳しいかも。
白よりもグレーの方が汚れも目立たずにいいのだが、グレーはまだまだ数奇な目で見られる・・・
Translate
2016年3月2日水曜日
2016年2月25日木曜日
【.htaccess】no-cache no-storeの違い
キャッシュについて
キャッシュを保存されたくない!という仕組みを作る際、色々検索してみると、
.htaccessに
Header set Cache-Control "no-cache"
Header set Pragma "no-cache"
と書け!としてあるサイトが多かった。
前回の記事にも書いたけど、僕が欲しかったのは一度もファイルがキャッシュされない仕組みなんだけど、
上記のコードだとローカルに保存されてしまう。
というわけで、調べてみた
Header set Cache-Control "no-store"
Header set Pragma "no-store"
ローカルに保存しないよ。
オフラインだろうと、ないものはないよ。
Header set Cache-Control "no-cache"
Header set Pragma "no-cache"
ローカルに保存するけど、次回アクセスするときは、ファイルが更新されていれば、またファイルを読みに行くよ。
オフラインでは保存したこれを使うよ。
LEVEL 0.1くらいあがった
キャッシュを保存されたくない!という仕組みを作る際、色々検索してみると、
.htaccessに
Header set Cache-Control "no-cache"
Header set Pragma "no-cache"
と書け!としてあるサイトが多かった。
前回の記事にも書いたけど、僕が欲しかったのは一度もファイルがキャッシュされない仕組みなんだけど、
上記のコードだとローカルに保存されてしまう。
というわけで、調べてみた
Header set Cache-Control "no-store"
Header set Pragma "no-store"
ローカルに保存しないよ。
オフラインだろうと、ないものはないよ。
Header set Cache-Control "no-cache"
Header set Pragma "no-cache"
ローカルに保存するけど、次回アクセスするときは、ファイルが更新されていれば、またファイルを読みに行くよ。
オフラインでは保存したこれを使うよ。
LEVEL 0.1くらいあがった
2016年2月23日火曜日
【php】【ajax】【.htaccess】いまだに画像をローカルへダウンロードされたくない人がいるときは
色々と考えてみた。
使うもの
javascript php .htaccess
※スクリーンショットは防げません
main.html - メインとなるページ。DBと連動したりするならphpで書く。
clone.php - postで受け取ったアドレスの画像を画像フォルダから複製して、複製画像のURLを返す
delete.php - postで受け取ったアドレスの複製画像を消す
/image/ - 画像フォルダ。実際はもっと分かりづらい名前に。元の画像はここに入れる。
/image/.haccess - 設定ファイル
/tmp/ - 仮画像保存フォルダ
/tmp/.haccess - 設定ファイル
流れ
ページにアクセス。呼び出す画像のファイル名は暗号化されているとする。
1:javascriptで仮ファイル名を作成(Math.ceil(Math.random()*10000000) + ".jpg"など)
2:ajaxで画像名、仮ファイル名をpost
3:clone.phpが/tmp/フォルダに、仮ファイルを作成。
4:returnで仮ファイル名のURLを取得
5:canvasに画像を書き出し
6:ajaxで仮ファイル名をpost
7.delete.phpが/tmp/フォルダの仮ファイルを削除
設定(特徴的な箇所のみ記述)
main.html
http://www.stylish-style.com/csstec/basic/g-photo-guard.html
こちらを参考に、canvasには透明gifをのせておく。
/tmp/.haccess
Header set Cache-Control "no-store"
Header set Pragma "no-store"
(注意)no-cacheではないです。
/image/.haccess
-deny from all
clone.php、delete.php
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') (ajax以外のアクセスでは動かないように)
結果
○右クリック、ドラッグ保存→透過gifでガード
○ソースコードを読む→読み込んだ仮画像は削除済
○キャッシュから拾う→キャッシュ防止済
元画像フォルダへのアクセスは、phpのみ可能にしておきます。
スクリーンショットは防げませんが、かなり防げるような。
javascriptが切られていると、ajaxが発動されないので画像のコピーが行われません。
ajaxでファイルのクローンを作るという動作を行っているので、
悪意のあるユーザーにビシバシpostされまくると危険かも。
ここでは書いていませんが、連続post対策は必須。
使うもの
javascript php .htaccess
※スクリーンショットは防げません
main.html - メインとなるページ。DBと連動したりするならphpで書く。
clone.php - postで受け取ったアドレスの画像を画像フォルダから複製して、複製画像のURLを返す
delete.php - postで受け取ったアドレスの複製画像を消す
/image/ - 画像フォルダ。実際はもっと分かりづらい名前に。元の画像はここに入れる。
/image/.haccess - 設定ファイル
/tmp/ - 仮画像保存フォルダ
/tmp/.haccess - 設定ファイル
流れ
ページにアクセス。呼び出す画像のファイル名は暗号化されているとする。
1:javascriptで仮ファイル名を作成(Math.ceil(Math.random()*10000000) + ".jpg"など)
2:ajaxで画像名、仮ファイル名をpost
3:clone.phpが/tmp/フォルダに、仮ファイルを作成。
4:returnで仮ファイル名のURLを取得
5:canvasに画像を書き出し
6:ajaxで仮ファイル名をpost
7.delete.phpが/tmp/フォルダの仮ファイルを削除
設定(特徴的な箇所のみ記述)
main.html
http://www.stylish-style.com/csstec/basic/g-photo-guard.html
こちらを参考に、canvasには透明gifをのせておく。
/tmp/.haccess
Header set Cache-Control "no-store"
Header set Pragma "no-store"
(注意)no-cacheではないです。
/image/.haccess
-deny from all
clone.php、delete.php
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') (ajax以外のアクセスでは動かないように)
結果
○右クリック、ドラッグ保存→透過gifでガード
○ソースコードを読む→読み込んだ仮画像は削除済
○キャッシュから拾う→キャッシュ防止済
元画像フォルダへのアクセスは、phpのみ可能にしておきます。
スクリーンショットは防げませんが、かなり防げるような。
javascriptが切られていると、ajaxが発動されないので画像のコピーが行われません。
ajaxでファイルのクローンを作るという動作を行っているので、
悪意のあるユーザーにビシバシpostされまくると危険かも。
ここでは書いていませんが、連続post対策は必須。
2016年2月19日金曜日
【php】declare&&ticksと分かり合えるのには時間がかかる気がする
declareについて調べている途中。
<?php
function ticks_echo() {
static $count_of_ticks = 1;
echo 'ticks >> '.$count_of_ticks."<br />";
$count_of_ticks++;
}
register_tick_function( 'ticks_echo' );
declare( ticks = 1 ) {
for($n =1;$n<4;$n++)
{
echo "何かしらの処理:".$n."回目<br />";
}
}
/*
僕の予想:
何かしらの処理:1回目
ticks >> 1
何かしらの処理:2回目
ticks >> 2
何かしらの処理:3回目
ticks >> 3
実際の結果:
何かしらの処理:1回目
ticks >> 1
ticks >> 2
何かしらの処理:2回目
ticks >> 3
ticks >> 4
何かしらの処理:3回目
ticks >> 5
ticks >> 6
ticks >> 7
ticks >> 8
*/
えっ、こいつら、ボディランゲージ通じない感じ。
どうやら、declareは{}ブロックの終わりでも一度評価されるよう。
つまり、
declare( ticks = 1 ) {
for($n =1;$n<4;$n++)
{
echo "何かしらの処理:".$n."回目<br />";
}
}
の挙動は
何かしらの処理:1回目
ticks >> 1//forの最初のecho
ticks >> 2//forの最初の{}閉じ
何かしらの処理:2回目
ticks >> 3//forの2回目のecho
ticks >> 4//forの2回目の{}閉じ
何かしらの処理:3回目
ticks >> 5//forの3回目のecho
ticks >> 6//forの3回目の{}閉じ
ticks >> 7//forの4回目の{}閉じ(forの条件式が$n===4でfalseなので、中の文は実行されず)
ticks >> 8//declare最後の{}閉じ
となっている(のでしょう)。
その辺を考えて使わないと、痛い目にあいそう。
というか、時間計測くらいしか使いどころが分からない・・・。
<?php
function ticks_echo() {
static $count_of_ticks = 1;
echo 'ticks >> '.$count_of_ticks."<br />";
$count_of_ticks++;
}
register_tick_function( 'ticks_echo' );
declare( ticks = 1 ) {
for($n =1;$n<4;$n++)
{
echo "何かしらの処理:".$n."回目<br />";
}
}
/*
僕の予想:
何かしらの処理:1回目
ticks >> 1
何かしらの処理:2回目
ticks >> 2
何かしらの処理:3回目
ticks >> 3
実際の結果:
何かしらの処理:1回目
ticks >> 1
ticks >> 2
何かしらの処理:2回目
ticks >> 3
ticks >> 4
何かしらの処理:3回目
ticks >> 5
ticks >> 6
ticks >> 7
ticks >> 8
*/
えっ、こいつら、ボディランゲージ通じない感じ。
どうやら、declareは{}ブロックの終わりでも一度評価されるよう。
つまり、
declare( ticks = 1 ) {
for($n =1;$n<4;$n++)
{
echo "何かしらの処理:".$n."回目<br />";
}
}
の挙動は
何かしらの処理:1回目
ticks >> 1//forの最初のecho
ticks >> 2//forの最初の{}閉じ
何かしらの処理:2回目
ticks >> 3//forの2回目のecho
ticks >> 4//forの2回目の{}閉じ
何かしらの処理:3回目
ticks >> 5//forの3回目のecho
ticks >> 6//forの3回目の{}閉じ
ticks >> 7//forの4回目の{}閉じ(forの条件式が$n===4でfalseなので、中の文は実行されず)
ticks >> 8//declare最後の{}閉じ
となっている(のでしょう)。
その辺を考えて使わないと、痛い目にあいそう。
というか、時間計測くらいしか使いどころが分からない・・・。
2016年2月18日木曜日
【php】配列に何種類の値が入っているか
array_count_valuesか、array_uniqueを使う。
$array = [1,2,3,4,5,6,7,8,9,10,"a","b","c","d","",1,2,3,4,5,6,7,8,9,10];
echo "array_count_values:".count(array_count_values($array));//15
echo "<br />";
echo "array_unique:".count(array_unique($array));//15
//var_dump(array_count_values($array));
//array(15) { [1]=> int(2) [2]=> int(2) [3]=> int(2) [4]=> int(2) [5]=> int(2) [6]=> int(2) [7]=> int(2) [8]=> int(2) [9]=> int(2) [10]=> int(2) ["a"]=> int(1) ["b"]=> int(1) ["c"]=> int(1) ["d"]=> int(1) [""]=> int(1) }
//var_dump(array_unique($array));
//array(15) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) [10]=> string(1) "a" [11]=> string(1) "b" [12]=> string(1) "c" [13]=> string(1) "d" [14]=> string(0) "" }
カウントする対象は、文字列か数値のみ
$array = [1,2,3,4,5,6,7,8,9,10,"a","b","c","d","",1,2,3,4,5,6,7,8,9,10];
echo "array_count_values:".count(array_count_values($array));//15
echo "<br />";
echo "array_unique:".count(array_unique($array));//15
//var_dump(array_count_values($array));
//array(15) { [1]=> int(2) [2]=> int(2) [3]=> int(2) [4]=> int(2) [5]=> int(2) [6]=> int(2) [7]=> int(2) [8]=> int(2) [9]=> int(2) [10]=> int(2) ["a"]=> int(1) ["b"]=> int(1) ["c"]=> int(1) ["d"]=> int(1) [""]=> int(1) }
//var_dump(array_unique($array));
//array(15) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) [10]=> string(1) "a" [11]=> string(1) "b" [12]=> string(1) "c" [13]=> string(1) "d" [14]=> string(0) "" }
カウントする対象は、文字列か数値のみ
2016年2月17日水曜日
【mysql】各キーの最新ログ5件を取得したい
全IDの最新ログ5件を表示
logテーブルから、各IDごとの最新ログ5件を拾いたいとき。
IDを指定できるなら
SELECT `id` , group_concat(`status` separator ',') as "recent_log" from ( SELECT * FROM `log` WHERE `id` ="hoge" order by date limit 5 ) as Table1
これが手っ取り早い。ただし、受信した側で処理する必要がある。
行を別々にとりたいというとき
SELECT * FROM log as Table1 WHERE (SELECT COUNT(*) FROM log as Table2 WHERE Table2.id = Table1.id AND Table2.date > Table1.date) < 3 AND id ="hoge" ORDER BY id DESC, date DESC
ただし、処理がかなり重い。件数の多いlogテーブルとかで使うのは実用的ではないかも
これを、例えば役員(officer)の最近ログ5件を全て表示!安全にサボりたい!としたいときはこんな感じ
SELECT * FROM log as Table1 WHERE (SELECT COUNT(*) FROM log as Table2 WHERE Table2.id = Table1.id AND Table2.date > Table1.date) < 5 AND id in ( select id from id_table where class ="officer" ) ORDER BY id DESC, date DESC
こちらも、もちろん処理が重い
logテーブルから、各IDごとの最新ログ5件を拾いたいとき。
IDを指定できるなら
SELECT `id` , group_concat(`status` separator ',') as "recent_log" from ( SELECT * FROM `log` WHERE `id` ="hoge" order by date limit 5 ) as Table1
これが手っ取り早い。ただし、受信した側で処理する必要がある。
行を別々にとりたいというとき
SELECT * FROM log as Table1 WHERE (SELECT COUNT(*) FROM log as Table2 WHERE Table2.id = Table1.id AND Table2.date > Table1.date) < 3 AND id ="hoge" ORDER BY id DESC, date DESC
ただし、処理がかなり重い。件数の多いlogテーブルとかで使うのは実用的ではないかも
これを、例えば役員(officer)の最近ログ5件を全て表示!安全にサボりたい!としたいときはこんな感じ
SELECT * FROM log as Table1 WHERE (SELECT COUNT(*) FROM log as Table2 WHERE Table2.id = Table1.id AND Table2.date > Table1.date) < 5 AND id in ( select id from id_table where class ="officer" ) ORDER BY id DESC, date DESC
こちらも、もちろん処理が重い
2016年2月10日水曜日
【php】json_decodeで配列にならない
先日の続き。
phpexcelで作った配列をjavascriptにJSON形式で渡して、その後さらに$_postの内容をphpに渡すとき、
json_decode($_POST["array"]);
としたのだが、うまく配列にならない。
json_decode($_POST["array"],true);
配列としたいのなら、パラメータに属性を渡して上げなくてはいけなかった。
急いでると、簡単なところでつまずきます。
phpexcelで作った配列をjavascriptにJSON形式で渡して、その後さらに$_postの内容をphpに渡すとき、
json_decode($_POST["array"]);
としたのだが、うまく配列にならない。
json_decode($_POST["array"],true);
配列としたいのなら、パラメータに属性を渡して上げなくてはいけなかった。
急いでると、簡単なところでつまずきます。
登録:
投稿 (Atom)