@Blog{zip358.com}
日常日誌からプログラムやYOUTUBER紹介、旅日記まで日々更新中です。
ランキングと一言メッセージ機能を追加した話.#wordPress
2024.07.20
おはようございます.先日ちょこちょこっとランキングと一言メッセージ機能を追加しました.ちなみに両方を追加するにかかった時間は20分もかからずに追加.昔、PHPを独学で始めたときからすれば圧倒的に速く対応が出来るようになっているのだけども、それと相反して簡単過ぎて喜びや達成感があまりないのが問題.
今後、大きな機能変更する可能性が少しあってWordPressとVueで構築し直そうかなと思っている.まだ、思っているだけで出来たら良いなぐらいです.ググるとその方法を書いているサイトが結構あるのですが、プラグインの対応が書かれていない.そこが解決出来るのであれば変更してみたい気持ちはあります.ちなみにVue等で構築するとSEOに強くなるらしいです.
今回、機能追加した二点ですが、とくに一言メッセージを推しています.使って頂けると結構励みになりますので是非.
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
php, SEO, Vue等, WordPressとVue, プラグイン, ランキング, 一言メッセージ, 一言メッセージ機能, 両方, 二点, 可能性, 問題, 少し, 方法, 時間, 機能, 気持ち, 独学, 追加.昔, 達成感,
Xに画像投稿を
2024.04.09
おはようございます、先日、Xに画像投稿を自動で行うように対応しました.これによって自分が何か得するのかは現段階では分からないけど機能追加しました.今まで自分が歴代のiPhoneで撮影した画像を自動投稿で表示されるように処理しています.
画像投稿ボットは四時間置きに処理されるようにしています.当初は二時間置きにしていたのですが、恐らくそれではAPI上限に引っ掛かりそうだったので、一日、6回にしています.
画像投稿の方法を知りたい方はこちらを参照に作ってみてください.
https://qiita.com/taoka-toshiaki/items/f1c22012bb9f668ab008
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
6回, API上限, iPhone, X, 一日, 二時間置き, 参照, 四時間置き, 当初, 方法, 機能, 歴代, 現段階, 画像, 画像投稿, 画像投稿ボット, 自分, 自動投稿,
THE FIRST #SLAMDUNK
2024.03.17
おはようございます、映画で観たスラムダンク・ザ・ファーストのブルーレイディスクが発売されていたので購入しました。予約特典はなしです、予約特典のブルーレイディスクを頼みたかったのですが金銭的に余裕がいまあまり無い感じなので特典なしを選択しました。
これで観たいときにVRをつけて仮想映画館で映像が楽しめます。因みにVRはプレイステーションの初代VRをPS5に取り付けています、取り付け方法は過去記事を参照ください。
明日へ続く。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
Vr, スラムダンク・ザ, ブルーレイディスク, プレイステーション, 予約特典, 予約特典はなし, 仮想映画館, 余裕, 初代VRをPS5, 方法, 映像, 映画, 無い感じ, 特典, 過去記事,
stable-diffusion-webuiを使ってみた。
2024.03.14
おはようございます、stable-diffusion-webuiを使ってみました。結論から言うとプロンプト大事だという事とプロンプトを制御しないとろくな画像は生成されない。フリーで使用できるだけマシですけどこれで良いものを作るのは至難の業だということを使って理解しました。
これを使用する方法はgitとPythonとcudaがインストールされていることが前提条件にあります。そしてWindowsの場合はwebui.batを叩くMacなどはwebui.shを叩いて動かすのですが、動作はご自身のPCスペックに比例します。
ミッドジャーニーがどれほど優秀なのかが比べてみると分かります。
明日へ続く。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
CUDA, git, Mac, PCスペック, Python, stable-diffusion-webui, webui.bat, webui.sh, Windows, ご自身, プロンプト, ミッドジャーニー, 前提条件, 動作, 方法, 業, 画像, 結論, 良いもの,
スポティファイ音楽を聞くやつ。無料で良いじゃないかな。
2023.10.02
おはようございます、スポティファイ音楽を聞くやつ。無料で良いじゃないかなと思い出しました。自分はYOUTUBEミュージックを使用しているのですけど、やはり音質はスポティファイが良いということが分かりましたので、Spotifyに戻そうかなと思い始めています。
ちょっと前にネトフリでSpotifyのドラマを見てからやっぱSpotifyは良さげだなという認識です。
なので、もしかするとまた、Spotifyに鞍替えするかも知れません。
一時間後、よくよく調べてみると!!
調べてみるとYOUTUBEで高音質で聞く方法がありました・・・・。設定の再生と進んでいくと高音質の設定項目がありましたので、どうやらこのままYOUTUBEミュージックで聞くことになりそうです。因みに、YOUTUBEの有料会員になるとYOUTUBEの広告なしとYOUTUBEミュージックとYOUTUBEオリジナル映像が付いてきます。やっぱSpotifyよりお得感ありますね。
明日へつづく
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
Spotify, youtube, YOUTUBEオリジナル映像, YOUTUBEミュージック, お得感, スポティファイ, スポティファイ音楽, ドラマ, ネトフリ, やつ, 再生, 広告, 方法, 有料会員, 自分, 良, 設定, 設定項目, 音質, 高音質,
PS5買わないとなぁって思えた話。 #FF7RREBIRTH #再生
2023.06.15
おはようございます、FF7Rリバースの新予告を見たとき、仕方ないFF7R(ファイナルファンタジー7リメイク)の為にPS5を買わないとなぁと思いました。FF16の予告を見たときは、まだ良いかなって思っていたんだけど、FF7Rを見たらPS5、仕方がないけど買おうと思えた・・・。
トイウコトデ、PS5を購入するために、どうやって購入費を捻出するか考えています🤔。一番、最も良いのは副業で捻出する方法だと思うのですが中々、仕事を取るのが難しい。なので、やはり無駄遣いを抑えてその費用をそれを埋め合わせするしかないかなって・・・。
ともあれ近いうちにPS5を購入します。因みにPS5値が目減りしはじめているそうです。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
FF16, FF7R, FF7Rリバース, PS5, PS5値, トイウコトデ, ファイナルファンタジー7リメイク, 予告, 仕事, 仕方ないFF7R, 副業, 新予告, 方法, 無駄遣い, 費用, 購入費, 近いうち,
CSSファイルの設定を読み込んで一括背景色変更するコード。 #cssfile #javascript #coding #colors
2022.11.30
おはようございます、先日の日曜日は原因不明の体調不良で寝込んでおりました(¦3[▓▓]。
今日は何とか体調が回復したので、CSSファイルの設定コード読み込んで一括背景色変更するプログラムコードを作成しました。※実際、自分のブログ・サイトで動いているコードになります。
<link rel="stylesheet" href="examplestyle.css">
導入方法はまずヘッダーに変更したいCSSファイルを記述します。次にbody内に下記のコードを記述します。
<span id="site_description"></span>
最後にJSコードを挿入します。JSコードはファイルで読み込むでもベタ書きでも良いのですが、上記のHTMLタグより下に記述してください。そうしないと動作しません😗。
let htmlcode = ["#efefef", "#181B39", "#262a2e", "#192734", "#1c483b", "#bf7800", "#83094f"].map(elm => `<span class='color_code' style='color:${elm}' data-color-code='${elm}'>■</span>`).join("\n");
const basecolor = "#262a2e";
let cookiefn = function (CodeColor) {
let r = document.cookie.split(';');
return r.length ? ((r) => {
let changecolor = "";
for (let ii = 0; ii < r.length; ii++) {
let content = r[ii].split('=');
for (let i = 0; i < content.length; i++) {
if (content[i].replaceAll(" ", "") === "bgcolor_code") {
changecolor = content[i + 1];
}
}
}
return changecolor?changecolor:CodeColor;
})(r) : CodeColor;
};
let old_color = cookiefn(basecolor);
document.getElementById("site_description").insertAdjacentHTML("afterend", htmlcode);
[...document.querySelectorAll(".color_code")].forEach(elm => {
elm.addEventListener("click", function (e) {
color_set(elm.getAttribute("data-color-code"));
});
});
color_set(old_color);
function color_set(color) {
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];
try {
element_css_code.style.backgroundColor = color;
if (color === "#efefef") {
element_css_code.style.color = "#000000";
} else {
element_css_code.style.color = "#FFFFFF";
}
//いらないかも領域🤔👇
document.querySelectorAll("#wp-calendar > tbody > tr > td > a").forEach(elm=>{
elm.style.backgroundColor = "#909091";
});
document.getElementById("searchsubmit").style.backgroundColor = "#000";
document.querySelector("#s").style.backgroundColor = "#909091";
[...document.querySelectorAll("code")].forEach(elm=>{
[...elm.querySelectorAll("span")].forEach(childen_elm=>{
childen_elm.style.backgroundColor = "#565656";
});
});
//いらないかも領域🤔👆
} catch (error) {
}
}
document.cookie = "bgcolor_code=" + color;
}
}
}
注意事項:背景色を変更するCSSファイルをJSコードでチェックしています。そのチェックしている部分を外すと全てのCSSファイルの背景色を変えることが可能です。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
3, body, coding, colors, css, cssfile, description, examplestyle, gt, href, ID, javascript, JS, link, lt, quot, rel, site, span, stylesheet, コード, サイト, ファイル, ブログ, プログラム, ベタ, ヘッダー, 一括, 下記, 不明, 不良, 今日, 体調, 作成, 先日, 内, 原因, 回復, 変更, 実際, 導入, 挿入, 方法, 日曜日, 最後, 背景色, 自分, 記述, 設定,
md5でいいのかそれで?。 #wp #phpcode
2022.11.17
おはようございます、いきなり寒くなりましたね。朝起きるのに勢いが必要になってきました😆。
今日はワードプレスでもパスワードの暗号化に使用されているmd5に関して思うことがあります。そもそもmd5は強固な暗号なのか?、答えはnoだと思いますよ。md5を使用すると32文字の暗号化された文字列が返却されます。確かに暗号化されているですけど・・・。同じ文字をもう一度、暗号化すると同じ文字列が返却されます、なので暗号化された文字列になるかどうかで、元の文字が割り出せてしまいます。
総当たりすれば時間はかかりますがパスワードが分かちゃうので、パスワードを保存する方法としては△な感じかと思います。じゃ何が良いかといえばphpの場合、password_hashと言う関数があるので、そちらを使用した方が得策かと思います。Eメールなどはmd5でも良いかも知れませんが微妙。
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
因みに、パスワードなどやメールアドレスを平文で扱っている開発会社はよく見かけます。何故、平文を放置しているかと言えば直す暇がないなどの理由からだと思います。また、クライアント様がそうして欲しいなどの理由もあります。そういう事から個人情報が保護されていないデータベースはあります。
尚、自分が使用しているWEBサービスも個人情報にあたる部分は暗号化しています。なので、データーが流出しても直ぐに情報が漏れるということはないと思っています🫠。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
32, 5, echo, hash, md, no, password, php, PHPCODE, quot, rasmusl, wp, こと, そちら, パスワード, プレス, メール, ワード, 一度, 今日, 何, 使用, 保存, 元, 勢い, 場合, 得策, 微妙, 必要, 文字, 文字列, 方, 方法, 時間, 暗号, 暗号化, 朝, 答え, 総当たり, 返却, 関数,
POSTとGETの考え方について伝えている動画。 #以心伝心
2022.11.12
おはようございます、11月なのに寒くないって不思議です😗温暖化。
さて、POSTとGETの考え方について無音声(音楽あり)で伝えている動画です、以心伝心で意味が通じると良いですが、それではブログを書いている意味がないので要点だけ解説します。POSTとGETとは、インターネット上でデータの送信を行うのに使用します。POSTの利点はデータを隠して送れることと、比較的に重いデータも送れることにあります。ではGET送信の利点は、SEOに有利と言ったところでしょうか。
今回、POST送信とGET送信を行い、PHPのプログラムでPOSTとGETを受信する方法を動画で伝えています。次回は非同期処理を使用して送受信を行う方法をプログラムで書いていきます。
HTMLとPHPプログラムは下記のソースを参照下さいませ🙇。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>demo site</title>
<style>
html {
width: 100vw;
height: 100vh;
}
body {
background-color: rgb(0, 0, 0);
color: aliceblue;
background-image: url(./assets/images/aig-mid22910-120-xl_TP_V.jpg.webp);
background-repeat: no-repeat;
background-size: cover;
background-position: center;
}
div.box {
border-color: aliceblue;
border-style: inset;
position: absolute;
width: 300px;
height: 450px;
color: white;
border-radius: 1em;
padding: 1em;
top: 50%;
left: 50%;
margin-right: -50%;
transform: translate(-50%, -50%);
/* background-color: #ffffff80; */
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
overflow-wrap: break-word;
text-align: center;
}
div>form>p {
font-weight: bold;
margin: 13px;
}
input {
opacity: 0.5;
}
textarea {
opacity: 0.5;
}
button {
padding: 5px;
border-radius: 1em;
border-style: solid;
border-color: aliceblue;
background-color: aliceblue;
color: rgb(0, 0, 0);
}
button:hover{
border-color: rgb(255, 255, 255);
border-style: inset;
background-color: rgb(27, 76, 119);
color: aliceblue;
}
.put:nth-child(2){
overflow: auto;
height: 120px;
}
</style>
</head>
<body>
<div class="box">
<div id="box2">
<form action="submit.php" method="post">
<p>名前:<input type="text" name="name"></p>
<p><textarea name="text" id="" cols="30" rows="10"></textarea></p>
<p><button class="btn" type="submit">確認</button></p>
</form>
</div>
<div id="data">
<p class="put"></p>
<p class="put"></p>
</div>
</div>
<script src="./assets/js/main.js"></script>
</body>
</html>
<?php
var_dump(xss_d($_POST));
print(xss_d($_POST["name"])."<br>");
print(xss_d($_POST["text"])."<br>");
function xss_d(mixed $val){
if(!isset($val))return false;
if(is_array($val)){
foreach ($val as $key => $value) {
$val[$key] = strip_tags($value);
$val[$key] = htmlspecialchars($val[$key],ENT_QUOTES);
}
}else{
$val = strip_tags($val);
$val = htmlspecialchars($val,ENT_QUOTES);
}
return $val;
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
11, 2, css, DOCTYPE, GET, html, lt, no, php, POST, SEO, インターネット, こと, ソース, データ, ところ, ブログ, プログラム, 下記, 不思議, 今回, 以心伝心, 使用, 処理, 初学, 利点, 動画, 参照, 受信, 同期, 意味, 方法, 有利, 次回, 温暖化, 考え方, 要点, 解説, 送信, 送受信, 音声, 音楽,
cssとjsを動的に読み込むソースコード2。#jscode
2022.11.11
おはようございます、すずめの戸締まりを本日、観に行きますという事で本日はお休み。感想は帰ったら別途書きます。
以前、ファイルを動的に再読み込みする方法という記事を書きまして、この記事がまぁまぁプレビュー数を取ってくれているので、ソースコードを書き直しました。以前と違うのは正規表現を見てくれればわかるかと思いますが、パラメータを初期からもっているJSファイルやCSSファイルは対象外にしている所です。
メンターがいない中、コードを見直したりするのはやっぱ時間がかかるものですね。いつも自分に必要なのはメンターだと思ったりしますが、なんだかそういう人が見当たらないですよね。やはり東京や大阪にいかないと見つけられないのかな?、今ではSNSがあるから見つけやすくなっているものの、自分よりも50%ぐらい技術力がある人がいないですよね。凄い技術力が上の人は知っているのだけども、そういう人の話を聞いてもさっぱりなので・・・。
近くにいないものなのかな、よく灯台下暗しという言葉もあるからいそうな気がするですけどね🫠。
ソースコードはこちらです。
"use strict";
document.querySelector("button").addEventListener("click",jsandcssreload);
function jsandcssreload(){
let d = (new Date()).getTime();
[...document.querySelectorAll("link")].forEach((elm)=>{
elm.href = elm.href.replace(/(\.css)\??[0-9]{0,}$/,".css?" + d);
});
[...document.querySelectorAll("script")].forEach((elm)=>{
elm.src = elm.src.replace(/(\.js)\??[0-9]{0,}$/,".js?" + d);
});
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, 50, css, JS, jscode, SNS, お休み, コード, すすめ, ソース, パラメータ, ファイル, プレビュー, メンター, もの, 上, 中, 事, 人, 今, 以前, 初期, 別途, 大阪, 対象, 必要, 感想, 戸締まり, 所, 技術力, 方法, 時間, 本日, 東京, 正規, 自分, 表現, 観, 記事, 話,
常時ディレクトリ監視を行う方法。 #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, アカウント, アップ, コード, コピペ, コメント, そこ, ディレクトリ, トイウコトデ, ところ, バージョン, ファイル, 世間, 事, 人, 任意, 使用, 例文, 別, 巷, 常時, 常識, 掲載, 方法, 昔, 普通, 正直, 段々, 気, 炎上, 理由, 画像, 監視, 移動, 近く, 運用, 関数, 駄目,
staticかdynamicか、php-fpmの話。#php #apache
2022.11.01
おはようございます、メモリが肥大化して落ちました🤮。
先週の朝、メモリが肥大化して落ちてしまいました。今まではphp-fpmを1時間置きに再起動していましたが、それを変更した途端。メモリを食ってしまい落ちたわけです。
php-fpmの対応はこちらのサイトを参考にしました、尚、対応方法はそちらの記事を参照ください。その記事を読んでいて思ったことはやはりサーバーを増強したいということです。
でもVPSレンタルサーバーはサクサク表示させるには、結構お金がかかってしまいます、だったら固定IPを引いて自宅サーバーで運用した方が良いのかもしれないなってこの頃、思っています。
そうすればメモリはかなり詰めるし処理もそれなりに早くなります。恐らく瞬速で表示されるようになりますが、震災などが起きると忽ちダウンしてしまいますよね。
そう考えると・・・微妙ですね。
やはりVPSサーバーをもう一つ借りて調整するか、VPSサーバーと自宅サーバーを同期して運用するかだと…。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1, Apache, dynamic, IP, php, php-fpm, static, VPS, お金, かなり, こちら, こと, サーバー, サイト, そちら, それ, それなり, ダウン, はり, メモリ, もう一つ, レンタル, わけ, 借, 先週, 再起動, 処理, 参照, 参考, 固定, 増強, 変更, 対応, 微妙, 方, 方法, 朝, 瞬速, 自宅, 表示, 記事, 話, 途端, 運用, 震災, 頃,
制限付きのクロンを無限寿限無にする方法。 #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, アクセス, クロン, コード, サーバー, さくら, スポーツ, ソース, タイトル, プログラム, ユーザー, レンタル, 事, 人気, 今, 今日, 何方, 使い方, 制限, 参照, 寿限無, 専門性, 少し, 数, 文章, 方法, 日, 昔, 朝, 未だ, 無限, 理解, 自分, 記事, 頃,
何気なく書いていた事が結構な確率で当たる。#未来予知 #高的中か?
2022.10.09
おはようございます、コロナが収まりそうなのに戦争はまだ収まりそうにないです。ロシアは領土を奪って何得なんでしょうか。意味が分かりません。
さて、過去のブログ記事を定期的に見たり修正したりしています。これを行う理由は一つだけ意味不明な文章表現があり本人しか意味がわからないモノが存在します。その為、定期的に変な文章は直したりしています。
毎日書けば文章力や表現力は、どんな人でもUPします。泥臭いことですが技術力を上げようと思ったらひたすら真っすぐ頑張るしか無いです。必要な知識は日々の勉強でしか埋め合わせは出来ないです、技術や知識を身につける方法はひたすら覚える事から始まります。覚えて基礎が身につけば応用学習するその反復を行って身につく。この方法しかなく脳にデータをインストールは今のところ出来ない、記憶力は人それぞれなので、身につく事が早い人と遅い人がいるけれど反復学習をすれば身につきます(脳に障害がある人は難しいけども)。
タイトルの話になりますが、結構な確率で自分の未来予想があたっているなって最近思います。特に科学的な進歩や社会にどう浸透していくなどは、結構、的を得た予想をしているなと自画自賛😐。未来予測が当たっても何の得にもならないけれどもアタルのは良いことです。
此処で一つ未来予想を書きます、昨日きな臭い記事の書いたけど、来年の夏までにはロシアVSウクライナの戦争は終わるじゃないかって思っています、なんかそんな気がします。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
UP, インストール, こと, これ, コロナ, それぞれ, データ, ところ, ブログ, もの, ロシア, 一つ, 不明, 予知, 事, 人, 今, 修正, 勉強, 反復, 基礎, 変, 存在, 学習, 得, 必要, 応用, 意味, 戦争, 技術, 技術力, 文章, 文章力, 方法, 日々, 未来, 本人, 毎日, 為, 理由, 的中, 知識, 確率, 結構, 脳, 表現, 表現力, 記事, 記憶力, 身, 過去, 障害, 領土,
基本情報技術者試験ワード集と単語帳作りアプリで学習の下準備をする方法! #FE #英語 #効率
2022.10.06
おはようございます、朝、3時半頃から起きています😪。
先日から英語の勉強をアプリではじめました、自分が使用しているのはモノグサというアプリです。このアプリをインストールしたのは二年前の話です、そのアプリを使用して効率良く英単語を覚えていってます、なんかよく分からないけど覚えて行けている🙄。
さて、それとは別に本題のお話です、単語帳作りアプリを使って基本情報技術者試験に出てくるワードを再学習しています。ワードの方は基本情報技術者試験ドットコムから引っ張ってきています、そのワードをCSV化してアプリに入れました。個人的に使用している分にはOKですが、これを公開や共有するとNGになりますので使用時はお気をつけてください🙇。
ワードを収取する方法はブラウザのコンソール画面に下記のコードを貼り付けて収集しました。
基本情報技術者試験ドットコムのキーワード集「あ」から「ん」までのリンクページをそれぞれ開きコンソール画面でコードを実行して、それをUTF8のファイルにペーストして一つのファイルにしてCSV保存。本当はnode.jsでコードを書いて実行でもしようかなと思っていたのですが、それすら面倒くさいと思ったので、こちらの地味な方法を選択しました。尚、行末に必要なカンマを追加して上げてくださいね🙄。
let s = [];
let $moji = function(m){
return String(m).replace(/[\,|\n|'|"]/g," ");
};
Object.keys(document.querySelectorAll(".big")).forEach((e)=>{
s[e] = "'" + $moji(document.querySelectorAll(".big")[e].innerText) + "'" + "," + "'" + $moji(document.querySelectorAll("ul > li > div > div")[e].innerText) + "'";
});
copy(s.join("\n"));
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
3, CSV, FE, NG, OK, アプリ, インストール, お気, お話, キーワード, コード, これ, コンソール, それ, ドットコム, ブラウザ, モノグサ, ワード, 下準備, 下記, 二, 使用, 先日, 公開, 共有, 分, 効率, 勉強, 半, 単語帳, 収, 収集, 取, 基本, 学習, 情報, 技術者, 方, 方法, 朝, 本題, 画面, 自分, 英単語, 英語, 試験, 話,
Twitter-API-v2ツイート数珠繋ぎ #コード公開 #php
2022.10.04
おはようございます。土日祝も関係なくブログは毎日書いています🤮。
さて、今日はPHP言語でTwitterAPIバージョン2(v2)を使用してツイート数珠繋ぎをする方法を抜粋して記載していきます。こういうコードは今のところ出回っていないようです。少し調べれば公式サイトに記載しているのだけども・・・。まだ、日本語に対応した記事が少ないようです。v2でツイートする方法やリツイートする方法は何故かあるのだけどリプライ(Reply)[/statuses/update]する方法が記事としては記載していなかったので?記載します。
<?php
require_once "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
class tw{
var $connection = null;
function __construct()
{
$this->connection = new TwitterOAuth(APIKEY, APISECRET,ACCESSTOKEN, ACCESSTOKENSECRET);
$this->connection->setApiVersion("2");
}
function pickup_tweets(mixed $tw_text=null){
$obj = (object)[];
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;
}
return false;
}
}
最初に結論とコードのアルゴリズムに付いて解説します。まず、tweetsのパラメーターでリプライ出来るように変更されています。v1.1とはそこが変わっているので同じ仕組みを検索しがちですがそれでは検索にヒットしないようです🤔。まずはエンドポイントの変更点の確認が必要みたい👏。
エンドポイントのv1.1からv2への対応表が公式から出ているので確認してみてください↑。
次にコードの解説ですがまずTwitterOAuthライブラリをインストールを行い、defineなどの設定なども考慮した上で実行してみてください(コードに追記記載が必要)。変数、$tw_textは配列です。また投稿する文字が入っていると考えてください。そしてこのコードを下記のような考え方で実行してみてください。
<?php
require_once "tw-index.php";
$tw_text[0] ="test1";
$tw_text[1] ="test2";
$tw = new tw();
if($tw->pickup_tweets($tw_text)){
$ret["msg"] = "ok";
}else{
$ret["msg"] = "NG";
}
var_dump($ret);
※前提条件としてtwitter社にAPIの申請を行って受理されている事。
これで思った通り実行出来たと思います。尚、自分のように管理画面などを作って数珠繋ぎの投稿するのも良いかも知れません🫠。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, Abraham, autoload, class, connection, function, lt, null, once, php, quot, Reply, require, statuses, tw, Twitter-API-v, TwitterAPI, TwitterOAuth, UPDATE, use, var, vendor, コード, サイト, ツイート, ところ, バージョン, ブログ, リツイート, リプライ, 今, 今日, 使用, 公式, 公開, 土日, 対応, 少し, 抜粋, 数珠繋ぎ, 方法, 日本語, 毎日, 祝, 言語, 記事, 記載,
ページ無限スクロールの作り方 #インフィニティ#InfinityPageScroll #JavaScript
2022.09.22
おはようございます、台風14号が過ぎ去ってからいきなり秋模様ですね🫠。
さて、先日ツイートしたページ無限ループが出来るJavaScriptコードを書きました。これを作ろうと思ったキッカケは、自分が運営しているWordPressサイトに巷のページ無限スクロールプラグインが尽く(ことごとく)使用出来なかったので自分で自作した訳です。因みにページ無限スクロールプラグインとはページを送りをしなくてもページの最下までスクロールすると次頁を読み込んでくれるプラグインの事を指します。
下記のコードは自サイト専用なのでそのまま使用することは出来ませんが、重要な部分だけ抜き取って再利用すれば、独自のページ無限ループに対応することは可能かと思います。
コードを読んで頂ければ分かることですが、重要なポイントはページを読み込む方法とそれをDomに変換する方法だと思います。まず、ページを読み込む方法は下記のファンクションで可能です。
fetch(next_url).then(
response => response.text()
).then(data => {
そしてDomに置き換えている所はこの部分になります。これら2つの箇所が重要になります。
const parser = new DOMParser();
const doc = parser.parseFromString(data, 'text/html');
これらの事に注意して独自コードを書いてみてください。最後に全コードを記載しときます。
let cnt = 2;
let blk = 0;
async function nextpage() {
if (cnt !== blk) {
blk = cnt;
await (async () => {
let next_url = "https://fox-black.com/blog/page/" + cnt;
return await fetch(next_url).then(
response => response.text()
).then(data => {
const parser = new DOMParser();
const doc = parser.parseFromString(data, 'text/html');
let blogs = doc.querySelectorAll('.blogpage');
cnt++;
if (blogs[0].innerHTML !== undefined) {
document.querySelector(".foxpage").insertAdjacentHTML("beforeend", (function (elm) {
let str = "";
for (const key in elm) {
const element = elm[key];
if (element.innerHTML !== undefined) {
str += "<div class=\"blogpage\">" + element.innerHTML + "</div>";
}
}
return str;
})(blogs));
} else {
if (document.querySelector("#fin") === null) {
document.querySelector(".foxpage").insertAdjacentHTML("beforeend", "<div id=\"fin\"></div>");
}
}
}).catch(error => {
if (document.querySelector("#fin") === null) {
document.querySelector(".foxpage").insertAdjacentHTML("beforeend", "<div id=\"fin\"></div>");
}
});
})();
}
}
if (navigator.userAgent.match(/iPhone|Android.+Mobile/)) {
window.addEventListener("scroll", async function () {
let s = (() => {
let tgt;
if ('scrollingElement' in document) {
tgt = document.scrollingElement;
} else if (this.browser.isWebKit) {
tgt = document.body;
} else {
tgt = document.documentElement;
}
return tgt;
})();
if (document.querySelector("#fin") === null && s.scrollTop >= (s.clientHeight - 650)) {
await nextpage();
}
});
} else {
document.querySelector(".foxpage").addEventListener("scroll", async function () {
if (document.querySelector("#fin") === null && document.querySelector(".foxpage").scrollTop >= (document.querySelector(".foxpage").scrollHeight - 300)) {
await nextpage();
}
});
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
14, dom, InfinityPageScroll, javascript, WordPress, インフィニティ, キッカケ, コード, こと, これ, サイト, スクロール, それ, ツイート, プラグイン, ページ, ポイント, ループ, 下記, 事, 作り方, 使用, 先日, 利用, 可能, 台風, 変換, 対応, 専用, 巷, 方法, 最下, 模様, 次頁, 無限, 秋, 自, 自作, 自分, 訳, 運営, 部分, 重要,
一週間の予約が出来るデモコードです。良かったらどうぞ😌。 #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, アクセス, エラー, コード, こちら, コマンド, これ, ご使用, ご自身, ダウンロード, ちょ, テーブル, ファイル, ブログ, リンク, 一, 一部, 万, 下, 今日, 保存, 動作, 参考, 変更, 実行, 方, 方法, 日差し, 昨日, 有言実行, 注目, 環境, 秋, 簡単, 記載, 雛形,
submit(サブミット):送信させない4つの方法です🙄。#javascript #サブミットキャンセル
2022.09.07
おはようございます、台風一過が去りましたね😌。
さて、今日はsubmit(サブミット):送信させない4つの方法を記載します、方法は大きく分けて2つの方法があり、それを細分化して4つの方法になります。まず、一番目は“送信する際(form側)”にてキャンセルする方法です。この場合、addEventListener(アッドイベントリスナー)でキャンセル処理する場合とonsubmitを使用してキャンセルする方法があります。
サンプルコード例1と例3にあたるコードが上記のコードになります。
次に”ボタンをクリック”した際にサブミット(送信)処理をキャンセルする方法です、この方法でも送信を阻止する事ができます。
サンプルコード例2と例4にあたります、自分としてはフォームで処理した方が良いかなと思いますが、こちらでも送信をキャンセルする事ができます。
尚、ソースコードは下記になります。また、参考にしたサイトのリンクを貼っときます。MDNのリンクです。
<form id="frm" method="post" action="./example/">
<input type="hidden" name="example" value="data">
<button type="submit" class="btn btn-primary">Submit1</button>
</form>
<form method="post" action="./example/">
<input type="hidden" name="example" value="data">
<button id="btn" type="submit" class="btn btn-primary">Submit2</button>
</form>
<form method="post" action="./example/" onsubmit="return func1()" >
<input type="hidden" name="example" value="data">
<button type="submit" class="btn btn-primary">Submit3</button>
</form>
<form method="post" action="./example/" >
<input type="hidden" name="example" value="data">
<button type="submit" class="btn btn-primary" onclick="return func2()" >Submit4</button>
</form>
//例1
document.getElementById("frm").addEventListener("submit",function(event){
event.preventDefault();
});
//例2
document.getElementById("btn").addEventListener("click",function(event){
event.preventDefault();
event.stopPropagation();//インターフェイスのメソッドで、キャプチャおよびバブリング段階において現在のイベントのさらなる伝播を阻止します。
});
//例3
function func1(){
return false;
}
//例4
function func2(){
return false;
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1, 2, 3, 4, addEventListener, Form, javascript, onsubmit, submit, アッド, イベント, キャンセル, クリック, コード, こちら, サブミット, サンプル, それ, フォーム, ボタン, リスナー, 一, 上記, 事, 今日, 使用, 例, 側, 処理, 台風一過, 場合, 方, 方法, 次, 細分化, 自分, 記載, 送信, 阻止, 際,
基本情報技術者試験を無料で勉強する方法を教えます🤔。
2022.09.02
おはようございます、マスクをすると直ぐに肌に痒みを感じます💦。
前置きとして基本情報技術者試験は来年(2023年)からいつでも基本情報技術者試験が受けれるようになります。年二回の試験は今年で最後です、最後の試験も予約してCBT(Computer Based Testing(コンピュータ ベースド テスティング))で受ける形になります。CBTとは簡単に言えばパソコンを使用して回答するものになります、回答は選択式なので今までの筆記試験と変わりません。全問回答した後、直ぐに正答率が分かります。そこが筆記試験とは違う形になります😶。
さて、基本情報技術者試験を無料で勉強する方法を教えます。まずはYOUTUBEを使います。YOUTUBEで基本情報技術者などと検索すると基本情報の午前(A)問題や知識を解説しているYOUTUBERがいますので自分が分かりやすいなと思った人の動画を見ると良いでしょう。
次に動画解説を見た後に基本情報技術者の過去問を徹底に解くことが大事になります。因みに基本情報の午前は過去問題集を9割解けるようになれば確実に本試験でも7割は取れます。過去問題を解くのに最適なサイトで一夜漬け情報処理サイトがありますのでそちらを活用ください。
午前は大体、この方法で合格出来ますが、問題は午後(B)です。午後を解説しているサイトは少ない理由は午前は暗記問題ですが、午後は自分で考える力が大事になってきます。アルゴリズムの概念やデーターベースの概念、プログラムを読む力、また文章の読解力も必要になってきます。その為、まずは午後の問題をひたすら自分で解く事により解く力を身につけましょう。分からないことは自分で調べ、再度、問題を解くという反復学習により午後の試験を解く力が身につきます。尚、最初は時間制限を設けずに解くようにして、最後まで自分で解く力を養うようにしましょう。
このような事に気をつけながら勉強することで確実に合格に近づきます。後は毎日、勉強することですね。皆様、基本情報技術者試験頑張って下さい。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2023, Based, CBT, Computer, https, Testing, www, YO, youtube, YOUTUBER, いつ, コンピュータ, そこ, テスティング, パソコン, ペースト, マスク, もの, 予約, 二, 人, 今年, 使用, 全問, 前置き, 勉強, 動画, 午前, 問題, 回答, 基本, 年, 形, 後, 情報, 技術者, 方法, 最後, 来年, 検索, 正答, 無料, 知識, 筆記, 簡単, 肌, 自分, 解説, 試験, 選択,
わらわらわら(www)をのけました。キャッシュこワい🙄
2022.08.23
こんにちは、今日は朝少しサーバーをイジって朝食後、外出しておりました。
まだ、不安定ですがwwwを除けてzip358.comに戻しました。除けた理由は気まぐれです、DNSのキャッシュが意地悪していて切り替えに時間を費やしてしまいましたが、一応無事に変更した形になります。
これが仕事だったら嫌だなって感じます、数ヶ月使用しているとキャッシュがDNSサーバーに蓄積されているので、その切替は各サーバー頼み。特に大企業じゃない限りDNSサーバーのキャッシュを削除してくれないでしょうね。
WEBサイトやWEBアプリを扱っている企業の担当者にとってサイト移行は胃が痛む仕事かと思います。お客様には見えないと言われたり上司からは早く見えるようにしてとか言われたりする場合もありますからね。因みに自分は徐々に移行する方法でサイト移行を済ませます。まずはDBを移行し、その後、ファイルなどを移行しホストを変えてみて上手く動作しているか確認後、IPアドレスを変更するという形です。
尚、メールサーバは大体、以前のサーバーを使用して頂けるならそうして貰います。
零細企業の場合、インフラからバックエンド、フロント全てに関わることもあるので良い経験になります。良い経験ですが大変です、言うがやすし行うは難しです。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
358, com, db, DNS, web, www, zip, アプリ, いし, お客様, キャッシュ, これ, サーバー, サイト, ファイル, ホスト, ワ, ワラ, 上司, 不安定, 今日, 仕事, 企業, 使用, 削除, 動作, 場合, 変更, 外出, 少し, 形, 後, 意地悪, 担当者, 数, 方法, 時間, 朝, 朝食, 気まぐれ, 無事, 理由, 確認, 移行, 胃, 自分, 蓄積, 限り,
カウントダウンしなくても片手で数えれる日数。
2022.07.11
おはようございます。毎日の事を淡々とこなしていたら、もうあと数日で今の会社を退職することになります。
先日いろいろな動画を見て結局のところ何か自分が掲げた目標で成功する方法はコレだなと思いましたので書いていきます。
何か自分が掲げた目標で成功する方法は、熱意をもって毎日のことをこなしていく事だと誰かが言っていました。ある程度、目標は必要ですがやり続ける熱意や努力がある人のほうが実になる人が多いだとか、逆に計画的に物事を進めようとしても上手くいかない事が多く、失敗するケースが多いのだとか。
これを聞いて「確かにそうだよな」と感じましたね、人生って思い通りにいかないものですよね。自分の思い通りにならないのが人生だと。思い通りになるとある意味、それは怖い事なのかもしれません。
あと掲げた目標に到達したいのならば、小さな目標をいくつも掲げると良い、例えば毎日のアクセス数をいついつまでに、10人、10人の目標が達成できたら次は20人と少しだけ目標を上げる、その連続で目標に近づく、もしくは達成することが出来ます。目標の修正と見直し(改善)も大事です。
目標に達成したければもう一つ大事になるのが、己を知るという事らしいです。自分はどんな人であるのかを深掘りしていき、欠点や優位性を箇条書きにして俯瞰することが大事になるらしいです。
そして達成するかどうかは徹頭徹尾の力がないと無理なのかも。
以上、動画を見て自分なりにまとめてみました。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
10, 2, アクセス, いくつも, いろいろ, カウントダウン, ケース, こと, これ, コレ, それ, ところ, もの, 事, 人, 人生, 今, 会社, 何か, 先日, 到達, 努力, 動画, 失敗, 必要, 思い通り, 意味, 成功, 数日, 方法, 日数, 次, 毎日, 熱意, 片手, 物事, 目標, 自分, 誰か, 退職, 逆, 達成,
先日、サーバーを移行しました。AWSさようなら。
2022.06.30
おはようございます。初夏らしいですが初夏? 増暑です…😆。映画、SLAM DUNKが待ち遠しいです。
其れはさておき、サーバーをAWSからさくらVPSサーバーに移行しました、迷っている暇は無かった・・どんどんと経費がかさむので止む得なく急遽、平日の休みを使用してサーバーを移行しました。移行したんだけど、少しミスってアクセスの多いサーバーを見えなくなるという現象が出てしまいました。40分ほど閲覧できなくなってしまっていた。
結構焦りますよね。
閲覧できない状態が数時間とか続いたら大変ですよ本当に…。仕事では失敗したくないなって思います。今回の反省点はやはりサーバー移行すると何かしら環境が違うので動かなかったりする。
そういう時は落ち着いて深呼吸でもして、ログを見ることが大事、結局のところログに答えが載っていることが多いです。今回もそんな感じでした。
因みに以前書いた、サーバー移行時にscpを使う方法。これはFTP使用するよりも時間短縮になるから覚えていたほうが賢明です。
scp -irp /~/example.pem /var/www/html/* root@example.com:/var/www/html/
# scp -irp [鍵.pem] [転送元ディレクトリ] [ユーザー@ホスト:転送先ディレクトリ]
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
40, AWS, DUNK, SCP, SLAM, VPS, アクセス, こと, サーバー, さくら, ところ, ミス, ログ, 今回, 仕事, 以前, 休み, 使用, 先日, 其れ, 初夏, 反省点, 増, 大事, 大変, 失敗, 少し, 平日, 感じ, 数, 方法, 映画, 時, 暇, 本当, 深呼吸, 状態, 現象, 環境, 移行, 経費, 閲覧,
Windows10~起動時にアプリ(ソフト)を自動起動させる方法です。
2022.06.23
おはようございます。隠しフォルダーが見える環境です。
さて、今日のお題はITエンジニアなら朝飯前のことだと思います。「Windows10~起動時にアプリ(ソフト)を自動起動させる方法です。」知らなかったら恐らくとても運の良いITエンジニアかと思います。方法を箇条書で記載しますねーーー😌。
- 隠しフォルダが表示できるようにエクスプローラーの設定を変更します(ググって)。
- 下記のフォルダ場所まで移動します(ユーザー名はご自身の環境によって違います)。
- 移動したフォルダにご自身が自動起動したいアプリのショートカットリンクファイルをコピペ(コピーアンドペースト)します。
- 再起動してみてアプリが自動起動している事を確認する。
C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
職場のPCが変わったりした時は必ず最初にやっていた作業になります。これをすることで出社しPC立ち上げ後、アプリの立ち上げなどは全くしなくて良くなります。因みにショートカットリンクにパラメーターを与えてあげることで、もっと短縮できる可能性があります。そこは割愛します。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
10, AppData, IT, menu, microsoft, PC, Programs, Roaming, start, Startup, users, Windows, アプリ, アンド, エクスプローラー, エンジニア, こと, コピー, コピペ, ご自身, ショートカット, ソフト, ファイル, フォルダ, フォルダー, ペースト, ユーザー, リンク, 下記, 事, 今日, 再起動, 場所, 変更, 方法, 時, 朝飯, 環境, 確認, 移動, 箇条書, 職場, 自動, 表示, 記載, 設定, 起動, 運, 題,