ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
OS / 環境判定が必要になるケース
- パス区切り(Windows
\vs Unix/)の調整 - 外部コマンド呼び出し(
wherevswhich、cmd /cvssh -c) - 改行コード(CRLF / LF)の正規化
- 開発環境とプロダクションで挙動を分ける(ログ詳細度、メール送信先など)
- CI でだけスキップしたいテスト
PHP での環境判定
<?php
// === OS 判定(PHP 7.2+ 推奨) ===
echo PHP_OS_FAMILY; // "Windows" / "Linux" / "Darwin" / "BSD" / "Solaris" / "Unknown"
if (PHP_OS_FAMILY === 'Windows') {
$cmd = 'where php';
} else {
$cmd = 'which php';
}
// === 古い PHP / 詳細情報 ===
echo PHP_OS; // "WINNT" / "Linux" / "Darwin"
echo php_uname('s'); // OS 名
echo php_uname('r'); // カーネルバージョン
echo php_uname('m'); // x86_64 / arm64 等
echo DIRECTORY_SEPARATOR; // "\" or "/"
echo PATH_SEPARATOR; // ";" or ":"
// === SAPI(実行形態) ===
echo PHP_SAPI; // "cli" / "apache2handler" / "fpm-fcgi" / "cli-server"
if (PHP_SAPI === 'cli') {
// CLI からの呼び出しのみ実行
}
// === PHP バージョン分岐 ===
if (PHP_VERSION_ID >= 80100) {
// PHP 8.1 以上の機能を使う
}
// === 環境変数で分岐(最も安全) ===
$env = getenv('APP_ENV') ?: 'production';
if ($env === 'local' || $env === 'development') {
error_reporting(E_ALL);
ini_set('display_errors', '1');
}
Laravel の環境判定
<?php
// .env の APP_ENV=local / staging / production を判定
// 単純比較
if (app()->environment('local')) {
// ローカルだけのデバッグ処理
}
// 複数チェック
if (app()->environment(['local', 'staging'])) {
// 開発系全般
}
// 本番のみ
if (app()->environment('production')) {
Mail::to($realUser)->send(new WelcomeMail());
} else {
// 開発中はテスト用宛先へ
Mail::to('dev@example.com')->send(new WelcomeMail());
}
// Blade 内
// @env('local')
// <script src="/dev-only.js"></script>
// @endenv
// @production
// <!-- Google Analytics タグ -->
// @endproduction
JavaScript (ブラウザ) での環境判定
// === User-Agent ベース(非推奨だが古典的) ===
const ua = navigator.userAgent;
const isIOS = /iPad|iPhone|iPod/.test(ua);
const isAndroid = /Android/.test(ua);
const isMac = /Macintosh|Mac OS/.test(ua);
const isWin = /Windows/.test(ua);
// === navigator.platform(非推奨だが現役) ===
console.log(navigator.platform);
// "Win32" / "MacIntel" / "Linux x86_64" / "iPhone" / "iPad"
// === User-Agent Client Hints(Chromium 系の新 API) ===
if (navigator.userAgentData) {
console.log(navigator.userAgentData.platform); // "Windows" / "macOS" / "Android"
console.log(navigator.userAgentData.mobile); // true / false
console.log(navigator.userAgentData.brands);
// [{brand:"Chromium",version:"120"}, ...]
}
// === タッチデバイス判定 ===
const isTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
// === ダークモード判定 ===
const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
// === 画面サイズ / ブレークポイント ===
const isMobile = window.matchMedia('(max-width: 768px)').matches;
Node.js での環境判定
// === プラットフォーム ===
console.log(process.platform);
// "win32" / "linux" / "darwin" / "freebsd" / "openbsd" / "sunos" / "aix"
console.log(process.arch);
// "x64" / "arm64" / "ia32"
// 分岐例
const isWindows = process.platform === 'win32';
const cmd = isWindows ? 'npm.cmd' : 'npm';
// === Node.js バージョン ===
console.log(process.versions.node); // "20.10.0"
const [major] = process.versions.node.split('.').map(Number);
if (major < 18) {
throw new Error('Node.js 18+ required');
}
// === 環境変数(最重要) ===
const env = process.env.NODE_ENV || 'development';
if (env === 'production') {
// 本番のみ
}
// === CI 判定 ===
if (process.env.CI === 'true') {
console.log('Running in CI');
}
if (process.env.GITHUB_ACTIONS) { /* GitHub Actions */ }
if (process.env.GITLAB_CI) { /* GitLab CI */ }
if (process.env.CIRCLECI) { /* CircleCI */ }
主要 CI の検知用環境変数
| CI / プラットフォーム | 判定用環境変数 |
|---|---|
| 汎用 | CI=true |
| GitHub Actions | GITHUB_ACTIONS=true / GITHUB_RUN_ID |
| GitLab CI | GITLAB_CI=true / CI_JOB_ID |
| CircleCI | CIRCLECI=true |
| Jenkins | JENKINS_URL / BUILD_NUMBER |
| Travis CI | TRAVIS=true |
| Azure Pipelines | TF_BUILD=True |
ベストプラクティス
- OS 判定よりも環境変数で分岐するほうが移植性が高い
- UA Sniffing は壊れやすい → Feature Detection(その API が存在するかを直接調べる)を優先
- PHP/Node 共に
.envを git にコミットしない。.env.exampleを雛形に - テスト用にモック可能な層に抽象化(
Platform::isWindows()のようなラッパー関数)
FAQ
Q: PHP_OS_FAMILY と PHP_OS の違い
A: PHP_OS_FAMILY は Windows / Linux / Darwin / BSD / Solaris / Unknown の カテゴリ。PHP_OS は WINNT / Linux / Darwin 等の詳細。分岐目的では PHP_OS_FAMILY が便利。
Q: navigator.userAgent は信頼できる?
A: 偽装可能で、ブラウザ更新でフォーマットが変わるため信頼度は低い。代替として Client Hints (navigator.userAgentData) と Feature Detection を組み合わせるのが現代的です。
Q: CI でだけテストをスキップしたい
A: process.env.CI や getenv("CI") でガード。PHPUnit なら @group ci-skip + --exclude-group ci-skip。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- インストールと設定
- クイックスタート & チュートリアル(初心者向け)
- クイックスタート & チュートリアル(中級者向け)
- ルーティング
- Bladeテンプレート(ビュー/レイアウト)
- コントローラー
- マイグレーションとテーブル定義
- データベースの設定
- Eloquentモデル (ORM)
- SQLとクエリビルダー
- バリデーション
- .envファイルの設定値へのアクセス
- 動作環境による分岐処理
- configフォルダ配下の設定値へのアクセス
- assetヘルパーを利用したpublicフォルダへのアクセス
- storageフォルダへのアクセス
- アプリケーション名の変更
- メンテナンス
- ログイン画面(認証システム)の作成
- ログインの必須化
- ログインユーザー情報の取得
- ルートの認証化
- 本番サーバーへのデプロイ方法
- 多言語化
- csrf_field
- ファイルのダウンロード
- CSVのアップロードおよび読み込み(maatwebsite/excel)
- ページタイトルの設定
- コマンド一覧
- エラー一覧
- SQLの実行ログ出力方法
- キャッシュのクリア
- Selectの結果の最初もしくは最後に任意の値を追加する方法
- ajaxでPOST通信する際の注意点
- ソーシャルログインの実装
- セッション情報の確認
- ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
- redirectやreturn viewにメッセージを付与する方法
- クッキー(cookie)の設定と取得
- クラスの再読み込み
- csrfの有効時間を変更する方法
- ViewComposerを用いてviewに共通の値を付与する方法
- View::shareを用いて共通の値を各ビューに渡す方法
- ミドルウェアを用いた処理の共通化
- Middleware内でAuth::check()などを使用する方法
- Controller以外でリダイレクトする方法
- セッションの値の取得/保存/更新/削除
- $requestの値を変更する方法
- 常時SSL化
- ページング(ページネーション)をする方法
- vue.jsとの連携
- Vue.jsと連携するSPA実行環境構築
- .envの値をvue.jsで参照する方法
- vue.jsを本番環境にリリースする方法
- could not find driver(Windows, MySQL編)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?