@Blog{zip358.com}
日常日誌からプログラムやYOUTUBER紹介、旅日記まで日々更新中です。
Yahoo!みたいな検索ボタンを付けてみた.挙動が若干不審気味かもしれない.
2024.11.03
おはようございます.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);
}
明日へ続く
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
body, createElement, else, encodeURI, getRangeAt, getSelection, handleSelectionPc, handleSelectionSp, keyword, null, px, removeButton, search, selectedText, window.scrollX, window.scrollY, zsearchButton, zsearchButton.classList.add, クリックイベントリスナー, 矩形,
号外NETの記事タイトルをポストするようにコードを組みました.tosajin.info
2024.10.02
おはようございます.号外サイト記事タイトルをポストするようにコードを組みました.これによって少しは高知県の人に貢献できたのではと思っています.この号外NETというサイトはとても良いです.新しいお店の紹介などが逐次わかるというのは良い感じですよね.
因みにソースコードはこんな感じになります.これをLaravelのスケジュールを使用して叩いている形になります.ポストするコードに関してはご自身で考えて作らないとポストすることは出来ないです.
/**
* Execute the job.
*/
public function handle(): void
{
$xmlobj = @simplexml_load_file('https://kochi.goguynet.jp/feed/');
if($xmlobj?->channel?->item){
$str = [];
foreach($xmlobj->channel->item as $key=>$val){
if($this->dateCheck($val->pubDate)){
$str[] = "{$val->title}
{$val->guid}
引用元:号外NET 高知市
";
}else{
break;
}
}
$str = array_reverse($str);
if(count($str)){
$TwitterController = new TwitterController();
foreach($str as $val){
$TwitterController->tweet($val);
}
}
}
}
private function dateCheck($inputDate)
{
$inputDateTime = new DateTime($inputDate);
$inputDateTime->setTimezone(new DateTimeZone('UTC')); // UTCに合わせる
// 現在の日付(UTC)
$currentDateTime = new DateTime('now', new DateTimeZone('UTC'));
// 今日の日付を取得
$today = $currentDateTime->format('Y-m-d');
// 昨日の日付を取得
$yesterday = $currentDateTime->modify('-5 day')->format('Y-m-d');
// 入力された日付のフォーマット
$inputDateFormatted = $inputDateTime->format('Y-m-d');
// 比較
if ($inputDateFormatted === $today || $inputDateFormatted > $yesterday) {
return true;
}
return false;
}
Xなどにポストするにはライブラリを使用してポストすることが簡単だと思っていますが、それが難しいという方は生成AIを使用してクラス化したXにポストするPHPコードを書いてと指示をすればコードを書いてくれると思います.
ちなみにこのソースコードは高知県の号外に特化したコードになります.
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
array_reverse, break, count, dateCheck, else, foreach, format, gt, guid, item, Laravel, modify, pubDate, quot, setTimezone, Tweet, val, void, yesterday, 号外,
レンタルサーバーでデスクトップ通知はPush7がおすすめ.
2024.10.01
おはようございます.今日から10月ですね~.この頃はクーラーを夜な夜な付けることもなくなり快適な生活を送っています.夏は好きですけど今年の夏は暑かった.
さてレンタルサーバーでデスクトップ通知はPush7がおすすめです、今のところプッシュ通知を行っている日本企業はここしか知りません.おそらく海外で同じようなAPIサービスはあると思います.
因みにこのサービス、無料版では購買者に一括送信しか出来ませんが980円支払えば個別送信することも可能です.自分がいま作っているサービスは「npush」というものです.このサービスはNHKの番組表から自分が見たい番組をチェックすると前の日にデスクトップ通知が送信されるというもの.あまり需要がなさそうだけど、自分には必要なものなので運用しようと思っています.まずは自分だけ使う感じで他のユーザーさんは番組検索機能だけ開放します.ただし番組表は東京だけですけどね.
技術的な話.デスクトップ通知などはレンタルサーバーが開放されているポートだけでは機能しません.なので、APIサービスを使用せずに制作したい場合はAWSやVPSサーバーなどを使用することをおすすめします.今回、使用したAPIサービスでPushするPHPコードを抜粋して貼っときます.あくまでもテスト用なので、ここから改修が必要になります.また、個別送信したい方は新たにパラメーターを付与してください.詳しくは公式ページのドキュメントを参照くださいませ.
$apiurl = "https://api.push7.jp/api/v1/";
$appno = config('app.push7no');
$apikey = config('app.push7apikey');
$icon_url = 'https://dashboard.push7.jp/uploads/example.png.webp';
// 送信データ
$data = array(
'title' => "通知タイトル", // 通知タイトル
'body' => "通知テキスト", // 通知テキスト。記事タイトルなど
'icon' => $icon_url, // アイコンファイル
'url' => "https://example.com/", // リンク先。記事URLなど
'apikey' => $apikey
);
// JSON形式に変換
$json_data = json_encode($data);
// cURLセッションを初期化
$ch = curl_init($apiurl . $appno . '/send');
// オプションをセット
curl_setopt($ch, CURLOPT_POST, true); // POSTメソッドを使用
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); // ヘッダーにJSON形式を指定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列で返す
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); // POSTデータをセット
// 実行してレスポンスを取得
$response = curl_exec($ch);
// エラーチェック
if (curl_errno($ch)) {
$error_msg = curl_error($ch);
log::error("cURLエラー: " . $error_msg); // エラーログ
} else {
// レスポンスをデコード
$response_data = json_decode($response, true);
log::info($response_data); // レスポンスをログに記録
}
// cURLセッションを終了
curl_close($ch);
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
application, array, config, Content-type, curl_errno, cURLエラー, cURLセッション, else, Error, json_decode, json_encode, log, npush, quot, response, true, アイコンファイル, エラーログ, デコード, パラメーター,
任意のディレクトリ連番を調べてURLを返却する.
2024.06.21
おはようございます、任意のディレクトリ連番を調べてURLを返却するPHP言語のコードです.このコードは昨日に書いた記事を読んで頂けたら分かると思いますが、ある配下のディレクトリ名が連番で名前付けしていたら、その連番のディレクトリを確認してindex.phpかindex.htmlが存在したらindexページを返却し無ければ、そのディレクトリ内にあるphpファイルのリンクアドレスを返却するようになっています.
<?php
class lists
{
public $toolDir;
public $toolUrl;
public function __construct($toolDir = __DIR__ . '/../', $toolUrl = 'https://zip358.com/tool/')
{
$this->toolDir = $toolDir;
$this->toolUrl = $toolUrl;
}
public function getList($dir = 'demo', $max = 999)
{
$response = [];
for ($i = 0; $i <= $max; $i++) {
$demoDir = $dir . ($i ?: '');
if (file_exists($this->toolDir . $demoDir . '/index.php')) {
$response[] = $this->toolUrl . $demoDir . '/';
} elseif (file_exists($this->toolDir . $demoDir . '/index.html')) {
$response[] = $this->toolUrl . $demoDir . '/';
} else {
$filelist = scandir($this->toolDir . $demoDir, 1);
foreach ($filelist as $file) {
$fileInfo = pathinfo($file);
$basename = $fileInfo["basename"];
$filename = $fileInfo["filename"];
if ($basename != $filename && $fileInfo["extension"] == "php") {
$response[] = $this->toolUrl . $demoDir . '/' . $filename . '.php';
}
}
}
}
return $response;
}
}
<?php
require 'lists.php';
$res = (new lists())->getList();
使用する場合はindex.php側を呼び出してご自身のディレクトリ構造とURLなどに合わしてご使用ください.尚、変数の$resには配列が返却されます.
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$basename, construct, DIR, else, elseif, file_exists, filename, foreach, getList, gt, lt, pathinfo, php require, public, res, response, return, toolUrl, 連番, 配下,
ContactForm7で現在ページのURLを送る方法。 #カスタマイズ
2023.05.27
おはようございます。ContactForm7で現在ページのURLを送る方法です、全ての記事の下にお問い合わせフォームを設置している人はあまりいないかもしれないけれど。そのあまりいない人の一人です😂。
記事の下にショートコードを設置するにはプラグインを自作するか、テンプレート内に埋め込むかどちらかだと思います。自分は前者のプラグインを自作してショートコードを埋め込んでいます。
ショートコードを埋め込むコードはこんなコードです。
<?php
do_shortcode('[contact-form-7 id="XXXX" title="comment"]')
これで全記事にショートコードを埋め込むことが可能ですがこれだけでは動きません。こんな感じのプラグインを作ってみてください。プラグインの設置方法などはググって下さい。
<?php
/*
Plugin Name: comment-add
Plugin URI:
Description: 記事の下にアドセンス広告などを貼り付けるのに使用
Version: 1.0.0
Author: @zip358com
Author URI: https://www.zip358.com
*/
function comment_add($content)
{
if (is_single() && 'post' == get_post_type()) {
$content = $content.do_shortcode('[contact-form-7 id="xxxx" title="comment"]');
return $content;
} else {
return $content;
}
}
add_filter('the_content', 'comment_add');
remove_filter('the_content', 'wpautop');
これだけでは、どのページから問い合わせしたのか分からないので、名前などの入力欄以外に入力欄を設置します。次に設置したそのNoを控えて下さい。
<script>
//Contact Form 7 現在ページのURL
if(document.querySelectorAll("[name='text-564']")){
[...document.querySelectorAll("[name='text-564']")].forEach(elm=>{
elm.setAttribute("type","hidden");
elm.value = decodeURIComponent(location.href);
});
}
</script>
上記のコードを</body>タグ直前に設置してください。設置後、text-564を控えたNoに変更シテクダサイこれで設置が完了です☹。
⚠ContactForm7のメール送信欄にも控えたNoを設置してください。これで完了です!!
最後に送信のご確認を忘れずに😐。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
add_filter, body, comment-add, decodeURIComponent, description, document.querySelectorAll, elm, else, foreach, hidden", lt, php, php do_shortcode, quot, remove_filter, return, setAttribute, title, Version, wpautop,
ブルータス、お前もか?古代の暗号シーザー。 #phpcode
2023.04.30
おはようございます。古代にも暗号というものがあったらしい。古代の人が使っていたシーザーという暗号をPHP化しました。demo74のページを見ると実行結果が表示されていると思います。
古代にはPCというものが無かったので、これでも解読するのにある程度、時間がかかったんでしょうね。ぱっと見、暗号化されているのは分かるけど瞬時に解読できる人はあまりいなかっただと思います。近年では量子暗号とか、パッと見どころかPCがあっても鍵が無いと解読に途方も無い時間を費やする暗号までありますよね。そう思うと暗号の歴史を辿るのも面白いかもしれないですね。
<?php
function caesarCipher($str, $shift) {
$result = "";
$len = strlen($str);
// 26文字のアルファベットを配列として定義する
$alpha = range('a', 'z');
for ($i = 0; $i < $len; $i++) {
$char = strtolower($str[$i]); // 大文字を小文字に変換する
if (in_array($char, $alpha)) { // アルファベットの場合のみシフトする
$index = array_search($char, $alpha); // アルファベットの位置を検索する
$newIndex = ($index + $shift) % 26; // シフト後のアルファベットの位置を計算する
$result .= $alpha[$newIndex]; // シフト後のアルファベットを結果に追加する
} else {
$result .= $char; // アルファベット以外はそのまま結果に追加する
}
}
return $result;
}
// 使用例
$plaintext = "hello world";
$ciphertext = caesarCipher($plaintext, 3);
echo $ciphertext; // "khoor zruog"
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$alpha, $ciphertext, $len, $newIndex, $plaintext, $shift, caesarCipher, char, echo, else, lt, quot, range, result, return, STR, strlen, シーザー, 小文字, 解読,
物理的ルーターがIPv6だと。
2020.12.12
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
物理的ルーターがIPv6で通信しているとcomposerがインストール出来ず、エラーを出力することがある。(virtualBOXの話)今どき、IPv4ってどうなのかと思ったけど、そういう事らしいのでネットワーク設定から物理的ルーターの設定までIPv4に統一するべしです。VPSを使用している人はそこのところは問題ないとは思うものの、例えばAWSやGCPなどを使用している場合はそこも関係してくる場合があるかもしれないので、注意してください。
これが分からずに20分間、PHP.iniの設定やモジュールが足りないのかななど違うことで、探っていました。なんだか、サーバで同じ間違いをまた繰り返しそうなのでメモとして残しときます。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
-r, 0, 036, 07, 1, 1545, 228516, 27, 3, 37, 384, 39, 4, 4488, 46, 56153228907, 59, 6, 62, 63, 7, 756890, 76181, 885, 9, 9024, af, cbf, ce, com, composer-setup, copy, corrupt, echo, ee, else, EOL, fc, file, getcomposer, hash, https, if, installer, IPv, org, php, quot, sha, unlink, verified, ルーター,
MYSQLのif文みたいなものを使用する機会が物凄く少ない気がする。
2019.05.18
### mysql case = if文みたいなもの
```sql
select namae,tensu
case when (tensu >= 75 and tensu <= 80) then '可'
when (tensu >= 25 and tensu < 75) then '否' else '???' end as kahi
from tbl;
table name tbl
|namae|tensu|
|---|---|
|hirose|77|
|non|76|
|arimura|78|
|aragaki|80|
mysql case = if文みたいなものを使用する機会が物凄く少ない気がする。
プログラム言語って使用しなければ抜け落ちるです。
自分の場合、たぶん長期的な記憶に障害があって抜け落ちるですw🙄。
メモしたことすら忘れてしまう…これは痛い老害?。
でも、好きな事は大体覚えていますね、概念的な事を覚えていたら大丈夫です😌。
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
```, 25, 39, 75, 76, 77, 78, 80, and, aragaki, arimura, as, case, else, end, from, gt, hirose, if, kahi, lt, MYSQL, namae, name, non, select, SQL, TABLE, tbl, tensu, then, when, こと, プログラム, メモ, もの, 使用, 可, 否, 場合, 文, 機会, 気, 自分, 言語, 記憶, 障害,