- 投稿日:2020-05-20T23:16:26+09:00
PHP&MySQLでデータの個数を数える方法(PDO)
MySQL接続をした後この処理をします。
$sql_form = "SELECT * FROM テーブル名"; $sql_form_result = $PDO -> query($sql_form); $form_row_count = $sql_form_result->rowCount();変数の名前は必要に応じて変えても大丈夫です。
$form_row_countという変数にデータ数が格納されています。
- 投稿日:2020-05-20T23:12:33+09:00
PHPでMySQLデータを繰り返し処理(while文)
//データベース接続 $dsn = 'mysql:dbname=データベース名;host=localhost'; $user = 'root'; $password = 'パスワード'; try{ $PDO = new PDO($dsn, $user, $password); }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } //データの取得 $sql_shop = "SELECT * FROM shopdata"; $sql_shop_result = $PDO -> query($sql_shop); //同じデータのgenreというフィールドがあった場合ひとつだけ取得する(必要に応じて削除可) $sql_genre = "SELECT DISTINCT genre FROM shopdata"; $sql_genre_result = $PDO -> query($sql_genre); //繰り返し処理(連想配列で取得) while($genre_row = $sql_genre_result->fetch(PDO::FETCH_ASSOC)){ $genre_rows[] = $genre_row; }
- 投稿日:2020-05-20T23:03:56+09:00
PHPでデータベースの重複を取得するには
<?php $query = $dbh->query("SELECT COUNT(*) FROM formdata WHERE userid = '".$userid."' AND kind = '".$kind."'"); $count = $query->fetchColumn(); if ($count > 0){ ?> <p align="center">投稿が重複しています</p> <?php }else{ // データの追加 $sql = 'INSERT INTO formdata(id, kind, star, message, userid) VALUES("'.$id.'","'.$kind.'","'.$star.'","'.$message.'","'.$userid.'")'; $stmt = $dbh -> prepare($sql); $stmt -> execute(); ?> <p align="center">投稿ありがとうございました。</p>mysqli接続だとfetchColumやprepare関数が使えなくなるのでpdo接続してあります。
2行目は
formdataというテーブルの中に
kindというフィールドがphpの変数kindと同じかつ、useridというフィールドがphpの変数useridと同じデータが
何個あるかカウントしています。4行目のif文で、カウントした個数が0よりも多かった場合に重複した時の処理を出力します。
(ここではhtmlのテキストを出力)10行目では、データが重複しなかったので新たなデータをデータベースに追加します。
id, kind, star, message, useridは追加するデータのフィールド名
- 投稿日:2020-05-20T22:52:38+09:00
phpでひとつ前のページにリダイレクトする方法
header('Location: '.$_SERVER['HTTP_REFERER']); exit;リダイレクトで処理が中断されるのでexit;を書いておきましょう。
- 投稿日:2020-05-20T22:52:38+09:00
PHPでひとつ前のページにリダイレクトする方法
header('Location: '.$_SERVER['HTTP_REFERER']); exit;リダイレクトで処理が中断されるのでexit;を書いておきましょう。
- 投稿日:2020-05-20T22:49:49+09:00
phpでmysqlのデータを取得して操作する方法
//データベース接続 $dsn = 'mysql:dbname=テーブル名;host=localhost'; $user = 'root'; $password = 'パスワード'; try{ $PDO = new PDO($dsn, $user, $password); }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } // データの追加 $sql = 'INSERT INTO formdata(id, kind, star, message, userid) VALUES("'.$id.'","'.$kind.'","'.$star.'","'.$message.'","'.$userid.'")'; $stmt = $dbh -> prepare($sql); $stmt -> execute(); //データの編集(更新) $sql = ('UPDATE formdata SET star = :star,message = :message WHERE id = :id'); $stmt = $PDO->prepare($sql); $params = array(':star' => $star, ':message' => $message, ':id' => $form_id); $stmt->execute($params); //データの削除 $sql = ('DELETE FROM formdata where id = :id'); $stmt = $PDO->prepare($sql); $params = array(':id' => $form_id); $stmt->execute($params);formdataにはテーブル名を代入します。
idはprimary keyにしてあります。
star,messageはテーブルのフィールド名です。
- 投稿日:2020-05-20T22:43:59+09:00
phpでmysqlにpdo接続するには
//データベース接続 $dsn = 'mysql:dbname=データベース名;host=localhost'; $user = 'root'; $password = 'パスワード'; try{ $PDO = new PDO($dsn, $user, $password); }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); }エラーの時はメッセージが表示されるようにしておきます
- 投稿日:2020-05-20T21:33:02+09:00
Contact Form 7とJavaScriptで特殊なバリデーションをする方法
やりたいこと
contact-form-7で、特殊なバリデーションをして欲しいと言われました。
例えば、言われたこととしては ↓
- 半角英数字、大文字でかつ10文字の規制をお願いします。
- これは極端な話、aと入力したら自動でAとなる。と思っていいですよね。
これを実現したい場合、下記のように実装すると出来るようになります。
contents-form7
フォームでは、idを用いて操作します。
[text* coupon-code-2-1 class:secure-key id:Name01]functions.phpに追加
固定ページで、jQueryを使うために、カスタムJSを使えるようにします。functions.phpの最後にこれを追加してください。
//Custom JS Widget add_action('admin_menu', 'custom_js_hooks'); add_action('save_post', 'save_custom_js'); add_action('wp_head','insert_custom_js'); function custom_js_hooks() { add_meta_box('custom_js', 'Custom JS', 'custom_js_input', 'post', 'normal', 'high'); add_meta_box('custom_js', 'Custom JS', 'custom_js_input', 'page', 'normal', 'high'); } function custom_js_input() { global $post; echo '<input type="hidden" name="custom_js_noncename" id="custom_js_noncename" value="'.wp_create_nonce('custom-js').'" />'; echo '<textarea name="custom_js" id="custom_js" rows="5" cols="30" style="width:100%;">'.get_post_meta($post->ID,'_custom_js',true).'</textarea>'; } function save_custom_js($post_id) { if (!wp_verify_nonce($_POST['custom_js_noncename'], 'custom-js')) return $post_id; if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id; $custom_js = $_POST['custom_js']; update_post_meta($post_id, '_custom_js', $custom_js); } function insert_custom_js() { if (is_page() || is_single()) { if (have_posts()) : while (have_posts()) : the_post(); echo '<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script><script type="text/javascript">'.get_post_meta(get_the_ID(), '_custom_js', true).'</script>'; endwhile; endif; rewind_posts(); } }カスタムjs
で、最後に、カスタムjsに下記をコピペしてください。
/** * 半角英数字かチェック * @return true:半角英数字である(もしくは対象文字列がない), false:半角英数字でない */ function isHalfWidthAlphanumeric(value) { if ( value == null ) return; if( value.match( /[^A-Za-z0-9\s.-]+/ ) ) { alert("半角英文字で入力してください"); return false; } return true; } $(function(){$("#Name01").blur(function(){ if ( !isHalfWidthAlphanumeric($(this).val()) ) { $(this).focus(); } });}); $(function(){$("#Name01").blur(function(){document.getElementById("Name01").value=$(this).val().toUpperCase();});});
- 投稿日:2020-05-20T21:26:47+09:00
LaravelでIntervention Imageを利用して画像のサイズ(容量)を下げる方法
利用シーン
Laravelで開発をしていて、サーバーに画像を沢山アップすることが想定されるとき。
背景
Intervention ImageはPHPで扱える画像処理のライブラリ。
blurをかけたり、縦横幅をリサイズしたり、回転させたりと多岐にわたる機能を実現している。
http://image.intervention.io/しかし, 画像の容量を1MB未満に抑えたい、という要求に対してストレートに応えてくれる機能はない。(もし見つけたらご教示ください)
他のライブラリを探すのも面倒なので、機能を組み合わせて自分で作ってしまえばいいやということで関数を作ってみました。
コード
/** * @param UploadedFile $img_file 画像ファイル(*今回はUploadedFileを利用) * @param string $path 画像の保存パス * @param int $quality 画像の解像度の初期設定 * @param int $size ここまで下げたいという画像サイズの値 */ public function compressImage(UploadedFile $img_file, string $path, int $quality, $size) { $image = Image::make($img_file); $image->save($path, $quality); // クオリティを下げた後のファイルサイズが十分下がっていなければもう一度関数を呼び出す $image = Image::make($path); if($image->filesize() > $size){ $quality -= 5; return $this->compressImage($img_file, $path, $quality, $size); } }解説
$image = Image::make($img_file); $image->save($path, $quality);画像ファイルを読み込み、save()メソッドで任意の解像度に下げて保存。
*ドキュメントにはデフォルトで90と書いてありますが80未満で設定しておくと吉。
http://image.intervention.io/api/save$image = Image::make($path); if($image->filesize() > $size){ $quality -= 5; return $this->compressImage($img_file, $path, $quality, $size); }保存した画像を改めて読み込み、
filesize()メソッドで画像のファイル容量を確認。
ファイル容量が設定したサイズ(1MBなら1024000を入力)よりも大きければ、
解像度を5低く設定してもう一度同じ関数を再帰的に呼び出す。使い方
この関数をヘルパ関数として登録して
hoge.php$file = $request->file('img'); $path = "your/path"; $quality = 80; $size = 1024000; $resized_img = compressImage($file, $path, $quality, $size);とすれば使えます。
終わりに
もし他に良い方法や改善できる箇所がありましたらご教示ください。
- 投稿日:2020-05-20T21:00:48+09:00
Touch Barにタスク管理ツールのタスクを自動表示させる【PHP×GoogleCalendarAPI】
最近MacBookAir13インチを卒業し、MacBookPro16インチを購入したのですが、こいつはすごいですね。
TouchBarとかいう近未来的なディスプレイ(
壮大なおもちゃ
)がついています。ここにスクリプトを書いて何か面白いことしたい(有効活用したい)と誰しも一度は思うのではないでしょうか。
私はこの記事以前に
「YouTubeの登録者数と再生数を表示させたい!」
と以前考え実装したのですが、これだけでは満足できず、今度は
今現在時刻のタスクを表示させたい!!
と考えました。本記事のゴール
タスク管理ツールに予定を入れたら、あとはTouchBarに自動で現在時刻のタスクが出てくる
完成像
こんな感じになりました。
高度な生産性はシングルタスクができるかにかかっています。
マルチタスクになって何も為せない日々が続いていませんか?
タスクを1つだけ表示させることで、目の前の作業に集中できるのです。
仕様紹介
今回タスク管理ツールには、APIが充実している
Googleカレンダー
を採用しました。基本的な流れ
- まずはGoogleカレンダーにタスク登録
- 次にGoogleCalendarAPIに登録し、PHPでイベント取得
- Better Touch Toolでphpコマンドで発火
という手順を踏みます。
前提条件、環境
OS:macOS Catalina
バージョン:PHP 7.3.12
Composer1.9.0
Better Touch Tool導入済①下準備
まずはGoogleCalendarAPI及びサービスアカウントとの紐付け、権限周りを以下の記事で行ってください。
ついでにまだカレンダーで予定作ってない方は予定を組んでおいてください。
②Composerで必要なものをインストール
A PHP client library for accessing Google APIs
https://github.com/googleapis/google-api-php-clientgithubより.zip形式でダウンロードしインストールもできますが、今回はcomposerでインストールします。
composerない方はgithubよりダウンロードもOKですが、composer便利なのでこの機会に導入しましょう。cdコマンドで作業ディレクトリに移動したのちに(今回はcalendarディレクトリとしました。どこに作成してもいいです。)
composerコマンドを実行します。$ composer require google/apiclient:^2.0いろいろなファイルが作成され以下のようなディレクトリになります。
calendar/
├ comoser.json(composerで自動作成される)
├ composer.lock(自動作成)
├ Googleサービスアカウント秘密鍵.json(下準備時にDLしてるはず)
├ vendor/
│ └ outoload.php他(自動作成)
└ calendar.php(今回の処理書く作業ファイル、まだ空でいい)サービスアカウント作成時にできた秘密鍵のjsonをここに移動させ、calendar.phpは空でいいので作成しておいてください。
③PHPでデータ取得、表示
先ほど作成したcalendar.phpに記述します。
<?php // composerでインストールしたライブラリを読み込む require_once __DIR__ . '/vendor/autoload.php'; // サービスアカウント作成時にダウンロードしたjsonファイル $aimJsonPath = __DIR__ . '/あなたの秘密鍵.json'; // サービスオブジェクトを作成 $client = new Google_Client(); // アプリケーション名 $client->setApplicationName('Touch Bar Display ToDos'); // 予定を取得するだけなので、Google_Service_Calendar::CALENDAR_READONLY $client->setScopes(Google_Service_Calendar::CALENDAR_READONLY); // ユーザーアカウントのjsonを指定 $client->setAuthConfig($aimJsonPath); // サービスオブジェクトの用意 $service = new Google_Service_Calendar($client); // カレンダーIDは後述 $calendarId = 'xxxxxxxxxxxxxxxxx'; // 開始日時 $start = date('c'); // 終了日時(1分後) $end = date('c', strtotime("+1 minute")); // 取得時の詳細設定 $startから1分後を$endとすることで、取得範囲を現在時刻のようにしている $option = [ 'timeMin' => $start, 'timeMax' => $end, 'singleEvents' => 'true' ]; // データの取得 $response = $service->events->listEvents($calendarId, $option); $events = $response->getItems(); $results = []; if (!empty($events)) { foreach ($events as $event) { $start = new DateTime($event->start->dateTime); $end = new DateTime($event->end->dateTime); $results = [ 'start' => $start->format('H:i'), 'end' => $end->format('H:i'), 'title' => (string) $event->summary ]; } echo $results['start'] . "〜"; echo $results['end'] . "\n"; echo $results['title']; } else { //カレンダーにタスクがない場合のメッセージ。自由に改変してください。 echo 'no task'; }optionはリファレンス参照してみてください。
カレンダーIDはどこから?
カレンダー左の「設定と共有」から
「カレンダーの統合」を見つければIDがわかります。
Better Touch Toolはechoしたものをretutnして表示できる
最後に取得した値を
echo
しているのは、Better Touch Toolが取得できるようにするためです。④Better Touch Toolから発火させる
まずはBetter Touch Toolを開き、以下の画面のように追加します。
ここからphpファイルを実行していきます。
手順としては
①cdコマンドでphp実行ファイルが入っているディレクトリまで移動して、
②phpコマンドを叩きphpファイルを実行するでいけます。
デスクトップにディレクトリを作られられた方はこんなコードになるかなと(
return do shell scriptは必ず必要になります
)return do shell script "cd /Users/ここは人によって違う名前/Desktop/calendar/ ; php calendar.php"その後
スクリプトを実行
を押し、画像のようにスクリプト結果
にタスクが出力されたら、完了になります。同時に
各スクリプトの実行タイミング
がデフォルトでは5seconds
となっており、これではすぐにAPIアクセス制限がかかるので、300secondsあたりに変更しておきます(ただ数分タスク更新がズレるので値はお好みで)これにてtouch Barに表示されているはずです。
このままだと文字サイズが大きいのでptをいじり調整。
表示できたら、脱マルチタスクへの第一歩だ
タスクがない場合はelse部分のメッセージが表示されます。
- 投稿日:2020-05-20T21:00:48+09:00
MacBookのTouch BarにGoogleカレンダーの現在時間のタスクを表示させる【GoogleCalendarAPI】
最近MacBookAir13インチを卒業し、MacBookPro16インチを購入したのですが、こいつはすごいですね。
TouchBarとかいう近未来的なディスプレイ(
壮大なおもちゃ
)がついています。ここにスクリプトを書いて何か面白いことしたい(有効活用したい)と誰しも一度は思うのではないでしょうか。
私はこの記事以前に
「YouTubeの登録者数と再生数を表示させたい!」
と以前考え実装したのですが、これだけでは満足できず、今度は
今現在時刻のタスクを表示させたい!!
と考えました。ごく自然な欲求かと思います。本記事のゴール
タスク管理ツールに予定を入れたら、あとはTouchBarに自動で現在時刻のタスクが出てくる
完成像
こんな感じになりました。
高度な生産性はシングルタスクができるかにかかっています。
マルチタスクになって何も為せない日々が続いていませんか?
タスクを1つだけ表示させることで、目の前の作業に集中できるのです。
仕様紹介
今回タスク管理ツールには、APIが充実している
Googleカレンダー
を採用しました。基本的な流れ
- まずはGoogleカレンダーにタスク登録
- 次にGoogleCalendarAPIに登録し、PHPでイベント取得
- Better Touch Toolでphpコマンドで発火
という手順を踏みます。
前提条件、環境
OS:macOS Catalina
バージョン:PHP 7.3.12
Composer1.9.0
Better Touch Tool導入済①下準備
まずはGoogleCalendarAPI及びサービスアカウントとの紐付け、権限周りを以下の記事で行ってください。
ついでにまだカレンダーで予定作ってない方は予定を組んでおいてください。
②Composerで必要なものをインストール
A PHP client library for accessing Google APIs
https://github.com/googleapis/google-api-php-clientgithubより.zip形式でダウンロードしインストールもできますが、今回はcomposerでインストールします。
composerない方はgithubよりダウンロードもOKですが、composer便利なのでこの機会に導入しましょう。cdコマンドで作業ディレクトリに移動したのちに(今回はcalendarディレクトリとしました。どこに作成してもいいです。)
$ composer require google/apiclient:^2.0いろいろなファイルが作成され以下のようなディレクトリになります。
calendar/
├ comoser.json(composerで自動作成される)
├ composer.lock(自動作成)
├ Googleサービスアカウント秘密鍵.json(下準備時にDLしてるはず)
├ vendor/
│ └ outoload.php他(自動作成)
└ calemdar.php(今回の処理書く作業ファイル、まだ空でいい)サービスアカウント作成時にできた秘密鍵のjsonをここに移動させ、calendar.phpは空でいいので作成しておいてください。
③PHPでデータ取得、表示
先ほど作成したcalendar.phpに記述します。
<?php // composerでインストールしたライブラリを読み込む require_once __DIR__ . '/vendor/autoload.php'; // サービスアカウント作成時にダウンロードしたjsonファイル $aimJsonPath = __DIR__ . '/あなたの秘密鍵.json'; // サービスオブジェクトを作成 $client = new Google_Client(); // アプリケーション名 $client->setApplicationName('Touch Bar Display ToDos'); // 予定を取得するだけなので、Google_Service_Calendar::CALENDAR_READONLY $client->setScopes(Google_Service_Calendar::CALENDAR_READONLY); // ユーザーアカウントのjsonを指定 $client->setAuthConfig($aimJsonPath); // サービスオブジェクトの用意 $service = new Google_Service_Calendar($client); // カレンダーIDは後述 $calendarId = 'xxxxxxxxxxxxxxxxx'; // 開始日時 $start = date('c'); // 終了日時(1分後) $end = date('c', strtotime("+1 minute")); // 取得時の詳細設定 $startから1分後を$endとすることで、取得範囲を現在時刻のようにしている $option = [ 'timeMin' => $start, 'timeMax' => $end, 'singleEvents' => 'true' ]; // データの取得 $response = $service->events->listEvents($calendarId, $option); $events = $response->getItems(); $results = []; if (!empty($events)) { foreach ($events as $event) { $start = new DateTime($event->start->dateTime); $end = new DateTime($event->end->dateTime); $results = [ 'start' => $start->format('H:i'), 'end' => $end->format('H:i'), 'title' => (string) $event->summary ]; } } echo $results['start'] . "〜"; echo $results['end'] . "\n"; echo $results['title'];;optionはリファレンス参照してみてください。
カレンダーIDはどこから?
カレンダー左の「設定と共有」から
「カレンダーの統合」を見つければIDがわかります。
Better Touch Toolはechoしたものをretutnして表示できる
最後に取得した値を
echo
しているのは、Better Touch Toolが取得できるようにするためです。④Better Touch Toolから発火させる
まずはBetter Touch Toolを開き、以下の画面のように追加します。
ここからphpファイルを実行していきます。
手順としては
①cdコマンドでphp実行ファイルが入っているディレクトリまで移動して、
②phpコマンドを叩きphpファイルを実行するでいけます。
デスクトップにディレクトリを作られられた方はこんなコードになるかなと(
return do shell scriptは必ず必要になります
)return do shell script "cd /Users/ここは人によって違う名前/Desktop/calendar/ ; php calendar.php"その後
スクリプトを実行
を押し、画像のようにスクリプト結果
にタスクが出力されたら、完了になります。同時に
各スクリプトの実行タイミング
がデフォルトでは5seconds
となっており、これではすぐにAPIアクセス制限がかかるので、300secondsあたりに変更しておきます(ただ数分タスク更新がズレるので値はお好みで)これにてtouch Barに表示されているはずです。
このままだと文字サイズが大きいのでptをいじり調整。
表示できたら、脱マルチタスクへの第一歩だ
- 投稿日:2020-05-20T20:21:28+09:00
Wordpressでphpのデバッグをしたい
wp-config.confの
WP_DEBUG
をtrue
に変更して以下を追加する。wp-config.confdefine( 'WP_DEBUG', true ); if ( WP_DEBUG ) { define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false ); @ini_set( 'display_errors', 0 ); }あとは適当なphpファイルで
error_log()
を使って出力する。functions.phperror_log('this is debug.');wp-content以下に
debug.log
が出力されるので確認できる。debug.log[20-May-2020 00:00:00 UTC] this is debug.
- 投稿日:2020-05-20T15:36:21+09:00
PHP初心者がMacでLaravelに挑む
(試験的に勉強兼ねて英語で書いてみた)
Goal
- To learn from the environment setup to the fundamental usage
- To create a To-do app with Laravel
Environment setup
0. Development environment
Mac OS Catalina 10.15.4
MacBook Air (13-inch, Mid 2013)1. Downloading & Installing
1.1. Choosing the version
Laravel 7 (the latest version as of May 2020)
PHP 7.3.11 (Laravel 7 requires above 7.2.5)1.2. Installing composer
Access the above website and click
Download
Execute these four lines on this webpage like:
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" $ php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" $ php composer-setup.php $ php -r "unlink('composer-setup.php');"They mean that in order:
・ Download the installer to the current directory ・ Verify the installer SHA-384 ・ Run the installer ・ Remove the installerMove Composer
$ mv composer.phar /usr/local/bin/composerCheck if it succeeded
$ composer -V Composer version 1.10.6 2020-05-06 10:28:101.3. Installing Laravel
Create a project called
sample
, or what else you like.$ composer create-project --prefer-dist laravel/laravel sample1.4. Starting a server
Move into the directory you made and start a server.
$ cd sample $ php artisan serveTry to access your local server:
http://localhost:8000
on a web browser!
Congratulations!!
Creating a ToDo app
Now I start to create a ToDo app known as that is simple and easy to develop for even a beginner.
I referred to this website:
Laravelの知識ゼロから基本をマスターするチュートリアル | Awesome BlogReferences
- 投稿日:2020-05-20T14:45:52+09:00
WordPress で、Snow Monkey Blocks のブロックを初期配置する
WordPressには、新規投稿にあらかじめブロックを初期配置しておく機能があります。
(初期配置について詳しくは、WordPressユーザーのためのPHP入門 はじめから、ていねいに。第3版 p229-231を参照してください)
この機能は、WordPressのデフォルトで用意されているブロックだけでなく、テーマやプラグインの独自ブロックにも適用できます。
アコーディオンブロックを置いてみる
試しに、Snow Monkey Blocks のアコーディオンブロックを置いてみました。
置いたブロックは、
1. 見出しブロック - 「あらすじ」という文字列を初期設定する
2. 段落ブロック
3. アコーディオンブロック - 「ネタバレ」という文字列を初期設定するです。見出しと段落はWP標準のブロックで、アコーディオンは Snow Monkey Blocks です。
コード例
書いたコードは以下のようになります。
$post_type_object->template = [ [ 'core/heading', [ 'level' => '2', 'content' => 'あらすじ' ] ], [ 'core/paragraph', [ ] ], [ 'snow-monkey-blocks/accordion--item', [ 'title' => 'ネタバレ', ] ], ]フックなどの詳細はWordPressユーザーのためのPHP入門 はじめから、ていねいに。第3版 でご確認ください。
ブロック名はどうやって調べる?
↑のコードでは、
core/heading
等の名前で、ブロックを指定しています。ではこのブロックの名前はどうやって調べたらよいでしょうか?WordPressのデフォルトのブロックは、WordPressのデフォルトのブロック一覧ページで名前を確認できます。
テーマ・プラグインの場合は、作者のウェブサイトやソースコードなどで確認します。Snow Monkey Blocksの場合は、ソースコードを読んでいくと https://github.com/inc2734/snow-monkey-blocks/blob/master/block/accordion/block/item/index.js#L11
snow-monkey-blocks/accordion--item
という名前であることが分かります。
また属性は https://github.com/inc2734/snow-monkey-blocks/blob/master/block/accordion/block/item/attributes.json を見るとtitle
とinitialState
が設定できることが分かります。複数人で記事を書くときに便利
ブロックを初期配置する機能を使うと、複数人で記事を書くときに便利です。ブックレコメンド では、寄稿者に下書きを作成してもらうことがあるのですが、そのようなときに便利です。
- 投稿日:2020-05-20T13:37:43+09:00
Windows10 に PHP7+Laravel環境をDockerで構築
概要
掲題のとおり「Windows10 に PHP7+Laravel環境をDockerで構築」を、
↓こちらの神記事を参考に、初心者向けに解説していきます。「どうしてそういう設定を施すのか?」といったことは元記事が丁寧に説明して下さっているので、ここではとにかくローカルPC内にLaravelサーバを立ち上げるまでの手続きを駆け足でご紹介すると共に、Windows10でやると行きづまる所を補足しています。
私が試した環境
- Windows10 Pro 64bit版
- Docker Desktop for Windows - 2.3.0.2 (今回の手順中でインストールします)
- Git for Windows - 2.25.0.windows.1 (今回の手順中でインストールします)
- Make for Windows - 3.81 (今回の手順中でインストールします)
下準備編
いくつかのソフトウェアが必要なので、ダウンロード&インストールしましょう。
Docker, docker-compose(Docker Desktop for Windows)
↓こちらをご参考に。
※ ↑の記事内に記載していますが、Windows10のエディションやパソコンのCPUによる条件がありますので、ご注意下さい。
Git, Git-Bash(Git for Windows)
↓こちらからダウンロードしてインストールしましょう。
https://gitforwindows.org/Git for Windows を入れれば Git-Bash も一緒に入ります。
make for Windows
元記事では
make
コマンドを使用されているので必要です。
(複雑なコマンドをショートカットのようにまとめるのに使用されています。)↓こちらからダウンロードしてインストールしましょう。
http://gnuwin32.sourceforge.net/packages/make.htmmakeコマンドがあるフォルダを環境変数
PATH
に追加しておく。どこからでも
make
コマンドを打てるようにしておきましょう。
手順は割愛しますが、代わりに↓こちらの記事を紹介させていただきます。makeコマンドがあるフォルダの場所は、デフォルトのインストール設定では↓です。
C:\Program Files (x86)\GnuWin32\binmake for Windows をインストールするときにインストール先フォルダをカスタマイズした場合は、↑を参考に探してみてください。
一部コマンドをwinpty経由で実行するよう設定する。
Gitインストール時、オプション
Use MinTTY
をONにした場合、この設定作業が必要です。
- Windowsにログオンしているユーザーのホームフォルダ(例:
C:\Users\山田太郎
)の中に.bashrc
という名前のテキストファイルを作ります。(すでに存在する場合は不要です。).bashrc
の中身に↓を追記して保存します。alias docker='winpty docker' alias docker-compose='winpty docker-compose' alias make='winpty make'Git-Bashに慣れている方は、vimコマンドなどで作業してももちろんOKです!
※ winptyは、Windowsへのコマンド指示をLinuxっぽいインターフェースでできるようにするラッパー的なソフトです。
ここでは、docker
、docker-compose
、make
コマンドだけ、自動的にwinpty経由で実行するよう設定をしています。
これをしないと、dockerコンテナの中に入って作業する系のコマンドが↓のようなエラーで失敗します。$ docker-compose exec app composer create-project --prefer-dist laravel/laravel . the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'また
make
の中で実行されるコマンドもwinpty経由で実行させるにはmake
自体をwinpty経由で実行しなければダメなので、3行目でそのように設定しています。構築編
こちらは駆け足でザッと参ります。
一通り完了したら、ぜひ元記事も読んでみてください。Git-Bashを起動する。
適当なフォルダを作って移動する。
ソースコードをダウンロードして色々やるので、万が一汚れても大丈夫なフォルダを作ってそこで作業しましょう。
ここでは例として、Cドライブ直下にtempというフォルダを作ってそこに移動してます。cd /c mkdir temp cd temp元記事で公開されているソースコード一式をダウンロードする。
githubに公開されているので、gitコマンドを使ってダウンロードします。
git clone git://github.com/ucan-lab/docker-laravel.gitgithubアカウントを持ってなくてもダウンロードできるはず…
もし途中でkeyがうんたらと英語で質問が表示されたら、yes
と入力してリターンキー押しておけばOK!
make
コマンド向け設定ファイルが存在するフォルダに移動する。cd docker-laravel/infrastructure
LaravelサンプルWEBサイトを新規作成するコマンドを実行する。
make create-project数分かかるかも。
ずらーっと流れるログが↓のようになって止まったらOK。・ ・ ・ Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Package manifest generated successfully. 32 packages you are using are looking for funding. Use the `composer fund` command to find out more! XXXXXX@XXXXX MINGW64 /c/temp/docker-laravel/infrastructure $LaravelサンプルWEBサイトにアクセスしてみる。
↓をWEBブラウザで開いてみてください。
http://127.0.0.1これはLaravelフレームワークを使って作られているサンプルWEBページで、それを動かすためのWEBサーバが自分のPC内で起動している証です。
お疲れ様でした。
この記事では端折った部分もあるので、ぜひ元記事も一読してみてください。
- 投稿日:2020-05-20T12:44:24+09:00
PHPer脳の人がJavaScriptでarray_sumをする
前提
例えば、レジみたいなプログラム組むときにこんな感じの連想配列にぶち当たることがあるかと思います。
品名(name) 金額(price) ナナチ 100 ストロングゼロ 118 で、こいつの総額の計算を出したいって思うことがあると思うんですよ。
これくらいなら暗算とか言わないでプログラムで計算してくださいね。PHPで書く
PHPだとこんな感じに書けると思います。
$items = [ ['name' => 'ナナチ', 'price' => 100], ['name' => 'ストロングゼロ', 'price' => 118], ]; $sub_total = array_sum(array_map(function($i){ return $i['price']; }, $items)); echo $sub_total; // 218この
array_sum()
という関数は「引数にとった配列の合計値を出す」ってやつなのです。
便利ですよね。
https://www.php.net/manual/ja/function.array-sum.phpJavaScriptで書く
んで、JavaScriptなんですけど、
array_sum()
相当のものはないです。
その代わりArray.prototype.reduce()
というのを使います。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceってなわけでこんな感じになります。
const items = [ {'name': 'ナナチ', 'price': 100}, {'name': 'ストロングゼロ', 'price': 118}, ]; const subTotal = items.reduce((accumulator, currentValue) => { return accumulator + currentValue.price; }); console.log(subTotal); // 218参考に
PHPにも
array_reduce()
はあります。
https://www.php.net/manual/ja/function.array-reduce.phpさっきのを
array_reduce()
で書くとこんな感じですかね?$items = [ ['name' => 'ナナチ', 'price' => 100], ['name' => 'ストロングゼロ', 'price' => 118], ]; $sub_total = array_reduce($items, function($carry, $item){ return $carry + $item['price']; }); echo $sub_total; // 218意外とスッキリ書けるもんですね。array_mapするくらいならこっちでもいいのかも。
- 投稿日:2020-05-20T09:11:40+09:00
cactiでトラフィックとかリソースのグラフをカレンダー形式で表示させるプラグインを作成したので、簡単なプラグインの作り方をまとめました
はじめに
使ってますか、cacti。いまいち人気ないような気がするんですよね。さみしい。
私はいまだにcactiから離れられませんので、プラグインを作ってみました。トラフィックのグラフって、カレンダーで見る需要あんまりないのかなぁ。ニヤニヤできると思うのに。「毎月第2水曜日はWindowsUpdateの日!」とか。 #cacti https://t.co/oxrTP1ylD3
— bashaway (@bashaway) May 19, 2020https://github.com/bashaway/rrdcalendar
cactiでのプラグインの作り方を簡単にまとめましたので、なんか作りたい、という方の参考になれば幸いです。
対象機器および環境
- cacti (1.2.11)
プラグインの作り方
公式マニュアル
公式マニュアル は、ところどころ古いバージョンの記載もあるので、動作に必要な最低限の部分だけ抽出してみます。
ファイル構成
ツリー構造
以下のようなツリー構造が推奨されています。
プラグインを収容するディレクトリが、プラグイン名として認識されます。以下の例だとmyplugin
がプラグインの名称になります。myplugin/ docs/ CHANGELOG images/ myimage.png index.php lib/ index.php function2s.php include/ index.php settings.php INFO LICENSE README.md index.php setup.phpお作法もありますが、「動作させる」ためには以下のものが必須です。
内容 ファイル名 必須? docs/ ドキュメント類 images/ 画像類 lib/ 自作ライブラリ ディレクトリの
直下でもOKinclude/ 自作スクリプト群 ディレクトリの
直下でもOKINFO プラグイン定義 必須 LICENSE ライセンス README.md マニュアル index.php マッピング用php 必須 setup.php インストール用php 必須 プラグイン定義
公式マニュアル
INFOファイルのことですプラグインの情報を持ち、以下の画面で表示させるときに利用されます。
また、バージョン相違や依存プラグインの有無などで、インストールできなくさせることができます。(歯車に黄色のビックリマークはインストールできない)以下のようなファイル形式です。
INFO[info] name = プラグイン名(ディレクトリ名と一致していなければいけません) version = プラグインのバージョン(Versionに対応) longname = プラグインの説明(PluginDescriptionに対応) author = プラグイン作成者(Authorに対応) email = メールアドレス homepage = プラグインの公開元(PluginNameのリンク先に対応) compat = 利用可能なcactiバージョンの最小値 requires = このプラグインが必要とするプラグイン名(Requiresに対応) capabilities = (すいませんよくわかりません)プラグイン名=ディレクトリ名=INFOに記載されたname である必要があります。
これが一致していないと、以下のように、歯車にビックリマークが付き、インストールできません。
これは、cycle
というプラグインのディレクトリ名をcycle_check
に変更したときの表示です。
また、INFOファイルのrequiresに記載があり、そのプラグインがインストールされていないと、歯車にビックリマークが付き、インストールできません。
例えば、monitorというプラグインはtholdの1.2.1が必要で、INFOには以下のような記載があります。monitor/INFO[info] (~省略~) requires = thold:1.2.1 (~省略~)tholdがインストールされていない場合、プラグイン一覧では以下のような表示になっています。
マッピング用php
公式マニュアル
index.php
のことです。
以下のファイルでOKだそうです。index.php<?php header("Location:../index.php"); ?>インストール用php
公式マニュアル
setup.php
のことです。
以下の関数が必ず含まれている必要があります。
plugin_プラグイン名_install()
plugin_プラグイン名_uninstall()
plugin_プラグイン名_check_config()
plugin_プラグイン名_upgrade()
plugin_プラグイン名_version()
今回作成したプラグインで利用した関数も含めて、必要な関数を紹介します。
setup.php<?php # インストールのアイコンがクリックされると、この関数が呼び出されます # ここでインストール時に必要な設定を行います。 plugin_プラグイン名_install(){ # cactiのweb画面にタブを表示させたい場合は、第二引数に"top_header_tabs"を持たせたフック関数を呼び出します。 # 今回はタブの表示が不要なので、必要ありません。 api_plugin_register_hook('プラグイン名', 'top_header_tabs', 'プラグイン名_show_tab', 'setup.php'); # 今回作成したプラグインは、グラフの横のアイコンにプラグイン起動用のアイコンを配置しているため、以下の関数を呼び出します。 api_plugin_register_hook('プラグイン名', 'graph_buttons', 'プラグイン名_graph_buttons', "setup.php"); api_plugin_register_hook('プラグイン名', 'graph_buttons_thumbnails', 'プラグイン名_graph_buttons', "setup.php"); # このプラグインで呼び出し可能なスクリプトを記載します。 # これは Console -> Configuration -> Users -> 各ユーザ -> Permissionsタブの画面の下のほうにある # Plugin Permissions のON/OFFを設定可能にします。デフォルト設定で0もしくは1で設定します。 # つまり、ユーザごとにこのプラグインを利用させるかどうか、を設定することができるようになります。 api_plugin_register_realm('プラグイン名', '利用可能なスクリプト名', 'パーミッション設定画面での表示名', {0|1}); # インストール時にテーブル作成などが必要な場合は、このあたりに記載します。 plugin_プラグイン名_なんちゃら関数(); } # プラグインのアンインストール関数がクリックされると、この関数が呼び出されます # ここでアンインストール時に必要な設定を行います。 plugin_プラグイン名_uninstall(){ # アンインストール時にテーブル削除などが必要な場合は、このあたりに記載します。 plugin_プラグイン名_なんちゃら関数(); } # プラグインのインストール後に有効化させることができるかどうかの処理をここにいれます。 # でも、インストールさせて有効化させない、という利用シーンが思いつかないので、 # インストール時点でそういうチェックをしてもいいんじゃないか、と思います。 plugin_プラグイン名_check_config(){ # 有効化用のチェック処理を入れたいときはこのあたりに記載します。 if(read_config_option('プラグイン名_settings') != '') { # 有効化してもいい場合は true を返します。 return true; } # 有効化させたくない場合は false を返します。 return false; } # マニュアルに記載がありません。。。(涙) # たぶん、cactiのアップグレードする際にプラグイン用のデータ変更などを行うためなような気がします。 function plugin_プラグイン名_upgrade(){ } # プラグインのインストールのためのバージョン確認のために利用されます。 # よくわからないので、このままの記載にしておきます。 plugin_プラグイン名_version(){ global $config; $info = parse_ini_file($config['base_path'] . '/plugins/プラグイン名/INFO', true); return $info['info']; } # 今回のプラグインは、グラフ表示の際にグラフ横にボタンを配置し、 # そのアイコンががクリックされると、プラグインのスクリプトが呼び出されます(=ここの処理が呼び出されます。) function プラグイン名_graph_buttons($args) { global $config; $local_graph_id = $args[1]['local_graph_id']; if (api_user_realm_auth("register_realmで設定した利用可能なスクリプト名")) { # 閲覧しているユーザにこのプラグインの利用が許可されていれば、スクリプト起動用のアイコンを表示させ # それをクリックすれば、別の窓で表示用のスクリプトが起動される、ということです。 echo "<a href='#' "; echo "onclick=\"window.open('".$config['url_path']."plugins/プラグイン名/スクリプト名.php?local_graph_id=".$local_graph_id."', 'popup_".$local_graph_id; echo "', 'toolbar=no,menubar=no,location=no,scrollbars=no,status=no,titlebar=no,width=800,height=1100,resizable=yes')\">"; echo "<img src='".$config['url_path']."plugins/プラグイン名/アイコンファイル名.png' border='0' alt='rrdcalendar' title='calendar' style='padding: 3px;'>"; echo "</a><br/>"; } } ?>api_plugin_register_realmで呼び出す引数は、以下の画面で使われます。
この一番下にある、 Plugin Permissions という記載の部分です。
スクリプト本体php
今回作成したスクリプトは、指定したグラフをカレンダー形式で表示させる、というものです。
cactiの本体側の関数で、rrdtool_function_graph
というのがあり、個別のグラフのRRDtool呼び出しコマンドを引っ張ってきてくれます。このコマンドラインを横取りして、convertでいんぐりもんぐりして、カレンダー形式に結合しているだけです。
本体の機能におんぶにだっこ状態です。プラグイン作成とは直接関係ないので、内容は コード参照 でお願いします。
公式プラグインの活用
https://github.com/Cacti/ には、公式プラグインがたくさんあるので、コピーしたものを自分用に作り替えて。。。みたいに習得するのが近道なのかもしれません。でも、公式プラグインとはいえ、マニュアルに記載されてない書き方も多々あるので、注意が必要です。過去の遺産を引きずっているように見える部分もあったりして、「ここ必要?」な箇所も多いです。自分で作っていても、なんでその処理が必要なのかよく理解できていない部分もあります。
さいごに
グラフはカレンダーで見れるとうれしいと思うのですが、あまり需要はないのでしょうか。
他のトラフィック管理ツールでも見かけないです。
ニヤニヤできるのに。出典
https://github.com/Cacti/documentation#plugin-development
https://github.com/bashaway/rrdcalendar
- 投稿日:2020-05-20T06:01:51+09:00
明日から無職でエンジニア目指す
エンジニア転職失敗したらきのこ掘る
自己紹介
■年齢
24歳
■経歴
大学(2019年3月卒業)
↓
プログラミングスクールでキャリアアドバイザー担当(2019年4月〜2020年5月)■Qiitaを始めた経緯
素人がエンジニアを目指した過程の残すエンジニアを目指した経緯
1年間、プログラミングスクールのキャリアアドバイザー担当を務めていました。
その環境で、エンジニアの方と関わることが多く、プログラミングに触れる機会が多々あり、自分でもやってみようかなぁってなりました。やってみると、凄く面白く、業務時間が終わるのが楽しみの生活になりました。笑
いっそのこと会社辞めて本気でエンジニア目指すか!
ってなり、退職しました。エンジニアになった後のキャリア
正直あまり考えてません。
強いていうなら、世の中に存在する会社の生産性を上げることができるエンジニアとして活躍したいですね。
我ながら、縁の下の力持ちをすることが大好きな人間のため、自分が支えて周りが生産性を上がっていく環境作りをしていきたいです、Qiitaに書くこと
・PHPの学習日記
・転職過程
・その他アウトプットキノコ掘る??
彼女が一緒に田舎でキノコ堀りしてくれるらしいです。(なぜキノコなのかは不明)
- 投稿日:2020-05-20T00:53:23+09:00
Laravel Commandを実装する(超初歩)
目的
- Laravelにてコマンドを作成する方法をまとめる
実施環境
- ハードウェア環境(下記の二つの環境で確認)
項目 情報 OS macOS Catalina(10.15.3) ハードウェア MacBook Pro (16-inch ,2019) プロセッサ 2.6 GHz 6コアIntel Core i7 メモリ 16 GB 2667 MHz DDR4 グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.3 Homwbrewを用いて導入 Laravel バージョン 7.0.8 commposerを用いて導入 MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入 概要
- ターミナルに「Test」と文字列を出力するだけのLaravelコマンドを作成する。
- コマンド名は「app:test」とする。
- クラスの作成
- コマンドの内容の実行内容記載
- 確認
詳細
クラスの作成
アプリ名ディレクトリで下記コマンドを実行してクラスを作成する。(クラスの命名方法はキャメルケースを用いる)
$ php artisan make:command TestCommand下記にクラスが記載されているファイル「TestCommand.php」が作成されている事を確認する。
アプリ名ディレクトリ/app/Console/Commands
コマンドの内容の実行内容記載
アプリ名ディレクトリで下記コマンドを実行してクラスが記載されているファイルを開く。
$ vi app/Console/Commands/TestCommand.php開いたクラスファイルを下記の様に修正する。
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class TestCommand extends Command { /** * The name and signature of the console command. * * @var string */ // protected $signature = 'command:name'; //上記の行をコメントアウト、もしくは削除して下記の行を追加 protected $signature = 'app:test'; /** * The console command description. * * @var string */ // protected $description = 'Command description'; //上記の行をコメントアウト、もしくは削除して下記の行を追加 protected $description = 'ターミナル上に"Test"と出力するコマンド'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { //下記を追加 $this->info('Test'); } }確認
アプリ名ディレクトリで下記コマンドを実行して現在使用可能なコマンドの一覧を表示する。
$ php artisan list先のコマンドを出力結果の中に下記の記載が存在する事を確認する。
app app:test コマンドの実装方法を確認するコマンドアプリ名ディレクトリで下記コマンドを実行してターミナル上に「Test」と出力される事を確認する。
$ php artisan app:test Test
- 投稿日:2020-05-20T00:16:40+09:00
PHPの正規表現でHTMLタグ”以外”の検出
HTMLタグ”以外”の検出
PHPの正規表現でHTMLタグ”以外”を検出するために少々調べたのでまとめます。
与えられた文字列に
「HTMLタグが含まれていなければオッケー」
みたいなことをしたかったわけです。アホみたいな書き方せずにもうちょっとちゃんと書くと、
与えられた文字列にHTMLタグが含まれていなければ
preg_match()
が1
を返す
ということです。パッと調べてみた感じ、HTMLタグをみつける正規表現はすぐでてきたのですが、
”以外”となると意外とみつからなかったです。いがいなだけにね。うん。で、結果を先に書くと以下の通り
^(?!.*<("[^"]*"|'[^']*'|[^'">])*>).*$正直、正規表現むっず〜となって途中で理解を断念したので、
完璧には理解できていませんが分かってることだけ書いておきます。HTMLタグの検出
これは調べたらすぐに出てきました。
<(".*?"|'.*?'|[^'"])*?>参考: iPentac.com
説明は参考に飛んでいただければすぐ出てくるのでそちらで。
要は<>
に囲まれていて、中になにか書いてればそれはHTMLタグだ!っていうことです。”以外”の検出
こちらも調べたら色々出てきましたが、
否定先読み
という言葉があるようですね。
詳しく知りたい方は正規表現 否定先読み
で調べていただければもりもり出てくると思います。こちらを参考にというかもうコピペして完成しました。
参考: taketiyo.log確認のために使用したサービス
確認に使ったサービスはこちら。
PHP Live Regex
同様のページはたくさんありますが、
見やすくてなんだかかっこよかったので今後はこれを採用します。
おめでとう!ありがとう!問題点
どうやらこの書き方だと
<>
だけでもHTMLタグとして認識するようです。
なんとなくもう少し良い書き方あるんじゃないかと思うのでなにか分かったら追記します。まとめ
以下でHTMLタグ”以外”を検出できちゃ〜う!
^(?!.*<("[^"]*"|'[^']*'|[^'">])*>).*$正規表現あんまわからん。
精進します。