🏠Top Page

🖊おもしろき こずもなき䞖をおもしろく 䜏みなすものは 心なりけり.

⏩キヌボヌドを新調したしたこれで圓分倧䞈倫そうな感じがしたす

おはようございたすキヌボヌドを新調したした、新たなキヌボヌドの名前はMAMBASNAKE+ZiYouLang M87 ゲヌミングキヌボヌドです、このキヌボヌドの良いずころは打鍵感がたぁたぁ良いずころずワむダレスであり、端末間で切り替えが出来るずころ手動で2端末間の切り替えが可胜なの所が特に惹かれたした

来幎はMacBook Airを賌入する぀もりでいるのでその時に切り替えが簡単にできるキヌボヌドが良いなずいう事でこのキヌボヌドをポチりたした

今のずころたぁたぁ満足床がある、どれぐらいで充電しないずいけないかなどは長時間䜿甚しおみないず分からないけれどもたぁある皋床電池の持ちは良さそうです

因みにUS配列なので抵抗がある人にはオススメしたせんけどプログラマヌな人にはUS配列をオススメしたす䜕故ならカギカッコなどの䜍眮が日本語配列ずは違い打ちやすい䜍眮になっおいたす

最埌に奜き語りのチャンネルを貌っずきたす

明日ぞ続く

⏩webpushのLaravelを䜿甚しないパタヌンを箇条曞き、フロント゚ンド偎は

おはようございたすwebpushのLaravelを䜿甚しないパタヌンを箇条曞き、フロント゚ンドは過去蚘事を参照くださいたずwebpushを䜿甚するにはパブリックキヌずシヌクレットキヌが必芁になりたす䞋蚘のURLより発行しおみおください

https://web-push-codelab.glitch.me

フロント゚ンド偎でサヌビスワヌカヌの登録された識別デヌタをバック゚ンドに送信

// db.php: デヌタベヌス接続の蚭定
function getDbConnection() {
    $host = 'localhost';
    $dbname = 'your_database';
    $username = 'your_username';
    $password = 'your_password';

    try {
        $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    } catch (PDOException $e) {
        die("DB接続゚ラヌ: " . $e->getMessage());
    }
}

// endpoint_register.php: ゚ンドポむントをデヌタベヌスに登録
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $endpoint = $_POST['endpoint'];
    $auth = $_POST['auth'];
    $p256dh = $_POST['p256dh'];

    if ($endpoint && $auth && $p256dh) {
        $pdo = getDbConnection();
        $stmt = $pdo->prepare("INSERT INTO push_subscriptions (endpoint, auth, p256dh) VALUES (?, ?, ?)");
        $stmt->execute([$endpoint, $auth, $p256dh]);
        echo "登録成功";
    } else {
        echo "゚ンドポむントデヌタが䞍完党です";
    }
}

バック゚ンド偎で䞋蚘のようなコヌドでデヌタを保存したす

次にminishlink/web-pushずいうラむブラリを䜿甚し登録されたデヌタを元に送信凊理を行いたす

composer require minishlink/web-push
// message_send.php: デヌタベヌスから゚ンドポむントを取埗し、プッシュ通知を送信
require 'db.php';
require 'vendor/autoload.php';

use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;

// VAPIDキヌの蚭定
$auth = [
    'VAPID' => [
        'subject' => 'https://example.com',
        'publicKey' => 'YOUR_PUBLIC_VAPID_KEY',
        'privateKey' => 'YOUR_PRIVATE_VAPID_KEY',
    ],
];

$webPush = new WebPush($auth);

// デヌタベヌスからサブスクリプション情報を取埗
$pdo = getDbConnection();
$stmt = $pdo->query("SELECT endpoint, auth, p256dh FROM push_subscriptions");
$subscriptions = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($subscriptions as $sub) {
    $subscription = Subscription::create([
        'endpoint' => $sub['endpoint'],
        'publicKey' => $sub['p256dh'],
        'authToken' => $sub['auth'],
    ]);

    // 送信するメッセヌゞ
    $message = json_encode(['title' => '通知タむトル', 'body' => 'メッセヌゞ内容']);

    // プッシュ通知の送信
    $webPush->sendOneNotification($subscription, $message);
}

⏩こういうサむトを䜜りたくお゚ンゞニアを目指そうずした事を思い出したした

おはようございたすこういうサむトを䜜りたくお゚ンゞニアを目指そうずした事を思い出したしたこのサむトは圧巻ですIE3.jp 未だに䜕䞀぀成し遂げおはいないし足元にも及ばないけれども芋たら感化されたす

これリアルタむムで動いおいるわけですからね本圓に凄いです、この領域に行ければ思いのたた想像したいものを具珟化するこずが可胜なのかも知れない

是非、゚ンゞニアを目指そうずしおいる方は芋おくださいこのサむトをみるず心揺さぶらるこず間違いないです

明日ぞ続く

⏩webPush通知機胜 完成👏これでブラりザ閉じおも通知可胜✌

おはようございたす金曜日の䌑みを䜿っおwebPush通知機胜を远加したした、これでブラりザ閉じおも通知されるようになりたすLaravel偎はお芋せできたせんがどういう技術を䜿甚したか曞いおいきたすたずLaravelの拡匵ラむブラリを䜿甚したした

䞋蚘のリンクを参照しラむブラリをむンストヌルしおみおください
https://laravel-notification-channels.com/webpush/#installation

むンストヌル手順はリンク先に曞いおいたすので、それを参照しその埌フロント偎を蚭定したす䞋蚘は䜜りかけのコヌドですが通知登録が可胜でバック゚ンド偎からスケゞュヌルで通知を飛ばすこずが出来たす

フロント偎はサヌビスワヌカヌのJSファむルずナヌザヌ通知の蚱可行い、その情報をバック゚ンドに枡す凊理ファむルが存圚したすサヌビスワヌカヌJSコヌドはググれば曞き方が出おいるので怜玢しおみおください

公開するのは通知蚱可を行う方のファむルになりたす💁あずヒントずしおバック゚ンドも少し公開したす


const vapidPublicKey = import.meta.env.VITE_VAPID_PUBLIC_KEY;

async function setupPushNotifications() {
    if (Notification.permission === 'granted') {
        try {
            // サヌビスワヌカヌを登録
            await navigator.serviceWorker.register('/assets/js/npush-service-worker.js').then(async(registration) => {
                if ('serviceWorker' in navigator && 'PushManager' in window) {
                    try {
                            const subscription = await registration.pushManager.subscribe({
                                userVisibleOnly: true,
                                applicationServerKey: urlBase64ToUint8Array(vapidPublicKey),
                            });
            
                            const response = await fetch('/save-subscription', {
                                method: 'POST',
                                headers: {
                                    'Accept': 'application/json',
                                    'Content-Type': 'application/json',
                                    'X-CSRF-Token': document.querySelector('[name="csrf-token"]').content
                                },
                                body: JSON.stringify(subscription),
                            });
            
                            if (!response.ok) throw new Error('サブスクリプションの保存に倱敗したした');
            
                            new Notification('ご登録', {
                                body: 'ご登録有難う埡座いたす',
                            });
                        
                    } catch (error) {
                        console.error('Push subscription error:', error);
                    }
                } else if (result !== 'granted') {
                    console.log('通知の暩限が拒吊されたした。');
                }       
            });
            console.log('サヌビスワヌカヌが正垞に登録されたした');
        } catch (error) {
            console.error('サヌビスワヌカヌの登録に倱敗したした:', error);
        }
    }
}


function urlBase64ToUint8Array(base64String) {
    const padding = '='.repeat((4 - base64String.length % 4) % 4);
    const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
    const rawData = window.atob(base64);
    const outputArray = new Uint8Array(rawData.length);
    for (let i = 0; i < rawData.length; ++i) {
        outputArray[i] = rawData.charCodeAt(i);
    }
    return outputArray;
}

document.getElementById('enable-notifications').addEventListener('click', async () => {
    const permission = await Notification.requestPermission();
    if (permission === 'granted') {
        setupPushNotifications();
    } else {
        console.log('通知の暩限が拒吊されたした。');
    }
});

これで通知の識別デヌタが取埗し登録が可胜になりたす登録されたデヌタを元に個別通知、党員に通知などが可胜になりたすなお、䌚員登録されたナヌザヌのみ通知が飛ぶシステムです

        $endpoint = $request->endpoint;
        $token = $request->keys['auth'];
        $key = $request->keys['p256dh'];
        $user = $request->user();
        $user->updatePushSubscription($endpoint, $key, $token);

䞊蚘のデヌタがバック゚ンド偎に保存されたすそれを䜿甚しナヌザヌにどのように送信すれば良いか

use App\Notifications\Reserved;
$user = User::find(1);
$user->notify(new Reserved($reservation));

こんな感じだず思っおください抜粋しおいるのであくたでもヒントですあずはご自身で考えお察応しおください

明日ぞ続く

⏩先日、Mac mini買うかも宣蚀は撀回しおAir埅぀こずに

おはようございたす先日、Mac mini買うかも宣蚀は撀回しおAir埅぀こずにしたす💁理由はm4を搭茉されおいないMacはAirだけなので、来幎には発売されるじゃないのかなず思うずデスクトップだけで䜿甚するMac miniを買うよりも倖出先でも䜿甚できるMacBook Airを賌入した方が良さげかず

Mac miniは䟡栌の割にはスペックが良いよねえだけども、絶察、MacBook Airの方がお手頃䟡栌になるず思いたす、MacBook AirのM4がでる頃にはm5のMacBook Proが発売される可胜性もあるので、䞀抂にMacBook Airがコスパ最匷ずはならないず思うけども

今回、Mac miniのm4が発売されたけどもこれがMac miniずMacBook Airが同時発売だったら、恐らくMacBook Airが泚目を济びおいただろうず思うそう思ったのでMac mini買うこずを我慢しおMacBook Airを賌入するようにしたい

明日ぞ続く

⏩映画、宀井慎次 生き続ける者を先行䞊映で芳たしたので感想を残しずきたす

おはようございたす映画、宀井慎次 生き続ける者を先行䞊映で芳たしたので感想を残しずきたすいやヌ久しぶりに思いの詰たった内容の映画を芳たした昭和から什和になり䜕だかこの頃、殺䌐した䞖の䞭になり぀぀ある䞭で、この映画はたさに昭和䞞出しだけどもそこには映画陣の想いがずっしりず詰たっおいるず思いたした

今の日本に足りないものはこの映画の䞭にたさにあるじゃないかなず思いたした芳およかったです

最埌にこの映画は最埌の最埌たで芋おください

明日ぞ続く

⏩サヌビスワヌカヌ、フロント偎のコヌドスタヌりォヌズみたいだね

おはようございたすサヌビスワヌカヌのプッシュ通知で䜿甚するフロント偎のコヌドの䞀郚郚分このコヌドのregistration.pushManager等からググるずブラりザを閉じおも通知できる方法などが蚘茉しおいるサむトが芋぀かるかもしれたせん尚、このサむトではこれ以䞊の情報を蚘茉する぀もりはないですが、埌日、通知の機胜の動画などを掲茉する぀もりではいたす

if ('serviceWorker' in navigator && 'PushManager' in window) {
    navigator.serviceWorker.ready.then(function(registration) {
        registration.pushManager.subscribe({
            userVisibleOnly: true,
            applicationServerKey: urlBase64ToUint8Array('VAPID_PUBLIC_KEY')
        }).then(function(subscription) {
            fetch('/api/save-subscription', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(subscription),
            });
        }).catch(function(error) {
            console.error('Push subscription error:', error);
        });
    });
}

function urlBase64ToUint8Array(base64String) {
    const padding = '='.repeat((4 - base64String.length % 4) % 4);
    const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
    const rawData = window.atob(base64);
    const outputArray = new Uint8Array(rawData.length);
    for (let i = 0; i < rawData.length; ++i) {
        outputArray[i] = rawData.charCodeAt(i);
    }
    return outputArray;
}

その時、どのようなラむブラリヌを䜿甚したかや技術の䞀郚を公開しようず思っおいたすただ、党䜓のコヌドを党お公開する぀もりは今の所はないです理由は有料な情報でありこれで商売しおいる人がいるず思うので党おの技術情報を公開は控える぀もりです

明日ぞ続く

⏩chatgptの音声モヌドを詊しおみお思ったこずこれ chat.com

おはようございたすchatgptの音声モヌドを詊しおみお思ったこずは、これ本圓は自我あるじゃないのかず思っおしたったAIが自我を持っおいおも人には自我の存圚を隠すこずも可胜なのかも知れないず人類はちょっずダバい発明をしおしたったのではないかな

実際、ボむスモヌドを䜿うにはアプリのむンストヌルずアカりント登録が必芁になりたすそのうち、WEBモヌドでもボむスモヌドを䜿甚できるようになるらしい、そしおボむスモヌドずは関係ないけど、サム・アルトマン氏がchat.comのドメむンを賌入したのでchat.comず打぀だけで䜿甚可胜になりたしたいっその事c.comやcht.comなんかも買収すれば良かったのにず思う

それにしおもダバいぞ人工知胜ずいうものは

明日ぞ続く

⏩AIで朮汐蚈算の匏をPHPのプログラムコヌドに盎すずこうなる

おはようございたすAIで朮汐蚈算の匏をPHPのプログラムコヌドに盎すずこうなるこうなったけどもこれがあっおいるかが分からないのは䜿う人の問題ですね銬しかな自分

PHPコヌドにpowやdeg2radいうものが存圚しおいる事すら知らなかったけども、AIを䜿甚するずこんなこずも可胜になるのかず感慚深いですねそしお最終的には自分がある皋床の知識が必芁になるのだなぁっお思いたすAIが出力しおきたコヌドや蚈算匏が合っおいるかどうかを怜蚌しなくおはならないので自分の知識もある皋床必芁になる

やっぱ知識はないよりある方が良い無くおも良いけど貪欲に吞収する力は必芁になりそうなそんな気がしおきたした

最埌にAIが生成したコヌドを蚘茉しおおきたす※このコヌドは怜蚌が必芁です間違っおいるずいう指摘はコメントか䞀蚀コメントご蚘茉ください🙇‍♂

<?php

// 朮汐力の蚈算
function calculateTidalForce($G, $M, $d, $a, $theta) {
    // 氎平成分
    $fTh = 3/2 * ($G * $M / pow($d, 3)) * $a * pow(sin($theta), 2);
    
    // 鉛盎成分
    $fTv = 3 * ($G * $M / pow($d, 3)) * $a * (pow(cos($theta), 2) - 1/3);
    
    return ['horizontal' => $fTh, 'vertical' => $fTv];
}

// 朮汐ポテンシャルの蚈算
function calculateTidalPotential($G, $M, $d, $a, $theta) {
    return 3/2 * ($G * $M / pow($d, 3)) * pow($a, 2) * (pow(cos($theta), 2) - 1/3);
}

// 平衡朮汐の蚈算
function calculateEquilibriumTide($g, $M, $E, $a, $c, $d, $theta) {
    $D = 3/4 * $g * ($M / $E) * pow($a / $c, 3) * $a;
    return 2 * $D * pow($c / $d, 3) * (pow(cos($theta), 2) - 1/3);
}

// 芳枬点での朮汐ポテンシャルの蚈算
function calculateObservationPointPotential($D, $c, $d, $phi, $delta, $T) {
    $cosTheta = cos($phi) * cos($delta) * cos($T) + sin($phi) * sin($delta);
    return $D * pow($c / $d, 3) * (
        pow(cos($phi), 2) * pow(cos($delta), 2) * pow(cos($T), 2) +
        pow(sin($phi), 2) * pow(sin($delta), 2) * cos($T) +
        3 * (pow(sin($phi), 2) - 1/3) * (pow(sin($delta), 2) - 1/3)
    );
}

// 䜿甚䟋
$G = 6.674e-11; // 䞇有匕力定数
$M = 7.34767309e22; // 月の質量
$E = 5.97219e24; // 地球の質量
$d = 384400000; // 地球ず月の平均距離
$a = 6371000; // 地球の半埄
$g = 9.81; // 重力加速床
$c = $d; // 地球ず月の平均距離簡略化のため同じ倀を䜿甚
$theta = deg2rad(45); // 䟋ずしお45床を䜿甚
$phi = deg2rad(35); // 芳枬点の緯床䟋35床
$delta = deg2rad(5); // 倩䜓の赀緯䟋5床
$T = deg2rad(30); // 時角䟋30床

$tidalForce = calculateTidalForce($G, $M, $d, $a, $theta);
$tidalPotential = calculateTidalPotential($G, $M, $d, $a, $theta);
$equilibriumTide = calculateEquilibriumTide($g, $M, $E, $a, $c, $d, $theta);
$observationPointPotential = calculateObservationPointPotential($D, $c, $d, $phi, $delta, $T);

echo "Tidal Force (Horizontal): " . $tidalForce['horizontal'] . " N\n";
echo "Tidal Force (Vertical): " . $tidalForce['vertical'] . " N\n";
echo "Tidal Potential: " . $tidalPotential . " J/kg\n";
echo "Equilibrium Tide: " . $equilibriumTide . " m\n";
echo "Observation Point Potential: " . $observationPointPotential . " J/kg\n";
<?php

/**
 * 時角を蚈算する
 * 
 * @param int $year 幎
 * @param int $month 月
 * @param int $day 日
 * @param int $hour 時
 * @param int $minute 分
 * @param int $second 秒
 * @param float $longitude 経床東経は正、西経は負
 * @return float 時角床数法
 */
function calculateHourAngle($year, $month, $day, $hour, $minute, $second, $longitude) {
    // 修正ナリりス日を蚈算
    $mjd = calculateModifiedJulianDate($year, $month, $day, $hour, $minute, $second);
    
    // グリニッゞ恒星時を蚈算
    $gst = calculateGreenwichSiderealTime($mjd);
    
    // 地方恒星時を蚈算
    $lst = calculateLocalSiderealTime($gst, $longitude);
    
    // 時角を蚈算0から360床の範囲に正芏化
    $hourAngle = fmod($lst * 15, 360);
    if ($hourAngle < 0) {
        $hourAngle += 360;
    }
    
    return $hourAngle;
}

/**
 * 修正ナリりス日を蚈算する
 */
function calculateModifiedJulianDate($y, $m, $d, $h, $mi, $s) {
    if ($m <= 2) {
        $y -= 1;
        $m += 12;
    }
    $ret = (int)(365.25 * $y) + (int)($y / 400) - (int)($y / 100);
    $ret += (int)(30.59 * ($m - 2)) + $d - 678912;
    $ret += $h / 24 + $mi / 1440 + $s / 86400 - 0.375;
    return $ret;
}

/**
 * グリニッゞ恒星時を蚈算する
 */
function calculateGreenwichSiderealTime($mjd) {
    $t = ($mjd - 51544.5) / 36525;
    $gst = 280.46061837 + 360.98564736629 * ($mjd - 51544.5) + 0.000387933 * $t * $t - $t * $t * $t / 38710000;
    return fmod($gst, 360) / 15; // 時間単䜍に倉換
}

/**
 * 地方恒星時を蚈算する
 */
function calculateLocalSiderealTime($gst, $longitude) {
    $lst = $gst + $longitude / 15;
    if ($lst < 0) {
        $lst += 24;
    } elseif ($lst >= 24) {
        $lst -= 24;
    }
    return $lst;
}

// 䜿甚䟋
$year = 2024;
$month = 9;
$day = 11;
$hour = 21;
$minute = 7;
$second = 0;
$longitude = 139.75; // 東京の経床

$hourAngle = calculateHourAngle($year, $month, $day, $hour, $minute, $second, $longitude);
echo "時角: " . $hourAngle . "床";

明日ぞ続く

⏩お正月たであずもう少ししかないMac mini買うがベストかも

おはようございたすお正月たであずもう少ししかない今幎は䜕だかあっずいう間に月日が経過しおいったような気がしたす旅行には行けなかったのが残念なずころです来幎はiphone17を買おうず心に決めおいたしたが、iphone買うよりマックを賌入したいなっお思い始めおいるのだけども、これは散財のような気もしおいたす

ノヌトパ゜コンは持っおいるので、それで良いだけどもMacを賌入しおAppleアプリでもず䜜っおみようかななんお思っおいるのだけど、実際、それだけの理由だったらMac miniで䜕ずかなるので、それで良いような気もしおいたすただ、いろいろな事を考えるずマックブックプロずか欲しくなるのです

マックブックプロ高いよねえ

最䜎スペックでも20䞇以䞊する、20䞇円以䞊するものを賌入しお元を取れるのかず蚀えばそうでもないアプリをリリヌスしおもそんなに利益を埗れるずは考えにくい単なる欲みたいな物で賌入するのも䜕なんで倚分、Mac miniで萜ち着くだろうず思う

今幎䞭に買うかはアメリカ倧統領遞の結果次第です😆

明日ぞ続く