- 投稿日:2020-09-24T23:42:06+09:00
Laravel 簡単なページネーション機能を作成
Laravelには、とても便利なページネーション機能があります。
今回はEloquentモデルで実装してみたいと思います。やり方
1 コントローラーに以下を追加する
$users = User::paginate(10);
2 viewに$usersを渡してあげて表示する
3 ページ番号の前と後の矢印を表示するために、
viewに{{ $users -> links(); }}
を書いてあげるこれだけでページネーション機能を作れるので楽ですね。
- 投稿日:2020-09-24T21:36:06+09:00
LaravelでSocialiteで404エラーから抜け出せなかった自分
LaravelでSocialiteで404エラーから抜け出せなかった自分
こんばんは。
LaravelでTwitterやGoogle,GitHub,Facebookなどでログインを実装にはSocialiteが便利です。環境はLaravel8系でuiを使ってTwitterAPIによる認証を試みました。
リダイレクトした際にどうもエラーが出るんですよね。
XAMPPWを使うとObject not found! 要求された URL は本サーバでは見つかりませんでした。 もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。 サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。 Error 404こんな感じ。
これの原因解決に2日を要したのですが、結局の所.env内のCALLBACK_URLが
http://localhost/login/twitter/callbackとなっていたのが問題みたいです。
Laravelで普通にphp artisan serveするとlocalhost:8000で開かれます。
でも上のURLだと:8000がないんです。なので.env内とTwitterDeveloperの箇所をhttp://localhost:8000/login/twitter/callbackこうするとうまくいきます。
こんなちょっとのところに1日以上悩んでしまいました。
- 投稿日:2020-09-24T21:30:39+09:00
2020年で最も需要のあるプログラミング言語
本記事はMost in-demand programming languages in 2020の日本語訳です。翻訳元に報告していますが、もし苦情が来たら消します。
翻訳は不慣れなので変なところもあると思いますが、ご容赦ください。
ソフトウェア開発業界は絶えず変化しており、それは開発者の能力に対する企業のニーズも変化していることを意味します。そのため、あなたが想像できるように、Webアプリケーション、ゲーム、アルゴリズムなどのあらゆる側面の開発をカバーするために、選択できるプログラミング言語はたくさんあります。その上で、私たちは2020年で最も需要のあるプログラミング言語とその主な特徴について触れます。
- JavaScript (回答者の71%がこのスキルに関する求職者を探している)
- Java (57%)
- C# (53%)
- Python (51%)
- PHP (40%)
- Ruby (15%)
JavaScript
JavaScriptが2020年で最も需要のあるプログラミング言語リストのトップであることは全く不思議ではありません。
今日では何らかの方法でJavaScriptを使用することなしに開発者になることは不可能です。調査の回答者の71%以上がJavaScriptでコードを書ける開発者を探しており、JavaScriptが最も人気のあるプログラミング言語のうちの一つであることが想像できます。また、JavaScriptはWebにおける遍在性と私たちのインターネットへの重い依存のため、非常に人気があります。Twitter、Facebook、YouTubeなどの最も人気のあるサイトの多くは、JavaScriptを使ってインタラクティブなWebページを生成したり、コンテンツを動的にユーザに表示したりしています。
JavaScriptはコア言語があり、追加の開発ツールによって柔軟性が保たれています。JavaScriptは寛大で柔軟な構文を持ち、全てのメジャーなブラウザで動作するため、初学者にとって最も簡単なプログラミング言語の一つです。今日、JavaScriptは世界中で広く使用されているプログラミング言語であり、あらゆるところで動作します:コンテナ、マイクロコントローラ、モバイル端末、クラウド、ブラウザ、サーバなど。
主な特徴
- JavaScriptはここ数年で大規模な現代化と徹底的な点検を経てきました。ES5、ES6といったJavaScriptのメジャーなリリースではいくつかのモダンな機能が追加され、今日のJavaScriptは10年前のJavaScriptとは完全に別物です
- Node.jsのおかげでJavaScriptはイベント駆動なプログラミングを提供し、特にI/Oの複雑なタスクに適しています。今日では、Node.jsとJavaScriptは、サーバとモバイル端末を含めてほとんど全てのプラットフォームで動作します
- JavaScriptはブラウザプログラミングにおいて、議論の余地のない王様です。今日、Web開発は主にVue.js、Angular、ReactといったJavaScriptベースのSPAフレームワークによって支配されています
Java
Javaは2020年で最も需要のあるプログラミング言語リストで2位の座を手にしています。
Javaは、ビジネスでは最も人気のモバイルコンピューティングプラットフォームであるAndroidのネイティブ言語であることから人気のあるプログラミング言語です。
Javaは過去数年の間に、非常にユーザに優しいモダンな言語にビジネスの一部を奪われました。
Javaは欠陥の改善に取り組んでおり、GraalVMアクションを介してクラウドにフィットさせる努力をしています。Javaはまだエンタープライズではナンバーワンのプログラミング言語です。Javaは誕生してからずっとトップクラスの需要があるプログラミング言語です。大企業の多数がバックエンドWebシステムやデスクトップアプリケーションのためにJavaを使っているため、もし開発者がJavaを知っていれば、その開発者は継続的に需要が高い状態になるでしょう。Javaは静的型付けの言語で、そのためバグが少なく、メンテナンスを速く行えて管理しやすいです。
主な特徴
- Javaはマルチパラダイムを提供し、強力で、多機能で、柔軟な学習曲線と高い生産性を持つインタプリタ型のプログラミング言語です
- Javaは厳格な後方互換性を持ち、これはビジネスアプリケーションにとって重要な要件です。JavaではScalaやPythonのようなメジャーな破壊的変更が取り入れられたことはありません。その結果、Javaはいまだにビジネスにとってナンバーワンの選択肢です
- JavaのランタイムであるJVMはソフトウェア工学の結晶で、ビジネスにおいて最高の仮想マシンの一つです。何年もの技術革新とエンジニアリングの職人技により、JVMは素晴らしい機能と性能をJavaに提供します。JVMはいくつかの優秀なガベージコレクションもJavaに提供しています
C#
C言語1は、移植性と、AppleやMicrosoftのような巨大なIT企業から早期に採用されたことのおかげで最も古くて最も人気のあるプログラミング言語のうちの一つとなった言語です。
C-sharpとしても知られるC#は、2000年にMicrosoftによって開発された、C言語のスピンオフです。C#はオブジェクト指向言語で、アクションの代わりにオブジェクトを中心に、ロジックの代わりにデータを中心に構築されます。C#の特徴はJavaと似ており、Windowsのデスクトップアプリケーションとゲームを開発するのに特に有効です。しかし、C#はWebアプリケーションとモバイルアプリケーションを開発するのにも使えます。C#はC++のようなC派生の言語に似た構文を使っており、あなたがCファミリーの中の別の言語から来たのであれば簡単に習得できます。C#は銀行のトランザクション処理のような大企業のアプリケーションの開発にしばしば使われます。C#は人気のUnityゲームエンジンを使った2Dや3Dのビデオゲームを作るために推奨される言語です。今日では、C#はWindowsプラットフォームにおいてだけでなくLinuxプラットフォームやiOS/Androidプラットフォームでも幅広く使用される、マルチパラダイムな言語です。
主な特徴
- C#はプラットフォーム非依存でもあり、Linux、Windows、モバイル端末で動作します
- Microsoftの後ろ盾があり、長年に渡り業界にいるC#はライブラリとフレームワークの大きなエコシステムがあります。ASP.NETはWebアプリケーション開発に使われます(主にWindows上での)
- 開発者体験という面では、C#はJavaよりはるかに優れています
Python
Pythonはおそらくこのリストの中で最もユーザに優しいプログラミング言語です。Pythonの構文は明確で、直感的で、ほとんど英語だとよく言われ、初学者にとって本当に良い選択肢です。Pythonは高レベルで、汎用性が高く、Webアプリケーションやデータ解析、アルゴリズムの開発などに使われます。Pythonは、科学計算やエンジニアリング、数学といったフィールドで頻繁に使われるSciPyやNumPyのようなパッケージも持っています。
Pythonはスクレイピングにしばしば使われ、PHPでコーディングするのに何時間もかかるものが、Pythonだと数分しかかかりません。Pythonは、あなたの時間を消費する日々のタスクを含む特定の作業を自動化するためにも使うことができます。もしバックエンドのWeb開発の例に興味があれば、オープンソースの(Pythonで書かれた)Djangoフレームワークは人気で、学ぶのが簡単で、多機能です。そしてJavaのように、Pythonには多様なアプリケーションがあり、あなたのユースケースのために最も良いプログラミング言語を選択する時に、多様で強力な選択肢となります。今日、Pythonは広く行き渡り、ソフトウェア開発の多くの分野で使用され、そしてその勢いが衰えるようには見えません。
主な特徴
- Pythonには非常に活発なコミュニティとサポートがあります。たとえあなたがデータサイエンス、業務アプリケーション、AIのどれで働いているのだとしても、常に十分なPythonの組織2やフレームワークが見つかります
- Pythonには第一級のC++/Cとの統合機能があり、CPU負荷の高いタスクをシームレスにC++/Cにオフロードすることができます。Pythonは、SciPy、Pandas、NumPyなど、統計、Scikit-Learn3、数学、および計算科学のための素晴らしいツールセットも提供します。 結論として、Pythonは機械学習/ディープラーニング/データサイエンスの状況やその他の科学的な領域を支配しています
- Pythonのウリはその言語設計にあります。それは生産性が高く、エレガントで、シンプルで、その上強力です。Pythonは開発者経験という面で黄金律を設定し、Julia、Goといったモダンな言語に対して多大な影響を与えました
PHP
たとえ多くの論争があるとしても、PHPは2020年で最も需要のあるプログラミング言語リストに入っています。
PHPは幅広く使用されているオープンソースの汎用スクリプト言語で、典型的にはWebアプリケーション開発に適しています。たとえ以前ほどではないとしても、PHPは依然として世界中で最も用いられているプログラミング言語のうちの一つです。PHPはFacebookやYahoo!といった多数の大きな会社によって使用されています。PHPは汎用的で、動的な、基本的にはサーバサイドのWebアプリケーションの開発のために使用されているプログラミング言語です。
PHPはJavaScriptのような新しいWeb言語が実現するまでずっと、ほとんど全てのモダンなWebサイトを構築可能にしました。いくつかの調査によると、PHPがWebの3分の1を支えているとのことです。たとえPHPが以前ほどは注目されていないとしても、PHPは今後何年にもわたって進化を継続し、最も人気のあるプログラミング言語のうちの一つとしての地位を維持するでしょう。
主な特徴
- 多くの大きな会社がPHPを使用しており、そのための素晴らしいツールのサポートに繋がっています
- PHPはWebアプリケーション開発に過去25年4に渡って使用されており、強力で安定したPHPフレームワークが数多く市場に存在します
- PHPは非常に生産性が高いサーバサイドWeb開発プログラミング言語のうちの一つです。結果として、Webアプリケーションを素早く開発するために、IT業界で広く使われています。最も有名なSNSの一つであるFacebookはPHPで開発されました
Ruby
特に、Rubyは人気のあるRuby on Rails Webアプリケーションフレームワークのための基盤として使われます。RubyはC言語で実装され、ガベージコレクタがあります。Rubyは90年代半ばに作られましたが、ここ10年ほどの間に人気を獲得しました。Rubyは非常に動的で、オブジェクト指向言語で、プログラマーが使うための様々な機能を持っています。Rubyの経験が6年以上ある開発者は、現在の採用状況では2倍の面接依頼を受けることが期待できます。
Twitter、Shopify、そして多くのスタートアップがいずれかの段階でRuby on Railsを使ってWebサイトを構築しています。Rubyはまた、素晴らしいハイテク企業との関連性のために選び出すには本当に良い言語です。5
Pythonのように、Rubyは開発者の生産性と幸福を非常に重視しています。Rubyは新しい開発者にとって学習曲線がフラットになる非常に優れた言語でもあります。主な特徴
- RubyはTwitter、GitHub、Airbnbのような最大級のソフトウェアプロジェクトで使われ、そして素晴らしいツールとフレームワークの支援があります
- Rubyそれ自体は破壊的ではありませんが、RubyのWeb開発フレームワークであるRuby on Railsはおそらく最も破壊的で、影響力のあるサーバサイドWeb開発フレームワークです
- Rubyはプログラミング言語の最高の機能のうちのいくつかをうまく利用してきました: 簡潔さ、動的、ガベージコレクタのあるオブジェクト指向、そして関数型です
- 投稿日:2020-09-24T20:12:35+09:00
foreachを使って並び替え
index.php<?php $a = array( 1 => array(1, 0), 2 => array(2, 1), 3 => array(3, 1), 4 => array(4, 1), 5 => array(5, 0), 6 => array(6, 0), 7 => array(7, 0), 8 => array(8, 5), 9 => array(9, 5), ); $b = array(); foreach ($a as $key => $value1) { //value1の2番目が0だったら処理を通す if ($value1[1] == 0) { $b[] = $value1; //valueの1の1番目とvalue2の2番目が一緒だったら処理を通す foreach ($a as $key2 => $value2) { if ($value1[0] == $value2[1]) { $b[] = $value2; } } } } $a = $b; print_r($a);結果
php.phpArray ( [0] => Array ( [0] => 1 [1] => 0 ) [1] => Array ( [0] => 2 [1] => 1 ) [2] => Array ( [0] => 3 [1] => 1 ) [3] => Array ( [0] => 4 [1] => 1 ) [4] => Array ( [0] => 5 [1] => 0 ) [5] => Array ( [0] => 8 [1] => 5 ) [6] => Array ( [0] => 9 [1] => 5 ) [7] => Array ( [0] => 6 [1] => 0 ) [8] => Array ( [0] => 7 [1] => 0 ) )
- 投稿日:2020-09-24T20:07:16+09:00
【PHP】ユーザーの検索機能
PHPについて学習内容を備忘録としてまとめます。
ユーザーの検索機能を実装しましたので、作成方法を記載します。検索フォーム作成
まずはユーザーを検索するためのフォーム画面を表示させます。
内部では入力した値が入ったユーザー名を検索する処理を行います。//ユーザーを検索するフォーム <form method="post" action="#" class="search_container"> <input type="text" name="search_input" placeholder="ユーザー検索"> <input type="submit" name="search_user"> </form>
placeholder
を設定しフォーム画面にはデフォルトでユーザー検索
と表示させます。検索機能を動かす
先ほど作成した検索フォームと同じphpファイルに下記コードをかきます。
header関数があるのでなるべくファイルの上部にかくことを推奨します。<?php if (!empty($_POST['search_user'])){ $hoge = $_POST['search_input']; header("Location:user_list.php?type=search&query=${hoge}"); } ?>こちらは検索フォームが検索されたときに動く処理です。
user_list.php
はユーザー一覧画面になっており、今回の検索機能を実装する対象のファイルなのですが、
検索機能が動いたときにuser_list.php
にリダイレクトしtype=search
でtype
の値を指定し、query=${hoge}
で検索フォームの値を取り出しています。検索機能の処理
それでは受け取った値を元にユーザーを表示させていきます。
$page_type = $_GET['type']; switch ($page_type) { case 'all'; $users = get_users('all',''); break; case 'search': $users = get_users('search',$_GET['query']); break; } foreach((array)$users as $user): print'<br />'; print '<a href="../user/user_disp.php?user_id='.$user['id'].'">'.$user['name'].'</a>'; endforeachまず
$page_type = $_GET['type'];
でURLからtype
の値を取り出して$page_type
に渡します。
そして$page_type
の値によって出力するユーザーを変更します。
ユーザーを取り出す際にはget_users
関数を使って取り出します。
get_users
関数は下記のようになっています。function get_users($type,$query){ try { $dsn='mysql:dbname=shop;host=localhost;charset=utf8'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); switch ($type) { case 'all': $sql = "SELECT id,name,password,profile FROM user WHERE delete_flg = 0"; $stmt = $dbh->prepare($sql); $stmt->execute(); return $stmt->fetchAll(); break; case 'search': $sql = "SELECT id,name,password,profile FROM user WHERE name LIKE CONCAT('%',:input,'%') AND delete_flg = 0"; $stmt = $dbh->prepare($sql); $stmt->bindValue(':input', $query); $stmt->execute(); return $stmt->fetchAll(); break; } } catch (\Exception $e) { error_log('エラー発生:' . $e->getMessage()); set_flash('error',ERR_MSG1); } }引数で渡された値を元に処理を分岐して
$query
の値から取り出すユーザーを指定しています。
WHERE name LIKE CONCAT('%',:input,'%')
で検索フォームに入力された値が入っているユーザー名を出力しています。foreach((array)$users as $user): print'<br />'; print '<a href="../user/user_disp.php?user_id='.$user['id'].'">'.$user['name'].'</a>'; endforeach最後に取り出したユーザー名を表示させれば実装完了です。
参考URL
- 投稿日:2020-09-24T20:02:56+09:00
PHPのhtmlspecialcharsを使用する時は出力時だろ
はじめに
少し前に、一緒に開発していた人物にPHPのhtmlspecialcharsを入力時に使用してサニタイズをしている人がいたので、出力する時に使用してくれといったら別にサニタイズする場所はどこでもいいとか言い出したのでビビるのを取り越して無になりました。
今回はそのhtmlspecialcharsについて説明します。目次
- HTML特殊文字とHTMLエンティティ
- htmlspecialchars
- さいごに
HTML特殊文字とHTMLエンティティ
● & (アンパサンド)
● " (ダブルクォート)
● ' (シングルクォート)
● < (小なり)
● > (大なり)上記の特殊文字はHTMLに通常通り記述することが出来ません。それに対応するためにHTMLエンティティと呼ばれるものがあります。HTML特殊文字を普通の文字として出力するためのものです。
そのために今回のPHPのhtmlspecialcharsを使用します。htmlspecialchars
PHPの関数であるhtmlspecialcharsは、HTMLの特殊文字をHTMLエンティティ化してくれます。
$escape = htmlspecialchars("<h1>Hello</h1>", ENT_QUOTES); echo $escape; // " <h1>Hello</h1>"上記のようにHTMLエンティティになります。PHPのhtmlspecialcharsについて詳しく知りたい方は、公式ページで御覧下さい。
さてここで、問題になってくるのがただ単にHTMLの特殊文字を文字として出力したいのにこのようにHTMLエンティティ化されてしまうことです。
このままでは、わざわざPHPの関数であるhtmlspecialchars_decode()を使用しなければなりません。(その一緒に開発していた人はこれすら使っていなかったのでヤバすぎやろ)
なので、ブラウザに出力する時に使用するとわざわざhtmlspecialchars_decode()を使用せずともいいのです。さいごに
セキュリティのためにPHPの関数やその他便利なものを使用している人達がいるがちゃんと意味を理解して適切な場所で使用することを心がけないとダメなんだなと思いました。誰とは言わないが…
参考文献
- 投稿日:2020-09-24T20:01:30+09:00
DBのレコードを維持しつつテストするならDatabaseTransactionsを使おう
結論
DBの値を操作するテストを実行する場合、
既存のDBのレコードはそのままに変更した値だけ元に戻したい!そんな時はDatabaseTransactionsを使おう?
事例
- 有用な大量の既存テストデータが存在するDBを使って、レコード追加のテストを行う
- 普通にテストを実行すると、都度レコードが増えてしまう……?
- RefreshDatabaseを使ったら、既存のテストデータまで消えた?????
DatabaseTransactions とは
- テスト実行中のみ有効なトランザクションを設定する
- 自動的にsetUp()でbeginTransactionして、tearDown()時にrollbackする
解決方法
以下のように、DatabaseTransactionsを使う
class HogeTest extends TestCase { use DatabaseTransactions; /** * @var HogeService */ private $hogeService; /** * 初期データ投入. */ public function setUp(): void { parent::setUp(); $this->hogeService = app()->make(HogeService::class); } /** * @test */ public function insertRecord_正常() { $name = 'fuga'; $no = $this->hogeService->insertRecord($name); $this->assertSame(1, $no); } }補足
- 自動採番する項目は、レコードに登録されていなくても、
内部的にはカウントされている点に注意例)
既に4回、DatabaseTransactionsを使ったテストを実行していた場合、
その後DatabaseTransactionsを使わずに新規追加された
以下のレコードのno(bigIncrements)は1ではなく5になっているmysql> select no, user_id, created_at from reports; +----+------+---------------------+ | no | name | created_at | +----+------+---------------------+ | 5 | fuga | 2020-09-24 19:14:47 | +----+------+---------------------+ 1 row in set (0.01 sec)
- 投稿日:2020-09-24T19:38:22+09:00
PHPUnitテスト実行時に「no such table」エラー
結論
PHPUnitテスト実行時に「no such table」エラーが出たら、
テスト接続先DBがインメモリになっていないか設定を確認しよう?事例
LaravelプロジェクトでPHPUnitテストを実行したら、
以下のエラーが出た。root@efed49901495:/var/www# vendor/bin/phpunit tests/Unit/HogeServiceTest.php PHPUnit 8.5.0 by Sebastian Bergmann and contributors. E 1 / 1 (100%) Time: 868 ms, Memory: 20.00 MB There was 1 error: 1) Tests\Unit\ReportServiceTest::countHoge_正常 Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such table: hoges (SQL: select count(*) as aggregate from "hoges")原因
テスト接続先DBの設定が、SQLiteのインメモリ機能を使用するようになっていた。
phpunit.xml<php> (省略) <server name="DB_CONNECTION" value="sqlite"/> <server name="DB_DATABASE" value=":memory:"/> </php>Q. テスト接続先DBの設定は
.env
管理じゃないの?A. じゃない……です?
Laravelでは環境変数を
.env
で設定します。
ですが、テスト時の環境変数はphpunit.xml
内で指定された値が利用されます。解決方法
テスト接続先DBの設定を、指定したいDBに合わせて修正。
phpunit.xml<php> (省略) <server name="DB_CONNECTION" value="mysql"/> <server name="DB_DATABASE" value="merger"/> </php>
- 投稿日:2020-09-24T16:45:14+09:00
PHPによる数値の諸処理と乱数の詳細
目次
数値を3桁ごとに区切る
数値を小数点以下まで表示させる
乱数を生成する
ランダムな文字列を作成する
ユニークIDを生成する数値を3桁ごとに区切る
number_format()
関数を使う
第二引数で指定した小数点の桁より下は切り捨てられる
引数を指定しない場合は小数点以下が切り捨てられる
有効桁数は14桁でそれ以上はプラットフォームによるexample.phpecho number_format('98765432.1'); //98,765,432 echo number_format('110', 2); //110.00数値を小数点以下まで表示させる
sprintf()
関数かnumber_format()
関数を使う
sprintf()
関数を使う場合は%02f
のように指定すると少数第二位までの表示が、%05f
とすると少数第五位までが表示できる
number_format()
関数を使う場合は第二引数に小数点第何位までを表示するか指定することができる
カンマ区切りが不要な場合は第三引数にピリオド、第四引数に空文字を指定する乱数を生成する
mt_rand()
関数を使うexample.phpmt_rand(int $min, int $max): int引数を設定しない場合は0から
mt_getrandmax(): int
の値を返す
乱数を生成する場合はシード値を基にして決まった計算方法で求められるため、
同じシード値からは同じ値が同じ順番で生成されるため、暗号学的に安全ではない
mt_rand()
関数のシード値は自動的に決められるため設定はいらないランダムな文字列を作成する
example.php<?php //generateRandomString()関数 //第一引数には文字数 //第二引数には使用する文字 function generateRandomString(int $len, string $elem = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-=/!@#$%^&*()_+~`'): string { if ($len <= 0) return false; if (!preg_match('/\A[\x21-\x7e]+\z/', $elem)) return false; $chars = preg_split('//', $elem, -1, PREG_SPLIT_NO_EMPTY); $chars = array_unique($chars); $bytes = getRandomBytes($len); if (strlen($bytes) <= 0) return false; $str = ''; $charsLen = count($chars); for ($i = 0; $i <= $len; $i++) { //バイト文字からASCII値を取得して剰余演算で配列の添字を決定 $str .= $chars[ord($bytes[$i]) % $charsLen]; } return $str; } //getRandomBytes()関数 //暗号学的に強いアルゴリズムで生成した乱数のバイト文字列を返す function getRandomBytes(int $len): string { $bytes = ''; if (function_exists('openssl_random_pseudo_bytes')) $bytes = openssl_random_pseudo_bytes($len, $usable); if ($usable == false) $bytes = ''; return $bytes; }
暗号学的に安全な関数
OpenSSL拡張モジュール
が必要なのでfunction_exists())
関数でチェックユニークIDを生成する
uniqid()
関数を使用する
第一引数を空文字で実行すると13
文字の文字列が生成される
第一引数に文字列を指定するとそれが文頭につく
第二引数にtrue
を指定すると23
文字のより推測されにくい文字列が生成されるexample.phpecho uniqid(); //xxxxxxxxxxxxx echo uniqid('', true); //xxxxxxxxxxxxxxxxxxxxxxx echo uniqid('no.'); //no.xxxxxxxxxxxxx
uniqid()
関数はマイクロ秒単位で変化するので同じマイクロ秒であれば同じIDが生成されてしまう可能性がある
mt_rand()
関数で乱数を指定すれば異なるIDを生成できる
md5()
関数を使うことで桁数の揃ったIDを生成できるexample.phpecho md5(uniqid(mt_rand(), true))
- 投稿日:2020-09-24T16:39:15+09:00
【PHP】require_onceで相対パスで開けないときは__DIR__を使えば良いんじゃ...
require_onceで相対パスで開けないときはDIRを使えば良いんじゃ...
require_onceで相対パスは合っているはずなのに開けない
最初に遭遇したエラー。
相対パスは合っているはずなのに開けない。/
- A.php
- D.php
- Class/
- B.php
- C.php
上記のようなディレクトリ構造の場合を考える。
B.phpでC.phpを読み込み、さらにA.phpでB.phpを読み込むとエラーが発生する。「PHPでは、「実行したファイルのあるディレクトリが常に実行時のカレントディレクトリになる」っていう規則があるためエラーとなってしまうのです。 この問題は、実行ファイルのディレクトリではなく、参照しているファイルのディレクトリを基にパスを取得することで回避できます。」
A.phpを実行しているので、 B.phpのrequire_once(“C.php”)はA.phpと同階層のC.phpを探してエラーになるようです。
https://blog.leko.jp/post/fix-require-relative-path-of-php/調べるとどうやらrequire_onceは絶対パスを使用した方が良いとのこと。
それには、require_once(dirname(__FILE__) . '/C.php')とする方法と
require_once(__DIR__ . '/C.php')とする方法がある。dirname(__FILE__)および__DIR__でカレントディレクトリ(つまり、現在のディレクトリ)を取得できる。
dirname(__FILE__)および__DIR__とは
dirname(__FILE__)
親ディレクトリのパスを返します。 path にスラッシュが無い場合は、 カレントディレクトリを示すドット ('.') を返します。それ以外の場合は、スラッシュ以降の /component 部分を取り除いた path を返します。
https://www.php.net/manual/ja/function.dirname.php__DIR__
そのファイルの存在するディレクトリ。include の中で使用すると、 インクルードされるファイルの存在するディレクトリを返します。 つまり、これは dirname(FILE) と同じ意味です。 ルートディレクトリである場合を除き、ディレクトリ名の末尾にスラッシュはつきません。
https://www.php.net/manual/ja/language.constants.predefined.php__DIR__はマジカル定数(PHPで自動的に定義される定数)。
dirname(__FILE__)および__DIR__の違いは
- dirname(__FILE__) ⇒ PHP5.2以前でも使用できる
- __DIR__ ⇒ PHP5.3以降で使用できる
dirname(__FILE__)および__DIR__を試しているのにエラーが発生する
カレントディレクトリを確認しようとvar_dumpで確認してみると、なんと、カレントディレクトリが取得できていない!
どうやらディレクトリ名が日本語のため取得できなかったらしい。
日本語から英語に変更したところカレントディレクトリを取得できた。日本語名のディレクトリを使用したいときはどうすれば良いのか
basename関数では、mbrlen関数を使用しているようで、こちらでは1バイト文字かつバックスラッシュという条件のようです。こちらではdirname関数のような現象は起きません。basename(FILE)とすれば正しくファイル名が返却されます。もしdirnameと同じような処理であれば、ファイル名にディレクトリ名が混入することになります。
https://qiita.com/TaMaMhyu/items/63386f610a839b9511ebどうやらbasenameを使用すると良いらしい。__DIR__に関してはそういった対処法はないため日本語表記のディレクトリは使用できなさそう。
ディレクトリ名に日本語を使うのはやめた方が良さそうだね。
- 投稿日:2020-09-24T13:14:37+09:00
Composer導入方法
Composerとは
Composer(コンポーザー)とは日本語で、作曲家、構成者の意味合いがあります。一言でいうと依存性管理ツールになります。
これだけだとなんだか分からないので例を上げて説明していきます。例えば使いたいライブラリAがあったとして、これを使用するためには更に別のライブラリB,Cが必要だったとします。ですがそのライブラリB,Cも他のライブラリD,E....が必要なことがあります。
こうなると必要なライブラリを一つ一つインストールしていく沼にハマり、管理が面倒になっていきます。ですが、Composerを使うと、
composer requier Aとするだけで、ライブラリAに必要なライブラリ群を一緒にダウンロードしてくれます。
必要な環境
・パソコンはWindowsでもMacでもLinuxでも問題ありません。
・前もってPHP5.3.2以上の環境がインストールされていつことが必要となります。導入方法
1.インストール
パソコンはMacを使用しています。
まず公式サイトのDownloadを押します。すると、
Downloadするためのコマンドが現れたページに移ります。そこに以下のコマンドが書いていますので上から順にコピー、ペーストしていきます。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');"ここまでの処理を終えると、composer.pharというファイルが作成されていると思います。これがComposerになります。
2.パスを通す
ダウンロードするだけでは使いづらいので、どのディレクトリからもcomposerコマンドを使えるように、パスを通していきます。Macだと管理者権限で実行しないといけないので、コマンドの先頭にsudoをつけて実行していきます。
sudo mv composer.phar /usr/local/bin/composerこれが成功されると、composer.pharがなくなっていて、/usr/local/bin/composer内に移動されています。これにより、どのディレクトリでもcomposerコマンドを使えるようになりました。
確認
ターミナルを開いて、下記のコマンドを実行します。
composer --versionこのコマンドを入力して、Composerのバージョンが表示されたら成功です。
参考サイト
公式サイト
https://getcomposer.org/download/
参考サイト
https://awesome-linus.com/2019/02/26/composer-install/
- 投稿日:2020-09-24T13:14:37+09:00
Composer導入方法+簡易的な使い方
Composerとは
Composer(コンポーザー)とは日本語で、作曲家、構成者の意味合いがあります。一言でいうと依存性管理ツールになります。。。これだけだとなんだか分からないので例を上げて説明していきます。
例えば使いたいライブラリAがあったとして、これを使用するためには更に別のライブラリB,Cが必要だったとします。ですがそのライブラリB,Cも他のライブラリD,E....が必要なことがあります。
こうなると必要なライブラリを一つ一つインストールしていく沼にハマり、管理が面倒になっていきます。
ですが、Composerを使うと、composer requier Aとするだけで、ライブラリAに必要なライブラリ群を一緒にダウンロードしてくれます。
必要な環境
・パソコンはWindowsでもMacでもLinuxでも問題ありません。
・前もってPHP5.3.2以上の環境がインストールされていることが必要となります。導入方法
1.インストール
パソコンはMacを使用しています。
まず公式サイトのDownloadを押します。すると、
Downloadするためのコマンドが現れたページに移ります。そこに以下のコマンドが書いていますので上から順にコピー、ペーストしていきます。
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" $ php -r "if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" $ php composer-setup.php $ php -r "unlink('composer-setup.php');"ここまでの処理を終えると、composer.pharというファイルが作成されていると思います。これがComposerになります。
2.パスを通す
ダウンロードするだけでは使いづらいので、どのディレクトリからもcomposerコマンドを使えるように、パスを通していきます。Macだと管理者権限で実行しないといけないので、コマンドの先頭にsudoをつけて実行していきます。
$ sudo mv composer.phar /usr/local/bin/composerこれが成功されると、composer.pharがなくなっていて、/usr/local/bin/composer内に移動されています。これにより、どのディレクトリでもcomposerコマンドを使えるようになりました。
確認
ターミナルを開いて、下記のコマンドを実行します。
$ composer --versionこのコマンドを入力して、Composerのバージョンが表示されたら成功です。
Composerのセットアップ
1.ファイルの追加
composerを使用するには、composer.jsonファイルを作る必要があります。こちらはプロジェクトにインストールしたいライブラリ情報を記述するファイルです。プロジェクトごとに作成します。
{ "require": { "monolog/monolog": "1.0.*" } }"require"の後に、パッケージ名/バージョン番号でインストールしたいライブラリを指定します。
2.インストール
インストールするにはターミナルでcomposer installコマンドを使います。
$ composer installインストールが完了したら、何が変わっているかを確認しましょう。以下の要素が追加されていると思います。
1.venderディレクトリ
2.composer.lock・venderディレクトリ
インストールしたライブラリが保存されます。
・composer.lock
ここにはライブラリの情報を記録します。オートローディング
インスロールされたライブラリはオートローディング機能を使って呼び出すことができます。
require 'vendor/autoload.php';この記述により、composer.jsonに記載されている全てのライブラリが読み込まれます。
以上がcomposerの導入方法、使い方の簡易的な説明になります。参考サイト
公式サイト
https://getcomposer.org/download/
参考サイト
https://awesome-linus.com/2019/02/26/composer-install/
https://reffect.co.jp/php/composer-autoload#require
- 投稿日:2020-09-24T13:02:26+09:00
【2020年版】PhpStormでLaravel案件開発するなら入れておきたいPlugin
2018年に Laravelを使って開発をするときに入れておきたいPhpStormのプラグイン という記事を書きました。
その後、PhpStormバージョンアップと共に必要なくなったプラグインや、新たに登場したものもあるため、2020年バージョンとして改めて書いておきます。これらを入れた結果、ここまでLaravel案件の開発はラクに書ける!の解説記事(動画?)も後日公開予定です。
前提
PhpStorm のバージョン 2020.2
Laravel v8系プラグインリスト
PHP編
- PHP Advanced AutoComplete
- 入力補完が強くなる
- PHP Annotations
- phpdocの補完?
- Php Inspections (EA Extended)
- より良いコードの書き方をサジェストしてくれる
- PHP Unit code coverage
- コードの左端にテストが通って成功(緑) or 通ったけど失敗(赤) の色がつく
- PHP Unit Enhancement
- テストコードの記述を支援してくれる補完機能
- PHPUnit Helper
- 上記 PHP Unit Enhancementをforkしたもの
- PHPStan / Psalm / Generics
- 静的解析ツールの PHPStan, Psalm を実行できる
Laravel
- Laravel
- 設定項目あり
- Symfony Support
- LaravelはSymfonyのコンポーネントをたくさん使ってるので一応入れてる
- Blade
- Bladeテンプレートを書くときのサポート
- APIのやり取りしかしない案件だと不要
Git支援系
- GitExtender
- GitToolbox
- Annotation(git blame)を開かなくても、カーソル行のコミット情報が薄く表示される
ターミナル系
- ANSI Highlighter
- Awesome Console
周辺技術
- .env file support
- BashSupport
- Swagger
- OpenAPI ドキュメントを書くときの補完
- 実際にはVSCodeでpreviewしながら書いたほうがいいかも
- ledis
- Redisのクライアント
- 未使用
IDE全般
- Japanese Language Pack EAP
- 日本語化パック UIは英語のままでも問題なかったが、エラーメッセージも日本語になるとわかりやすい
- OpenGithub
- 今開いている箇所を GitHubで開いてくれる。GitHubEnterpriseにも対応
- Open in splitted tab
- Rainbow Brackets
- カッコ
{}
()
に色がつく- https://plugins.jetbrains.com/plugin/9792-key-promoter-x
- キーボードショートカットがあるのにマウス操作をすると、ショートカットを教えてくれる
- IdeaVim
- Vim風のキーバインドで入力できるようになる
- キーボードショートカットがIDE独自のものとかぶる物があり、調整が必要
- 投稿日:2020-09-24T13:00:25+09:00
LaravelDB.com~操作方法と勘所を書いた〜(2020/09/24メジャーアップデートに対応)
◇LaravelDB.com ?
Laravelのデータベース設計(ER図)するだけで、Migrationファイルがポンって作成できるFreeの「 テーブル設計&Migration作成 」 ツールです。
メイン機能
- Migrationの自動生成
- チームメンバーとの共有可能
- CRUDコード(β版)の自動生成
- CRUDコード(β版)でのValidation自動生成(テーブル設計に合わせて自動で生成)
用途
用途は開発者によってバラバラですね。
・Migrationのみ使う(ほとんどの人はここですかね)
・CRUDファイル全部(数%くらいの人)
・コード生成後、一部(Validationとか)をコピーして使う(結構な割合でいます)
・テーブル設計の共有(Team開発では使ってるようです)◇操作方法(マニュアル)
1.テーブル作成
2.カラム作成
※使いやすくするポイント!! 「列を追加」ボタンを連打で必要な数だけ先に作ると便利!!
3.2020-09-24アップデートから使用可能
「 ENUM, UNSIGNED ] に対応、新規プロジェクトより表示されるようになります
「 UNIQUE, INDEX ] に対応、新規プロジェクトより表示されるようになります
外部キーの設定
外部キー制約を使用する場合( ※1対他、多対多などを分ける機能は無い)
4.ER図の保存
コントロールパネル[Data:セーブ/ロード]から移動します。
Save/Load機能 機能詳細 クラウドへ保存 アカウントに紐づきクラウドに保存します。 クラウドデータ一覧 保存したクラウド側のデータ一覧 ブラウザに保存 使用中のブラウザ「LocalStorage」に一時保存 ブラウザデータ一覧 localStorageに保存したデータ一覧 上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図を復元します。5.Migrationを生成
[ER図から出力]内のBuild [Migration]ボタンをクリックしてダウンロードします!
【ER図をTeamでシェア】
1 [送信側:シェアData]作成
見せたい相手にIDを渡しておいて、変更があれば「Create a [Share ID]」ボタンを押すと毎度データ更新されることを知っておきましょう!2 [送信側:シェアData] IDをコピー
3 [受信側:シェアData]読み込み
4 「Read」ボタンをクリックしてデータを受信表示しましょう。
3.シェアデータの複製が完了!!
受信側にデータが入りました!受信側もそのデータを活用できるようになります。
チーム・メンタリング等のケースでも利用可能です。
※受信後は「別名を付けて保存しておくと良いでしょう!」◇ β版のCRUD/リレーションを使用したい場合(まだまだ開発段階の未知の機能)
<重要>この機能はテーブル名の末尾に「s」が無いとうまく動作しません。
※ENUMは必須・未入力のみ出力。
※intは型・必須・未入力のみ出力、sizeが未対応。
※2020-09-24Migrtion機能にアップデートが入ったので、β版機能に影響があるかもしれません。
まずは、複数のテーブルを簡単に作り「外部キーの接続」をして準備してください!!
その後、右メニュー「 [Data]セーブ/ロード 」クリックすると以下画面が表示されます。
BUILD [CRUD CODE] をクリック!!CRUD ファイル一式が生成されます
【ポイント】
Relation(Beta)にチェックを入れておくとリレーションします。
BUILD [MIGRATION] でもリレーション(QueryBuilder)がコメントで生成されますよ。
【このツールでのリレーションのポイント】
- JOINしてるテーブルの全ての項目を最初は表示します(同項目名が存在する場合、片方のみ表示します)。
- CRUDのコードが生成されたら、仕様に合わせてHTMLテーブルの項目を削除してください。
- リレーションは上記画像のように「チェック」を入れないと生成しないようにしています(Beta版のため)。
- Controller内にコードが生成されてますので、確認しておくと良いでしょう!
- 外部キーはこのツールでは非推奨としています(理由:Migrationの実行順序が重要でエラーになりやすい為) プロトタイプ(ベースになるコードを生成してくれる)には十分すぎる機能ですね。
◇Validation → テーブル設計に合わせて生成
Validationって地味に面倒ですよね、完璧では内容ですが、少しの手直しで使用できるなら便利そうです!!
例でざっくりテーブルをER図で書いてみました。
以下"t_gsusers"テーブルを中心に見ていきます。
生成されたコントローラーのcreate(),edit()にはこういったvalidationが挿入されます。
TGsusersController$this->validate($request, [ "name" => "required|max:128", //string('name',128) "lid" => "required|max:128", //string('lid',128) "lpw" => "required|max:128", //string('lpw',128) "m_department_id" => "required|integer", //integer('m_department_id') "m_position_id" => "required|integer", //integer('m_position_id') "m_prefectures_id" => "required|integer", //integer('m_prefectures_id') "m_kanri_id" => "required|integer", //integer('m_kanri_id') "m_lifeflg_id" => "required|integer", //integer('m_lifeflg_id') "m_test_id" => "required|integer", //integer('m_test_id') ]);{{old('name')}} → 入力項目を補完(CRUD:β版を使用した場合に生成されます)
validationで未入力等ではじかれた場合、入力した文字を消さずに表示します。
ベータ版のCRUD/リレーションの利用シーン
上記のようにβ版ではありますが、全てを利用するというよりは、コードを生成して、必要な部分だけ使うのも良いと思います。(実際にそういったケースを耳にしました〜)
◇LaravelDB.com 対応カラム一覧
tinyIncrements
mediumIncrements
smallIncrements
bigIncrements
increments
mediumInteger
smallInteger
bigInteger
tinyInteger
integer
unsignedInteger (2020-09-24対応)
unsignedTinyInteger (2020-09-24対応)
unsignedSmallInteger (2020-09-24対応)
unsignedMediumInteger (2020-09-24対応)
unsignedBigInteger (2020-09-24対応)
decimal
double
float
enum (2020-09-24対応)
geometryCollection
geometry
jsonb
json
char
longText
mediumText
text
multiLineString
lineString
string
multiPoint
multiPolygon
point
polygon
binary
nullableTimestamps
timestamps (2020-09-24対応)
softDeletes (2020-09-24対応)
dateTime
timestamp
time
year
date◇そもそも、なんで作ったの?
私は学校でプログラミング(サービスを作る基本)を教えていて、テーブル設計している学生がその場にいて
「テーブル設計して、そこからMigrationファイル作成して、コードをイチから書いて・・・」普通の作業ではあるんですが、何故か「その時は疑問を感じました」、ER図書いたらMigrationファイル生成したら便利だよね~。
何割かの開発者は喜んでくれるのでは?と思ったのがキッカケでした。
特に「テーブル設計は保存可能」なので、前回作ったテーブル設計から新しい設計を複製できるのは嬉しい機能です。設計してMigration or CRUDコード書き出してができるので、「設計して→コード書いて」という往復作業が無くなるので、是非使ってほしいと思います。今後の展開
2020-09-24以降からは「Migration」を軸にアップデートしていきます
なぜ、↑そう思ったか?
良かれと思った機能が意外に余計だった。。。よくあるパターンですね。
テーブル名に"t_","m_"とかトランザクション・マスターテーブルなどがテーブル名で分かるようにした場合に、自動で「timestamps」「softDeletes」などを挿入する機能が逆に「解りにくくさせていた」という事があります。今回のアップデートで廃止いしたのでご安心ください(余計なことはしません(^^))。
やはりシンプルがベストなんですよね。今はいかに「シンプルにするか」だけ考えてアップデートを考えています。
※必要な機能はどうやって複雑にせずに追加するか?など、悩みが楽しくてしょうがありません。
※CRUD(β版)機能のアップデートはどうなるか未定(Laravel7までは動作確認ずみ)
※Laravel8移行のLTSの仕様で検討予定ですかね~~~かなり変わってるように思ったので。◇LaravelDB.com サイト
◇Twitterアカウント
以上
- 投稿日:2020-09-24T13:00:25+09:00
LaravelDB.com~操作方法と勘所を書いた〜2020/09/24メジャーアップデート版
◇LaravelDB.com ?
Laravelのデータベース設計(ER図)するだけで、Migrationファイルがポンって作成できるFreeの「 テーブル設計&Migration作成 」 ツールです。
メイン機能
- Migrationの自動生成
- チームメンバーとの共有可能
- CRUDコード(β版)の自動生成
- CRUDコード(β版)でのValidation自動生成(テーブル設計に合わせて自動で生成)
用途
用途は開発者によってバラバラですね。
・Migrationのみ使う(ほとんどの人はここですかね)
・CRUDファイル全部(数%くらいの人)
・コード生成後、一部(Validationとか)をコピーして使う(結構な割合でいます)
・テーブル設計の共有(Team開発では使ってるようです)◇操作方法(マニュアル)
1.テーブル作成
2.カラム作成
※使いやすくするポイント!! 「列を追加」ボタンを連打で必要な数だけ先に作ると便利!!
3.2020-09-24アップデートから使用可能
「 ENUM, UNSIGNED ] に対応、新規プロジェクトより表示されるようになります
「 UNIQUE, INDEX ] に対応、新規プロジェクトより表示されるようになります
外部キーの設定
外部キー制約を使用する場合( ※1対他、多対多などを分ける機能は無い)
4.ER図の保存
コントロールパネル[Data:セーブ/ロード]から移動します。
Save/Load機能 機能詳細 クラウドへ保存 アカウントに紐づきクラウドに保存します。 クラウドデータ一覧 保存したクラウド側のデータ一覧 ブラウザに保存 使用中のブラウザ「LocalStorage」に一時保存 ブラウザデータ一覧 localStorageに保存したデータ一覧 上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図を復元します。5.Migrationを生成
[ER図から出力]内のBuild [Migration]ボタンをクリックしてダウンロードします!
【ER図をTeamでシェア】
1 [送信側:シェアData]作成
見せたい相手にIDを渡しておいて、変更があれば「Create a [Share ID]」ボタンを押すと毎度データ更新されることを知っておきましょう!2 [送信側:シェアData] IDをコピー
3 [受信側:シェアData]読み込み
4 「Read」ボタンをクリックしてデータを受信表示しましょう。
3.シェアデータの複製が完了!!
受信側にデータが入りました!受信側もそのデータを活用できるようになります。
チーム・メンタリング等のケースでも利用可能です。
※受信後は「別名を付けて保存しておくと良いでしょう!」◇ β版のCRUD/リレーションを使用したい場合(まだまだ開発段階の未知の機能)
<重要>この機能はテーブル名の末尾に「s」が無いとうまく動作しません。
※ENUMは必須・未入力のみ出力。
※intは型・必須・未入力のみ出力、sizeが未対応。
※2020-09-24Migrtion機能にアップデートが入ったので、β版機能に影響があるかもしれません。
まずは、複数のテーブルを簡単に作り「外部キーの接続」をして準備してください!!
その後、右メニュー「 [Data]セーブ/ロード 」クリックすると以下画面が表示されます。
BUILD [CRUD CODE] をクリック!!CRUD ファイル一式が生成されます
【ポイント】
Relation(Beta)にチェックを入れておくとリレーションします。
BUILD [MIGRATION] でもリレーション(QueryBuilder)がコメントで生成されますよ。
【このツールでのリレーションのポイント】
- JOINしてるテーブルの全ての項目を最初は表示します(同項目名が存在する場合、片方のみ表示します)。
- CRUDのコードが生成されたら、仕様に合わせてHTMLテーブルの項目を削除してください。
- リレーションは上記画像のように「チェック」を入れないと生成しないようにしています(Beta版のため)。
- Controller内にコードが生成されてますので、確認しておくと良いでしょう!
- 外部キーはこのツールでは非推奨としています(理由:Migrationの実行順序が重要でエラーになりやすい為) プロトタイプ(ベースになるコードを生成してくれる)には十分すぎる機能ですね。
◇Validation → テーブル設計に合わせて生成
Validationって地味に面倒ですよね、完璧では内容ですが、少しの手直しで使用できるなら便利そうです!!
例でざっくりテーブルをER図で書いてみました。
以下"t_gsusers"テーブルを中心に見ていきます。
生成されたコントローラーのcreate(),edit()にはこういったvalidationが挿入されます。
TGsusersController$this->validate($request, [ "name" => "required|max:128", //string('name',128) "lid" => "required|max:128", //string('lid',128) "lpw" => "required|max:128", //string('lpw',128) "m_department_id" => "required|integer", //integer('m_department_id') "m_position_id" => "required|integer", //integer('m_position_id') "m_prefectures_id" => "required|integer", //integer('m_prefectures_id') "m_kanri_id" => "required|integer", //integer('m_kanri_id') "m_lifeflg_id" => "required|integer", //integer('m_lifeflg_id') "m_test_id" => "required|integer", //integer('m_test_id') ]);{{old('name')}} → 入力項目を補完(CRUD:β版を使用した場合に生成されます)
validationで未入力等ではじかれた場合、入力した文字を消さずに表示します。
ベータ版のCRUD/リレーションの利用シーン
上記のようにβ版ではありますが、全てを利用するというよりは、コードを生成して、必要な部分だけ使うのも良いと思います。(実際にそういったケースを耳にしました〜)
◇LaravelDB.com 対応カラム一覧
tinyIncrements
mediumIncrements
smallIncrements
bigIncrements
increments
mediumInteger
smallInteger
bigInteger
tinyInteger
integer
unsignedInteger (2020-09-24対応)
unsignedTinyInteger (2020-09-24対応)
unsignedSmallInteger (2020-09-24対応)
unsignedMediumInteger (2020-09-24対応)
unsignedBigInteger (2020-09-24対応)
decimal
double
float
enum (2020-09-24対応)
geometryCollection
geometry
jsonb
json
char
longText
mediumText
text
multiLineString
lineString
string
multiPoint
multiPolygon
point
polygon
binary
nullableTimestamps
timestamps (2020-09-24対応)
softDeletes (2020-09-24対応)
dateTime
timestamp
time
year
date◇そもそも、なんで作ったの?
私は学校でプログラミング(サービスを作る基本)を教えていて、テーブル設計している学生がその場にいて
「テーブル設計して、そこからMigrationファイル作成して、コードをイチから書いて・・・」普通の作業ではあるんですが、何故か「その時は疑問を感じました」、ER図書いたらMigrationファイル生成したら便利だよね~。
何割かの開発者は喜んでくれるのでは?と思ったのがキッカケでした。
特に「テーブル設計は保存可能」なので、前回作ったテーブル設計から新しい設計を複製できるのは嬉しい機能です。設計してMigration or CRUDコード書き出してができるので、「設計して→コード書いて」という往復作業が無くなるので、是非使ってほしいと思います。今後の展開
2020-09-24以降からは「Migration」を軸にアップデートしていきます
なぜ、↑そう思ったか?
良かれと思った機能が意外に余計だった。。。よくあるパターンですね。
テーブル名に"t_","m_"とかトランザクション・マスターテーブルなどがテーブル名で分かるようにした場合に、自動で「timestamps」「softDeletes」などを挿入する機能が逆に「解りにくくさせていた」という事があります。今回のアップデートで廃止いしたのでご安心ください(余計なことはしません(^^))。
やはりシンプルがベストなんですよね。今はいかに「シンプルにするか」だけ考えてアップデートを考えています。
※必要な機能はどうやって複雑にせずに追加するか?など、悩みが楽しくてしょうがありません。
※CRUD(β版)機能のアップデートはどうなるか未定(Laravel7までは動作確認ずみ)
※Laravel8移行のLTSの仕様で検討予定ですかね~~~かなり変わってるように思ったので。◇LaravelDB.com サイト
◇Twitterアカウント
以上
- 投稿日:2020-09-24T13:00:25+09:00
LaravelDB.com~操作方法と勘所を書いた〜(基本操作編)
◇LaravelDB.com ?
Laravelのデータベース設計(ER図)するだけで、Migrationファイルがポンって作成できるFreeの「 テーブル設計&Migration作成 」 ツールです。
メイン機能
- Migrationの自動生成
- チームメンバーとの共有可能
- CRUDコード(β版)の自動生成
- CRUDコード(β版)でのValidation自動生成(テーブル設計に合わせて自動で生成)
利用について
個人/プログラミング学習者: 無料
企業/商用利用:paypal等の寄付・ウイッシュリストでの寄付用途
用途は開発者によってバラバラですね。
・Migrationのみ使う(ほとんどの人はここですかね)
・CRUDファイル全部(数%くらいの人)
・コード生成後、一部(Validationとか)をコピーして使う(結構な割合でいます)
・テーブル設計の共有(Team開発では使ってるようです)◇操作方法(マニュアル)
1.テーブル作成
2.カラム作成
※使いやすくするポイント!! 「列を追加」ボタンを連打で必要な数だけ先に作ると便利!!
3.2020-09-24アップデートから使用可能
「 ENUM, UNSIGNED ] に対応、新規プロジェクトより表示されるようになります
「 UNIQUE, INDEX ] に対応、新規プロジェクトより表示されるようになります
外部キーの設定
外部キー制約を使用する場合( ※1対他、多対多などを分ける機能は無い)
4.ER図の保存
コントロールパネル[Data:セーブ/ロード]から移動します。
Save/Load機能 機能詳細 クラウドへ保存 アカウントに紐づきクラウドに保存します。 クラウドデータ一覧 保存したクラウド側のデータ一覧 ブラウザに保存 使用中のブラウザ「LocalStorage」に一時保存 ブラウザデータ一覧 localStorageに保存したデータ一覧 上記の「データ一覧」選択後、「 -- Data List -- 」の選択肢が表示されます。
そこに表示されるデータ項目を選択するとER図を復元します。5.Migrationを生成
[ER図から出力]内のBuild [Migration]ボタンをクリックしてダウンロードします!
【ER図をTeamでシェア】
1 [送信側:シェアData]作成
見せたい相手にIDを渡しておいて、変更があれば「Create a [Share ID]」ボタンを押すと毎度データ更新されることを知っておきましょう!2 [送信側:シェアData] IDをコピー
3 [受信側:シェアData]読み込み
4 「Read」ボタンをクリックしてデータを受信表示しましょう。
3.シェアデータの複製が完了!!
受信側にデータが入りました!受信側もそのデータを活用できるようになります。
チーム・メンタリング等のケースでも利用可能です。
※受信後は「別名を付けて保存しておくと良いでしょう!」◇ リバースエンジニアリング(Migration → ER図)
フォルダにMigrationファイル(Schema::createのみ)一式集めZip圧縮したファイルをアップロードすることで、ER図へ変換(リバース)することが可能です。
Migrationファイル一式をZIP圧縮 → [ Reverse >>> ERD ]ボタンでアップロード
アップロード完了するとER図が表示されます。
Migration(ZIPファイルに一式纏めて) 機能詳細 [ Reverse >>> ERD ] Migrationファイル一式をフォルダに入れて、ZIP圧縮したファイルをアップロード 1.注意
以下Migrationファイル 「 Schema::create 」のみ現在は可能
※ Schema::create以外は対応検討中Schema::create("テーブル名", function (Blueprint $table) {...}2.注意
「LaravelDB.com」からZIPファイルをダウンロードしたファイルをそのままアップロードは出来ません。必ず、一度解凍したものをZIP圧縮しなおしてuploadしてください。◇ β版のCRUD/リレーションを使用したい場合(まだまだ開発段階の未知の機能)
<重要>この機能はテーブル名の末尾に「s」が無いとうまく動作しません。
※ENUMは必須・未入力のみ出力。
※intは型・必須・未入力のみ出力、sizeが未対応。
※2020-09-24Migrtion機能にアップデートが入ったので、β版機能に影響があるかもしれません。
まずは、複数のテーブルを簡単に作り「外部キーの接続」をして準備してください!!
その後、右メニュー「 [Data]セーブ/ロード 」クリックすると以下画面が表示されます。
BUILD [CRUD CODE] をクリック!!CRUD ファイル一式が生成されます
【ポイント】
Relation(Beta)にチェックを入れておくとリレーションします。
BUILD [MIGRATION] でもリレーション(QueryBuilder)がコメントで生成されますよ。
【このツールでのリレーションのポイント】
- JOINしてるテーブルの全ての項目を最初は表示します(同項目名が存在する場合、片方のみ表示します)。
- CRUDのコードが生成されたら、仕様に合わせてHTMLテーブルの項目を削除してください。
- リレーションは上記画像のように「チェック」を入れないと生成しないようにしています(Beta版のため)。
- Controller内にコードが生成されてますので、確認しておくと良いでしょう!
- 外部キーはこのツールでは非推奨としています(理由:Migrationの実行順序が重要でエラーになりやすい為) プロトタイプ(ベースになるコードを生成してくれる)には十分すぎる機能ですね。
◇Validation → テーブル設計に合わせて生成
Validationって地味に面倒ですよね、完璧では内容ですが、少しの手直しで使用できるなら便利そうです!!
例でざっくりテーブルをER図で書いてみました。
以下"t_gsusers"テーブルを中心に見ていきます。
生成されたコントローラーのcreate(),edit()にはこういったvalidationが挿入されます。
TGsusersController$this->validate($request, [ "name" => "required|max:128", //string('name',128) "lid" => "required|max:128", //string('lid',128) "lpw" => "required|max:128", //string('lpw',128) "m_department_id" => "required|integer", //integer('m_department_id') "m_position_id" => "required|integer", //integer('m_position_id') "m_prefectures_id" => "required|integer", //integer('m_prefectures_id') "m_kanri_id" => "required|integer", //integer('m_kanri_id') "m_lifeflg_id" => "required|integer", //integer('m_lifeflg_id') "m_test_id" => "required|integer", //integer('m_test_id') ]);{{old('name')}} → 入力項目を補完(CRUD:β版を使用した場合に生成されます)
validationで未入力等ではじかれた場合、入力した文字を消さずに表示します。
ベータ版のCRUD/リレーションの利用シーン
上記のようにβ版ではありますが、全てを利用するというよりは、コードを生成して、必要な部分だけ使うのも良いと思います。(実際にそういったケースを耳にしました〜)
◇LaravelDB.com 対応カラム一覧
tinyIncrements
mediumIncrements
smallIncrements
bigIncrements
increments
mediumInteger
smallInteger
bigInteger
tinyInteger
integer
unsignedInteger (2020-09-24対応)
unsignedTinyInteger (2020-09-24対応)
unsignedSmallInteger (2020-09-24対応)
unsignedMediumInteger (2020-09-24対応)
unsignedBigInteger (2020-09-24対応)
decimal
double
float
enum (2020-09-24対応)
geometryCollection
geometry
jsonb
json
char
longText
mediumText
text
multiLineString
lineString
string
multiPoint
multiPolygon
point
polygon
binary
nullableTimestamps
timestamps (2020-09-24対応)
softDeletes (2020-09-24対応)
dateTime
timestamp
time
year
date◇そもそも、なんで作ったの?
私は学校でプログラミング(サービスを作る基本)を教えていて、テーブル設計している学生がその場にいて
「テーブル設計して、そこからMigrationファイル作成して、コードをイチから書いて・・・」普通の作業ではあるんですが、何故か「その時は疑問を感じました」、ER図書いたらMigrationファイル生成したら便利だよね~。
何割かの開発者は喜んでくれるのでは?と思ったのがキッカケでした。
特に「テーブル設計は保存可能」なので、前回作ったテーブル設計から新しい設計を複製できるのは嬉しい機能です。設計してMigration or CRUDコード書き出してができるので、「設計して→コード書いて」という往復作業が無くなるので、是非使ってほしいと思います。今後の展開
2020-09-24以降からは「Migration」を軸にアップデートしていきます
なぜ、↑そう思ったか?
良かれと思った機能が意外に余計だった。。。よくあるパターンですね。
テーブル名に"t_","m_"とかトランザクション・マスターテーブルなどがテーブル名で分かるようにした場合に、自動で「timestamps」「softDeletes」などを挿入する機能が逆に「解りにくくさせていた」という事があります。今回のアップデートで廃止いしたのでご安心ください(余計なことはしません(^^))。
やはりシンプルがベストなんですよね。今はいかに「シンプルにするか」だけ考えてアップデートを考えています。
※必要な機能はどうやって複雑にせずに追加するか?など、悩みが楽しくてしょうがありません。
※CRUD(β版)機能のアップデートはどうなるか未定(Laravel7までは動作確認ずみ)
※Laravel8移行のLTSの仕様で検討予定ですかね~~~かなり変わってるように思ったので。◇LaravelDB.com サイト
◇Twitterアカウント
以上
- 投稿日:2020-09-24T12:06:23+09:00
Homebrew導入方法
Homebrewとは
Homebrewではアップル(またはLinuxシステム)が提供していないソフトウエアや拡張機能のインストールができる物です。Git(バージョン管理システム)とRubyで構築されています。HomebrewはMacOS環境におけるいわゆるデファクトスタンダードなパッケージマネージャです。こちらを使う事により簡単にComposerをインストールできるようになります。
各OS/言語におけるパッケージマネージャ
OS
OS パッケージマネージャ Windows Chocolatey MacOS Homebrew(brew) Linux(RH系) yum, dnf Linux(Ubuntu) apt 言語
言語 パッケージマネージャ PHP composer JavaScript(node) npm Ruby gem C# NuGet Homebrewのインストール方法
まず公式のHomebrewページに移動し記載されているインストールコマンドをコピー、ペーストします。
エンターを押すとパスワードを求められるので、パスワードを入力します。/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"下記のように、Installation successful!と表示されればインストール完了です。
動作確認
インストールは以上になります。
参考サイト
https://qiita.com/zaburo/items/29fe23c1ceb6056109fd
https://www.webdesignleaves.com/pr/plugins/mac_terminal_basics_04.html#homebrewHomebrewサイト
- 投稿日:2020-09-24T12:00:00+09:00
【Vue.js】Error compiling template: .. outside root element will be ignored.エラーの対処
環境
PHP 7.3.8
Laravel 6.18.35
vue.js 2.6.12対処法
[Vue warn]: Error compiling template: text ""="">" outside root element will be ignored.文字通りテンプレートのコンパイルエラーという事で、
template内にタグに囲まれていない部分があるという指摘です。index.blade.php//"が多い <div style="width:calc(50% - .25rem);""> //不要な"を削除 <div style="width:calc(50% - .25rem);">これはvueファイル、コンポーネント内のテンプレだけでなく、読み込んでいるbladeでのタグ囲い漏れなども同様のエラーを検出します。
- 投稿日:2020-09-24T11:11:20+09:00
PHP Laravel 6 おすすめ映画投稿サイト作成過程 6:削除機能作成編
ルーティング
destroyを使用します。
| DELETE | recommends/{recommend} | recommends.destroy | App\Http\Controllers\RecommendController@destroy | web |コントローラー
Modelのデリートメソッドを使用します。
editなどとは違い、デリート用のページを用意する必要はないためindexへリダイレクトさせます。recommend/app/Http/Controllers/RecommendController.phppublic function destroy(Recommend $recommend) { $recommend->delete(); return redirect()->route('recommends.index'); }indexからdestroyへ削除したいデータを送る
destroyは、POSTやPUTと同様にformタグで送る必要があることに注意してください。
今回は、削除時に確認メッセージを表示させるようにしました。recommend/resources/views/recommends/index.blade.php<table> <thead> <tr> <th>タイトル</th> <th>画像:現在は空</th> <th>URL</th> <th>操作</th> </tr> </thead> @foreach($recommends as $recommend) <tr> <td>{{$recommend->title}}</td> <td>{{$recommend->image_file_name}}</td> <td>{{$recommend->url}}</td> <td><a href="{{route('recommends.show', $recommend->id)}}">詳細</a></td> <td><a href="{{route('recommends.edit', ['recommend' => $recommend])}}">編集</a></td> <td> <form method='POST'action="{{route('recommends.destroy', ['recommend' => $recommend])}}"> @csrf @method('DELETE') <button onclick="return confirm('本当に削除しますか?')" action="submit">削除</button> </td> @endforeach </table>フラッシュメッセージの追加
いくつかの方法があるようですが、今回は一番簡単そうなチェーンメソッドでwithを追加
recommend/app/Http/Controllers/RecommendController.phppublic function destroy(Recommend $recommend) { $recommend->delete(); return redirect()->route('recommends.index')->with('status', '削除しました'); }次に、フラッシュを表示させるviewを作成していきます。
投稿・編集・削除時に表示させたいので、専用のviewファイルを作成し、表示させたいviewファイルにincludeさせます。
今回は、_additonalディレクトリ内にalart.blade.phpというviewファイルを作成しました。viewファイルの内容については、if文でstatusの有無を判断し、アラートを表示させるようにします。
statusの有無を判断する方法は、sessionメソッドを使用しました。
recommend/resources/views/_additional/alart.blade.php@if(session()->has('status')) <div>{{session('status')}}</div> @endif上記をviewにincludeさせます
recommend/resources/views/recommends/index.blade.php<div class="card-body"> <table> @include('_additional.alart') <thead> <tr> <th>タイトル</th> <th>画像:現在は空</th> <th>URL</th> <th>操作</th> </tr> </thead> @foreach($recommends as $recommend) <tr> <td>{{$recommend->title}}</td> <td>{{$recommend->image_file_name}}</td> <td>{{$recommend->url}}</td> <td><a href="{{route('recommends.show', $recommend->id)}}">詳細</a></td> <td><a href="{{route('recommends.edit', ['recommend' => $recommend])}}">編集</a></td> <td> <form method='POST' action="{{route('recommends.destroy', ['recommend' => $recommend])}}"> @csrf @method('DELETE') <button onclick="return confirm('本当に削除しますか?')" action="submit">削除</button> </td> </form> </tr> @endforeach </table> </div>新規投稿と編集にもフラッシュメッセージを表示させる
updateとcreateに同じ処理をします。
recommend/app/Http/Controllers/RecommendController.phppublic function update(Request $request, Recommend $recommend) { $recommend->update($request->all()); return redirect()->route('recommends.show', compact('recommend'))->with('status', '編集しました'); }recommend/app/Http/Controllers/RecommendController.phppublic function store(Request $request) { Recommend::create($request->all()); return redirect()->route('recommends.index')->with('status', '投稿しました'); }recommend/resources/views/recommends/show.blade.php<div class="card"> <div class="card-header">{{ __('Login') }}</div> @include('_additional.alart') <div class="card-body"> <table> <tr> <th>タイトル</th> <td>{{$recommend->title}}</td> </tr> <tr> <th>画像</th> <td>{{$recommend->image_file_name}}</td> </tr> <tr> <th>URL</th> <td>{{$recommend->url}}</td> </tr> <tr> <th>概要</th> <td>{{$recommend->description}}</td> </tr> <tr> <th>感想</th> <td>{{$recommend->Impressions}}</td> </tr> </table> </div> </div>バリデーション
現在のフォームでは、nulableで空欄を許可しているもの以外を空欄で登録しようとするとエラー画面に飛ばされてしまいます。
それを防ぐため、バリデーションを設定して入力項目に制限を加えます。recommend/database/migrations/2020_09_23_105017_create_recommends_table.phppublic function up() { Schema::create('recommends', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('title'); $table->string('image_file_name', 100)->nullable(); $table->string('image_title',100)->nullable(); $table->string('url'); $table->string('description')->nullable(); $table->string('Impressions')->nullable(); $table->timestamps(); }); }バリデーション の設定手順
フォームリクエスト作成
$ php artisan make:request RecommendPostRequestリクエストに適用するバリデーション ルールを設定
recommend/app/Http/Requests/RecommendPostRequest.phpclass recommendPostRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'title' => 'required|max:20', 'url' => 'required', 'description' => 'max:200', 'Impressions' => 'max:200', ]; } }バリデーションルールをコントローラーメソッドのタイプヒントに指定
recommend/app/Http/Controllers/RecommendController.phpuse App\Http\Requests\RecommendPostRequest;recommend/app/Http/Controllers/RecommendController.phppublic function store(RecommendPostRequest $request) { Recommend::create($request->all()); return redirect()->route('recommends.index')->with('status', '投稿しました'); }recommend/app/Http/Controllers/RecommendController.phppublic function update(RecommendPostRequest $request, Recommend $recommend) { $recommend->update($request->all()); return redirect()->route('recommends.show', compact('recommend'))->with('status', '編集しました'); }エラーメッセージの表示
バリデーション反した場合、自動的にエラーメッセージを生成してくれます。
それを設定するため、以下のように記述しました。recommend/resources/views/recommends/edit.blade.php<tr> <th><input type="text" name='title' value="{{$recommend->title ?? ''}}"></th> @error('title') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror <th><input type="URL" name='url' value="{{$recommend->url ?? ''}}"></th> @error('url') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror <th><textarea name="description" id="" cols="30" rows="10">{{$recomend->description ?? ''}}</textarea></th> <th><textarea name="Impressions" id="" cols="30" rows="10">{{$recomend->Impressions ?? ''}}</textarea></th> </tr>
- 投稿日:2020-09-24T04:17:01+09:00
未経験の学生がWell Architected Frameworkを意識して自分なりにアーキテクチャ設計・構築をしてみた。<アーキテクチャ設計編>
はじめに
この記事は、実務未経験の大学生がロールプレイング形式でアーキテクチャの設計、構築を行うといった記事です。
よろしければ<準備編>もご覧くださいませ。前提条件の確認(ロールプレイング中)
- インフラエンジニアは4人
- 4人でインフラの構築、運用を行なっていかなければならない
- 自動化が重要
- 構築までの期間は1ヶ月
問題点
現環境の構築に携わったエンジニアにヒアリングを行い、現環境の問題点を整理しました。
Well-Architected フレームワークを元にアーキテクチャを考えた時に、現時点でのアーキテクチャでは以下の様な問題点が挙げられます。セキュリティ
- 通信にSSLが適用されていない
- セキュリティグループが適切に設定されていない(全てがフルオープンになっている)
- DDos等の一般的なセキュリティ対策を行なっていない
- データの暗号化が行われていない
- リソースに対する権限管理が曖昧である
- DBの接続情報など、設定ファイルにハードコーディングされている
信頼性
- 静的ファイルの保存先がEBSになっている
- 各リソースのスケーリングが行われていない
- 障害復旧の手順が決まっていない
運用の優秀性
- リソースの監視が行われていない
- ログの収集、分析を行なっていない
- デプロイが手動で行われている
- パッチ適用、メンテナンスが手動で行われている
コスト最適化
- リソースのコストを把握出来ない
パフォーマンス
- DBのキャパシティ、パフォーマンスに対する懸念がある
改善案
以下具体的な改善案です。
セキュリティ
通信にSSLが適用されていない
- ACM
- CloudFront、ALBへの関連付けを行いHTTPS化
セキュリティグループが適切に設定されていない(全てがフルオープンになっている)
VPC
- 通信の範囲に応じてSubnetを作成、Route Tableを定義する
- セキュリティグループを用いて必要最小限のアクセスのみを許可する
Systems Manager
- Session Managerを用いてSSHログインを行う
Config
- セキュリティグループのSSH全開放をAWS Configによる自動修復を行う
DDos等の一般的なセキュリティ対策を行なっていない
CloudFront
- ディストリビューションの作成
- 特定地域からのアクセスをブロックする
- CloudFrontからのアクセスのみを許可(オリジンへの直接アクセスを禁止)
Inspector
- 脆弱性を評価
AWS WAF
- WebACLの作成
データの暗号化が行われていない
RDS
- 通信の暗号化
KMS
- RDSのデータを暗号化
- EBSのボリュームを暗号化
リソースに対する権限管理が曖昧である
- IAM
- IAMロールの管理、リソースへの適用
DBの接続情報など、設定ファイルにハードコーディングされている
- Systems Manager
- Parameter Storeを用いてデータベースへの接続情報を保存、管理
信頼性
静的ファイルの保存先がEBSになっている
- S3
- 静的ファイルの保管をS3で行う
- サーバー間でのファイルの共有が可能、コスト、可用性、耐障害性の観点から
各リソースのスケーリングが行われていない
ALB
- ターゲットグループの作成
- ALBの作成
- AutoScalingの有効化(検討)
- AutoHealingの有効化(検討)
Cloudwatch
- AutoRecoveryの有効化(検討)
障害復旧の手順が決まっていない
フェイルオーバー
- Route53
- ヘルスチェックの有効化
- フェイルオーバールーティングの実装
- CloudFront
- カスタムエラーレスポンスとしてSorry Pageを実装
DRとしてパイロットライト
- RDS
- クロスリージョンレプリカの配置
- Lambdaを用いてマスターDBへの昇格を制御
- Cloudformation
- 別リージョンにスタックをコピー
- AMIのマッピング
スナップショット、AMIの管理
- AWS Backup
- RDSのスナップショット
- EBSのスナップショット
- ゴールデンイメージの管理
- バックアップイベントの通知
運用の優秀性
リソースの監視体制が不十分
Cloudwatch
- RDSのメトリクスを監視
- EC2インスタンスのメトリクスを監視
- CloudWatch Agentのインストール
- ELBのメトリクスを監視
- Cloudfrontのメトリクスを監視
- Cloudwatch Syntheticsを用いてサービス状況を監視
Personal Health Dashboard
- AWSの障害を通知
RDS
- イベントサブスクリプションによるイベントの通知
Trusted Advisor
- セキュリティの現状、不要なリソースの確認
Security Hub /
- Security Standardの有効化
- Slackに通知
GuardDuty /
- Slackに通知
ログの収集、分析を行なっていない
S3/Athena
- VPC FlowLogの作成、ログの収集、Athena分析
- CloudFrontのアクセスログの収集、Athena分析
- ELBのアクセスログの収集、Athenaによる分析
Systems Manager
- Session Managerの操作ログの収集
EC2
- Time Sync Serviceで時刻同期
CloudWatch Logs
- ログの収集、ロググループの作成
- メトリクスフィルタによるログの監視
- CloudWatch Logs Insightsによるログの分析
Kinesis Firehose
- AWS WAFのログの収集
デプロイが手動で行われている
- Code3兄弟
- Code3兄弟を用いたCI/CDパイプラインの構築
パッチ適用が手動
- Systems Manager
- SSM Agentのインストール
- Patch Managerを用いたパッチの自動化
- RunCommand、State Managerを用いた再起動の自動化
コスト最適化
リソースのコストを把握出来ない
Cost Explorer
- コスト分配タグの設定
- CostExplorerを用いて、コストを確認
IAM(Organization)
- リソースに対して、コスト管理の為のタグ付けの強制
Budgets
- 予算を設定し、コストの管理を行う
パフォーマンス
DBのキャパシティ、パフォーマンスに対する懸念がある
RDS
- リードレプリカの配置
- MySQLをAuroraMySQLに移行
- クラスターエンドポイント、リーダーエンドポイントの実装(検討)
- 容量のスケーリングの有効化
ElastiCache
- Auroraと併用し、クエリ結果をキャッシング
感想
アーキテクチャの設計が完了しました!
あとはこれを構築するだけです (...だけ?)アーキテクチャ図に3時間はかかっております
- 投稿日:2020-09-24T04:17:01+09:00
未経験者がWell Architected Frameworkを意識して自分なりにアーキテクチャ設計・構築をしてみた。<アーキテクチャ設計編>
はじめに
この記事は、実務未経験の大学生がロールプレイング形式でアーキテクチャの設計、構築を行うといった記事です。
よろしければ<準備編>もご覧くださいませ。前提条件の確認(ロールプレイング中)
- インフラエンジニアは4人
- 4人でインフラの構築、運用を行なっていかなければならない
- 自動化が重要
- 構築までの期間は1ヶ月
問題点
現環境の構築に携わったエンジニアにヒアリングを行い、現環境の問題点を整理しました。
Well-Architected フレームワークを元にアーキテクチャを考えた時に、現時点でのアーキテクチャでは以下の様な問題点が挙げられます。セキュリティ
- 通信にSSLが適用されていない
- セキュリティグループが適切に設定されていない(全てがフルオープンになっている)
- DDos等の一般的なセキュリティ対策を行なっていない
- データの暗号化が行われていない
- リソースに対する権限管理が曖昧である
- DBの接続情報など、設定ファイルにハードコーディングされている
信頼性
- 静的ファイルの保存先がEBSになっている
- 各リソースのスケーリングが行われていない
- 障害復旧の手順が決まっていない
運用の優秀性
- リソースの監視が行われていない
- ログの収集、分析を行なっていない
- デプロイが手動で行われている
- パッチ適用、メンテナンスが手動で行われている
コスト最適化
- リソースのコストを把握出来ない
パフォーマンス
- DBのキャパシティ、パフォーマンスに対する懸念がある
改善案
以下具体的な改善案です。
セキュリティ
通信にSSLが適用されていない
- ACM
- CloudFront、ALBに証明書の関連付けを行いHTTPS化を行う
セキュリティグループが適切に設定されていない(全てがフルオープンになっている)
VPC
- 通信の範囲に応じてSubnetを作成
- NAT Gatewayの作成、Route Tableを定義する
- セキュリティグループを用いて必要最小限のアクセスのみを許可する
Systems Manager
- Session Managerを用いてSSHログインを行う
Config
- セキュリティグループのSSH全開放をAWS Configによる自動修復によって修正する
DDos等の一般的なセキュリティ対策を行なっていない
CloudFront
- ディストリビューションの作成
- 特定地域からのアクセスをブロックする
- CloudFrontからのアクセスのみを許可(オリジンへの直接アクセスを禁止)
Inspector
- 脆弱性を評価
- Slackに通知を行う
AWS WAF
- WebACLの作成
データの暗号化が行われていない
RDS
- 通信の暗号化
KMS
- RDSのデータを暗号化
- EBSのボリュームを暗号化
リソースに対する権限管理が曖昧である
- IAM
- IAMロールの管理、リソースへの適用
DBの接続情報など、設定ファイルにハードコーディングされている
- Systems Manager
- Parameter Storeを用いてデータベースへの接続情報を保存、管理
信頼性
静的ファイルの保存先がEBSになっている
- S3
- サーバー間でのファイルの共有が可能、コスト、可用性、耐障害性の観点から静的ファイルの保管をS3で行う
各リソースのスケーリングが行われていない
ALB
- ターゲットグループの作成
- ALBの作成
- AutoScalingの有効化(検討)
- AutoHealingの有効化(検討)
Cloudwatch
- AutoRecoveryの有効化(検討)
障害復旧の手順が決まっていない
フェイルオーバー
- Route53
- ヘルスチェックの有効化
- フェイルオーバールーティングの実装
- CloudFront
- カスタムエラーレスポンスとしてSorry Pageを実装
DRとしてパイロットライト
- RDS
- クロスリージョンレプリカの配置
- Lambdaを用いてマスターDBへの昇格を制御
- Cloudformation
- 別リージョンにスタックをコピー
- AMIのマッピング
スナップショット、AMIの管理
- AWS Backup
- RDSのスナップショット
- EBSのスナップショット
- ゴールデンイメージの管理
- バックアップイベントをSlackに通知
運用の優秀性
リソースの監視体制が不十分
Cloudwatch
- RDSのメトリクスを監視
- EC2インスタンスのメトリクスを監視
- CloudWatch Agentのインストール
- ELBのメトリクスを監視
- Cloudfrontのメトリクスを監視
- Cloudwatch Syntheticsを用いてサービス状況を監視
Personal Health Dashboard
- AWSの障害をSlackに通知
RDS
- イベントサブスクリプションによるRDSのイベントを通知
Trusted Advisor
- セキュリティの現状、不要なリソースの確認を行う
Security Hub /
- Security Standardの有効化
- Slackに通知を行う
GuardDuty /
- Slackに通知を行う
ログの収集、分析を行なっていない
S3/Athena
- VPC FlowLogの作成、S3にログの収集、Athenaによる分析を行う
- CloudFrontのアクセスログをS3に収集、Athenaによる分析を行う
- ELBのアクセスログをS3に収集、Athenaによる分析分析を行う
Systems Manager
- Session Managerの操作ログの収集
EC2
- ログの正当性を担保する為にTime Sync Serviceで時刻同期を行う
CloudWatch Logs
- ログの収集、ロググループの作成
- メトリクスフィルタによるログの監視
- CloudWatch Logs Insightsによるログの分析
Kinesis Firehose
- AWS WAFのログの収集
デプロイが手動で行われている
- Code3兄弟
- Code3兄弟を用いたCI/CDパイプラインの構築
パッチ適用が手動
- Systems Manager
- SSM Agentのインストール
- Patch Managerを用いたパッチの自動化
- RunCommand、State Managerを用いた再起動、メンテナンスの自動化
コスト最適化
リソースのコストを把握出来ない
Cost Explorer
- コスト分配タグの設定
- CostExplorerを用いて、コストを確認
IAM(Organization)
- リソースに対して、コスト管理の為のタグ付けの強制
Budgets
- 予算を設定し、コストの管理を行う
- Slackへの通知
パフォーマンス
DBのキャパシティ、パフォーマンスに対する懸念がある
RDS
- リードレプリカの配置
- MySQLをAuroraMySQLに移行
- クラスターエンドポイント、リーダーエンドポイントの実装(検討)
- 容量のスケーリングの有効化
ElastiCache
- Auroraと併用し、クエリ結果をキャッシング
感想
アーキテクチャの設計が完了しました!
あとはこれを構築するだけです (...だけ?)アーキテクチャ図に3時間はかかっております
- 投稿日:2020-09-24T01:05:11+09:00
QRコードを生成するパッケージを使ってみた
QRコードを生成するパッケージを使ってみた
QRコードをパッケージを利用してサクッと作ってみた。
環境
- PHP 7.3.18
- composer 1.10.10
- Windows10 Home
- localhost
利用するもの
作成手順
- 任意のディレクトリに「QRコード」フォルダを作成
- コマンドプロンプトを起動して、「QRコード」内に入る。
- 下記を実行し、パッケージをインストールする。
composer require endroid/qr-code
- 「QRコード」ディレクトリ直下にindex.phpを作成し、下記のコードを貼り付ける。
<?php require_once __DIR__ . '/vendor/autoload.php'; use Endroid\QrCode\QrCode; $qrCode = new QrCode('Life is too short to be generating QR codes'); header('Content-Type: '.$qrCode->getContentType()); echo $qrCode->writeString();
- 下記を実行し、ローカルサーバーを立ち上げる。
php -S localhost:8080補足
composerでパッケージをインストールした際、私の環境では下記のエラーが表示された。
Problem 1 - endroid/qr-code 3.9.1 requires ext-gd * -> the requested PHP extension gd is missing from your system. - endroid/qr-code 3.9.0 requires ext-gd * -> the requested PHP extension gd is missing from your system. ode ^3.9 -> satisfiable by endroid/qr-code[3.9.0, 3.9.1]. To enable extensions, verify that they are enabled in your .ini files: e enabled in your .ini files: - C:\bin\php\php.ini You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.nal to see which files are used by PHP in CLI mode.JPEG,PNG,GIFなどの画像処理をする際に利用するgdというextensionが必要とのこと。
php.iniの該当箇所がコメントアウトされていたので有効にしたらインストールができるようになった。extension=gd2 ← ';'を消して保存すればOK
- 投稿日:2020-09-24T00:02:54+09:00
PHP Laravel 6 おすすめ映画投稿サイト作成過程 5:更新機能作成編
ルーティング
更新ページにはeditを使用します。
| GET|HEAD | recommends/{recommend}/edit | recommends.edit | App\Http\Controllers\RecommendController@edit | web |更新をDBに登録するにはupdateを使用します。
| PUT|PATCH | recommends/{recommend} | recommends.update | App\Http\Controllers\RecommendController@update | web |viewの作成
editに対するコントローラーの作成
recommend/app/Http/Controllers/RecommendController.phppublic function edit(Recommend $recommend) { return view('recommends.edit'); }editへのリンクをindexに追加
recommend/resources/views/recommends/index.blade.php<table> <thead> <tr> <th>タイトル</th> <th>画像:現在は空</th> <th>URL</th> <th>操作</th> </tr> </thead> @foreach($recommends as $recommend) <tr> <td>{{$recommend->title}}</td> <td>{{$recommend->image_file_name}}</td> <td>{{$recommend->url}}</td> <td><a href="{{route('recommends.show', $recommend->id)}}">詳細</a></td> <td><a href="{{route('recommends.edit', ['recommend' => $recommend])}}">編集</a></td> </tr> @endforeach </table>editからコントローラーへ更新内容を飛ばす
formタグで更新した内容を飛ばします。
この時、@method('PUT')を忘れずに。recommend/resources/views/recommends/edit.blade.php<table> <thead> <tr> <th>タイトル</th> <th>映画URL</th> <th>概要</th> <th>感想</th> </tr> <tr> <th><input type="text" name='title'></th> <th><input type="URL" name='url'></th> <th><textarea name="description" id="" cols="30" rows="10"></textarea></th> <th><textarea name="Impressions" id="" cols="30" rows="10"></textarea></th> </tr> </thead>DBの更新
editから受け取った内容を、Modelのアップデートメソッドを使用して更新します。
recommend/app/Http/Controllers/RecommendController.phppublic function update(Request $request, Recommend $recommend) { $recommend->update($request->all()); return redirect()->route('recommends.show', compact('recommend')); }