googleのcookieを解読する

google.co.jpでsetされるcookieを見てみたい。

と思ったら全く分からないので、Googleのドキュメントを先に読んでみよう。
https://policies.google.com/technologies/types

>お住まいの地域を記憶することで、ウェブサイトに地域の天気予報や交通情報を表示することができます。

なに!? おい、いきなりかよ。ふざけてますね。

>NID Cookie には、Google がユーザーの設定やその他の情報を記憶するのに使用する固有の ID が含まれます。記憶される情報には、ユーザーが選択した言語(たとえば英語)、ユーザーが 1 ページあたりに表示したい検索結果数(10、20 など)の設定、Google のセーフサーチ フィルタのオン / オフといった情報などがあります。

まじかよ!?
NIDは2つ入っています。
1. NID 127=RASBLTX__yDZrm9CC……
.gstatic.com 2018-10-09T02:11:21.013Z
2. NID 127=yiliHW1r-Yfr1NUQjvE0UlnO9PjN……
2018-10-07T09:41:22.364Z

>「SID」と「HSID」という名前の Cookie を使用しています。これらの Cookie には、ユーザーの Google アカウント ID や、直近のログイン時刻が、デジタル署名され、暗号化されたレコードとして含まれています。Google は、この 2 つの Cookie を組み合わせることによって、ユーザーがウェブページ上で入力したフォームの内容を盗もうとする試みなど、多くの種類の攻撃をブロックすることができます。

3.SID 8gXaSOKMsnPz_Eywsv….2020-03-30T13:39:47.177Z
4.SSID AkNhgwBjTvblt… 2020-03-30T13:39:47.177Z
5.HSID AgbwaP…. 2020-03-30T13:39:47.177Z

>Google の使用している「lbcs」と呼ばれる Cookie によって、Google ドキュメントでは 1 つのブラウザで多くのドキュメントを開くことができます。

これはgoogle topにはありませんね。

>NID、SID などの Cookie を使用して、Google 検索などの Google サービスに表示される広告のカスタマイズを行っています。たとえば、このような Cookie を使用して最近の検索、広告主の広告や検索結果に対するこれまでの反応、広告主のウェブサイトへのアクセスを保存しています。これにより、カスタマイズされた広告を Google 上でユーザーに表示することができます。

あれ、SIDって、アカウントIDでは?

また Google は、ウェブで配信する広告にも一つまたは複数の Cookie を使用しています。Google 以外のサイトの場合、主な広告 Cookie の一つは「IDE」という名前であり、ブラウザで doubleclick.net ドメインの下に保存されます。google.comには別のCookieが保存され、ANIDという名前となっています。Google では他にも、DSID、FLC、AID、TAID、exchange_uid といった名前の Cookie も使用しています。YouTube などの他の Google サービスも、こうした Cookie を使用してより関連性の高い広告を表示する場合があります。

IDEもANIDもgoogle.co.jpではセットされていません。が、ここは今回のテーマであります。

Google では「AID」や「DSID」、「TAID」という Cookie も使用します。これらの Cookie は、ユーザーが別の端末で Google アカウントにログイン済みの場合に端末間でユーザーのアクティビティをリンクするために使うものです。Google はこのように Cookie を利用して、各端末でユーザーに表示される広告を調整したり、コンバージョン イベントを測定したりします。

結論、cookieは超絶重要!ってことはわかったが、具体的にはどういうことだ?
cookieのvalueをサーバー側で持っておいて、ユーザーが訪問してきたら、setされたcookieを読み込んで、サーバー側で処理しているってことか?

重要そうなところを見ると、

>最近の検索、広告主の広告や検索結果に対するこれまでの反応、広告主のウェブサイトへのアクセスを保存しています。これにより、カスタマイズされた広告を Google 上でユーザーに表示することができます。

cookieのvalueと挙動を全部保存している、ってことか?

cookieの種類も沢山あるので、cookieごとに一つ一つ分割して考えていった方が早そうですね。。あーなんかショックだわー。しかし、これテーマが大きくて、どっから手を付けていいかいまいち良くわかりませんね。。一番馴染みのある”_ga”からいきましょうか。

スマホでの横スクロールを滑らかにする

対象のセレクタに-webkit-overflow-scrolling: touch; を追加すると、スクロールした際になめらかな動きになります。

.profile-area{
	-webkit-overflow-scrolling: touch;
	overflow: auto;
	white-space: nowrap; 
}

※jQueryで調べてしまいました。。

navbar-fixed-topが効かない!?

Navbar最上部固定ですが、bootstrap4ではbootstrap3から仕様が変更となり、navbar-fixed-topは効きません。

navbar-fixed-topではなく、fixed-topを使います。

<nav class="navbar navbar-expand-lg navbar-light bg-light fixed-top">

css側では、margin-top:70px;を設定します。

body {
	margin-top:70px;
}

スクロールしても固定されるようになりました。

キャッ~

ヘッダーにbootstrapを使う

bootstrapcdnから、cssのパスを取得します。
https://www.bootstrapcdn.com/

https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css

cdn読み込みを書きます。

<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />

documentのnavsを参考に当てはめていきます。
http://getbootstrap.com/docs/4.0/components/navs/

<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" href="">管理画面</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarText">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="#">予約状況 <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">予約入力</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">出欠勤登録</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">予約実績</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">個別データ</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">IPアドレス管理</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" href="#">スタッフ管理</a>
      </li>
    </ul>
    <ul class="nav justify-content-end">
    <li class="nav-item">
    	<a class="nav-link disabled" href="#">ログアウト</a>
  	</li>
    </ul>
  </div>
</nav>
hogehoge

初期

bootstrap使用後

非常に良い!

sp版ではみ出たtableをスクロールさせる

tableをdivタグで囲って、以下のように、overflow:auto;とwhite-space:nowrap;を設定します。
html

<div id="id_name">
<table>
</table>
</div>

css

#id_name{
	overflow: auto;
	white-space: nowrap; 
}

すると、他のコンテンツは崩れず、tableだけ横にスクロールできます。

knocks its down!

tableの左側のみ背景色をつける

html

<div class="confirm">
<table>
<tr><td>お名前</td><td>hogehogehoge様</td></tr>
<tr><td>メールアドレス</td><td>hogehogehoge</td></tr>
<tr><td>ご予約日付</td><td>hogehogehoge</td></tr>
<tr><td>時間</td><td>hogehogehoge</td></tr>
<tr><td>コース</td><td>hogehoge</td></tr>
<tr><td>担当</td><td>hogehogoehogehoge</td></tr>
</table><br>
</div>

tr tdが左側、td+tdが右側になります。

.confirm table,.confirm td,.confirm th {
border-collapse: collapse;
border: 1px solid #CCCCCC;
}
.confirm tr td{
	width:180px;
	padding-left:15px;
	background-color:#BAD3FF;
}
.confirm td+td{
	width:600px;
	background-color:#fff;
}

border-collapse: separateの左右の余白

divタグの横並びで、border-collapse: separateを使った際に、囲ったエリアにborder-spacingを使うと、左右に余白ができてしまいます。

.class_areaname{
	border-collapse: separate;
	border-spacing: 5px 0; 
}
.class_name{
        display: table-cell;
}

そのため、各cell(divタグ)の方に、padding-right:;を設定すれば、左揃えになります。

.class_areaname{
	border-collapse: separate;
}
.class_name{
        display: table-cell;
        padding-right:5px;
}

右だけ余白ができました。

table tdの中のlinkのcss

1.table tdのcssは

td {
  write something;
}

2. table td にclassを付けた場合

<td class="selected">hoge</td>

cssは、

td.selected {
   write something;
}

3.table tdの中にlink(aタグ)のcss

td a{
  write something;
}

4.table classを付けたtdの中のlink(aタグ)のcss

<td class="selected"><a href="?param=hoge">foo</a></td>

cssは

td.selected a{
  write something;
}

下のキャプチャのように、classをつけているtdの中のaタグのcolorを#fffにできました。

予約数と予約時間を2軸でchart.jsで表示する

php側
1.DBから取得した予約データで、時間は+=,予約数は++で連想配列をつくる
2.array_multisortで時間の多い順に連想配列をソート
3.jsに値を渡す

$i = 0; 
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
	if($year == substr($result['day'], 0, 4) && $month == substr($result['day'], 7, 2)){
		$charge = $result['charge'];
		$book[$charge]['course'] += $result['course'];
		$book[$charge]['count']++;
		$total += $result['course'];
		$i++;
	} 
}

foreach($book as $key => $value){
	$time[$key]["course"] = $value["course"];
}
array_multisort($time, SORT_DESC, $book);

foreach($book as $key => $value){
	$name_list[] = $key;
	$time_list[] = $value["course"];
	$count_list[] = $value["count"];
}

chart.js
オプションで、左右の軸を指定する
tickのmaxは配列の中の最も大きい数 x N とする
Math.max.apply(null, array)*N

ただし、javascriptの IEEE 754の計算だと、誤差が生じることがある
例 Math.max.apply(null, array)*1.1 = 90.00000000000001(!?)
IEEE 754は、2進法計算だかららしい。※wikipediaを読んだが、何故二進法だと誤差が出るのかは私の頭では理解不能


そのため、 Math.floor(Math.max.apply(null, array)*N) として、小数点以下切り捨て

var name_arr = JSON.parse('<?php echo $name_l; ?>');
var time_arr = JSON.parse('<?php echo $time_l; ?>');
var count_arr = JSON.parse('<?php echo $count_l; ?>');
var ctx = document.getElementById("BarChart");
var BarChart = new Chart(ctx, {
	type: 'bar',
	data:{
		labels:name_arr,
		datasets:[{
			label:'予約時間',
			data: time_arr,
			backgroundColor: "rgba(255,136,86,0.8)",
			yAxisID: "y-axis-1",
		},{
			label:'予約数',
			data: count_arr,
			backgroundColor: "rgba(54,264,235,0.4)",
			yAxisID: "y-axis-2",
		}]
		},
		options:{
			responsive: true,
			scales:{
				yAxes:[{
					id: "y-axis-1",
					type: "linear",
					position: "left",
					ticks:{
						max: Math.floor(Math.max.apply(null, time_arr)*1.1),
						min:0,
						stepSize: 30
					}
				},{
					id: "y-axis-2",
					type: "linear",
					position: "right",
					ticks:{
						max: Math.max.apply(null, count_arr)+1,
						min:0,
						stepSize: 1
					}
				}],
				
			}
		}
		
});

結果:今月

翌月