🏠️Top Page

🖊️おもしろき こともなき世をおもしろく 住みなすものは 心なりけり.

⏩️サービスワーカー、フロント側のコード.スターウォーズみたいだね.

おはようございます.サービスワーカーのプッシュ通知で使用するフロント側のコードの一部部分.このコードの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コードにpowdeg2radいうものが存在している事すら知らなかったけども、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で落ち着くだろうと思う.

今年中に買うかはアメリカ大統領選の結果次第です😆

明日へ続く

⏩️日本って完全自動運転を走らすのも遅いよね.アメリカや中国は

おはようございます.日本って完全自動運転を走らすのも遅いよね.アメリカや中国はもう自動運転車が各都市で走り出しているのに日本はまだ試験走行の特区だけです.変な法案はスピードで通るのに何故、こういう事が遅いだろうか🤔.政治家はAIや自動運転の遅れ取り戻そうと次はバイオ産業だと投資しているようだけどもどうなることやら.

自分はもう日本は駄目なのかも知れないと思いつつある.沈みゆく船に乗りたくないけど、乗っている状態が今なんだろうな.賢い人が海外へ移住したり投資したりするのは何となく分かる、自分もそんな能力があれば海外へ行っている.それぐらい希望を政治に持っていない.

余程の切れ者が政治の指導者になっていろいろと変えていくことが出来たら世の中変わるのだろうけども、そんな人が活躍できない構図が出来上がっているので難しいだろう.日本は沈みゆく船.いまの若者たちが大人になる頃は海外へ出稼ぎ行く事が当たり前ような国になるじゃないかと思いつつある.

明日へ続く

⏩️Push通知ってブラウザ閉じても通知出来る様に出来るのか?

おはようございます.Push通知ってブラウザ閉じても通知出来る様に出来るのか?答えは出来るのですが無料でその機能を実装できるのか.こたえはYesに近い?.有料のサービス機能push7を使用すればもっと簡単に可能です.

サービスワーカーとかいう機能を使えば良いみたいですね.知らないは一時の恥ですね.サービスワーカーとGCPやララベルの拡張Webpushなどを使えば出来そうですがまだ試していません.

因みにPusherサービスを使用して実装しました.当分、無料枠で対応可能な感じですね💁.

下記はリアルタイムPush通知の動作とソースコードの一部になります.

<?php
namespace App\Events;

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\Channel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class NotificationEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $title;
    public $message;
    public $userId;

    public function __construct($title, $message,$userId='')
    {
        $this->title = $title;
        $this->message = $message;
        $this->userId = $userId;
    }

    public function broadcastOn()
    {
        return new Channel('notifications.' . $this->userId);
    }

    public function broadcastAs()
    {
        return 'notification-event';
    }
}

明日へ続く

⏩️Yahoo!みたいな検索ボタンを付けてみた.挙動が若干不審気味かもしれない.

おはようございます.Yahoo!みたいな検索ボタンを付けてみた.挙動が若干不審ですが先日の早朝にリリースしました.先日の記事にも書いたのですがいろいろと機能を追加しているのでなんだか、サイトがごちゃごちゃしてきている気がします.当初はシンプルベストにしたいなと思っていたのですが、まるで注文の多い料理店の様.

ソースコードは汎用性のあるコードにしたつもりなので、環境がワードプレスなら動作すると思います.ソースコードはこちら.因みに変数の命名は自分サイトの命名規則に従っていますので、ご自身のサイトにあった命名規則に変更してください.

const zbody = document.body;
let zsearchButton = null;


zbody.addEventListener('mouseup', handleSelectionPc);

function handleSelectionPc() {
  const selection = window.getSelection();
  const selectedText = selection.toString();

  // 選択されたテキストが存在する場合
  if (selectedText) {

    // 選択範囲の矩形を取得
    const range = selection.getRangeAt(0);
    const rect = range.getBoundingClientRect();

    // 検索ボタンを作成
    if (!zsearchButton) {
      zsearchButton = document.createElement('button');
      zsearchButton.textContent = '検索';
      zsearchButton.classList.add('search-button', 'btn', 'btn-dark');
      // ボタンをbodyにappendChildし、位置を調整
      document.body.appendChild(zsearchButton);
      zsearchButton.style.position = 'absolute';
      zsearchButton.style.top = `${rect.top + window.scrollY + 30}px`;
      zsearchButton.style.left = `${rect.left + window.scrollX}px`;
    }
    // クリックイベントリスナーを追加
    zsearchButton.addEventListener('click', () => {
      search(selectedText);
      removeButton();
    });
  } else {
    // 検索ボタンを削除
    removeButton();
  }
}

zbody.addEventListener('touchend', handleSelectionSp);

function handleSelectionSp() {

  const selection = window.getSelection();
  const range = selection.getRangeAt(0);
  const rect = range.getBoundingClientRect();
  const selectedText = selection.toString();
  if (selectedText) {
    if (!zsearchButton) {
      zsearchButton = document.createElement('button');
      zsearchButton.textContent = '検索';
      zsearchButton.classList.add('search-button', 'btn', 'btn-dark');
      document.body.appendChild(zsearchButton);
      zsearchButton.style.position = 'absolute';
      zsearchButton.style.top = `${window.scrollY + rect.top + 30}px`;
      zsearchButton.style.left = `${rect.left}px`;
    }
    zsearchButton.addEventListener('click', () => {
      search(selectedText);
      removeButton();
    });
  } else {
    removeButton();
  }
}

function removeButton() {
  if (zsearchButton) {
    zsearchButton.remove();
    zsearchButton = null;
    return removeButton();
  }
}

function search(keyword) {
  window.location.href = '://' + window.location.host + '/?s=' + encodeURI(keyword);
}

明日へ続く

⏩️映画、アイミタガイを観てきました.一言で表すといやー良かった.

おはようございます.先日の金曜日に映画、アイミタガイを観てきました.この頃、金曜日に仕事がないのでその関係上、新作映画を初日に観えたり火曜日の合間に映画が安く観えたりと良いこともありますが、その分、働いている日数は少なくなりますので給与にも影響してきますが前向きに考えて生きています.

前置きはそれとして、アイミタガイはいやいやいや無いと思う方もいると思うけど巡り巡ぐって良いことも悪いことも繋がっていると自分は思っていて、そう思っている人がこの映画を観ると良かったなって思える作品になっていることは間違いないです.

アイミタガイ:相身互いを是非劇場でみて心揺さぶられてください.

なお、この映画は静かに物語が進んでいきます.

明日へ続く

⏩️あのYahoo!と同じ機能を追加しようか悩んでいる.選択した文字を

おはようございます.あのYahoo!と同じ機能を追加しようか悩んでいる.選択した文字をサイト内検索する機能.やり方はこのサイトを参照すると導入できそうなんだけど、ちょっとウザいかもしれないと言う気持ちが自分の中にあるので悩んでいます.

もし追加するなら休みの日に機能追加をするつもりです.なので、直近の三連休中に追加していなかったら追加しなかったんだなと思って頂いて構わないです.

let paragraphElement = document.querySelector("p");

paragraphElement.addEventListener('selectstart', function() {
    paragraphElement.addEventListener('mouseup', function(event) {
        console.log(window.getSelection().toString());
    });
});

その場合でもこんな感じになります的なコードは公開しようと思っています.

明日へ続く

⏩️Let's encryptのSSLを適応してもブラウザ等で閲覧するとブロックされるかも.

おはようございます.Let's encryptのSSLを適応してもブラウザ等で閲覧するとブロックされるかも..2024年10月31日以降に発行されるOCSPはブロックするとGさんから通告があった.

https://gigazine.net/news/20240724-letsencrypt-ocsp

OCSPは、ユーザーがウェブサイトにアクセスする際、証明書の有効性をリアルタイムで確認するプロトコルですが、プライバシーリスクや運用コストの問題が指摘されています。一方、CRLは失効した証明書の一覧を提供する方式で、プライバシー保護や運用の簡素化に寄与します。Let's Encryptは、OCSPに依存しているユーザーに対し、早急にCRLへの移行を検討するよう推奨しています。

トイウコトデ、普通に大丈夫そうです.

明日へ続く