LLMO対策の前手順として、マークダウン記法を施しました.

2025.09.02

Logging

おはようございます.LLMO対策の前手順として、マークダウン記法を施しました.シングルページにマークダウン記法のリンクがそれぞれの記事にあると思います.

そのリンクをクリックするとマークダウン記法が表示されます.LLMO設置後、LLMs.txtを設置すれば良いらしいので、そちらも近日中に対応する予定です.尚、この記事がUPされている頃にはLLMs.txtの設置が終わっている気もします.

追伸:LLMs.txtの設置が終わりました、ルートに設置しています.LLMs.txtはマークダウン記法が記載されているURL(リンク)を一行ずつ表示するような形式で良いらしいです.

これをチャッピーさんにプラグインにして貰いましたのでお裾分けです.下記のプラグインを導入すると全記事URL(パラメーター(マークダウン記法と認識させる))が発行されます.

※マークダウン記法したページはご自身で作る必要があります.

<?php
/*
Plugin Name: LLMS URL Exporter (Fixed)
Description: 公開記事のURLをuploads/llms.txt に日付降順で出力します。管理画面のボタンで非同期(AJAX)実行。新規公開時は先頭に追記。
Version: 1.1
Author: taoka toshiaki
*/

if ( ! defined( 'ABSPATH' ) ) exit;

class LLMS_URL_Exporter {
    private $file;

    public function __construct() {
        $this->file = $_SERVER['DOCUMENT_ROOT'] . '/llms.txt';

        add_action( 'admin_menu', [ $this, 'add_admin_page' ] );
        add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_script' ] );

        // AJAX (管理画面からの呼び出し = ログインユーザー用)
        add_action( 'wp_ajax_llms_generate_urls', [ $this, 'generate_urls' ] );

        // 投稿が公開になったとき(状態遷移を監視)
        add_action( 'transition_post_status', [ $this, 'on_transition_post_status' ], 10, 3 );

        register_activation_hook( __FILE__, [ $this, 'create_file_on_activate' ] );
    }

    public function create_file_on_activate() {
        $dir = dirname( $this->file );
        if ( ! is_dir( $dir ) ) {
            wp_mkdir_p( $dir );
        }
        if ( ! file_exists( $this->file ) ) {
            @file_put_contents( $this->file, "" );
        }
    }

    public function add_admin_page() {
        add_menu_page(
            'LLMS URL Exporter',
            'LLMS Export',
            'manage_options',
            'llms-url-exporter',
            [ $this, 'admin_page_html' ]
        );
    }

    public function enqueue_admin_script( $hook ) {
        // 管理画面の当該ページだけに読み込む
        if ( $hook !== 'toplevel_page_llms-url-exporter' ) return;

        // jQuery は管理画面に既に存在
        wp_enqueue_script( 'llms-admin', plugins_url( 'llms-admin.js', __FILE__ ), [ 'jquery' ], '1.0', true );

        wp_localize_script( 'llms-admin', 'LLMS_Ajax', [
            'ajax_url' => admin_url( 'admin-ajax.php' ),
            'nonce'    => wp_create_nonce( 'llms_generate_urls_nonce' ),
        ] );

        // もし外部ファイルを用意しないなら、admin_page_html 内の inline script がフォールバックになります。
    }

    public function admin_page_html() {
        ?>
        <div class="wrap">
            <h1>LLMS URL Exporter</h1>
            <p>公開中の全投稿URLを <code>/llms.txt</code> に日付降順で書き出します。</p>
            <button id="llms-generate-btn" class="button button-primary">全記事URLを書き出す</button>
            <div id="llms-result" style="margin-top:12px;"></div>
        </div>
        <?php
        // フォールバック用のインラインスクリプト(もし外部 JS を作らない場合に有効)
        $nonce = wp_create_nonce( 'llms_generate_urls_nonce' );
        $ajax_url = admin_url( 'admin-ajax.php' );
        ?>
        <script type="text/javascript">
        jQuery(function($){
            $('#llms-generate-btn').on('click', function(){
                var $res = $('#llms-result');
                $res.text('処理中...');

                var data = {
                    action: 'llms_generate_urls',
                    _ajax_nonce: (typeof LLMS_Ajax !== 'undefined' ? LLMS_Ajax.nonce : '<?php echo esc_js( $nonce ); ?>')
                };
                var url = (typeof LLMS_Ajax !== 'undefined' ? LLMS_Ajax.ajax_url : '<?php echo esc_js( $ajax_url ); ?>');

                $.post(url, data, function(response){
                    if ( response && response.success ) {
                        $res.html( response.data.message );
                    } else if ( response && response.data && response.data.message ) {
                        $res.html('エラー: ' + response.data.message);
                    } else {
                        $res.html('不明なレスポンス: ' + JSON.stringify(response));
                    }
                }).fail(function(jqXHR, textStatus, errorThrown){
                    $res.html('AJAX エラー: ' + textStatus + ' ' + errorThrown + ' (status: ' + jqXHR.status + ')');
                });
            });
        });
        </script>
        <?php
    }

    // AJAX ハンドラ
    public function generate_urls() {
        // nonce と権限チェック
        check_ajax_referer( 'llms_generate_urls_nonce', '_ajax_nonce' );
        if ( ! current_user_can( 'manage_options' ) ) {
            wp_send_json_error( [ 'message' => '権限がありません。' ], 403 );
        }

        $args = [
            'post_type'      => 'post',
            'post_status'    => 'publish',
            'orderby'        => 'date',
            'order'          => 'DESC',
            'posts_per_page' => -1,
            'no_found_rows'  => true,
            'fields'         => 'ids',
        ];

        $posts = get_posts( $args );
        $urls = [];
        foreach ( $posts as $pid ) {
            $permalink = get_permalink( $pid );
            if ( $permalink ) $urls[] = $permalink.'?md=1';
        }

        $content = implode("\n", $urls);


        $written = @file_put_contents( $this->file, $content );
        if ( $written === false ) {
            $err = error_get_last();
            $msg = isset( $err['message'] ) ? $err['message'] : '不明な書き込みエラー';
            wp_send_json_error( [ 'message' => 'ファイル書き込みに失敗しました: ' . $msg ] );
        }

        wp_send_json_success( [ 'message' => 'llms.txt に ' . count( $urls ) . ' 件のURLを書き出しました。' ] );
    }

    // 公開判定:状態遷移で publish になったときに先頭へ追加
    public function on_transition_post_status( $new_status, $old_status, $post ) {
        if ( $post->post_type !== 'post' ) return;
        if ( $new_status === 'publish' && $old_status !== 'publish' ) {
            $url = get_permalink( $post->ID ).'?md=1';

            $current = '';
            if ( file_exists( $this->file ) ) {
                $current = file_get_contents( $this->file );
            }

            // 既存の同一URLがあれば削除して先頭へ
            $lines = array_filter( array_map( 'trim', explode("\n", $current ) ) );
            $lines = array_values( array_diff( $lines, [ $url ] ) );
            array_unshift( $lines, $url );

            $new_content = implode("\n", $lines);

            @file_put_contents( $this->file, $new_content );
        }
    }
}

new LLMS_URL_Exporter();

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, いん, インライン, エラー, お裾分け, クリック, これ, サン, シングル, スクリプト, そちら, それぞれ, ダウン, チェック, チャッピー, とき, パラメーター, ハンドラ, ファイル, フォールバック, フラグ, ページ, ボタン, マーク, ユーザー, よう, リンク, ルート, レスポンス, ログイン, 一行, 下記, 不明, 予定, 先頭, 公開, 処理, 出力, 判定, 削除, 同一, 呼び出し, 場合, 外部, 失敗, 存在, 実行, 対応, 対策, 導入, 当該, 形式, 必要, 手順, 投稿, 新規, 既存, 日付, 明日, 書き込み, 有効, 権限, 状態, 用意, 画面, 発行, 監視, 管理, 自身, 表示, 記事, 記法, 記載, 設置, 認識, 近日, 追伸, 追加, 追記, 遷移, 降順, 非同期,

Photo by Stas Knop on Pexels.com

釣りマップなう

2024.03.19

Logging

おはようございます、ある程度出来たのでリリースしました.これからはデータ削除とかが出来なくなりました.ローカルで検証してファイルアップロードとか行う感じになりますね.

釣りマップなう』というサイトは、一応TensorFlowのJSを使用して魚の画像か判別しています.大量の魚が写っている画の場合、魚と判定されない場合があります、また、小さな魚の画像でも同様に魚の画像と判定されないです.この判定を良いものにするにはモデルを自分で生成してあげる必要がありそうです.

魚の動画から水回しして魚を学習させれば良いらしいのですが、商用利用でも可能な魚の動画を探すので苦戦しています.

学習させればあとは、学習済みのモデルをTensorFlow.jsでも使用できるようにコンバーター(変換)させて上げれば良いのです.

さて、馬しかな自分でも機械学習出来るようになってきました.ここはレッドオーシャンなのかもしれません.

明日へ続く.

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

JS, tensorflow, Tensorflow.js, コンバーター, データ削除, ファイルアップロード, モデル, レッドオーシャン, 判定, 動画, 商用利用, 学習済み, 感じ, 機械学習, , , 画像, 自分, , ,

機械学習は学習するのにどれぐらいのデータが必要?

2022.09.06

Logging

今日は大荒れ☔との事です、おはようございます。

8月の半ばにとある事情で機械学習で人の顔かどうかを判別させるモデルをTensorFlowで作ってみたのですが、結果、学習のデータが少なかったのが原因なのか分からないけども・・・。人工無能と言いたくなるほど無能な機械学習が出来上がりました。犬の画像を見せてもこれは人ですと判定してくれるので正直、ホントげんなりでした。

画像分類の作り方は簡単です、学習したいディレクトリとテスト用のディレクトリを作り、それぞれの階層に分類ディレクトリを設置し、その中に学習の画像データとテスト用の画像データを入れてサンプルコードをちょちょっと修正してテンソル(Pythonを実行)で学習してもらうだけです。

画像分類器を作る(機械学習ゼーロからヒーローへ – 第4部)

尚、自分のテストデータは100枚ほどしかなかったので、全然駄目な結果になりましたが3000枚以上の画像データがあればちゃんとした判別が出来たのかも知れません。

スマホの顔認証は動画データを画像データー変換して学習させているのでしょうね。そうすれば数千枚の画像は生成出来ると思います。

例えばopencv-pythonなんかで画像変換するのが良さそうですよ。

pip install opencv-python

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

100, 3000, 4, 8, Python, tensorflow, コード, これ, サンプル, ゼーロ, それぞれ, ちょ, データ, ディレクトリ, テスト, テンソル, どれぐらい, ヒーロー, ホント, モデル, , , 事情, , 人工, 今日, 作り方, 修正, 分類, 判別, 判定, 半ば, 原因, , 大荒れ, 学習, 実行, 必要, 機械, 正直, 無能, , 画像, 簡単, 結果, 自分, 設置, 階層, , 駄目,

java言語を勉強していて結構つまずく。ゴリゴリとコードを書きたいな。

2021.08.19

Logging

家のクーラーの付いている環境にいると日中が寒いぐらいですね。洗濯物を干すのに自分の部屋が活躍しているのでクーラーが切れないのです。早くお天気の日にならないものか??

さて、java言語を今、勉強していると書きましたが本当にメチャクチャな勉強方法なので、基本的な順番をすっ飛ばしているような気がします。コマンドラインでoとxを入力出来るものを作りました。それ以外を入力すると再度、入力してもらうという単純なアルゴリズムですが、PHP言語のような文字判定をしていたので三項演算子で正しいデータを入力しているのに否定を返すように処理が動いてしまってつまずきました。

こんな感じで毎日、java言語に触れていたら「習うより慣れよ」という感じで日々、覚えていけるのではないかなと思います、今回躓きは初心者の初の字ぐらいの部分だと思いますが、こうやって覚えていくしかないなと思います。

あるアプリ会社を一年ぐらい前に受けたのですが二次面接で不採用になりました。その会社の紹介サイトを先日、拝見したら未経験の人を採用している紹介文を見て絶句しました。なんだろうか、この行き場のないやるせない気持ちは・・・と、そんなわけでjava言語のコードを記載します。

import java.util.Arrays;
import java.util.Scanner;
import java.util.function.BiFunction;
import java.util.function.Consumer;
public class Ox {
    public static void main(String[] args) {
        String [][] ox_list = new String[3][3];
        int x_max = 3,y_max = 3;
        BiFunction<Integer,Integer,Boolean> md = (x,y)->{
            Scanner kigo = new Scanner(System.in);
            System.out.printf("縦%d 横%d 番目の記号を入力してください{o,x}\n",y,x);
            ox_list[y][x] = kigo.next();
            return ((ox_list[y][x].equals("x") || ox_list[y][x].equals("o"))?true:false);
        };
        Consumer<String> Oxview = (s)->{
            System.out.println(s);
            String str = "";
            for (int i = 0; i < y_max; i++) {
                for (int ii = 0; ii < x_max; ii++) {
                    str+=  "|" + ox_list[i][ii] ;
                }
                str+= "|\n";
            }
            System.out.println(str);
        };
        for (int i = 0; i < y_max; i++) {
            for (int ii = 0; ii < x_max; ii++) {
                if(!md.apply(ii,i)){
                    System.out.println("入力が不正です");
                    ii = (ii-1)>=0?(ii-1):-1;
                }
                Oxview.accept("入力中");
            }
        }
        Oxview.accept("最終結果");
    }
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

java, php, アプリ, アルゴリズム, クーラー, コード, コマンド, それ, データ, めちゃくちゃ, もの, ライン, , , , 今回, 入力, 再度, 処理, , 初心者, 判定, , 勉強, 単純, 否定, 天気, , , 感じ, 文字, 方法, , 日々, 日中, 本当, 毎日, , 洗濯物, 活躍, 演算子, 環境, 自分, 言語, 部分, 部屋, 順番,

Twitterプロフィールからスパムみたいなアカウントかを機械学習で判定してみた。

2021.06.28

Logging

Twitterプロフィールからスパムみたいなアカウントかを機械学習で判定してみました。

何故、このような事を考えたかはスパムみたいなアカウントってぱっと見で人は区別できるよねって思ったのでLobeというソフトを使って画像解析(機械学習)してモデルをエクスポートし、そのモデルをテンソルフローで使用して動作確認してみました。

結果は、まぁまぁの精度だったのでモデルをお裾分けしますね。因みにTwitterのプロフィール画像のスクリーンショットを行った時のソースコードも提供します。

尚、機械学習に使用したプロフィール画像は400枚ほど(少ない?)です、ok-image(一般人)とng-image(スパムみたいなアカウント)というラベルを付けて学習させてます。

model::https://zip358.com/ai-model/tw-profile/saved_model.pb (?モデルの中身はtensorboardでご確認を!)

zip358com
zip358
# Generated by Selenium IDE
import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import Select

class twss():
	def setup_method(self):
		self.driver = webdriver.Chrome(ChromeDriverManager().install())
		self.vars = {}

	def teardown_method(self):
		self.driver.quit()

	def screenshots(self):
		self.driver.get("https://twitter.com/")
		self.driver.set_window_size(945, 900)
		with open('twname.dat','r',encoding="utf-8") as f:
			for line in f:
				FILENAME = "X:\\var\\www\\html\\labo_ai\\twss\\image\\screen_" + line.replace('\n', '') +".png"
				self.driver.get("https://twitter.com/" + line.replace('\n', ''))
				time.sleep(2)
				self.driver.save_screenshot(FILENAME)
		f.close()
		self.driver.quit()
twss = twss()
twss.setup_method()
twss.screenshots()

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

358, 400, ai-model, com, https, lobe, model, ng-image, ok-image, SA, tw-profile, Twitter, zip, アカウント, エクスポート, お裾分け, コード, ショット, スクリーン, スパム, ソース, ソフト, テンソル, フロー, プロフィール, モデル, ラベル, 一般人, , , 何故, 使用, 判定, 動作, 区別, 学習, 提供, , 機械, 画像, 確認, 精度, 結果, 解析,

Proofreading(校正)というリクルートが開発したAPIを使って。

2021.04.27

Logging

Proofreading(校正)というリクルートが開発したAPIを使って、今まで投稿した記事に誤字がないかを判別してもらった。因みに1000文字を超える文章は対象にならないのでワードプレスで取得した記事を900文字程度で切って判断してもらうことにしています。誤字があった場合、1を最大値として値が渡されるので、その平均値を取ればその文章の誤字率が判定できる。今回は平均値を取らず、最大値を判断材料として文章をスコア化しました。一応、判断した値をCSVで出力するプログラムをちょこちょこと制作したので参考にして頂ければ幸いです。正直なところ、ProofreadingのAPIが制度が良いのか疑わしいものがあるがAPIを取り扱うのが始めてという人は勉強になると思います?。

ソースコードはこちらになります。

<?php
require "../../wp-load.php";
global $wpdb;

$proofreading = function($text=""){
	$url = "https://api.a3rt.recruit-tech.co.jp/proofreading/v2/typo";

	$params = [
		'apikey' => '取得したAPIKEY',
		'sentence'=>"$text",
		'sensitivity'=>"high"
	];
	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_POST, TRUE);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	$response = curl_exec($curl);
	curl_close($curl);
	$obj = (object)json_decode($response);
	$score = 100;
	if($obj->alerts){
		$max = 0;
		foreach($obj->alerts as $key=>$val){
			$max = $max<$val->score?$val->score:$max;
		}
		$score = 100 - ($max * 100);
	}
	return $score;
};

if($argv[0]){
	file_put_contents("blogscore.csv","");
	$query = "SELECT * FROM $wpdb->posts WHERE post_status = 'publish' and post_type = 'post'";
	$results = $wpdb->get_results( $wpdb->prepare($query));
	foreach($results as $row) {
	   $id = $row->ID;
	   $title = $row->post_title;
	   $score = $proofreading(mb_strimwidth(preg_replace("/[\r|\n]/","",strip_tags($row->post_content)),0,900,"…"));
	   $str = "'$id'".",'".$title."',"."'$score'";
	   print $str.PHP_EOL;
	   file_put_contents("blogscore.csv",mb_convert_encoding($str."\n","SJIS","UTF-8"),FILE_APPEND);
	}
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

, 1000, 900, API, CSV, lt, php, Proofreading, quot, require, wp-load, コード, こちら, こと, スコア, ソース, ところ, プレス, プログラム, もの, リクルート, ワード, , 今回, , 出力, 判別, 判定, 判断, 制作, 制度, 勉強, 参考, 取得, 場合, 対象, 平均, 投稿, 文章, 最大, 材料, 校正, 正直, 記事, 誤字, 開発,

素数判定、単純なソース。

2017.06.25

Logging

素数判定、単純なソースを作りましたので
公開します、ちなみに確率的素数判定法ではなく
ほんとに単純明快な方法で作成しましたので自分のパソコンでは
4桁までの処理が限界でした、基本:javascriptで動いています・
ローカルのパソコン性能に左右されます。
ソースを変更して5桁とか試してみるのも良いかもしれません?
サンプルサイト
https://zip358.com/tool/sosu/

function sosu(){
    let sosuno = [2];
    for(let i=3;i<=9999;i++){
        let flg = true;
        if(i%2===0){
            continue;
        }
        for(let ii=2;ii<i;ii++){
            if(ii%2===0){
                continue;
            }
            if(i%ii===0){
                flg = false;
                break;
            }
        }
        if(flg){
            sosuno.push(i);
        }
    }
    document.getElementById("my-textarea").value = sosuno.join(',');
}
document.getElementById("btn").addEventListener("click",sosu);

著者名  @taoka_toshiaki

※この記事は著者が30代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

$flg, 0, 2, , 4, 5, 9999, continue, For, function, if, Ii, javascript, let, lt, sosu, sosuno, true, サイト, サンプル, ソース, パソコン, ほんと, ローカル, 作成, 公開, 処理, 判定, 判定法, 単純, 基本, 変更, 左右, 性能, 方法, 明快, 素数, 自分, 限界,

Photo by Kevin Ku on Pexels.com

クロンを改良しました。前のクロンPHPは恐らくBUGってて。

2015.06.23

Logging


クロンPHPって言っても月や曜日判定はしていません。今回、その判定も行うように変えようと再度、コードを改良しました。前回のコードの約半分ぐらいのコードになってます。土曜日までには、月や曜日の対応を行うようにします。
ちなみにどういう機能をするのかと言いますと、さくらサーバではクロンの制限があります。その制限数以上、使おうとおもって考えたのが、一つのPHPを叩いてクロンがしている事を模倣することでした。
※昨日の話は撤回はしないものの、SEOよりSNSでSEOという考え方に変えました。よくよく考えてみるとアクセス数が多いほど、検索上位表示される確率も増えるのでやはり大事かなとボット。ボットらしくない振る舞いしたボットなら何とか成るかも知れないとも思ってます。

追記2022/09/06:クーロン制限突破方法を記載しています、こちらを参照ください。クーロン制限突破!

command":"cd /home/user/www/user_dir/site/; /usr/local/bin/php cron.php "cron.json"
<?php
//5分刻みに対して有効な無限クローン 処理が負荷の場合どうなるかは知りません。
date_default_timezone_set('Asia/Tokyo');
class cron{

    public function d_m($obj)
    {
            if($obj->m==="*")return true;
            if(preg_match("/,/",$obj->m))return $this->comma($obj->m,date("m"));
            if((int)$obj->m === (int)date("m"))return true;

            return false;
    }

    public function d_d($obj)
    {
            if($obj->d==="*")return true;
            if(preg_match("/,/",$obj->d))return $this->comma($obj->d,date("d"));
            if((int)$obj->d === (int)date("d"))return true;

            return false;
    }

    public function d_H($obj)
    {
            if(preg_match("/\*\/[0-9]{1,2}/",$obj->H)){
                $H = explode("/",$obj->H);
                if((int)$H[1]>0 && ((int)date("H") % (int)$H[1])===0)return true;
            }else{
                if($obj->H==="*")return true;
                if(preg_match("/,/",$obj->H))return $this->comma($obj->H,date("H"));
                if((int)$obj->H === (int)date("H"))return true;

            }
            return false;
    }

    public function d_i($obj)
    {
            if(preg_match("/\*\/[0-9]{1,2}/",$obj->i)){
                $i = explode("/",$obj->i);
                if((int)$i[1]>0 && ((int)date("i") % (int)$i[1])===0)return true;
            }else{
                if($obj->i==="*")return true;
                if(preg_match("/,/",$obj->i))return $this->comma($obj->i,date("i"));
                if((int)$obj->i === (int)date("i"))return true;

            }
            return false;
    }

    //曜日 0=日曜日 6=土曜日
    public function d_w($obj)
    {
            if((int)$obj->w[date("w")]===1)return true;
            return false;
    }

    public  function comma($c="",$t=""){
        if($c==="")return false;
        if($t==="")return false;
        $flg = false;
        foreach(explode(",",$c) as $cc){
            if((int)$cc===(int)$t)$flg = true;
        }
        return $flg;
    }


    public function d_command($obj){
        if($obj->command){
            exec($obj->command . " > /dev/null &");
        }
        return true;
    }

}
if ($argv[1]) {
   $filename = $argv[1];
    if(is_file($filename)){
        $jsn = json_decode(file_get_contents($filename));
        $cron = new cron();
        try {
            foreach($jsn as $obj){
                if($cron->d_m($obj)){
                    if($cron->d_d($obj)){
                        if($cron->d_H($obj)){
                            if($cron->d_i($obj)){
                                if($cron->d_w($obj)){
                                    $cron->d_command($obj);//波動拳{{{{
                                }
                            }
                        }
                    }
                }
            }
        } catch (\Throwable $th) {
            print $th->getMessage();
        }
    }
}
mは月
dは日
Hは時
iは分
wは日曜日から土曜日 0はOFF、1はON
commandは実行コマンド
[
    {
        "m":"*",
        "d":"*",
        "H":"*",
        "i":"*/10",
        "w":[1,1,1,1,1,1,1],
        "command":"cd /home/user/www/user.com/site/; /usr/local/bin/php hoge1.php"
    },
    {
        "m":"*",
        "d":"12,23,28",
        "H":"*",
        "i":"*/15",
        "w":[1,1,1,1,1,1,1],
        "command":"cd /home/user/www/user.com/site/; /usr/local/bin/php hoge2.php"
    }
]

著者名  @taoka_toshiaki

※この記事は著者が30代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

-Command, 06, 09, 2022, BUG, cd, ho, php, quot, SEO, SNS, アクセス, クーロン, クロン, コード, こちら, こと, サーバ, さくら, ボット, 一つ, 上位, , 今回, 再度, 判定, 制限, , 前回, 参照, 土曜日, 大事, 対応, 撤回, 改良, 方法, 昨日, 曜日, , 検索, 模倣, 機能, 確率, 突破, 約半分, 考え方, 表示, 記載, , 追記,