GNUとUnixのコマンド

コマンドラインの操作

シェル

入力されたコマンドを受け付け、対応するプログラムを実行しているプログラムをシェルといいます。

シェル変数

変数を設定したシェル上でのみ有効な変数です。

exportコマンド

シェル変数を環境変数に変更します。

操作シェル変数環境変数
設定変数名=値export 変数名
export 変数名=値
declare -x 変数名=値
表示setenv
削除unset 変数名unset 変数名

環境変数

シェル上に加えてそのシェル上で起動した子プロセス(アプリケーション、コマンド)でも有効です。

シェルの種類やコマンド検索のパス等、動作に影響する設定値です。

HISTFILEコマンド履歴保存ファイルのパス
HISTSIZE現在のシェルでのコマンドの保存数
HOMEログインしているユーザのホームディレクトリ
PATHコマンドやプログラムを検索するディレクトリのリスト
PWDカレントディレクトリのパス

引用符

「’」シングルクォーテーション

文字列と解釈

「”」ダブルルクォーテーション

文字列と解釈し、変数を展開します。

またバッククォーテーションが使われている場合、その中も展開されます。

「\」バックスラッシュ

バックスラッシュ直後の文字は文字列と解釈され、展開されません。

バックスラッシュは文字とよばれます。

「`」バッククォーテーション

コマンドは実行結果が展開されます。

メタキャラクタ

シェルによって特別に解釈される文字をメタキャラクタといいます。

メタキャラクタ
*0文字以上の文字列
?任意の1文字
[][~] 内の任意の1文字
[!~] 以外の任意の1文字

フィルタを使ったテキストストリームの処理

cat

ファイルの内容を標準出力に出力します。concatenate ( つなぐ、連結する )

-n –number各行の左に番号を付与

od

バイナリーファイルを8進数や16進数で表示します。(デフォルトは8進数)

-t -format 出力ファイル出力するフォーマットを指定
出力タイプ
cASCⅡ文字
o8進数(デフォルト)
t16進数

paste

1つ以上のファイルを読み込み、行ごとに水平方向に連結します。

区切り文字はデフォルトでタブ

-d 区切り文字区切り文字を指定(デフォルトはタブ)

paste [ オプション ] ファイル名1 ファイル名2 …

join

2つのファイルを読み込んで、共通のフィールドを持つ行どうし連結します。

join [ オプション ] ファイル名1 ファイル名2

-j フィールド連結するフィールドを指定

fmt

テキストを1行あたり決められた桁数に整形します。

-w 1行の文字数を指定

ストリーム、パイプ、リダイレクトの使用

リダイレクト

通常コマンドの実行結果は画面上に表示されますが、リダイレクトは実行結果をファイルに保存したり、用意しておいたファイルに使用する場合に使います。

コマンド>ファイルコマンドの標準出力をファイルに書き込む
コマンド<ファイルファイルの内容をコマンドの標準入力に送る
コマンド>>ファイルコマンドの標準出力をファイルに追記
コマンド<<終了文字終了文字が現れるまで標準入力へ送る
コマンド1|teeファイル|コマンド2コマンド1の出力結果をコマンド2の標準入力に渡し、併せてファイルに書き込む

tee

teeコマンドは標準入力の内容を、Tの字のように、標準出力先とファイルの両方に出力するコマンドです。

通常、|(パイプ)と使用します。コマンドの標準出力をteeコマンドの標準入力に渡します。

コマンド | tee ファイル

xargs

あるコマンドの出力を、別のコマンドの引数として実行します。

正規表現を使用したテキストファイルの検索

正規表現

.任意の1文字
*直前の文字列の0回以上の繰り返し
[][]内の1文字、-は範囲指定、^は後続の文字列以外
^行頭
$行末
\次の文字をエスケープ(通常の文字として処理)
+直前の文字を1回以上繰り返し
?直前の文字を0、1回の繰り返し(拡張正規表現)
|左右どちらかの文字列(拡張正規表現)

grep

検索文字列があるかどうか調べます。

-c –countマッチした行数を表示
-f –file検索パターンをファイルから読み込む
-i –ignore-case大文字小文字区別しない
-n –line-number併せて行番号も取得
-v –invert-matchマッチしない行を表示
-E –extended-regexp拡張正規表現を使用(egrepと同様)
-F固定文字列とする(fgrepと同様)

sed

stream editor

オプション
-f ファイルコマンドに書かれたスクリプトファイルを指定
-i処理した内容でファイルを上書き
-e編集コマンドを指定(1つの場合省略可能)
sed オプション -e 編集コマンド1 -e 編集コマンド2 ファイル名
sコマンド(置換)
s/文字列1/文字列2/各行の最初に現れる文字列1を文字列2に置換
s/文字列1/文字列2/gすべての文字列1置換
s/文字列1/&を含む文字列2/&に文字列1を再利用
dコマンド(置換)
/文字列/d文字列が含まれる行を削除
行番号1,行番号2d行番号1から行番号2までの行を削除

エディタを使った基本的なファイル編集の実行

viエディタ

テキストファイルを編集するときに使います。

viの起動直後はコマンドモードになっています。

vi [-R] [ファイル名]
-Rオプションは読み取りモード、ファイル名を指定しなければ空の新規ファイルを作成します。

入力モード

iカーソルのある位置の左から入力 insert
aカーソルのある位置の右から入力 append
Iカーソルのある行の先頭から入力
Aカーソルのある行の末尾から入力
0カーソルのある行の上に空白行を挿入し、その行で文字を入力します。
oカーソルのある行の下に空白行を挿入し、その行で文字を入力 open line

カーソル操作

h
l
k
j
O行の先頭へ移動
$行の末尾へ移動
H画面の一番上の行頭へ移動
L画面の一番下の行頭へ移動
ggファイルの先頭行へ移動
Gファイルの最終行へ移動
nG
:n
ファイルのn行目に移動

編集コマンド

yy Y (yank)行をバッファにコピーします。コマンドの直前に数字を付けると、その回数分viコマンドが繰り返されます。
yw(word)カーソル位置の単語をコピーします。
ddカーソル位置の行を削除し、バッファにコピー
dw(dlelete word)カーソル位置から次の単語までを削除し、バッファにコピー
xカーソル位置の文字を削除し、バッファにコピー
Xカーソル位置の左の文字を削除し、バッファにコピー
p(paste)バッファの内容を挿入します。文字はカーソルの右、行はカーソルの下に挿入されます。
Pバッファの内容を挿入します。文字はカーソルの左、行はカーソルの上に挿入されます。
u直前の操作をキャンセル

:r 指定したファイルの内容をカレント行の後に読み込んで挿入する

viエディタの終了、保存

:q(quit)viを終了します、内容が変更されている場合警告が表示されます。
:q!強制終了します。
:w編集内容を保存
:wq 😡 ZZ編集内容を保存し、終了
:wq!編集内容を保存し、強制終了
:e ファイル名viを終了せず、現在のファイルを閉じて別ファイルを開く
内容が変更されている場合はファイルを開くことができない
:e! ファイル名viを終了せず、現在のファイルを閉じて別ファイルを開く

ファイル名を省略した場合、最後に保存した状態に戻す

cat

od

sed

head

tail

cut

paste

ハードウェア、ディスク、パーティション、ファイルシステム

ハードウェアの基礎知識と設定

基本的なシステム、ハードウェア

CPU

コンピュータの中心的な処理装置、Linuxは多くのCPUに対応している。

メモリ

コンピュータ内でデータを記憶する装置(メインメモリ、主記憶)です。電源が切れるとメモリの内容は消失します。

Linuxを動作させるには512Mバイト~1Gバイト程度以上のメモリが推奨。

ストレージ

大きなサイズのデータや、長期の保存はストレージを使います。

  • ハードディスク(HDD:Hard Disk Drive)‥磁気ディスクに記憶する
  • SSD(Solid State Drive)‥フラッシュメモリに記憶する

SATA(Serial ATA)現在主流の企画

SAS(Serial Attached SCSI)SATAより高速、高信頼で高価。

BIOS

マザーボードに搭載されているプログラムです。

(Basic Input Output System:入出力基本システム)

UEFI

現在ではBIOSの後継となるファームウェア規格のUEFI(Unified Extensible Firmware Interface)が普及している。

カーネルモジュール

カーネルモジュールとは、カーネルで扱う色々な機能を独立したパーツのようなものです。

insmod

insmodカーネルモジュールをロードするコマンドです。

modprobe

依存関係を考え、カーネルモジュールをロード、アンロードするコマンドです。

rmmod

rmmodコマンドは依存するモジュールは削除せず、指定したモジュールだけを削除します。

依存関係を考慮してカーネルモジュールをアンロードする場合は、modprobe -r (–remove)を使用します。

USBデバイス

  • HID(human interface device)‥キーボード、マウス
  • Mass Storage Class‥ハードディスク、USBメモリ
  • ACM Communication Device Class‥モデム、TA
  • Audio Class‥スピーカー、マイク

udev

udev(Userspace DEVice management)によって/devディレクトリ以下のデバイスファイルは自動的に作成されます。

/procディレクトリ

/procディレクトリ以下のファイルは、実体のない仮想ファイルです。テキストファイルです。

/proc/cpuinfo

CPUの情報は/proc/cpuinfoで確認できます。

/proc/scsi/scsi

SCSIデバイスの情報は/proc/scsi/scsiファイルで確認できます。

/proc/meminfo

メモリの使用状況は/proc/meminfoファイルでみることができます。

/proc/dma

デバイスが使用中のDMAチャネルの情報は/proc/dmaファイルでみることできます。

lsusb

lsusbは接続されたUSBデバイスの情報を表示するコマンドです。

lspciコマンド

lspci [オプション]

-v 詳細表示(-vvでさらに詳細)

  1. PCI識別番号
  2. PCIデバイスの種類
  3. ベンダー名、ベンダーID
  4. デバイス名
  5. バスの速度(詳細表示のみ) 
  6. IRQ番号(詳細表示のみ) 
  7. I/Oポートアドレス(詳細表示のみ)

PCI

PCI‥Peripheral Components Interconnect

PCIデバイスにはネットワークカード(NIC:Network Interface Card)などがあります。

D-Bus

Desktop Bus

Linuxで使われるプロセス間通信機構でアプリケーション間のやり取りを行います。

ファイルシステムの作成と管理

ハードディスクのレイアウトとパーティション

lvm

Logical Volume Manager … 論理ボリューム管理

仮想的なパーティションを動的に管理する機能です。

  • 論理ボリュームは複数のディスクにまたがって作成可
  • スナップショット(ある時点の記録)を取得が可能
  • 後からボリュームグループのサイズを変更可能

パーティション管理コマンド

fdisk

パーティションの作成、削除、変更、情報表示

MBR方式に対応

-lオプション そのデバイスのパーティションテーブルの状態を表示します。

mサイドメニューの表示
lパーティションタイプの一覧表示
nパーティションの作成
dパーティションの削除
pパーティションテーブルの表示
tパーティションタイプ(システムID)の変更
w変更を保存して終了
q変更を保存せずに終了

gdisk

GPTに対応したパーティションのコマンドです。

parted

MBRにもGPTにも対応したコマンドです。

check簡単なチェックを行う
mklabel
MBR形式 msdos
GPT形式 gpt
パーティションテーブルの作成
mkpartパーティションの作成
rm 番号パーティションの削除
print pパーティションテーブルの表示
quit q終了する

ext2 Linux標準のファイルシステム

ext3 ext2にジャーナリングシステムを追加

ext4 ext3を機能拡張した

XFS Red Hat Enterprise Linux 7やCentOS 7で標準のファイルシステム

Btrfs

B-tree file system

Btrfsは、Linux向けの新しいファイルシステムです。

  • 複数の物理ボリュームにまたがりファイルシステムを作成できます(マルチデバイスファイルシステム)。
  • スナップショットを作成できます。
  • サブボリューム単位でのスナップショット機能があります。
  • ディレクトリの一部をサブボリュームとして個別のファイルシステムのように扱える

/tmp

「/tmp」ディレクトリは一時的なファイルを格納するディレクトリで、あらゆるユーザが書き込むことができます。また、格納されているファイルやディレクトリは再起動すると消去されます。

mountコマンド

マウントとはディスク装置をLinuxのディレクトリの配下に設定し使えるようにする作業をです。

-a 全てのファイルシステムをマウント

-t ファイルシステムのタイプを指定

unmountコマンド

My-Snow-Monkey使用例、子テーマによるカスタマイズ

CSSファイルの読み込み

My-Snow-Monkey プラグインをを有効化します

FTPソフト等で下記の構成に

wp-content/
├── plugins/
│   └── my-snow-monkey/          # My Snow Monkeyプラグインのフォルダ
│       ├── my-snow-monkey.php   # プラグインのメインファイル
│       └── assets/
│             └ style.css     # 読み込みたいcssファイル
│
└── themes/
    └── snow-monkey/            # Snow Monkeyテーマ本体

my-snow-monkey.phpで下記コード記載(追記)

// CSSファイルの読み込み
add_action(
	'wp_enqueue_scripts',
	function() {
		wp_enqueue_style(
            'my-snow-monkey',
		 MY_SNOW_MONKEY_URL . '/assets/style.css', // my-snow-monkeyフォルダのassets/style.cssの場合
            [ Framework\Helper::get_main_style_handle() ],
            filemtime( MY_SNOW_MONKEY_PATH . '/assets/style.css' )
		);
	}
);

assets/style.css

.l-header {
    background-color: #333;
    color: #fff;
}

下記のようにスタイルが反映されました

wp_enqueue_scripts

ユーザーが見るWebページにのみ出力されます。編集画面や管理画面には出力されません。

enqueue列に加えるというような意味

MY_SNOW_MONKEY_URL

 My Snow Monkeyで用意している定数。

My Snow Monkey の URL… My Snow MonkeyのURL

wp_enqueue_style()

  • WordPressではwp_enqueue_style()関数でファイルを読み込むことが推奨されています。
  • 基本的にフック(wp_enqueue_scripts等)を利用して読み込みます。
wp_enqueue_style( $handle, $src, $deps, $ver, $media )

$handle … スタイルのユニークな名前。
$src … スタイルシートまでのURL
$deps … 事前に読み込むべきスタイルの名前($handle)(配列形式)特に必要なければ、array()を記入(初期値はarray())
$ver … 最新のバージョンを読み込ませる(初期値はfalse)
$media … media属性 (初期値はall)

https://happy-snow-monkey.olein-design.com/how-to-add-and-style-css-files-from-my-snow-monkey

Snow MonkeyのブレイクポイントをCSSで書く場合


@media screen and (max-width: 1279px) {
// 1279px以下をここにかく
}
@media screen and (max-width: 1023px) { 
// 1023px以下をここにかく
}
@media screen and (max-width: 639px) {
// 639px以下をここにかく
}

jsファイルの読み込み

my-snow-monkey.phpで下記コード記載

add_action('wp_enqueue_scripts', 'msm_enqueue_style_script');
function msm_enqueue_style_script()
{
	/* js読み込み */
	wp_enqueue_script(
		'msm_scripts',
		MY_SNOW_MONKEY_URL . '/script.js', // my-snow-monkeyフォルダのscript.cssの場合
		['jquery'],
		filemtime(MY_SNOW_MONKEY_PATH . '/script.js'),
		true // バージョン
	);
}

wp_enqueue_script()

wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer )

$handle … スタイルのユニークな名前。
$src … スタイルシートまでのURL
$deps … 事前に読み込むべきスタイルの名前($handle)(配列形式)
$ver … バージョン。falseにしておけばWordPressが自動的にバージョン情報を入れてくれます。初期値はfalse
    ※原因はわかりませんが、falseでなくてfilemtime( MY_SNOW_MONKEY_PATH . '/js/script.js' )を記載しないと動かない場合あり
$in_footer … trueの場合</body>終了タグの前に配置される。 

【注意点】$を参照する方法

WordPressのjQueryを使う際、エラーを防ぐため下記のように変更する必要があります。

// 方法1
(function($) {
 // $()を使用可能
})(jQuery);

// 方法2
jQuery(function( $ ) {
  〜
} );
https://snow-monkey.2inc.org/forums/topic/jquery%e3%82%92%e8%bf%bd%e8%a8%98%e3%81%97%e3%81%9f%e3%81%84%e3%81%a7%e3%81%99%e3%80%82

head 要素内に独自のタグを追加

FontAwesomeの読み込み

// ------------------------------------------------
// FontAwesomeの読み込み
// ------------------------------------------------

add_action('wp_head', function () {
 ?>

  <!-- FontAwesome -->
  <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
 <?php
});

下記の公式サイトのギャラリーページで使いたいアイコンのhtmlをコピーして使います。

https://fontawesome.com/icons?d=gallery

Googleマテリアルアイコン

phone groups

my-snow-monkey.phpを編集します

// ------------------------------------------------
// Googleマテリアルアイコン
// ------------------------------------------------
add_action('wp_head', function () {
?>
//選択したアイコンのスタイルシート
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
<?php
});

下記のGoogleマテリアルアイコンで使いたいアイコンのhtmlをコピーして使います。

https://fonts.google.com/icons

疑似要素で使用する場合

my-snow-monkey.php

// Googleマテリアルアイコン
add_action('wp_head', function () {
	?>
	<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
	<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
	<?php
});
.recruit-features li {
    min-width: 34%;
    padding-left: 60px;
    position: relative;
    font-size: 1.125rem;
    font-weight: bold;
}

.recruit-features li::before {
    position: absolute;
    left: 0;
    top: 50%;
    transform: translateY(-50%);
    font-family: 'Material Icons';
    content: '\e92f';
    font-size: 2rem;
    line-height: 30px;
    width: 30px;
    height: 30px;
    background: var(--green2);
    border-radius: 50px;
}

文字の高さが合わないとき

<a>会社概要
<span class="material-symbols-outlined">chevron_right</span></a>

このような場合は以下のようにcssを

display: inline-flex;
align-items: center;

テンプレートのコメントアウト表示

ワードプレスをインストールしたディレクトリ?にあるwp-config.phpに以下のコードを追記、もしくは書き換えすることで可能です。

define( 'WP_DEBUG', true );

※ false → trueに

何のテンプレートパーツを読み込んでいるのかをHTML内のコメントアウトで確認出来て便利です。

テンプレートファイルの上書き

viewディレクトリにSnow Monkeyはテンプレートファイルを格納しています。

テンプレートを上書きするソースコード

<?php
add_filter(
	'snow_monkey_template_part_root_hierarchy',
	function( $hierarchy ) {
		$hierarchy[] = untrailingslashit( __DIR__ ) . '/view';
		return $hierarchy;
	}
);

add_filter

add_filter( フック名, 関数名, 優先順位, 引数の数 );

【ページのコンテンツ部分にファイルを出力したい】※ヘッダー、フッターはそのまま使用

テンプレートをmy-snow-monkey上に作成したファイル(※1)で上書きをし、特定のページIDの場合(※2)コンテンツ(html)をはく

※1子テーマの作成が不要

手順(1)プラグインmy-snow-monkeyのfunctions.phpを編集

// My Snow Monkey の中でテンプレートを追加できるようにする

// 参考 https://snow-monkey.2inc.org/manual/manual-advanced/add-template-root/

add_filter(
	'snow_monkey_template_part_root_hierarchy',
	function( $hierarchy ) {
		$hierarchy[] = untrailingslashit( __DIR__ ) . '/override';
		return $hierarchy;
	}
);

手順(2)上書き対象のテンプレートファイルを調べる

上記コメントアウト表示方法を参考

例としてコンテンツを上書きしてみます。

上書き前 snow-monkey/template-parts/content/entry/content/content.php

上書き後 my-snow-monkey/override/template-parts/content/entry/content/content.php

手順(3)上書きするのテンプレートファイルを作成

上書き前のファイルを内容をコピペ

例としてsnow-monkey/template-parts/content/entry/content/content.php

▼snow-monkey/template-parts/content/entry/content/content.php

<?php
/**
 * @package snow-monkey
 * @author inc2734
 * @license GPL-2.0+
 * @version 10.8.0
 */

use Framework\Helper;
?>

<?php do_action( 'snow_monkey_before_entry_content' ); ?>

<div class="c-entry__content p-entry-content">
	<?php do_action( 'snow_monkey_prepend_entry_content' ); ?>

	<?php the_content(); ?>
	<?php Helper::get_template_part( 'template-parts/content/link-pages' ); ?>

	<?php do_action( 'snow_monkey_append_entry_content' ); ?>
</div>

<?php do_action( 'snow_monkey_after_entry_content' ); ?>

▼my-snow-monkey/override/template-parts/content/entry/content/content.php

<?php
/**
 * @package snow-monkey
 * @author inc2734
 * @license GPL-2.0+
 * @version 10.8.0
 */

use Framework\Helper;
?>

<?php do_action( 'snow_monkey_before_entry_content' ); ?>

<div class="c-entry__content p-entry-content">
	<?php do_action( 'snow_monkey_prepend_entry_content' ); ?>

    <?php
    if ( is_page('8') ) {
        ?>
            <p>my-snow-monkey/override/template-parts/content/entry/content/content.phpです。</p>
            <p>※ページID8の場合使用されます。</p>
        <?php
    }
    ?>

	<?php Helper::get_template_part( 'template-parts/content/link-pages' ); ?>

	<?php do_action( 'snow_monkey_append_entry_content' ); ?>
</div>

<?php do_action( 'snow_monkey_after_entry_content' ); ?>

手順(複数のページの場合)さらにファイルを分割したほうがわかりやすい
require ‘ファイル名’;で呼び出す

my-snow-monkey/override/template-parts/content/entry/content/content.phpと同じディレクトリにrequireで呼び出すファイル用のディレクトリを作成します。(例:my-snow-monkey/override/template-parts/content/entry/content/require/id68.php)

▼my-snow-monkey/override/template-parts/content/entry/content/content.php

<?php
/**
 * @package snow-monkey
 * @author inc2734
 * @license GPL-2.0+
 * @version 10.8.0
 */

use Framework\Helper;
?>

<?php do_action( 'snow_monkey_before_entry_content' ); ?>

<div class="c-entry__content p-entry-content">
	<?php do_action( 'snow_monkey_prepend_entry_content' ); ?>

    <?php
    if ( is_page('68') ) {
        require 'require/id68.php';
    }
    ?>

    <?php
    if ( is_page('8') ) {
        require 'require/id8.php';
    }
    ?>

	<?php Helper::get_template_part( 'template-parts/content/link-pages' ); ?>

	<?php do_action( 'snow_monkey_append_entry_content' ); ?>
</div>

<?php do_action( 'snow_monkey_after_entry_content' ); ?>

▼my-snow-monkey/override/template-parts/content/entry/content/require/id68.php

<p style="color: blueviolet">my-snow-monkey/override/template-parts/content/entry/content/require/id68.php</p>
<p>※ページID68の場合使用されます。</p>です。

https://snow-monkey.2inc.org/manual/manual-advanced/template-hooks

https://snow-monkey.2inc.org/manual/manual-advanced/add-template-root

https://happy-snow-monkey.olein-design.com/preparing-to-overwrite-the-snow-monkey-template-file-from-my-snow-monkey

【ショートコード】編集画面で任意の場所にHTMLファイルを挿入

https://bizlabo.site/?p=1228

子テーマによるカスタマイズ

  • 子テーマによるカスタマイズは親テーマをバージョンアップしても、変更されません。
  • サイトの読み込み速度が遅くなる可能性があります。

Snow Monkey の子テーマとして設定

style.cssを編集する

/**
 * Template: snow-monkey
 * Theme Name: Snow Monkey Child
 */

親テーマ snow-monkeyの場合
cssの読み込みの設定

functions.phpを編集する

CSSでスタイルを当てないカスタマイズの場合は不要?

<?php
add_action( 'wp_enqueue_scripts', function() {
	wp_enqueue_style(
		get_stylesheet(),          //子テーマの名前を取得
		get_stylesheet_uri(),
		[ get_template() ]         //現在有効中のテーマ
	);
} );
wp_enqueue_style( $handle, $src, $deps, $ver, $media )

$handle … スタイルのユニークな名前。
$src … スタイルシートまでのURL
$deps … 事前に読み込むべきスタイルの名前($handle)(配列形式)
$ver … バージョン
$media … media属性 
 body {
    background-color: #ccc;
  }

エラー対応

ブロック読み込みエラー 返答が正しい json レスポンスではありません。

編集画面で下記表示になり更新できない

「ブロック読み込みエラー 返答が正しい json レスポンスではありません。」

解決方法

解決方法を検索したところ、レンタルサーバのWAF設定、プラグイン由来等いろいろ原因は考えられるようですが、結論my-snow-monkeyプラグインのmy-snow-monkey.phpの記述でコメントアウトの仕方がおかしい箇所をなおしたら解決しました。

参考:

https://snow-monkey.2inc.org/forums/topic/%E8%BF%94%E7%AD%94%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%84-json-%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82
Linuxのインストールと仮想マシン・コンテナの利用 – 基本概念から【実践的なdocker-composeコマンド】まで

仮想マシン・コンテナの概念と利用

コンテナ型仮想化とは

サーバ仮想化技術のひとつです。

コンテナの特徴(仮想マシンとの違い)

  • 高速な起動と停止が可能
  • OSカーネルを共有する軽量な仮想化
  • アプリケーションレベルの分離
仮想マシンとコンテナの比較 仮想マシン (VM) ホストOS 物理ハードウェア VM 1 アプリ1 ゲストOS 1 VM 2 アプリ2 ゲストOS 2 コンテナ Dockerエンジン ホストOS 物理ハードウェア Container 1 アプリ1 Container 2 アプリ2 • 完全なOSを含む • リソース消費が大きい • 起動に時間がかかる • OSカーネルを共有 • 軽量で高速 • リソース効率が良い

コンテナ技術を管理するソフトウェア

  • Docker(基本的なソフトウェア)…Docker社が開発したコンテナ仮想化を用いてアプリケーションの開発や実行する環境を構築できるプラットフォーム
  • Kubernetesクバネティス…Googleが開発したコンテナ運用管理を支援するオープンソースのソフトウェア

dockerコマンド

Docker基本コマンド一覧 コンテナのライフサイクル管理 docker run 新規コンテナの作成と起動 docker start/stop コンテナの起動/停止 docker kill コンテナの強制停止 docker rm コンテナの削除 docker ps コンテナ一覧表示 コンテナとの対話 docker attach 標準入出力に接続 docker exec コマンド実行 イメージ管理 docker pull イメージのダウンロード docker push イメージのアップロード docker images イメージ一覧表示

Dockerコマンド実行の前提条件

  1. Dockerデーモン(dockerd)が動作していること。
  2. コマンドを実行するユーザーがDockerグループに属していること(または管理者権限)。

docker-compose コマンドについても同様に、Dockerデーモンとユーザー権限が必要です。

docker run新しいコンテナを作成して起動する
イメージから新しいコンテナを作成し、指定されたコマンドを実行して起動する
docker start既存の停止したコンテナを再起動する
停止しているコンテナを起動するだけ(新しいコンテナは作らない)
docker stopコンテナを安全に停止
docker killコンテナを強制的に停止
docker ps実行中のコンテナの確認
# 停止中のコンテナを含めて確認
docker ps -a
docker rm <コンテナID>停止中のコンテナを削除
docker attachコンテナの標準入出力に接続
docker exec [オプション] <コンテナ名またはID> <コマンド>実行中のコンテナ内でコマンドを実行
docker pullDocker Hubからダウンロード
docker pushDocker Hubにアップロード
docker imagesイメージ一覧表示

Dockerfileとdocker-compose.ymlの違い

DockerfileとDocker Composeの役割 Dockerfile FROM node:14 WORKDIR /app COPY . . CMD [“npm”, “start”] docker-compose.yml services: app: build: . db: mysql:8 Dockerfileがすること: • 1つのアプリケーションをイメージにする手順 • 必要な環境(Node.jsなど)のインストール • アプリケーションコードの配置 docker-compose.ymlがすること: • 複数のイメージを組み合わせる • それぞれの設定(ポート、DB等)を定義 • イメージ同士の連携方法を指定

docker-compose コマンドでできること

  • docker-compose.yml を読み込み
  • 設定に従ってサービスを操作
  • Dockerfile からビルドも実行

docker-compose.yml は「何をどう動かすか」を定義し、docker-compose コマンドはその定義に従って実際の操作を行います。

通常 docker-compose コマンドを実行するディレクトリに docker-compose.yml ファイルが必要です

→docker-compose.ymlが存在しない場合
no configuration file provided: not found

Docker Compose コマンド体系 サービスのライフサイクル管理 docker-compose up サービスの作成と起動 -d: バックグラウンド実行 docker-compose down サービスの停止と削除 –volumes: ボリューム削除 start / stop サービスの起動/停止 特定サービスの指定可 restart サービスの再起動 docker-compose ps コンテナの状態表示 docker-compose logs ログの表示 -f: フォロー モード サービスの操作とビルド docker-compose exec コマンド実行 サービス内でコマンド実行 docker-compose run 一時的なコンテナ実行 –rm: 終了後に削除 docker-compose build サービスのビルド –no-cache: キャッシュ無効 設定と確認 docker-compose config 設定の検証と表示 docker-compose pull イメージの取得 docker-compose version バージョン情報表示

docker-compose up」 コマンドは、docker-compose.ymlに記述された複数のサービス(コンテナ)を一括で構築・起動するためのコマンド

docker-compose up [オプション] [サービス名]

# デタッチモード(バックグラウンド)で実行
docker-compose up -d

# コンテナを起動する前にイメージを再構築
docker-compose up --build

docker-compose logs コンテナのログを確認するためのコマンド

docker-compose logs [オプション] [docker-compose.ymlで定義されたサービス名(コンテナ名ではない)]

# webサービスのタイムスタンプ付きでリアルタイム監視し、最新20行だけ表示
docker-compose logs -f -t --tail=20 web

docker-compose execでサービス何でコマンドを実行、対話形式に入る

docker-compose exec [オプション] <docker-compose.ymlで定義されたサービス名(コンテナ名ではない)> <コマンド>

ブートプロセスとsystemd

  1. 電源投入
  2. ファームウェア(BIOS、UEFI)動作…マザーボード上のNVRAM(不揮発性メモリ)
    • ブートローダを呼び出す…現在GRUB2がよく使用される
    • 優先順位に従って各デバイスの先頭セクタのMBRを読み込む
  3. ブートローダ
    • kernel(Linuxの基本システム)とRAMディスク
    • ブートローダは起動されると、記憶装置(HDD)内のカーネルをロードし、制御を移します。
  4. カーネルを起動
    • メモリ初期化やハードウェア認識
  5. systemd、initでサービス(sshd、httpd、mysqld)起動
    • init:SysVinit(Sustem Five Init)将来
    • systemd:現在のLinuxで採用
  6. ログインプロンプト表示

UEFI

Unified Extensible Firmware Interface

IntelがBIOSにかわるインターフェイスとして考案したのが、UEFIです。

  • GUIでの操作をサポート
  • 3TBを超える大容量HDDからの起動をサポート

systemd

サービスを並列に起動することにより、起動が高速

Unit(処理単位)

  • systemctlで制御
  • 以下のタイプがあります
    • service(各種サービス起動)httpd、sshd等
    • device(デバイス)
    • mount(ファイルシステム)/etc/fstab
    • swap(スワップ領域の有効化。ディスクをメモリに)
    • target(複数Unitをグループ化)

ターゲット

ターゲット
(systemd)
ランレベル
(init)
default.targetシステム起動時のデフォルトのターゲット
sysinit.targetシステム起動時の初期段階のセットアップを行う
poweroff.target0システム終了
rescue.target1レスキュー(シングルユーザー)モード
multi-user.target2,3,4CUIログイン
graphical.target5グラフィカルログイン
reboot.target6システム再起動

systemctl

systemdが稼働するシステムの各サービスの管理はsystemctlコマンドを使用します。

systemctl サブコマンド Unit名

enable自動起動を有効
get-default次回起動時のターゲットを表示
set-default次回起動時のターゲットを設定
haltシステムを停止しhalt状態にする(停止)
poweroffシステムを停止し電源を切断
startサービスを起動
stopサービスを停止
restartサービスを再起動
is-activeサービスが稼働しているかを表示
isolateほかのUnitを停止し、対象のUnitを起動
rebootシステムを再起動

シャットダウン、再起動

シャットダウンや再起動は、systemctrコマンド以外にshutdownコマンドを使う方法があります。

shutdown [オプション] 時間 [メッセージ]
-hシャットダウンする
-rシャットダウン後再起動する
-f次回起動時にfsckをスキップする
-h、-rと併用する
-F次回起動時にfsckを実行する
-h、-rと併用する
-kシャットダウンせずに警告メッセージを通知
-cシャットダウンをキャンセルする

ssh

公開鍵認証 … 秘密鍵で暗号化→公開鍵で復号化(上記認証)

公開鍵暗号 … 公開鍵で暗号化→秘密鍵で復号化

プロセスの生成、監視、終了

プロセスという基本単位でOSは動作中のプログラムを管理します。

psコマンド

process status

psコマンドは現在実行中のプロセスを表示するときに使います。

aほかのユーザのプロセスも表示
f親子関係をツリー上で表示
uユーザ名を表示
xデーモン等表示
-eすべてのプロセスを表示
-f完全なフォーマットでプロセスを表示
-l詳細情報を表示
-p PID指定のPIDの情報を表示
-C プロセス名指定の名前の情報を表示
-w長い行は折返し

topコマンド

実行中のプロセスを継続的に監視するときに使用します。

killコマンド

killコマンドはプロセスにシグナルを送ります。プロセスはシグナルを受け取るとそれに応じた、動作を実行します。

シグナル名シグナルID動作
HUP1ハングアップ(端末が制御不能)
INT2キーボードからの割り込み(Ctrl + Cキー)
KILL9強制終了
TERM15終了(デフォルト)
CONT18停止しているプロセスを再開
STOP19一時停止
TSTP20端末から一時停止(Ctrl + Zキー)

killallコマンド

指定したコマンドを実行している全てのプロセスに対してシグナルを送します。

killall [-シグナル名、-シグナル番号] プロセス名(コマンド名)

pgrepコマンド

指定のプロセスのPIDを表示します。

-U、–uid ユーザ名実行ユーザーを指定
-G、–group グループ名実行グループを指定
-n、–newestもっとも新しいプロセスを選択
-o、–oldestもっとも古いプロセスを選択
-l、–list-nameプロセス名も表示

フォアグラウンドとバックグラウンド

bg

フォアグラウンドで実行中のジョブをバックグラウンドで実行する

fg

バックグラウンドで実行中のジョブをフォアグラウンドで実行する

端末の活用

tmux、screen

複数の画面で切り替えて作業を行えるソフトウェアです。

デスクトップ環境の利用

LinuxはGUIを実現する機能はそなわっていないです。

そこで、GUIをじつげんするためのシステムとしてX Window Systemが使われてきました。

X Window System

XサーバとXクライアントから構成されています。

ウィンドウマネージャ

X Window Systemの外観を制御しているのがウィンドウマネージャです。

twmは最小限の機能を備えたウィンドウマネージャです。

GUIの起動

startxコマンドでX Window Systemが起動します。(CUI環境‥ランレベル3)

ディスプレイマネージャ

  • ランレベル5で起動すると、ディスプレイマネージャはXサーバを起動し、GUIのログイン画面を表示させます。
  • initやsystemdによりディスプレイマネージャーサービスが起動されます。

xauth

xauthコマンドはXサーバの接続で使われる資格情報を表示したり、クライアント認証ファイルを編集するときに使います。

  • xauth listコマンドでXサーバごとの接続に使用される資格情報が表示されます。(Xサーバ側)
  • xauthのaddコマンドで、ユーザの~/.Xauthorityファイル(クライアント認証ファイル)にXサーバと同じ資格情報を保存し、Xサーバと資格情報が一致したユーザのみがアクセスできるようになります。(Xクライアント側)
ファイル・ディレクトリの操作と管理

ファイルの所有者とパーミッション

アクセス権

読み取りr
書き込みw
実行権x
権限ファイルの適用ディレクトリに適用
読み内容を参照内容を参照
書き書き込みファイルの新規作成、削除、名前変更
実行ファイルを実行ディレクトリのファイルにアクセス、ディレクトリへの移動

アクセス権の表記法

所有者グループその他ユーザ
記号表記:r w xr – xr – –
4 2 14 – 14 – –
数値表記:754

chmod

「change mode」

chmod [ オプション ] アクセス権 ファイル名
オプション … -R --recursive 指定した以下にある全ファイルのアクセス権を変更
オプション内容
-R –r指定したディレクトリのファイル全てのアクセス権を変更する
対象内容
u所有者
gグループ
oその他
a全ユーザ
種別内容
r読み取り
w書込み
x実行
sSUID、SGID
tスティッキービット

SUID、SGID

「Set User ID」、「Set Group ID」

SUID、SGIDは特殊なアクセス権です。

そのファイルを誰が実行しても所有者の権限・グループの権限で実行されることを意味します

SUIDを設定するには、

  • chmod 4755 file(3桁のアクセス権に4000を加える)
  • chmod u+s file(所有者に「s」という権限を追加します)

SGIDを設定するには、

  • chmod 2755 file(3桁のアクセス権に2000を加える)
  • chmod g+s file(グループに「s」という権限を追加します)

スティッキービット

自分以外の他のユーザが所有しているファイルを削除出来ないようにするには、スティッキービットをディレクトリに設定します。

  • 通常のパーミッションの値に1000を加えた値を設定する
  • その他ユーザに「t」という権限を追加する

umask

ファイルやディレクトリ作成時のデフォルトのアクセス権は、umask値で決まります。

  • ファイル … 666 – umask値
  • ディレクトリ … 777 – umask値

http://www.rivhiro-weather.com/knowledge/?p=168

chown

chown [ オプション ] ユーザ ファイル名/ディレクトリ名
chown [ オプション ] :グループ名 ファイル名/ディレクトリ名
オプション … -R --recursive 指定した以下にある全ファイルの所有者を変更

chgrp

chgrp [ オプション ] グループ ファイル名/ディレクトリ名
オプション … -R --recursive 指定した以下にある全ファイルの所有者を変更

ハードリンクとシンボリックリンク

ファイルの実体に名前を結びつける「ハードリンク」と、 名前に名前を結びつける「シンボリックリンク」の2つがあります。

iノード番号

Linuxではファイルを保存するとユニークな値でiノード番号が割り当てられます。

iノードにはファイルに関する属性情報が格納されています。

ハードリンク

  • iノード番号が同じ
  • ハードリンクが0になると、実体がはじめて削除されます
  • ファイルシステムが異なると作成できない
    です
  • ディレクトリのハードリンクは作成できません

シンボリックリンク

  • 別ファイルシステムへのリンク作成が可能
  • lsコマンドで確認するとパーミッションの先頭に「l」が表示される

ln

リンクの作成にはlnコマンドを利用します。

ln [-s‥シンボリックリンク] リンク元 リンク先

  • ハードリンクは異なるファイルシステムに作成できません。
  • ディレクトリのハードリンクは作成できません。

基本的なファイル管理の実行

ファイル操作コマンド

pwd

カレントディレクトリを表示する

「print working directory(作業ディレクトリを表示する)」

ls コマンド

カレントディレクトリのファイル一覧を表示します。

ls [オプション] [ファイル名、ディレクトリ名] 
ls -a
(all)
all、ドット(隠し)ファイルも表示
-d(dir)ディレクトリ自体の情報を表示
-Rサブディレクトリの内容も表示
ls -l
(long)
詳細情報を表示
出力例
-rw-r–r– 1 user group 1234 Jan 9 12:00 file.txt
-h(MB、KB)メガバイト、キロバイトの単位で情報を表示
-i(i-node)i-nodeの情報を表示

cd

カレントディレクトリをホームディレクトリに変更する

change directory

ホームディレクトリへのパス
cd
cd ~(チルダ展開)
ひとつ前に戻る
cd -

cp コマンド

fコピー先の既存のファイルやディレクトリが上書き出ない場合、削除してからコピーする
r、Rディレクトリを再起的にコピー
i同名のものがある場合、上書きするか問い合わせる
pファイルの属性を保持したままコピー

mv コマンド

ファイルやディレクトリを移動するときや名前を変えるときに使うコマンド

-f –force移動先に同名のファイルやディレクトリがある場合、上書きする
-i –interactive移動先に同名のファイルやディレクトリがある場合、上書きするか問い合わせる

mkdir コマンド

ディレクトリを作成するにはmkdirコマンドを利用します

-m –mode 指定したアクセス権でディレクトリを作成
-p –parents必要な場合親ディレクトリを作成する

rm コマンド

ファイルやディレクトリを削除できるコマンド。

-f –forceユーザへの確認なしで削除する
-i削除前にユーザに確認する
-r、-R –recursiveサブディレクトリを含めディレクトリ全体を再帰的に削除する

rmdir コマンド

空のディレクトリのみ削除できる

d ディレクトリ名に階層を指定した場合、削除するディレクトリの親ディレクトリを同時に削除するオプションです。

p 複数階層の空ディレクトリを削除する

※(区別)rm -r空ではないディレクトリも削除することができる

touch コマンド

  • ファイルのタイムスタンプを更新します
    • すでにあるファイルのタイムスタンプだけ更新する
    • touch -t MMDDHH mm filename
  • 空のファイルを生成します(本来はタイムスタンプを変更するコマンドでしたが、指定したファイルがない場合は新規作成する)
tアクセス時刻と修正時刻を指定した時刻に変更
aアクセス時刻を変更
m修正時刻を変更

gzip

gzip形式でファイルを圧縮するにはgzipコマンドを利用します。

元ファイルを残して標準出力に出力

-d –decompress圧縮ファイルを展開
-c –stdout標準出力へ出力
-k –keep圧縮、解凍後に元ファイルを削除しない
-r –recutsiveディレクトリ内の全ファイルを圧縮

gunzip

gunzipコマンドで展開できます。

bzip2

-d –decompress圧縮ファイルを展開
-c –stdout元ファイルを残して標準出力
-k –keep圧縮、解凍後に元ファイルを削除しない

bzip2 [オプション] [ファイル名]

xz

xz [オプション] [ファイル名]

-d –decompress圧縮ファイルの展開
-k –keep圧縮、展開後ファイルを削除しない
-l –list圧縮ファイルの情報を表示する

xz -dコマンドの代わりにunxzコマンドを使ってもかまいません。

tar

tape archive

複数のファイルをまとめて一つのアーカイブにしたり、アーカイブを展開するときに使うコマンド。

[作成するファイル名][圧縮するディレクトリ名]

c createアーカイブを作成
x extractアーカイブからファイルを展開
t listアーカイブの内容一覧を表示
f filenameアーカイブファイル名を指定
z gzipgzipを通して、圧縮/展開
j bzip2bzip2を通して、圧縮/展開
J xzxzを通して、圧縮/展開
v verbose処理の詳細を表示

dd

ブロックサイズとコピー回数を指定してファイルを作成できるコマンド。

if=入力ファイル入力ファイルを指定
of=出力ファイル出力ファイルを指定
bs= バイト数作成するファイルのブロックサイズを指定
count=回数回数分の入力ブロックをコピー

ファイルの配置と検索

FHS

Filesystem Hierarchy Standard

Linuxの標準的なディレクトリレイアウトを定めた標準かされている仕様

FHSさえ知っていればソフトウェア固有の知識のインプットをを最小限にすることができます。

/dev

デバイスファイルを入れるディレクトリ

/usr/bin

ユーザが一般的に使うコマンドがあります。システムの起動や、緊急時の保守には必須でないものです。

/etc

設定ファイルを入れるディレクトリ

/home

ホームディレクトリを入れるディレクトリ

ユーザが自由に操作できるユーザー名のディレクトリがあります。

man hier

HIER(7)			   Linux Programmer’s Manual		       HIER(7)
名前
       hier - ファイルシステム階層の説明
説明
       典 型的な Linux system には以下のようなディレクトリがある (他にもたくさ
       んのディレクトリがあるが):
       /      ルートディレクトリ。ここが階層の起点となる。
       /bin   このディレクトリには、シングルユーザーモードでシステムの起動や修
	      理を行う際に必要な実行形式ファイルが含まれる。
       /boot  ブートローダが用いる静的なファイルが含まれている。このディレクト
	      リにはブートプロセスの間に必要なファイルだけが置かれる。マップイ
	      ンストーラや設定ファイルは /sbin や /etc に置くべきである。
       /dev   物理デバイスを参照しているスペシャルファイルやデバイスファイルの
	      置き場所。 mknod(1) を参照のこと。
       /etc   マシン固有の設定ファイルが置かれる場所。X11 のような大規模なソフ
	      トウェアパッケージでは、 /etc 以下に更にパッケージ単位でサブディ
	      レクトリが作られることもある。サイト全体に有効な設定ファイルは、
	      ここではなく /usr/etc に置かれることもある。しかし、プログラムか
	      らのこれらのファイルの参照先は、常に /etc にす べ き で あ る 。
	      /usr/etc	以下のファイルに対しては、それらへのリンクを /etc に置
	      けばよい。
       /etc/opt
	      /opt にインストールされたアドオンアプリケーションが使う、ホス ト
	      固有の設定ファイルの置き場所。
       /etc/sgml
	      SGML や XML の設定ファイルの置き場所 (なくてもよい)。
       /etc/skel
	      新たにユーザーアカウントを作る際、通常このディレクトリにあるファ
	      イルがユーザーのホームディレクトリにコピーされる。
       /etc/X11
	      X11 window system の設定ファイルの置き場所 (なくてもよい)。
       /home  通常、ユーザーのホームディレクトリが、このディレクトリ直下ないし
	      サブディレクトリの下に作成される。このディレクトリの構成をどうす
	      るかは、ローカルマシンの管理者が決めることである。
       /lib   このディレクトリには、システムの起動時に必要な共有ライブラリや、
	      ルートファイルシステムでコマンドを実行するのに必要な共有ライブラ
	      リを置く。
       /media このディレクトリには、 CD/DVD ディスクや USB スティックなどの 取
	      り 外し可能メディア (removable media) 用のマウントポイントが置か
	      れる。
       /mnt   このディレクトリは、一時的にマウントするファイルシステム用のマウ
	      ントポイントである。ディストリビューションによっては、一時的にマ
	      ウントするファイルシステム用のマウントポイントとして、 /mnt 内に
	      サブディレクトリが用意されている場合がある。
       /opt   このディレクトリにはアドオンパッケージの静的なファイルが置かれる
	      。
       /proc  このディレクトリは proc ファイルシステムのマウントポイントである
	      。 proc ファイルシステムは、実行中プロセスやカーネルの情報を提供
	      する。この疑似ファイルシステムの詳細は、 proc(5) で説明されて い
	      る。
       /root   通常ここが root ユーザのホームディレクトリになる (なくてもよい)
	      。
       /sbin  /bin と同様に、このディレクトリにはシステムの起動に必要なコマ ン
	      ドが含まれる。ただしここには、一般ユーザーは通常実行しないコマン
	      ドが置かれる。
       /tmp   このディレクトリには、定期的なジョブによって、またはシステム起動
	      時に、無条件に削除して構わない一時的なファイルが置かれる。
       /usr   通常このディレクトリは、独立したパーティションがマウントされる。
	      ここには、共有可能で読み込み専用のものだけが含まれ、よっていろい
	      ろな Linux マシンからマウントできる。
       /usr/X11R6
	      X Window System, Version 11 release 6 (なくてもよい)。
       /usr/X11R6/bin
	      X	 Window	 System	  のバイナリの置き場所。古いディレクトリである
	      /usr/bin/X11 からここにシンボリックリンクが張られていることが 多
	      い。
       /usr/X11R6/lib
	      X Window System に関連するデータファイルの置き場所。
       /usr/X11R6/lib/X11
	      こ こ に は  X   の 動 作 に必要な種々のファイルが含まれている。
	      /usr/lib/X11 からここにシンボリックリンクが張られていることが 多
	      い。
       /usr/X11R6/include/X11
	      こ こには X11 Window System を使ったプログラムをコンパイルするた
	      めに必要なインクルードファイルが含まれている。  /usr/include/X11
	      からここにシンボリックリンクが張られていることが多い。
       /usr/bin
	      このディレクトリは、実行形式ファイルの主な置き場所である。システ
	      ムのブートやシステム復旧には必要とされない、一般ユーザーが利用す
	      るコマンドの多くは、ローカルにインストールされるのでない限り、こ
	      のディレクトリに置くべきである。
       /usr/bin/X11
	      X11 コマンドの伝統的な置き場所。Linux では、通常	/usr/X11R6/bin
	      にシンボリックリンクが張られている。
       /usr/dict
	      /usr/share/dict に置き換えられた。
       /usr/doc
	      /usr/share/doc に置き換えられた。
       /usr/etc
	      サイト内部の複数のマシンが共有するような設定ファイルが置かれる。
	      しかしながら、コマンドはそれらのファイルの参照先を、常に /etc に
	      すべきだろう。 /etc のファイルからリンクを張って、 /usr/etc の適
	      切なファイルを指すようにすべきである。
       /usr/games
	      ゲームプログラムや教育用プログラムのバイナリが含まれている (なく
	      てもよい)。
       /usr/include
	      C コンパイラ用のインクルードファイルが含まれている。
       /usr/include/X11
	      C	 コンパイラと X Window System 用のインクルードファイルが含まれ
	      ている。通常これは /usr/inlcude/X11 へのシンボリックリンクになっ
	      ている。
       /usr/include/asm
	      アセンブラ関数の宣言を行うインクルードファイルが含まれている。こ
	      のディレクトリは、以前は /usr/src/linux/include/asm へのシンボリ
	      ックリンクだった。
       /usr/include/linux
	      ここには、システムのリリースのたびごとに変更されうる情報が含まれ
	      る。ここは以前は /usr/src/linux/include/linux にシンボリックリン
	      クされており、オペレーティングシステム固有の情報が得られるように
	      なっていた。
	      (ここに置くインクルードファイルは、現在の libc およびユーザ空 間
	      で 正しく動作するものでなければならない。しかし Linux のカーネル
	      ソースはユーザプログラムといっしょに使うようには設計されていない
	      し 、 あなたが使っている libc も関知しない。 /usr/include/asm と
	      /usr/include/linux を適当なカーネルツリーへのリンクにしたりす る
	      と 、 破 綻 す る の は 目 に 見えている。 Debian ではこうせずに
	      、libc*-dev package が提供する、安定したカーネルバージョンのヘッ
	      ダファイルを置いている。)
       /usr/include/g++
	      GNU C++ コンパイラ用のインクルードファイルが含まれている。
       /usr/lib
	      オブジェクトライブラリ (ダイナミックライブラリも含む) と、直接に
	      は起動されないような実行形式ファイル少々とが置かれる。複雑なプロ
	      グラムでは、更にサブディレクトリがあるかもしれない。
       /usr/lib/X11
	      X	 のプログラムに関連するデータファイルと、 X Window System の設
	      定ファイルの置き場所。 Linux では通常 /usr/X11R6/lib/X11 にシ ン
	      ボリックリンクが張られている。
       /usr/lib/gcc-lib
	      GNU C コンパイラ gcc(1) 用の実行形式ファイルとインクルードファイ
	      ルが含まれている。
       /usr/lib/groff
	      GNU groff 文書整形システムのためのファイルが含まれている。
       /usr/lib/uucp
	      uucp(1) のためのファイルが含まれている。
       /usr/local
	      このディレクトリは、サイトローカルなプログラムがインストールされ
	      る典型的な場所である。
       /usr/local/bin
	      サイトローカルなプログラムが含まれている。
       /usr/local/doc
	      サイトローカルなドキュメントが含まれている。
       /usr/local/etc
	      サイトローカルにインストールされたプログラムの設定ファイルの置き
	      場所。
       /usr/local/games
	      サイトローカルにインストールされたゲームのバイナリの置き場所。
       /usr/local/lib
	      サイトローカルにインストールされたプログラムの関連ファイルの置き
	      場所。
       /usr/local/include
	      ローカルな C コンパイラのヘッダファイルの置き場所。
       /usr/local/info
	      サイトローカルにインストールされたプログラムの info ページの置き
	      場所。
       /usr/local/man
	      サイトローカルにインストールされたプログラムのマニュアルページの
	      置き場所。
       /usr/local/sbin
	      サイトローカルにインストールされたシステム管理コマンドの置き場所
	      。
       /usr/local/share
	      同じ OS ならアーキテクチャが異なっても共有できる、ローカルなアプ
	      リケーションデータの置き場所。
       /usr/local/src
	      サイトローカルにインストールされたソフトウェアのソースコードの置
	      き場所。
       /usr/man
	      /usr/share/man に置き換えられた。
       /usr/sbin
	      このディレクトリには、システム管理コマンドが含まれる。ここに置か
	      れるコマンドは、ブートプロセスや /usr のマウント、システムの修理
	      などに必要なものであってはならない。
       /usr/share
	      このディレクトリには、アプリケーションごとに固有なデータ ( 同 じ
	      OS  ならアーキテクチャが違っていても共有できるもの) がサブディレ
	      クトリ単位で置かれる。以前には /usr/doc, /usr/lib, /usr/man など
	      にあった内容が、多くここに置かれている。
       /usr/share/dict
	      スペルチェッカ用の単語リストが含まれる。
       /usr/share/doc
	      インストールされたプログラムのドキュメントの置き場所。
       /usr/share/games
	      /usr/games に置かれたゲーム用の静的なデータファイルの置き場所。
       /usr/share/info
	      info ページが置かれる。
       /usr/share/locale
	      ロケール (locale) 情報が置かれる。
       /usr/share/man
	      マニュアルページ。各ページはセクションに応じたサブディレクトリに
	      置かれる。
       /usr/share/man//man[1-9]
	      これらのディレクトリには、各ロケールのマニュアルページのソースが
	      置かれている。すべてのマニュアルページで同じ言語とコードセットを
	      使用するシステムでは、  は省略されることがある。
       /usr/share/misc
	      同じ OS ならアーキテクチャが違っていても共有できる、雑多なデータ
	      の置き場所。
       /usr/share/nls
	      母 国語サポート (native language support) 用のメッセージカタログ
	      の置き場所。
       /usr/share/sgml
	      SGML や XML のファイルの置き場所。
       /usr/share/terminfo
	      terminfo のデータベースが置かれる。
       /usr/share/tmac
	      groff と一緒には配布されていない troff マクロの置き場所。
       /usr/share/zoneinfo
	      タイムゾーン情報のファイルが置かれる。
       /usr/src
	      システム上の色々なコンポーネントのソースファイル (参照用のパッケ
	      ージも含む) の置き場所。この場所で自分のプロジェクトの作業をして
	      はいけない。 /usr 以下のファイルはソフトウェアのインストールの時
	      以外は読み込み専用になっているべきだからである。
       /usr/src/linux
	      かつてはカーネルソースの伝統的な置き場所だった。ディストリビュー
	      ションによっては、出荷時のデフォルトのカーネルのソースをここに置
	      いている。自分でカーネルをビルドするときは別の場所を使うほうがい
	      いだろう。
       /usr/tmp
	      今では用いられなくなった。このディレクトリは /var/tmp へのリンク
	      にすべきである。このリンクは互換性のためだけにあり、もはや使うべ
	      きでない。
       /var   このディレクトリには、スプールファイルやログファイルのような、サ
	      イズが変化するファイルが置かれる。
       /var/adm
	      このディレクトリは /var/log に置き換えられた。ここは /var/log へ
	      のシンボリックリンクにすべきである。
       /var/backups
	      歴史的な理由からまだ残っている。
       /var/cache
	      プログラムのためにキャッシュされたデータの置き場所。
       /var/catman/cat[1-9] or /var/cache/man/cat[1-9]
	      これらのディレクトリには、整形済みのマニュアルページが、ページの
	      セクションに従って置かれている。 (整形済みマニュアルページの利用
	      は推奨されていない。)
       /var/cron
	      歴史的な理由からまだ残っている。
       /var/lib
	      プログラムの状態に関する情報のうち、可変なものの置き場所。
       /var/local
	      /usr/local 用の可変データの置き場所。
       /var/lock
	      ロックファイルの置き場所。デバイスのロックファイルの命名は、慣習
	      と して LCK.. とされている。ここで  はファイルシ
	      ステム上でのデバイス名である。利用されているフォーマット は  HDU
	      UUCP  のロックファイルのものである。すなわち各ロックファイルには
	      アスキー 10 進数値文字で表記した PID 10 バイトと、それに続いて改
	      行文字とが含まれている。
       /var/log
	      種々のログファイルの置き場所。
       /var/opt
	      /opt 用の可変データの置き場所。
       /var/mail
	      ユ ーザのメールボックスの置き場所。 /var/spool/mail を置き換えた
	      。
       /var/msgs
	      歴史的な理由からまだ残っている。
       /var/preserve
	      歴史的な理由からまだ残っている。
       /var/run
	      実行時の可変ファイルが置かれる。例えばプロセス識別子 (PID) を 保
	      持するファイルや、ユーザのログイン情報ファイル (utmp) などである
	      。ここのファイルは、通常システム起動時に削除される。
       /var/spool
	      色々なプログラムのスプールファイル (あるいはキューファイル) の置
	      き場所。
       /var/spool/at
	      at(1) のジョブスプール。
       /var/spool/cron
	      cron(8) のジョブスプール。
       /var/spool/lpd
	      印刷用のスプールファイルが置かれる。
       /var/spool/mail
	      /var/mail に置き換えられた。
       /var/spool/mqueue
	      キューイングされた送信メールの置き場所。
       /var/spool/news
	      ニュースのスプールディレクトリ。
       /var/spool/rwho
	      rwhod(8) のスプールファイルの置き場所。
       /var/spool/smail
	      メール配送プログラム smail(1) のスプールファイルの置き場所。
       /var/spool/uucp
	      uucp(1) のスプールファイルの置き場所。
       /var/tmp
	      /tmp  と似ているが、このディレクトリに置かれる一時的なファイルは
	      保存期間の制限がない。
       /var/yp
	      NIS のデータベースファイルの置き場所。
準拠
       The  Filesystem	Hierarchy  Standard,  Version  2.2   .
バグ
       こ のリストは網羅的なものではない。個々のシステムでは異なる部分があるか
       もしれない。
関連項目
       find(1), ln(1), proc(5), mount(8)
       The Filesystem Hierarchy Standard
Linux				  2001-09-07			       HIER(7)

locateコマンド

検索用データベースで高速にファイル名ディレクトリ名の検索を行います。

updatedbコマンド

locateコマンドが利用する検索用のデータベースを更新します。

findコマンドし

指定ディレクトリからファイル、ディレクトリを検索します。

find [検索起点ディレクトリ] [検索式] [アクション]

whichコマンド

環境変数PATHに基づき検索します。

whereisコマンド

指定コマンドのバイナリーファイル、ソースコード、マニュアルファイルの場所を検索します。

typeコマンド

jQuery高頻度ライブラリまとめ(スライダー、lightboxなど)

jQueryとは

JavaScriptのためのライブラリです。

JavaScriptの長い記述を短く書くことができ、複雑なJavaScriptを簡単に使うことができます。

jQueryでできること

  • HTML、CSSの操作
  • 表示、非表示
  • アニメーション

jQueryのデメリット

  • jQueryの読み込みによる遅延
  • 古いもので、現在対応しておらず、動作しないものがある

CDNによる読み込み

公式サイト

  • 最新バージョンである3系で
  • 特に理由がなければminified

https://releases.jquery.com

  • jQueryを読み込む場所はheadタグ内、もしくはbody閉じタグ直前で読み込み
    ブラウザの表示を遅らせないためにbody閉じタグ直前が無難です。
  • 自作のjsファイルよりも先に読み込む
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<script src="my-script.js"></script>

Google CDN

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>

https://developers.google.com/speed/libraries?hl=ja#jquery

自作のjsファイルの記述

$(function () {
 // jqueryの処理を記述 
});

// ※上記は省略形で下記の記述が省略しない場合

jQuery(document).ready(function(){ 
//HTMLの読み込み後、記述した処理の開始を意味しています
  // jqueryの処理を記述
});

jQueryイベントのバブリングとは?

バブリングとは、イベントが発生した要素の親要素、祖先要素にも同様のイベントが発生することです。

バブリングの挙動を理解したうえで、jQueryを使用しないと予想外の問題が起きてしまいます。

return falseでバブリングを回避することが可能です。

slickの使い方(カルーセルスライダー)

slickはjQueryを使用したスライダーを作成することができるプラグインです。

カスタマイズ性もあり、色んな場面で導入できます。

https://kenwheeler.github.io/slick

導入方法

  1. サイトからファイルにダウンロード
  2. CDNを利用

1.ファイルをダウンロードする場合

公式サイトから get it now のメニューの Download Now からダウンロード

下記のファイルが必要となります

  • slick.css
  • slick-theme.css
  • slick.min.js
<!-- css -->
<link rel="stylesheet" href="slick/slick.css">
<link rel="stylesheet" href="slick/slick-theme.css">
<link rel="stylesheet" href="style.css"> //自分で記述するcssファイル

<!-- js -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script> //jQueryの読み込み
<script src="slick/slick.min.js"></script>
<script src="main.js"></script> //自分で記述するjsファイル

2.CDNを利用する場合

公式サイトから get it now のメニューから下記のようにコピペすればOK(※slick-theme.cssのリンクがない?

※2023年10月時点
<!-- css -->
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick-theme.css">
<link rel="stylesheet" href="style.css"> //自分で記述するcssファイル

<!-- js bodyタグ終了直前-->
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script> //jQueryの読み込み
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
<script src="main.js"></script> //自分で記述するjsファイル

↑jsファイルをheadタグ内で読み込むと正しく動かない場合がある?

slickのトラブル

実装してみると、なぜか横スクロールが発生してしまいました。
→overflow: hidden;をあてて解消しました。

snow-monkeyだとうまく動かない?

jsファイルはheadタグ内もしくは、bodyタグ終了直前?

Swiper

スライダーの実装では、jQueryライブラリのSwiperがあります。

Swiper モダンなタッチスライダー

SwiperをWordPressで実装

jsファイルの読み込み

/**
 * スライダー用JSの読み込み
 */
function enqueue_slider_script()
{
    if (is_front_page()) {
        // Swiperのスタイルを読み込み
        wp_enqueue_style(
            'swiper-style',
            'https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css',
            array(),
            '11.0.0'
        );

        // Swiperのスクリプトを読み込み
        wp_enqueue_script(
            'swiper-script',
            'https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js',
            array(),
            '11.0.0',
            true
        );

        // カスタムスライダースクリプトを読み込み
        wp_enqueue_script(
            'slider-script',
            get_template_directory_uri() . '/assets/js/slider.js',
            array('swiper-script'),
            '1.0.0',
            true
        );
    }
}
add_action('wp_enqueue_scripts', 'enqueue_slider_script');

Swiperの基本的な構成とクラス名は決まっているよ!

  1. コンテナ: .swiper – スライダー全体を囲む最も外側の要素
  2. ラッパー: .swiper-wrapper – すべてのスライドを内包する要素
  3. スライド: .swiper-slide – 個々のスライド要素
.swiper(コンテナ) .swiper-wrapper(スライド群を包むラッパー) .swiper-slide Slide 1 .swiper-slide Slide 2 .swiper-slide Slide 3 .swiper-pagination(オプション) .swiper-button-prev .swiper-button-next
<div class="swiper">
  <!-- Additional required wrapper -->
  <div class="swiper-wrapper">
    <!-- Slides -->
    <div class="swiper-slide">Slide 1</div>
    <div class="swiper-slide">Slide 2</div>
    <div class="swiper-slide">Slide 3</div>
    ...
  </div>
  
  <!-- オプションのナビゲーション要素 -->
  <div class="swiper-pagination"></div>
  <div class="swiper-button-prev"></div>
  <div class="swiper-button-next"></div>
  <div class="swiper-scrollbar"></div>
</div>

jquery.inview

inview.jsは要素がビューポートに入ったらクラスを付与することにより、いろんなイベントを発生させることができます。

手順 1) jsファイルをダウンロード

下記サイトよりダウンロードします。

「jquery.inview.min.js」が必要になります。

https://github.com/protonet/jquery.inview

手順 2) ファイルを読み込む

読み込んだファイルをディレクトリに配置し、htmlから読み込みの記述をします。

<script src="js/jquery.inview.min.js"></script>

※jQueryも読み込みます。

手順 3) htmlファイルにクラスを設定

<div class="your-fade"></div>

手順 4) CSSにフェード前後のスタイルを記述

// フェードイン前
.your-fade {
    opacity: 0;
    visibility: hidden;
    transform: translateY(40px);
    transition: 1s;
}

// フェードイン後
.inview {
    opacity: 1;
    visibility: visible;
    transform: translateY(0px);
}

手順 4) jsファイルにコードを記述

$(<em>function</em> () {
    $(".your-fade").on("inview", <em>function</em> () {
        $(this).addClass("inview");
    });
});

toggleClass

toggleClassメソッドはjQueryを使って、引数に指定したクラスを追加したり、削除することができます。

toggleClassの使い方

$("要素").toggleClass("クラス名");

要素‥クラスを追加、削除する対象
クラス名‥追加、削除するクラス名

scrollTop()メソッド

scrollTop()メソッドはスクロール位置を取得することができます。

スクロール量を取得

対象要素.scrollTop();

※一般的なスクロール位置(ブラウザ全体)を取得する場合、対象要素をwindow

スクロール位置を設定し移動

引数の数値の位置まで移動します

対象要素.scrollTop()

※値を設定することで、その位置まで移動

fadeIn() fadeOut()

fadeIn()は非表示になっている要素に対してフェードインのアニメーションを付与することができます。

要素.fadeIn( 時間 );

lightbox

lightboxは画像をクリックすると拡大し、ポップアップ表示させたい場合に使用するJavaScriptライブラリです。

lightbox導入手順

lightboxのサイトで必要ファイルをダウンロードします。

https://lokeshdhakar.com/projects/lightbox2

最新バージョンからzipファイルをダウンロード

必要ファイルを該当ディレクトリにおく

必要なファイルは解凍したフォルダのdistフォルダ内にあります(表示速度が気になる場合に有効な圧縮版の軽量化されているminを使います)

  • lightbox.min.css
  • lightbox.min.js
  • images(フォルダ)

例として下記のように配置した場合

  • index.html
  • css
    • lightbox.min.css
  • js
    • lightbox.min.js
  • images
    • close.png
    • loading.gif
    • next.png
    • prev.png
  • 拡大表示させた画像

ファイルの読み込み

htmlファイルに読み込みするため記述します

headタグ内<link rel="stylesheet" href="css/lightbox.min.css" />

body閉じタグ前に

<!-- jQueryの読み込み -->
<script
src="https://code.jquery.com/jquery-3.7.1.min.js"
integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
crossorigin="anonymous"
></script>

<!-- lightbox.min.jsの読み込み -->
<script src="js/lightbox.min.js"></script>

ScrollHint

画面幅を超えた横幅を横スクロールで表示する際、ブラウザによってスクロールバーの表示は常にしているとは限らないので、
ユーザビリティの観点からこちらのライブラリでスクロールできることを明示することをお勧めします。

実装例:

https://siennahare23.sakura.ne.jp/oocss/#scrollh

実装方法

1)必要ファイルの読み込み

CDNの場合(headタグ内):

<link rel="stylesheet" href="https://unpkg.com/scroll-hint@latest/css/scroll-hint.css">
<script src="https://unpkg.com/scroll-hint@latest/js/scroll-hint.min.js"></script>

2)jsファイルの編集

new ScrollHint('.js-scrollable');
$(function(){
  new ScrollHint('.js-scrollable');
});

js-scrollableは任意のクラス名です

2)htmlファイルの編集

<div class="js-scrollable" style="overflow-x: scroll;">
 <table>

 …画面幅を超えるコンテンツ
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。この文章はダミーです。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
この文章はダミーです。この文章はダミーです。この文章はダミーです。この文章はダミーです。この文章はダミーです。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。
この文章はダミーです。この文章はダミーです。この文章はダミーです。この文章はダミーです。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。この文章はダミーです。
この文章はダミーです。この文章はダミーです。この文章はダミーです。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。この文章はダミーです。この文章はダミーです。
【PHP技術者認定試験問題】リクエスト情報、メールフォーム

スーパーグローバル変数

  • どのスコープでも有効で無常記念でアクセス可能
  • global命令不要

$_POST

<form method="POST">タグでフォームから送信されたデータをポストデータといいます。

$_GET

$_GET … クエリ情報

クエリ情報とはURLの末尾「~?」以降の「キー名=値」でセットされる情報です。

$_SERVER

リクエスト情報やサーバー変数を示します。

ヘッダー情報

PHPでメールフォームを作成

コード内容

  • phpinfo.php
  • contactform.php

phpinfo.php

phpinfo()はPHPの情報を確認でき、PHPが動いている環境か確認できます。

<?php
phpinfo();
?>

contactform.php

<?php
  session_start();

  $mode = 'input';
  $errmessage = array();

  if( isset($_POST['back']) 
  // backという配列のキーがそもそも存在しているか
  // Noticeという注意文が出てしまう

  && $_POST['back'] ){
  // 空ではないか

  // if( $_POST['back']) {
    
  } else if( isset($_POST['confirm']) && $_POST['confirm'] ) {
  // 確認画面

    // 名前のバリデーション(入力チェック)
    if( !$_POST['fullname'] ) {
	    $errmessage[] = "名前を入力してください";
    } else if( mb_strlen($_POST['fullname']) > 100 ){
	    $errmessage[] = "名前は100文字以内にしてください";
    }
	  $_SESSION['fullname'] = htmlspecialchars($_POST['fullname'], ENT_QUOTES);
    // サニタイズ(無害化)

    // メールのバリデーション
    if( !$_POST['email'] ) {
      $errmessage[] = "Eメールを入力してください";
    } else if( mb_strlen($_POST['email']) > 200 ){
      $errmessage[] = "Eメールは200文字以内にしてください";
    } else if( !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) ){
      $errmessage[] = "メールアドレスが不正です";
    }
    $_SESSION['email'] = htmlspecialchars($_POST['email'], ENT_QUOTES);

    // お問い合わせ内容のバリデーション
    if( !$_POST['message'] ){
		  $errmessage[] = "お問い合わせ内容を入力してください";
	  } else if( mb_strlen($_POST['message']) > 500 ){
		  $errmessage[] = "お問い合わせ内容は500文字以内にしてください";
	  }
	  $_SESSION['message'] = htmlspecialchars($_POST['message'], ENT_QUOTES);

    if( $errmessage ){
	    $mode = 'input';
    } else {
	    $mode = 'confirm';
    }

  } else if( isset($_POST['send']) && $_POST ) {
    $message = "お問い合わせを受け付けました。\r\n"
              . "名前: " . $_SESSION['fullname'] . "\r\n"
              . "email: " . $_SESSION['email'] . "\r\n"
              . "お問い合わせ内容:\r\n"
              . preg_replace("/\r\n|\r|\n/", "\r\n", $_SESSION['message']);
	  mail($_SESSION['email'],'お問い合わせありがとうございます',$message);
    mail('xx@gmail.com','お問い合わせありがとうございます',$message);
    $_SESSION = array();

    $mode = 'send';

  } else {
    $_SESSION['fullname'] = "";
    $_SESSION['email']    = "";
    $_SESSION['message']  = "";
  }
?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>お問い合わせフォーム</title>
</head>
<body>

  <?php if( $mode == 'input' ) { ?>
    <!-- 入力画面 -->
    <h2>入力画面</h2><br>
    <?php
    if( $errmessage ){
      echo '<div style="color: red;">';
      echo implode('<br>', $errmessage );
      echo '</div>';
    }
    ?>
    <form action="./contactform.php" method="post">
      name<input type="text" name="fullname" value="<?php echo $_SESSION['fullname'] ?>"><br>
      email<input type="email" name="email" value="<?php echo $_SESSION['email'] ?>"><br>
      お問い合わせ内容<br>
      <textarea name="message" id="" cols="30" rows="10">
        <?php echo $_SESSION['message']; ?>
      </textarea><br>
      <input type="submit" name="confirm" value="確認">
    </form>

  <?php } else if( $mode == 'confirm' ){ ?>
    <!-- 確認画面 -->
    <h2>確認画面</h2><br>
    <form action="./contactform.php" method="post">
      name  <?php echo $_SESSION['fullname']; ?><br>
      email <?php echo $_SESSION['email']; ?><br>
      お問い合わせ内容 <br>
      <?php echo nl2br($_SESSION['message']); ?><br>
      <input type="submit" name="back" value="戻る" />
      <input type="submit" name="send" value="送信" />
    </form>
    
  <?php } else { ?>
    <!-- 完了画面 -->
    <h2>送信完了画面</h2><br>
    送信しました。お問い合わせありがとうございました。<br>
  <?php } ?>
 
  <?php
  print_r($_POST );
  ?>
  
</body>
</html>
https://siennahare23.sakura.ne.jp/hinkon/contactform.php

メールフォームのセキュリティについて

クロスサイトスクリプティング対策

htmlspecialcharsという関数を使いエスケープ処理を行います。

スクラッチ以外の利用

実際はWordPressのプラグインやメールフォームのライブラリ(PHPMailer、Laravel)を使用するのが鉄板で無難です。

完全なセキュリティは難しい

セキュリティを十分に考慮されたシステムには、それなりにコストがかかります。

制作しているサイトが、相応の重要なデータを扱っているかを考える必要があります。

【PHP技術者認定試験問題】リクエスト情報

リクエスト情報を取得、操作するためのスーパーグローバル変数 8
$_POSTPOST形式で渡された情報
$_GETクエリ情報経由で渡された情報
$_FILESアップロードされたファイルに関する情報
$_SERVERリクエストヘッダー、またはサーバー固有の変数情報
$_ENVサーバー側で定義された環境変数
$_COOKIEクッキー経由で渡された情報
$_SESSIONセッション経由で渡された情報
$_REQUEST$_GET、$_POST、$_COOKIEの値をまとめて管理
ユーザーからの入力値をブラウザーに表示させる場合の注意点

htmlspecialchars()関数でエスケープすることで、クロスサイトスクリプティング攻撃を防ぎます

主なサーバー変数 7
$_SERVER[‘PHP_SELF’]Webサーバに要求するURL
$_SERVER[‘SERVER_NAME’]PHPは実行されているWebサーバの名前
$_SERVER[‘SERVER_ADDR’]IPアドレス
$_SERVER[‘REQUEST_METHOD’]リクエストのメソッド名
$_SERVER[‘REMOTE_ADDR’]ユーザの IP アドレス
$_SERVER[‘REMOTE_HOST’]現在のページにアクセスしているホストの名前
$_SERVER[‘QUERY_STRING’]検索引数
・名前「name」、値「value」有効期限30日後のクッキーを発行してください
・クッキーを即座に破棄してください
setcookie('name', 'value', time() + 60 * 60 * 24 * 30);
setcookie('name', 'value', time() - 3600);
クッキーを定義する関数は
setcookie(name, value, expire, path, domain, secure, httponly)

1.name … クッキーの名前
2.value … クッキーの値
3.expire … 有効期限
4.path … URLのパス
5.domain … 有効なドメイン
6.secure … secure属性(HTTPS通信時のみ許可)
7.httponly … httponly属性(JavaScriptによるクッキーの操作を防ぐ)

【PHP技術者認定試験問題】ユーザ定義関数、標準クラスライブラリ

ユーザ定義関数

・ユーザ定義関数で引数、戻り値を明示的に指定すること
・記述方法
・型名 6

宣言型

function ファンクション名 (引数の型 引数, 引数の型 引数): 戻り値の型 {
  …
}
bool真偽値
float浮動小数点数
int整数
string文字列
callableコールバック関数
void何も返さない(戻り値のみ指定可)
指定化
下記のprocessNumberは$num、…を引数$funcで処理し、結果を配列として返す関数です。

function processNumber( 1 $func, float …$args): array {
foreach ( 2 as $arg) {
$result[] = 3;
}
return $result;
}
4 $x, $y 5 = processNumber(
fn($num) 6
5, 15);
function processNumber( callable $func, float ...$args): array {
  foreach ( $args as $arg) {
    $result[] = $func($arg);
  }
  return $result;
}
[ $x, $y ] = processNumber(
  fn($num) => $num**2
  5, 15);

標準クラスライブラリ

日付文字列「2023年8月3日」を、DateTimeクラスを使ってかいせきし、「YYYY/MM/DD(曜日)」の形式で出力してください
$dt = 1::2(‘Y年m月d日’, ‘2023年8月3日’);
print $dt->3(‘Y/m/d (D)’);
$dt = DateTime::createFromFormat('Y年m月d日', '2023年8月3日');
print $dt->format('Y/m/d (D)');
format文字
j、d、D、n、m、M、y、Y、g、G、i、s
j日付(1~31)
d日付(01~31)
D曜日(Mon~Sun)
n月(1~12)
m月(01~12)
M月(Jan~Dec)
y年(2桁)
Y年(4桁)
g時(1~12)
G時(0~23)
i分(0~59)
s秒(0~59)
インスタンスメソッドの呼び出し

->アロー演算子

日付/時刻を指定のフォーマットで整形するメソッド

format

$dt = 1 2(‘2022/8/4 10:26:30’);
print $dt->3(‘Y年m月d日 H時i分’); // 結果:2022年08月04日 10時26分
$dt->4(1 5(‘P1YT10H’));
print $dt->3(‘Y年m月d日 H時i分’); // 結果:2023年08月04日 20時26分
$dt = new DateTime('2022/8/4 10:26:30');
print $dt->format('Y年m月d日 H時i分');  // 結果:2022年08月04日 10時26分
$dt->add(new DateInterval('P1YT10H')); 
print $dt->format('Y年m月d日 H時i分');  // 結果:2023年08月04日 20時26分
$dt1 = new 1(‘2020/8/20 10:38:32’);
$dt2 = new 1(‘2023/12/10’);
$interval = $dt1->2($dt2, true);
$dt1 = new DateTime('2020/8/20 10:38:32');
$dt2 = new DateTime('2023/12/10');
$interval = $dt->diff($dt2, true);
・指定されたフォルダーにディレクトリ配下のファイル情報にアクセスするためのクラス
・上記クラスの主なメソッド
 ・ファイルがフォルダーであるか
 ・ファイルが通常のファイルであるか
new DirectoryIterator(string $path)
  • is_dir($path)
  • is_file($path)
Shadcn/UI 入門:React で洗練された UI コンポーネントを作る

こんにちは! 今回は、React のプロジェクトで洗練された UI コンポーネントを簡単に作成できる「shadcn/ui」について紹介します。Web 開発をしていると「もっとスタイリッシュなコンポーネントを作りたいけど、手間がかかるなあ…」と感じたことはありませんか?Shadcn/ui はそんな悩みを解決してくれる強力なツールです!


Shadcn/UI って何?

shadcn/ui は、React や Next.js プロジェクトに簡単に統合できる UI コンポーネントライブラリです。このツールは、デザインの美しさと使いやすさに重点を置いており、あらかじめスタイリングされたコンポーネントが豊富に揃っています。デフォルトで美しいスタイルを持っているので、開発者はデザインに悩まずに素早くページを作成できます。

特徴

  • 洗練されたデザイン:すぐに使える美しいデザインが標準で搭載。
  • カスタマイズ性:基本スタイルを維持しつつ、自分のプロジェクトに合わせて簡単に調整可能。
  • 開発スピード向上:手間をかけずに UI を組み込めるので、実装にかかる時間を大幅に短縮。

Shadcn/UI を使ってみる

それでは、実際に Shadcn/UI をインストールし、React プロジェクトに組み込んでみましょう。以下では、インストールから基本的な使用方法までを説明します。

1. インストール

まず、以下のコマンドを使って Shadcn/UI をインストールします。

npm install shadcn-ui

インストールが完了したら、React または Next.js プロジェクトに shadcn/ui をインポートして使えるようになります。

2. 基本的な使い方

例えば、ボタンコンポーネントを作りたい場合、以下のように Button コンポーネントを使います:

import { Button } from 'shadcn-ui';

function App() {
  return (
    <div>
      <Button onClick={() => alert("ボタンがクリックされました!")}>クリック!</Button>
    </div>
  );
}

export default App;

このコードを実行すると、下のような美しいボタンが表示されます。

3. コンポーネントのカスタマイズ

shadcn/ui のコンポーネントは、カスタマイズも簡単です。例えば、ボタンの色を変えたり、サイズを調整する場合、Button コンポーネントのプロパティを設定するだけで見た目を変更できます。

<Button color="primary" size="large">カスタムボタン</Button>

おすすめのコンポーネント

Shadcn/UI には、ボタン以外にも以下のような便利なコンポーネントが用意されています:

  1. カード (Card)
    コンテンツを整理して表示するのに最適。
  2. モーダル (Modal)
    ポップアップウィンドウを簡単に追加可能。
  3. トグル (Toggle)
    スイッチのようなオンオフの切り替え UI。

カスタムテーマの設定

Shadcn/UI では、デフォルトのテーマをプロジェクトに合わせて変更することもできます。カスタムテーマの設定は以下のように行います:

import { ThemeProvider } from 'shadcn-ui';

function App() {
  return (
    <ThemeProvider theme="dark">
      <Button>ダークテーマボタン</Button>
    </ThemeProvider>
  );
}

まとめ

shadcn/ui は、React や Next.js のプロジェクトでおしゃれで使いやすい UI を簡単に構築できる強力なツールです。デザインに時間をかけずにプロジェクトの UI を整えたい方に特におすすめです。興味のある方はぜひインストールして試してみてください!

Docker 環境で WordPress を使用している場合「アップロードされたファイルが php.ini の upload_max_filesize ディレクティブを越えています。」について

upload_max_filesize」と関連する設定を変更手順

1)カスタム php.ini ファイルを作成

custom-php.ini という名前のファイルを作成し、以下の内容を追加

※docker-compose.ymlと同じディレクトリに作成

upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 128M

※値は必要に応じて調整してください。

2)docker-compose.yml ファイルを編集

services:
  wordpress:
    image: wordpress:latest
    volumes:
      - ./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini
    # 他の設定...

3)コンテナを再起動

docker-compose down
docker-compose up -d

再起動後、再度WordPressインストールし最大アップロードサイズを確認すると変更されているのが確認できました

PHPサンプルコード

標準入力

<?php
    // 標準入力がHelloの場合こんにちはを出力

    $greeting = trim(fgets(STDIN));
    if ($greeting == "Hello") {
        echo "こんにちは\n";
    }
?>
<?php
    // 1. 標準入力から文字列を 1 個受け取る
    // 2. その文字列が「Hello」に等しい場合、次のメッセージを表示する
    // こんにちは
    // 3. 「Hello」に等しくない場合、次のメッセージを表示する
    // AAAはHelloではない    ※AAAに、その文字列を当てはめる

    $name = trim(fgets(STDIN));
    if ($name == "Hello") {
        echo "こんにちは\n";
    } else {
        echo $name . "はHelloではない\n";
    }
?>

文字変換

<?php
// ファイル名に含まれる長さ 2 以上のハイフンをすべて長さ 1 にしたファイル名を文字列で出力してください。
// ファイル名の文字列は100字以内

$stdin = trim(fgets(STDIN));

for($i = 100; $i >= 1; $i--){ 

    $repeat_count = $i;
    $text = str_repeat("-", $i);

    $stdin = str_replace($text, "-", $stdin);
}

echo $stdin;
?>

複数行入力

<?php

// ・1 行目には、あなたの食べたい料理名を表す文字列 S が与えられます。
// ・2 行目には、与えられるメニューの単語数を表す整数 N が与えられます。
// ・3 行目には、メニュー名を表す単語の文字列 T_i (1 ≦ i ≦ N) が半角スペース区切りで与えられます。
// ・入力は全部で 3 行となり、最終行末尾に改行が一つ入ります。
// 与えられたメニューがあなたの食べたい料理であれば "Yes" を、そうでなければ "No" を出力してください。

// 標準入力を一行ずつ配列に代入
while ($stdin = trim(fgets(STDIN))) {
    $stdin_array[] = $stdin;
}

$my_menu = $stdin_array[0];

$menu_count = --$stdin_array[1];

$menu_array = explode(' ',$stdin_array[2]);

for($i = 0; $i <= $menu_count; $i++){ 

    $menu_word = $menu_array[$i];


    
    // "Yes" を、そうでなければ "No"
    if ($my_menu == $menu_word) {
        echo "Yes";
        break;
    } elseif ($my_menu != $menu_word && $i == $menu_count) {
        echo "No";
        break;
    }
}

?>

多重ループ
多次元配列

<?php

// ・1 行目にクラスの人数を表す整数 N が与えられます。
// ・続く N 行のうちの i 行目 (1 ≦ i ≦ N) には、i 番目の生徒が投票したクラスメイトの名前 a_i が与えられます。
// ・入力は合計で N + 1 行となり、入力値最終行の末尾に改行が 1 つ入ります。
// ・最も得票数の多い人は 1 人のみです。

while ($stdin = trim(fgets(STDIN))) {
    $stdin_array[] = $stdin;
}

$num_peaple = $stdin_array[0];

for($i = 1; $i <= $num_peaple; $i++) { 

    $count = 0;

    for($j = $i; $j <= $num_peaple; $j++) {

        if ($stdin_array[$i] == $stdin_array[$j]) {

            $count++;

        }

    }
    
    // 多次元配列値追加
    $count_array[] = [$stdin_array[$i], $count];
}


// 抽出
$cols = array_column($count_array, 1); 
// echo print_r($cols);

array_multisort($cols, SORT_DESC, $count_array);
// echo print_r($count_array);

echo $count_array[0][0];

?>
Webセキュリティを考慮してフォーム作成
  • 正常系をまず作成
  • 異常系を考える、テストする、キリがない
  • マストな異常系をルール化する(経験がものをいう)
  • 失敗する前提で記述
  • 失敗のログがでるように
  • 時間をおいてお試してください
  • SQLインジェクション、CSRF
    →参考:体系的に学ぶ 安全なWebアプリケーションの作り方 第2版[固定版] 脆弱性が生まれる原理と対策の実践

POSTリクエストはContent-Typeはapplication/json

POSTリクエストを使うとき、サーバーにデータを送信する形式を示すために「Content-Type」というヘッダーを設定する

application/json

  • JSON形式でデータを送信するときに使います。
  • 例えば、フォームデータをJavaScriptでオブジェクトにして送信したい場合に利用します。

正常系を完成させる

フロントエンドからのフォームデータ送信

script.jssendMail 関数で、axiosを使ってフォームデータをsendMailer.phpに送信しています​(script)。まず、データが正しくサーバーに送信されているかを確認します。

PHP側でのデータ受信とレスポンス

sendMailer.php で、送信されたデータを受け取り、PHPMailerを用いてメールを送信する処理を追加します。現状のコードでは、PHPMailerの処理が未実装ですので、これを追加します。

フロントエンドでの成功メッセージの表示

メール送信が正常に完了した場合、フロントエンドで成功メッセージを表示させます。すでに sendMail 関数内でレスポンスに基づく処理が行われているため、サーバーから成功レスポンスが返ってきた際に次のページにリダイレクトするか、成功メッセージを表示するように設定します。

memo

デフォルトでは Content-Type が application/json になりますが、PHP で $_POST を使用してデータを取得するには application/x-www-form-urlencoded 形式で送信する必要がある

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>フォーム送信</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="form_wrap">
        <form class="form" onSubmit="handleSubmit(event)" name="cta_form">
            <p class="form_title">form</p>
            <div class="form_area">
                <!-- メールアドレス入力欄 -->
                <input class="form_input" type="email" name="email" placeholder="メールアドレス" required>
                <div class="err" id="emailError"></div>
                
                <!-- 電話番号入力欄 -->
                <input class="form_input" type="tel" maxlength="11" name="tel" placeholder="例) 09012345678" required>
                <div class="err" id="telError"></div>

                <!-- 送信ボタン -->
                <button class="submit" type="submit">送信</button>
            </div>
        </form>
    </div>
    <div id="formMessage" class="form_message"></div>

    <!-- JavaScriptの読み込みをbodyの最後に移動 -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script src="script.js"></script>
</body>
</html>
$(document).ready(function () {
    async function sendMail(formData) {
        try {
            const url = "https://siennahare23.sakura.ne.jp/1104_tokuform/sendMailer.php";
            console.log("送信データ:", formData);

            const res = await axios.post(url, JSON.stringify(formData), {
                headers: {
                    "Content-Type": "application/json",
                },
            });

            const json = res.data;
            console.log("サーバーからのレスポンス:", json);

            return { success: json.status === "success", data: json };
        } catch (error) {
            console.error("PHPへの送信エラー:", error);
            return { success: false, error: error };
        }
    }

    window.handleSubmit = async function (event) {
        event.preventDefault();
        const form = event.currentTarget;

        // 入力要素の取得
        const emailInput = form.querySelector('input[name="email"]');
        const telInput = form.querySelector('input[name="tel"]');
        const emailValue = emailInput.value;
        const telValue = telInput.value;

        // 電話番号とメールアドレスのバリデーション
        if (telValue.length !== 11 || !/^\d{11}$/.test(telValue)) {
            document.getElementById("telError").innerText = "11桁の電話番号を入力してください";
            return;
        } else {
            document.getElementById("telError").innerText = "";
        }

        if (!/^[\w\.-]+@[\w\.-]+\.\w+$/.test(emailValue)) {
            document.getElementById("emailError").innerText = "有効なメールアドレスを入力してください";
            return;
        } else {
            document.getElementById("emailError").innerText = "";
        }

        // フォームデータの収集
        const data = new FormData(form);
        const formData = Object.fromEntries(data.entries());

        const result = await sendMail(formData);

        // メッセージ表示要素を取得
        const messageDiv = document.getElementById("formMessage");

        // 成功・失敗のメッセージを表示
        if (result.success) {
            messageDiv.innerText = result.data.message || "メールが正常に送信されました";
            messageDiv.style.color = "green";
        } else {
            messageDiv.innerText = result.data.message || "送信エラーが発生しました。再度お試しください。";
            messageDiv.style.color = "red";
        }
    };
});
<?php
// 設定ファイルの読み込み
require_once '/home/siennahare23/config/config.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // JSON データの取得と解析
    $input = file_get_contents('php://input');
    $data = json_decode($input, true);

    // 入力データの取得
    $email = filter_var($data['email'], FILTER_SANITIZE_EMAIL);
    $tel = filter_var($data['tel'], FILTER_SANITIZE_STRING);

    // デバッグ情報の出力
    // echo '取得したメールアドレス: ' . htmlspecialchars($email) . '<br>';
    // echo '取得した電話番号: ' . htmlspecialchars($tel) . '<br>';

    // メールアドレスの検証
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        echo '無効なメールアドレスです: ' . htmlspecialchars($email);
        exit;
    }

    // 電話番号の検証
    if (!preg_match('/^\d{11}$/', $tel)) {
        echo '無効な電話番号です: ' . htmlspecialchars($tel);
        exit;
    }

    // デバッグ情報の出力
    // echo '送信先メールアドレス: ' . htmlspecialchars($email) . '<br>';
    // echo '送信先電話番号: ' . htmlspecialchars($tel) . '<br>';

    $mail = new PHPMailer(true);

    try {
        // SMTP設定
        $mail->isSMTP();
        $mail->Host       = SMTP_HOST;
        $mail->SMTPAuth   = true;
        $mail->Username   = SMTP_USER;
        $mail->Password   = SMTP_PASS;
        $mail->SMTPSecure = SMTP_SECURE;
        $mail->Port       = SMTP_PORT;

        // エンコーディングの設定
        $mail->CharSet = 'UTF-8';
        $mail->Encoding = 'base64';

        // 送信者と受信者の設定
        $mail->setFrom(SMTP_USER, 'Mailer'); // 送信者
        $mail->addAddress($email); // 受信者

        // メール内容の設定
        $mail->isHTML(true);
        $mail->Subject = 'フォーム送信内容';
        $mail->Body    = 'メールアドレス: ' . htmlspecialchars($email) . '<br>電話番号: ' . htmlspecialchars($tel);
        $mail->AltBody = 'メールアドレス: ' . htmlspecialchars($email) . "\n電話番号: " . htmlspecialchars($tel);

        // メール送信
        $mail->send();
        echo json_encode(['status' => 'success', 'message' => 'メッセージが送信されました']);

    } catch (Exception $e) {
        echo json_encode(['status' => 'error', 'message' => "メッセージを送信できませんでした。エラー: {$mail->ErrorInfo}"]);
    }
} else {
    echo json_encode(['status' => 'error', 'message' => 'POSTメソッドで送信してください。']);
}
?>
All-in-One WP Migration

インポート容量を引き上げる方法

All-in-One WP Migrationではインポートの容量制限があるため、ファイルサイズが1GB以上のものは、データ移行ができません。

インポート容量上限をあげるには以下の方法があります。

  • 有料版を使う
  • 無料版の容量を上げる

有料版に関しては、All-in-One WP Migration unlimited extensionの買い切り版は販売が終了しており、1年ごとのサブスクリプションとなっています。

無料版all-in-one wp migrationの容量を上げる方法 パート1

1.「all-in-one wp migration ver.6.68」をダウンロード

↑2024/03/04問題なく使用可能

2. インストール

3. ソースコードを編集

「all-in-one wp migration」プラグインの「constants.php」ファイルにて編集します。

* 20 を末尾に追記します。

// =================
// = Max File Size =
// =================
define( 'AI1WM_MAX_FILE_SIZE', 536870912 * 20 );
https://www.caliberelectronics.com/all-in-one-wp-migration/

無料版all-in-one wp migrationの容量を上げる方法 パート2(2024/01/10)

ローカル環境の場合

php.iniを編集します。

テーマフォルダ/con/php/php.ini.hbs

レンタルサーバの場合

よくあるエラー

インポートが終わらない

  • データベースが読み込めない。
  • php のバージョンが一致していない。

SiteGuard WP Pluginとの相性

データ移行後WordPressにログインできないトラブルが起きることがあります。(ログインページが404

プラグイン「SiteGuard WP Plugin」が原因の場合があります。無効化後データ移行をする必要があります。

https://design-pull.com/wordpress/6812/
PHP8準上級試験 合格のカギ、学習法

試験概要

準上級試験は、PHPの基本的な知識と実践的なスキルを証明する資格です。上級との主な違いは、出題範囲の深さと合格ラインにあります。

上級との比較:

  • 準上級:合格ライン65%以上、基本的な実装力
  • 上級:合格ライン70%以上、応用的な設計力


項目準上級上級
合格ライン65%以上70%以上
出題レベル基本的な実装力応用的な設計力
設計スキル基本的なOOP設計デザインパターン
セキュリティ基本的な対策高度な脆弱性対策
データベース基本的なSQL操作パフォーマンスチューニング
  • 試験時間:90分
  • 問題数:75問
  • 形式:マークシート
  • 受験料:15,000円(税込)

学習範囲

PHP8準上級試験 出題範囲

  1. PHP基礎
    • 変数とデータ型
    • 制御構文
    • 関数
    • 名前空間
  2. オブジェクト指向
    • クラスとオブジェクト
    • 継承
    • インターフェース
    • トレイト
  3. データベース
    • PDO基礎
    • 基本的なSQL
    • トランザクション
  4. セキュリティ
    • XSS対策
    • CSRF対策
    • パスワード管理
  5. Web基礎
    • HTTP基礎
    • REST API
    • JSON処理

試験を受けた感想

結果は

800/1500点で合格しました、、750点で合格のようです、5割でいいみたいですね。

PHP8技術者認定上級/準上級試験 合格評価得点:750 あなたの評価得点:800 結果:準上級合格 合格評価得点: あなたの評価得点: 0 750 1500 セクション分析 正解率 1. インストールと設定 0% 2. 言語リファレンス 40% 3. セキュリティ 75% 4. 機能 100% 5. 基本的な関数 67%

2時間で30問だったので、30分で10問で最後に見直す時間を確保する予定で問題を解きました。

結果予定通り30分ほど余りました。

気になるところも見直しできたので、ペースはちょうどよかった気がします。

難易度

知らないクラス、関数、情報が結構出ましたが、文章中にその説明があるので、そこで回答を導き出した問題もありました。

とはいえ、すでに知っていたら、読解スピードもかからず、問題文の正誤の判断をじっくりできるので、知っておいた方がいいことは間違いないです。

そして、コードを読むスキルが大事になると感じました。実務である程度なれて、すらすらと読めて理解できていればわりと行けると思います。

普段のエディターみたいにコードのシンタックスハイライトがないので、やや読みづらいです、、

学習しとけばよっかたと思った点

  • PHP 7.0で増えたもの
  • PHP 7.1で増えたもの
  • PHP 7.2で増えたもの
  • PHP 7.3で増えたもの
  • PHP 7.4で増えたもの
  • PHP 8.0で増えたもの
  • シリアライゼーション(3問くらいでた)
  • hash(そもそも複雑なので、、)
  • シャローコピー(2問くらいでた)

学習方法

下記のリンクにある模擬問題を何回もやりました、回答おぼえてしまうくらいしました。

公式問題集も3週くらいしました。結構理解しやすくてよかったです。

振り返ると、学習しててこれ網羅的に理解するのに時間かかるなとあきらめつつありました。

ですが、学習しながら、「へーっ」ためになるな(実務で使えそう)となり、仮に受験受からなくても知識として身になるなと開き直って学習してました。

解説記事一覧

Difyローカル開発環境セットアップガイド
https://dify.ai/jp

ローカル環境で動かすメリット

  1. セキュリティ管理
    • 機密データや会社の情報をローカルで完全に管理可能
  2. カスタマイズの自由度
    • 環境設定やモデルの詳細な調整が可能
    • 必要に応じてソースコードの修正も可能
  3. コスト管理
    • クラウド利用料金の削減
    • リソース使用量の直接的なコントロール
  4. 開発効率
    • ローカルでの即時デバッグが可能
    • 開発サイクルの短縮

Dockerセットアップ手順

1. リポジトリのクローン

プロジェクトディレクトリにて公式のリポジトリをクローンします

git clone https://github.com/langgenius/dify.git .

2. Docker起動

cd .\docker\
docker-compose up -d

Dockerのリソース制限 初回起動時のコンテナビルド処理でロードに時間がかかる場合あります

まずは、test@test.comなどのテストアカウントで設定を進め、基本的な動作を確認することをお勧めします。その後、必要に応じて実際のメールアドレスに変更することもできます。

Dify での OpenAI の設定

「設定」→「Model Provider」

APIキーのみを入力

チャットボット作成

Web公開

「公開する」から「ウェブサイトに埋め込む」で下記の通りWeb上にアップできます

注意)Docker起動しておかないと接続はできません

選択肢(1)OpenAI APIキーを使用(Dify標準)

  • メリット:
    • 設定が簡単
    • GPT-4の高性能な応答
    • 日本語対応が完璧
  • デメリット:
    • 質問内容がOpenAIサーバーに送信される
    • コストがかかる
    • APIキー管理のリスク

選択肢(2)ローカルAIモデル(完全オフライン)

  • メリット:
    • データが外部に漏れない
    • ランニングコストなし
    • カスタマイズ可能
  • デメリット:
    • セットアップが複雑
    • 計算リソースが必要
    • GPT-4より性能は劣る

Tiny-Llamaとは

  • Meta社のLlamaモデルを小型化したバージョン
  • オープンソースで商用利用可能
  • 元のLlamaの機能を維持しながら、サイズを大幅に縮小

バリエーション

Tiny-Llama-1.1B: 基本モデル
Tiny-Llama-Chat: チャット特化
Tiny-Llama-Code: プログラミング特化

必要スペック

最小構成:
- メモリ:4GB以上(8GBのPCで動作可能)
- CPU:一般的なCore i3/i5でOK
- ストレージ:3GB程度の空き容量

参考外付けSSD

容量が不足しそうであれば外付けSSD

推奨スペック:
- 容量:最低128GB以上
- タイプ:USB 3.0/3.1以上
- 読み書き速度:500MB/s以上
通常のLlama-2: 7GB-70GB
Tiny-Llama: 約1.1GB-2GB
GPT-3: 175GB以上
容量速度特徴
Samsung T7500GB〜2TB500MB/s以上信頼性が高く、ポータブルで耐衝撃性もあるため、持ち運びにも適しています。
Sandisk Portable SSD250GB〜2TB500MB/s以上コストパフォーマンスが良く、一般的な使用に十分な性能です。
Crucial X8500GB〜2TB1050MB/s以上耐久性が高く、速度も速いので、長期間の使用に向いています。

APIキーの設定

  • 右上のプロファイルアイコン → Settings をクリック
  • 左メニューの「API Keys」を選択
  • OpenAI APIキーを入力




参考サイト

https://note.com/en2enzo/n/nb1d179215a37
PHP

PHPの概要

PHPはサーバサイドスクリプト言語(Webサーバ実行される)です。

PHPの動作環境

CGI(Common Gateway Interface※)規格をサポートするWebサーバで機能します。

※Webサーバでプログラムを実行する仕組み

テキストと数の操作

ホワイトスペース

ホワイトスペースを入れることで、プログラムの可読性が上がります。

半角スペース、タブ、改行がホワイトスペースとしてみなされます。

演算子

代数演算子
算術演算子
+ – * / % ++ — など
比較演算子== === !== < > <= >= ?:
論理演算子&& and || or xor !
ビット演算子& | ^ << >> など
その他文字列演算子()、実行演算子(`)、
エラー制御演算子()

比較演算子

==左辺と右辺が同じ値
===左辺と右辺が同じ値で同じデータ型
<=>
宇宙船演算子
左辺が右辺より小さい場合は-1、左辺んが右辺と等しい場合は0、
左辺が右辺より大きい場合は1
??左辺がnullでなければその値、左辺がnullであれば右辺の値、
左辺も右辺もnullであればnull

エスケープ

単一引用符

単一引用符(’ ‘)は特殊文字はそのまま文字列として動作します。

二重引用符

二重引用符(” “)は特殊文字は意味する値として動作します。(変数展開変数のParse

\n改行
\r復帰
\tタブ
\\\
\$$

ヒアドキュメント

長い文字列を変数に代入したり、出力するときに使います。

<?php
$変数 = <<<_DATA_
 
「文字列を記述」
 
_DATA_;
?>
<?php
echo = <<<_DATA_
 
「文字列を記述」
 
_DATA_;
?>

配列

作成方法

1. $配列名 = array(値1, 値2, …); 

2. $配列名[キー] = 値;
<?php
$ary = array(20, 21, 27, 29, 32);
foreach ($ary as $aryi) {
    print $aryi."<br/>\n";
}
?>

//結果
20
21
27
29
32

連想配列

文字列をキーとした配列

配列関数

sort関数

sort()配列の値を昇順に並べる
asort()連想配列の値を、キーと値の関係を保持しつつ昇順に並べる
ksort()キー配列のキーをキーと値の関係を保持しつつ昇順に並べる
rsort()配列の値を降順に並べる
arsort()連想配列の値、をキーと値の関係を保持しつつ降順に並べる
krsort()キー配列のキーをキーと値の関係を保持しつつ降順に並べる
explode($d, $str)$str(文字列)を$d(文字列)で分割し、配列を返す
implode($d, $ary)$ary(配列)を$d(文字列)で連結し、文字列を返す

関数

function

ユーザ独自の関数を定義します。

function 関数名(引数) {
//処理内容
}
  • 引数は変数以外は指定できません。

関数の呼び出し

  • 関数の呼び出すときは、関数名と引数※を記述します。
    ※引数の指定がなければデフォルト値を使用します。(引数に値を指定すればその値がデフォルト値より優先されます。)
  • 関数名の大文字と小文字は区別されません。
  • 先頭の文字はアルファベットまたはアンダースコア
  • 2文字目以降はアルファベット、アンダースコア、数字
function 関数名(引数 = デフォルト値) {
//処理内容
}

return

関数から値を返す際記述します。

  • 関数が何も値を返さない場合returnは省略できます。
  • 複数の値を返す場合は配列に格納します。

ユーザー定義関数

ユーザーが独自に定義した関数。

組み込み関数

PHPにはじめから用意されている関数。

文字列関数

printf
(フォーマット,フォーマット中に変換する値)
フォーマットされた文字列を出力
mb_strlen()文字列の長さ
strlen()はマルチバイト文字に対応していない
substr($string, 開始位置, 長さ)文字列の一部を取り出す
「print substr(‘abcde’, 0, 3);」の実行結果は「abc」
str_replace
(置換前の文字列, 置換後の文字列, $string)
一部の文字列を置き換える
trim()文字列前後の空白を取り除く
ucwords()最初の文字を大文字にする
strtolower()すべて小文字にする
strtoupper()すべて大文字にする

変数

命名規則

  1. 「$名前」
  2. 名前の先頭は文字か_(アンダースコア)
  3. 名前の2文字以降は2.に加えて数字も可
  4. 大文字、小文字は区別される

スコープ

グローバル変数

関数の外部で定義された変数

ローカル変数

関数内で定義された変数

  • 関数内で有効

global

global命令を利用すると、関数ブロック内で強制的にグローバル変数にわりあてることができます。

$num = 30;
foo();
function foo() {
 global $num;
 print $num;
}

$GLOBALS

グローバル変数は通常、関数外部のみで有効になりますが、配列$GLOBALSは関数内でもアクセスが可能です。

$num1 = 30;
foo();
function foo() {
 print $GLOBALS['num'];
}

オブジェクト

オブジェクトはデータ(変数)とデータを操作する関数の集合体です。

オブジェクトはクラスをインスタンス化したものです。

クラス

新しくオブジェクトを生成するためのひな型で、クラスからオブジェクトは生成されます。

  • classで定義する
class Msg{ // Carクラス

// プロパティ
public $color; // アクセス範囲をプロパティ前に記述

// メソッド
public function start(){ // 開始
echo '開始します';
}
}

アクセス権

publicどこからでもアクセス可能
protectedクラス自身、継承したクラス、親クラスが使用可能
private定義したクラスのみ使用可能
  • varを使って宣言したプロパティは、publicとして定義されます。
  • アクセス権を設定せずに定義したメソッドは、publicと同等となります。

インスタンス

クラスから生成された実体。

newキーワードを使ってインスタンスを作成します。

new クラス名();

$obj = new Person();

オブジェクトとインスタンスの違い

「インスタンス化」と「オブジェクトの生成」は同じ意味を表すことになります。
また、オブジェクトとは、さまざまな実体の総称であり、インスタンスもオブジェクトの1つとなします。

プロパティ

クラスで定義された変数。

インスタンスのプロパティを設定するには、->キーワードを使います。

$インスタンス名 -> プロパティ名

静的メソッド

静的メソッドはクラス自体で保持しているメソッドです。

インスタンス化しなくても利用できます。

$thisをつかうことができません。

クラス名::静的メソッド名()

コンストラクタ

オブジェクトがインスタンス化されるときに自動的に呼び出されるメソッドです。

__constructで定義されます。

サブクラス

サブクラスを定義すると、既存のクラスを再利用することができます。

サブクラスを作成するにはextendsキーワードをつかいます。

class サブクラス名 extends クラス名
  • 基本的に親クラスで定義したメソッドプロパティをサブクラスで記述せずに使用できます。

名前空間

名前空間を定義することで、クラスや関数がその空間に所属していると区別ができるようになります。
→クラス名や関数名の重複によるエラーを防ぐことができます。

名前空間でクラスを定義する場合、ファイルの先頭でnamespaceキーワードと名前空間名をし記述します。

namespace 名前空間名;

階層構造

名前空間は階層構造を持たせることができます。

階層は ¥¥(バックスラッシュ)で区切り記載します。

use キーワード

エイリアスの作成

名前空間で定義されたクラスを呼び出すとき、簡単な別名(エイリアス)を使うことができます。

エイリアスを指定するには use 名前空間 as エイリアス;と記載します。

名前空間のインポート

use 名前空間;と記述することで名前空間をインポートすることができます。

ユーザとの情報交換:Webフォームの作成

$_SERVER

$_SERVER(サーバー変数)Webサーバが生成するヘッダ情報、パス情報、スクリプトの位置情報情報を使うときに使用します。

<!-- サンプルコード -->

<?php
//現在実行しているスクリプトのファイル名です。
echo $_SERVER['PHP_SELF']."<br/>\n";
//現在のスクリプトが実行されているサーバの IP アドレスです。
echo $_SERVER['SERVER_ADDR']."<br/>\n";
?>
$_SERVER[‘PHP_SELF’]Webサーバに要求するURL
$_SERVER[‘SERVER_NAME’]PHPは実行されているWebサーバの名前
$_SERVER[‘SERVER_ADDR’]IPアドレス
$_SERVER[‘REQUEST_METHOD’]リクエストのメソッド名
$_SERVER[‘REMOTE_ADDR’]ユーザの IP アドレス
$_SERVER[‘REMOTE_HOST’]現在のページにアクセスしているホストの名前
$_SERVER[‘QUERY_STRING’]検索引数

フォームで利用する関数

filter_input()

フォームで送信される内容をチェックします。

filter_input(判定対象, 判定する内容)

filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT)整数か判定
FILTER_VALIDATE_INT整数か判定
FILTER_VALIDATE_FLOAT浮動小数点か判定

trim()

文字列の前後のスペースを削除

strlen()

文字列の長さを返します

htmlentities()

HTML文字をエンコードします。クロスサイトスクリプティング攻撃を防ぎます。

変換前変換後
&&amp;
<&lt;
>&gt;
&quot;

情報の保存:データベース

PDO

PHP Data Object

PHPからデータベースにアクセスするためのインターフェースです。

//データベースへの接続
$db = new PDO('データソース名', 'ユーザ名', 'パスワード');

//例:ローカルホスト
$user = 'root';
$password = 'root';
$host = 'localhost';
$dbName = 'sample_0713';
$dsn = "mysql:host={$host};port=8889;dbname={$dbName}";


$db = new PDO($dsn, $user, $password);

PDOException

DB接続(new PDO()でインスタンスを生成する)時に何らかの問題があると、PDOクラスはPDOException例外が発行されます。

<?php
try {
$db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
exit('データベースに接続できませんでした。' . $e->getMessage());
}
?>

SQL

SELECT

SELECT 列名1, 列名2, … 
 FROM テーブル名 WHERE 条件;

INSERT

//すべての列の値を追加
INSERT INTO テーブル名 VALUES(値1, 値2, …);

UPDATE

//すべての列の値を追加
UPDATE SET テーブル名 SET 列名=値1, 値2, 値3, …
 WHERE 条件;

DELETE

DELETE FROM テーブル名 WHERE 条件;

query()

指定したSQL文をデータベースに対して実行してくれます。

prepare()

プリペアドステートメント

SQL文の値をパラメータ化したもの(プレースホルダ)で、テンプレートのようなものです。

execute()

$sql = "SELECT name, price FROM foods WHERE price >=? AND price <=?;

$q = $db->prepare($sql);

// パラメータ値の配列を渡す
$q->execute(array ($POST['min_price'], $POST['max_price']));

フェッチモード

定数取得の形式値の取得例
PDO::FETCH_ASSOC連想配列$row[‘name’]
PDO::FETCH_CLASS指定されたクラスにフェッチ$row->name

fetch

該当する結果を1行で返す

fetchAll

結果の内容をまとめて配列で返す

fetchColumn

該当するデータから単一のカラムを返す

https://www.javadrive.jp/php/pdo/index8.html

ファイルの操作

file_get_contents

file_put_contents


<?php
$file = "text.txt";
$string = "書き込む内容";
var_dump( file_put_contents($file, $string) );
?>


file_get_contents(ファイル名)ファイルの内容を読み込む
file_put_contents(ファイル名,文字列)文字列をファイルに書き込む

ローカルファイルだけでなくリモートファイル(他のコンピュータにあるファイル)にも書き込み可能です。

fopen()

fopen()関数はファイルにアクセスするときに使うファイルポインタを返します。

$ファイルポインタ = fopen(ファイル名, ファイルのモード);

モード操作ファイルポインタの位置・上書き
rb読み込み先頭
上書きしない
rb+読み込み、書き出し先頭
上書きしない
wb書き出し先頭
上書きする
wb+読み込み、書き出し先頭
上書きする
ab書き出し末尾
上書きしない
ab+読み込み、書き出し末尾
上書きしない
xb書き出し先頭
上書きしない
xb+読み込み、書き出し先頭
上書きしない
  1. ファイルへの接続をオープン
    fopen()関数
  2. 読み書き
    fgets()関数、fwrite()関数
  3. ファイルをクローズ
    fclose()関数

fgetcsv()

CSVファイルを読み込む

$配列 = fgetcsv(ファイルポインタ, 行の長さ);

header()

//header('Content-Type: ファイルの種類'); クライアントにファイルの種類を知らせる
header('Content-Type: sample/csv');

//sample.csvという名前でダウンロード
header('Content-Disposition: attachment; filename="sample.csv"');

is_readable()

ファイルが読み込み可能か判定

is_writable()

ファイルが書き込み可能か判定

file_exists()

ファイルやディレクトリが存在しているか判定

ユーザの記憶:クッキーとセッション

Cookie

クッキーを定義

setcookie(name, value, expire, path, domain, secure, httponly)

1.name … クッキーの名前
2.value … クッキーの値
3.expire … 有効期限
4.path … URLのパス
5.domain … 有効なドメイン
6.secure … secure属性(HTTPS通信時のみ許可)
7.httponly … httponly属性(JavaScriptによるクッキーの操作を防ぐ)

セッション

session_start()

session_start()関数によってセッションを作成、セッションIDをPHPSESSIDの値に設定しクライアントに返送します。

基本的にサーバ上に値を保持

session_destroy()

Webサーバが保持しているセッションのデータを削除します。

  • unset() … 配列から指定のキーの値を取り除きます。
  • reset() … 再初期化

cURL

cURLとはPHPの拡張機能(ライブラリ)です。

cURLを使うことで、外部サイトにアクセスし情報を取得するこどができます。

  1. curl セッションを初期化
  2. curl のオプションを設定
  3. curl を実行
  4. curl セッションを終了
  • curl_init() アクセスしたいURLを指定
  • curl_exec() ハンドルを利用して、PHPの動作をリクエストを取得
$url = "https://ntorelabo.com/";

//cURLセッションを初期化
$ch = curl_init();

//URLとオプションを指定
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // SSL化されているサイトも取得可能にする
curl_setopt($ch, CURLOPT_FAILONERROR, true); // HTTPステータスが400以上なら処理失敗と判断
  
//セッションを実行
$html = curl_exec($ch);

// ページに出力
if($html){
  echo $html;
}else{
  echo "サイトが見つかりませんでした";
}
  
//セッションを終了
curl_close($ch);

curl_setopt

オプション
CURLOPT_RETURNTRANSFERTRUEを設定すると、curl_exec()関数の返り値を文字列で返す
CURLOPT_HEADERTRUEを設定するとヘッダの内容も出力する
CURLOPT_POSTTRUEを設定するとPOSTのリクエストを宣言する
CURLOPT_POSTFIELDSHTTP POST で送信するデーターを設定する
CURLOPT_COOKIEJAR・TRUEを指定するとクッキーを追跡する
・ファイル名を指定すると指定のファイルにクッキーの情報が保存される
CURLOPT_COOKIEFILEクッキーのファイルを指定することでクッキーの情報を読み込む

curl_getinfo()

curlハンドルをもとにリクエスト情報を返す

$info = curl_getinfo($ch);
var_dump($info);

フレームワーク

Laravel

  • オープンソースのPHPフレームワーク、無償で利用可能
  • Bladeテンプレートエンジンをサポート

テンプレートエンジン

動的な処理プログラムと表示内容を記述したHTMLを別で管理する仕組みです。

テンプレート(HTMLのひな型)を必要に応じて書き換えて画面に出力するライブラリ

Symfony

  • オープンソースのPHPフレームワーク、無償で利用可能
  • YAML、XML、PHP、Annotationsによってルーティングを設定
  • Twigテンプレートをサポート

Zend Framework

  • オープンソースのPHPフレームワーク、無償で利用可能
  • デフォルトのテンプレートはPHP

phpコマンド

php -S Webサーバ名:ポート番号
オプション名
-S組み込みサーバを開始
-hコマンドのヘルプを表示
-mPHPに組み込まれたモジュールを表示
-aPHPを対話的に実行(PHP REPL)
※REPLとは 入力・評価・出力をできる対話型実行環境
-t組み込みWebサーバのドキュメントルートを設定
-d設定ファイル(php.ini)で設定ディレクティブにカスタム値を設定
-iphpinfo()関数を実行し、PHPの設定情報を出力

Swift Maile

// オブジェクト作成
$message = Swift_Message::newInstance;

// タイトル
$message->setSubject('タイトル');

// 送信元の設定(送信元メールアドレスと送信者名)
$message->setFrom(['name@example.com' => 'NAME']);

// 宛先(受信者のメールアドレスと受信者名)
$message->setTo['name@example.com' => 'NAME']);

// 本文
$message->setBody('本文');

// メール送信
$result = $mailer->send($message);

Composer

Composerは拡張ライブラリをインストールするためのツールです。

Composerアプリ単位で個別でパッケージをインストール
PEARすべてのアプリでパッケージを共通にしている

Packagist

Composerでインストール可能なパッケージ一覧リストです。

デバッグ、テスト

例外処理

前もって起こる可能性のあるエラーを想定しておき、その際の行う処理です。

例外処理はtry~catch~finally命令を利用します。

try~catchブロックの中で未補足の例外が発生した場合プログラムは停止します。

try {
// 例外が発生するかもしれないコード
} catch(発生するかもしれない例外の種類 例外を受け取る変数名) {
// 例外発生時の処理
} finally {
// 例外の有無にかかわらず実行する処理
}

Exception

Exceptionクラスではプログラム実行中のエラー(例外)を扱います。

<?php
 
try {
    //throw new 例外クラス名(引数)でインスタンスを作成
    throw new Exception('例外処理発生');
} catch(Exception $e) {
    //getMessageで例外メッセージを取得
    echo $e->getMessage();
}
 
?>

set_exception_handler

ユーザ定義の例外ハンドルを設定するときにset_exception_handler()関数を使います。

<?php
function test_exception_handler($exception) {
 …
}

set_exception_handler("test_exception_handler");
throw new Exception("例外ハンドル!!");
?>

PHPUnit

PHPUnitはPHPのコードのテストを記述するためのデファクトスタンダードです。

  1. アサーション
  2. アノテーション

assertEquals()

アサーションメソッドの一つです。1つ目と2つ目の引数が一致しない場合にエラーを報告します。

parse_ini_file()

parse_ini_file()をつかうと構成ファイル(PHP設定ファイルのphp.iniファイルと同じ形式)内容を一度に読み込むことができます。

display_errors

PHPでエラーを表示するとき、PHPのファイル(php.ini)で

display_errors = On

log_errors

PHPでエラーログをサーバに送信するとき、PHPのファイル(php.ini)で

log_errors = On

error_reporting

error_reportingはphp.iniの設定値です。

設定するレベルによって出力する内容がかわります。

Parse Errorプログラムに構成上の問題があるE_PARSE
Fatal Error
(致命的なエラー)
プログラムの内容に関わる重大の問題がある
発生した場合は処理を停止
E_ERROR
Warningプログラムに疑わしい箇所があるE_WARNING
Notice
(注意)
マナー違反のまま動作しているE_NOTICE
Strict Notice
(厳格注意)
コーディングスタイルについての注意E_STRICT

Git

バージョン管理システム

タイムゾーン

タイムゾーンを指定しない場合デフォルトでUTC(Universal Time Coordinated:協定世界時間)が設定されます。

<タイムゾーン設定法>

  • php.iniファイルのdate.timezoneの項目で設定する
  • スクリプト内でdate_default_timezone_set関数で設定する

phpインストール Mac

https://www.stub-create.com/blog/php/mamp-brew.html
Ctrl+Alt+Deleteの使い方完全ガイド

基本的な使い方

  1. キーボードの「Ctrl」キー、「Alt」キー、「Delete」キーを同時に押します
  2. 画面が切り替わり、以下のメニューが表示されます:
  • タスクマネージャー
  • ログオフ
  • パスワードの変更
  • タスクの切り替え
  • シャットダウン

主な活用シーン

1. プログラムがフリーズした時

  • タスクマネージャーを開いて問題のプログラムを強制終了できます
  • 「応答なし」となっているプログラムを選択して「タスクの終了」をクリック

2. セキュリティ対策として

  • 席を離れる時にログイン画面に戻せます
  • 不正アクセスが疑われる時に安全にロックできます

3. システム管理

  • 実行中のプログラムやプロセスの確認
  • メモリやCPU使用率の監視
  • パフォーマンスの確認

注意点

  • 作業中のデータは事前に保存しておきましょう
  • フリーズ時に連打するのは避けましょう
  • 通常の操作では必要ありません
【Next.js TypeScript 】React Swiper カルーセルスライダー実装、スライドが中央寄せにする方法

完成イメージ

手順

Next.js プロジェクトを用意します

npx create-next-app@latest my-carousel-app

プロジェクトに必要な依存関係をインストール

Swiperと必要なアイコンライブラリをインストールします

# Swiperのインストール
npm install swiper

# Font Awesome(ナビゲーション用アイコン)のインストール
npm install @fortawesome/react-fontawesome @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons

# 型定義のインストール(TypeScriptを使用する場合)
npm install --save-dev @types/react-fontawesome

コンポーネントの実装

my-nextjs-app/
├── src/
│   ├── app/
│   │   └── page.tsx          # メインページ
│   ├── components/
│   │   └── ReactSwiper.tsx   # カルーセルコンポーネント
│   └── styles/
│       └── reactSwiper.module.css  # コンポーネント用スタイル
├── package.json
└── ...その他の設定ファイル
ReactSwiper.tsx # カルーセルコンポーネント
"use client";
import React from "react";
import { Swiper, SwiperSlide } from "swiper/react";
import { Navigation, Pagination, Autoplay, Mousewheel } from "swiper/modules";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
  faChevronLeft,
  faChevronRight,
} from "@fortawesome/free-solid-svg-icons";
import "swiper/css";
import "swiper/css/pagination";
import "swiper/css/navigation";
import styles from "@/styles/reactSwiper.module.css";

interface CarouselProps {
  images?: string[];
}

const ReactSwiper: React.FC<CarouselProps> = ({ images }) => { 
  // 画像がない場合のデフォルト画像
  const defaultImages = [
    "https://bizlabo.site/assets/sample-img/column1.jpg",
    "https://bizlabo.site/assets/sample-img/column2.jpg",
    "https://bizlabo.site/assets/sample-img/column3.jpg",
    "https://bizlabo.site/assets/sample-img/column4.jpg",
    "https://bizlabo.site/assets/sample-img/column5.jpg",
    "https://bizlabo.site/assets/sample-img/column6.jpg",
    "https://bizlabo.site/assets/sample-img/column7.jpg",
    "https://bizlabo.site/assets/sample-img/column8.jpg",
  ];

  const imagesToUse = images || defaultImages;

  return (
    <div className={styles.container}>
      <Swiper
        modules={[
          Navigation, // ナビゲーション(次へ/前へボタン)を有効にするモジュール
          Pagination, // ページネーション(スライドのインジケーター)を有効にするモジュール
          Autoplay,   // 自動再生を有効にするモジュール
          Mousewheel  // マウスホイールでスライドをスクロールできるようにするモジュール
        ]}        spaceBetween={10} // スライド間のスペースを30pxに設定
        navigation={{
          nextEl: `.${styles.swiperButtonNext}`, // 次へボタン
          prevEl: `.${styles.swiperButtonPrev}`, // 前へボタン
        }}
        pagination={{
          clickable: true, // ページネーションをクリック可能に
          bulletClass: styles.bullet,
          bulletActiveClass: styles.bulletActive,
        }}
        // autoplay={{ delay: 3000 }}
        loop
        centeredSlides // スライドを中央に表示
        slidesPerView={1}
        breakpoints={{
          0: {
            slidesPerView: 1.4,
          },
          768: {
            slidesPerView: 2.2,
          },
          1024: {
            slidesPerView: 4,
          },
        }}
        speed={800}
        className={styles.reactSwiper} // Swiperコンポーネントにクラス名を追加
      >
        {imagesToUse.map((image, index) => (
          <SwiperSlide key={index} className={styles.slide}>
            <img
              src={image}
              alt={`Slide ${index}`}
              className={styles.slideImage}
            />
          </SwiperSlide>
        ))}
        <div className={styles.swiperButtonPrev}>
          <FontAwesomeIcon icon={faChevronLeft} />
        </div>
        <div className={styles.swiperButtonNext}>
          <FontAwesomeIcon icon={faChevronRight} />
        </div>
      </Swiper>
    </div>
  );
};

export default ReactSwiper;
reactSwiper.module.css # コンポーネント用スタイル
.container {
  position: relative;
  padding: 2rem 0;
  overflow: hidden;
}

.slide {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 90%;
}

.slideImage {
  width: 100%;
  height: auto;
  cursor: pointer;
}

.swiperButtonPrev,
.swiperButtonNext {
  position: absolute;
  top: calc(50% - 20px);
  transform: translateY(-50%);
  z-index: 2;
  cursor: pointer;
  color: #000;
  font-size: 4vw;
  transition: color 0.3s ease;
  background-color: rgba(255, 255, 255, 0.8);
  border-radius: 50%;
  width: 6vw;
  height: 6vw;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: all 0.3s ease;
}

.swiperButtonPrev:hover,
.swiperButtonNext:hover {
  color: #666;
  background-color: rgba(255, 255, 255, 0.6);
  width: 7vw;
  height: 7vw;
}

.swiperButtonPrev {
  left: 10px;
}

.swiperButtonNext {
  right: 10px;
}

.bullet {
  width: 12px;
  height: 12px;
  display: inline-block;
  border-radius: 50%;
  background: #ccc;
  margin: 0 4px;
  cursor: pointer;
  transition: all 0.3s ease;
}

.bullet:hover {
  background: #666;
  width: 14px;
  height: 14px;
}

.bulletActive {
  background: #000;
}

.reactSwiper {
  padding-bottom: 40px;
}

/* .reactSwiper :global(.swiper-slide) {
  opacity: 1;
} */

/* .reactSwiper :global(.swiper-slide:not(.swiper-slide-active)) {
  opacity: 0.2;
} */

.reactSwiper :global(.swiper-pagination) {
  bottom: 0;
}

スライドの中に画像だけでなくテキストも入れる場合

reactSwiperVoice.tsx # コンポーネント
'use client'
import React, { ReactNode } from 'react'
import { Swiper, SwiperSlide } from 'swiper/react'
import { Navigation, Pagination, Autoplay } from 'swiper/modules'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import {
    faChevronLeft,
    faChevronRight,
} from '@fortawesome/free-solid-svg-icons'
import 'swiper/css'
import 'swiper/css/pagination'
import 'swiper/css/navigation'
import styles from '@/styles/reactSwiperVoice.module.css'

interface SlideItem {
    id: number
    customerSrc: string
    customerAlt: string
    text: ReactNode
}

const ReactSwiperVoice: React.FC = () => {
    const slideItems: SlideItem[] = [
        {
            id: 1,
            customerSrc: 'https://bizlabo.site/assets/staff-img/staff-1.png',
            customerAlt: 'Customer01',
            text: (
                <>
                    テキスト
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                </>
            ),
        },
        {
            id: 2,
            customerSrc: 'https://bizlabo.site/assets/staff-img/staff-2.png',
            customerAlt: 'Customer02',
            text: (
                <>
                    テキスト
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                </>
            ),
        },
        {
            id: 3,
            customerSrc: 'https://bizlabo.site/assets/staff-img/staff-3.png',
            customerAlt: 'Customer03',
            text: (
                <>
                    テキスト
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                </>
            ),
        },
        {
            id: 4,
            customerSrc: 'https://bizlabo.site/assets/staff-img/staff-4.png',
            customerAlt: 'Customer04',
            text: (
                <>
                    テキスト
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                </>
            ),
        },
        {
            id: 5,
            customerSrc: 'https://bizlabo.site/assets/staff-img/staff-5.png',
            customerAlt: 'Customer05',
            text: (
                <>
                    テキスト
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    <br />
                </>
            ),
        },
        {
            id: 6,
            customerSrc: 'https://bizlabo.site/assets/staff-img/staff-6.png',
            customerAlt: 'Customer06',
            text: (
                <>
                    テキスト
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    <span className={styles.marker}>テキストテキストテキストテキスト
                        
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    </span>
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                </>
            ),
        },
        {
            id: 7,
            customerSrc: 'https://bizlabo.site/assets/staff-img/staff-7.png',
            customerAlt: 'Customer07',
            text: (
                <>
                    テキスト
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                </>
            ),
        },
        {
            id: 8,
            customerSrc: 'https://bizlabo.site/assets/staff-img/staff-8.png',
            customerAlt: 'Customer08',
            text: (
                <>
                    テキスト
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                    <br />
                    <br />
                    <span className={styles.marker}>テキストテキストテキストテキスト</span>
                    <br />
                    テキストテキストテキストテキストテキストテキストテキストテキスト
                </>
            ),
        },
    ]

    return (
        <div className={styles.container}>
            <h2 className={styles.title}>お客様の声</h2>
            <Swiper
                modules={[Navigation, Pagination, Autoplay]}
                spaceBetween={1} // スライド間のスペース
                navigation={{
                    nextEl: `.${styles.swiperButtonNext}`, // 次へボタン
                    prevEl: `.${styles.swiperButtonPrev}`, // 前へボタン
                }}
                pagination={{
                    clickable: true, // ページネーションをクリック可能に
                    bulletClass: styles.bullet,
                    bulletActiveClass: styles.bulletActive,
                }}
                autoplay={{ delay: 2000 }} // 自動再生
                loop
                centeredSlides // スライドを中央に表示
                // 1画面に表示するスライド数
                breakpoints={{
                    0: {
                        slidesPerView: 1.2,
                    },
                    768: {
                        slidesPerView: 2.4,
                    },
                    1024: {
                        slidesPerView: 4,
                    },
                }}
                speed={800} // スライドアニメーションのスピード
                className={styles.reactSwiper} // Swiperコンポーネントにクラス名を追加

                slideActiveClass={styles.slideActive} // アクティブなスライドにクラス名を追加
                slidePrevClass={styles.slidePrev} // 前のスライドにクラス名を追加
                slideNextClass={styles.slideNext} // 次のスライドにクラス名を追加
            >
                {slideItems.map((slideitem, index) => (
                    <SwiperSlide key={index} className={styles.slide}>
                        <div className={styles.slideHeader}>
                            <img
                                src={slideitem.customerSrc}
                                alt={slideitem.customerAlt}
                                className={styles.slideCustomer}
                            />
                        </div>
                        <p className={styles.slideText}>{slideitem.text}</p>
                    </SwiperSlide>
                ))}
                <div className={styles.swiperButtonPrev}>
                    <FontAwesomeIcon icon={faChevronLeft} />
                </div>
                <div className={styles.swiperButtonNext}>
                    <FontAwesomeIcon icon={faChevronRight} />
                </div>
            </Swiper>
        </div>
    )
}

export default ReactSwiperVoice
reactSwiperVoice.module.css # コンポーネント用スタイル
.container {
    position: relative;
    padding: 2rem 0;
    overflow: hidden;
}

.title {
    font-size: 1.5rem;
    font-weight: bold;
    margin-bottom: 2rem;
    text-align: center;
}

.swiper-wrapper {
    align-items: stretch;
}

.slide {
    border: solid 6px #555;
    border-radius: 0.5rem;
    display: flex;
    flex-direction: column;
    height: auto; /* 高さをそろえるため */
    box-sizing: border-box;
    transition: all 0.3s ease;
    transform: scale(0.9)!important;
}

.slideActive {
    transform: scale(1)!important;
}



.slideHeader {
    background-color: #ececec;
    text-align: center;
}

.slideCustomer {
    width: 40%;
    height: auto;
    object-fit: contain;
    vertical-align: bottom;
}

.slideText {
    padding: 1rem;
    font-size: clamp(0.75rem, 1.2vw, 1.5rem);
}

.marker {
    background-size: 0 0;
    background-position: left bottom;
    background-repeat: no-repeat;
    background-image: linear-gradient(to right, #ffb180, #ffb180);
    transition: background-size 0.8s ease;
}

.slidePrev .marker,
.slideNext .marker {
    background-size: 0 0;
}

.slideActive .marker {
    background-size: 100% 0.5rem;
}

.swiperButtonPrev,
.swiperButtonNext {
    position: absolute;
    top: calc(50% - 20px);
    transform: translateY(-50%);
    z-index: 2;
    cursor: pointer;
    color: #fff;
    font-size: 4vw;
    transition: color 0.3s ease;
    background-color: rgba(0, 0, 0, 0.8);
    border-radius: 50%;
    width: 6vw;
    height: 6vw;
    display: flex;
    justify-content: center;
    align-items: center;
    transition: all 0.3s ease;
}

.swiperButtonPrev:hover,
.swiperButtonNext:hover {
    background-color: rgba(0, 0, 0, 0.6);
}

.swiperButtonPrev {
    left: 10px;
}

.swiperButtonNext {
    right: 10px;
}

.bullet {
    width: 12px;
    height: 12px;
    display: inline-block;
    border-radius: 50%;
    background: #ccc;
    margin: 0 4px;
    cursor: pointer;
    transition: all 0.3s ease;
}

.bullet:hover {
    background: #666;
    width: 14px;
    height: 14px;
}

.bulletActive {
    background: #000;
}

.reactSwiper {
    padding-bottom: 40px;
}

.reactSwiper :global(.swiper-pagination) {
    bottom: 0;
}

アクティブなスライドを中央寄せにならないときの解決方法

(問題)アクティブなスライドを中央に表示させるにはcenteredSlides: trueでなるはずですが、ずれてしまう

box-sizing: border-box;に指定

スライドに聞いているプロパティが何かしら影響していることがあるので要注意です

.slide {
    border: solid 6px #555;
    border-radius: 0.5rem;
    display: flex;
    flex-direction: column;
    height: auto; /
    box-sizing: border-box;* 中央寄せに */
    transition: all 0.3s ease;
    transform: scale(0.9)!important;
}

参考サイト

https://b-risk.jp/blog/2022/04/swiper/
WordPress自作、カスタマイズ

便利なプラグイン

WP Multibyte Patch

https://ja.wordpress.org/plugins/wp-multibyte-patch

Show Current Template

https://ja.wordpress.org/plugins/show-current-template

テンプレートタグ

テンプレートタグとはWordPressで用意されたカスタマイズするためのPHPの関数です

home_url()

現在のブログのホームURLを返します。

無害化(サニタイズ)を行う必要があります。

echo esc_url( home_url() );

the_content();

現在の投稿ページの本文を出力します。このテンプレートタグはWordPressループの中で使わなければなりません。

single.phpなど個別の投稿記事ページで管理画面で入力した本文を表示させるために使います。使い方は、テンプレートファイル(single.phpなど)の表示させたい箇所でWordPressループさせて表示させます。

get_template_part($slug, $name, $args)

header.php、footer.php、sidebar.phpなどを除いたテンプレートファイルを読み込みます。

wp_head();

wp_headアクションをスタートさせます。(アクションフックを登録する関数) テーマテンプレートファイル内の</head>タグの直前で使います。

このテンプレートタグがなければhead内に必要な情報が出力されません。スタイルシートJavaScriptが読み込まれなかったりします。

wp_footer();

wp_footerアクションフックをスタートさせます。 テーマテンプレートファイル内の</body>タグの直前で使う。</body>タグの直前に記述します。 このテンプレートタグがなければ、ログイン中にサイト上部に管理バーが表示ず、またスクリプトがエラーになったりします。

bloginfo( );

bloginfo( 'name' ); // サイトタイトル出力
bloginfo( 'description' ); // キャッチフレーズ出力

wp_nav_menu();

管理画面で設定したナビゲーションメニューを表示します。 このテンプレートタグで出力されるメニューは「管理画面→外観→メニュー」で作成できます。

<?php
  wp_nav_menu(
    array(
      'theme_location'  => 'top',
      'menu_id'         => 'top-menu',
      'container'       => 'nav',
      'container_class' => 'header-navigation-container',
    )
  );
?>
キー説明
theme_locationメニューを構成するul 要素に適用するID
menu_idregister_nav_menu()やregister_nav_menus()で設定したテーマの中で使われる位置
containerメニューを囲むコンテナのタグを変更
container_classメニューを囲むコンテナのクラスを変更
https://retval.jp/blog/wp-function-navigation

オリジナルテーマ作成手順

https://ntorelabo.com/?p=3224
https://siennahare23.sakura.ne.jp/wp-lesson/%e3%82%aa%e3%83%aa%e3%82%b8%e3%83%8a%e3%83%ab%e3%83%86%e3%83%bc%e3%83%9e%e3%81%ae%e4%bd%9c%e6%88%90

テーマユニットテスト

様々なテスト用データをインストールできる

フック

「特定のタイミング」で「外部からの処理を追加できる」ようにするもの

  • 特定のタイミング → WordPress本体やテーマ、プラグインが用意してくれている。
  • 外部からの処理
    1. 関数を実行 … アクションフック
    2. 変数を上書き … フィルターフック

アクションフック

処理を追加するときに使います。WordPressの処理のタイミングで作成した処理を割り込ませることができます。

do_actionでフックを設置し、add_actionでそのフックに処理を追加する

add_action

<?php add_action( $hook, $function_to_add, $priority, $accepted_args ); ?>

add_action( 'フックさせたい場所の名前', '呼び出してほしい関数名', 優先順位(省略可能),引数の数(省略可能) );

フィルターフック

データベースに追加する前やブラウザに表示する前などに、様々な形のテキストをカスタマイズするためのフックです。

apply_filtersでフックを設置し、add_filterでそのフックに処理を追加する

https://ntorelabo.com/?p=7978

既存のテーマの子テーマによるカスタマイズ

1からテーマを作成するより、子テーマによるカスタマイズのほうがよい理由がいくつかあります。

  • WordPressの多くの機能を把握しておく必要がない(関数など)
  • 毎回のアップデート影響をうけず、親テーマにまかせることができる

上記の観点から、親テーマの選定は長期で使われていて、アップデートを頻繁にしているものがよいといえます。

親テーマより小テーマのテンプレートファイルが優先して読み込まれる

小テーマがある場合WordPressは小テーマでファイルを探し、なければ親テーマのファイルを読み込みます。※functions.phpは上書きではなく子→親両ファイル読み込みます

例えばヘッダー部分をカスタマイズしたい場合親テーマのheader.phpを小テーマのディレクトリに複製して内容を書き換えます。

https://siennahare23.sakura.ne.jp/wp-lesson/%e5%ad%90%e3%83%86%e3%83%bc%e3%83%9e%e3%81%ae%e4%bd%9c%e6%88%90

Lightningの子テーマカスタマイズ

▼フォルダ構成

  • lightning-child
    • style.css
    • functions.php
    • assets
      • css
        • style.css
    • _g3
      • template-parts
        • site-header.php

style.css

/*
Theme Name: lightning Child
Template: lightning
*/

functions.php

<?php
add_action('wp_head', function() {
    ?>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Josefin+Sans:ital,wght@0,100..700;1,100..700&family=Noto+Sans+JP:wght@100..900&display=swap" rel="stylesheet">
    <?php    
});
add_action(
    'wp_enqueue_scripts', function() {
        wp_enqueue_style('parent-style', get_template_directory_uri() .'/style.css');
        wp_enqueue_style('child-style', get_stylesheet_directory_uri() .'/assets/css/style.css', array('parent-style'), date("ymdHis", filemtime( get_stylesheet_directory() .'/style.css')));
    }
);

Lightning ヘッダーカスタマイズ

実現したいこと画面上部追従、ロゴは中央

_g2/header.phpを作成し編集

参考サイト:https://qiita.com/healing_code/items/1be7ca44b4a5b63436b7

今回のケースでは上記テンプレートファイルではなく、_g3/template-parts/site-header.phpでした

Lightning ヘッダー設定

  • ヘッダーレイアウト →中央揃え
  • グローバルナビスクロール時のレイアウト →固定しない

Lightning ハンバーガーメニューカスタマイズ

Lightningのハンバーガーメニューは画像

参考サイト:https://wordpress.org/support/topic/%E5%AD%90%E3%83%86%E3%83%BC%E3%83%9E%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B_g3%E3%80%81inc%E5%86%85%E3%81%AEvk-mobile-nav%E6%94%B9%E5%A4%89%E5%8F%8D%E6%98%A0%E3%81%AE%E4%BB%B6/

特定のページのみCSS/JSファイルを読み込ませる方法

add_action( 'wp_enqueue_scripts', function(){
// トップページにだけCSSファイルを追加
if( is_front_page() ){
wp_enqueue_style(
'front',
get_template_directory_uri() . '/assets/css/front.min.css',
array(),
''
);
}
// 投稿IDが30のページにのみJSファイルを追加
if(is_page(30)){
wp_enqueue_script(
'page30js',
get_template_directory_uri() . '/assets/js/page30.js',
array(),
array(),
true
);
}
}
https://flex-box.net/wordpress-css-ispage

特定の固定ページだけ処理をする方法

function getPostList(){
// 検索条件の登録
$arg = [
'posts_per_page' => 20,
'order' => 'ASC',
'post_status' => 'publish'
];
$queryObject = new WP_Query($arg);
// 取得した投稿一覧はpostsに格納されている
return $queryObject->posts;
}
// 取得した記事一覧をループさせ、HTML化
foreach(getPostList() as $post){
~...
// 投稿名
$post->post_title;
// 本文
$post->post_content;
https://b-risk.jp/blog/2022/12/wp-functions

トラブル

エラーの種類

Error
エラー
構文がおかしかったり、関数名が重複している場合になるエラー
エラーになった時点でプログラムは停止する
Warning
警告
引数が足りない場合等になるエラー
プログラムは動作しているが、正常に動作していない可能性が高い
Notice
注意
未定義の関数の使用など、軽微な問題
プログラムは動作しているが、正常に動作していない可能性が高い

デバッグモード

WordPressはデフォルトでエラーメッセージを出力しない設定となっていますが、デバッグモードを有効にすることで表示することができます。

define( 'WP_DEBUG', false ); define( 'WP_DEBUG', true ); 

よくある内容

(構文がおかしいときに発生)
Parse error: syntax error, unexpected ○○ in ファイル名 on line 行数
(関数が未定義のときに発生)
Fatal error: Call to undefined function 関数名() in ファイル名 on line 行数
(同じ関数名で関数を定義したときに発生)
Fatal error: Cannot redeclare 関数名() (previously declared in ファイル名 on line 行数A) in ファイル名 on line 行数B
(変数が未定義のときに発生)
Notice: Undefined variable: 変数名 ~ in ファイル名 on line 行数

https://site-manage.net/archives/3346
FTPソフトでホームページを公開

FTP(File Transfer Protocol) … ファイル転送プロトコル

サーバにホームページのファイルをアップロードしたり、バックアップとしてダウンロードすることが可能

主なFTPソフト

  • FileZilla

FTPアカウント情報

  • FTPホスト名(FTPサーバー名)
  • FTPユーザー名(FTPアカウント名)
  • FTPパスワード

public_html

public_htmlはレンタルサーバにホームページのHTMLファイル(html、css、画像等のファイル)をアップロードするフォルダです。

xserverのサーバーパネルにてドメイン、サブドメインを作成しそちらのpublic_htmlフォルダにアップロードする

index.html

トップページはindex.htmlが表示されます。

FTPではなくGitの利用

現在FTPはレガシーな手段という印象で、ヒューマンエラーが発生しやすい問題があります。

Gitでファイルの転送をすることが多いです。小規模で管理するサイトでは問題ないですが、大規模で大人数で管理する場合は特に推奨されます。

生産管理システム

生産管理システムの成果

  • 業務効率の向上
    • 時間短縮(在庫確認、発注、変更登録、製造履歴検索)
  • 管理精度向上
    • 発注量
    • 在庫管理
    • 生産管理
  • クラウド管理 → いつでもどこでも管理可能

生産管理の定義

  • 生産計画の作成
    1. 出荷指示書
    2. ピッキング
    3. 荷造り
    4. 配送先仕分け
    5. 出荷書類
    6. 積込み
    7. 出荷記録
  • 購買管理
  • 受注管理
  • 工程進捗管理
  • 在庫管理
  • 原価管理
  • 生産性管理

CAD

  • Computer Aided Design
  • 設計作業において効率よくするためのコンピュータ利用した支援

CAE

  • Computer Aided Engineering
  • 製造業等で活用されるシミュレーション解析

E-BOM

製品データベース

M-BOM

E-BOMに様々な情報を付加

ERP

  • Enterprise Resource Planning(企業資源計画)
  • 「会計」「人事」「生産」「物流」「販売」を統合的に管理

生産形態

業務の把握

受注

  • 最新の受注内容
  • 受注変更の調整
  • EDIシステムへの対応

購買

  • 発注先の進捗 → 生産調整

生産

  • リアルタイムの生産進捗

販売

  • 販売状況
  • 製品在庫
  • 需要予測

顧客の要求

  • 7つのサブシステム「生産計画」「工程管理」「在庫管理」「原価・生産性管理」「販売管理」「購買管理」「マスタ管理」
  • 販売管理 … 需要情報
  • 生産計画は時間経過とともに具体的に

生産間の周辺システム

関係の深いシステム

  1. 販売管理システム
  2. EC•EDI受発注システム
  3. POPシステム
  4. 在庫管理システム
  5. 会計システム

関係の薄いシステム

  1. 設計開発管理CAD/CAM/ CAE
  2. 製品管理PDM /PLM
  3. 自動倉庫システム
  4. 給与・労務システム

MRP

Material Requirement Planning資材所要量計画

  • 製品を作るのに必要な材料、部品の所要量の計算法
  • BOMが必須

BOM

BOMはP/N(Parts Number:品名マスタ)とP/S(Parts Structure:部品構成マスタ)から構成されます。

品名マスタ

製品部品の基礎情報として、製造業の全ての業務で扱う全情報の個々の情報を集めたものです。

属性データ、調達データ、管理データの3つに分けられます。

属性データ

  • 製品・部品名称
  • 設計番号
  • 材質
  • 品質レベル
  • 変換比率

調達データ

  • 内・外製区分
  • 購入先
  • 価格
  • 調達リードタイム

管理データ

  • 担当工場
  • ストップコード
  • 状態コード

名称コード

意味づけコード意味なしコード
認知性コードを見れば概要がわかるコード表の参照が必要
永続性時間経過でリスクありあり
採番性・管理者が必要
・分散で採番可
・集中管理必要
・自動的に採番可能
システム化コードに翻訳が必要対応性高
利便性習熟が必要未経験者に便利
【基本情報】表計算

相対

相対(セル, x, y)セルの行番号にx、列番号にy移動

例)相対(B3,3,2)

整数部

引数を超えない一番大きな整数を返す

整数部(-2.9)→-3

余剰

割り算の余を求める

剰余(8,3)→2
剰余(40,7)→5

切上げ

切上げ(算術式,桁位置)
切上げ(429,0) → 429
切上げ(429.001,0) → 430

切捨て

切捨て(算術式,桁位置)
切捨て(429.857,0) → 429
切捨て(429.857,-2) → 400
切捨て(算術式,桁位置)
切捨て(429.857,0) → 429
切捨て(429.857,-2) → 400

IF

IF (論理式,式1,式2)
・論理式がtrue → 式1
・論理式がfales → 式2 

論理積

論理積(論理式1,論理式2,論理式3,…)
・論理式1,論理式2,論理式3,…が全てtrueのとき → true
・それ以外 → fales

論理和

論理積(論理式1,論理式2,論理式3,…)
・論理式1,論理式2,論理式3,…がいずれかtrueのとき → true
・それ以外 → fales

垂直照合

垂直照合( 式 , セル範囲 , 返却値の列の位置 , 検索の指定 )

・検索の指定は1か0が指定可能で、1 → 式の数値以下で最大値を検索する

水平照合

水平照合( 式 , セル範囲 , 返却値の行の位置 , 検索の指定 )

・検索の指定は1か0が指定可能で、1 → 式の数値以下で最大値を検索する

照合検索

照合検索 (式, 検索のセル範囲, 抽出のセル範囲)

検索のセル範囲(※1行または1列で指定する必要がある。)の○番目で一致
 → 抽出のセル範囲の○番目の値を返す

表引き

行と列を指定して値を返す

表引き (表の範囲, 行の位置, 列の位置)

照合一致

検索結果の位置を返す

照合一致 (式, セルの範囲, 検索の指定)
  1. 検索語を指定
  2. 範囲を指定※1行または1列で指定する必要がある。
  3. 完全一致かどうかを指定
  4. 結果
    • 検索の指定が0 … セル範囲での位置を返します。(左側か上側が基準、行列番号ではない)
    • 検索の指定が1 … 値以下の最大値を検索する。
    • 検索の指定が-1 … 値以上の最小値を検索する。

条件付個数

検索条件と一致する個数を求める

条件付個数(セル範囲,検索条件)

検索条件 … 数えるセルの条件(例)≦C9、≦20、='文字列'

条件付合計

条件付合計(セル範囲,検索条件,合計セルの範囲)

【基本情報】アルゴリズム、プログラミングを効率化するフローチャート

擬似言語

分岐

選択処理

条件式が真 → 処理を実行する

繰り返し

処理を実行する前、条件式が真の限り処理を繰り返す

処理を実行後、条件式が真の限り処理を繰り返す

条件式が真の間、繰り返し処理
開始時に初期値を格納し、繰り返すたび増分を加える

解答手順

以下の点を書き出して整理して考えてみる

  • プログラム目的は?
  • 配列定義添字
  • 変数定義添字
  • 変数具体的な数値を代入してイメージしてみる

プログラミング言語現場でのフローチャート

フローチャートでシステム設計ができると、プログラミングがそれに従いコーディングするだけで、修正が少なくなり効率的に進行ができます!

フローチャートの基本記号 開始 開始/終了 (端子) 処理内容 処理 条件 条件分岐 処理名 定義済み処理 (サブルーチン) ループ開始 ループの開始 ループ終了 ループの終了 入出力 入出力 A 結合子 (同紙参照) 1 外部結合子 (別紙参照) フローチャート使用例 開始 データ入力 処理実行 条件? サブルーチン 結果出力 終了 Yes No

Excelやcacooというサービスも使用してみるといいかもしれません、フローチャートのテンプレートもあります!

下記はcacooで作成しました、これぐらいシンプルで細かくパーツ化するのもいいかもしれません。

状態リスト 7 追加 8 検索 9 削除 10 お客様情報 編集する 11 お客様情報 クレア 追加 12 削除 13

https://cacoo.com/ja

Obsidianノート術の要点まとめ

Obsidianの特徴と利点

  • ローカル保存ベースの自由度の高いノートアプリ
  • Markdown + プラグイン + Git連携で強力な知識管理が可能。
  • Notionと比べて自由度やバックアップの点で優れる(ただし使い分けている)。

■ 導入手順(ざっくり)

  1. Obsidianインストール(公式サイトからDL)。
  2. Git/GitHubのセットアップ(リポジトリをテンプレートから作成・クローン)。
  3. Obsidianでクローンしたフォルダを開く。
  4. テンプレートに含まれる初期設定・レイアウトをロード。
  5. 不要なサンプルファイルを削除 → Gitでコミット&プッシュ。

■ テンプレート構成(主なディレクトリ)

  • 00_Templates: テンプレートファイル置き場。
  • 01_Journals: 年単位で分類された日記。
  • 02_Notes: 年単位で分類されたノート。
  • 03_Assets: 画像等の補助ファイル。
  • 04_Canvas: 自由配置形式のキャンバスファイル。
  • 05_Dataviews: データ一覧表示の設定ファイル群。

■ こだわりポイント

  • ネットワーク的な情報構造(リンクによる情報の繋がり)。
  • 集中できるUIレイアウト、余計なノイズは削除。
  • フォントは好みに合わせて設定推奨(標準だと違和感あり)。
  • Git運用は「単一ブランチ・手動コミット」を基本とする。

■ ちょっとしたTips

  • Ctrl+QでObsidian終了時にGitバックアップするショートカットを設定。
  • テーマやプラグイン、アプリの更新は手動チェックが必要。
  • ノートは経験からの知識を記録するのが大事(Wikipediaの二番煎じにならないように)

符号つき2進数

最上位ビットで正負を示した2進数

シフト演算

論理シフト

  • 符号を考慮しない
  • 溢れたビットは捨てる
  • 開いたビットは0を入れる
  • 論理左シフト … 2n
  • 論理右シフト … −2n

算術シフト

  • 符号を考慮する … 1番左の数が1 → 負の数
  • 先頭の符合を表すビットは固定で残りビットに対して処理が行われる

2の補数

<2の補数の計算方法>

【基本情報】データベース

データベースとストレージの違い

ストレージとデータベースの違い ストレージ (Storage) 特徴: 単純なデータ保存の仕組み 構造化されていないデータ 基本的なファイル操作のみ 例: ハードディスク SSD USBメモリ クラウドストレージ データベース (Database) 特徴: 構造化されたデータ管理 効率的な検索・更新・削除 複雑なクエリが可能 データ間の関係性を管理 例: MySQL PostgreSQL MongoDB Oracle

それ自体がデータかどうか?

データベースはそれ自体もデータです、ストレージはデータではなく装置です!

ストレージはデータを保存するための単なる媒体であるのに対し、データベースはデータの構造や関係性も含めた総合的な情報システムとして捉えることができます。

ただし、大量の画像や動画などのバイナリデータについては、実際にはファイルシステム上に格納し、データベースにはそのファイルへの参照(パスや識別子)だけを保存するという方法がよく使われます。

データベースとストレージの比較表 比較項目 ストレージ データベース 基本的な役割 データを物理的に 保存する場所 データを構造化して 管理するシステム データとしての性質 自体はデータではなく 単なる「容器」 自体がメタデータを含む 構造化された情報 主な機能 データの読み書き 基本的なファイル操作 高度な検索・更新 トランザクション制御 複雑なクエリ処理 構造 特定の構造を持たない 単なる記憶領域 スキーマ、テーブル インデックス、関係定義 バックアップ時の 考慮点 データのコピーのみ が主な考慮点 データに加え構造情報も 保存する必要がある 具体例 HDD、SSD、USBメモリ クラウドストレージ MySQL、PostgreSQL MongoDB、Oracle 例え話 本を置くだけの 単なる本棚 分類システムや索引を 備えた図書館
データベースとストレージの関係性 物理ストレージ HDD, SSD, クラウドストレージなど ファイルシステム ファイル構造、基本的なファイル操作 例:FAT32, NTFS, ext4, APFS データベース管理システム データの構造化と管理 検索、更新、トランザクション制御 例:MySQL, PostgreSQL, MongoDB アプリケーション Webサイト、業務システムなど ユーザー側 ミドルウェア OS層 ハードウェア層 データ操作 データ表示 ユーザーインターフェース データの構造化 クエリ処理 トランザクション管理 セキュリティ制御 バックアップと復元 ファイル名管理 ファイル位置管理 基本的なI/O操作 物理的データ保存 読み書き操作 永続的なデータ保管

データベースはストレージの上に構築された高度なシステムであることが分かります。

データベース設計

トランザクション

複数の処理を一つの処理とみなし、全て成功か、全て失敗のどちらかになる。

ACID特性

原子性
ATOMICITY
完全に実行されるか、全く実行されないかどちらか
一貫性
CONSISTENCY
トランザクションの実行前後で整合性をもち、一貫したデータである
独立性
ISOLATION
他のトランザクションへ影響しない
耐久性
DURABILITY
データが失われることは無い

ロック

共有ロック

  • データを参照する時
  • 共有ロック中は他のトランザクションからもデータを参照できる
  • 共有ロック中は更新はできません。

占有ロック

  • データを更新する時
  • 占有ロック中は他のトランザクションからもデータを参照できない
  • 占有ロック中は更新はできません。

デッドロック

2つのトランザクションが、お互いが共有資源解放待ち状態となり、どちらも処理も進行できなくなる状態

コミット

トランザクション処理を確定させる。

アボート

中止、強制終了

ロールバック

トランザクション処理失敗 → トランザクション前に戻す

ロールフォワード

データベースの内容を障害前の変更時の状態に戻す

選択

必要な行だけを抜き出す

射影

データの中から、必要な列だけを抜き出す

結合

同じ列を基準に2つの表をくっつける

正規化

  • 整合性の向上

第1正規化

  • 繰り返し要素をなくす
  • 行の結合を解除

第2正規化

主キーの一部の関数従属性を排除。
関数従属性…ある列に別の列が連動する、例)従業員番号→氏名

  • 主キー … 行を特定できる列
  • 複合キー … 行をを特定できる複数の列

第3正規化

主キー以外の列の関数従属性を排除

https://it-biz.online/it-skills/normalization

外部キー

  • 参照整合性制約
  • 参照先の表の列の値しかとれない

非NULL制約

NULLが入れられない

SQL

AS

SELECTで抽出したものに別名をつける。

SELECT
customer AS '顧客'
, cost AS '費用'
, category AS 'カテゴリ'
FROM
item;

CHECK

条件に合わなければ、書き込みを拒否される

CHECK( 条件式 )

GROUP BY

  • 特定の列の数値によって、切り分ける。(最大値、最小値など)

IN

複数の値のうちいずれかと一致している行を抽出する。

SELECT * FROM テーブル名 WHERE カラム名? IN ('値1', '値2');

LIKE

  • 文字列検索

ワイルドカード

  • % … 0文字以上の任意の文字列
  • _ … 任意の1文字

ORDER BY

SELECT

SELECT 列名,列名,…
 FROM テーブル名

*(アスタリスク) … 全ての列

DISTINCT

SELECTで抽出した、レコードで重複しているものを除外する

WHERE

条件を指定して選択します。

SELECT 列名 FROM
 テーブル名 WHERE 条件A AND 条件B;

{SQLの命令文} WHERE [列1] = [値];

解答法

HAVING

集合関数を使って行を絞る

CASE

CASE
 WHEN {条件式} THEN {真の場合の値}
 WHEN {条件式} THEN {真の場合の値}
 …
 ELSE {偽の場合の値}
END

集合関数

AVG

平均値を求める

COUNT

個数を求める

MIN

最小値を求める

MAX

最大値を求める

SUM

合計値を求める

select SUM(列名) from (テーブル名) 

条件付き
select SUM(列名) from (テーブル名) where (条件式)

グループ
select SUM(列名) from (テーブル名) group by (列名)

副問合せ

<手順>

  1. 副問合せ
  2. ①の結果を使用して主問合せをする
SELECT * FROM 従業員表
 WHERE 年齢 <> ( SELECT MAX(年齢) FROM 従業員表 )

… 副問合せ
https://www.foresight.jp/fe/column/sql
https://tech-blog.rakus.co.jp/archive/category/PostgreSQL
【Snow Monkey】Googleサーチコンソール登録

Googleサーチコンソール登録手順

1)【Googleサーチコンソール】HTMLタグの値を確認

▼Googleサーチコンソールにログイン「設定」→「ユーザーと権限」を選択

▼三点ドットを選択→「所有権の確認の詳細」をクリック

▼HTMLタグが確認できます

2)【Snow Monkey】HTMLタグの入力

▼ワードプレス管理画面→「外観」「カスタマイズ」→「SEO」→「Googleサーチコンソール」を選択

▼先ほど確認したHTMLタグのxxxxxの部分を張り付け→公開

3)【Googleサーチコンソール】プロパティを追加

▼「プロパティを追加」をクリック

▼プロパティタイプの選択でドメインの入力欄に該当サイトのドメインを入力

▼確認をクリック

参考サイト

この<meta name=”google-site-verification” content=”xxxxx” />をどこで確認したら良いのかがわからないです。
https://snow-monkey.2inc.org/forums/topic/%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba%e3%81%aegoogle%e3%82%b5%e3%83%bc%e3%83%81%e3%82%b3%e3%83%b3%e3%82%bd%e3%83%bc%e3%83%ab%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6

GoogleサーチコンソールのHTMLタグを再確認する方法
https://kikuchi-web.com/googlesearchconsole-reconfirmation

Laravel 11の開発環境、Sailプロジェクト SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘laravel.sessions’ doesn’t existの対処法


Laravel + Docker(Sail)構築手順 – Windows版

前提確認

環境状態確認方法
Docker Desktop起動してる?右下のクジラアイコン
WSL2(推奨)wsl -l -v で確認(Ubuntuなど)
Windows Terminal / CMDどちらでも可
Git Bash(推奨)Bashの方がLinuxコマンド使える

構築手順ステップ

composer create-project laravel/laravel web-circular
  • Laravel Sailというパッケージを開発環境用の依存関係としてインストール
composer require laravel/sail --dev

–devオプションについて

composer.json の構造 composer.json “require”: { “laravel/framework”: “^10.0”, “guzzlehttp/guzzle”: “^7.0” } “require-dev”: { “laravel/sail”: “^1.0”, “phpunit/phpunit”: “^10.0”, “laravel/pint”: “^1.0” } 本番環境でも必要 (アプリ動作に必須) 開発時のみ必要 (テスト、デバッグ用) インストール時の動作: 開発環境 composer install → 全てのパッケージインストール 本番環境(レンタルサーバー) composer install –no-dev → require のみインストール(require-dev は無視)
  • Sailを導入
php artisan sail:install

  Which services would you like to install? [mysql]
  None ............................................................................................................. 0  
  mysql ............................................................................................................ 1  
  pgsql ............................................................................................................ 2  
  mariadb .......................................................................................................... 3  
  mongodb .......................................................................................................... 4  
  redis ............................................................................................................ 5  
  valkey ........................................................................................................... 6  
  memcached ........................................................................................................ 7  
  meilisearch ...................................................................................................... 8  
  typesense ........................................................................................................ 9  
  minio ........................................................................................................... 10  
  mailpit ......................................................................................................... 11  
  rabbitmq ........................................................................................................ 12  
  selenium ........................................................................................................ 13  
  soketi .......................................................................................................... 14  
❯ 1

選択肢リスト、Laravel Sail の「どのサービス(コンテナ)を含めるか」を選べるようです。

無駄なサービスを入れすぎるとDockerコンテナが激重に

表示されるリストから Ubuntu (WSL) を選ぶ

  • SailコマンドでDockerコンテナ起動
    1. Docker Desktopを起動
    2. Ubuntu(WSL)に切り替える
      VSCodeターミナル右上の + 横の 下矢印ボタン ⏷ をクリック

sailコマンドはUbuntuでしか使えない(≒ Linux環境(bash)じゃないと動かない)

/mnt/c/web-circular# vendor/bin/sail up -d

Laravel Sail の正体は、Laravel開発用にチューニングされたDockerラッパースクリプト

処理内容自動化されてる?実際の挙動
Dockerイメージの取得laravelsail/php82-composer とか mysql:8 をPull
docker-compose.yml生成sail:install 実行時に .dockerdocker-compose.yml を作成
コンテナ起動sail up -d で Laravel(PHP)と MySQL の2コンテナが起動
ネットワーク/ボリューム作成LaravelとDBが同一ネットワークで通信できるように設定

先ほどのコンテナ起動でMySQLも一緒に起動されてます

./vendor/bin/sail up Laravel (PHP) + MySQL (DB) + その他 (Redis等) 1つのコマンドで複数のコンテナが同時起動
  • データベースが生きてるか確認
vendor/bin/sail artisan migrate

   INFO  Preparing database.  

  Creating migration table ...................................................... 308.69ms DONE

   INFO  Running migrations.  

  0001_01_01_000000_create_users_table .......................................... 586.27ms DONE
  0001_01_01_000001_create_cache_table .......................................... 171.50ms DONE
  0001_01_01_000002_create_jobs_table ........................................... 400.70ms DONE

※Laravelの初期DBスキーマ(テーブル)をMySQLコンテナ上に作成

Laravelのマイグレーションは「データベースのバージョン管理システム」Gitみたいなもの

以上でブラウザでウェルカムページが確認できます

Laravel Let’s get started Laravel has an incredibly rich ecosystem. We suggest starting with the following. Read the Documentation → Watch video tutorials at Laracasts → Deploy now http://localhost

xserverのような共用サーバーではvendor/bin/sail artisan~のようなsailコマンドが使用できない??ので下記の方法がいいかも

Laravel Sail

Laravelが提供する Dockerの開発環境 で、特別な設定なしに PHP・MySQL・Redisなどの環境をすぐに立ち上げられる。

Laravelプロジェクト構築の2つの方法 方法1: 段階的アプローチ 1. Laravelインストール composer create-project 2. Sailインストール composer require sail 3. Sail設定 sail:install 4. Docker起動 sail up -d 方法2: 一括インストール curl -s “https://laravel.build/.” | bash 全て自動的に設定 – Laravelインストール – Sail設定 – Docker環境構築 – 依存関係の解決 ※ どちらの方法でも最終的な結果は同じです

方法2(curlコマンド)はWSL2やGit Bashなどの環境が必要
方法1は通常のWindows環境でも実行可能

Sailの導入手順(方法1)

PHPのパッケージ管理ツールComposerでLaravelをインストール

composer create-project laravel/laravel .
composer create-project laravel/laravel . 実行前 空のフォルダ Composerの処理 1. フレームワークのダウンロード 2. 依存パッケージのインストール 生成されるフォルダ 📁 app/ アプリケーションの中核 📁 config/ 設定ファイル 📁 database/ DB関連ファイル 📁 resources/ ビュー、CSS、JS 📁 routes/ ルーティング定義 📄 .env 環境設定ファイル 重要ポイント: • コマンド末尾の “.” は現在のディレクトリにインストールすることを指定 • .envファイルは開発環境の設定に重要 • vendorフォルダには依存パッケージが全て含まれる

Sailを追加

composer require laravel/sail --dev
php artisan sail:install
composer require laravel/sail –dev 開発環境用のDockerセットアップツール コマンドの意味: • require: パッケージを追加 • laravel/sail: パッケージ名 • –dev: 開発環境専用 実行前 composer.json: 通常の依存関係 vendor/: 既存のパッケージ 実行後 composer.json: “require-dev”: { “laravel/sail”: “^1.0” } vendor/: + laravel/sail 使用可能コマンド: artisan sail:install 次のステップ sail:install実行で: • docker-compose.yml • Dockerfile • その他設定ファイル が生成されます –devフラグの重要性: 本番環境にはSailは不要なため、開発環境専用のパッケージとしてインストールします。

Sailの起動

SailコマンドはLinux環境のbashシェルを必要とするため

自分の場合WindowsでPowerShellコマンドプロンプトだったので、Linux環境のBashシェルに接続

Windows PowerShell wsl -d Ubuntu WSL2 (Ubuntu) Docker Laravel Sail Containers – PHP/Laravel – MySQL – Redis – その他のサービス ① PowerShellからWSL(Ubuntu)を起動 ② WSL上でLinuxコマンドを実行可能に ③ DockerはWSL2上で動作 WSL2は、WindowsでLinuxを実行するための「橋渡し」として機能します
wsl -d Ubuntu
./vendor/bin/sail up -d

Laravel Sail開発環境のポート比較

localhostでアクセスできるPort 80 (メインポート)はすぐに使用可能です

それに対してPort 5173 (Vite開発サーバー)を使用するには、npmでパッケージのインストールが必要です。

初心者の方は、まずPort 80だけを使用して基本的な開発を始めることをお勧めします。フロントエンド開発が必要になった時点でVite(Port 5173)の設定を行うとよいでしょう。

Laravel開発環境のポート比較 Port 80 (メイン) 初期状態: ✓ すぐに使用可能 ✓ 設定不要 用途: • PHPファイルの実行 • ルーティング • APIエンドポイント アクセス: localhost Port 5173 (Vite) 初期状態: ⚠ 追加設定が必要 準備手順: 1. npm install 2. npm run dev 用途: • JavaScript開発 • CSSの編集 • ホットリロード 開発フェーズでの推奨: • バックエンド開発のみ → Port 80 • フロントエンド開発あり → 両方のポートを使用

SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘laravel.sessions’ doesn’t exist

ブラウザでlocalhostにアクセスするとSQLSTATE[42S02]: Base table or view not found: 1146 Table ‘laravel.sessions’ doesn’t existエラーになります

< 内容 >

  • Laravelの設定で SESSION_DRIVER=database になっている(.envで設定されているよう🤷‍♂️)
  • しかし、必要な sessions テーブルが作られていない
// .env
SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
Laravel 11のセッション管理とエラー解決 エラー状況 SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘laravel.sessions’ doesn’t exist 原因 Laravel 11の仕様変更: • デフォルトのセッションドライバーが’database’に設定 • 必要なセッションテーブルが未作成 解決方法 方法1: マイグレーション実行(推奨) ./vendor/bin/sail artisan migrate • データベースでの管理が可能 • スケーラビリティの確保 方法2: ファイル保存に変更 SESSION_DRIVER=file に変更 • シンプルな構成 • 小規模アプリケーション向け

Laravel 11.xではセッションドライバーのデフォルト設定がdatabaseになっている可能性があるそうです(下記参考サイトより)

マイグレーション実行が推奨というのも、実は、Laravel 11では、セッションテーブルの作成がcreate_users_table.phpの中に含まれています

Laravel 11 マイグレーションファイル構造 📁 database/migrations/ 📄 0001_01_01_000000_create_users_table.php users テーブル • id • name • email • password sessions テーブル • id • user_id • payload • last_activity password_reset_tokens • email • token • created_at 📄 0001_01_01_000001_create_cache_table.php 📄 0001_01_01_000002_create_jobs_table.php 実行コマンド: ./vendor/bin/sail artisan migrate
./vendor/bin/sail artisan migrate
「WordPress」をDockerで環境構築、WP本体をドキュメントルート直下ではなくサブディレクトリ配置する場合やphp.iniカスタムについても解説

【簡単】WordPress環境をDockerで構築手順

1)作業フォルダを作成

2)1)内に「docker-compose.yml」を作成

services:
  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8080:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wordpress:/var/www/html

      # 開発テーマ以外は同期せずコピー(表示早くなります、快適)
      # - ./wordpress/wp/wp-content/themes/hello:/var/www/html/wp/wp-content/themes/hello

      # debug.logはバインドマウント(エラーログ見たいとき)
      # - ./wordpress/wp/wp-content/debug.log:/var/www/html/wp/wp-content/debug.log

volumes:
  db_data: 

volumesは画像のパス等にあわせてください

3)作業ディレクトリにて下記コマンド

docker-compose up -d

多少時間がかかるかもしれません。

4)「Docker Desktop」で確認

エラーログの確認方法

1. Dockerコンテナ内でWordPressのエラーログを有効化

まず、WordPressのwp-config.phpにエラーログを有効にする設定を追加します。

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

この設定により、エラーログがwp-content/debug.logに保存されます。

2. Dockerコンテナ内でエラーログを確認する

方法1: docker-compose execでコンテナ内に入って確認

Dockerコンテナ内に直接アクセスして、エラーログを確認することができます。

docker-compose exec <コンテナ名> bash

コンテナ内に入ったら、エラーログファイルにアクセスします。

cat /var/www/html/wp-content/debug.log

<コンテナ名> は、WordPressが稼働しているコンテナの名前に置き換えてください。

方法2: docker-compose logsでコンテナのログを直接表示

WordPressやApache/Nginxのエラーログは、コンテナの標準出力にも表示される場合があります。以下のコマンドでログ全体を確認できます。

docker-compose logs -f <コンテナ名>

上記コマンドで、リアルタイムにエラーログを追跡しながら確認できます。

方法3: ログファイルをホストマシンにマウント

Dockerのdocker-compose.ymlファイルで、WordPressのwp-contentディレクトリをホストマシンと共有すると、ホスト側で直接debug.logを確認できます。たとえば、以下のように設定を変更します。

services:
  wordpress:
    volumes:
      - ./wp-content:/var/www/html/wp-content

これにより、./wp-content/debug.logでホスト側からログを確認できるようになります。

「php.ini」の設定で、WordPressのアップロード制限やメモリ使用量を設定する方法

1)docker-compose.ymlの環境変数で設定

version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: user
      WORDPRESS_DB_PASSWORD: password
      WORDPRESS_DB_NAME: wordpress
      PHP_UPLOAD_MAX_FILESIZE: 128M
      PHP_POST_MAX_SIZE: 128M
      PHP_MEMORY_LIMIT: 128M

2)カスタムPHP設定ファイルをマウントする方法

php.iniを作成

upload_max_filesize = 128M
post_max_size = 128M
memory_limit = 128M

docker-compose.yml でマウント設定

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: user
      WORDPRESS_DB_PASSWORD: password
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wordpress_data:/var/www/html
      - ./php.ini:/usr/local/etc/php/conf.d/custom.ini

必要最小限のファイル監視で、更新読み込みの速度を最大化

テーマファイルの内容をブラウザで確認する際、リロードに時間がかかる問題を解消できます!

実際に開発・編集するファイルのみをマウントすることで、Docker内部のファイル監視システムの負荷を最小限に抑え、更新時間を大幅に短縮できます。

Docker WordPressボリュームマウントの最適化 WordPress コンテナ WordPress ファイル構造 WordPress コアファイル (5,000+ ファイル) wp-admin (2,000+ ファイル) wp-includes (3,000+ ファイル) wp-content plugins (500+ ファイル) themes (100+ ファイル) ボリュームマウント戦略 全ファイル・ディレクトリをマウント 10,000+ ファイルを監視 更新処理 ⭐ (非常に遅い) wp-contentのみマウント 1,000+ ファイルを監視 更新処理 ⭐⭐⭐ (普通) テーマディレクトリのみマウント 100+ ファイルを監視 更新処理 ⭐⭐⭐⭐⭐ (非常に速い) 開発中のファイルのみマウント 例: 1つのテーマと1つのプラグイン 10-50 ファイルのみ監視 更新処理 ⭐⭐⭐⭐⭐ (最速)

https://yoshi-2210.hatenablog.com/entry/2022/04/09/102840#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6WordPress%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B

WP本体インストールをドキュメントルート直下ではなく、別のサブディレクトリでしたい場合(複雑)

docker-compose.yml

services:
  wordpress:
    image: wordpress:6.4-php8.1
    restart: always
    ports:
      - 8080:80
    volumes:
      - ./:/var/www/html
      - ./docker-entrypoint.sh:/usr/local/bin/docker-entrypoint.sh
    working_dir: /var/www/html/wp
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_CONFIG_EXTRA=
        define('WP_HOME', 'http://localhost:8080');
        define('WP_SITEURL', 'http://localhost:8080/wp');

  db:
    image: mysql:8.0
    restart: always
    environment:
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
      - MYSQL_ROOT_PASSWORD=somewordpress
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

working_dirでコンテナ内での作業ディレクトリを指定

working_dirはコンテナ内での作業ディレクトリを指定する設定です。コンテナ内でコマンドを実行する際の基準となります。

volumes: /var/local/wordpress:/var/www/html/wp
working_dir: /var/www/html/wp

この状態でdocker-compose upでイメージからコンテナのを新規作成をすると

– コンテナ内の /var/www/html/wp にファイルを展開

– volumesマウントにより、ホスト側の /var/local/wp にも同じファイルが表示される

2. ボリュームマウント Host Machine /var/local/wp/ Container /var/www/html/wp/ volumes mount 3. WordPressファイル展開 Host Machine /var/local/wp/ wp-admin/ wp-content/ wp-includes/ Container /var/www/html/wp/ wp-admin/ wp-content/ wp-includes/ リアルタイム同期

docker-entrypoint.shでindex.php と .htaccessの設定

.sh ファイル(シェルスクリプト)とは

.sh ファイル(シェルスクリプト)は、Unix系システム(LinuxやmacOSなど)でコマンドを自動化するために記述されるスクリプトファイルです。

公式docker-entrypoint.shリポジトリのファイル下部を追記

公式docker-entrypoint.shリポジトリ
https://github.com/docker-library/wordpress/blob/master/docker-entrypoint.sh

...
			fi
		done
	fi
fi

# ↓ 追記部分 ↓

if [ -e /var/www/html/wp/index.php ] && [ -e /var/www/html/wp/.htaccess ] && [ ! -e /var/www/html/index.php ] && [ ! -e /var/www/html/.htaccess ]; then
    sed -i -e 's/\/wp-blog-header\.php/\/wp\/wp-blog-header.php/g' /var/www/html/wp/index.php
    mv /var/www/html/wp/.htaccess /var/www/html/.htaccess
    mv /var/www/html/wp/index.php /var/www/html/index.php
fi

# ↑ 追記部分 ↑

exec "$@"
  1. ファイルの確認
    • wpディレクトリにindex.phpが存在
    • wpディレクトリに.htaccessが存在
    • ルートにindex.phpが存在しない
    • ルートに.htaccessが存在しない
  2. index.phpの中のパス参照を修正
  3. index.phpと.htaccessをwpディレクトリからルートに移動
処理前 /var/www/html/ wp/ index.php require(‘wp-blog-header.php’) .htaccess 処理後 /var/www/html/ index.php require(‘wp/wp-blog-header.php’) .htaccess wp/ その他のWordPressファイル ファイル移動 パス修正 1. 必要なファイルの存在確認 2. index.php内のパス参照を修正 3. index.phpと.htaccessをルートディレクトリに移動 ※ これによりWordPressをサブディレクトリ(wp/)で動作させることができます

参考サイト

WordPress on DockerでWP自体をサブディレクトリにインストールし、index.phpと.htaccessを自動で移動&書き換えする
https://note.com/kezzytak/n/n4f9ac97466f2

【基本情報】テクノロジ

ハードウェア

AND演算(論理積)

入力入力出力
000
010
100
111

NOR演算(否定論理和)

入力入力出力
001
010
100
110

NAND演算(否定論理積)

入力入力出力
001
011
101
110

XOR演算(排他的論理和)

入力入力出力
000
011
101
110

データベース

https://ntorelabo.com/?p=6190

セキュリティ

動的解析(ブラックボックス解析)

検体を実際に動作させる

静的解析(ホワイトボックス解析)

動作させず、内部構造の解析をする

公開鍵暗号方式

  • 公開鍵暗号方式は、共通鍵暗号方式より処理が遅い

<暗号化:受信者がペアで作る>

<デジタル著名:送信者がペアで作る>

暗号化受信者が作成受信者公開鍵で暗号化、受信者秘密鍵で複合
デジタル著名送信者が作成送信者秘密鍵で作成、送信者公開鍵で検証

RSA

公開鍵暗号方式の暗号技術

公開鍵基盤

  • PKI
  • 公開鍵の認証

共通鍵暗号化方式

  • 暗号化複合化で同じ鍵
  • 処理速度が速い
  • 事前に鍵を渡す必要があり、限られた相手との通信に向いている。

ファイアウォール

DMZ

内部(Inside)ゾーン外部から守るべきネットワーク。基本的に信頼できるものとして扱う。
外部(Outide)ゾーン攻撃元となる可能性のあるネットワーク。基本的に信頼できないものとして扱う。
DMZ
(DeMilitarized Zone)
非武装ゾーン:内部と外部の中間。基本的に外部からアクセスできるのはこのゾーン

プロキシサーバ

  • インターネット接続ができていない内部ネットワーク代理でインターネットに接続する
  • キャッシュ機能 → 高速マルウェアを検出

リバースプロキシ

  • ウェブ閲覧者代理でウェブサーバに接続する
  • ウェブサーバへの攻撃を防ぐ

基礎理論

浮動小数点数

32ビット形式

  • 符合 … 正→0、負→1
  • 指数部 … 2のn乗のn数値を2進数で表記
  • 仮数部 … 正規化した小数点以下の数値
    (※正規化 0.01 → 0.1 × 2の−1乗)

EEE754

例)

  1. 元の数  -(1000111)(2進数) × 2(0乗)
  2. 正規化  (1.000111)(2進数) × 2(6乗)
  3. 符合、指数、仮数を計算
    • 符合:+ → 0、− → 1
    • 指数:+127
      6 + 127 = 133
      =(10000101)(2進数)
    • 仮数:整数部1を削除
      1000111 → 000111
  4. 110000101000111

誤差

桁落ち

絶対値の差が小さい2つの値の差

情報落ち

大きい値と小さい値の計算で小さい値の情報が無視されてしまう

CRC方式

生成多項式によって、誤り検出用データを付加

システム開発技術

スタブ

トップダウンテストで、下位のモジュールとしての、テスト用モジュール

ドライバ

ボトムアップテストで、上位のモジュールとしての、テスト用モジュール

E-R図

  • Entity(実体) Relationship Diagram
  • エンティティと呼ばれる四角形ををリレーションと呼ばれる線でつなぎます。
Photoshop

デザインのコツ

黄金比を意識した縦横比

1.618で割るもしくはかける

メニューバー

イメージ

色調補正

カラーバランス

レイヤー

切り抜き等で生じた、境界線の不自然な状態を調節します。

メニューバーのレイヤー → マッティング → フリンジ削除、黒マット削除、白マット削除

編集メニュー

画像の移動と変形

フィルターメニュー

ぼかし → ぼかし(放射状)

ツールバー

自動選択ツール

許容値高いほどより広い範囲の色が選択。
アンチエイリアスキレイになるので基本チェック
隣接チェックを外すと隣接していない部分もまとめて選択。

スポット修正ブラシツール

汚れやテキストを消すことができます。

グラデーションツール

https://mappyedit.com/photoshop-add-gradients/

テキストツール

テキストボックス

横書き文字ツールを選択してテキストボックスの設置したい範囲をドラッグで指定。
テキストは貼り付け。

文字マスクツール

画像を文字で切り抜くとき使います。

カスタムシェイプツール

オプションバーから色んな種類を選択できます。

パネル

レイヤーパネル

レイヤースタイルを追加

ベベルとエンボス

クリッピングマスクを作成

  • 2枚のレイヤーを使用して作成
要素(画像、動画、音声、フォーム)

media属性

media属性の値説明
all全てのメディア(デフォルト)
screen一般的なディスプレイ
printプリンタ
projectionプロジェクター
handheld携帯電話などの小さな機器
braille点字ディスプレイ
embossed展示プリンタ
speech音声読み上げソフト
ttyターミナル
tvテレビ

media要素

img要素

属性
srcデータのアドレス(必須
alt画像が利用できない場合に代わりに使用されるテキスト
限定的な場合で省略可能
srcset候補画像 … URLと記述子
sizesメディアクエリと表示幅
width
height
幅、高さ(整数)
  • 「x」は必ず小文字
  • 浮動小数点数
  • デフォルト値は「1x」

picture要素

picture要素は子要素にsource要素とimg要素をもち、画面幅にあわせて画像を切り替えて表示することができます。

CSSのdisplayプロパティを使い、表示・非表示を切り替える場合と違い、最適な画像のみ読みこむので、不要な画像の読み込みによる表示速度の低下が起きません。

<picture>
  <source media="(min-width: 961px)" srcset="img-pc.jpg">
  <source media="(min-width: 641px)" srcset="img-medium.jpg">
  <img src="img-small.jpg">
</picture>
  • imgは1個必須
  • sourceは0個以上

source要素

picture要素内のsource要素に指定可能な属性

source要素src属性は指定できない

属性
media画像の使用条件 メディアクエリ
srcset候補画像 … URLと記述子
必須
sizesメディアクエリと表示幅
type画像の種類 … MINEタイプ
width
height
幅、高さ(整数)

video、audio要素内のsource要素に指定可能な属性

  • src
  • crossorigin
  • poster
  • preload
  • autoplay(論理属性)
  • loop(論理属性)
  • muted(論理属性)
  • controls(論理属性)
  • width
  • height
属性
srcデータのアドレス
必須
type画像の種類 … MINEタイプ

audio要素

video要素

video要素で指定可能な属性

  • autoplay:自動再生
  • loop:ループ再生
  • muted:ミュート
  • controls:コントロール表示
  • playsinline:インライン再生
  • preload:事前読み込み
  • poster:サムネイル画像

<javascriptで操作可能>

  • コンテンツの再読み込み
  • 再生開始、中断
  • 再生位置の変更

<データを取得利用>

  • コンテンツが再生・早送り可能な状態か
  • 再生メニューの表示、非表示
  • ネットワークの状態
  • エラー内容
  • コンテンツの場所
  • コンテンツの長さ
  • 音量(0〜1)
  • トラック情報
<video controls>
<source src="〇〇/〇〇" type="video/〇〇">
<source src="〇〇/〇〇" type="video/〇〇">
</video>

コーデック

ファイルを圧縮・変換するためのアルゴリズム

オーディオコーデック … AAC(スタンダード、MP3(古い動画圧縮形式、Vorbis(Google陣営の標準)
ビデオコーデック … H.264(最新規格、VP8、VP9(Google陣営の標準、Theora(低普及、主にOGGコンテナで利用)

コンテナ

複数のコーデック(圧縮変換アルゴリズム)、データの種類をまとめたもの

<video要素がサポートしているコンテナ>

  • WebM
  • MP4
  • Ogg
ファイル形式(コンテナ)拡張子MINEタイプ
MPEG
古い動画形式
.mpg .mpegvideo/mpeg
MP4.mp4video/mp4
WebM
Google陣営の標準動画形式
.webmvideo/webm
Ogg
低普及
.ogvvideo/ogg
QuickTime.movvideo/quicktime
ファイル形式(コンテナ)拡張子MINEタイプ
MP3.mp3audio/mpeg
AAC.m4aaudio/aac
Ogg.oggaudio/ogg
WAVE.wavaudio/wav

track要素

  • audio要素もしくはvideo要素の子要素
  • 外部テキスト・トラックを指定する空要素
    テキスト用ファイル(WebVTT:Web Video Text Tracks)に、hh:mm:ss:tttの時間単位で指定

canvas要素

  • JavaScriptで図を作成できる要素
  • ビットマップで描画
  • ベクター画像の描画はできない
  • 拡大縮小で画像が荒くなる
  • PNG、GIF、JPEGなどの画像を利用できる
属性説明
width正の整数描画できる領域の幅
(デフォルト300px)
height正の整数描画できる領域の高さ
(デフォルト150px)




form要素

<<form>タグで定義したidを指定することで、<form>タグ外で定義したタグと、<form>の関連付けをします。>

<form action="" method="post" id="form1">
<textarea name="in1" cols="30" rows="3" maxlength="90" required>
</textarea>
</form>
<input type="submit" name="test1" value="送信" form="form1">

<部品が外部にあるとき>
部品のform属性をform要素のid属性を指定して関連づけができる

【formの部品】

氏名:


【form要素】

<p>【formの部品】</p>
<p>氏名:<input type="text" name="name" form="test"></p>
<br>
<p>【form要素】</p>
<form method="post" action="" id="test">
<p><input type="submit" value="送信する"></p>
</form>

<label要素にfor属性>

<form action="" method="post">

<p>
<label for="name1">お名前1:</label>
<input type="text" id="name1" name="name1">
</p>

<p><input type="submit" value="送信"></p>

</form>
属性名
novalidate入力データのチェックを行わない
論理属性
autocomplete・前に入力した内容が入力候補として表示
on(規定値)/off

input要素

属性名
typeフォーム部品の種類
accepttype=”file”のとき受付可能なファイル
MINEタイプ(カンマ区切り)
autocomplete要素のオートコンプリート機能
formフォーム部品を特定のform要素(id属性の値で指定)と関連づける
formnovalidate入力データのチェックを行わない
論理属性

<autocompleteの属性値>

属性値
on自動保管機能ON
off自動保管機能OFF
name氏名
email電子メール
new-password新規パスワード

<input要素type属性一覧>

text : password : search : email : url : tel : number : range : checkbox : radio : submit : reset : button : image(画像ボタン) : file : color : range : date : month : week : time : datetime-local(タイムゾーンなし) : hidden(表示させず送信する) :
type属性
email「@」をがないと警告が出る
range・スライダー
fileaccept=”MIMEタイプ” … ファイルの種類
multiple=”論理属性” … 複数データの許可
required=”論理属性” … 入力・選択を必須に

textarea要素

属性
cols1行に入力可能な文字数
rows入力欄の行数
resizenone … リサイズ不可。
horizontal … 水平方向のみリサイズ可。
vertical … 垂直方向のみリサイズ可。
both … 水平・垂直方向ともリサイズ可。(デフォルト)

capture 属性

説明
userスマートフォンの画面側のカメラやマイクが起動
environment外向きのカメラやマイク起動

progress要素

  • 進捗状況
  • value=”〇〇” … 現在の値
  • max=“〇〇” … 全体の値
<p>progress要素 … 進捗状況 
<progress value="40" max="100">40%</progress>
</p>
<p>progress要素 … value属性指定なし
<progress>処理中</progress>
</p>
<p>meter要素 … 〇〇の測定値
<meter value="91200000000" min="0" max="160000000000">91,200,000,000バイト使用</meter>
</p>

meter要素

value=””現在の値
必要属性
min=””最小値
max=””最大値
low=””低い領域
high=””高い領域
optimum=””最適な値

keygen

  • 公開鍵暗号方式
  •  秘密キーはローカル環境に保存され、公開キーはサーバーに送信
<form>
  <keygen name="key"/>
  <button>送信</button>
</form>

datalist要素

  • option要素でドロップダウン選択肢を作成
  • 【関連づける】datalist要素のid要素input要素のlist属性
<p>
 <label>
  学習している資格:
 <input type="text" list="study">
 <datalist id="study">
  <option value="HTMLプロフェッショナル認定試験">
  <option value="CCNA">
 </datalist>
 </label>
</p>

label要素

<label要素とフォーム部の関連付け>

(labelの中にフォームを入れる)

<label><input type="radio" name="form1" value="father">父</label>
<label><input type="radio" name="form1" value="mother">母</label>
(フォームのid属性を指定 → labelのfor属性でid属性を関連付ける)

<input type="radio" name="form1" value="father" id="id1">
<label for="id1">父</label>

fieldset要素

  • フォーム関連の要素をグループ化

legend要素

  • fieldset要素のグループ名(キャプション)を表示させる

select要素

  • option要素でドロップダウン選択肢を作成
  • 選択肢以外は入力不可
<select id="drink">
  <option value="0">選択してください</option>
  <option value="1">オレンジジュース</option>
  <option value="2">コーヒー</option>
  <option value="3">紅茶</option>
  <option value="4">ウーロン茶</option>
</select>

embed要素

プラグインを使用して外部データを組み込むための空要素

object要素

  • 様々な形式の外部データを組み込みます
  • data属性でファイルを指定し、type属性でMIMEタイプを指定

param要素

  • この要素は廃止されてる
  • object要素によって呼び出されたプラグインのパラメータを設定
  • object要素の子要素

data属性

  • カスタムデータ属性と呼ばれる
  • JavaScriptと組み合わせて使う
  • 制限あり
    • xml始めない
    • コロン (:)  ×
    • 大文字のAからZ ×
<div data-〇〇=”□□”>サンプル</div>

セレクタ[data-○○=”□□”]{
 プロパティ:値;
}

kbd要素

キーボード入力

samp要素

コンピュータからの出力

さくらインターネットにGitHubからクローンする手順

ローカルからさくらインターネットにssh接続

.sshディレクトリ作成

.sshディレクトリとは?

.sshディレクトリは、SSH(Secure Shell)に関する鍵や設定ファイルを保存するためのディレクトリです。SSHでの安全な接続を確立するために、公開鍵や秘密鍵が必要になるため、このディレクトリが使用されます。

ユーザーのホームディレクトリ直下(~/.ssh/)に作成

このディレクトリは通常、ユーザーのホームディレクトリ直下(~/.ssh/)に配置されます。

アクセス権限を自分のみに制限し、セキュリティを確保するための設定

mkdir ~/.ssh
# アクセス権限を自分のみに制限し、セキュリティを確保するための設定
chmod 700 ~/.ssh

SSH鍵の生成

もしまだSSH鍵を作成していない場合、以下のコマンドをPowerShellで実行して鍵を作成できます

# SSH鍵を生成する(RSA方式、鍵長4096ビット)
ssh-keygen -t rsa -b 4096
.ssh/
├── id_rsa             # 秘密鍵(サーバーにアクセスする際に使用)
├── id_rsa.pub         # 公開鍵(サーバーに登録し、鍵認証で接続)
└── known_hosts        # 接続したことのあるホスト(サーバー)のリスト
sakura internet

開鍵のさくらサーバーへの登録

さくらの管理画面から、生成した公開鍵(~/.ssh/id_rsa.pub の内容)を登録します。

「サーバー情報」→「SSH公開鍵」→「新規追加」クリック

.ssh/configファイルの設定

.ssh/config ファイルに追加する設定は、SSH接続を簡略化し、複数のサーバーにアクセスする際の手間を減らすためのものです。ここでは、さくらインターネットのレンタルサーバーに接続するための設定について詳しく説明します。

~/.ssh/configファイルに以下のような設定を追加します:

# 接続名を定義する(例として「sakura」を設定)
# 「ssh sakura」と入力するだけで接続できるようになる
Host sakura
    # 接続先のIPアドレスまたはドメイン名を指定
    # ここにはさくらインターネットのサーバーのIPやホスト名を記述
    HostName [さくらサーバーのIPアドレスまたはホスト名]
    # SSHでログインするユーザー名
    # さくらのアカウント名を記述
    User [さくらのアカウント名]
    # SSH接続に使用するポート番号
    # 通常22がデフォルトポート
    Port 22
    # 使用する秘密鍵ファイルのパスを指定
    # デフォルトの鍵(~/.ssh/id_rsa)を使用
    IdentityFile ~/.ssh/id_rsa
.ssh/
├── config             # SSHの接続設定ファイル(複数サーバーの設定が可能)
├── id_rsa             # 秘密鍵(サーバーにアクセスする際に使用)
├── id_rsa.pub         # 公開鍵(サーバーに登録し、鍵認証で接続)
└── known_hosts        # 接続したことのあるホスト(サーバー)のリスト

さくらインターネットにssh接続

ssh sakura

Are you sure you want to continue connecting (yes/no/[fingerprint])?

このメッセージは、初めて新しいホストに接続しようとしている際に表示される標準的なセキュリティ警告です。

さくらインターネットの管理画面やドキュメントでホストのフィンガープリントを確認 → ”yes” と入力して続行します。

さくらインターネットからGitHubにssh接続

bashに変更

% bash
[siennahare23@www3910 ~]$

公開鍵と秘密鍵を作成

[siennahare23@www3910 ~]$ cd ~/.ssh
[siennahare23@www3910 ~/.ssh]$ ssh-keygen -t rsa -b 4096

鍵の名前、パスフレーズを要求されますが、「Enter」で進めるとデフォルトの名前(「id_rsa」、「id_rsa.pub」)でパスフレーズを必要としない鍵のペアが生成されます

SSH鍵を生成すると、以下のようなメッセージが表示されます。このメッセージには秘密鍵の保存場所、公開鍵の指紋(Fingerprint)、ランダムアート画像などが含まれます。

Generating public/private rsa key pair.en -t rsa -b 4096
Enter file in which to save the key (/home/siennahare23/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/siennahare23/.ssh/id_rsa.
Your public key has been saved in /home/siennahare23/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:3x+egZ5oS58YhHEoWZbiDnzFg+00qH2/y/Da9G1olgQ siennahare23@www3910.sakura.ne.jp
The key's randomart image is:
+---[RSA 4096]----+
|       =o.       |
|      ++O.       |
|   . +o=oo.      |
|    + +.o+E      |
|     + .S...     |
|      .  o....   |
|        . =oooo  |
|         BoB=*.+ |
|        .oO=*.=  |
+----[SHA256]-----+

実際に使用する際には、秘密鍵 (id_rsa) の内容は絶対に公開しないように注意しましょう。

Githubに公開鍵を登録

公開鍵の内容を表示し、全文コピーします

cat ~/.ssh/id_rsa.pub

コピーした公開鍵の内容をはりつけ

configファイルの作成

[siennahare23@www3910 ~/.ssh]$ touch ~/.ssh/config

config

※秘密鍵の名前を変更している場合はデフォルトの「id_rsa」から変更する必要があります

Host github.com
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User git
# GitHubにSSH接続のテストを行うためのコマンド
ssh -T git@github.com

このコマンドを実行すると、GitHubに鍵を登録していれば次のようなメッセージが表示されます

Hi username! You've successfully authenticated, but GitHub does not provide shell access.

GitHubからリポジトリをクローン

方法1:HTTPS方式 (https://github.com/...)

  • パスワードまたはPersonal Access Tokenが必要
  • プロキシ環境でも動作
  • 認証の度に認証情報の入力が必要
git clone https://github.com/yourusername/your-repository.git .

方法2:SSH方式 (git@github.com:…):

git clone git@github.com:ida240609/src.git .
  • SSH鍵による認証 より安全
  • パスワード入力不要 一度設定すれば再認証不要
  • セキュアな通信
APIの基礎知識

マルチメディア・
グラフィック系

SVG

  • ベクターイメージ(情報を数値化して記録)
  • → 複雑な画像の表示は処理速度が低下
  • XML
  • 拡大・縮小後も画像が劣化しない
  • 描写した図形はDOM要素 → JavaScriptで操作可能

ストリーミング配信

  • HLSMPEG-DASH
  • ダウンロードの完了待たずに再生可能
  • HTTPサーバで配信隣ブラウザでの再生が主流
  • プラグイン不要
  • ファイルとして残らないため → 著作権の保護

HLS

  • HTTP Live Streaming
  • Apple社
  • ストリーミングプロトコル
  • HTTP

MPEG-DASH

  • 「Dynamic Adaptive Streaming over HTTP」
  • 国際標準ストリーミングプロトコル
  • HTTPベース
  • ファイルのコーデックに依存しない

Media Source Extensions

  • video要素とaudio要素を拡張
  • JavaScriptのAPI
  • HLS、MPEG-DASHをサポート
  • プラグイン無しでサポート
  • 動画を分割 → 編集、広告挿入
  • ネットワークに応じてストリーミングのビットレートを変更 → 途切れず再生
  • ライブ配信は時間を過ぎれば視聴不可

DRM

  • Digital Rights Management
  • 特定のソフトウェアまたはハードウェアでのみ再生可能

Encrypted Media Extensions

DRMで暗号化されたコンテンツをブラウザで復号する際使用

DOM

  • Document Object Model
  • HTML、XMLを取り扱うためのAPI 
  • 階層構造のドキュメントツリー(DOMツリー

デバイスアクセス系

Payment Request API

HTML5で利用できる決済API

Generic Sensor API

デバイスのセンサーにアクセスするAPIは値を取得する方法はバラバラですが、Generic Sensor APIは統一的にするAPIです。

  • JavaScriptから各種センサーにアクセスする方法を統一
  • 環境光、近接、磁気、加速度、線形加速度、ジャイロスコープ、絶対方位、相対方位、重力

Geolocation API

  • 緯度、経度
  • 高度、経度の精度
  • 高度
  • 高度の精度
  • 方角
  • 速度
  • ユーザの許可が不要
  • ユーザの環境依存

Notifications API

通知

Ambient Light Event

デバイス付近の照度(光量レベル)を取得

Drag and Drop API

ファイルをドラッグ&ドロップ

File API

<input type=file multiple> → JavaScriptで処理

Progress Events

プログレスバー

DeviceMotion Event

加速度センサー

UI Events

DOM3 Events(UI Events)マウス、キーボード
Touch Eventsタッチパネル、トラックパッド
Pointer Eventsマウス、ペン、タッチパネル
DeviceOrientation Eventデバイスの方角や傾き(ジャイロセンサー)

オフライン・ストレージ系API

Web Storage

  • ブラウザ側でデータを保存する機能
  • Key-Value形式
  • 文字列のみ保存可能
  • JavaScriptでデータを操作
sessionStorageブラウザ閉じるとデータ消失
localStorageブラウザ閉じてもデータを保持

Indexed Database API

  • ブラウザ側でデータを保存する機能
  • Key-Value形式
  • JavaScriptを使用
  • 高速な検索や、トランザクションでデータの整合性を維持
  • 文字列、ファイル、blobBinary Large OBject)などを格納できる
  • ブラウザを閉じても明示的に破棄しない限りデータを保持
CookieWeb StorageIndexed
Datebase
Web SQL
(参考)
4KBブラウザによるブラウザによるブラウザによる
保存期間は有限保存期限は無制限
/セッション
保存期限は無制限保存期限は無制限
文字列文字列ネイティブ/
オブジェクト
ネイティブ/
オブジェクト
非同期でない非同期でない
Key-Value形式
非同期
Key-Value形式
非同期
セッションで
使用される
シンプルで
大容量保存可
実装が進んでいる非推奨

通信系API

Web Workers

Webコンテンツのスクリプトをバックグラウンドで実行するための手段

Service Workers

  • ブラウザがWebページとは別バックグラウンドでスクリプトを実行
  • リソースをキャッシュしてオフラインで利用可能

Push API

  • プッシュ通知を受信するだけ
  • fetchを利用し通知の表示、メッセージ本体の受信
  • Service Workersアプリケーション起動不要
  • メッセージをサーバに問い合わせにはfetchが必要

fetch

  • 検索結果から1件抜き出す処理
  • リソースを非同期で取得
  • サーバに問い合わせ

XMLHttpRequest

  • JavascriptHTTP通信をする
  • Webサーバと非同期通信全体を更新せずに必要なデータを更新)を行うAPI
  • Ajaxで利用される

XHTML

  • 空要素 → 終了タグつける開始タグの閉じを「/>」
  • html要素の開始タグにXHTML用の名前空間を指定

Ajax

  • Webブラウザ内非同期通信動的なページ処理
  • Asynchronous(非同期) JavaScript + XML
  • XMLHttpRequestJavaScriptを用いて使用(実際にはjQueryが一般的)

Server-Sent Events

  • サーバからのプッシュ送信を実現するAPI
  • 非同期でサーバからブラウザにデータを送信
  • MINEタイプはtext-event-stream

WebSocket API

  • Webサーバとクライアントで双方向通信(サーバ側からも能動的にメッセージを送信)を可能にするJavaScriptのAPI
  • 例)チャット
  • テキストデータ、バイナリデータ OK

<WebSocket APIのイベント>

openブラウザとサーバ間の接続が確立されるまでは非同期、接続が確立するとopenイベントが発生
closeブラウザとサーバ間が切断
errorブラウザとサーバ間でエラー発生
messageメッセージを受信した

WebRTC

  • Web Real-Time Communication
  • ウェブブラウザ
  • 映像や音声
  • P2P(Peer to Peer) … デバイス間で対等(ブラウザ⇄サーバでなくブラウザ同士)で通信
レスポンシブ、マルチデバイス

Mobile First

  • Luke Wroblewski氏が提唱
  • 制約が大きいモバイルサイトにおいての利用を優先的に設計

メディアクエリ

メディアクエリによって、条件にあわせてCSSを適用するかどうか指示を出すことができます。

論理積and
論理和,orは使用しない
■link要素でCSSを読み込む際に、media属性を使用
<link rel="stylesheet" media="screen and (max-width: 480px)" href="style.css">

■CSSに条件を記述
@media screen and (max-width: 480px) {
/* CSSを記述する */
}

■「@import」で外部スタイルシートを読み込み時デバイスの条件を記載
@import "style.css" screen;
  • not … 条件が逆に
  • or … 使用不可

メディア型

all全ての機器(デフォルト)
screenPC、スマートデバイスの画面
printプリンタ
projectionプロフェクタ
tvテレビ
handheld携帯用機器
tty文字幅が固定の端末(テラタイプ、ターミナル
speechスピーチ、シンセサイザー
braille点字ディスプレイ
embossed点字プリンタ

メディア特性

width
min-width
max-width
ビューポートの幅
整数(負の値は×)
heigh
min-heigh
max-heigh
ビューポートの高さ
整数(負の値は×)
device-width
min-device-width
max-device-width
デバイスの幅
整数(負の値は×)
device-heigh
min-device-heigh
max-device-heigh
デバイスの高さ
整数(負の値は×)
aspect-ratio
min-aspect-ratio
max-aspect-ratio
表示領域のアスペクト比
水平/垂直の整数で指定
device-aspect-ratio
min-device-aspect-ratio
max-device-aspect-ratio
デバイスのアスペクト比
水平/垂直の整数で指定
resolution
min-resolution
max-resolution
デバイスの解像度(最小最大)
整数+dpidpcmdppx
orientationlandscape:横置き
portrait:縦置き
color
min-color
max-color
デバイスの色数
整数(負の値は×)
monochrome
min-monochrome
max-monochrome
デバイスがモノクロ階調数。
モノクロでない場合は0。

整数(負の値は×)
scanテレビの時のスキャン方式

Web Clip

  • ウェブサイトへのショートカット
  • rel属性に「apple-touch-icon
  • rel属性に「apple-touch-icon-precomposed」 … 自動装飾OFF
  • href属性で画像を指定
  • iOSではsizes属性でサイズ別に指定可能

ビューポート

  • ブラウザの表示領域
  • HTMLのmeta要素から設定
<meta name="viewport" content="width=device-width">content="width=device-width"と記述することで、
 表示領域の幅を端末画面の幅に合わせられる

フルードグリッド

  • グリッド幅、グリッドの数を画面サイズに合せて変化
  • メディアクエリを使用
  • JavaScript使用する場合あり

フルードイメージ

  • img要素でwidth、max-widthパーセントなど相対値で設定
  • height → auto 既に縦横幅を指定してある画像も縦横比維持
  • max-heightプロパティは使用不可
    (いくつかのWebブラウザで、ウインドウ幅に応じて高さが変化しない)
■スタイル設定
img {
    max-width:100%;
    height:auto; … 縦横比を保持
 }

CSSスプライト

  • 複数の画像を連結、1つにまとめる
  • background-imagebackground-positionプロパティで設定
  • リクエスト回数を減らす → ページ速度の向上、通信が不安定でも表示
  • 修正が複雑

高解像度画面

  • アイコンにSVG、Webフォントを使うことで、拡大によるぼやけを防ぐ
  • ピクセル密度2 … 4デバイスピクセルが1CSSピクセル

Retinaディスプレイ

  • 4デバイスピクセルが1CSSピクセル

ファビコン

  • Favorite Icon
  • ブックマークやタブのアイコン
<link rel="icon" href="/favicon.png">
<link rel="shortcut icon" href="/favicon.png">

ショートカットアイコン、Webクリップ

  • Webサイトへのショートカットをホーム画面上に追加
<link rel="apple-touch-icon" href="">

※OSによるハイライト、影を避けたい場合
rel属性にapple-touch-icon-precomposedを指定

スタンドアロンモード

  • iOS限定アドレスバーやツールバーを消す
<meta name="apple-mobile-web-app-capable" content="yes">

format-detection

  • 勝手にリンクされないようにmetaタグで制御
自動でハイパーリンクとして認識する機能を無効化
<meta name="format-detection" content="telephone=no, email=no, address=no">
CSS

CSSの基礎知識

セレクタ

セレクタ { プロパティ名 : 値 ;}

link要素

<!doctype html>
<html>
<head>
.....
<link rel="stylesheet" href="style.css">
</head>
.....

style要素

<!doctype html>
<html>
<head>
.....
<style>
p { color: red; }
</style>
</head>
.....

style属性

.....
</head>
<body>
<p style="color: red;">
.....
</p>

@import

  • @import “style.css“;(シングルクオーテーションでも省略も可能)
  • @import url(“style.css“);(シングルクオーテーションでも省略も可能)
  • @import “style.css” screen, print;

単位

em親要素のフォントサイズを1とする
remhtml要素のフォントサイズを1とする root em 指定していないデフォルトは16px
ex要素のフォントのx-height(小文字xとほぼ同じ)を1
ch要素のフォント0の幅を1
pxピクセル、1/96インチ
ptポイント、1/72インチ
pcパイカ、12ポイント
inインチ、2.54センチ

単位の使い分け

emは親要素のフォントサイズを参照するのでletter-spacing疑似要素の間隔に使い、絶対的な値はborderでそれ以外はremにすることで、レスポンシブデザインに対応するスタイルにできます。

  • em … letter-spacingや疑似要素との間隔
  • px … border等可変でない値

セレクタ

属性セレクタ

属性セレクタ対象
[属性名]属性名の属性が指定されている(属性値は何でも良い)
[属性名=”属性値”]属性値全体が一致
[属性名~=”属性値”]スペース区切りの値どれかと一致
[属性名=”属性値”]ハイフン区切りの前半が一致
[属性名^=”属性値の始め”]属性値の始めで始まる
[属性名$=”属性値の終わり”]属性値の終わりで終わる
[属性名*=”属性値の一部”]属性値の一部を含む

擬似クラス

  • 擬似要素はセレクタの最後にのみ配置可能
  • :擬似クラス コロンは1つ
  • ::疑似要素 コロンを2つ
属性セレクタ対象
:nth-child(式)先頭からn個目の要素から(式)おき
:nth-last-child(式)最後からn個目の要素から(式)おき
:nth-of-type(式)先頭からn個目の要素から(式)おき
(指定要素と同じ)
:nth-last-of-type(式)最後からn個目の要素から(式)おき
(指定要素と同じ)
:first-child子要素の中で最初の要素
:last-child子要素の中で最後の要素
:first-of-type子要素の中で最初の要素
(指定要素と同じ)
:last-of-type子要素の中で最後の要素
(指定要素と同じ)
:only-child唯一の子要素
:only-of-type唯一の子要素
(指定要素と同じ)

属性セレクタ

  • p[class=”abc”]
    完全一致
  • p[class|=”abc”]
    「-」(ハイフン)区切りの属性値の前半が一致
  • p[class~=”abc”]
    複数の属性名のうち一つが一致
  • p[class^=”abc”]
    属性値で始まる
  • p[class$=”abc”]
    属性値で終わる
  • [p*=”abc”]
    「属性値の一部」の文字列を含む

擬似要素

セレクタ全体の最後部に1つだけしかつけることができない

擬似要素適用先
::first-line1行目
::first-letter1文字目
::before先頭にコンテンツ追加
::after最後にコンテンツ追加

結合子

ベンダープレフィックス

  • 草案段階の際
  • プロパティの先頭に付けます。
ベンダープレフィックスブラウザ
-moz-Firefox
-ms-FireaInternet Explorer、Microsoft Edgefox
-o-Opera
-webkit-Google Chrome, Safari

背景

background

<一括指定の順番>

background: url background-position / background-size background-repeat;

background-position / background-size の記述は決まっている

liner-gradient

background: linear-gradient(red, #eee);
background: linear-gradient(to bottom, red, #eee);
background: linear-gradient(180deg, red, #eee);

背景を2色にする

background: linear-gradient(90deg, #333 0%, #333 30%, #f4f7f8 30%, #f4f7f8 100%);

背景画像にオーバーレイ(透過カラー)を重ねる方法


background: linear-gradient(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.3)), url(../) center center / cover no-repeat;

hsl

object-fit

画像を様々な縦横比に対応するように整えてくれる便利なプロパティです。

cover表示エリアに余白がなくなるよう表示し、はみ出した部分はトリミングされます。
contain表示エリアをはみ出さないよう、最大の大きさで表示します。足りない部分は余白ができます。

フォント

font

  1. font-weight、font-style、font-variant(順不同、省略可
  2. font-size(省略不可)
  3. 「/」(スラッシュ)で区切る
  4. line-height(省略可)
  5. font-family(省略不可)

font-size

単位付きの数値
パーセンテージ親要素に対して指定
xx-small、x-small、small、medium、large、x-large、xx-large7種類のキーワードで指定
smaller、larger親要素に対して1段回小さい、大きい

font-familyプロパティ

  • family-nameまたはgeneric-familyの値を指定
    (※family-nameはインストールされたフォント名、@font-face{}で指定したフォント名)

font-variantプロパティ

  • スモールキャピタル(大文字を小さくした)の書体にする
  • 初期値「nomal」 → 「small-caps
  • woff、truetype、opentype、embedded-opentype、svg

line-height

  • normal … 自動的に指定、規定値は1.2
  • 単位付き数値
  • 単位なし数値 … フォントサイズ × 数値(推奨)

Webフォント

  • @font-faceで読み込む
  • インストール不要環境に依存しない
@font-face{
 font-family: mytestfont;
 src: url("fonts/testfont.woff") format("woff");
}
p{font-family: "mytestfont";}
■最初に任意のフォント、最後に総称ファミリを指定
font-family: フォントファミリ名1, フォントファミリ名2, 総称ファミリ名;

generic-family

  • 汎用フォントファミリー名
総称ファミリ名字体
serif明朝体
sans-serifゴシック体
cursive筆記体
fantasy装飾体
monospace等幅

writing-modeプロパティ

writing-modeプロパティは縦書きのプロパティに使用します。

.vertical {
 -ms-writing-mode: tb-rl;
 writing-mode: vertical-rl;
}

縦書きレイアウトのDEMO
123456789

text-shadow

p {
text-shadow: 1px 4px 8pxぼかし rgba( 0,0,0,0.4), -1px -4px 8px rgba( 255,0,0,0.4);
}

テキスト

text-decoration

関連プロパティを空白で区切って設定

  • text-decoration-line  下線・上線・取消線
  • text-decoration-style  線の種類(波線や二重線、破線)
  • text-decoration-color  色

word-break

break-all全ての文字の間で折り返し
keep-all空白以外折り返ししない(日本語は折り返さない)
normalその言語のルールに合わせる(初期値)

hyphens

manual&shy;でハイフネーション(初期値)
none一切行わない
auto言語に応じて

white-space

  • 連続する空白文字を1つの半角スペースに変換するか
  • 折り返しをどうするか
改行
ソースコード
まとめ折返し
normal×
pre××
nowrap××
pre-wrap×
pre-line

word-spacing

単語単語間隔

text-transform

テキストの大文字小文字を切り替える

uppercase半角アルファベット → 大文字
lowercase半角アルファベット → 小文字
capitalize半角アルファベット → 先頭の文字だけ大文字
none元の状態のまま
p { text-transform: capitalize;}

capitalize abc

direction

文字表記の方向

ltr左から右
rtl右から左

unicode-bidi

文字表記に関する指示、上書き

normal(初期値) UNICODEを組み込まない
embedインライン要素の場合UNICODEを組み込む
bidi-overrideUNICODE上書き

ボックス

box-sizing

content-boxpadding、borderはコンテンツのwidthとheightにを含めない(初期値)
border-boxpadding、borderはコンテンツのwidthとheightにを含める
inherit親要素継承

box-shadow

  1. 水平方向(必須)
  2. 垂直方向(必須)
  3. ぼやけかたの大きさ(省略可)
  4. 影の大きさ(省略可)
  5. 影の色(省略可)
  6. 影を内側にする(inset)(省略可)

filter: drop-shadow

filter:drop-shadow(水平方向 垂直方向 ブラー量 影色);

box-shadowとの違い

border

線の種類 太さ

width

max-width

  • 要素を親要素からはみ出さないようにする
  • max-width: 100%;にすると画面幅が画像より大きいときは画像のサイズで、小さいときは画面幅にあわせてはみ出ないようになります。
    ※画像の縦横幅が崩れたらheight: auto;

margin

  • 値が1つ … 上下左右
  • 値が2つ … 上下 左右
  • 値が3つ …  左右
  • 値が4つ … 

padding


position

position: static; … プロパティ無し。既定値
position: relative;  親要素、または画面の左上を基準に位置を指定
position: absolute ;  親要素から top right bottom left の値によって決定 
position: fixed;
position: sticky; … 親要素から、追従する
【領域1】
sticky
【領域2】

z-index

  • 0が基準
  • 初期値はauto
  • positionプロパティにstatic以外が指定されている場合に適用
  • 後に書いたものが上に来る、擬似要素も
  • z-indexが有効なのは同一階層で

マルチカラム、フレキシブルボックス

columun-count

  • 何段組にするか
  • 初期値はauto

columun-width

columunsプロパティ

columns: カラムの幅 カラムの数;

columun-gapプロパティ

<p style="
width: 100%;
height: 160px;   /*--高さを指定--*/
column-count: 3; /*--3列--*/
column-fill: balance; /*--balanceを指定--*/
column-gap: 1px; /*--隙間--*/
line-height: 1.8;"> … </p>

この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーで

columun-ruleプロパティ

columun-spanプロパティ

アニメーション

transform

擬似クラス説明
none初期値
rotate(角度)時計回りの回転
rog、rad
scale(数値,数値)・横方向、縦方向の順の倍率に拡大縮小
・値を一つ → 縦横両方適用
translate(単位付きの数値, 単位付きの数値)・右方向、下方向の順に移動を指定
・値を一つ → 右方向だけ適用
skew()x軸、y軸に沿った傾斜の角度を指定
値を一つ → x軸に沿った角度の傾斜だけ適用

transition-property

  • 効果を適用するプロパティを指定
  • 複数設定はカンマ区切り
  • 値 → プロパティ名、none、all(適用可能な全てのプロパティ、デフォルト値)

transition-duration

変化にかかる時間を指定

transition-timing-function

  • ease … ゆっくり始まり → ゆっくり終わる(デフォルト値)
  • ease-in … ゆっくり始ま → 一定速度で終わる
  • ease-out … 一定速度で始まり → ゆっくり終わる
  • ease-in-out … ゆっくり始まり → ゆっくり終わる
  • linear … 一定速度で変化

transition-delay

  • 開始する時間を遅らせる
  • 初期値0

transition

transition-delay → transition-durationの順に指定

@keyframes

.animation{
animation-name: animation;
animation-duration: 2s;
animation-iteration-count:infinite;
background: #bisque;
height: 60px;
text-align: center;
}
@keyframes animation{
0%{
width: 50%;
}
100%{
width: 100%;
}
}
  • 「0%」→「from」、「100%」→「to」が使用可能
アニメーションサンプル

animation

  • animation-name キーフレームの名前
  • animation-duration 再生時間
  • animation-timing-function 加速、減速
  • animation-delay 開始時間を遅らせる
  • animation-iteration-count 繰り返す回数
  • animation-direction 逆再生

animation-iteration-count

アニメーションの再生を繰り返す回数を指定

その他

table

プロパティ名機能
caption-sideキャプションの表示位置(top、bottom、left、right)
border-collapse罫線の間の隙間の有無
・あり→separate(デフォルト) → border-radius無効
・なし→collapse
border-spacing罫線のあいだの間隔の大きさを指定します。
empty-cells内容が空のセルの背景とボーダーを表示させるかどうか
table-layoutレイアウト方式
auto、fixed表の表示が速くなる

内容を追加するプロパティ

  • content … CSSで内容を追加
  • quotes … qようその前後につける引用符を設定
  • counter-reset … カウンタの値をリセット
  • counter-increment … カウンタの値を進める
<style media="screen">
    li {
      counter-increment: number;
    }
    li::before {
      content: counter(number);
    }
  </style>
<ul>
<li>見出し</li>
<li>見出し</li>
<li>見出し</li>
</ul>
  • 見出し
  • 見出し
  • 見出し

SMACSS

SMACSS(スマックス:Scalable and Modular Architecture for CSS)拡張可能でモジュール的なCSSの設計手法です。

CSSのルールを5種類

  1. ベース
  2. レイアウト
  3. モジュール
  4. 状態(ステート)
  5. テーマ

CSS設計

CSS設計のポイント

GoogleのエンジニアであるPhilipWalton氏が提唱しているCSSが目指す4つのゴールがあります。

  • 予測できる
    • クラス名から影響は範囲が想像できる
    • クラス名から機能・役割が創造できる
  • 再利用できる
  • 保守できる
    • 影響範囲が広すぎない
  • 拡張できる
    • 詳細度が高すぎない
    • HTMLに依存しない

レイアウトに関する記述

以下のようなプロパティーはモジュールクラス自体に直接設定せず、別のレイアウトグループのクラスにてスタイリングすることで、使い回しが可能になります。

  • position
  • zindex
  • top/right/bottom/left
  • float
  • width
  • margin

例えばレイアウトに関するスタイリングをするために以下のようにクラスを設定する方法があります。

.ly_cont {
 width: 1200px;
 padding: 0 16px;
 margin-right: auto;
 margin-left: auto;
}

※SMACSSではレイアウトに関するクラスに接頭辞にl-をつけます。

HTMLに依存しない

HTML要素名をセレクターに使用しないことで、HTMLに依存しない設計が可能です。

これにより何かの事情によりpタグからdivタグに変更しなければならない時に、その影響を考える必要がありません。

SMACSSのモジュールルール

モジュール(見出し、ボタン、カード…)は別のレイアウトに埋め込んでも見た目が崩れたりしないように使用できることが求められます。

影響範囲を広くしすぎない

正しく計算した上で範囲を広く設定することは問題ありませんが、意味もなく範囲を広くしてしまうとそれを打ち消すコードの記述やレイアウト崩れが起きる可能性があります。以下の点がポイントになります。

  • 影響範囲を絞る
    • (例 … 子孫セレクタでなく子セレクタで指定するSMACSS推奨
  • 影響範囲が広い範囲の場合、最小限のスタイリングにとどめる

詳細度を高くしすぎない

必要以上に詳細度を高くすると以下のデメリットがあります。

  • コードが見づらい
  • 上書き、打ち消すのが難しい

詳細度を均一に保つ

<a class="button button_primary" href="#">ボタン</a>

.button.button_primary {…} 詳細度が高い×
.button_primary {…} 詳細度が均一○(BEM)

クラス名から機能・役割が創造できる

汎用的に使用可能な単語

  • __wrapper
  • __inner
  • __header
  • __body

クラス名のつけ方

  • main … 主要な
  • faq … よくある質問
  • title … (サイト、セクションの)タイトル、見出し
  • heading … 見出し
  • lead … 見出しの補足
  • wrapper … 容器(レイアウト)
  • wrapper … 容器(レイアウト)
  • container … 容器(全体的な囲むもの)
  • desc … 概要(description)
  • detail … 詳細
  • wrapper … 概要(description)
  • desc … 概要(description)
  • feature … 特徴

BEMの基本規則

BEMではBlock、Element(Blockの外では独立で使用できない)という構成でクラス名をつけます。

<!-- Block -->
<ul class="menu">
    <!-- Element エレメントはブロックを構成する要素-->
    <li class="menu__item"><a href="" class="menu__link">アイテム1</a></li>
    <li class="menu__item"><a href="" class="menu__link">アイテム2</a></li>
    <!-- Modifier モディファイアはエレメントに対するオプション-->
    <li class="menu__item menu__item__actived"><a href="" class="menu__link">アイテム3</a></li>
</ul>

各名前はアンダースコア2つでつなぎます。

BEMの命名規則

  • ElementとModifierにはBlockの名前を含める
  • Element、Modifier、Blockに2つ以上の単語が含まれる場合、ハイフンで繋ぐ

CSSよく使う記述

https://ntorelabo.com/?p=8973

カスタムプロパティの定義

@charset "UTF-8";

:root {
    --primary-color: #45CCC4;
    --red: #EB4E45;
    --blue: #0158A8;
    --bg-color: #ECFCFB;
    --text-color: #333;
    --breakpoint-sm: 576px;
}

@charset “UTF-8”;

この表記によりhtmlやcssがどの文字コードで書かれているかをブラウザが判断(文字化けを防ぐ)
→現在はブラウザ自動で判断することから、不要論もあります。

画像の大きさの最適化

img {
    max-width: 100%;
    height: auto;
    vertical-align: top;
}
※親要素より横幅が大きい場合のみ縮小され、
高さも自動で縮小され、歪みません

※画像の上下に余白(line-height分の余白)ができない
要素(HTMLの書式)

HTMLの基礎知識

文字実体参照

数値文字参照

タグ

開始タグも閉じタグも省略できるタグ

htmlheadbodytbodycolgroup

※「要素が存在しない」のではなく、ブラウザ側で付け足される

空要素

「/」「>」の間に空白文字入れられない → 文法エラー

グローバル属性

全要素に指定できる

属性説明
accesskeyショートカットを生成する
class
contenteditableユーザによる編集が可能か
contextmenuコンテキストメニュー
data-*カスタムデータ属性。
dir書字方向
draggableドラッグ可能か
ドラッグ&ドロップ API 
hidden関連性があるか
id
lang言語コード
nonceコンテンツセキュリティポリシーのためのワンタイムトークンを示す属性
spellcheckスペルチェックをするか
styleスタイルシート
title補足情報

論理属性

  • 属性名だけで指定できる
  • 属性を指定するとtrue
  • 値を指定する場合「属性名=””」「属性名=”属性名”」

DOCTYPE宣言

  • HTML5では、DOCTYPE宣言は1種類<!DOCTYPE html>
  • srcdoc属性に指定するHTML文書では省略可能 → 宣言をせずとも正確に表示される

全体構造メタ情報

title要素

  • head要素の中で使用
  • 1つのhtml文書の中で1つまで
  • なくても良いケースあり
  • 開始終了タグの省略不可

head要素

  • 通常のHTMLではtitle要素を1つ入れる必要がある(条件により省略可能)

meta要素

属性
charset・文字のエンコーディング(文字に割り当てられた数字)
文書の先頭から1024バイト以内に指定する<title>より前
・HTML5から追加
contentメタ情報の値
http-equivプラグマディレクティブ(HTMLの状態や挙動を指示)
nameメタデータの名前

HTML基本タグ

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

link要素

  • <link rel=”stylesheet” href=”/style.css” type=”text/css”>
  • <link rel=”canonical” href=”https://〇〇.com/”>

base要素

  • 相対URLの基準相対パスの基準位置
  • head要素中、HTML文書に対して1つ記述
  • href属性target属性を指定

a要素

  • href=”URL” … リンク先URL
    tel:xxxxxxxxxx 電話発信リンク
  • target=”ブラウジング・コンテキスト” … 表示するウィンドウ、タブ
  • rel=” “ … 関係
  • type=”MIMEタイプ”
  • hreflang=”言語コード” … リンク先言語
  • download=”ファイル名” … href属性で指定したダウンロード
  • 要素にはインタラクティブコンテンツ(interactive content)は入れられない
    • a要素
    • label要素
    • iframe要素
    • tabindex属性を指定している要素
target属性値開き方
_blank新規ウィンドウ
_self現在のウィンドウ
_parent親ウィンドウ
_topウィンドウ全体
ウィンドウ名指定したウィンドウ名
フレーム名指定したフレーム名

セクションと基本構造

コンテンツ・モデル

各要素の中身を定義

カテゴリ 説明
フローコンテンツ ブラウザに表示する
フレージングコンテンツ テキストを構成
セクショニングコンテンツ セクションを構成
ヘディングコンテンツ 見出しを構成
組込コンテンツ 画像や動画を埋め込む要素
フレージングコンテンツ テキストを構成
インタラクティブコンテンツ ユーザが操作できる
メタデータコンテンツ ページの情報を表す

トランスペアレント

  • 親要素のコンテンツモデルを継承
  • a、audio、video、canvas、ins、del、map、noscript(body要素内)、object、slot

セクショニングコンテンツ要素

セクションの範囲を定義

article雑誌や新聞の記事、ブログの投稿
aside広告やサイドバー、メインコンテンツと関連性の薄いコンテンツ
nav
section意味のもつまとまりを表す

セクショニング・ルート要素

  • 2022年7月(?)廃止
    • body
    • blockquote
    • details
    • fieldset
    • figure
    • td
  • ドキュメント全体から独立した独自の階層構造

main属性

  • 複数配置可能だが、同時に表示はできない(hidden属性が必要)
  • html、body、div、formのみmain属性を含むことができる

address属性

  • 一番近いarticle要素か、body要素の問い合わせ先を示す
  • 内容に入れれるのは問い合わせ先のみ

テキスト

b要素

  • 以前は太字
  • 製品名キーワードリード文
  • 他のものと区別

em要素

  • アクセントをつける

i要素

  • 以前はイタリック体
  • 異なる性質の部分
  • 学名専門用語外国語の慣用句

s要素

  • 以前は取消線(strike-through)

mark要素

  • 検索結果
  • 注目してもらいたい部分

hr要素

  • もともとは横罫線
  • 段落レベルでの主題の変わり目

small要素

  • 付帯情報
  • 以前はテキストを小さく表す

cite要素

  • 作品名
  • 引用文を含めれない

q要素

  • その内容が行内の引用であることを意味する
  • 長文の引用 … blockquote要素を使用

blockquote要素

<blockquote>
<p>吾輩は猫である。名前はまだない。…</p>
</blockquote>
<p><cite>吾輩は猫である</cite>より引用</p>

吾輩は猫である。名前はまだない。…

吾輩は猫であるより引用

u要素

  • 以前は下線(underline)
  • 中国語の固有名詞、スペルミス

bdi要素

bpi要素のテキストは周囲に影響を及ぼさない

ins要素

  • 追加した部分
  • 一般的なブラウザでは下線

del要素

  • 削除した部分
  • 一般的なブラウザでは打ち消し線
del要素 ins要素

その他の要素

li要素

list-style-type
  • list-style-imageが優先される
none記号を無し
disc塗り潰し丸(初期値)
circle白抜き丸
square四角
decimal数字
lower-roman
upper-roman
ローマ字(子文字/大文字)
lower-latin
upper-latin
アルファベット(子文字/大文字)
hiragana
katakana
平仮名、カタガナ

menu要素

  • ツールバー、操作メニュー
  • li要素を使用
<menu>
  <li>項目1</li>
  <li>項目2</li>
  <li>項目3</li>
</menu>
  • 項目1
  • 項目2
  • 項目3
  • dl要素

    • description list
    • dt要素(用語)」「dd要素(説明)」
    • 0以上のdt要素、1つ以上のdd要素
    <dl>
    <dt>作者</dt>
    <dd>松本</dd>
    <dd>渡辺</dd>
    </dl>
    作者
    松本
    渡辺

    dfn要素

    • definition list(定義リスト)
    • 「用語の定義」に使用

    <dl>
    <dt><dfn>プロフェッショナル</dfn></dt>
    <dd>技術と知識を持つ</dd>
    </dl>
    プロフェッショナル
    技術と知識を持つ

    ruby要素要素

    • <rt> Ruby Text
    • <rp> Ruby Parentheses テキストを囲む記号を指定
    • <rb> ルビをふる対象、漢字を分割してrt要素と指定する場合に使用
    • <rtc> rt要素をグループ化
    <ruby>
    要<rt>よう</rt>
    素<rt>そ</rt>
    </ruby>
    よう

    table要素

    • border要素は指定できない

    <table要素内の配置順>

    1. caption要素0か1個
    2. colgroup要素(0か1個
    3. thead(0か1個
    4. tbody0個以上)要素またはtr要素1個以上
    5. tfoot要素0か1個
    <table border="">
      <tr> … 横1列
        <th>見出し内容A</th> … 見出し
        <th>見出し内容B</th>
      </tr>
      <tr>
        <td>データA</td> … 表の中の1つ1つの項目
        <td>データB</td>
      </tr>
    </table>
    見出し内容A 見出し内容B
    データA データB

    thead要素

    thead、tbody、tfoot … 行をグループ化

    <th、theadの使い分け>

    <table border="">
    <thead>
    <tr>
    <th>氏名</th>
    <th>メールアドレス</th>
    <th>電話番号</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>〇〇〇〇</td>
    <td>xxxx@xxx.xxx</td>
    <td>0x0-xxxx-xxxx</td>
    </tr>
    </tbody>
    </table>
    氏名 メールアドレス 電話番号
    〇〇〇〇 xxxx@xxx.xxx 0x0-xxxx-xxxx

    figure要素

    figcaption要素

    figure要素内の一番前か一番後ろに配置

    details要素

    • open属性(論理属性)を指定すると常に見出し(summary要素)が表示される
    • summary要素は最初の子要素で指定する
    <hr>
    <details>
      <summary>概要</summary>
      コンテンツ詳細内容
    </details>
    <hr>
    
    <hr>
    <details>
      <summary>概要</summary>
      コンテンツ詳細内容
    </details>
    <hr>
    <br>
    <hr>
    <details>
      summary省略するとsummary省略するとsummary省略するとsummary省略するとsummary省略すると
    </details>
    <hr>

    概要 コンテンツ詳細内容



    summary省略するとsummary省略するとsummary省略するとsummary省略するとsummary省略すると

    script要素

    • HTML内にスクリプトまたはデータブロックを埋め込む
    • type=”MIMEタイプ” … スクリプトの種類(デフォルト値は「text/javascript
    • async=”論理属性”defer=”論理属性”で同時に指定した場合は、asyncに対応しているブラウザではasyncを、非対応のブラウザではdefer
    属性
    src外部スクリプトのアドレス
    <script src=”〇〇.js”></script>
    typeMINEタイプ
    asyncスクリプトを非同期で読み込み → 読み込み完了後すぐ実行
    deferスクリプトを非同期で読み込み → ページ全体の解析後実行 

    データブロックscriptタグでJavaScripでないもの)を指定する場合type属性は必須で、src属性は使用できない

    noscript要素

    • scriptが無効のときに読み込む
    • HTML構文でのみ使用可能、XML構文では使えない

    WAI-ARIA

    • Web Accessibility Initiative – Accessible Rich Internet Applications
    • role属性役割)とaria属性状態・性質)を定義
    • ブラウザの読み上げ機能を使った場合などに使用
    • banner … 大見出し、タイトル
    • main … メインコンテンツ
    • navigation … ナビゲーション
    • search … 検索

    正規表現

    正規表現説明マッチする該当
    [abc]abcのうち1文字「a」「b」「c」のいずれか
    [^abc]abc以外の1文字「d」など
    [A-Za-z]AからZ、aからzのうちの1文字「d」など
    基礎理論、技術要素(データベース)、ネットワーク

    スタック

    最後に入力したデータを最初に出力する

    キュー

    最初に入力したデータを最初に出力する

    関係データベース

    関係演算

    選択

    必要な行だけを抜き出す

    射影

    データの中から、必要な列だけを抜き出す

    結合

    同じ列を基準に2つの表をくっつける

    正規化

    データに矛盾が発生しにくい

    • レコードの長さを揃える
    • 部分関数従属しているレコードの切り出し

    データとデータの間の関連を示す

    E-R図

    DFD

    特性要因図

    フィッシュボーン図

    管理図

    製品の重量のばらつきを分析

    上方管理限界、下方管理言外

    正規分布

    平均値を中心に左右対象

    バスタブ曲線

    ポアソン分布

    • 滅多に起こらない出来事が任意の時間当たりに起こる回数
    • 発生確率は一定

    データクレンジング

    データの品質を高め、精度を上げる

    レプリケーション

    常に最新の状態でバックアップを保存

    DBMS

    • データベース管理システム(database management system)
    • データの検索や更新
    • データ構造の定義
    • トランザクション管理 …  複数利用者の同時処理において一貫性を保持
    • アクセス制御

    キャリアアグリゲーション

    周波数帯の異なる電波を集約

    プロキシサーバ

    • インターネットへのアクセスを代理で行う
    • 匿名性を確保
    • URLフィルタリング
    • キャッシュ機能

    WPA

    • Wi-Fi Protected Access(無線LAN暗号化方式)
    • WPA2はAES(Advanced Encryption Standard)共通鍵暗号方式を利用

    ESSID

    • 無線LANのネットワークを識別するためのID
    • 最大32文字の英数字

    MACアドレスフィルタリング

    • 無線LANのセキュリティ対策

    BLE

    • 近距離無線通信規格(Bluetooth Low Energy
    • 低消費電力
    • 低速

    ZigBee

    • 近距離無線通信規格
    • 多数のセンサを使用
    セキュリティ

    情報セキュリティ

    • 機密性:許可された人だけが情報にアクセス可能
    • 完全性:情報や処理方法が正確かつ完全
    • 可用性:必要なときに情報にアクセス可能

    追加

    • 真正性:本人だと認証
    • 責任追跡性:ログ情報の追跡
    • 信頼性:処理が正しく確実に行われるか
    • 否認防止:契約などの処理を後から否認できないようにする措置
    https://ntorelabo.com/2023/02/04/4157/#co-index-0

    公開鍵暗号方式

    <暗号化:受信者がペアで作る>

    <デジタル著名:送信者がペアで作る>

    S/MIME

    電子メールの送受信の際公開鍵暗号方式やディジタル署名によってセキュリティを強化

    SMTP

    メール送信転送プロトコル

    POP3

    メールサーバから取り出すプロトコル

    IMAP

    • POP3 … ローカルにダウンロード
    • IMAP … メールサーバーを直接管理

    TPM

    • Trusted Platform Module
    • セキュリティ機能を持つチップ

    ハッシュ関数

    • ハッシュ値から元のデータを特定するのは、ほぼ無理
    • 元のデータが同じならハッシュ値も同じ
    • メッセージダイジェストの長さは一定

    MITB攻撃

    MITB(Man In The Browser)攻撃とは、不正な動作を起こすように作成したマルウェアに感染させ盗聴や改ざんをする攻撃です。

    SQLインジェクション

    SQL文を利用しサーバ内のデータを不正に取得、削除する攻撃方法

    ソーシャルエンジニアリング

    人間の心理的な隙や行動のミス利用

    ブルートフォース攻撃

    ブルートフォースアタック(総当たり攻撃)は、文字の組合せを順に入力する方法

    パスワードリスト攻撃

    別のサイトから流出したパスワードを利用しログイン

    クリプトジャッキング

    所有者の知らない間に暗号資産のマイニング(採掘)を不正に行う

    クロスサイトスクリプティング

    第3者が埋め込んだスクリプトを利用者に起動させる

    DoS攻撃

    サーバの処理能力を超える大量の通信を送りつける

    DDoS攻撃

    • 分散型DDoS攻撃

    RAT

    • Remote Administration Tool
    • 遠隔操作のよって重要情報を不正に入手

    サイバーセキュリティ基本法

    • 目的
    • 定義
    • 基本理念
    • 国の責務
    • 地方公共団体の責務
    • 重要社会基盤事業者の責務
    • サイバー関連事業者その他の事業者の責務
    • 教育研究機関の責務
    • 国民の努力
    • 法制上の措置等
    • 行政組織の整備等

    CSIRT

    • Computer Security Incident Response Team
    • セキュリティ事故、インシデント対応
    • 政府や企業に設置

    J-CRAT

    • Cyber Rescue and Advice Team against targeted attack of Japan
    • 標的型サイバー攻撃に対応

    デジタルフォンレンジックス

    コンピュータ犯罪に対する科学的捜査

    BCP

    • Business Continuity Plan(事業継続計画
    • バックアップ、発電機

    RFID

    • Radio Frequency Identification
    • 通信距離は数cm~数m程度
    • ICチップを無線通信装置を使って、情報の読み書きをする
    • Suica

    NFC

    • Near Field Communication
    • 通信距離は10cm
    • ICカード、スマートフォン
    • NFCはRFIDに属する技術

    PCI DSS

    • Payment Card Industry Data Security Standard
    • クレジットカードの国際的なセキュリティ基準
    【ITパスポート】【基本情報】システム、戦略開発技術、サイト設計書

    リスクマネジメント

    リスクマネジメントのプロセス

    1. コミュニケーション及び協議
    2. 適用範囲,状況及び基準
    3. リスクアセスメント
      • リスク特定 … リスクを洗い出し
      • リスク分析 … 発生頻度・確率などを分析、被害を検討
      • リスク評価 … 受容可能か判断
    4. リスク対応
    5. モニタリング及びレビュー
    6. 記録作成及び報告

    対処方法

    • リスク回避:リスクの発生原因を元から絶ったり、別の手段に変更して、リスクの発生を防ぎます。
    • リスク移転リスク共有リスク転嫁:情報システムの運用を他社に依頼したり、保険に加入するなどして、リスク発生時の損失を他者に肩代わりさせます。
    • リスク低減、リスク軽減
      代替のシステムを用意するなどし、リスクの発生率を減らします 
    • リスク保有リスク受容:リスク対策費用のほうが大きくなる場合、リスク対策を行わない

    ITIL

    • ITIL(Information Technology Infrastructure Library)とは、
    • ITSM(ITサービスマネジメント)のベストプラクティス

    解決プロセス

    インシデント管理

    • インシデント発生時に、応急処置
    • チャットボット

    問題管理

    インシデントの根本的解決

    総合的制御プロセス

    構成管理

    サービスを体系化

    変更管理

    変更が与える影響をを考慮してリリースを承認

    リリース管理

    変更管理プロセスで承認された変更作業を行うスケジュール、手順を管理して実装

    RCM

    • リスクコントロールマトリクス
    • リスクの低減の程度を評価

    RPA

    • RPA(Robotic Process Automation)
    • 人がしていた、定型的な事務作業のソフトウェアによって自動化

    WBS

    コスト見積もり、スケジュール作成を行えるレベルまで要素分解

    マトリックス組織

    技能部門と事業を遂行する部門、両方に所属


    EA

    • エンタープライズアーキテクチャ
    • 企業構造の計画
    • ギャップ分析で理想との差を埋める

    CAD

    • Computer Aided Design
    • コンピュータ支援設計
    • コンピュータで設計、作図
    • データの管理や共有、修正、再利用

    CAM

    • Computer Aided Manufacturing
    • コンピュータ支援による製造

    SLA

    • SLA(Service Level Agreement:サービスレベル契約
    • サービスの提供者がサービスの品質を保証する契約
    • サービス提供者とその利用者との間で交わされる

    SLM

    • SLM(Service Level Management:サービスレベル管理)
    • SLAに基づいて、サービスの品質を継続的・定期的に点検・検証

    RFI

    • 情報提供依頼書(Request for Information
    • ベンダの技術を情報収集

    RFP

    • RFP(Request For Proposal:提案依頼書
    • システムの発注元の企業が開発ベンダに提出される文書
    • システムの概要や調達条件等を明示

    NDA

    • NDA(Non-Disclosure Agreement:秘密保持契約
    • 機密情報を取引先に公開する際に、目的以外で使用や漏洩したりすることを防ぐための契約

    SaaS

    ソフトウェアライフサイクルプロセス

    ソフトウェアライフサイクルプロセスとは、企画、要件定義、開発、運用、保守のそれぞれのプロセスについて、各プロセスで行うべきことをまとめたガイドラインです。

    • 企画プロセス:システム化方針を査定し、システム化計画を作成。開発順序や概算コスト、費用対効果やリスク、納期
    • 要件定義:業務上実現すべき性能や、機能などを明確にし、業務要件を定義
    • 開発
      • システム開発:要件定義、方式設計、結合、適格性確認
      • ソフトウェア実装:要件定義、方式設計、構築、結合、適格性確認
    • 運用
    • 保守

    結合テスト

    モジュールをつなげてテスト

    システムテスト

    定めた性能をチェック

    受入れテスト

    • 仕様書の内容を満たしているかチェック
    • 利用者主体

    回帰テスト

    • リグレッションテスト
    • 修正した時、修正箇所以外に問題が発生していないかテスト

    SoE

    • System of Engagement
    • 企業とユーザをどう繋ぐかを重視したシステム

    SoR

    • System of Record
    • 企業内の情報を安全に運用管理することを重視したシステム

    アジャイル開発

    ソフトウェア開発プロセスのプログラミングやテストを重視し、要件定義やシステム設計を柔軟に見直しながら進めていく手法です。

    イテレーション

    • アジャイル開発で繰り返す工程の単位
    • 繰り返すことで、システムの完成度を高めます。

    XP

    • エクストリーム・プログラミング
    • ソフトウェア品質を向上させ、変化する顧客の要求への対応力を高める
    • ペアプログラミングリファクタリング推奨
    • 変更や削除の勇気
    ペアプログラミング

    二人1組、コーディングとレビュー

    リファクタリング

    • 内部構造をすっきり
    • メンテナンス性向上
    • 外から見て影響がないように作業

    スクラム

    • アジャイル開発の手法の一つ
    • 3つのロール
      • プロダクトオーナ
      • 開発チーム
      • スクラムマスタ
    • 5つのイベント
      • スプリント
      • スプリント計画
      • デイリースクラム
      • スプリントレビュー
      • スプリントレトロスペクティブ
    • 3つの作成物
      • スプリントバックログ
      • プロダクトバックログ
      • インクリメント

    コンカレントエンジニアリング

    各プロセスを並行して進める

    リバースエンジニアリング

    既存のシステムを解析 → 設計

    UML

    オブジェクト指向型のシステム開発の記法

    • 構造を表現: クラス図
    • 振る舞いを表現: シーケンス図

    クラス図

    アクティビティ図

    親和図法

    似たものをグループにまとめて問題解決

    PMBOK

    • プロジェクト管理の手法をまとめたもの
    • 10種類の知識エリア
    • プロジェクト統合マネジメント
      • プロジェクト検証
    • プロジェクト・スコープ・マネジメント
      • プロジェクトの成果物と作業の過不足を管理
    • プロジェクト・スケジュール・マネジメント
    • プロジェクト・コスト・マネジメント
    • プロジェクト品質マネジメント
      • 品質を保つ
    • プロジェクト資源マネジメント
    • プロジェクト・コミュニケーション・マネジメント
    • プロジェクト・リスク・マネジメント
    • プロジェクト調達マネジメント
    • プロジェクト・ステークホルダー・マネジメント

    プロジェクト検証

    • 初めに作る
    • プロジェクト統合マネジメントでつくる
    • プロジェクトの取り決め

    アローダイアグラム

    ガンチャート

    UX

    • User Experience
    • 優れたインターファイスを利用することで得られるポジティブな概念

    UI

    User Interface

    スケールアウト

    サーバの台数を増やす

    スケールアップ

    サーバをより高性能のものに変える

    サイト設計書ハンズオン

    Markdown(.md)で設計書をまとめる

    Markdownファイルでまとめるメリットがあります。

    • .md ファイルはVSCodeのプレビュー機能で確認
    • GitHub上では .md が自動でHTMLに変換されて綺麗に表示、ドキュメントとしてそのまま使える(README.md)
    • リンクや画像も埋め込める
    • Markdown → PDF変換も可能
    • 構造化してまとめることができる
    /project-docs
    ├── README.md                ← 全体概要やリンクまとめ(GitHubのトップにも)
    ├── overview.md              ← プロジェクトの目的・背景・構成概要
    ├── setup.md                 ← 環境構築(Next.js / PHP / Docker)
    ├── deploy.md                ← デプロイ手順(手動・git pullなど)
    ├── structure.md             ← ディレクトリ構成・技術スタック説明
    ├── url-mapping.md           ← URL設計・CMS連携などの一覧
    ├── process-flow.md          ← 処理フロー・ページ生成・API連携など
    └── faq.md                   ← よくある質問・トラブルシュートなど
    

    overview.md

    # プロジェクト概要
    
    ## プロジェクトの目的・概要
    
    本プロジェクトは、もともと外部制作されたPHPベースのWebサイトを、  
    自社内で保守・運用・再構築しているWebアプリケーションです。
    
    Next.js による静的生成(SSG)と、既存の PHP 構成を組み合わせたハイブリッド構成で運用しています。
    
    
    ## なぜ再構築したのか
    
    - ビュー(HTML)と PHP のバックエンド処理が混在しており、保守性が低かった
    - 共通パーツがモジュール化されておらず、修正コストが高い
    - SSR(PHP)構成では表示速度やSEOに課題があり、  
      Webサイトパフォーマンスを強化するため Next.js の SSG を採用
    
    
    ## 技術スタック
    
    | 技術       | 役割                                                             |
    |------------|------------------------------------------------------------------|
    | PHP        | 旧来のフォームページやバックエンド処理                         |
    | Next.js    | SSGによる静的サイトの高速表示(トップページやSEO記事)         |
    | WordPress  | ヘッドレスCMSとして使用し、Next.js側でGraphQL経由でコンテンツ取得 |
    | Git        | バージョン管理                                                   |
    | Docker     | ローカル開発環境の構築(PHP + Apache)                           |
    
    

    setup.md

    # 環境構築手順
    
    ## ローカル開発環境(Next.js)
    
    Next.js の開発環境は以下の手順でセットアップできます。
    
    ### 手順
    
    1. **Node.js / NVM / npm をインストール**
       - Node.js の推奨バージョン(例:18.x など)をインストール
       - `nvm` を使うと複数バージョンの管理が楽になります
    
    2. **プロジェクトリポジトリをクローンして移動**
    
    ```sh
    git clone https://github.com/your-org/your-project.git
    cd your-project/frontend
    ```
    
    3. **依存パッケージをインストール**
    
    ```sh
    npm install
    ```
    
    4. **開発サーバーを起動**
    
    ```sh
    npm run dev
    ```
    
    http://localhost:3000 でNext.jsの開発環境が確認できます。
    
    ---
    
    ### Next.jsの環境変数
    
    - `frontend/.env.local` にAPIキーやWordPressのエンドポイントなどを記載します。
    - 例:
    
    ```env
    NEXT_PUBLIC_API_URL=https://your-wp-site/graphql
    NEXT_PUBLIC_API_KEY=your-api-key
    ```
    
    ---
    
    ## ローカル開発環境(PHP)
    
    PHP部分の開発環境は Docker を使用して構築します。
    
    ### 手順
    
    1. **Docker Desktop をインストールして起動**
       - https://www.docker.com/products/docker-desktop/
       - Windows の場合は **WSL2 の有効化** が必要です
    
    2. **Docker設定ファイルを準備**
       - `Dockerfile` および `docker-compose.yml` を、コーダードライブまたは所定の場所から取得して `backend/` ディレクトリに配置
    
    3. **Dockerを起動**
    
    ```sh
    cd backend
    docker compose up -d
    ```
    
    4. **ブラウザで確認**
    
    ```text
    http://localhost:8080
    ```
    
    ---
    
    ### PHPの環境変数
    
    - `.env` ファイルを使用する場合、`backend/.env` に設定を記載します
    - 例:
    
    ```env
    API_URL=https://api.example.com
    DEBUG=true
    ```
    
    ---
    

    deploy.md

    # デプロイ手順
    
    ## デプロイ方法
    
    Next.jsで生成された静的ファイルを、さくらのレンタルサーバーにアップロードして本番反映を行います。
    
    ---
    
    ### 1. SSGファイルをビルド
    
    Next.js のプロジェクトルート(`frontend/`)で以下のコマンドを実行し、静的ファイルを出力します。
    
    ```sh
    npm run build
    npm run export
    ```
    
    出力先の `out/` ディレクトリに HTML/CSS/JS ファイルが生成されます。  
    これらを本番環境の該当ディレクトリに**上書き配置**します。
    
    ---
    
    ### 2. 本番環境にSSH接続
    
    ```sh
    ssh username@sakura.ne.jp
    cd /path/to/project
    ```
    
    ※ `username` やパスはサーバー設定に応じて変更してください。
    
    ---
    
    ### 3. Git操作(本番サーバー上)
    
    ```sh
    git pull origin main
    ```
    
    または必要に応じて、特定のタグ・ブランチを指定して pull してください。  
    更新内容が静的ファイルに反映されていれば、公開が完了です。
    
    ---
    
    > 注意:`out/` ディレクトリは **ビルド済み静的ファイル** なので、サーバーにあるものと差し替える必要があります。旧ファイル削除やパーミッションに注意。
    

    マーメイド(Mermaid)で表現可能な図の種類と向いてるケース

    VSCodeではマーメイド図をプレビューで確認できます、PDF出力も可能で、便利です!

    以下が代表的なものだ:

    図の種類用途適用例
    flowchartフロー制御のざっくり説明(if/elseや順番など)簡易な処理の流れ、問い合わせ対応フローなど
    sequenceDiagram時系列ベースの通信・イベント順序フロント→バック→APIのPOST処理とか
    stateDiagramステート遷移(UI/ワークフロー向き)入力ステップ遷移、確認→完了画面とか
    classDiagramクラスや構造の説明モデル設計やオブジェクト構成
    entityRelationshipDiagramDB構造(ER図)フォームデータがDBにどう保存されるか

    断片的な実装混在案件なら、sequenceDiagram一択。

    • フロント(Next.js SSG)
    • フォーム表示・送信
    • PHPバックエンド
    • 外部APIへのPOST
    シーケンス図とは ユーザー システム データベース 1. ログイン要求 2. 認証確認 3. 結果返却 4. ログイン完了 特徴: • 時系列での処理の流れを表現 • オブジェクト間のメッセージ交換を可視化 • システム設計・分析に活用