ゆう's Blog
首都直下地震

地震の影響が予想される都道府県

東京都
神奈川県
埼玉県
千葉県
茨城県

群馬県
ホテルモンテローザ太田

都市ガス
群馬県: 前橋市、高崎市、桐生市、伊勢崎市、太田市、沼田市、館林市、渋川市、藤岡市、富岡市、安中市、みどり市

パーミッションを確認

$dir = 'path/to/directory';

if (is_readable($dir) && is_writable($dir) && is_executable($dir)) {
    echo '読み込み、書き込み、実行のすべての権限があります';
} else {
    echo '必要な権限がありません';
}

file_put_contents 関数

file_put_contents 関数は、書き込みが成功した場合には書き込まれたバイト数を返し、失敗した場合には false を返します。

$result = file_put_contents('/path/to/directory/file.txt', 'Hello, World!');
if ($result === false) {
    echo 'ファイルの作成に失敗しました。';
} else {
    echo '書き込まれたバイト数: ' . $result;
}

INSERT文 カラム名を省略して一行挿入する

INSERT文でデータを挿入する時にカラム名を省略する事ができます。

この場合、対象テーブルの全てのカラムに対して値を指定する必要があります。
挿入する値の数が足りなかったり、カラムの定義と違うデータ型を指定すると実行時エラーとなります。

INSERT INTO テーブル名
VALUES
('値1','値2','値3','値4'…)

テーブルの定義通りに、VALUESの後にカンマ区切りで全ての値を指定します。

PHPでMySQLデータをインポートする

<?php
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';
$backupFile = 'path_to_your_backup_file.sql';

// データベース接続
$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// SQLファイルを読み込む
$sql = file_get_contents($backupFile);

// SQLクエリを実行
$conn->exec($sql);

echo "Import completed.";
?>

PHPでMySQLデータをエクスポートする

<?php
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';

// データベース接続
$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// テーブル名を取得
$tables = $conn->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);

$backupFile = 'backup_' . date('Ymd_His') . '.sql';
$handle = fopen($backupFile, 'w');

foreach ($tables as $table) {
    // テーブルの作成文を取得
    $createTableStmt = $conn->query("SHOW CREATE TABLE $table")->fetch(PDO::FETCH_ASSOC);
    fwrite($handle, $createTableStmt['Create Table'] . ";\n\n");

    // テーブルのデータを取得
    $rows = $conn->query("SELECT * FROM $table")->fetchAll(PDO::FETCH_ASSOC);
    foreach ($rows as $row) {
        $values = array_map([$conn, 'quote'], array_values($row));
        fwrite($handle, "INSERT INTO $table VALUES (" . implode(', ', $values) . ");\n");
    }
    fwrite($handle, "\n\n");
}

fclose($handle);
echo "Backup completed: $backupFile";
?>

タイマーに関する組み込み関数

setInterval()関数は、指定した間隔(ミリ秒)ごとに特定の関数を実行するタイマーを設定します。この関数は一意のIDを返し、このIDは後でclearInterval()関数に渡してタイマーを停止するために使用します。

// 1秒ごとにメッセージを表示するタイマーを設定
var intervalID = setInterval(function() {
    console.log("1秒経過しました");
}, 1000);

// 5秒後にタイマーを停止
setTimeout(function() {
    clearInterval(intervalID);
    console.log("タイマーを停止しました");
}, 5000);

このコードは、1秒ごとに"1秒経過しました"というメッセージを表示するタイマーを設定します。そして、5秒後にそのタイマーを停止します。その結果、"1秒経過しました"というメッセージは5回表示され、その後"タイマーを停止しました"と表示されます。

setTimeout()関数は、指定した時間(ミリ秒)が経過した後に特定の関数を一度だけ実行するタイマーを設定します。この関数も一意のIDを返し、このIDはclearTimeout()関数に渡してタイマーを停止するために使用します。

// 5秒後にメッセージを表示するタイマーを設定
var timeoutID = setTimeout(function() {
    console.log("5秒経過しました");
}, 5000);

// タイマーをすぐに停止
clearTimeout(timeoutID);

このコードは、5秒後に"5秒経過しました"というメッセージを表示するタイマーを設定します。しかし、その直後にclearTimeout()関数が呼び出されるため、メッセージは表示されません。


setTimeout関数の中で自身を再度呼び出すことで、setInterval関数と同様の動作を実現することができます。

ただし、setTimeoutを再帰的に使用すると、setIntervalとはいくつかの重要な違いがあります:

動的な遅延: setIntervalは一定の間隔で関数を実行しますが、再帰的なsetTimeoutでは各呼び出しで遅延時間を動的に変更することが可能です。
エラーハンドリング: setIntervalはエラーが発生しても次の呼び出しをスケジュールしますが、setTimeoutではエラーが発生すると次の呼び出しがスケジュールされません。
呼び出しのオーバーラップ防止: setIntervalは指定した間隔で関数を呼び出しますが、前の呼び出しが終了する前に次の呼び出しが開始される可能性があります。一方、再帰的なsetTimeoutでは前の呼び出しが終了してから次の呼び出しをスケジュールするため、この問題は発生しません。

以上のような理由から、特定の状況ではsetIntervalの代わりに再帰的なsetTimeoutを使用することが推奨されます。

let interval = 1000;
setTimeout(function main(){
・・・
・・・
・・・
interval = 1000 - Date.now() % 1000;
  setTimeout(main, interval);
}, interval);

このコードは、関数mainをほぼ正確に1秒ごとに実行するように設定されています。

ここでのポイントは、setTimeout(main, interval)が呼び出されるタイミングです。Date.now() % 1000は現在のミリ秒を1000で割った余りを返します。つまり、現在の秒の中で経過したミリ秒数を返します。これを1000から引くと、次の秒(つまり次の1000ミリ秒)までの残り時間が得られます。

したがって、interval = 1000 - Date.now() % 1000;は、次の秒までの残り時間を計算します。そして、その残り時間だけ待ってからmain関数を再度呼び出します。

この結果、main関数はほぼ正確に1秒ごと(つまり、時計の秒針が動くごと)に実行されます。

ただし、JavaScriptのタイマー関数は完全に正確ではないため、実際の間隔は1秒よりわずかに長くなる可能性があります。これは、JavaScriptがシングルスレッドで動作し、他のタスクが実行中の場合にはタイマーのコールバックが遅延するためです。


最初の一回をすぐに実行したい場合は、関数を一度手動で呼び出してからsetIntervalを設定する

function myFunction() {
  // ここに実行したいコードを書く
}

// 最初の一回をすぐに実行
myFunction();

// その後、指定した間隔で実行を続ける
setInterval(myFunction, 1000); // 1000ミリ秒(1秒)ごとにmyFunctionを実行


setIntervalの戻り値を一つ(最後に実行されたもの)しか保持していないため、setIntervalを連続使用すると、clearIntervalが効かなくなる。

setInterval前に必ずclearIntervalをコールし、前回作ったタイマーを止めるようにする。その後setIntervalで新たなタイマーを作る。setTimeoutの場合はその前にclearTimeoutする。

「秒」→「時分秒」

<script>
function secondsToHms(d) {
    d = Number(d);
    var h = Math.floor(d / 3600);
    var m = Math.floor(d % 3600 / 60);
    var s = Math.floor(d % 3600 % 60);

    var hDisplay = h > 0 ? h + "時間" : "";
    var mDisplay = m > 0 ? m + "分" : "";
    var sDisplay = s > 0 ? s + "秒" : "";
    return hDisplay + mDisplay + sDisplay;
}
</script>

Windows で CPU のフラグ情報を取得する

1) Coreinfo のダウンロードとインストール。
2) コマンドプロンプトを開き、Coreinfo をインストールしたディレクトリに移動します。
3) coreinfo -fコマンドを実行します。

Coreinfo

grep または

grep コマンドで複数のパターンを検索する際には、-E オプションを使用するか、| をエスケープ(\|)する必要があります。-E オプションを使用すると、grep は拡張正規表現をサポートします。これにより、| をエスケープせずに複数のパターンを検索できます。

sshd -T | grep -i -E 'SyslogFacility|PermitRootLogin|PermitEmptyPasswords|PasswordAuthentication'

「|」の前後のスペースを入れない。

スペースを入れると意図したマッチングが変わる可能性があります。例えば、次のように記述すると:
regexp1 | regexp2

この場合、正規表現は「regexp1」と「regexp2」にスペースがあることを期待します。したがって、スペースを入れると、マッチする条件が変わるため、注意が必要です。