ダミー情報を生成する定番.
2024.03.29
ダミー情報を生成する定番を生成する定番のコードを記載します.
Composerを使用し’faker’をインストールします.
composer require fakerphp/faker
使用方法例のコードとしてcsv出力するコードを記載(下記).
<?php
require 'vendor/autoload.php';
use Faker\Factory;
class CsvGenerate{
/**
* ダミー情報を生成する
* @param int $max
* @return string
*/
public function csvMake(int $max=0):string
{
$faker = Factory::create('ja_JP');
$hasData = [];
for($i=0;$i<$max;$i++){
$datas = [];
$datas[0] = $faker->name();
$datas[1] = $faker->email();
$datas[2] = $faker->phoneNumber();
$datas[3] = $faker->address();
$hasData[$i] = implode(',',$datas);
}
return implode(PHP_EOL,$hasData);
}
}
print((new CsvGenerate)->csvMake(1000));
//file_put_contents('data.csv',(new CsvGenerate)->csvMake(1000));
実際使用する場合は、file_put_contents行のコメントを解除してください.
同階層にdata.csvファイルが作成されます.
尚、コマンドよりファイルを実行することを想定しています.
※参考にしたサイト
https://fakerphp.github.io/
https://qiita.com/kurosuke1117/items/c672405ac24b03af2a90
明日へ続く.
タグ
$datas, $hasData, Address, Composer, create, csvMake, faker’, gt, implode, items, lt, name, phoneNumber, php require, print, qiita.com, string, vendor,
ツイッターのDM内容をOpenAI api(chatGPT)で判別しスパムの場合ブロックする。#ソースコード
2023.04.17
おはようございます、スパムをブロックするソースコードを掲載します。ご自由にご使用いただけばと思っています。これを作ったのは先週の日曜日のことです、TwitterのDMに悩まされていたので何か方法はないかなって思って作ったのがこれです。実際、自分は試しに導入してみたのですが、精度はまずまず良い結果でした。因みに自分は作ったのですが今のところ、使ったのは先週の日曜日だけで未だに手動でブロックしています。使わない理由は大量のスパムが来ているわけではないので、特に問題は無いからです。唯、大量のスパムが来ている人にはそれなりにお役に立てるツールかも知れないです。
ツイッターのDM内容をOpenAI api(chatGPT)で判別しスパムの場合ブロックする。
スパム精度は結構良いです。
使用方法
- コマンドで実行
php BlockMessage.php spamcheck
使用したComposerのライブラリ
- TwitterOAuth
- openai-php/client
phpのバージョン
- php8.1
前提条件
- 掲載していないファイルは推測して作ってください。
<?php
require_once "../vendor/autoload.php";
require_once "../tw-config-v2.php";
require_once "../openAI-config.php";
use Abraham\TwitterOAuth\TwitterOAuth;
class BlockMessage
{
var $connection = null;
public function __construct()
{
$this->twitterConnection();
$result = $this->getTwitterDM();
if(!$this->judgmentSpam($result[0])){
$this->setTwitterBlockedUser($result[1]);
}
}
public function twitterConnection()
{
// TwitterOAuthクラスのインスタンスを作成する
$this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
// APIバージョンを設定する
$this->connection->setApiVersion('2');
}
/**
* DMを取得する
* @return array
*/
public function getTwitterDM()
{
$dm_events = $this->connection->get('dm_events',["expansions"=>"sender_id","user.fields"=>"username,id"]);
return [$dm_events->data[0]->text,$dm_events->data[0]->sender_id,$dm_events->data[0]->id];
}
/**
* OpenAI APIを使用してスパム判定
* @param string $text
* @return false
*/
public function judgmentSpam(string $text="")
{
if (!$text) return false;
$client = OpenAI::client(OPENAIAPIKEY);
$result = $client->chat()->create([
'model' => 'gpt-3.5-turbo',
'messages' => [
["role"=>"system", "content"=>'Your job is to identify spam, please determine if the message is spam or not. If it is spam, please write "This is spam". For non-spam messages, write "OK".'],
["role"=>"system", "content"=>'respond to in English.'],
['role'=> 'user', 'content' => $text],
]
]);
if(preg_match("/(OK)/i",$result->choices[0]->message->content)){
print "non-spam".PHP_EOL;
return true;
}
if(preg_match("/(spam)/i",$result->choices[0]->message->content)){
print "This is spam".PHP_EOL;
return false;
}
return true;
}
/**
* スパムアカウントをブロック
* @param string $blocked_user_id
* @return false
*/
public function setTwitterBlockedUser(string $blocked_user_id = "")
{
if (!$blocked_user_id) return false;
$block_result = $this->connection->post('users/'.MYTWID.'/blocking', ['target_user_id' => $blocked_user_id], true);
if ($block_result->data->blocking) {
print 'Blocked user successfully.'.PHP_EOL;
return true;
} else {
print 'Failed to block user.'.PHP_EOL;
return false;
}
}
}
if($argv[1]==="spamcheck"){
new BlockMessage();
}
https://github.com/taoka-toshiaki/BlockMessage
タグ
argv, chat, ChatGPT, choices, Client, Composer, connection, construct, getTwitterDM, messages, OPENAIAPIKEY, print, quot, spam, spamcheck, string, Twitter, twitterConnection, TwitterOAuth, vendor,
サイト内の文字をハイライトする一万円の案件は。 #案件
2022.12.18
おはようございます、笑う門には福来る😆この記事は月曜日の朝に書いたものです💦。
先日、Chromeの拡張機能でサイト内の文字をハイライトする一万円の案件を募集しておりました。この一万円の案件は妥当な金額なのかが“????”。例えば人工知能をゴリゴリと使えるスーパーエンジニアにとっては朝飯前の案件だと思いますが、見習いエンジニアにとっては難しい案件なのかもしれない。
この一万円という金額は人によって高くもなるし安くもなるかもしれないです。要するに見習いエンジニアが3日間かけて納品した場合とスーパーエンジニアがものの数秒で納品した場合を日本の平均時給で考えると一方は黒字でもう一方は赤字になる。
そう考えると今回の文字をハイライトするという案件は適正価格なのかもしれない。
因みにこの文字をハイライトするChromeの拡張機能はもう存在しており無料で公開されている。そう考えると一万円も貰えるというのはラッキーなのかも知れない。
尚、文字をハイライトするコードは下記により参照ください(デモページはこちら)。
let funs = {
init: { htmlcode: document.getElementById("vals").innerHTML },
highlight: function (e) {
document.getElementById("vals").innerHTML = funs.init.htmlcode;
if (!String(this.value).match(/[a-zA-Z]/) && this.value) {
document.getElementById("vals").innerHTML = String(funs.init.htmlcode).replace(new RegExp(this.value, 'g'), '<span style="color:red">' + this.value + '</span>');
}
},
inputevent:function(){
document.getElementById("txt").addEventListener("input", this.highlight);
}
};
funs.inputevent();
タグ
a-zA-Z, addEventListener, document.getElementById, function, funs.init.htmlcode, getElementById, gt, highlight, htmlcode, init, innerHTML, inputevent, lt, match, quot, replace, string, this.highlight, this.value, 朝飯前,
Qiitaのfeedを取得して表示するだけのコード。 #php
2022.11.05
おはようございます、土曜日の朝ですね😗。
今日は文化の日にQiitaにUPしたfeedを取得して表示するだけのコードを書きました。見た目はこんな感じでQiitaの雰囲気を取り入れたデザインにしています。デモ版として実際にサーバーで起動しているモノです、feedを取得しているユーザーは自分を入れて3人です。
表示する人数が多くなるとページを描画する時間が遅くなるので実質、10人が限度かも知れないです。もし何人ものユーザーを取得したいと考えている方は表示部分と処理部分を別けて、尚且つ処理部分は非同期処理で変更することを推奨します。
尚、明日には2つに別けたプログラムコードを別記事として記載しますので、しばしお待ち下さいませ🙇。
今回のソースコードはこんな感じになってます。
<?php
function get_Qiitafeed(string $feedUrl){
$xml = @simplexml_load_file($feedUrl);
if(isset($xml->entry)){
print("<ul class='qiita_feed-list'>");
foreach($xml->entry as $key=>$val){
print("<li><a href='{$val->url}'>".$val->title."</a></li>");
}
print("</ul>");
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="Description" content="Enter your description here"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<style>
.qiita_feed-list > li{
/* font-weight: bold; */
color:aliceblue;
}
.qiita_feed-list > li > a{
color:aliceblue;
}
body{
background-color:#60b111;
}
.shadow-lg {
box-shadow: 0 1rem 3rem rgba(255,255,255,.195)!important;
}
</style>
<title>Qiita-feed</title>
<?php
require $_SERVER['DOCUMENT_ROOT'] ."/header_script.php";
?>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-12">
<h1 class="text-light">Qiita-feed</h1>
</div>
</div>
</div>
<div class="container mt-2">
<?php
$Id_List = ["taoka-toshiaki","mpyw","suin"];
foreach ($Id_List as $key => $id) {
?>
<div class="row shadow-lg p-3 mb-5 bg-body rounded">
<div class="col-12">
🌿<span class="text-light">://qiita.com/<?=$id?>/feed :[引用]</span>
<?=get_Qiitafeed("https://qiita.com/".$id."/feed")?>
</div>
</div>
<?php
}
?>
Copyright <?=date("Y")?> <a href="https://358tool.com">358tool.com</a>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
</body>
</html>
タグ
10, 2, 3, feed, feedUrl, function, GET, lt, php, qiita, Qiitafeed, string, UP, お待ち, コード, こと, サーバー, ソース, デザイン, デモ版, プログラム, ページ, もの, ユーザー, 人数, 今回, 今日, 何人, 処理, 別記事, 取得, 同期, 土曜日, 変更, 実質, 実際, 感じ, 推奨, 描画, 文化の日, 方, 明日, 時間, 朝, 自分, 表示, 見た目, 記載, 起動, 部分, 限度, 雰囲気,
タイトルの下に背景色を変える■を追加しました。
2022.07.22
おはようございます、背景色を変える■を追加しました。四角をクリックすると背景色が変わります、ソースコードは下記になります。取り分けて難しくないソースコードになると思いますが、少しだけ解説をします。このソースコードはスタイルシートの記述(ファイルなど)を読み込んでバックグラウンドカラーの一部のカラーだけを任意のカラーに置き換えています。
let htmlcode = `
<span class='color_code' style='color:#262a2e' data-color-code='#262a2e'>■</span>
<span class='color_code' style='color:#192734' data-color-code='#192734'>■</span>
<span class='color_code' style='color:#1c483b' data-color-code='#1c483b'>■</span>
<span class='color_code' style='color:#bf7800' data-color-code='#bf7800'>■</span>
<span class='color_code' style='color:#83094f' data-color-code='#83094f'>■</span>
`;
let old_color = "#262a2e";
document.getElementById("site_description").insertAdjacentHTML("afterend", htmlcode);
let ColorCodeObject = document.querySelectorAll(".color_code");
for (const key in ColorCodeObject) {
if (Object.hasOwnProperty.call(ColorCodeObject, key)) {
const element = ColorCodeObject[key];
element.addEventListener("click", function (element) {
for (let ii = 0; ii < document.styleSheets.length; ii++) {
if (String(document.styleSheets[ii].href).match(/mag_tcd036-child\/style\.css\?ver=/)) {
for (let i = 0; i < document.styleSheets[ii].cssRules.length; i++) {
let element_css_code = document.styleSheets[ii].cssRules[i];
let rgbfn = function(hex){
let red = parseInt(hex[1]+hex[2],16);
let green = parseInt(hex[3]+hex[4],16);
let blue = parseInt(hex[5]+hex[6],16);
return `rgb(${red}, ${green}, ${blue})`;
};
try {
if (element_css_code.style.backgroundColor === rgbfn(old_color)) {
//console.log(rgbfn(old_color));
element_css_code.style.backgroundColor = rgbfn(ColorCodeObject[key].getAttribute("data-color-code"));
}
} catch (error) {
//console.log("not backgroundColor");
}
}
old_color = ColorCodeObject[key].getAttribute("data-color-code");
}
}
});
}
}
ソースコードも上から下へ進む感じで読んでいただけたら、読めるはずです。尚、躓く箇所といえば16進数でスタイルシートに記述しているものもRGBで格納されている所ですね。ここの比較が「えっ」って感じになるぐらいでしょうか。あとはそれ程、難しくないソースコードだと自負しております😌。
この頃、jqueryを触らなくなって悲しいかな仕様を半分ぐらい忘れております。やはりコードは毎日書くべきかなって思います。
タグ
backgroundColor, catch, ColorCodeObject, cssRules, document.getElementById, element, getAttribute, hex, htmlcode, Ii, insertAdjacentHTML, jquery, match, parseInt, querySelectorAll, quot, RGB, rgbfn, string, styleSheets,
画像ファイル系一覧のパスを列挙するバッチ
2019.08.17
setlocal enabledelayedexpansion
type nul >imglist.txt
set BEFORE_STRING=
set AFTER_STRING=/
set BEFORE_STRING2=F:/
set OUTPUT_FILE=imglist.txt
for /f %%a in ('dir /a-d /s /b *.jpg *.gif') do (
set line=%%a
set RES=!line:%BEFORE_STRING%=%AFTER_STRING%!
echo !RES:%BEFORE_STRING2%=!>>%OUTPUT_FILE%!
)
endlocal
画像ファイル系一覧のパスを列挙するバッチです。
ググりながら作ってみました。
ちなみに勘所はsetlocal enabledelayedexpansion(endlocal
)と!です。
どうもforの中の変数をセットするタイミングが関係しているので
上記の文言を使用しないとうまく取り出す事が
できないようです。
遅延環境変数とかいうそうですね。。。
あまり理解していないけれどもorz
タグ
2, a-d, AFTER, BEFORE, DIR, do, echo, enabledelayedexpansion, endlocal, file, For, gif', gt, imglist, in, jpg, line, nul, OUTPUT, res, set, setlocal, string, txt, type, パス, バッチ, ファイル, 一覧, 列挙, 勘所, 画像,
phpでイマドキDB接続の仕方なの?
2019.07.20
実行していないので上手く動いているかは
未知数ですが、コードの書き方はイマドキの書き方に
しています。PHP公式ではこう書かれています。
プリペアドステートメントのパラメータに変数をバインドすると・・・。
i 対応する変数の型は integer です。
d 対応する変数の型は double です。
s 対応する変数の型は string です。
b 対応する変数の型は blob で、複数のパケットに分割して送信されます。
<?php
$servername = "hostname";
$dbname ="dbname";
$dbusername = "root";
$dbpassword = "pass";
if($conn = mysqli_connect($servername,$dbusername,$dbpassword,$dbname)){
$sql = "select username from mastertbl where uid =? and password = ?";
$stmt = mysqli_stmt_init($conn);
if(mysqli_stmt_prepare($stmt,$sql)){
mysqli_stmt_bind_param($stmt,"ss",$uid,password_hash($password,PASSWORD_DEFAULT));
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
if($cnt=mysqli_stmt_num_rows($stmt)){
$result = mysqli_stmt_get_result($stmt);
for($i=0;$i<$cnt;$i++){
$row = mysqli_fetch_assoc($result);
}
}
}
mysqli_stmt_close($stmt);
mysqli_close($conn);
}
タグ
blob, conn, connect, db, dbname, dbpassword, dbusername, double, hostname, if, Integer, lt, mysqli, pass, php, root, select, servername, SQL, string, user, イマドキ, コード, バインド, パケット, パラメータ, プリペアドステートメント, 仕方, 公式, 分割, 型, 変数, 実行, 対応, 接続, 書き方, 未知数, 複数, 送信,
ネームスペースの利点はこれだと思っている。
2019.03.02
ネームスペースの利点はこれだと思っている。
複数人で開発とかしているときに関数名やクラスなどが
かぶってしまう可能性ある、そういうのを
解決してくれるのがネームスペースということです。
<?php
namespace testdemo;
class test{
function demo():string
{
return "demo1n";
}
}
namespace testdemo2;
class test{
function demo():string
{
return "demo2n";
}
}
<?php
include_once "./index-6.php";
$demo = new testdemotest();
print $demo->demo();
$demo = new testdemo2test();
print $demo->demo();
タグ
'dem, 1, 2, 6, class, demo, function, include, index, lt, namespace, nbsp, new, once, php, print, return, string, test, クラス, こと, これ, スペース, とき, ネーム, 利点, 可能性, 複数人, 解決, 開発, 関数,
PHP忘れてしまいそう。
2019.02.23
こういう書き方とか書かなかったら忘れてしまいそうですね。
クラスの多重継承とか職場ではそもそもしない。Functionで十分な感じで
この頃、ろくなコードを書いていません。FunctionからFunctionへなんて
コードを書いてたりしています。
<?php
function demo1(int $val=0):int
{
return 3 * 3 * $val;
}
print demo1(3);
class demo2
{
public static function test1():string
{
return "ABC";
}
}
$demo2 = "demo2";
print $demo2::test1();
trait demo3
{
public static function test2($val=""){
return $val;
}
}
class demo4
{
public static function test3($val = "")
{
return $val;
}
}
class demo5 extends demo4
{
use demo3;
public static function test4($val = "")
{
return $val;
}
}
$demo5 = 'demo5';
print $demo5::test2(1);
print $demo5::test3(2);
print $demo5::test4(3);
タグ
0, 1, 2, 3, ABC, class, demo, function, int, lt, nbsp, php, print, public, return, static, string, test, trait, val, クラス, コード, そもそも, 多重, 感じ, 書き方, 継承, 職場, 頃,
PHPのインターフェイスとやら簡単に言えば。
2019.02.16
インターフェイスとはなんぞや?
簡単に言えばこのメソッド名は必ず使えです。
無ければエラーになります。
大規模な開発から中規模な開発時には一応必要かな?
<?php
interface test1{
public function test_11(int $val=1);
public function test_12(string $val="000");
}
class demo implements test1{
public function demo1(int $val=0){
return $this->test_11($val);
}
public function test_11(int $val=1){
return $val;
}
public function test_12(string $val=""){
return $val;
}
}
$demo = new demo();
print $demo->demo1(111);
タグ
0, 000, 1, 11, class, demo, function, gt, implements, int, interface, lt, nbsp, php, public, return, string, test, this, val, インターフェイス, エラー, メソッド, 大規模, 必要, 簡単, 規模, 開発,
「jetpack」と「Japanese AutoTag」の相性が悪くて公開及び更新出来なくなる不具合について
2017.12.21
「jetpack」と「Japanese AutoTag」の相性が悪くて公開及び更新出来なくなる
不具合について対応を行ったので対応を記載します。
このファイルの52行目、53行目あたりでエラー表示される、
wp-content\plugins\jetpack\sync\class.jetpack-sync-queue.php
エラー内容は下記の通りです。
Uncaught exception ‘Exception’ with message ‘Serialization of ‘SimpleXMLElement’ is not allowed’
このエラーが表示されて困ったので対応してみた。
対応したソースはこちら::エラーが出現している部分に型のキャストしてあげると
エラーが出なくなります、これが正しい対応かどうかは分かりませんが
エラーが出なくなったのでひとまずこれで自分は運用していきます。
function add( $item ) { global $wpdb; $added = false; // this basically tries to add the option until enough time has elapsed that // it has a unique (microtime-based) option key while ( ! $added ) { $rows_added = $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES (%s, %s,%s)", (string)$this->get_next_data_row_option_name(), serialize((string)$item), 'no' ) ); $added = ( 0 !== $rows_added ); } }
タグ
'Serialization, 'SimpleXMLElement', $rows_added, $wpdb, autoload, exception, function add, INSERT INTO, is not allowed', it has a unique, Japanese AutoTag, microtime-based, option key, serialize, string, this basically tries to add the option, Uncaught exception, with message, wp-contentpluginsjetpacksync, エラー,
無名関数、技術初歩垂れ流し。
2017.08.19
無名関数、技術初歩垂れ流しときます。
わからない人はわからないかもしれませんが、
分かる人にはわかるという・・・何ともそのまま何ですけどね。
無名関数を使うにあたってキーになるのは USEとcall_user_funcかな。
これさえ覚えとくと便利かもしれないなと思います。
習うより慣れよということでソースコード貼っときます。
じぶんの脳内は文字を読んで理解しているタイプではないので
図や絵柄など空間的な感覚でアルゴリズムを覚えています、なので
仕様書とか読んでもあまり頭に入ってくることがないのですね。
それよりかは、トライアンドエラーを繰り返して覚えるか、口頭などで
事細かに説明してもらったほうが、頭に入ってくることが多いです。
<?php //無名関数1 $q = function($s){ $ss = $s."FF15!!]]"; return $ss; }; define("ff",$q("[[ now on sale ")); //var_dump(ff); //無名関数2 $hoge = ff; $f = function() use ($hoge){ return explode(" ",$hoge); }; //var_dump($f()); //無名関数3 function mumei(){ $m = 2222; $d = 22; return function() use ($m,$d){ $a = $m * $d; return $a; }; } $a = mumei(); //var_dump($a()); //無名関数4 if(is_array($s = call_user_func(function(){ $r = []; for($i=0;$i<10;$i++){ $r[$i] = $i; } return $r; }) )){ //var_dump($s); } print(implode("<br>",explode("\n",' string(23) "[[ now on sale FF15!!]]" array(5) { [0]=> string(2) "[[" [1]=> string(3) "now" [2]=> string(2) "on" [3]=> string(4) "sale" [4]=> string(8) "FF15!!]]" } int(48884) array(10) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> int(4) [5]=> int(5) [6]=> int(6) [7]=> int(7) [8]=> int(8) [9]=> int(9) } ')));
タグ
$i<, AM, array, br>, call_user_func, function mumei, hoge, implode, int, now on sale FF15, return explode, return function, string, var_dump, アルゴリズム, トライアンドエラー, 仕様書, 技術初歩垂れ流し, 無名関数,
PHP 型の変換 – javaぽっい書き方で型キャストが出来ちゃう(`・ω・´)
2016.02.21
PHP 型の変換 – javaぽっい書き方で型キャストが出来ちゃう(`・ω・´)
こういう書き方なんか、カッコイイななんて的な書き方で
尚且つ、覚えやすい。int型やstring型などに変換する
関数もあるのですが、こちらの書き方を覚えておいたほうが
楽かなと自分は思っています。
PHPで開発する人達は
こちらを使っている人のほうが多そうな
気がします。多言語にまたがって開発する場合は
こちらの方がわかりやすいのかなとも
感じます。いろいろと言語をまたがると
書き方や構文に悩まされたりします。
完璧に覚えている方なら
全然だと思いますが、自分みたいな
軽く覚えているタイプは多言語にまたがると
構文ミスなどで時間をロスしてしまいます。
型キャスト例
<?php //bool,unset,array,object等など 型キャスト可能。 $re = (int)$hoge; $re2 = (string)$hoge; ?>
タグ
$re2, 1, AM, bool, hoge, int, javaぽっい書き方, object, PHPプログラミング教室, string, unset, キャスト, キャスト例, 変換, 多言語, 楽かなと自分, 構文, 構文ミス, 短期集中講座, 関数,