@Blog{zip358.com}
日常日誌からプログラムやYOUTUBER紹介、旅日記まで日々更新中です。
Pythonでノイズキャンセリングアプリ化するコードです😤デスクトップアプリ
2024.12.14
おはようございます.昨日の続きを記載します、Pythonでデスクトップアプリを作りました、デスクトップにPythonが入っている環境で下記のファイルを実行することでノイズキャンセリングが出来ます.
尚、前手順でライブラリを2つインストールください.
pip install scipy noisereduce
import tkinter as tk
from tkinter import filedialog, messagebox
from scipy.io import wavfile
import noisereduce as nr
import os
def select_file():
file_path = filedialog.askopenfilename(
filetypes=[("WAV files", "*.wav")]
)
if file_path:
file_entry.delete(0, tk.END)
file_entry.insert(0, file_path)
def reduce_noise():
file_path = file_entry.get()
if not os.path.isfile(file_path):
messagebox.showerror("エラー", "Please select a valid WAV file.")
return
try:
# Load data
rate, data = wavfile.read(file_path)
# Perform noise reduction
reduced_noise = nr.reduce_noise(y=data, sr=rate)
# Save reduced noise file
output_path = os.path.splitext(file_path)[0] + "_reduced_noise.wav"
wavfile.write(output_path, rate, reduced_noise,stationary=True,prop_decrease=0.7)
messagebox.showinfo("成功", f"出力先:\n{output_path}")
except Exception as e:
messagebox.showerror("Error", f"An error occurred: {e}")
# Create the main application window
root = tk.Tk()
root.title("ノイズキャンセリングツール")
# Input file selection
frame = tk.Frame(root)
frame.pack(pady=10, padx=10)
tk.Label(frame, text="Select a WAV file:").grid(row=0, column=0, pady=5, padx=5)
file_entry = tk.Entry(frame, width=40)
file_entry.grid(row=0, column=1, pady=5, padx=5)
select_button = tk.Button(frame, text="Browse", command=select_file)
select_button.grid(row=0, column=2, pady=5, padx=5)
# Noise reduction button
process_button = tk.Button(root, text="ノイズ除去", command=reduce_noise, bg="lightblue")
process_button.pack(pady=10)
# Run the application
root.mainloop()
因みにこのコードをパッケージ化したい場合はPythonの下記のライブラリをインストールするとパッケージ化が出来ます.
pip install pyinstaller
pyinstaller noise-cut.py
自分でもノイズキャンセリングを試してみましたが精度はいまいちでした、noisereduceの微調整が必要になりそうです.
明日へ続く
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
エラー, コード, デスクトップ, デスクトップアプリ, ノイズキャンセリング, ノイズキャンセリングツール, ノイズ除去, パッケージ化, ファイル, ライブラリ, 下記, 出力先, 前手順, 微調整, 成功, 環境, 精度, 自分,
親子で学ぶ どうしたらお金持ちになれるの?を読了
2024.12.09
おはようございます.「親子で学ぶ どうしたらお金持ちになれるの?」という本を読んで思うこと.ドライな話だけども実際そうだと言うことが多いのも事実だなって思います.
記載されていた目次を抜粋.
- 100倍の法則
- 「奇跡(きせき)は起きない」の法則
- 「君は友だち5人の平均」の法則
- 「わたしはわたし」の法則
- トライ・アンド・エラーの法則
- 「世界は理不尽(りふじん)である」の法則
- 「恵まれてないほうが人生は面白い」の法則
目次を読んで凹む人も多いかも知れませんが、これを子どもの時に知っていたら人生の選択肢が多くなっていたのかも知れないなって.自分には子どももいませんが、子どもがいたら滾々と伝えていた可能性が高いです.
人生は一度きりなので、いろんな人が書かれた本を読んでみることが大切だと思います.先人の知恵や経験は今のところ本にしか書かれていません.生成AIに聞いても今のところ定量的な回答しか得れないので是非、本を読むことをオススメします.
本が嫌だという人はドラマや映画から学ぶことも良いかも知れないです.多くのジャンルの読んだり観たりする中で生きるヒントが出てきます.
明日へ続く
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
エラー, キセキ, ジャンル, ところ定量, トライ・アンド, ドラマ, ヒント, わたし, 事実, 回答, 奇跡, 平均, 抜粋, 法則, 滾々, 生成, 目次, 知恵, 親子, 選択肢,
ファンが生きてるのに[cpu fan error please check]な場合の対処法.
2024.08.18
おはようございます.ファンが生きていてCPUの温度も上がってないのに[cpu fan error please check]な場合はほぼファンが原因ではなくてBIOSのファームウェアが古いのが原因ですので、BIOSのファームウェアのアップデートを行ってください.それでも解決しない場合は専門的な人のサポートを受けるべしです.
因みにBIOSのファームウェアアップデートが恐ろしくて行えない場合は専門的な人に対応して貰ったほうが良いです.BIOSなので間違ったらパソコンが起動しなくなる可能性を秘めているので、かなり注意が必要になります.
手順は各マザーボードによって違う可能性があるので、各製品の公式サイトのマニュアルを参考にしてみてください.
自分はじぶんで恐る恐るBIOSのファームウェアアップデートを行いファンのエラーが消えました.
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
BIOS, CPU, cpu fan error, please check, アップデート, エラー, サポート, じぶん, パソコン, ファームウェア, ファームウェアアップデート, ファン, マニュアル, 原因, 参考, 古い, 各マザーボード, 各製品, 手順, 温度,
【#英語】英語を勉強中です.三日坊主にならなかった理由.
2024.07.18
おはようございます.英語の勉強は何度も記事にしているぐらい、三日坊主なのですが今回は続いている理由は何かと言うと切迫感があるからです.やっぱり追い込まれるか、好きか、お金をもらえるかじゃないと人は動かないのかなって思います.
自分の場合、追い込まれていているので色々なスキルをアップしないとやってけないと判断した時に今一番、障壁になっているのは「英語」だと感じています.プログラムのドキュメントを読むのも英語、エラーの対応をするのも英語の文書を読む力が必要.
今までサボっていた部分を補うためにまずは文法とかよりも英単語を中学レベルから高校レベルまでを覚えようと思っています.その後、文法に入ろうと思っています.たぶん、この勉強方法はまわり道だと指摘されるかもですが”そう”してます.
毎日、単語を詰め込み覚え忘れ、それを何回も繰り返して覚えるようにしています.結果が出てくるには時間がかかると思いますが、それでも覚えようと思っています.
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
gomes on Pexels.com, Photo by luis, エラー, スキル, ドキュメント, プログラム, まわり道, 三日坊主, 中学, 何度, 切迫感, 勉強, 単語, 文書, 文法, 英単語, 英語, 部分, 障壁, 高校レベル,
JSの?.って何か!
2024.04.03
おはようございます、この頃js(javascript)コードに?.オプショナルチェーン (optional chaining) 演算子を見かけるようになってきましたね.そろそろこういう書き方をしてもエラーにならない時代になってきたのでしょう.
//オプショナルチェーン (optional chaining) 演算子 (?.)👍
let email = data?.email;
因みにdata?.emailが宣言されていない場合はundefinedが返却されます.今迄、if文なんかで判断していたものがオプショナルチェーンを使用することで省略可能になります.
このオプショナルチェーンは使い道が結構あると思うので、これから見ることが多くなると思います.
明日へ続く.
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
data, email, if文, javascript, let email, optional chaining, undefined, エラー, オプショナルチェーン, コード, この頃js, 使い道, 時代, 書き方, 演算子, 省略,
よさこい祭り動画検索を久しぶりにバージョンアップ
2023.08.24
おはようございます、よさこい祭り動画検索を久しぶりにバージョンアップしました。バージョンアップした理由はGさんがAndroid12に対応していないアプリは駄目だよと警告⚠を頂きまして、その対応のため、アプリを更新しました。このアプリはサイトを読み込んで表示しているだけのアプリなのでそのうち改修しようと思っているのだけどなかなか、手直ししていないアプリです。
Androidアプリでリリースしているものは、これだけでこのアプリがGさんに出禁になっても別に良いやというアプリですが、それでもなんだか知らない間にアプリのインストールも増えていて、びっくりしています。更新したのですが、実機で確認するとなんだかエラーが出てたりして何度か手直しを行いました。原因はマニフェストの書き方が駄目だったみたいです。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.yosakoi_app">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
こんな感じに書かないとお叱りを受けるようです、皆さまも気おつけてください🙇。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
Androidアプリ, example.yosakoi_app", gt, lt, manifest xmlns, Package, quot, quot;android.permission.ACCESS_NETWORK_STATE", quot;android.permission.INTERNET", uses-permission android, インストール, うち, エラー, お叱り, バージョン, マニフェスト, 何度か手直し, 出禁, 皆さま, 警告,
プロンプトマスターには程遠い。 #chatGPT
2023.05.04
おはようございます、プログラミングのためにご指導をchatGPTに頼んでいろいろ試してみた結果。簡単なプログラムなら解答を得られるけど、エラーで困っている時には五分五分感が歪めない。確かに正しい解答を得れることもあるけど、質問の方法によるけど全然トンチンカンの解答も返ってくる。
やはりまだ検索は重要だし無料で何かする場合は、chatGPTを導入しているbingを使用するよりか公式のchatGPTを使用する方が良い。bingにはchatGPT4が導入されているというものの、恐らくマイクロソフトがカスタマイズしているためか、検索結果を進めてくる感が強い。
情報としては最新ではないものの、OpenAIのchatGPTを使った方が良いしお金に余裕があるなら有料を導入したほうが良さげです。
コードが動かないのに半日程、沼から出られなかったのでやはり辛い。尚、chatGPTの使い方に関して公式(OpenAI)が日本語で掲載しています。自分もこの際、じっくりとプロンプトの使い方(プロンプトエンジニアリング)を勉強したいところです。
追伸:沼から抜け出せたのもchatGPTでした😤。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
bing, ChatGPT, chatGPT4, OpenAI, エラー, この際, トンチンカン, プログラミング, プロンプト, プロンプトエンジニアリング, マイクロソフト, 五分五分感, 半日程, 有料, 正しい解答, 沼, 良, 解答, 辛い, 追伸,
chatGPTで本を大量生産。う~む問題だな。見抜けない。
2023.04.14
おはようございます、chatGPTで本を大量生産。う~む問題だな。問題を問うてみたアレに。
ChatGPTは、自然言語処理によって自動的に文章を生成する人工知能です。最近では、ChatGPTを使用して本を大量生産する試みがあります。
この問題にはいくつかの懸念があります。まず、このような自動生成された本は、品質が保証されていません。自然言語処理技術はまだ不完全であり、文法やスペルミスなどのエラーが含まれる可能性があります。また、文章の意味が不明瞭な場合もあります。
さらに、本を自動的に生成することは、オリジナリティやクリエイティビティといった重要な要素を欠落させる可能性があります。本は、著者が自分の知識や経験を通じて創造するものであり、そこには著者の個性やスタイルが反映されています。自動生成された本には、そのような個性やスタイルが欠落する可能性があります。
また、本を自動的に生成することは、出版産業や著作権の問題を引き起こす可能性があります。著作権法では、著作者の権利を保護するため、他人の著作物を不当に利用することは禁止されています。自動生成された本は、他人の著作物を含む可能性があります。
この問題に対する解決策として、自動生成された本の品質管理を行うことや、著作権侵害の問題を回避するため、自分自身で書いた文章に限定することが考えられます。また、著作権法に基づいて、他人の著作物を使用する際には、適切な許諾を得ることが必要です。
最終的に、自動生成された本を出版することは、倫理的な観点からも慎重に検討される必要があります。本は、人々が自分たちの思考や感情を共有するための重要な手段であり、それらを自動的に生成することは、人間性を損なう可能性があります。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
ChatGPT, アレ, エラー, オリジナリティ, クリエイティビティ, スペルミス, 人工知能, 他人, 個性, 出版産業, 思考, 感情, 懸念, 手段, 文法, 権利, 著者, 観点, 許諾,
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, あと, エラー, お話, コード, こちら, ソース, つもり, ところ, プル, ユーザー, 今後, 任意, 何, 先頭, 動画, 即興, 取得, 可能, 同期, 場合, 所, 昨日, 最後, 画質, 画面, 編集, 表示, 解説, 追加, 金曜日, 音声,
さくらVPSの仕様なのか、分からないけど。
2022.10.14
おはようございます、昨日は暖かい陽気でしたね🫠。
さて、昨日ドハマリして数時間、時間を費やしてしまった問題が有りました。結論から言えばOSのバージョンの関係で上手くいかなかった。さくらの中の人(開発者)、OSバージョンアップした際の挙動を確認して無さそうな気がします。
どんなトラブルになったのかと言えば、こんな感じ。
作業用VPSサーバーを設置してWEBのコントロールパネルからssh鍵の設定して作業に取り掛かろうとテラターム(ローカル)でログインした所、エラーが出る。
何度、トライしてもパーミッションが駄目だよと弾かれるので、ウインドウズでユーザーの設定なんかを変更したりしたのだけど駄目だった。
リナックスやMacからだとログインできるだよね、なのでコレはWindowsの問題だと思っていた、パーミッション原因だと思っていたのだけど、前サーバーはssh鍵付きでログイン出来てたので変だなと思い、前サーバーのssh鍵を変更してみたら、こちらはすんなりとログイン出来てしまった。
ここで何が違うかと言えば、OSのバージョンだけ8系と9系の違いでログイン出来なくなる。恐らくこちら側の設定がどうこうではなく、何か・・・の接続時のデータ送受信で変になっている気がします。
この事象をさくらVPSに問い合わせしていないので、原因は分からないだけど恐らくOSのバージョンの違いで今のところ発生している問題だと思います。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
Mac, OS, SSH, VPS, web, Windows, アップ, ウィンドウズ, エラー, コレ, コントロール, サーバー, さくら, ターム, テラ, ドハマリ, トライ, トラブル, バージョン, パーミッション, パネル, ユーザー, リナックス, ローカル, ログイン, 中, 人, 仕様, 何度, 作業, 原因, 問題, 変, 変更, 感じ, 所, 挙動, 数, 昨日, 時間, 気, 確認, 結論, 設定, 設置, 鍵, 鍵付き, 開発者, 関係, 陽気, 際, 駄目,
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, アクセス, エラー, コード, こちら, コマンド, これ, ご使用, ご自身, ダウンロード, ちょ, テーブル, ファイル, ブログ, リンク, 一, 一部, 万, 下, 今日, 保存, 動作, 参考, 変更, 実行, 方, 方法, 日差し, 昨日, 有言実行, 注目, 環境, 秋, 簡単, 記載, 雛形,
最高権限でも削除できないファイルが有る?
2022.08.18
おはようございます。今日は生憎の雨☔ですね。
さて、先日の事ですがBluetoothが使用できなくなって悪戦苦闘のすえ、何とか復旧した話を記載します。最初はWindowsの設定画面にBluetoothがオフになっていますという文言が表示されていました。差し込んでいるのにも関わらず、このような文言が表示されていたのでデバイスマネージャーで確認するとなにやらエラーが出ていてデバイスが強制終了している模様でした。
ドライバーを削除して再度入れ直したら、上手く動作するだろうと思っていたのですが何度繰り返しても全然駄目。そんな回復しない状態が1時間続きました。これでは埒が明かないので考えを切り替えドライバーの原因ではなく、恐らくWindows側の問題だと思いレジストリを調べました。
これが結果的に正解でした。途中レジストリが削除出来ない問題などに直面しながら最終的に使用できるようになったのです。ここで一つ勉強になったのがアドミニストレータでも削除が出来ないレジストリがあるという事です。恐らくセキュリティの観点からマイクロソフトがそういう設定をしているのだと思いますが、これが結構厄介だなと感じました。
因みにWindows10、11はバグがありブルートゥースと接続した機器が削除出来ないという不具合があるのです。今回、それが間接的に悪さをしていたのですが直接原因はオフとオンのフラグが反転していたのが問題でそちらを修正して再起動をかけると認識したという結果になります。
今回の事象は特殊なので対応はご自身でググりながら解決をお願い致します。尚、レジストリを変更したり削除したりするとWindowsが動かなくなる恐れがあるので、素人にはオススメしません。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
1, bluetooth, Windows, アドミ, エラー, オブ, ここ, これ, デバイス, ドライバー, ファイル, マネージャー, レジストリ, 一つ, 事, 今日, 何度, 使用, 側, 先日, 再度, 削除, 勉強, 動作, 原因, 問題, 回復, 埒, 強制, 復旧, 悪戦苦闘, 文言, 最初, 最高, 模様, 権限, 正解, 状態, 生憎, 画面, 直面, 確認, 終了, 表示, 記載, 設定, 話, 途中, 雨, 駄目,
マイネオのマイソクプランを使ってみたので感想的な物を残しときます。
2022.06.08
おはようございます。この頃、iPhoneを買い替えたい欲が高まっています。
今日はタイトル通り、マイネオのマイソクプランを使ってみたので感想的な物を残しときます。マイネオとは格安スマホです。その中に通信量無制限のマイソクというプランが有るのですが、このプラン自分には合わない。お昼の12時から13時まで通信制限がかかります。それは契約を変更するときに理解はしていたのですが、実際、使用してみてこれは最悪だと気づきました。
お昼の休憩時間はスマホを操作する機会があります。また、コンビニでお昼ごはんを買う時には電子決済を使用していたのですが、マイソクに変更してからは通信エラーが頻発に起こり使い物にならないです、ブラウザは開けないし最悪としか言いようがないです。
尚、平日の12時から13時まで通信制限がかからない、タイプに変更したのだけど来月までマイソクプランで頑張らないといけないらしく正直なところ凹んでいます。
尚、それ以外の時間帯はサクサク通信します。
まとめ、平日の休み時間帯が12時~13時以外の方向けです、それ以外の人はマイソクはおすすめしません。32kbpsってかなり最悪です。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
12, 13, iPhone, エラー, お昼, これ, コンビニ, スマホ, ソク, それ, タイトル, タイプ, とき, ところ, ブラウザ, プラン, マイ, マイネオ, 中, 今日, 休憩, 使い物, 使用, 制限, 変更, 契約, 実際, 平日, 感想, 操作, 昼ごはん, 時, 時間, 最悪, 来月, 格安, 機会, 欲, 正直, 決済, 無制限, 物, 理解, 自分, 言いよう, 通信, 電子, 頃, 頻発,
githubの複数アカウントをWindowsで切り替えするbatファイルとexeファイルです。
2022.02.23
おはよう御座います。今日もあまり日中も気温が上がらないそうです😪。
フルリモートで働く人が多くなってきていますよね、そんな中、githubを仕事用と個人用と分けたい人が多いとかと思いますが、そんな人向けにツールを作りましたので紹介します。
githubの複数アカウントをWindowsで切り替えするbatファイルとexeファイルを作りましたので、お裾分けです、どこかのサイトにgithubのアカウントを切り替えるシェルスクリプトが記載していたのですが、自分はWindowsユーザーなのでそれ使えねぇーという事で作りました。
自分用なので、エラー取りはしていません、最低限の処理しか書いていないです。exeファイルの方はzipファイルにしてサーバに置いときます、尚、ご自身の良いような感じでgitdata.datファイルの中身を書き換えてください。考え方はbatファイルと同じです。
batファイルの方はこちらに記載しますので、ご自身でbatファイルを作成してください。尚、Windowsが開発環境になっていない、gitが環境変数に登録されていない場合は動きませんので悪しからず。必ず起動するときはコマンドからパラメーター投げて使ってください。
@echo off
if %1==main (
git config --global user.name "example"
git config --global user.email "mail@example.com"
)
if %1==sub (
git config --global user.name "test"
git config --global user.email "mail@test.com"
)
git config user.name
git config user.email
exeファイルの注意事項、PowerShellでもcmd.exeでも開けますが必ずgit-name.exeファイルが存在するディレクトリに移動してexeファイルをパラメーター付きで実行してください。
./git-name.exe main
main <==パラメーター
example <==githubのユーザー名
mail@example.com <==githubのメールアドレス
exeファイルのtoolはこちらからダウンロードしてください。
※尚、ウィルススキャン対象になった場合は対象から外してお使いください。
https://zip358.com/tool/git-name.zip
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
Bat, dat, exe, gitdata, github, Windows, zip, アカウント, エラー, お裾分け, ご自身, サーバ, サイト, シェル, スクリプト, それ, ツール, どこか, ファイル, プル, ユーザー, リモート, 中, 中身, 事, 人, 今日, 仕事, 個人, 処理, 感じ, 方, 日中, 最低限, 気温, 紹介, 考え方, 自分, 複数, 記載,
新時代なのかな、自分の身の丈を気づく時代なのか🤔
2022.01.14
こんにちは、ウォーキングをしながら今日のタイトルのことを考えていました。
今日のタイトルこと「新時代なのかな、自分の身の丈を気づく時代なのか🤔」なのですが、今そういう時代なんじゃないかって思えてならないです、どんなにあんぽんたんな人でもYOUTUBE何やらで情報を得られる世界です。そんな情報の中にはフェイク(嘘)な情報もあると思います。そんな人でもトライ・アンド・エラーを繰り返していく中で、自分の身の丈が分かってしまう世の中になっているような気がします。
要するに若いうちに自分の能力の限界というものをまざまざと知ってしまう、そんな世の中になっているような気がします。それは日本以外の国も民主国家なら同じだと思いますし、英語圏だともっと早く身の丈を知ることに繋がるじゃないのかなって思います。
良くも悪くも自分の能力の限界というモノを知る社会は大変だと感じます。自分に能力があれば何とかなるけれど弱者にはとても住みにくい社会になりつつあるだなって思えてならないのです。そしてそれはコロナ禍で加速していっているように思えます。
デジタルを使える人と使えないひとでも差が広がっているけれど、そのデジタルを使える人でも格差はこれからフルリモートという名の下で、地方の体力のない企業は淘汰されていくように思えてならないですね。今はまだ大丈夫だと思いますが、数年後には大企業にとって変われたりベンチャー企業に人材を取られてしまう可能性が徐々に高くなるのではないかと今から危惧しています。
- 第1位 プロジェクトマネージャー(オープン・WEB)平均年収670万円 …
- 第2位 プリセールス 平均年収599万円 …
- 第3位 社内システム企画 平均年収512万円 …
- 第4位 サーバーエンジニア 平均年収462万円
データ引用元:https://mynavi-agent.jp/knowledge/it/284.html
デジタル人材を雇う側は、これから先とても大変になっていくと思います、それぐらいお給料が高くなっていくと思います。
企業もひとも誰しもが身の丈を知ってしまう社会になっていくと、今までの社会構造では何れは成り立たなくなるように思えます、本当にベーシックインカムなどを導入していかなかればならない社会になるようにこの頃、思えてならないのです。
なので、恐らく数十年後には日本でも新たな社会構造が生まれると思います。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
youtube, アンド, あんぽんたん, ウォーキング, うち, エラー, こと, それ, タイトル, トライ, フェイク, もの, 世, 世界, 中, 人, 今, 今日, 嘘, 国, 国家, 大変, 弱者, 情報, 日本, 時代, 民主, 気, 社会, 能力, 自分, 英語圏, 身の丈, 限界,
T2がコードを10年書いている。Milliseconds-エラー対応編
2021.10.27
今回はエラー対応編です、ミリ秒を逐次表示するだけのコードだけどいろいろなひっかかる部分があるという事が動画を通して分かっていただければ幸いです。動画は高速なのでわかりにくいかもしれません、そんな人はgithubのヒストリーを閲覧ください。制作過程でどのような問題が現れたのかがわかると思います。
徐々に難しくなるかもしれませんが、一応、初心者が見て覚えると盗んで覚える、そして動画を見てプログラムって面白そうって思えるようなものを作っていきたいと思います。基本的に初心者がやってみたいなと思えるものを作っていければなと思っています。
思っていますが、それが出来るかは自分自身、分からないですけどね。なるべく心がけて作っていこうと思います。
https://github.com/zip358/T2_pg/commits/main/Milliseconds/assets/js/main.js
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
10, 2, github, Milliseconds-, いろいろ, エラー, コード, それ, ヒストリー, プログラム, ミリ, もの, 事, 人, 今回, 初心者, 制作, 動画, 問題, 対応, 秒, 自分, 自身, 表示, 過程, 部分, 閲覧, 高速,
C#でwebview2を使用して情報を収集するためのサンプルコード。
2021.08.22
今日は日曜日ですね。先日は久しぶりにお天気になったので外へ出ていっておりました。これを投稿する日は晴れているでしょうか。
さてjavaを勉強している合間にC#も勉強しております。javaを勉強しているとC#に応用が効くのでとてもやりやすいですね。webview2というオブジェクトをインストールして使用しました、VC#2019で開発しているのですが既存のwebBrowserというオブジェクトは全然というほど役に立ちません。例えばYahooのトップページを開いたらjavascriptエラーのアラートが表示されたりして動作してくれません。おそらくwebBrowserというオブジェクトを使用して何か開発している人はあまりいないじゃないかなと思います。
今回、作成したサンプルコードはYahoo!ニュースのITニュースのタイトルとリンクを収集するものですが、この方法を応用してブラウザの作業を自動化することはそれ程難しくないと思っています。
サンプルコードの一部を記載します=ボタンをクリックする場所に埋め込んだソースコードになります。因みにawaitを使用しているのでボタンクリックにはasyncしてあげる必要があります。
※注意事項としてYahoo!ニュースのソースコードが変わればそれに対応したコードを記載する必要があります。
PM> Install-Package Microsoft.Web.WebView2 -Version 1.0.902.49
async private void button1_Click(object sender, EventArgs e)
{
var result = await webView21.ExecuteScriptAsync(
"(()=>{let obj = document.querySelectorAll(\"#uamods-topics > div > div > div > ul > li > a\");" +
"let str = \"\";" +
"for (let i = 0; i < obj.length; i++)" +
"{" +
"str += obj[i].innerText + \"[\" + obj[i].href + \"],\";" +
"}" +
"return str;" +
"})();"
);
richTextBox1.Text = result.Replace(",","\n").Replace("\"","");
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, 2019, IT, java, javascript, VC++, webBrowser, webview, Yahoo, アラート, インストール, エラー, オブジェクト, コード, こと, これ, サンプル, タイトル, ため, ドップ, ニュース, ブラウザ, ページ, もの, リンク, 久しぶり, 人, 今回, 今日, 作成, 作業, 使用, 先日, 勉強, 動作, 収集, 合間, 外, 天気, 役, 応用, 情報, 投稿, 方法, 既存, 日, 日曜日, 自動, 表示, 開発,
TensorFlow Lite(テンソルフロー ライト)をインストールしモデル実行まで。
2021.06.14
ラズベリーパイ3にTensorFlow Lite(テンソルフロー ライト)をインストールしモデル実行まで軽く字幕で紹介した動画が下記になります。インストール方法は公式に書かれた通りに実行すれば上手くインストール出来るはずです。比較的に低スペックのマシンでも動くはずなのです、どうしてもエラーが出て動かないようであれば、それはおそらくあなたのマシンに問題があります?。
動画でハマりどころがあるという事をブログで解説しますと書いていますので、そのハマりどころを解説します。。。
TensorFlow Lite(テンソルフロー ライト)で動かす場合、label_image.pyの修正箇所が公式に書かれていると思いますが・・・?、ここで自分がハマり、実行するコマンドを打ってもパラメーターがどうたらというエラーが出力されて動きませんでした。結論から言うと原因はマスターのソースコードにあったのです。修正を要領よく修正しては駄目だった。直接的な原因となったのは–num_threadsのパラメーターを投げていたのが原因でした。
公式では下記の内容に変更しなさいと書かれています。tf.lite.Interpreterの部分を置き換えればよいだろうと思っていたのです。
interpreter = tf.lite.Interpreter(model_path=args.model_file)
マスターのソースコードは若干、公式とは違ってこのようなソースコードになっていました。
interpreter = tf.lite.Interpreter(
model_path=args.model_file, num_threads=args.num_threads)
渡す引数が一つ増えていたので、自分はそれを残していたのですが・・・?、これでは動かないのです。そう・・num_threads=args.num_threadsは削除してあげないとモデルを動かすことが出来なかったのです。それがわからず渡すパラメーターが駄目なんだとか思って四苦八苦していました。
自分みたいな修正方法している方も中にはいると思ったので、今回、初心者がハマった沼を紹介しました?。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
3, image, label, LITE, py, tensorflow, あなた, インストール, エラー, コード, ここ, コマンド, スペック, ソース, それ, テンソル, はい, パス, パラメーター, フロー, ブログ, マシン, マスター, モデル, ライド, ラズベリー, 下記, 事, 修正, 公式, 出力, 動画, 原因, 問題, 場合, 字幕, 実行, 方法, 箇所, 紹介, 結論, 自分, 解説, 通り,
簡易的なメールフォームとメール送信のプログラムを書くのにかかる時間は?
2021.05.28
簡易的なメールフォームとメール送信のプログラムを書くのにかかる時間は?大体10分?15分ぐらいかと思います。本当はエラーチェックなどの機能をちゃんとした物に置き換える必要があるけど、ざっくり考え方はこれだけで良いじゃないかなと思っています。下記のコードを制作するのに参考にしたサイトのリンクを貼っときますね。
https://techplay.jp/column/550、https://techacademy.jp/magazine/19300
上記のコードを拝借してコードを書き、簡易的な二重送信防止対策と簡易的なエラーチェックをプログラミングしていますが、ここにreCAPTCHAなどの機能を入れてあげるとボット対策にもなるので良いかもしれません。ソースコードを見て後から気づいたのですが、ポストしているnameのデータを受け取っていない事があとから気づきました。因みにPOSTの生データが欲しいと言うときはこのように書くと取得することが可能ですよ。
<?php
$data = file_get_contents('php://input');
?>
<?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">
<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.2/css/all.min.css">
<link rel="stylesheet" href="assets/css/style.css">
<title>sendmail</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-12">
<form method="post" action="./sendmail.php">
name<input class="form-control" type="text" name="name">
email<input class="form-control" type="text" name="email">
<div class="form-group">
<label for="my-textarea">Text</label>
<textarea id="my-textarea" class="form-control" name="text" rows="3"></textarea>
</div>
<input type="hidden" name="csrf_token" value="<?=$_SESSION['csrf_token']?>">
<?=$_SESSION["sendmail"]!=="ok"?'<button class="btn btn-primary" type="submit">submit</button>':"NG"?>
</form>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.slim.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>
<?php
session_start();
?>
<!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.2/css/all.min.css">
<link rel="stylesheet" href="assets/css/style.css">
<title>sendmail</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-12">
<?= EmailSend() ?>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.slim.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>
<?php
function EmailSend()
{
$check = function ($val = "") {
return isset($val) ? $val : false;
};
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$to = $_POST['email'];
$title = "test-mail";
$message = $_POST['text'];
$headers = "From: from@example.com";
if (
isset($_POST["csrf_token"])
&& $_POST["csrf_token"] === $_SESSION['csrf_token']
) {
if (($check($to) && $check($title) && $check($message)) && mb_send_mail($to, $title, $message, $headers)) {
$_SESSION["sendmail"] = "ok";
return "メール送信成功です";
} else {
$_SESSION["sendmail"] = "ng";
return "メール送信失敗です";
}
} else {
return "不正なリクエストです";
}
return false;
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
10, 15, 2, 550, 8, cHW, column, com, https, jp, name, POST, reCAPTCHA, techplay, watch, www, xqg-zp, youtube, あと, エラー, コード, ここ, これだけ, サイト, ソース, チェック, デー, データ, フォーム, プログラミング, プログラム, ポスト, ボット, メール, リンク, 上記, 下記, 事, 二, 制作, 参考, 大体, 対策, 後, 必要, 拝借, 時間, 本当, 機能, 物, 生, 簡易的, 考え方, 送信, 防止,
Electronの脆弱性でアレをtrue設定はNGですよね。
2020.11.23
Electron(エレクトロン)でrequire(りくわいあ)というものを使用するとエラーになります。Electronの昔のバージョンはこれが使用できたんだって今はこれを脆弱性対策のため、OFF(false)にしている。その設定をtrueにするとOK何だけど、これは公式では認めてない不正解の書き方だとさ。
function createWindow() {
mainWindow = new BrowserWindow({ width: 800, height: 600 , webPreferences: {
nodeIntegration: true
}});
じゃどうするれば良いのか?調べた結果、これが良いみたいです?。下記の書き方はちょっと面倒くさいけれども、こう書かなくては駄目だとさ。requireを使用しない場合はこんな感じで書かなくても良いです。
const path = require('path');
function createWindow() {
mainWindow = new BrowserWindow({ width: 800, height: 600 , webPreferences: {
nodeIntegration: false,
contextIsolation: true,
preload: path.join(__dirname, "preload.js")
}});
const { contextBridge, ipcRenderer} = require("electron");
const request = require('request');//使ってないけど?
contextBridge.exposeInMainWorld(
"hoge_hoge", {
send: (data) => {
consloe.log(data);
document.getElementById("hoge").innerHtml = "Hey!! " + data;
ipcRenderer.send("Hey!! " + data);
},
receive: (data) => {
consloe.log(data);
//ipcRenderer.on(channel, (event, ...args) => func(...args));
}
}
);
<button id="btn">Hey!!</button>
<span id="hoge"></span>
<script>
document.getElementById("btn").addEventListener("click",(e)=>{
window.hoge_hoge.send("hogeO!!");
});
</script>
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
600, 800, BrowserWindow, const, createWindow, Electron, false, function, Height, mainWindow, new, NG, nodeIntegration, off, OK, path, require, true, webPreferences, Width, アレ, エラー, エレクトロン, これ, ため, バージョン, もの, リグ, 下記, 不正解, 今, 何, 使用, 公式, 場合, 対策, 感じ, 昔, 書き方, 結果, 脆弱性, 設定, 駄目,
英語ができない人が思う英語の大切さ。プログラミング編。
2020.11.16
自分は英語ができない人の中に入る、まじで英語がわからないのでプログラミングでエラーにぶち当たると対応できないと思われるかもしれませんが、プログラミング歴が長いので何となく書いていることがようになってきている。訳せるわけではないが、何かわかるだよな、英語の記事もなんか書いていることがわかるレベル、たまに翻訳アプリに頼ることもあるけれど、何となく冷静に見るとわかるレベルになりました。
英語がわからないとプログラミングの上達できないかと言えば違うけれど、確かに彼の言っている通り上達には関係する。なのでやはり英語がわからなければ英単語を覚えることから始めると良いかもしれない。あと、英語に限らずだけど学ぶことを辞めたら、IT業界ではやっていけれないぞ!っと思います。日進月歩に技術が次々とでてくるのに勉強していなかったら、結構大変です。
あと、概念が理解できない人や部品から組み立る創造性も必要になります、そこら辺はセンスの問題かもしれない。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
IT, あと, アプリ, エラー, こと, センス, そこら辺, たま, プログラミング, まし, よう, レベル, わけ, 上達, 中, 人, 冷静, 創造性, 勉強, 大切, 大変, 対応, 彼, 必要, 技術, 日進月歩, 業界, 概念, 歴, 理解, 組み立, 翻訳, 自分, 英単語, 英語, 記事, 通り, 部品, 関係,
ping送信はエラー吐きまくり。
2020.11.03
FC2ブログ http://ping.fc2.com
Technorati JAPAN http://rpc.technorati.jp/rpc/ping
NAMAAN http://ping.namaan.net/rpc/
Blog People http://www.blogpeople.net/servlet/weblogUpdates
BulkFeed http://bulkfeeds.net/rpc
gooブログ http://blog.goo.ne.jp/XMLRPC
MyBlog Japan http://ping.myblog.jp
ココログ http://ping.cocolog-nifty.com/xmlrpc
ブログ村 Pingサーバー広場 http://ping.blogmura.jp/rpc/
Amagle ping service http://ping.amagle.com/
ブログスタイル http://blogstyle.jp/xmlrpc/
JUGEM http://jugem.jp/?mode=NEWENTRY
bolgoon http://www.blogoon.net/ping/
人気blogランキング http://blog.with2.net/ping.php/
ドリコム http://ping.rss.drecom.jp
エキサイトブログ http://ping.exblog.jp/xmlrpc
yahoo.com http://api.my.yahoo.com/RPC2
PING.BLOGGERS.JP http://ping.bloggers.jp/rpc/
上記のようなping一覧が在るけれど、実際機能していないものが多い。ping送信はもう時代遅れになりつつ在るのかもしれない。そんな時代遅れになりつつ存在なので、自分でping先をいちいち管理するのは、ナンセンスだと思いこの度、pingoo!(https://pingoo.jp/)というサービスのフリープランを使いだしました。因みにスパム屋さんなど、いろいろな方々が登録されているサービスなのでそれを覚悟でお試しください。
それとは別にping送信をコマンドラインから送信するPHPプログラムを作りました。自分が運用しているよさこい動画検索サイトに入れ込んでいます。ソースコードとコマンドは下記になります。
php ping.php ping
<?php
if ($argv[1]=="ping") {
$nglist = [];
$server = array(
"http://ping.fc2.com",//FC2ブログ
"http://pingoo.jp/ping/",//pingoo.jp
);
$site_name = "よさこい動画検索";
$url_parameter = explode("\n", file_get_contents("../data.csv"));
for ($i = 0; $i < count($server); $i++) {
foreach ($url_parameter as $key => $val) {
$parameter = explode(",", $val);
$parameter[0] = trim($parameter[0]);
$parameter[1] = trim($parameter[1]);
$site_url = "https://yosakoi-video.com/?id={$parameter[0]}&q=" . urlencode($parameter[1]);
$dev = $content = '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param><value>' . $site_name . '</value></param>
<param><value>' . $site_url . '</value></param>
</params>
</methodCall>
';
$options = array('http' => array(
'method' => 'POST',
'header' => 'Content-type: text/xml' . "\r\n"
. 'Content-length: ' . strlen($content),
'content' => $content
));
$context = stream_context_create($options);
$ret = @file_get_contents($server[$i], false, $context);
var_dump($server[$i]);
var_dump($parameter[0]);
//var_dump($ret);
}
}
}
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, Amagle, blog, BLOGGERS, bolgoon, BulkFeed, cocolog-nifty, com, fc, goo, http, https, JAPAN, jp, JUGEM, MyBlog, NAMAAN, People, ping, pingoo, service, Technorati, xmlrpc, Yahoo, いろいろ, エキサイト, エラー, ココログ, サーバー, サービス, スタイル, スパム, ドリコム, ナンセンス, プラン, フリー, ブログ, ブログ村, もの, ランキング, 一覧, 上記, 人気, 先, 存在, 実際, 広場, 度, 方々, 時代遅れ, 機能, 登録, 管理, 自分, 送信,
東証システム障害の考察してみた。#東証システム障害考察
2020.10.02
7時4分にアラートが上がっていた?が、現場がアラートに気が付かず、後続の処理が流れ売上の前処理バッチ処理が走った時点なのかな。そこでようやく現場がアラートが出ていることに気づく、この時点でベンダーに現場が支持を仰いだのか、マニュアル通りフェイルオーバーしたんだろう。フェイルオーバーさせたけど失敗。メモリリークがおそらく原因でサーバーの切り替えが出来なかった。ここでベンダーに支持を仰いだ可能性もありそう。そしてベンダーがここらへんから介入して監視端末のログなどを調査したら、メモリリークのエラーログを確認したんだと思う。
※失敗したジョブがどこかに格納されるだろう?。フェイルオーバーさせるより後続の処理をストップさせて、ベンダーに支持を仰いだ方が良かったのかもしれないなと。でも現場は混乱していただろう。
メモリーリークが起きていたと思うと実際は前処理バッチ処理をして失敗していたんだろう。遮断して本日の東証での取引は出来ないようにしたのは正解だと思う。
メモリリークの原因は、メモリの物理的破損だったのでメモリが悪いと判断した。メモリエラーが監視端末のログにクリティカルなエラーとして表示されていたのかは不明だけど、おそらく見落としだと思う。
7時時点で相場や売上の前処理を取り込むのなら、何だか整合性がつきそうです。おそらく手動で前処理が走るのではなく全自動で前処理が走るシステムだったんだろう。従業員が端末の監視も7時からだったのかな?
資料が時系列で書かれていないので良く分からないけど、自分なりに東証システム障害を考察してみた。
現場のヒューマンエラーも疑われるけど、末端の従業員は下請け業者何だろうな?。ベンダーは常時、東証システムの現場にいたのか?とかいろいろな事が問われるかもしれないよな。
おそらく本日から正常に東証は取引できると思います。メモリを取っ替えだろうしメモリチェックもしているだろうし。
最後に頑張れ東証システムの現場!!
末端が解雇されないことを切に願う、これで直ぐに切られたら次の職には絶対につけなくなるよ。でも末端が悪いという事ならば数年後、数ヶ月後にはクビになる可能性は高いかもな。
ちなみに上記が昨日のツイートまとめになります。
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
4, 7, アラート, エラー, オーバー, ここ, ここら, こと, サーバー, システム, ジョブ, ストップ, バッチ, フェイル, べん, ベンダー, マニュアル, メモリ, メモリー, リーク, ログ, 介入, 処理, 前処理, 原因, 取引, 可能性, 失敗, 実際, 後続, 支持, 方, 時点, 本日, 東証, 格納, 気, 混乱, 現場, 監視, 確認, 端末, 考察, 調査, 遮断, 障害,
JavaScriptのPromise例えが分からない人のために。
2020.06.06
自分は『Promiseってなんやねん、わからんわ。』という人でした。皆さん賢いので複雑怪奇なコードで教えてくれていて…わかんない。
Promiseって非同期処理にするための道具です。Promiseって書いてその中に非同期処理の内容を書いてあげる。値を戻したい場合は命名した名前のカッコの中に値を返してあげれば良いが!!、どうも渡せる値は一つだけなのだ。
ちなみにthen(その後)で、非同期処理が終わった後にする処理が書けるですね(´・ω・`)。thenの中に非同期処理の値も返ってくる‥但しひとまとめで、、そんだけの話。またエラーになった時の処理も対応できるってさ…、そしてチェーン(数珠繋ぎ)の様に書くことも可能です、ここではそれらは割愛しますね?。
ちなみに最初、asyncとawaitと混合していて悩んでおりました。asyncとawaitは対になっていると同じような感覚でPromiseとthenは対になっていると考えてください。あまり複雑怪奇に考えずサンプルコードを動かして出来るできないを判断した後に賢い人が書いたリファレンスなどを読むことをオススメします。
最後に単純なソースコードとコンソールの結果を載せときますね。
"use strict";
var a = 0;
const q1 = new Promise((zaru)=>{//zaru...名前付けは何でも良い(予約されているものでなければ
a++;
zaru(a + "1..");//データをまとめて返す
});
const q2 = new Promise((zaru)=>{
a++;
zaru(a + "2..");
});
const q3 = new Promise((zaru)=>{
zaru("3~~~~n");
});
const qdaaaaaaaa = new Promise((zaru)=>{
zaru([1,2,3,"Dahahaha!!"]);
});
Promise.all([q1,q2,q3,qdaaaaaaaa]).then((val)=>{
console.log(val);
}
);
qdaaaaaaaa.then((val)=>{
console.log(val);
});
Array(4) [1, 2, 3, "Dahahaha!!"]
move.js:26
length:4
__proto__:Array(0) [, …]
0:1
1:2
2:3
3:"Dahahaha!!"
Array(4) ["11..", "22..", "3~~~~n", Array(4)]
move.js:21
length:4
__proto__:Array(0) [, …]
0:"11.."
1:"22.."
2:"3~~~~n"
3:Array(4) [1, 2, 3, …]
length:4
__proto__:Array(0) [, …]
0:1
1:2
2:3
3:"Dahahaha!!"
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
async, await, javascript, Promise, then, エラー, かっこ, コード, ここ, こと, それら, そん, ため, チェーン, なん, ひとまとめ, 一つ, 中, 人, 但し, 値, 内容, 処理, 割愛, 可能, 同期, 名前, 命名, 場合, 対, 対応, 後, 感覚, 数珠繋ぎ, 時, 最初, 混合, 皆さん, 自分, 話, 道具,
PHP7でTwigを使う。
2020.05.10
Twigとは小枝であり、PHPのテンプレートエンジンであります。テンプレートエンジンが何なのかはぐぐってください。ここでは割愛します。
Twig3.x(3系)、Dumpの表示の仕方が書かれていないのでそれを記載します。記載方法は下記になります。特に記載方法が変わったのはデバッグの時の記述方法です、最初、デバッグ方法をググっていたのですが、全然上手くいかずエラーばかりはいていました。※Twig2系の情報が結構ヒットします。
require_once '/vendor/autoload.php';
$loader = new \Twig\Loader\FilesystemLoader('テンプレートの階層を指定');
$twig = new \Twig\Environment($loader,['debug' => true]);
$twig->addExtension(new \Twig\Extension\DebugExtension());//?ここの記述を忘れずに!!
echo $twig->render('index.html(レンダーするテンプレートファイル)', ['items'=>$this->top_view()]);
結局、公式ページのドキュメントにデバッグ方法が書かれていたのですが、それにたどり着くまで、小一時間ぐらいWEBの荒野をさまよっていました。最初からドキュメントを見ろよという教訓を得たのですが、結構ググる方を優先してしまう自分がいます。実際はドキュメントの中で検索するのが一番なのかもなと。皆さんが使用するようなエンジンはドキュメントを見るほうが良いと今回、痛感しました。これからはドキュメントを見るようにします。
https://twig.symfony.com/doc/3.x/functions/dump.html
著者名 @taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
2, 3, 39, 7, addExtension, autoload, debug, dump, Environment, FilesystemLoader, gt, loader, new, once, php, require, true, Twig, vendor, エラー, エンジン, ここ, それ, デバッグ, テンプレート, ヒット, 下記, 仕方, 何, 割愛, 小枝, 情報, 指定, 方法, 時, 最初, 表示, 記載, 記述, 階層,