ゆう's Blog
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」にスペースがあることを期待します。したがって、スペースを入れると、マッチする条件が変わるため、注意が必要です。

sudo権限を付与

root で。

# visudo

以下の行を追加。username は sudo 権限を付与したいユーザ名。
username ALL=(ALL) ALL

VNC サーバ

server(root)

dnf install tigervnc-server
vi /etc/tigervnc/vncserver.users
systemctl enable --now vncserver@:1.service
dnf --enablerepo=epel,epel-next group install "Xfce" "base-x"
dnf --enablerepo=epel,epel-next install vlgothic-*
dnf groupinstall "Input Methods"
vi /etc/yum.repos.d/google-chrome.repo
dnf install google-chrome-stable
dnf install gedit

server(user(test))

vncpasswd
vi ~/.vnc/config

localhost
nolisten=tcp

local-1

$ ssh -v -C -L 50000:localhost:5901 192.168.1.3 -l test

local-2

$ vncviewer

JavaScriptにおけるグローバル変数

<script>
const globalVar = "変数の値が変更されない";
let globalVar = "変数の値が変更される可能性がある";

let globalVar2;

function myFunction() {
    globalVar2 = "関数内で得られた変数をグローバル変数とする";
}
</script>

※ let、const キーワードを使用して宣言されたグローバル変数は、windowオブジェクトのプロパティとはなりません。

JavaScriptで、変数名を動的に生成したい

直接的にはできないが、オブジェクトのプロパティを使用して同様のことを行うことができる。

let obj = {};
for (let i = 0; i < 10; i++) {
    obj['key' + i] = i;
}

objという名前の空のオブジェクトを作成し、ループ内でkey0からkey9までのプロパティを動的に追加しています。各プロパティの値は、そのキーの末尾の数字と同じです。つまり、key0の値は0、key1の値は1、というようになります。
このオブジェクトのプロパティは、以下のようにアクセスできます:

console.log(obj.key0);  // 0
console.log(obj.key1);  // 1
// ...
console.log(obj.key9);  // 9

または、

console.log(obj['key0']);  // 0
console.log(obj['key1']);  // 1
// ...
console.log(obj['key9']);  // 9

これらの方法を使用すれば、JavaScriptでkey0=0、key1=1、…といった動的な変数を作成することができます。ただし、これらの"変数"は実際にはobjオブジェクトのプロパティであることを覚えておいてください。このため、objオブジェクトを介さないとアクセスできません。

ffmpeg で mp4 をアニメ webp に変換する

ループ無し(デフォルト)
ffmpeg -i input.mp4 output.webp

無限ループ(-loopオプションが必要)
ffmpeg -i input.mp4 -loop 0 output.webp

※ 「-i input.mp4」 : 入力ファイルを指定します。この場合、「input.mp4」という動画ファイルが入力となります。

※ Image Viewer で見るとみんなループしてしまう。
確認は、web ページ上でする。

ffmpeg -i input.mp4 -vf scale=640:-1 output.webp

※ 「-vf scale=640:-1」は幅を640ピクセルに設定し、高さをアスペクト比を保持したまま自動的に設定します。逆に、「-vf scale=-1:640」は高さを640ピクセルに設定し、幅をアスペクト比を保持したまま自動的に設定します。