全国各地の漁港データをJSONデータ化したお話🦾。#php #map
2022.12.07
おはようございます、昨日は晴れていましたね☼。
そんなお天気な日に漁港座標データXMLをJSONデータ化しておりました。国土交通省のデータを加工しJSONデータに加工するのはそんな難しい問題じゃないかなって思っていたのですが、データが重たい、中身のXMLデータは名前空間使っているなどという面倒くさい仕様になっておりました。名前空間の対応は、こちらのQiitaの記事を参照してほぼコピペで自分のコードに追加しました。
だた追加しただけでは、あんなツイートしたJSON構造にならないので細工しています。自分が必要なのは漁港名と座標軸だけなので、これだけで良い感じです。
preg_grep("/".$val->{"@attributes"}->id."/",$name);
因みにXMLファイルが重いので自分はデータを分割しました(エラーが出力されるので)。php.iniの設定は変えたくなかったので分割と加工をしたわけです。座標データと漁港名に分割して上記のコード等を使用しJSONファイルを出力。このJSONコードを元にオープンストリートマップ(OpenStreetMap)とかでサービスを作ることが出来ますが、このデータは非商用なので使い物にならないかな…🤔。データの販売等や二次配布は禁止だけど、データ活用は禁止していないように取れるので詳しく調べてみます🙄。
追記:都道府県を追加してみました。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
attributes, grep, gt, ID, json, map, name, php, preg, qiita, quot, val, xml, お話, コード, こちら, コピペ, これだけ, ツイート, データ, ファイル, 中身, 仕様, 全国, 分割, 加工, 参照, 各地, 名前, 問題, 国土交通省, 天気, 対応, 座標, 座標軸, 必要, 感じ, 日, 昨日, 構造, 漁港, 空間, 細工, 自分, 記事, 追加,
Qiitaのfeedを取得して表示するだけのコード非同期編? #phpcode
2022.11.06
おはようございます。昨日の続きのお話ですコードは金曜日に書きました😗。
動画を見ていただければわかるかと思いますが即興で書いたコードです、最後の最後でエラーってる!?ところなんかも編集していない所が伝わってくるかと思います。ちなみに画質HDのフル画面で見ないとコードは見えないかなって思います。
音声も今後入れていくかもしれません。
任意のユーザーを増やしたい場合はmain.jsの先頭行(2行目?)のqiitaIDに任意のIDを追加するだけで取得可能です。解説はなしですけど一応、何をやっているのかそれなりに、わかるように心がけたつもりです。あとは盗んで覚えてください😂。
ソースコードはこちらになります。
<?php
session_start();
$toke_byte = openssl_random_pseudo_bytes(16);
$csrf_token = bin2hex($toke_byte);
$_SESSION['csrf_token'] = $csrf_token;
?>
<!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">
<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>
<input type="hidden" id="csrf_token" value="<?= $csrf_token ?>">
<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">
<span id="view"></span>
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>
<script src="./js/main.js?<?= time() ?>"></script>
</body>
</html>
//qiita feed
["taoka-toshiaki","mpyw","suin"].forEach(id=>{
let data = {
csrf_token:document.getElementById("csrf_token").value,
feedid:[id]
};
let url = "./qiita-feed.php";
qiita_feed(url,data);
});
async function qiita_feed(url, data) {
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify(data)
}
await fetch(url, options).then(response =>
response.json()
).then(resultdata => {
document.getElementById("view").insertAdjacentHTML("beforeend",resultdata.reshtmlcode)
}
).catch(error => {
console.log(error);
}
);
}
<?php
session_start();
$obj = json_decode(strip_tags(@file_get_contents("php://input")));
if (isset($obj)) {
if (isset($obj->csrf_token) && $_SESSION["csrf_token"] === $obj->csrf_token) {
$str ="";
foreach ($obj->feedid as $key => $id) {
$str.= '
<div class="row shadow-lg p-3 mb-5 bg-body rounded">
<div class="col-12">
🌿<span class="text-light">://qiita.com/' . xss_d($id) . '/feed :[引用]</span>';
$str .= get_Qiitafeed("https://qiita.com/" . xss_d($id) . "/feed");
$str .= '
</div>
</div> ';
}
$res["reshtmlcode"] = $str;
print json_encode($res);
}
}
function xss_d(mixed $val): mixed
{
if (is_array($val)) {
foreach ($val as $key => $value) {
$val[$key] = htmlentities($value, ENT_QUOTES);
}
} else {
$val = htmlentities($val, ENT_QUOTES);
}
return $val;
}
function get_Qiitafeed(string $feedUrl): string
{
$xml = @simplexml_load_file($feedUrl);
if (isset($xml->entry)) {
$str = "<ul class='qiita_feed-list'>";
foreach ($xml->entry as $key => $val) {
$str .= "<li><a href='{$val->url}'>" . $val->title . "</a></li>";
}
$str .= "</ul>";
}
return $str;
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, feed, HD, ID, JS, main, PHPCODE, qiita, qiitaID, あと, エラー, お話, コード, こちら, ソース, つもり, ところ, プル, ユーザー, 今後, 任意, 何, 先頭, 動画, 即興, 取得, 可能, 同期, 場合, 所, 昨日, 最後, 画質, 画面, 編集, 表示, 解説, 追加, 金曜日, 音声,
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>
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
10, 2, 3, feed, feedUrl, function, GET, lt, php, qiita, Qiitafeed, string, UP, お待ち, コード, こと, サーバー, ソース, デザイン, デモ版, プログラム, ページ, もの, ユーザー, 人数, 今回, 今日, 何人, 処理, 別記事, 取得, 同期, 土曜日, 変更, 実質, 実際, 感じ, 推奨, 描画, 文化の日, 方, 明日, 時間, 朝, 自分, 表示, 見た目, 記載, 起動, 部分, 限度, 雰囲気,
常時ディレクトリ監視を行う方法。 #CPU使用率 #炎上
2022.11.03
おはようございます。何だかアカウントを作ってまでコメントする人の考えがわからない🤔。
Qiitaに、このコードのsleep関数がないバージョンをアップしたら、何やらアカウントを作ってまでコメントする人が現れる、理由はCPU使用率がMax近くになるのが駄目だからです、そんな事は分かっているのが普通だと思っていたのだけども…例文として掲載するのも駄目だそうです、コピペで運用する人が結構いるのかもしれない。
正直なところ、そこまで叩かれるとは思っていなかったので、正直なところ驚きを隠せない。段々と世間の常識とズレていっている気がします😗。
昔はそういうコードは巷に溢れていたのにな・・・そんな事も出来なくなってきたのか・・・。
トイウコトデ、常時ディレクトリ監視を行い任意の画像ファイルだけ別のディレクトリへ移動するコードです。
nohup php File_Check.php &
├── File_Check.php
├── upload
└── data
<?php
while(true){
if($result = is_scandir("./upload")){
foreach($result as $key=>$value){
rename("./upload/$value","./data/$value");
}
}
sleep(3);
}
function is_scandir(string $dirname="",array $ext_list = ["png","jpg"]){
$is_filelest = [];
$result = scandir($dirname);
foreach($result as $key=>$value){
$ext = substr($value, strrpos($value, '.') + 1);
if(in_array($ext,$ext_list,false)!== false){
$is_filelest[] = $value;
}
}
return count($is_filelest)>0 ? $is_filelest : false;
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
check, CPU, file, max, nohup, php, qiita, sleep, アカウント, アップ, コード, コピペ, コメント, そこ, ディレクトリ, トイウコトデ, ところ, バージョン, ファイル, 世間, 事, 人, 任意, 使用, 例文, 別, 巷, 常時, 常識, 掲載, 方法, 昔, 普通, 正直, 段々, 気, 炎上, 理由, 画像, 監視, 移動, 近く, 運用, 関数, 駄目,
制限付きのクロンを無限寿限無にする方法。 #php #無限 #cron
2022.10.12
おはようございます🦏。昔の文章を読んでくれて今の記事を読まないユーザーさんがいます、凹む😖。
さて、今日はさくらレンタルサーバーでcronを制限以上に使う方法を数年前に書いた記事が未だに読まれたりするのでプログラムコードを直してタイトルも直してQiitaとGithubにUPしました。
そのUPした記事があまりアクセスが跳ねなくて少しがっくりしたのがスポーツの日の朝の事です。Qiitaは何だか触りの記事かとても専門性の高い記事が人気を集めるだなって事を、この頃理解したのですが、自分は何方にも寄っていない記事なので跳ねないのかも知れません。
ソースコード貼り付けて置きます。尚、使い方などはQiitaやGithubを参照してください。
<?php
date_default_timezone_set('Asia/Tokyo');
class cron
{
public function __construct(mixed $filepath = "")
{
$val = @file_get_contents($this->pval($filepath));
$obj_ = @json_decode($this->pval($val));
$obj = (object)[];
foreach ($obj_ as $key => $value) {
$obj->name = "month";
$obj->val = $value->m;
if ($flg = $this->trigger_check($obj,"m",1,12)) {
$obj->name = "day";
$obj->val = $value->d;
if ($flg = $this->trigger_check($obj,"d",1,31)) {
$obj->name = "hour";
$obj->val = $value->H;
if ($flg = $this->trigger_check($obj,"H",0,23)) {
$obj->name = "minutes";
$obj->val = $value->i;
if ($flg = $this->trigger_check($obj,"i",0,59)) {
$obj->name = "week";
$obj->val = implode(",", $value->w);
if ($flg = $this->trigger_check($obj,"w",0,0)) {
$this->command($value->command);
}
}
}
}
}
}
}
public function command(mixed $command_val = "")
{
$command_val = $this->pval($command_val);
exec($command_val . " > /dev/null &");
// print "よろしくお願いします~~~!!".PHP_EOL;
return true;
}
public function pval(mixed $val = "")
{
if (is_array($val)) {
foreach ($val as $key => $value) {
$val[$key] = strip_tags($value);
}
} else {
$val = strip_tags($val);
}
return $val;
}
public function trigger_check(mixed $variable = "",mixed $d="",int $min=0 ,int $max=0)
{
if (!$variable) return false;
if ($variable->val === "*") return true;
switch ($variable->name) {
case 'week':
$value = @explode(",", $variable->val);
return (int)$value[(int)date($d)] === 1 ? true : false;
break;
default:
if (preg_match("/^(\*\/[0-9]{1,})$/", $variable->val)) {
$value = @explode("*/", $variable->val)[1];
if (is_numeric($value) && $value >= $min && $value <= $max) {
return (int)date($d) % $value === 0 ? true : false;
}
}
if (preg_match("/^([0-9]{1,}\,{1,})/", $variable->val)) {
$value = @explode(",", $variable->val);
$value = array_map('intval', $value);
return in_array((int)date($d), $value, true) === true ? true : false;
}
$value = (int)$variable->val;
if (is_numeric($value) && $value >= $min && $value <= $max) {
return $value === (int)date($d) ? true : false;
}
return false;
break;
}
return false;
}
}
if($argv[1]){
//argv
new cron($argv[1]);
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
39, Asia, class, cron, date, default, github, lt, php, public, qiita, set, timezone, Tokyo, UP, アクセス, クロン, コード, サーバー, さくら, スポーツ, ソース, タイトル, プログラム, ユーザー, レンタル, 事, 人気, 今, 今日, 何方, 使い方, 制限, 参照, 寿限無, 専門性, 少し, 数, 文章, 方法, 日, 昔, 朝, 未だ, 無限, 理解, 自分, 記事, 頃,
数珠繋ぎのツイートシステムに予約機能を付けました😂 #php #code
2022.10.07
おはようございます、偏頭痛持ちは雨が降るが一番大変です☔。
先日、数珠繋ぎのツイートシステムを作ったのですが、そのシステムに予約機能を付けました。尚、TwitterAPIのバージョン2でスケジュールのパラメーターが今のところ無いですね。これから先、機能が付くかも知れないですが今のところ無いようです。因みにソースコードは近日中にQiitaとGithubにUPします。此処ではソースコードの一部を掲載します(※記事を更新しました下へスクロール🫠)。
尚、crontabでPHPファイルを叩くようにしています、あと注意事項ですが予約を一度した投稿については変更等は出来ません、編集機能等の機能追加の予定はないです。また、予約管理はsqlite3を使用して管理しています。
<?php
date_default_timezone_set('Asia/Tokyo');
ini_set("display_errors",0);
require_once "./data/tw-config-v2.php";
require_once "../vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
class tw
{
var $connection = null;
var $pdo = null;
function __construct()
{
$this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
$this->connection->setApiVersion("2");
}
function db_connection()
{
try {
//code...
$res = $this->pdo = new PDO("sqlite:./data/tw-tweets-db.sqlite3");
} catch (\Throwable $th) {
//throw $th;
//print $th->getMessage();
$res = false;
}
return $res;
}
function timecheck($timeonoff, $times)
{
if (!$timeonoff) return true;
$n = new DateTime();
$t = new DateTime($times);
return $t <= $n ? true : false;
}
function pickup_tweets(mixed $tw_text = null, int $timeonoff = 0, mixed $times = null, string $id = "")
{
if (!$times) return false;
$obj = (object)[];
$times = preg_replace("/\-/", "/", $times);
$times = preg_replace("/T/", " ", $times);
if ($this->timecheck($timeonoff, $times)) {
if (isset($tw_text) && is_array($tw_text)) {
foreach ($tw_text as $key => $value) {
if (preg_replace("/[ | ]/", "", $value)) {
$obj = !$key ? ($this->connection->post("tweets", ["text" => $value], true)
) : ($this->connection->post("tweets", ["reply" => ["in_reply_to_tweet_id" => $obj->data->id], "text" => $value], true)
);
}
}
return true;
}
} else {
return $timeonoff ? $this->save_sqlite($tw_text, $timeonoff, $times, $id): true;
}
}
function save_sqlite($tw_text = null, int $timeonoff = 0, mixed $times = null, string $id = "")
{
if ($this->db_connection()) {
try {
//code...
if (isset($tw_text) && is_array($tw_text)) {
foreach ($tw_text as $key => &$value) {
if (preg_replace("/[ | ]/", "", $value)) {
$stmt = $this->pdo->prepare("insert into tweets (tw_id,user,times,tw_text)values(:tw_id,:user,:times,:tw_text)");
$stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
$stmt->bindValue(":user", $id, PDO::PARAM_STR);
$stmt->bindValue(":times", $times, PDO::PARAM_STR);
$stmt->bindValue(":tw_text", $value, PDO::PARAM_STR);
$stmt->execute();
}
}
}
$this->pdo = null;
return true;
} catch (\Throwable $th) {
//throw $th;
return false;
}
}
}
function tweets_load(string $id = "")
{
if (!$id) return false;
try {
//code...
$value = null;
if ($this->db_connection()) {
$stmt = $this->pdo->prepare("select * from tweets where user = :user order by times,tw_id asc;");
$stmt->bindValue(":user", $id, PDO::PARAM_STR);
$res = $stmt->execute();
$value = $res ? $stmt->fetchAll() : false;
$this->pdo = null;
}
return $value;
} catch (\Throwable $th) {
//throw $th;
return false;
}
}
function tweets_update(int $key = 0, int $timeonoff = 0, mixed $times = null, string $id = "",mixed $tw_text="")
{
try {
//code...
if(!preg_replace("/[ | ]{0,}/","",$tw_text))return false;
if ($this->db_connection()) {
$stmt = $this->pdo->prepare("update tweets set tw_text = :tw_text where tw_id = :tw_id and user = :user and times = :times");
$stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
$stmt->bindValue(":user", $id, PDO::PARAM_STR);
$stmt->bindValue(":times", $times, PDO::PARAM_STR);
$stmt->bindValue(":tw_text", $tw_text, PDO::PARAM_STR);
$stmt->execute();
$this->pdo = null;
}
} catch (\Throwable $th) {
//throw $th;
return false;
}
return true;
}
function tweets_delete(int $key = 0, int $timeonoff = 0, mixed $times = null, string $id = "")
{
try {
//code...
if ($this->db_connection()) {
$stmt = $this->pdo->prepare("delete from tweets where tw_id = :tw_id and user = :user and times = :times");
$stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
$stmt->bindValue(":user", $id, PDO::PARAM_STR);
$stmt->bindValue(":times", $times, PDO::PARAM_STR);
$stmt->execute();
$this->pdo = null;
}
} catch (\Throwable $th) {
//throw $th;
return false;
}
return true;
}
function bat_tweets(mixed $value = null)
{
if (!$value) return false;
$obj = (object)[];
$t = "";
foreach ($value as $key => $val) {
if ($this->timecheck(1, $val["times"])) {
$obj = ($val["times"]<>$t)? ($this->connection->post("tweets", ["text" => $val["tw_text"]], true)
) : ($this->connection->post("tweets", ["reply" => ["in_reply_to_tweet_id" => $obj->data->id], "text" => $val["tw_text"]], true)
);
$this->tweets_delete($val["tw_id"], 1, $val["times"], $val["user"]);
$t = $val["times"];
} else {
// var_dump($val);
// break;
}
}
}
}
if ($argv[0]) {
$tw = new tw();
$value = $tw->tweets_load(xss_d($argv[1]));
$tw->bat_tweets($value);
}
function xss_d($val = false)
{
if (is_array($val)) {
foreach ($val as $key => $value) {
$val[$key] = strip_tags($value);
$val[$key] = htmlspecialchars($val[$key]);
}
} else {
$val = strip_tags($val);
$val = htmlspecialchars($val);
}
return $val;
}
追記:予約編集機能なども付けました🙄。
GithubとQiitaのリンクはこちらです。
Github:https://github.com/taoka-toshiaki/tweets-system-box1
Qiita:https://qiita.com/taoka-toshiaki/items/5ef12b60b267742bf584
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, 3, 39, Asia, Code, crontab, date, default, github, ini, lt, php, qiita, Se, set, Sqlite, timezone, Tokyo, TwitterAPI, UP, コード, これ, システム, スクロール, スケジュール, ソース, ツイート, ところ, バージョン, パラメーター, ファイル, 一部, 下, 予定, 予約, 事項, 今, 使用, 偏頭痛, 先, 先日, 変更等, 大変, 投稿, 掲載, 数珠繋ぎ, 更新, 機能, 機能等, 此処, 注意, 管理, 編集, 記事, 近日, 追加, 雨,
一週間の予約が出来るデモコードです。良かったらどうぞ😌。 #php #code
2022.09.17
おはようございます、今日から台風接近らしいですね。この投稿は昨日書きました。
さて、一週間の予約(時刻表から)が出来るデモコードを書きました。これを書いたキッカケは昔の職場の方がこんな感じのUIを作られていたのを見て、自分も書いてみようと思いDEMOコードを朝起きて調べながら書きました。調べたことは選択を解除する方法だけで、後はオリジナルコードです、設計書も何もなく組み立ていきましたので、欠陥があるかもです。また、Qiitaにも記載しましたが、コメントをほぼ書いていません。書かずともプログラマーなら分かるだろうという感覚です。
肝心の確認部分は記載していないのにも訳があります。営業妨害になっては駄目だからです。そういう理由で確認部分以降は書いていません。
こちらにもソースコードを掲載しときますね。
<?php
ini_set("display_errors",0);
/**
* @param array $holiday
* @return string $str
*/
function fn_header($holiday = [])
{
$str = "";
$date = new DateTime();
for ($i = 0; $i < 7; $i++) {
!$i ? "" : $date->modify('+1 day');
$w = $date->format("w");
$tabindex = $i*7;
$ho = (function ($days, $holiday = []) {
return (array_search($days, $holiday) !== false) ? "holiday" : "";
})($date->format("Y-m-d"), $holiday);
$str .= "
<th tabindex=$tabindex>
<span class='header_no week_no_$w $ho'>" . $date->format("Y-m-d") . "</span>
</th>";
}
return $str;
}
/**
* @param int $h_min
* @param int $h_max
* @param int $m_interval
* @param array $cnt
* @param array $reserve
* @param array $holiday
* @return string $str
*/
function fn_time($h_min, $h_max, $m_interval,$cnt=[],$holiday = [], $reserve = [])
{
$str= [];
for ($h = $h_min; $h <= $h_max; $h++) {
for ($m = 0; $m < 60; $m = $m + $m_interval) {
print("<tr>\n");
$date = new DateTime();
for ($i = 0; $i < 7; $i++) {
$cnt[$i]=!$cnt[$i]?(((($h_max - $h_min)+1)*(60/$m_interval))*($i))+7:(++$cnt[$i]);
!$i ? "" : $date->modify('+1 day');
$w = $date->format("w");
$ho = (function ($days, $holiday = []) {
return (array_search($days, $holiday) !== false) ? "holiday" : "";
})($date->format("Y-m-d"), $holiday);
$time = sprintf("%02d:%02d",$h, $m);
if ($ho) {
print("
<td class='' tabindex={$cnt[$i]}>
<span class='header_no week_no_$w $ho'>" . $time . "</span>
</td>");
} else {
$r = (function ($days, $reserve = []) {
return (array_search($days, $reserve) !== false) ? "reserve" : "";
})($date->format("Y-m-d") . "_" . $time, $reserve);
if (!$r) {
print("
<td class='date_" . $date->format("Y-m-d") . "_{$time}' tabindex={$cnt[$i]} data-date='" . $date->format("Y-m-d") . "_{$time}'>
<a class='time_{$m}_" . $date->format("Y-m-d") . "_{$time}' data-sortno={$cnt[$i]} href='#?data=" . $date->format("Y-m-d") . "_{$time}'><span class='header_no week_no_{$w} {$h}'>{$time}</span></a>
</td>");
} else {
print("
<td class='' tabindex={$cnt[$i]}>
<span class='header_no week_no_$w $r'>" . $time . "</span>
</td>");
}
}
}
$date = null;
print("</tr>\n");
}
}
return "";
}
?>
<!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/5.1.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<title>予約-時刻表(デモ版)</title>
<style>
table,tr,td{
user-select: none;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-12 text-center">
<h1 class="display-1">予約-時刻表<br></h1>
<h5>{予約:時刻をクリックするか、<br>
左クリック選択状態で複数選択可能です<br>
(日付またぎは禁止しています)}</h5>
<h5>{ダブルクリックすると予約画面に遷移します。<br>
※DEMO版ですので予約登録画面は御座いません}</h5>
</div>
</div>
</div>
<div class="container-fluid text-center">
<div class="row">
<div class="col-12">
<table class="shadow-lg table table-hover table-bordered">
<thead>
<tr>
<?= fn_header() ?>
</tr>
</thead>
<tbody>
<?=fn_time(10, 20, 10,[],["2022-09-18","2022-09-23"],["2022-09-19_10:40","2022-09-19_10:50"]) ?>
</tbody>
</table>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/2.9.2/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.1.0/js/bootstrap.min.js"></script>
<script src="./assets/js/main.js?<?=time()?>"></script>
</body>
</html>
let date_obj = document.querySelectorAll("td");
let submit_url = "https://example.com";
let is_date_data = [];
let cnt = 0;
date_obj.forEach(function (elm, key) {
elm.addEventListener("mouseout", select_in_value);
elm.addEventListener("click", sp_select_in_value);
elm.addEventListener("touchend", sp_select_in_value);
elm.addEventListener("dblclick", select_out_value);
});
function check_value(o, e) {
if (is_date_data.length === 0) {
return true;
}
let d = o.getAttribute("data-date");
return d ? ((d) => {
let f = is_date_data.find(element => {
let pattern = new RegExp(d.split("_")[0]);
return !element.match(pattern);
}) ? false : true;
if (!f) {
select_clear(o, e);
is_date_data = [];
cnt = 0;
}
return f;
})(d) : false;
}
function select_in_value(e) {
if (e.buttons === 1 && check_value(this, e)) {
if (this.getAttribute("data-date")) {
this.style.backgroundColor = "#555";
this.children[0].style.color = "#fff";
if (is_date_data.indexOf(this.getAttribute("data-date")) && is_date_data.indexOf(this.getAttribute("data-date"))) {
is_date_data[cnt] = this.getAttribute("data-date");
cnt++;
}
}
}
}
function sp_select_in_value(e) {
if (check_value(this, e)) {
if (this.getAttribute("data-date")) {
this.style.backgroundColor = "#555";
this.children[0].style.color = "#fff";
if (is_date_data.indexOf(this.getAttribute("data-date")) && is_date_data.indexOf(this.getAttribute("data-date"))) {
is_date_data[cnt] = this.getAttribute("data-date");
cnt++;
}
}
}
}
function select_out_value(e) {
if (is_date_data.length) {
let is_data = is_date_data.map(function (elm, index) {
return "date[" + index + "]=" + elm;
});
window.location.href = submit_url + "?" + is_data.join("&");
}
}
function select_clear(o, e) {
let is_ClassName = [];
is_ClassName = is_date_data.map(function (d) {
return "date_" + d;
});
is_ClassName.map(class_name => {
document.getElementsByClassName(class_name)[0].style.backgroundColor = "#fff";
document.getElementsByClassName(class_name)[0].children[0].style.color = "#0d6efd";
})
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
0, Code, com, demo, https, ligaLgY-uZ, php, qiita, UI, watch, www, youtube, オリジナル, キッカケ, コード, こちら, こと, コメント, これ, ソース, デモ, プログラマー, 一, 予約, 今日, 台風, 営業, 妨害, 後, 感じ, 感覚, 投稿, 接近, 掲載, 方, 方法, 昔, 昨日, 時刻表, 朝, 欠陥, 理由, 確認, 職場, 肝心, 自分, 解除, 記載, 設計書, 訳, 選択, 部分, 駄目,
1万件のCSVを読み込みテーブルに保存する雛形コード #PHPCode
2022.09.08
おはようございます、徐々に秋ぽっい日差しになってきましたね(まだ暑いけども😌)。
今日は、1万件のCSVを読み込みテーブルに保存する雛形コードを昨日、ちょちょっと書きましたので記載します。ファイルをダウンロードして使いたい方はGithubのリンクを下に貼っときますので、ご使用頂けたらと思います。尚、テーブルなどはCSVを参考にご自身で構えてください。
※動作環境はPHP8系です、なのでPHP7系では一部エラーが出ます。fgetcsv…nullを0へ変更。
Githubのリンクはこちら
Qiitaの方に記載しようかどうしようか、迷ったのですが第一弾目がアクセス数がそこそこ伸びたのでこれ以上、注目されるのは嫌なのでブログの方に記載しました。1万件のCSVを簡単に読み込ませる方法はPHPコードを書くのではなく、SQLのコマンドで実行した方が実は早いですけど・・・。
早いですけど、その場合、CSVがちゃんとしたファイルではないと上手くテーブルに保存されない場合や、そもそもコマンドラインで操作出来ない場合もあったりしてPHPコードなどで制御しないと駄目な事もあります。そんな時に、このコードをサンプルとして使って頂ければ良いなと思い作りました。
そんなにコードを書かなくてもまぁ動くんですよ。ちなみにソースコードには、あまりコメントを書いていないですが、プログラマーなら大体の人が理解できるレベルかと思います。
<?php
//ini_set("display_errors","On");
session_start();
require "db_config.php";
//読み込みCSVファイル名セット
class csv
{
/**
* @param string $filename
* @param int $cnt
* @return Object
*/
public function ini_csv($filename = "", $cnt = 0)
{
return new csv_read($filename, $cnt);
}
}
//CSVデータを読み込ます
class csv_read
{
var $max = 10000;
var $cnt = 0;
var $handle = null;
/**
* @param string $filename
* @param int $cnt
*/
public function __construct($filename = "", $cnt = 0)
{
$this->cnt = $cnt;
$this->handle = fopen($filename, "r");
$_SESSION["offset"] ? fseek($this->handle, $_SESSION["offset"]) : $this->handle;
}
/**
* @param int $header_skip
* @return Object
*/
public function reader($header_skip = 0)
{
if ($this->handle !== FALSE) {
$response = null;
$data = fgetcsv($this->handle, null, ",");
if (!$header_skip || $_SESSION["offset"]) {
if ($data !== FALSE) {
$_SESSION["offset"] = ftell($this->handle);
$response["data"] = $data;
$response["cnt"] = $this->cnt > $this->max ? 0 : ($this->cnt + 1);
$flag = true;
} else {
$_SESSION["offset"] = null;
$flag = false;
}
} else {
$_SESSION["offset"] = ftell($this->handle);
$response["cnt"] = $this->cnt > $this->max ? 0 : ($this->cnt + 1);
$flag = false;
}
} else {
$_SESSION["offset"] = null;
$flag = false;
}
return new table_save($flag, $response);
}
}
//tableにCSVデータを保存
class table_save
{
var $flag = false;
var $result = null;
/**
* @param boolean $flag
* @param array $response
* @return void
*/
public function __construct($flag, $response)
{
$this->flag = $flag;
$this->result = $response;
$this->column_name = "name,,...";
}
/**
* @param string $column_name
* @return void
*/
public function tbl_save($column_name = "")
{
if ($this->flag) {
$column = $column_name ? $column_name : $this->column_name;
$is_column = explode(",", $column);
foreach ($is_column as $key => $val) {
$is_value[$val] = $this->result["data"][$key];
}
try {
$pdo = new PDO(DSN, USERNAME, PASSWORD);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = (function ($is_column) {
$INSERTFIRST = null;
$INSERTLAST = null;
foreach ($is_column as $key => $val) {
$INSERTFIRST[] = "$val";
$INSERTLAST[] = ":$val";
}
$INSERTSQL = "(" . implode(",", $INSERTFIRST) . ")values(" . implode(",", $INSERTLAST) . ")";
$UPDATESQL = null;
foreach ($is_column as $key => $val) {
$UPDATESQL[] = "$val = :$val";
}
return "INSERT INTO " . TABLENAME . $INSERTSQL . " ON DUPLICATE KEY UPDATE " . implode(",", $UPDATESQL) . ";";
})($is_column);
$stmt = $pdo->prepare($sql);
foreach ($is_value as $key => &$value) {
$is_type = ($key === "test3" || $key === "test13") ? PDO::PARAM_INT : PDO::PARAM_STR;
$stmt->bindValue(":$key", $value, $is_type);
}
$this->result["sql"] = $stmt->execute();
} catch (\Throwable $th) {
//throw $th;
$this->result = null;
print $th->getMessage();
}
}
print json_encode($this->result);
}
}
//RUN...POST DATA
if (isset($_POST["csrf_token"]) && d_xss($_POST["csrf_token"]) === $_SESSION['csrf_token']) {
$_SESSION["offset"] = (int)d_xss($_POST["reset_flag"]) === 1 ? null : d_xss($_SESSION["offset"]);
$filename = d_xss($_POST["filename"]);
$cnt = (int)d_xss($_POST["cnt"]);
$column_name = "test1,test2,test3,test4,test5,test6,test7,test8,test9,test10,test11,test12,test13,test14,test15";
$header_skip = 1;
$csv = new csv();
$csv->ini_csv($filename, $cnt)->reader($header_skip)->tbl_save($column_name);
$csv = null;
} else {
print "";
}
function d_xss($data){
$data = strip_tags($data);
$data = htmlspecialchars($data,ENT_QUOTES);
return $data;
}
<?php
// ログインした状態と同等にするためセッションを開始します
session_start();
// 暗号学的的に安全なランダムなバイナリを生成し、それを16進数に変換することでASCII文字列に変換します
$toke_byte = openssl_random_pseudo_bytes(16);
$csrf_token = bin2hex($toke_byte);
// 生成したトークンをセッションに保存します
$_SESSION['csrf_token'] = $csrf_token;
?>
<!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">
<title>CSV</title>
</head>
<body>
<input type="hidden" name="csrf_token" value="<?=$csrf_token?>">
<span class="h3" id="cnt"></span><br><br>
<span class="h4" id="read_csv"></span><br><br>
<span class="h4" id="debug"></span><br><br>
<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>
<script>
window.onload = function(){
read_csv(0,1);
};
function read_csv(cnt,reset_flag){
try{
$.ajax({
type: "post",
url: "./assets/php/class_csv.php",
async: false,
data: {csrf_token:document.getElementsByName("csrf_token")[0].value,reset_flag:reset_flag,filename:"dummy.csv",cnt:cnt},
dataType: "json",
success: function (response) {
if(response){
cnt = response.cnt;
document.getElementById("cnt").innerText = cnt;
if(response.data){
document.getElementById("read_csv").innerText = response.data[0] + response.sql;
document.getElementById("debug").innerText = cnt ===21?response.data:document.getElementById("debug").innerText;
}
setTimeout(function(){read_csv(cnt)},0);
}
}
});
}catch(e){
console.warn(e);
read_csv(cnt);
}
}
</script>
</body>
</html>
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
0, 1, 7, 8, CSV, fgetcsv, github, null, php, PHPCODE, qiita, SQL, アクセス, エラー, コード, こちら, コマンド, これ, ご使用, ご自身, ダウンロード, ちょ, テーブル, ファイル, ブログ, リンク, 一, 一部, 万, 下, 今日, 保存, 動作, 参考, 変更, 実行, 方, 方法, 日差し, 昨日, 有言実行, 注目, 環境, 秋, 簡単, 記載, 雛形,
投稿された内容を検索してNGワードがある行を削除するMYSQL文
2022.07.28
おはよう御座います。ココの所、寝不足気味でしたが昨日はかなり早めから睡眠を取り今は快適です😌。
さて、投稿された内容を検索してNGワードがある行を削除するMYSQL文を作りましたので昨日、Qiitaで公開しました。反響はまぁまぁです、とは言えいいね等は今のところされていません。公開したMYSQL文をこちらでも公開しておきますのでご自由にお使いいただけと思っております。
DELETE T FROM Test AS T inner join
(select id from Test,words where txt REGEXP CONCAT ("(",word,")") GROUP BY id Order by id DESC)
AS NG ON T.id = NG.id WHERE T.id = NG.id;
作った経緯は自分が作ったサービスに荒らしがたまに現れるようになった事です、それをいちいち確認して削除するのは面倒なので、こういうSQL文を作成したわけです、若干、処理は遅いものの削除してくれるので良いかなって思っています。
本音を言えばQiitaに掲載すれば手直ししてくれる人が現れるかなって若干期待していましたが、今のところいません。もしこの記事を読んでもっと良い方法があるという方は是非、コメント等頂ければ幸いです。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
AS NG, DELETE T FROM Test AS T inner join, ID, MYSQL文, NG.id WHERE, NGワード, ON T.id, qiita, quot, REGEXP CONCAT, select id from Test, SQL文, where txt, Word, words, ココ, 反響, 本音, 睡眠, 経緯, 若干,
デベロッパーコミュニティサイトがありますよね。
2022.04.06
おはよう御座います。
デベロッパーコミュニティサイトがありますよね。日本ではQiitaを知らないひとはエンジニアではないとも言われています(嘘ー)😌。それぐらいQiitaはエンジニアとって認知度の高いサイトです。海外ではdev.toを知らずしてエンジニアを語れないと言われているかも知れません。
Qiitaも昔は初心者向けの投稿が多かったのですが、この頃は中級レベルや上級者に向けた発信をするユーザーも増えてきて、メンターのいない自分にとってはとても大事なサイトになりつつあります。自分の場合、上流工程の経験が全然ないとくに資料作りなどは最低レベルなので、そこのレベルアップしたいなって思っています。設計を作らず開発工程ばかりしていたので、転職活動にはとても不利な気がします。ここらへんを改善できればワンランクアップした仕事につけるかも知れません。転職活動はしていませんが、一般的にはシニアエンジニアは上流工程に就いていることが多いですね。ちなみに35歳引退説は今では何処吹く風だと思っています、現役、シニアプログラマーは結構な割合でいます。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
dev, qiita, To, アップ, エンジニア, くに, ここら, こと, コミュニティ, サイト, シニア, そこ, それぐらい, デベロッパー, ひと, べん, メンター, ユーザー, ランク, レベル, ワン, 上流, 上級者, 不利, 中級, 仕事, 初心者, 嘘, 場合, 大事, 工程, 投稿, 改善, 日本, 昔, 最低, 気, 活動, 海外, 発信, 経験, 自分, 設計, 認知, 資料, 転職, 開発, 頃,
開発レビューした事がないが嫌いな人からレビューされたら。
2022.03.15
運悪く開発レビューした事がないので、今までコードに文句言われたことが殆どない、唯一Qiitaでコメントで指摘してくれるエンジニアはいるのですが、それ以外ないのです。でも嫌いな人からレビューされたら自分は心が狭いのでムカってなると思います。
そこらへん、皆さんどう思われているのでしょうか?
コードを書き直されるのは自分はあまりうれしくないですね。わざとわかり易く書いている部分があったりします。確かにコードを短くすることが出来るのだけど、それが正しいことなのかとは思わないタイプの人間です🤔。
駆け出しエンジニアにもわかり易く書くことのほうが、結果的に言えば自分に質問してくる事がなくなり自分の仕事に集中することが出来ると思っています。
これに関しては皆様が是々非々で判断してください😌。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
qiita, エンジニア, コード, こと, コメント, これ, そこら, それ, タイプ, ムカ, レビュー, 事, 人, 人間, 仕事, 判断, 唯一, 嫌い, 心, 指摘, 文句, 是々非々, 殆ど, 皆さん, 皆様, 自分, 質問, 部分, 開発, 集中, 駆け出し,
ビットコインで自動売買システム作っている人がいた、それもオープンソースで!?
2021.07.08
ビットコインで自動売買システム作っている人がいた、それもオープンソースで提供している人がいました。Qiitaというサイトでアルゴリズム(考え方)を公開していてますが、プログラミングが分かる中級者ぐらいの人は見ればtani まーきぃさんの書いている意図が理解出来ると思います。ただ、これで仮想通貨わらしべ長者になれるかどうか分かりません(この記事を書いているときはパート1の動画しかないので・・・・)。
つい最近、ネットでイケハヤさんオススメの仮想通貨買ったら明くる日にどん底まで転落したユーザーが多くでてYahoo!のニュース記事になっていたみたいです(尚、イケハヤさんは逃げ切ったので損は出てないみたい)。投資や投機系は自己責任の分野ですので、そのお金はないものと思って運用しないと大変なことになります。特にリバレッジをかけて運用していると痛い目にあいますのでご注意を自分は現価で運用するのが、まだリスクは少ないと思います。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1, qiita, tani, Yahoo, アルゴリズム, イケハヤ, オープン, おすすめ, お金, こと, これ, ご注意, サイト, システム, ソース, それ, つい, とき, どん底, ニュース, ネット, パート, ビットコイン, プログラミング, もの, ユーザー, リス, リバレッジ, わらしべ, 中級者, 人, 仮想, 公開, 分野, 動画, 売買, 大変, 意図, 投機, 投資, 提供, 損, 明くる日, 最近, 現価, 理解, 目, 考え方, 自分, 自動, 自己, 記事, 責任, 転落, 通貨, 運用, 長者,
海外のチャンネルだけど良質、The Flutter Way
2021.02.06
海外のチャンネルだけど良質な技術を早送りではあるけれど、見えるというのはかなり意義のあるなと思います。デザインをコードにどう起こすのかが分かりやすく掲載されていて凄く助かるじゃないかな?特に初心者には助かるなと思います。Flutterは実はこのごろ、触っていないです。
リモートワークになってちょっと腑抜けていている状態になってますが、やはり勉強をしようとこの動画を見て思いました。こんなアプリ作れたら、やっぱ楽しいでしょうね。アプリもリリースしたいからね・・・。中断していたjavaの勉強も休日にごとごとするようにします。そちらは実名のqiitaに掲載していきます。Flutterでなにかアプリを開発したい人、勉強したいひとは下記からチャンネル登録どうぞ。因みに日本ではFlutter大学というチャンネルが有名ですかね。
https://www.youtube.com/channel/UCJm7i4g4z7ZGcJA_HKHLCVw 【The Flutter Way】
https://www.youtube.com/channel/UCReuARgZI-BFjioA8KBpjsw 【KBOYのFlutter大学】
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
4, 7, channel-, com, flutter, https, java, qiita, The, UCJm, way, www, youtube, アプリ, かなり, コード, ごろ, そちら, チャンネル, デザイン, ひと, リモート, リリース, ワーク, 下記, 中断, 人, 休日, 初心者, 勉強, 動画, 大学, 実名, 意義, 技術, 掲載, 日本, 早送り, 有名, 海外, 状態, 登録, 良質, 開発,
QiitaのTシャツが欲しい。
2020.06.30
QiitaのTシャツが欲しい。因みにこれが一番、欲しいやつです!!
Qiitaは、最近ユーザー置き去り事件がありユーザーが一時期減少しました。自分にはよくわからないですが、流れで解約したひとも中にはいるでは無いかな。その時、自分も解約しようかなと思ったのですがQiitaはよく見ているしなと思いとどまったタチです。
Qiitaは日本でよく使われているだけで海外認知はあまりなく、使われてはないと思うのですが、これからもユーザーは増えていくとは思っています。Qiitaの良いところは質問形式ではないところ、どっちかというとプログラムのおすそ分けみたいなサービスだと思います。
話が飛びますが、デジタルなサービスは徐々にゼロに近づいていくと思っています。殆どのサービスはいずれフリーで使用できる時代が来るはずです。今世紀中には無理だと思いますが・・・、いずれはそうなるということです。何故ならプログラムコード(ソース)をオープンに提供する人々がいるからです。今でも無料でサービスを提供して一部の人から寄付をもらって開発をしている人がいます。システムがよければ寄付だけで生活していけるということは今でも成り立っている話です。そして無料でサービスを提供するというのはサービスの広がりが速いです。なのでこういう事が長い年月をかけて蓄積することでオープンソースのサービスは増えていくことになり、最終的には殆どのサービスが無料で使用できる時代が来るという考えです。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
qiita, いずれ, おすそ分け, コード, こと, これ, サービス, しな, シャツ, ゼロ, ソース, タチ, デジタル, ところ, どっち, パス, ひと, フリー, プログラム, やつ, ユーザー, 一時期, 中, 事件, 今世, 使用, 引用, 形式, 日本, 時, 時代, 最近, 殆ど, 海外, 減少, 紀中, 置き去り, 自分, 解約, 話, 認知, 質問,
数値を日本語桁数の読み方に変換するWEBサービスを作りました。
2020.06.20
数値を日本語桁数の読み方に変換するWEBサービスを作りました。リンクは下記になります。何故、作ったのか?、検索すると同じようなサービスがありましたが、リアルタイムに数値を漢字に変換してくれないので自分でリアルタイムで検索できるものを作った次第です、コードはあまりキレイではないし改良できる部分はあります、Qiitaなどに公開しないので良いかと思い変数の命名も適当な感じです。
https://zip358.com/tool/ketayomi/ (?リンク先には数字の読み方 表もあります)
直でリンクに飛んでもらうのも良いですし、無料サービスから試していただくのもありです。これも無料サービスの一環として作りました。それなりに使えるじゃないかなと思ったりしています?。数値を日本語全漢字にするロジックを考えたとき、面倒くさいなと思ったので、、、データとして持つことにしました。
こういうのあまり使う人がいないけど、使う人は仕事などで使用する可能性があるかなとか思ったりしています。こういうニッチなサービスを無料サービスとして公開していけば数撃ちゃ当たるじゃないかと思います。今回の数値を日本語桁数漢字にするサービスは単純なものなので誰でもプログラマーなら出来る範囲だと思います。駆け出しプログラマー、エンジニアでも作れる品物ではないかと…。
次回はもっといろいろな人が使うお手軽サービスを作りたいですね。シェアして頂けると幸いです。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
qiita, エンジニア, コード, プログラマー, リアルタイム, ロジック, 一環, 命名, 品物, 変数, 手軽サービス, 数値, 数字, 日本語桁数, 日本語桁数漢字, 次回, 漢字, 範囲, 表, 駆け出しプログラマー,
?Ponanza(ポナンザ)の作成者さんが作ったお天気のアレを真似たひとり用。
2020.02.22
Ponanza(ポナンザ)の作成者さんが作ったお天気のアレを真似たひとり使用?ものです。下記のものを作りました。開発者の場合、自分で作りたい衝動にかられると思います。まんまと駆られて作りました…なので考え方をお裾分けです。今までQiitaで公開したソースコードも必要になりますので、リンクを貼っときます。そしてメインのソースコードは下記になります( Twitterのoauthライブラリを呼び出しが必要になります。 )。
※個人の開発者様用なので位置情報は引っ張って来てません、天気の都道府県を変更されるか、Twitterの位置情報を使用し天気のAPIへ投げるなりしてください(本家はIP情報から位置情報を特定しようとしているようです)。乱暴な説明ですが駆け出しのプログラマーじゃない限りできると思います。
本家はこちら
https://note.com/issei_y/n/ne128a0cf27ca
追記:ソースコードをComposerで使用できるようにしました。
https://qiita.com/zip358com/items/8c1a128e24cc33ca7ca7
composer require zip358/tw_name_change
<?php
require_once ("vendor/autoload.php");
require_once ("moon.php");
require_once ("tenki.php");
use Abraham\TwitterOAuth\TwitterOAuth;
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
$user_data=$connection->get("users/show",["screen_name"=>$user_screen_name]);
$name = $user_data->name;
date_default_timezone_set('Asia/Tokyo');
$icons = moon::$icon + tenki::$icon + array("@"=>"@");
$year = date("Y");
$mon = (int)date("m");
$day = (int)date("d");
$H = (int)date("H");
if($H>=6 and $H<=17){
tenki::main();
tenki::$url = "https://api.openweathermap.org/data/2.5/weather?id=".tenki::$ken->kochi["id"]."&appid=".tenki::$appid;
tenki::api();
$chg = tenki::$icon[str_replace("n","d",tenki::$response->weather[0]["icon"])];
}else{
moon::main($year,$mon,$day);
$chg = moon::icon();
}
foreach($icons as $key=>$val){
if(preg_match("/$val/",$name)){
$hit = $val;
}
}
$name = str_replace("$hit",$chg,$name);
$connection->post("account/update_profile", ["name" =>$name]);
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
0, 128, 27, API, ca, cf, com, https, IP, issei, ne, note, oauth, Ponanza, qiita, Twitter, アレ, お裾分け, コード, こちら, ソース, ひとり, ひとり用, プログラマー, ボナンザ, メイン, もの, ライブラリ, リンク, 下記, 位置, 作成者, 使用, 個人, 公開, 場合, 変更, 天気, 必要, 情報, 本家, 特定, 考え方, 自分, 衝動, 説明, 都道府県, 開発者, 限り, 駆け出し,
さくらレンタルサーバーとかで制限以上のクロンタブ(crontab)を使う方法。
2018.11.08
さくらレンタルサーバーとかで制限以上のクロンタブ(crontab)を使う方法
10年ぐらいまえのコードを見直して改善したコードが下記になります。
10年前はクラスを使わない方法で構築したのだけど、今回はクラスの概念を
使って構築。ここ何年かで自分のコーディングの技術は上がっているかといえば
そうでもないですが、昔よりかは技術の幅は広がっていると思いたいw
※qiita日付は数年前にUPしたのですけど、コード自体は10年前のコードです。
追記:2022/10/08 修正:詳しくはコチラ
https://qiita.com/question909/items/8f1df9b62ab4fba76243
<?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();
}
}
}
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
08, 10, 2022, 39, 5, Asia, class, cron, crontab, date, default, function, if, lt, obj, php, public, qiita, set, timezone, Tokyo, UP, w, クラス, クローン, クロン, コーディング, コード, ここ, コチラ, サーバー, さくら, タブ, まえ, レンタル, 下記, 今回, 何年か, 修正, 処理, 分刻み, 制限, 場合, 幅, 技術, 改善, 数, 方法, 日付, 昔, 有効, 概念, 構築, 無限, 自体, 自分, 負荷, 追記,
Gmail未読メール一括既読処理
2018.01.20
Gmail未読メール一括既読処理です。
ちなみにこれは間違っているコードなのですね、これを放置していたのに
誰も指摘がなかったという怖さ、やはりネットに転がっているコードは
余程、名の通った人のサイトしか信用しては駄目だなと痛感。
ただ良心的なサイトも数多く有るのも
本当のことですが・・・コードを理解していないと
挙動不審に動くコードだったりする可能性を秘めているので
注意が必要です。
※あと無限ループ(再帰処理)で走らしていますが
未読問い合わせには問い合わせ制限があるみたいなので
超大量の未読Gmailメールがあった場合など
うまく動作しません。
https://script.google.com/home?
Qiita::URLはこちら
function gmailbat(q) { q = !q?0:q; var gm = GmailApp.search("is:unread",q,500); var flg = false; gm.forEach(function(m,i,a){ if(m.isUnread()){ m.markRead(); flg = true; } }); if(flg){ q = q+500; return gmailbat(q); } return true; }
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
AM, function gmailbat, G Suite, gm.forEach, GmailApp.search, Gmail未読メール一括既読, Gmail未読メール一括既読処理, GoogleAppsScript, GoogleAppsScript完全入門, m.isUnread, m.markRead, qiita, return gmailbat, return true, var flg, var gm, コード, 再帰処理, 最新プログラミングガイド, 未読問い合わせ, 詳解,
Qiitaでまぁまぁ閲覧されて嬉しかったり(´∀`)
2015.06.26
Qiitaでまぁまぁ閲覧されて嬉しかったりしてます。コードも書けば書くほど進化するという事はたぶん、間違いないと思います。この頃、PHPもまだまだ何だなぁという実感があります。まだまだ勉強しないと駄目、PHPに限らず言語の勉強はこれからも頑張ってしていきたいと思っています。たとえ職業で使うことが無くなっても自分はコードを書き続けていきたいと思ってます。何故かって?言えば単なる好きだからです、ブログ書くのも基本的に好きだから続けられるのですね。それと同じでコードを書くのも絵を描くのもデザインするのも好きなんです。学生時代あまり勉?することがなかった自分ですが、いまは学ぶことは結構好きですし、興味をもったものは結構すんなりと今でも吸収できます。好きなことは覚えるのも結構早いかもしれません。興味のないことは直ぐに忘れがちですが、好きなことは覚えたことはあまり忘れないですね(´Д`)。
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
googleって自前のTシャツとか売ってるですよ。
2015.06.15
グーグルってグーグルのロゴ入り、Tシャツを売ってます、他にもYOUTUBEのロゴ入りなど、グーグルにまつわるTシャツを結構売ってたりします。着てたら社員に間違えられそうですね。ちなみに、こういうTシャツやグッズ販売はグーグル以外にもGitHubや日本ではQiitaなども自社グッズの販売を行っています。自分もつい最近、QiitaのTシャツをぽちっと購入してしまいました。着てても恐らくそういう事をしている人しか、知らないと思うので、ひとつ購入しました。この頃、そういう系のステッカーとかも欲しいなと思ってます。ただ、そういうのをノートパソコンとかに貼ると剥がすときにベタベタになりそうな気がして・・・・。ベタベタにならないステッカーも売られてますよ。Mac、ステッカーとかググったりすると結構表示されます。
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
github, Google, Mac, qiita, Tシャツ, youtube, グーグル, グーグル以外, グッズ販売, ステッカー, ノートパソコン, ひとつ, ぽち, ロゴ, ロゴ入り, 日本, 社員, 自前, 自社グッズ,
Qiitaは、プログラマのための 技術情報共有サービスです。まんま(´Д`)
2015.01.25
Qiitaは、プログラマのための 技術情報共有サービスです。そのまんまのサイトです、勉強のためにアカウントを取得しています(http://qiita.com/zip358というアカウントを取得済)。いろいろなWEB系に関するプログラムの技が勉強できたりします。こういうのでプログラム情報共有サイトで有名ドコロはwonderfl.netやjsdo.itがいうものが人気が高いです。
ちょっと今、水面下でひとつウェブサービスをゴニョゴニョと制作しています。まだ全然作れていないのですけど4月か5月あたりに世に出せたらよい感じかなと思っています。少しづつ制作しているのでそのぐらいかかると思っています。その制作するサービスの広告掲載方法にあるボットサービスの処理方法が良かったので考え方をパクらせてもらうことにします事をメモ書き程度に残しておきます。ただ広告掲載の審査に通るかが問題になりそうです・・・・。Amazonってこの頃シビアになってきたので・・・・。
あと話しが変わりまして、落書きと言うなの絵の随時更新はいったん中止します、更新自体は随時更新のままですがある程度、絵も書いたので今後は適度に更新していきます(´Д`)mのでよろしくです。
著者名 @taoka_toshiaki
※この記事は著者が30代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
jsdo.it, qiita, wonderfl.net, アカウント, ゴニョゴニョ, ひとつウェブサービス, プログラマ, プログラム, プログラム情報共有サイト, ボットサービス, まんま, メモ書き程度, 少しづつ, 広告掲載, 広告掲載方法, 技術情報共有, 有名ドコロ, 水面下, 落書き, 随時更新,