ゆう's Blog
NodeListとオブジェクトのプロパティ

const videos = document.querySelectorAll('video');

const videos = { video1: document.getElementById('video1'), video2: document.getElementById('video2'), video3: document.getElementById('video3'), };

1. const videos = document.querySelectorAll('video'); の場合
取得方法:
このコードはすべての<video>要素をNodeListとして取得します。
NodeListは配列のように動作し、インデックス(videos[0]など)を使って各<video>要素にアクセスできます。
特徴:
動的に動画の数が増えたり減ったりしても対応可能です。例えば、新たに<video>タグを追加しても、このコードで取得できます。
ループ処理(forEachなど)に適しており、簡単に全ての動画を操作できます。

2. const videos = { video1: document.getElementById('video1'), ... }; の場合
取得方法:
このコードは特定の<video>要素をオブジェクトのプロパティとして格納します。
動画を明示的に識別し、プロパティ名(videos.video1など)でアクセスできます。
特徴:
動的ではなく、手動で<video>要素を管理する形になります。例えば、新しい動画を追加するたびに、このオブジェクトにプロパティを追加する必要があります。
直接的に管理するため、動画の名前(IDなど)を使って識別しやすくなります。

違いまとめ
特性querySelectorAllオブジェクト (videos)
対象の取得方法<video>タグ全体を一括取得明示的にIDを指定して取得
動的な対応動画の数が変わっても柔軟動画を増やしたら手動で追加入力が必要
アクセス方法インデックスで参照 (videos[0])キーで参照 (videos.video1)
ループ処理との相性適している手動管理に向いている
ブラウザでのアクセスのみカウントアップ。

<script> function getCookie(name) { const cookies = document.cookie .split(';') // セミコロンで分割 .map(cookie => cookie.trim()); // 各クッキーをトリムして余分なスペースを削除 const targetCookie = cookies.find(cookie => cookie.startsWith(`${name}=`)); return targetCookie ? targetCookie.split('=')[1] : null; // 指定したクッキー名の値を取得 } const browserChecked = getCookie("browser_checked"); if (!browserChecked) { fetch(`check_browser.php?_=${new Date().getTime()}`, { method: "POST" }) .then(response => console.log("ブラウザ確認完了")) .catch(error => console.error("エラー:", error)); document.cookie = "browser_checked=1; max-age=3600; path=/"; } </script>

ブラウザキャッシュの影響
リクエストがキャッシュされていて、サーバーがリクエストを認識しない可能性があります。
対処法: リクエストURLにタイムスタンプを追加することでキャッシュを回避します。

check_browser.php

<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // カウンター更新処理 echo "ブラウザからのアクセスと確認されました。"; } ?>

Google Cloud Platform (GCP)への登録時に必要なクレジットカード

バーチャルカードは使用不可: Google Cloudでは、バーチャルクレジットカード(VCC)の使用が禁止されています。多くのユーザーが報告しているように、バーチャルカードを使用してアカウントを作成しようとすると、アカウントが即座に停止されることがあります。

実際のクレジットカードが必要: GCPの無料トライアルに登録する際には、実際のクレジットカードが必要です。これは、本人確認や支払いのために必要な手続きです。バーチャルカードやプリペイドカードは受け付けられないため、注意が必要です。

他の支払い方法: もしクレジットカードを持っていない場合、法人向けには請求書払いなどのオプションもありますが、個人の場合は通常のクレジットカードが必要です。

robots.txt

User-agent: * Disallow: /login/ Disallow: /admin/ Disallow: /confidential.pdf Sitemap: https://www.example.com/sitemap_index.xml

sitemap.xml

https://wave.stars.ne.jp/blog/yuu/ member - blog_dir cbt_post_12 - post_id, post_cat, post_status, post_unixtime post_status = 1 & post_unixtime < now cbt_setting_12 - top_page = 1 なら post_cat = 2以外 cbt_setting_12 - top_page = 2 なら post_cat = 2含めて全部

テーブル: cbt_post_12 post_id post_status = 1 post_unixtime < now

<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://wave.stars.ne.jp/blog/yuu/</loc> </url> <url> <loc>https://wave.stars.ne.jp/blog/yuu/entry.php?id=190</loc> </url> </urlset>

サイトマップインデックス

<?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemap> <loc>https://wave.stars.ne.jp/sitemaps/sitemap1.xml</loc> </sitemap> <sitemap> <loc>https://wave.stars.ne.jp/sitemaps/sitemap2.xml</loc> </sitemap> </sitemapindex>

Cookieの設定、削除をチェックボックス(JavaScript)で行い、取得をPHPで。

document.cookie = "userType=admin; path=/blog/yuu/; expires=Fri, 09 May 2025 12:00:00 UTC"; document.cookie = "userType=; path=/blog/yuu/; expires=Thu, 01 Jan 1970 00:00:00 UTC"; <?php if (isset($_COOKIE["userType"])) { echo "Cookieの値: " . $_COOKIE["userType"]; } else { echo "Cookieが存在しません。"; } ?> <label> <input type="checkbox" id="cookieCheckbox"> 管理者モード </label> document.getElementById("cookieCheckbox").addEventListener("change", function() { const isChecked = this.checked; if (isChecked) { // チェックされている場合にCookieを設定 document.cookie = "userType=admin; path=/; expires=Fri, 09 May 2025 12:00:00 UTC"; console.log("Cookieを設定しました!"); } else { // チェックが外された場合にCookieを削除 document.cookie = "userType=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC"; console.log("Cookieを削除しました!"); } });

IP2Location.io

IP2Location.io

$ch = curl_init('https://api.ip2location.io/?ip=8.8.8.8'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $json = curl_exec($ch); curl_close($ch); $api_result = json_decode($json, true); echo '<pre>'; var_dump($api_result); echo '</pre>';

APIキーなしでも動作するが、1日あたり1,000件のクエリに制限される。
無料プランに登録するとAPIキーを取得でき、1か月あたり5万件のクエリを利用できる。

集計関数
集計関数用途
COUNT項目のデータ件数を取得する
SUM項目のデータ合計値を取得する
AVG項目のデータ平均値を取得する
MAX項目のデータ最大値を取得する
MIN項目のデータ最小値を取得する

<table style="margin: 1em auto;">

アクセス解析

// tracking.php // 訪問データの取得 $ip = $_SERVER['REMOTE_ADDR']; $page = $_SERVER['REQUEST_URI']; $time = date('Y-m-d H:i:s'); $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; $user_agent = $_SERVER['HTTP_USER_AGENT']; // ここでデータベースへの接続および記録処理を行います try { $pdo = new PDO('mysql:host=ホスト名;dbname=データベース名', 'ユーザー名', 'パスワード', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]); $stmt = $pdo->prepare("INSERT INTO access_logs (ip, page, access_time, referrer, user_agent) VALUES (?, ?, ?, ?, ?)"); $stmt->execute([$ip, $page, $time, $referrer, $user_agent]); } catch (PDOException $e) { error_log("DBエラー: " . $e->getMessage()); }

echo substr('abcdef', 0, 8); // abcdef

文字数,バイト数を確認

// 絵文字制限(例: VARCHAR(30)) $maxLength = 30; $maxBytes = $maxLength * 4; // 文字数,バイト数を確認 if (mb_strlen($_POST['text'], 'UTF-8') > $maxLength || strlen($_POST['text']) > $maxBytes) { $error = "文字数またはバイト数がオーバーしています。"; }