- 投稿日:2022-03-03T22:56:58+09:00
ベル文字を出力して音を鳴らしてみた。
授業で正規表現の学習中に、ベル文字というモノがあることを知ってしまった。 コレは鳴らしてみないと ベル文字とは その昔、テレタイプなどの通信機器で、通信相手先の端末のベルを鳴らすために送信した制御文字(¥a)のようです。 さすがのオッチャンでも、テレタイプは現物見たことないので、よう解りません。 では、鳴らしてみます といっても、ベルが鳴るわけではなく、システムのアラート音(通知音)が鳴るだけですけどね。 まずJava Bell.java class Bell{ public static void main(String[] args) { System.out.print("\007"); } } javac Bell.java java Bell鳴りました。 シェルスクリプト Macなので Z Shellです Bell.sh #!/bin/zsh echo -e "\a" chmod 777 Bell.sh ./Bell.sh 鳴りました。 python Bell.py print("\a") python Bell.py で鳴りました。 php Bell.php <?php echo "\a"; echo "<br>"; echo "改行\nできてない。"; ?> 出力 \a 改行 できてない。 家の環境が悪いのか、コードが間違ってるのか、鳴りませんでした。 明日windowsのXAMMP下でどうなるのか試してみます。 最後に 小ネタにお付き合いいただき、ありがとうございました。
- 投稿日:2022-03-03T21:24:34+09:00
ニート日記やで^^
序 無職ニートです!!(唐突) 今日から週2投稿で「ニート日記」をやっていこうと思います。 もうすぐ大学卒業なのに就活をせず独学でプログラミングを学んでるのでガチで無職です… 新卒カァドすてちゃた…アセアセ ※文才がガチでありません。目も当てられません。自分の書いた文章を見直すたびに「またつまらぬ文章を書いてしまった…」といつも後悔してます。でもなるべく退屈しないような文章を心掛けていきます。 破 想定読者 ワタクシと同じような「ゆるゆるエンジニア」の方や「よわよわエンジニア」の方。 そして「ニートの生き様を見たい方」です。 ワタクシが書く記事の知識レベルは低いはずなので、つよつよの方は読んでて退屈すると思いまふ。 使用言語 日本語でぇーす(ニチャア)(激寒) Webアプリ開発がすこすこザムライなのでぺーえっちぺー(PHP)を使っていきます。 フレーミングワーキングはLaravel8を使っております。 データベースはMySQLでござんす。 2022年度の目標 来年度に年収600万円になるための土台を作ってきマンモスパオーン 急 とりま、読みたい人だけ読んでくださいませ。 読者増えたら読んでくれる方々に向けた文章をちゃんと書こうと思ってます。 いまは好きに独りごつしゃべってくぜ。ついてきてエビバディ。 ~fin~
- 投稿日:2022-03-03T20:51:19+09:00
FileAPIを使い「テキストファイルでキーワード変更可能」なタイピングソフトを作ろう!:JavaScrpt初級~中級者向け
Youtubeで公開した内容を記事にしました。 タイピングソフトを作ろう!【後編】「HTML/CSS/JavaScript/PHP...のキータイピング練習にも対応」JavaScript入門 以下Youtubeでの解説動画も張っておきます。(同じ内容ですが、詳しすぎるほど説明してます(笑)) YouTube https://youtu.be ◆ サンプルファイル Github からダウンロードしてご利用ください https://github.com/yamazakidaisuke/keytyping_youtube ◆ どんなキータイピングアプリ? 外部ファイルでキーワードを管理します、以下のように並べるだけ。 これはJavaScriptでFileApiを利用することで可能になります。 以下画面構成を見ていただければわかりますが、 上記のテキストファイルを読み込めば、オリジナルのキーワードをタイピングできます!! image.png ◆ 変数を準備 keytyping.html //*************************************** //グローバル変数 //*************************************** const G = { read_file : document.getElementById("file"), //File選択 output_text : document.getElementById("output_text"), //キーワード表示 input_text : document.getElementById("input_text"), //キーワード入力 start : document.getElementById("start"), //スタートボタン total : document.getElementById("total"), //点数表示 texts : [], //配列でキーワード入ってくる //読み込んだキーワードを配列で保持 score : 0 //点数を保持 } ◆関数(処理)を記述 keytyping.html //*************************************** //関数 //*************************************** //ファイルを選択読み込む(FileAPIを利用) function readFile(e){ const file = e.target.files[0]; //ファイル情報を代入 const reader = new FileReader(); //インスタンス化 reader.onload = function(){ //読込み完了後にloadする G.texts = reader.result.split("\n"); //配列変換して代入 }; reader.readAsText(file); //textFileをRead } //テキストをランダムに表示 function shuffleText(){ G.input_text.value=""; //入力文字を削除 const rf = Math.random() * G.texts.length; const r = Math.floor(rf); //整数の乱数を作成 G.output_text.value = G.texts[r]; //n番目テキストを表示 } //キーを押すたびに処理 function keyEvent(e){ if(G.output_text.value === G.input_text.value){ shuffleText(); //ランダムにテキストを再表示 G.score++; //スコアに+1 G.total.textContent = G.score; //表示を入れ替える } } ◆ イベントと関数の紐づけ keytyping.html //*************************************** //イベントと関数の紐づけ //*************************************** G.start.onclick = shuffleText; G.read_file.onchange = readFile; G.input_text.onkeydown = keyEvent; 以下Youtube動画で詳しく解説してるので、どうぞ見てください! ◆ どうでしたか? そこそこできる人は上記の解説・コードで十分だったかと思いますが、 初学者であれば、動画で詳しくやってみてください。 以上
- 投稿日:2022-03-03T20:51:19+09:00
JavaScript入門:タイピングソフトを作ろう!「 キーワード簡単編集で自分の練習したい文字列に変更可能 」
Youtubeで公開した内容を記事にしました。 タイピングソフトを作ろう!【後編】「HTML/CSS/JavaScript/PHP...のキータイピング練習にも対応」JavaScript入門 以下Youtubeでの解説動画も張っておきます。(同じ内容ですが、詳しすぎるほど説明してます(笑)) ◆ サンプルファイル Github からダウンロードしてご利用ください https://github.com/yamazakidaisuke/keytyping_youtube ◆ どんなキータイピングアプリ? 外部ファイルでキーワードを管理します、以下のように並べるだけ。 これはJavaScriptでFileApiを利用することで可能になります。 以下画面構成を見ていただければわかりますが、 上記のテキストファイルを読み込めば、オリジナルのキーワードをタイピングできます!! ◆ 変数を準備 keytyping.html //*************************************** //グローバル変数 //*************************************** const G = { read_file : document.getElementById("file"), //File選択 output_text : document.getElementById("output_text"), //キーワード表示 input_text : document.getElementById("input_text"), //キーワード入力 start : document.getElementById("start"), //スタートボタン total : document.getElementById("total"), //点数表示 texts : [], //配列でキーワード入ってくる //読み込んだキーワードを配列で保持 score : 0 //点数を保持 } ◆関数(処理)を記述 keytyping.html //*************************************** //関数 //*************************************** //ファイルを選択読み込む(FileAPIを利用) function readFile(e){ const file = e.target.files[0]; //ファイル情報を代入 const reader = new FileReader(); //インスタンス化 reader.onload = function(){ //読込み完了後にloadする G.texts = reader.result.split("\n"); //配列変換して代入 }; reader.readAsText(file); //textFileをRead } //テキストをランダムに表示 function shuffleText(){ G.input_text.value=""; //入力文字を削除 const rf = Math.random() * G.texts.length; const r = Math.floor(rf); //整数の乱数を作成 G.output_text.value = G.texts[r]; //n番目テキストを表示 } //キーを押すたびに処理 function keyEvent(e){ if(G.output_text.value === G.input_text.value){ shuffleText(); //ランダムにテキストを再表示 G.score++; //スコアに+1 G.total.textContent = G.score; //表示を入れ替える } } ◆ イベントと関数の紐づけ keytyping.html //*************************************** //イベントと関数の紐づけ //*************************************** G.start.onclick = shuffleText; G.read_file.onchange = readFile; G.input_text.onkeydown = keyEvent; 以下Youtube動画で詳しく解説してるので、どうぞ見てください! ◆ どうでしたか? そこそこできる人は上記の解説・コードで十分だったかと思いますが、 初学者であれば、動画で詳しくやってみてください。 以上
- 投稿日:2022-03-03T15:15:05+09:00
PHP エラー 'headers already sent' 参考サイト
このエラーは HTTP ヘッダーを変更する関数(header 等)の呼び出しより前に、すでに何かがアウトプットされているために発生する。 アウトプットには以下のようなものがあります。 意図していないアウトプット <?php の前や、?> の後にある、スペースや改行の出力 PHP ファイルの先頭にある UTF-8 の BOM の出力 PHP による Error や Warning メッセージ出力 意図したアウトプット print、echo、readfile、passthru など出力を伴う関数での出力 <?php の前や、 <?php 〜 ?> の外にある、生の <html> コードなどの出力
- 投稿日:2022-03-03T14:02:32+09:00
LaravelでselectRawでバインドした時に「Invalid parameter number」エラー発生
状況 LaravelでselectRawを使いselect文を書き、バインド変数を設定しクエリを発行したところInvalid parameter numberのエラーが発生した。 $data = 100; $query = self::selectRaw( "'?' as test_column", [$data] ); return $query->get()->toArray(); message: "SQLSTATE[HY093]: Invalid parameter number (SQL: select '100' as test_column from `test_table`)" Invalid parameter number(パラメータの数合ってないよ!)ってなってるけど、バインド変数の数(selectRawの第2引数)もあってるし、エラーで出力されてるSQL見るとちゃんとバインドされてるし何でだ。。。と途方に暮れました。。。 https://readouble.com/laravel/8.x/ja/queries.html 結論 バインド変数の前後の'(シングルコーテーション)を削除したら問題なく動いた $data = 100; $query = self::selectRaw( "? as test_column", [$data] ); return $query->get()->toArray(); 本来もっと複雑なSQLでの出来事だったので、数値型の値を文字列として連結して扱いたかったので、シングルコーテーション無しで?を書き、CONCATを使って連結して文字列にすることで解決 CONCAT('Point(', ?, ' ', ?, ')')) AS `test_column`" 補足 'で値をくくっても問題なく値は取得できる(取得した値がstring型かint型かの違い) $query = self::selectRaw( "'100' as test_column", ); return $query->get()->toArray(); // 問題なく動作する $query = self::selectRaw( "100 as test_column", ); return $query->get()->toArray(); // 問題なく動作する 考察 エラーメッセージからすると、バインド変数の数(?の数)とバインドする値の数(selectRawの第2引数の配列の長さ)が一致していないエラーなので、Laravelの中でSQLの中のシングルコーテーションの中にある?の数の算出がうまくいっていないものと考えられる。 ちょっとソースコード読んでみるかな。。。
- 投稿日:2022-03-03T12:38:27+09:00
laravel学んで2か月で自サービスを開発した話 Part5
皆さんこんにちは、本格的な勉強会に参加したら???になった私です。 今までの開発記録はこちらへ 胡蝶蘭を捨てるくらいならワイが欲しいので、サービス開発する編 公式ドキュメントの言う通り、パッケージをインストールされたら、Inertia.jsが導入されて???になった編 マルチログインを作ってみた編 デザインをtailwindcssに丸投げする編 いよいよユーザー画面を作る 今回の目的はユーザーのプロフィール画面 そのために必要なものは ユーザー詳細表示機能 ユーザー編集機能(Adminでやったひな型を使いまわす) 画像取り込み機能 退会機能 まずはユーザー詳細機能を作っていく ルートはresourceを利用してもよかったが今回は普通に作成 web.php Route::prefix('profiles')->middleware(['auth:users'])->group(function () { Route::get('show/{profile}', [ProfileController::class, 'show'])->name('profiles.show'); Route::get('edit/{profile}', [ProfileController::class, 'edit'])->name('profiles.edit'); Route::post('update/{profile}', [ProfileController::class, 'update'])->name('profiles.update'); Route::get('destroy/{profile}', [ProfileController::class, 'destroy'])->name('profiles.destroy'); Route::post('destroy/{profile}', [ProfileController::class, 'destroy'])->name('profiles.destroy'); }); コントローラー側 ProfileController.php namespace App\Http\Controllers\User; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\User; use App\Models\Review; use App\Models\Product; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Auth; use App\Http\Requests\UploadImageRequest; use App\Services\ImageService; use Illuminate\Validation\Rules\Password; class ProfileController extends Controller { public function show($id) { $userProfile=User::findOrFail($id); return view('user.profiles.show', compact('userProfile')); } public function edit(Request $request, $id) //リクエスト入れる { $id=$request->route()->parameter('profile'); if (!is_null($id)) { $userId=User::findOrFail($id)->id; $currentUserId=(int)$userId; $authId=Auth::id(); if ($currentUserId!==$authId) { abort(404); } } $userProfile = User::findOrFail($id); return view('user.profiles.edit', compact('userProfile')); } public function update(UploadImageRequest $request, $id) { $id=$request->route()->parameter('profile'); if (!is_null($id)) { $userId=User::findOrFail($id)->id; $currentUserId=(int)$userId; $authId=Auth::id(); if ($currentUserId!==$authId) { abort(404); } } $request->validate([ 'name' => ['required', 'string', 'max:255'], 'comment' => [ 'string', 'max:200'], 'password' => ['required', 'confirmed','string', Password::defaults()], 'prefecture' => ['string', 'max:50'], 'comment' => ['string', 'max:100'], ]); $userProfile = User::findOrFail($id); $imageFile=$request->image; if (!is_null($imageFile)&&$imageFile->isValid()) { // Storage::putFile('public/profiles', $imageFile);//リサイズなし $fileNameToStore=ImageService::upload($imageFile, 'profiles'); } $user=User::findOrFail($id); $user->name=$request->name; $user->comment=$request->comment; $user->prefecture=$request->prefecture; $user->password=Hash::make($request->password); if (!is_null($imageFile)&&$imageFile->isValid()) { $user->img=$fileNameToStore; } $user->save(); return redirect() ->route('user.profiles.show', ['profile' => $userProfile->id]) } public function destroy(Request $request,$id) { $this->middleware('auth:users'); //直接別ユーザーにアクセスするとはじくシステム $this->middleware(function ($request, $next) { $id=$request->route()->parameter('profile'); if (!is_null($id)) { $userId=User::findOrFail($id)->id; $currentUserId=(int)$userId; $authId=Auth::id(); if ($currentUserId!==$authId) { abort(404); } } return $next($request); }); try { DB::transaction(function () use ($id) { Product::select('id', ) ->where('user_id', Auth::id())->delete(); User::select('id', 'name') ->where('id', Auth::id())->delete(); }, 2); //試行する回数 } catch (Throwable $e) { Log::error($e); throw $e; } Auth::guard('users')->logout(); return redirect('/'); } } Adminのコントローラーの使いまわしだけれど、ところどころそうではない部分があるので一つずつ説明 showメゾット Userテーブルから、入力されたidの情報を取り出して終わり editメゾット ユーザー情報詳細はほかの人からも見られてもいいけれど、ユーザー編集、削除は本人以外からのアクセスをはじくようにする。 最初は、__constructに記述したが、それだとユーザー情報表示も見られなくなっちゃうので、edit,update,deleteのメゾットに書いたのがこれ。 ProfileController.php $id=$request->route()->parameter('profile'); if (!is_null($id)) { $userId=User::findOrFail($id)->id; $currentUserId=(int)$userId; $authId=Auth::id(); if ($currentUserId!==$authId) { abort(404); } } このコードが何を示しているかというと、ユーザーがアクセスしようとしているIDとログイン中のIDを照合して一致していれば、次の処理進み、そうでない場合は404ではじき返す仕組みです。 もう少し中身を見ていくと まずはddヘルパーを利用して、$request->route()を入力すると。 このような画面が出ます parametersのところに"1"がありますね。 $request->route()->parameter('profile')で"1"を取得しましょう。 その後、Userテーブルから、そのidを取得 ただし、このidは文字列で、照合したいAuth::id()は数字だから一致しません。 そのためidを数字に変換 あとはif文で照合させるだけです 画像の取り込み webサイトには必須な機能ですね! ただ画像をアップロードして表示するのだったら、素でもできますが、 と怒られそうなので、画像のリサイズをするためにInterventionImageを利用します composer require intervention/image インストールが終わったらconfig/app.phpへ app.php 'providers' => [ Intervention\Image\ImageServiceProvider::class, ], 'aliases' => [ 'InterventionImage'=>Intervention\Image\Facades\Image::class ], を追記して php artisan cache:clearを押しましょう。 あとはuse InterventionImageで利用できる。 このサイトでも、ユーザーの画像、商品画像には画像をアップロードさせるシステムを作る必要がある。 そうなると2つの問題点が出てくる 画像名が重複せずにどうやって保存するか どこに保存するか 一つ目の問題について、アップロードした画像名をランダムに変更するプログラムを作る 二つ目の問題については、laravelのstorageフォルダに保存する コードが多くなるのと商品投稿のコントローラーとも共有したいので、UploadImageRequestとImageServiceに切り分けて作成 UploadImageRequest.php public function authorize() { return true; //falseになっているのでtrueに切り替える } public function rules() { return [ 'image' => 'image|mimes:jpg,jpeg,png|max:2048', ]; } public function message() { return [ 'image' => '指定されたファイルが画像ではありません', 'mines' => '指定された拡張子(jpg/jpeg/png)ではありません', 'max' => 'ファイルサイズは2MB以内にしてください', ]; } ImageService.php class ImageService { public static function upload($imageFile, $folderName) { $fileName=uniqid(rand().'_'); //ファイル名をランダムに生成 $extension=$imageFile->extension(); //拡張子を判別 $fileNameToStore=$fileName.'.'.$extension; //上二つの文字列をつなげる $resizedImage=InterventionImage::make($imageFile)->resize(400, 400)->encode(); //InterventionImageがリサイズしてくれる Storage::put('public/'.$folderName.'/'.$fileNameToStore, $resizedImage); //storageフォルダのpublicフォルダに$folderNameを作成(今回はProfiles)して保存 return $fileNameToStore; } } 準備は整ったのでコントローラーにも追記 if (!is_null($imageFile)&&$imageFile->isValid()) { $fileNameToStore=ImageService::upload($imageFile, 'profiles');//ImageServiceに画像ファイルとフォルダ名の情報を送る } if (!is_null($imageFile)&&$imageFile->isValid()) { $user->img=$fileNameToStore; //データベースに生成されたランダム名を書き込む } これで画像の保存はOKです よし、これで大量の画像があっても重複せずに処理ができるぞい! herokuに上げても大丈夫や! あのお・・・herokuのストレージの画像は一定時間で消えますよ えええええええ!! Herokuでアップロードした画像が時間経つと消える問題 対処法AWS使うのかよ・・・ 今回で終わらなくてごめんなさい 次回はAWSに挑んできます