- 投稿日:2020-01-20T23:54:49+09:00
Google Datastore 1500bytes制限と回避方法(PHP)
概要
Google Datatstoreは、型定義もテーブル定義もせずがんがんデータ突っ込めます。
が、デフォルトのままデータ入れていると、1500バイトを超えたところで、PHPの場合、500エラーで止まります。
エラーメッセージは、The value of property "data" is longer than 1500 bytes
という感じ。なぜエラーが出るか、大きなデータは突っ込めないのか。
Datastoreは、何も指定しなければ、インデックスが貼られます。
インデックスが貼られているデータは、1500バイトまでという制限があります。
つまり、インデックスを貼らなければOKデータ挿入時にインデックス対象から外す
事前のテーブル定義がないので、データ挿入時にインデックスしない、という指定をするしかなさそう。
コード
PHPのライブラリでデータをINSERTするときのコード。
以下のコードの場合、answerdetailだけインデックスしません。$dbKey = $datastore->key($GLOBALS['DB_prefix'].'groupexamlog'); $dbData = $datastore->entity( $dbKey, [ 'groupid' => $groupid, 'userid' => $userid, 'score' => $score, 'scoremax' => $scoremax, 'duration' => $duration, 'answertime' => $answertime, 'answerdetail' => $answerdetail ],[ 'excludeFromIndexes' => ['answerdetail'] ] ); $result = $datastore->insert($dbData);参考
https://cloud.google.com/datastore/docs/concepts/indexes?hl=ja
- 投稿日:2020-01-20T23:54:27+09:00
Laravel で バリデーションルールに Twitter のTweetのルールを使う
やりたいこと
Twitter連携アプリを作成しており、入力をフロントで
twitter-text.js
を使ってバリデーションしましたが、サーバー側でも行いたい。公式からはPHP向けのが公開されていませんが、PHP向けのを公開していただけている方がいるので、ありがたく使わせていただきます。
メンテンナンス頻度も高いです。インストール
composer require nojimage/twitter-text-phpLaravelで独自ルール作成
php artisan make:rule TwitterTextRuleTwitterTextRule<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; use Twitter\Text\Parser; class TwitterTextRule implements Rule { /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { $parser = new Parser(); $parse_result = $parser->parseTweet($value); //weightedLengthに文字数、validにツイートできるか return $parse_result->valid; } /** * Get the validation error message. * * @return string */ public function message() { return ':attributeはTweetできません。'; } }あとはバリデーションルールに指定する
- 投稿日:2020-01-20T21:33:55+09:00
【初学者向け】セキュリティ対策入門②〜SQLインジェクション編〜
前提
確認環境
以下と同様です。
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜本シリーズの目的
以下と同様です。
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜本記事の目標
SQLインジェクションの概要、原因、対策について理解することです。
本記事を読み進める上での必要事項
以下の内容を終えていることです。
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜また、DB及びテーブルの作成ができることと、プログラミング言語を用いてDBにアクセスする処理の流れをおおまかに理解していることです。
概要
SQLインジェクションとは
不正にSQL文を実行させることです。エンドユーザが入力した内容を元にSQLを実行するようなWebアプリケーション全般で行われる可能性があります。
これだけだとわかりにくいと思いますので実際に見てみましょう。
実際に体験してみよう
リポジトリ更新
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜投稿時から本記事投稿の間にリポジトリを更新しているので、以下コマンドを参考にローカルリポジトリを更新しておいてください。
cd tutorial-php-security git pull origin masterまた、
docker-compose.yml
も更新されているのでDockerコンテナ起動時は以下のように--build
を付与して起動を行ってください。docker-compose up -d --buildDB準備
今回はDBを使うので、そのあたりの準備を行っていきます。
にアクセスしてログインしましょう。
そして
test
という名前のDBを作りましょう。次に以下のような
user
テーブルを作成しましょう。ブラウザアクセス
http://localhost:8080/sql_injection/bad.php?name=j&address=kanagawa
にアクセスしてみましょう。『データが作成されました。』と表示されたら成功です。
phpMyAdminを見てみるとレコードが1件追加されていることが確認できると思います。ソースコードは
tutorial-php-security/www/html/sql_injection/bad.php
にあります。tutorial-php-security/www/html/sql_injection/bad.php<?php // 略 $name = ($_GET['name']) ? $_GET['name'] : ''; $address = ($_GET['address']) ? $_GET['address'] : ''; // 略でクエリストリングスを取得し、その値を使って
tutorial-php-security/www/html/sql_injection/bad.php<?php // 略 try { $db = getDb(); $stmt = $db->prepare("INSERT INTO user(name, address) VALUES('{$name}', '{$address}')"); $stmt->execute(); echo 'データが作成されました。'; } catch(PDOException $e) { echo $e->getMessage(); }
user
テーブルにレコードを挿入する処理が記載されています。では次に
http://localhost:8080/sql_injection/bad.php?name=namebadtest&address=');DELETE FROM user;--
にアクセスしてみましょう。phpMyAdminを見てみるとレコードが削除されてしまっていることが確認できると思います。
何が起きているか確認するために上記パラメータで生成されるSQL文を解説します。
INSERT INTO user(name, address) VALUES('namebadtest', '');DELETE FROM user;--')
というSQL文が作られます。わかりやすいように改行も入れます。INSERT INTO user(name, address) VALUES('namebadtest', ''); DELETE FROM user; --')ここまで整理すれば
user
テーブルのレコードが削除されてしまった理由がわかると思います。DELETE文が実行されてしまっているわけです。SQLインジェクションの恐ろしさが伝わりましたでしょうか?
user
テーブルが、とあるWebサービスの会員情報を保持しているものだとしたら会員情報が全て消えてしまいます。大きなサービスでこんなことが起きれば新聞に載ります。原因
SQLエスケープをしていないことです。原因がシンプルですね。なので、対策もシンプルです。
対策
SQLエスケープを行うことです。
具体的に確認していきましょう。
http://localhost:8080/sql_injection/good.php?name=namebadtest&address=');DELETE FROM user;--
にアクセスしてみましょう。今度はレコードが挿入されたことが確認できたと思います。
address
カラムには');DELETE FROM user;--
という文字列が入っています。つまり、DELETE文が実行されていないわけです。
good.php
ではある処理を追加しています。それを次に確認しましょう。tutorial-php-security/www/html/sql_injection/good.php<?php // 略 try { $db = getDb(); $stmt = $db->prepare('INSERT INTO user(name, address) VALUES(:name, :address)'); $stmt->bindValue(':name', $name); $stmt->bindValue(':address', $address); $stmt->execute(); echo 'データが作成されました。'; } catch(PDOException $e) { echo $e->getMessage(); }DB接続について学習されている方にとっては見慣れた処理の流れになっているかと思いますが、
bindValue
メソッドを使っています。こうすることでSQLエスケープを行うことができます。具体的に先ほどの例で実行されるSQLを確認します。以下のようなSQL文が構築されます。INSERT INTO user(name, address) VALUES('namebadtest', ''');DELETE FROM user;--')わかりやすいように改行を入れます。
INSERT INTO user(name, address) VALUES('namebadtest', ' '');DELETE FROM user;-- ')2行目の
'
が''
になっているのがポイントです。SQLエスケープを行うことで実現される具体例な処理がこれです。''
は単なる'
という文字だと見なされ、SQL文の中で特別な意味を持って使われる'
とは別ものと見なされます。こういったことが内部で行われているため、
');DELETE FROM user;--
という単なる文字列としてaddress
カラムに挿入されたというわけです。参考文献
今回の内容は以上です。最後までご覧いただきありがとうございました。
- 投稿日:2020-01-20T21:22:53+09:00
phpbrewでCatalinaにPHP v7.0.xをインストールする
PHP 7.0系でしか動かないシステムをmacOS Catalinaで動かすためにphpbrewでv7.0をインストールしたかった
brew install bzip2 zlib openssl@1.1 phpbrew install 7.0 +default+zlib=$(brew --prefix zlib)+openssl=$(brew --prefix openssl@1.1)macOSの
openssl version
のデフォルトがLibreSSLになってるので、7.0のコンパイルエラーが出る。openssl@1.1
を指定する。❯ phpbrew list * (system) php-7.0.17❯ phpbrew use php-7.0.17 ❯ php -v PHP 7.0.17 (cli) (built: Jan 20 2020 19:12:39) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologiesphp-7.0.17 が使えることを確認
- 投稿日:2020-01-20T19:46:35+09:00
Laravelの開発環境3つとそれぞれのメリット、デメリット
PHPのWebアプリケーションフレームワークであるLaravelを学習しようと思って調べた際の開発環境について記載します。
ローカル環境はMacOSを想定しています。Laravel開発環境
Laradock
Laradockは、Laravelの開発環境をDocker Containerに閉じ込めた開発環境です。
公式: https://laradock.io/メリット
Dockerなので、後に記載する仮想マシンとは違い実行時のオーバーヘッドが小さくなりマシンリソースを省力化出来パフォーマンスが良いです。
また、Docker上に全てを配置するためローカル環境を汚さずにクリーンに保てます。デメリット
Dockerの扱いをある程度は把握していないと、おかしくなった開発環境を破棄して再構築するなどの操作が出来なくて困ると思いますので、Dockerの予習が必要な点に注意しましょう。
Homestead
Homesteadは、Laravelの開発環境をVagrant BOXとして配布されている開発環境です。
公式: https://laravel.com/docs/6.x/homesteadメリット
VirtualBox等の仮想マシンとして開発環境を構築するものの為、従来からある仮想化に慣れているならすぐにとっつきやすい面があるかなと思います。
Laradockと同じく仮想マシン上に全てを配置するためローカル環境を汚さずにクリーンに保てます。デメリット
Vagrantの扱いをある程度は把握していないと、Laradockと同じく制御に困ることになると思います。
また、Laradockと違い仮想化するソリューションである為、仮想化によるオーバーヘッドが発生する為パフォーマンスは若干悪い事もデメリットかなと思います。Valet
Valetは、Laravelの開発環境をローカル環境であるMacへhomebrewを用いて直接インストールする開発環境です。
メリット
Homesteadのように仮想化しないためオーバーヘッドが小さくなりパフォーマンスが良いです。
homebrewのみが分かれば良いので、敷居は比較的低いかと思います。デメリット
ローカルに直接インストールするため、ローカル環境が汚れます。
LaradockやVagrantのように、環境を壊してしまった場合は環境を破棄して再構築ということが簡単には出来ず、丁寧にエラーを修正したり場合によっては再インストールが必要になります。まとめ
どの方法も一長一短ありますが、個人的にはValetは避けたいかなと思いました。
やはりローカル環境が汚れてしまうのはよろしくないかなと思っています。
LaradockとHomesteadは優れたソリューションだと思いますが、Laravelの開発環境構築は理解しておりその後の開発そのものを学習したい場合に良いソリューションだと判断しました。
私自身に関してで恐縮ですが、Laravelの開発環境構築そのもののプロセスから学びたいという気持ちがあり、ここをショートカットしたくはなかったので、上記ソリューションを調べつつも結局はどれも採用せず、Vagrant経由でUbuntuをVirtualBoxにインストールし、地道に開発環境を仮想マシン上に手作業で構築する方法で落ち着きました。
- 投稿日:2020-01-20T18:44:40+09:00
javascript 別窓を開く
一応メモとして
window.open(リンク先URL ,ウィンドウ名 , オプション)
width ウィンドウの幅 数値
height ウィンドウの高さ 数値
left ウィンドウの左の位置 数値
top ウィンドウの上の位置 数値
menubar メニューバーの有無 0 あるいは 1
toolbar ツールバーの有無 0 あるいは 1
status ステータスバーの有無 0 あるいは 1
scrollbars スクロールバーの有無 0 あるいは 1
resizable サイズ変更の可否 0 あるいは 1
別ウィンドウを開く際にPOSTでパラメータを送る
window.open("" ,"pdf_win");
window.openで空のページを開いてからそこに対してSUBMITを行います。
document.frmCart.action='cart_pdf.php';
document.frmCart.method = 'POST';
document.frmCart.target = 'pdf_win';
document.frmCart.submit();
- 投稿日:2020-01-20T18:37:29+09:00
Laradockを使ってLaravel環境を試した
はじめに
今更感満載ですが、 流行りの
Laravel
をLaradock
を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)mLaradockとは?
こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。前提
下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。
- Docker
参考記事: DockerをMacにインストールする- git
参考記事: 購入直後のMacでGitコマンドを使えるようになるまでLaradockのインストール
プロジェクト用ディレクトリ作成
まずは下記コマンドで、プロジェクト用のディレクトリを作成します。
% mkdir ~/workspace/laravel_sample % cd ~/workspace/laravel_samplegithubからのclone
下記コマンドで、githubから
Laradock
をダウンロードします。% git clone https://github.com/Laradock/laradock.git Cloning into 'laradock'... remote: Enumerating objects: 10007, done. remote: Total 10007 (delta 0), reused 0 (delta 0), pack-reused 10007 Receiving objects: 100% (10007/10007), 8.99 MiB | 3.30 MiB/s, done. Resolving deltas: 100% (5432/5432), done..envファイルの修正
クローンした
Laradock
ディレクトリ内にある、env-example
をコピーして 設定定義用の.env
を作成します。% cd laradock % cp env-example .env % ls -l .env -rw-r--r-- 1 member group 27511 1 20 17:35 .envその後、
.env
ファイルに、下記を追加します。DB_HOST=mysql REDIS_HOST=redis QUEUE_HOST=beanstalkddockerコンテナの実行
これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例ではnginx
mysql
redis
を実行しています。
サポートされているミドルウェアについては、 公式ページ をご確認ください。docker-compose up -d nginx mysql redis workspace
dockerコンテナの起動確認
下記コマンドでコンテナが起動していることを確認します。
% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 359efff2066b laradock_nginx "/bin/bash /opt/star…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp laradock_nginx_1 e920c68c0061 laradock_php-fpm "docker-php-entrypoi…" 2 minutes ago Up 2 minutes 9000/tcp laradock_php-fpm_1 192ebe58ccea laradock_workspace "/sbin/my_init" 2 minutes ago Up 2 minutes 0.0.0.0:2222->22/tcp laradock_workspace_1 84fbc83b3730 docker:dind "dockerd-entrypoint.…" 2 minutes ago Up 2 minutes 2375-2376/tcp laradock_docker-in-docker_1 28c432f44127 laradock_mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp laradock_mysql_1 1722ae0554b7 laradock_redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp laradock_redis_1このまま
http://localhost
にアクセスすると、nginxの404ページが表示されると思います。Laravelプロジェクトの作成
まずは下記コマンドを実行し、
laradock_workspace
のイメージから作られたコンテナの中に入ります。docker exec -it laradock_workspace_1 bash root@192ebe58ccea:/var/www#プロジェクト作成
下記コマンドで
Laravel
プロジェクトを実際に作成します。composer create-project laravel/laravel laravel_sample権限変更
webサーバーから書き込みを許可するために、権限を変更する必要があるため、
下記コマンドをstorage
bootstrap/cache
に対して実行します。cd laravel_sample chmod 766 storage chmod 766 bootstrap/cachenginxのドキュメントルートの設定
このままだと
nginx
が別のディレクトリを参照しているため、
laradockディレクトリ内のdefault.conf
を修正して、ドキュメントルートを設定します。vim /var/www/laradock/nginx/sites/default.conf13行目あたりにある、
root
の部分を、
laravel
プロジェクトのpublic
ディレクトリに修正します。12 server_name localhost; 13 root /var/www/laravel_sample/public; # この部分を修正。laravel_sampleはプロジェクト名。 14 index index.php index.html index.htm;ここまで全て完了したら、dockerコンテナから出ます。
root@192ebe58ccea:/var/www# exit exit
設定の反映
設定を反映するために、下記コマンドを実行し、コンテナの再起動を行います。
(コンテナIDはlaradock_nginx
のものを指定します。)docker restart 359efff2066b起動確認
ブラウザから
http://localhost
にアクセスし、下記画面が表示されることを確認します。
これでLaravelが立ち上がりました!簡単!
まとめ
Laradock
を使用すると、Laravel
の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。今回の記事では触れませんでしたが、
ホストのLaravel
プロジェクトとDocker
内のLaravel
プロジェクトをマウントすることで、
ホスト側を修正するとLaravel
プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする
Docker
便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!
- 投稿日:2020-01-20T18:37:29+09:00
Laradockを使ってLaravel環境を構築した
はじめに
今更感満載ですが、 流行りの
Laravel
をLaradock
を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)mLaradockとは?
こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。前提
下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。
- Docker
参考記事: DockerをMacにインストールする- git
参考記事: 購入直後のMacでGitコマンドを使えるようになるまでLaradockのインストール
プロジェクト用ディレクトリ作成
まずは下記コマンドで、プロジェクト用のディレクトリを作成します。
% mkdir ~/workspace/laravel_sample % cd ~/workspace/laravel_samplegithubからのclone
下記コマンドで、githubから
Laradock
をダウンロードします。% git clone https://github.com/Laradock/laradock.git Cloning into 'laradock'... remote: Enumerating objects: 10007, done. remote: Total 10007 (delta 0), reused 0 (delta 0), pack-reused 10007 Receiving objects: 100% (10007/10007), 8.99 MiB | 3.30 MiB/s, done. Resolving deltas: 100% (5432/5432), done..envファイルの修正
クローンした
Laradock
ディレクトリ内にある、env-example
をコピーして 設定定義用の.env
を作成します。% cd laradock % cp env-example .env % ls -l .env -rw-r--r-- 1 member group 27511 1 20 17:35 .envその後、
.env
ファイルに、下記を追加します。DB_HOST=mysql REDIS_HOST=redis QUEUE_HOST=beanstalkddockerコンテナの実行
これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例ではnginx
mysql
redis
を実行しています。
サポートされているミドルウェアについては、 公式ページ をご確認ください。docker-compose up -d nginx mysql redis workspace
dockerコンテナの起動確認
下記コマンドでコンテナが起動していることを確認します。
% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 359efff2066b laradock_nginx "/bin/bash /opt/star…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp laradock_nginx_1 e920c68c0061 laradock_php-fpm "docker-php-entrypoi…" 2 minutes ago Up 2 minutes 9000/tcp laradock_php-fpm_1 192ebe58ccea laradock_workspace "/sbin/my_init" 2 minutes ago Up 2 minutes 0.0.0.0:2222->22/tcp laradock_workspace_1 84fbc83b3730 docker:dind "dockerd-entrypoint.…" 2 minutes ago Up 2 minutes 2375-2376/tcp laradock_docker-in-docker_1 28c432f44127 laradock_mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp laradock_mysql_1 1722ae0554b7 laradock_redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp laradock_redis_1このまま
http://localhost
にアクセスすると、nginxの404ページが表示されると思います。Laravelプロジェクトの作成
まずは下記コマンドを実行し、
laradock_workspace
のイメージから作られたコンテナの中に入ります。docker exec -it laradock_workspace_1 bash root@192ebe58ccea:/var/www#プロジェクト作成
下記コマンドで
Laravel
プロジェクトを実際に作成します。composer create-project laravel/laravel laravel_sample権限変更
webサーバーから書き込みを許可するために、権限を変更する必要があるため、
下記コマンドをstorage
bootstrap/cache
に対して実行します。cd laravel_sample chmod 766 storage chmod 766 bootstrap/cachenginxのドキュメントルートの設定
このままだと
nginx
が別のディレクトリを参照しているため、
laradockディレクトリ内のdefault.conf
を修正して、ドキュメントルートを設定します。vim /var/www/laradock/nginx/sites/default.conf13行目あたりにある、
root
の部分を、
laravel
プロジェクトのpublic
ディレクトリに修正します。12 server_name localhost; 13 root /var/www/laravel_sample/public; # この部分を修正。laravel_sampleはプロジェクト名。 14 index index.php index.html index.htm;ここまで全て完了したら、dockerコンテナから出ます。
root@192ebe58ccea:/var/www# exit exit
設定の反映
設定を反映するために、下記コマンドを実行し、コンテナの再起動を行います。
(コンテナIDはlaradock_nginx
のものを指定します。)docker restart 359efff2066b起動確認
ブラウザから
http://localhost
にアクセスし、下記画面が表示されることを確認します。
これでLaravelが立ち上がりました!簡単!
まとめ
Laradock
を使用すると、Laravel
の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。今回の記事では触れませんでしたが、
ホストのLaravel
プロジェクトとDocker
内のLaravel
プロジェクトをマウントすることで、
ホスト側を修正するとLaravel
プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする
Docker
便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!共に働くWebエンジニアを募集しています!
不動産SHOPナカジツでは自社サービスを作っていく仲間を募集しています。
詳しくはWantedlyからお問い合わせください。
お待ちしております!
- 投稿日:2020-01-20T16:52:27+09:00
WPプラグイン「Event Organiser」でイベントの開催日を取得する
Event Oraniser
イベントカレンダーを作れるWordpress公式プラグイン。
https://ja.wordpress.org/plugins/event-organiser/ただ、デフォルトだと日付の表示が
1月 2020年
とか25-01-2020
になってるので馴染みのある形式にフォーマットして取得します。日付の表示を修正
修正するファイルは下記
/wp-content/plugins/event-organiser/includes/event-organiser-event-functions.php
1384行目くらい
'titleformatmonth' => 'F Y年'
↓
'titleformatmonth' => 'Y年 F'
イベント日の取得方法
それぞれの日付は下記の関数で取得します。
開始日:
eo_get_schedule_start()
終了日:eo_get_the_end()
eo_get_schedule_last()
というのもあるらしく引っかかりました...
eo_get_schedule_start()
修正ファイルの648行目あたりに該当箇所があります。
function eo_get_schedule_start($format='Y年n月j日',$post_id=0){ $post_id = (int) ( empty($post_id) ? get_the_ID() : $post_id); $schedule = eo_get_event_schedule($post_id); $schedule_start = $schedule['schedule_start']; /** * Filters the value returned by `eo_get_schedule_start()` * * @param string|DateTime $formatted_date The DateTime object or formatted returned value (as determined by $format) * @param DateTime $end The start date of the first occurrence of this event as a DateTime object * @param string $format The format the date should be returned in * @param int $post_id Post ID of the event */ $formatted_date = apply_filters('eventorganiser_get_schedule_start', eo_format_datetime( $schedule_start, $format ), $schedule_start, $format, $post_id ); return $formatted_date; }
$format='Y年n月j日'
と自分好みの形式に設定しておきます。
eo_get_the_end()
こちらは408行目くらいです。
こちらも同様に$format
を直しておきます。function eo_get_the_end( $format = 'Y年n月j日', $post_id = 0, $occurrence_id = 0, $deprecated = 0 ) { global $post; $event = $post; if( !empty( $deprecated ) && empty( $occurrence_id ) ){ //_deprecated_argument( __FUNCTION__, '3.0.0', 'Fourth argument is depreciated. Please use the third argument, the occurrence ID, available from $post->occurrence_id' ); $occurrence_id = $deprecated; } $post_id = (int) ( empty($post_id) ? get_the_ID() : $post_id); $occurrence_id = (int) ( empty($occurrence_id) && isset($event->occurrence_id) ? $event->occurrence_id : $occurrence_id); $occurrence = eo_get_the_occurrence( $post_id, $occurrence_id ); if ( ! $occurrence ) { return false; } $end = $occurrence['end']; /** * Filters the value returned by `eo_get_the_end()` * * @param string|DateTime $formatted_end The DateTime object or formatted returned value (as determined by $format) * @param DateTime $end The end date as a DateTime object * @param string $format The format the end date should be returned in * @param int $post_id Post ID of the event * @param int $occurrence_id The occurrence ID */ $formatted_date = apply_filters( 'eventorganiser_get_the_end', eo_format_datetime( $end, $format ), $end, $format, $post_id, $occurrence_id ); return $formatted_date; }Googleカレンダーっぽい感じで使えそうなところが ◯
イベントカレンダー作るときはお世話になりそうなプラグインですが
毎回「これどうやるんだっけ?」ってなりそうなので備忘として残しておきます。
- 投稿日:2020-01-20T16:52:27+09:00
WPプラグイン「Event Organiser」でイベント開催日を取得する
Event Oraniser
イベントカレンダーを作れるWordpress公式プラグイン。
https://ja.wordpress.org/plugins/event-organiser/ただ、デフォルトだと日付の表示が
1月 2020年
とか25-01-2020
になってるので馴染みのある形式にフォーマットして取得します。日付の表示を修正
修正するファイルは下記
/wp-content/plugins/event-organiser/includes/event-organiser-event-functions.php
1384行目くらい
'titleformatmonth' => 'F Y年'
↓
'titleformatmonth' => 'Y年 F'
イベント日の取得方法
それぞれの日付は下記の関数で取得します。
開始日:
eo_get_schedule_start()
終了日:eo_get_the_end()
eo_get_schedule_last()
というのもあるらしく引っかかりました。。。パラメータに応じてフォーマットしてくれます。
event-organiser-event-functions.php
をイジるよりこのほうが良さそうですね。<?php echo eo_get_schedule_start('Y年n月j日'); ?>2020年1月21日Googleカレンダーっぽい感じで使えそうなところが ◯
イベントカレンダー作るときはお世話になりそうなプラグインですが
毎回「これどうやるんだっけ?」ってなりそうなので備忘として残しておきます。
- 投稿日:2020-01-20T16:51:05+09:00
FuelPHPのORMでor演算子を2個以上つなげると後勝ちで1つのorしか判定されていなくてハマった話
FuelのORMで参照クエリを
OR
で発行する場合、以下のような条件でphpの処理的にハマった件をメモします。'where' => [ [ ['hoge', '>=', 1], 'or' => ['hoge', '=', 0], 'or' => ['hoge', '=', null], ], ],というような条件で書いていると以下のようなselect文になるのかと思っていた。
// 想定していた発行クエリ WHERE (t0.hoge >= 1 OR t0.hoge = 0 OR t0.hoge IS null)が、実際に発行されたクエリは以下でした。
// 実際に発行されていたクエリ WHERE (t0.hoge >= 1 OR t0.hoge IS null)……!!!
OR条件の2つ目で上書きされてあと勝ちになっているようだ。。
php的に連想配列のキーが1つなのでorのキーで後勝ちになっているのかなと予想。今回はデータ構造的にnullableにする必要がないテーブルだったので制約で解決しました。
ORで2件以上をそのままつなげるのは注意が必要そうです。
- 投稿日:2020-01-20T15:13:22+09:00
PHP関連のアドベントカレンダーを持ち寄って紹介して話し合う【Web x PHP TechCafe 3杯目】
PHP × Web Tech Cafe
『Web×PHP TechCafe』は、WebやPHPに関わるITエンジニアがスキルアップのために開発や勉強、LTをするコミュニティです。オフィスをスキルアップの場としてご提供します。
本コミュニティは以下の2部構成になっています。
- Lightning Talks 発表
- ワーキングテーマに基づき参加者で議論
connpassのページはこちら
今回は PHP × Web Tech Cafe 1月の内容をまとめてお伝えします!!
1. Lightning Talks
Zvalについて
下記のQiita記事作成中に、PHP.net に記載されていた内容が古いことが分かったので、zvalについて改めて調べてみた
- 【PHP7.4新機能】弱参照(WeakReference)をキャッシュに使うってどういうことよ、を考えてみた
- https://qiita.com/miracle-FJSW/items/807d60c09d194609e6a4
PHP変数は「zval」というコンテナに保管される
- PHPは参照されるたびに参照カウントがカウントアップされる
- 0になったら解放される
- $a = "new string"; の参照カウントを調べたらカウント数が表示されない(internedと表示)
- PHP.net には refcount=1 になるとある
- v5.6 では 1になる
- v7.4 では internedと表示
- phpが7系になったタイミングでパフォーマンス改善のためにzvalの構造が大きく変わったため
PHPコア開発者のNilitaさんのスライドを参照
- 新しいzvalでは構造の見直しによってサイズが小さく、かつ効率よくメモリアクセスされるようになった
- 数値型はrefcountなどで管理せず、代入されるたびに新しくメモリ領域が確保され、メモリアクセス回数が減った
- 文字列は、3段階のアクセスを行っていたが2段階に減った、など
- PHP7以降は、参照を使うとむしろ無駄なメモリ消費が発生する
- メモリ領域にリファレンス情報を保持させなければならなくなったため
2. ワーキングテーマ
本日のテーマは以下です
PHP関連のアドベントカレンダーで気になった・面白い記事を持ち寄って、記事の紹介+その記事をネタに色々議論する
議論内容
1件目
phpenv/php-build の小ネタ集
内容
phpにもxxxenvがあるとは知らなかったが、この記事を見て初めて知ったので紹介
- PHPのバージョンを切り替えるのを楽にするのが目的
- nodenv, pyenvのPHP版
- 使ってみたが、切り替えが簡単になるが各バージョンのPHPをインストールする際に苦労した
- PHPのユーザーグループのslackでも最新バージョンのビルドが通らなくて苦労しているようだ
- 個人開発する程度ならDockerでも代用可能
- ただし、Dockerなどの仮想化技術を使わずにOSに直接インストールしたPHPを利用したい場合はphpenvが良さそう
本番環境で7.4を利用しているとして、開発環境でphpenvで7.4 と 7.1 を併存するのは大丈夫なのか?
- それは問題ないはず。内部的にはPHPのバイナリの参照先を変えているだけなので
それだと何が環境構築が難しいのか
- PHPのバージョンに対応したライブラリを入れるのが大変
- 結局バージョンに対応しているライブラリをすべて入れていかなければならず、OSのリポジトリが対応していない場合などもある
逆にDockerだとどうやってやればいいのか
- DockerHubから落としたいPHPのバージョンのイメージを落としてRunするだけ
- DockerはDockerで知識が必要だし、本番運用するならそれなりの知識が必要
2件目
Laravel で Christmas Illumination
内容
- Laravel にある Illuminate という名前空間をモチーフにしてイルミネーションを作ったという記事
- センスが面白い
- Laravel の作者が Illuminate で PHP界を明るくしたいという意図があったらしい
- Laravel はナルニア国物語の国名が由来。テンプレートエンジンはBladeで、剣と魔法の世界。
- artisan(職人)とか、ネーミングが素敵
3件目
【PHP7.4】PHP7.4がリリースされたので新機能全部やる
内容
前回のWeb × PHP Tech Cafe でも PHP7.4 の新機能について話していた
- PHP7.4の新機能を'もっと'追う【Web x PHP TechCafe 2杯目】
- https://qiita.com/MasaKu/items/f295584f7005accdc456
その時には気づかなかったその機能の使い方について説明があり興味深かった
mb_str_split でZWJシーケンスも分割できるため????の文字も分割して、「?」「?」「?」「?」のようにできる
余談
Laravelのここが便利
- 認証処理
- フレームワーク上で認証機能を作ってくれる
- バリデーション
- 画面のバリデーションチェックから項目値の挿入まですべてやってくれる
- ルーティングのグルーピング
- ルートをグルーピングしてmiddleware を一括で登録することができる
- セッション管理
- Flashセッションなど、手書きで実装しようとすると大変そうな機能が全てやってくれる
- ルートモデルバインディング
- コントローラ内の処理を実行するときにモデルを渡すことができる
- マイグレーション
- スキーマ管理しやすい
- 投稿日:2020-01-20T11:16:01+09:00
LINEbotを作成する流れ[備忘録]
参考にさせて頂いた記事
https://qiita.com/at_1016/items/9f97dc1c561182c18182必要な事
- LINE messaging APIに利用登録をする
- Messaging API SDK for PHPを利用しつつコーディングをする
- Herokuにデプロイする
- LINEのコンソールでWebhook設定をする
LINE messaging APIの登録
https://developers.line.biz/ja/services/messaging-api/
開発者登録・プロバイダ作成・チャネル作成をするMessaging API SDK for PHPをインストールする
ここにPHPを書くのだが、この時に
channel access token
とchannel secret
を書き込むHerokuでアプリサーバーを作る
GUIでも出来るし、コマンドラインからでも良い
Herokuへのデプロイ方法
heroku git:remote -a Heroku上のapp名
これを行うと、自分がいるディレクトリ内のgitの情報がheroku上に登録される
heroku apps:info
フォルダのgitと繋がっているherokuのアプリ情報が参照出来る
- 投稿日:2020-01-20T07:44:21+09:00
【PHP入門をローカル開発環境で学習する時の手順】【備忘録】
【PHP入門をローカル開発環境で学習する時の手順】
[vagrant@localhost php_lessons]$〜
の状態にする迄の手順は、
を参照しつつ、手順11で、cyberduck上のphp_lessonsフォルダをダブルクリック
手順13で、ターミナル上で、
$ cd php_lessons
手順14で、
[vagrant@localhost php_lessons]$〜
を確認して、完了。
補足:
画面上を綺麗にしたい場合、
$ clear
で、できます。
【index.phpをSublime Text等で編集した後ブラウザで表示させる手順】
index.phpなどのphpファイルをブラウザ上で表示させるには、Webサーバーが必要。
ローカル開発環境にもWebサーバーは入っているみたいですが、
設定が面倒なので、
今回はPHPが用意している簡易的な「ビルトインWebサーバー」を使います。
【手順】
①[vagrant@localhost php_lessons]$〜
となっているのを確認する②$ ip a(←これでこのローカル開発環境のIPアドレスを確認できる)
③192.⚪︎⚪︎⚪︎.⚪︎⚪︎.⚪︎⚪︎ というのを控える
④$ php -S 192.⚪︎⚪︎⚪︎.⚪︎⚪︎.⚪︎⚪︎:⚪︎⚪︎⚪︎⚪︎(←これでビルトインサーバーが立ち上げれる)
※「:の後ろの番号」は、ポート番号。
必要に応じて、ポート番号をつける。
※必要に応じて、と動画の説明にはありましたが、
試しにポート番号無しで入力すると、
「Invalid address:〜」と出たので、そのままポート番号を入力すべきですね。⑤http://192.⚪︎⚪︎⚪︎.⚪︎⚪︎.⚪︎⚪︎:⚪︎⚪︎⚪︎⚪︎をブラウザ上で検索する
これで確認できる。
完了
【学習を正常に終了する時の手順】
①contorol +C
②[vagrant@localhost php_lessons]$〜
となっているのを確認する③$ exit(これで仮想マシンからログアウトできて、mbpの操作に戻る) ※mbpはMacBook Proのこと。
④$ vagrant suspend(これで仮想マシンを停止できる)※5秒ほどかかる。
⑤$ exit(これでターミナルを終了できる)
完了
- 投稿日:2020-01-20T05:00:37+09:00
Moodle 3.8 マニュアル - MySQL
MySQL
MySQL は Moodle のインストールを支えているデータベースサポートのうちの一つです。
内容
1 MySQL をインストールする
1.1 完全な UTF-8 サポートを設定する
2 Moodle データベースを作成する
2.1 コマンドライン
2.2 phpMyAdmin
3 どのデータベースがどの Moodle に属しているか
4 関連項目1 MySQL をインストールする
- もしあなたが Linux を走らせているのなら、あなたの好みはあなたのパッケージマネジャーを使ってインストールするということになるべきです。これはどんな入手可能なアップデートも保証します。しかしながら、apt-get あるいは yum をディストリビューションにしたがって使用することもできます。
- ほとんどの人気のあるオペレーティングシステム用のインストーラーは http://www.mysql.com/downloads/mysql/ において入手可能です。
- mysql を直接ソースからビルドするのは可能でありかなり簡単ですが推奨されません(事前にビルドされたバイナリはもっと最適化されています)。
- 'root' ユーザーにはパスワードを設定(http://dev.mysql.com/doc/refman/5.0/en/default-privileges.html を参照)してください。
- my.cnf (MySQL の設定ファイル)をあなたの要求に合わせてインストールし設定することを考慮してください。デフォルト設定は通常はメモリーの使用対パフォーマンスの観点において大変保守的です。'max_allowed_packet' 設定を少なくとも 4メガバイトに増加させてください。
- もしあなたがマスター/スレーブ レプリケーションを使用するつもりなら、binlog_format = 'ROW' を my.cnf の [mysqld] binlog_format = 'ROW' に追加するべきです。 そうでなければ、Moodle はデータベースへの書き込みができないでしょう。
1.1 完全な UTF-8 サポートを設定する
It's recommended that you have full UTF-8 support configured in MySQL. If this is not done some character sets, notably emojis, cannot be used. It is possible to do this after your site is installed but it is much easier before installation.
First check if this is already configured by running the following statement, e.g. at the mysql> prompt or in phpMyAdmin:
SHOW GLOBAL VARIABLES WHERE variable_name IN ('innodb_file_format', 'innodb_large_prefix', 'innodb_file_per_table');
Variable_name Value
innodb_file_format Barracuda
innodb_file_per_table ON
innodb_large_prefix ONIf the three settings you see match the above list then no further configuration changes are needed and you can skip to Creating Moodle database.
If your settings do not match this list then you will have to edit your MySQL configuration file. On Linux this may be the file /etc/my.cnf or /etc/mysql/my.cnf, on Microsoft Windows it may be my.ini.
- Note: You should back up your configuration file before changing it.
- Note: You should back up your databases before making this change.
- Note: Other systems using databases on this server may be impacted by this change.
Add the following settings to the configuration file:
[client] default-character-set = utf8mb4 [mysqld] innodb_file_format = Barracuda innodb_file_per_table = 1 innodb_large_prefix = 1 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci skip-character-set-client-handshake [mysql] default-character-set = utf8mb4Restart MySQL to apply these settings.
If you have any difficulty applying these settings, see MySQL_full_unicode_support for further information.
If for some reason you cannot change to the recommended settings as described here you can continue to install Moodle, however you must select utf8 and utf8_unicode_ci for the default character set and collation respectively.
2 Moodle データベースを作成する
These are the steps to create an empty Moodle database. Substitute your own database name, user name and password as appropriate.
The instructions assume that the web server and MySQL server are on the same machine. In this case the 'dbhost' is 'localhost'. If they are on different machines substitute the name of the web server for 'localhost' in the following instructions and the 'dbhost' setting will be the name of the database server. Databases have a "Character set" and a "Collation". For Moodle, we recommend the Character Set be set to utf8mb4 and the Collation utf8mb4_unicode_ci. You may get the option to set these values when you create the database. If you are not given a choice, the default options are probably good. An install on an old server may have the wrong settings.
2.1 コマンドライン
- To create a database using the 'mysql' command line client, first log into MySQL
$ mysql -u root -p Enter password:(Enter the password you previously set - or been given - for the MySQL 'root' user). After some pre-amble this should take you to the mysql> prompt.
- Create a new database (called 'moodle' - substitute your own name if required).
If you have successfully configured the recommended full UTF-8 support as described above run:
mysql> CREATE DATABASE moodle DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;If you do not have the recommended full UTF-8 support run:
mysql> CREATE DATABASE moodle DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
- Add a user/password with the minimum needed permissions:
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,CREATE TEMPORARY TABLES,DROP,INDEX,ALTER ON moodle.* TO moodleuser@localhost IDENTIFIED BY 'yourpassword';...which creates a user called 'moodleuser' with a password 'yourpassword'. Make sure you invent a strong password and resist the temptation to 'GRANT ALL'.
- Exit from mysql:
mysql> quit2.2 phpMyAdmin
phpMyAdmin is a web based administration tool for MySQL. If this is available you can use it to create a new database. If you have successfully configured the recommended full UTF-8 support as described above select collation utf8mb4_unicode_ci. If you do not have the recommended full UTF-8 support select collation utf8_unicode_ci.
3 どのデータベースがどの Moodle に属しているか
If you have installed several Moodle installations on the same server, there will be several databases in your MySQL server. The names might be quite poor reflections of the content like mdl1 mdl2 _mdl3 . So how do I see which database goes with which Moodle installation? You can go in with phpMyAdmin and in the various databases check for the table "mdlcourse". There you will easily see the name of that Moodle Installation. In table mdlconfig you can see the Moodle version. The main URL for the site is not in the database except where there are absolute links.
4 関連項目
MariaDB(翻訳準備中)
MySQL full unicode support(翻訳準備中)
The MySQL homepage
Wikipedia article about MySQL
List of articles on MySQL performance tuningカテゴリ:インストール | SQLデータベース(翻訳準備中)
- 投稿日:2020-01-20T02:43:43+09:00
Moodle 3.8 マニュアル - Moodle サイトの Moodle ディレクトリ
Moodle サイトの Moodle ディレクトリ
Moodle コードはそれ自身のディレクトリ(フォルダ)にファイルとサブディレクトリとともに存在しています。一般的に言って、これらは標準ダウンロードの zip ファイルにあり "moodle" と呼ばれるディレクトリに展開されるでしょう。
内容
1 ファイル
2 Moodle ディレクトリ
3 moodledata - その他のフォルダ
4 関連項目1 ファイル
"moodle" ディレクトリにはいくつかのキーとなるファイルが存在します。
config.php - 基本的な設定を含む。このファイルは Moodle からは出てこないです。これは install.php スクリプトが走る時あるいは手動で編集されて作成されます。
install.php - config.php を生成するために走るスクリプト
version.php - 現在の Moodle コードのバージョンを決定する
index.php - サイトのフロントページ2 Moodle ディレクトリ
"moodle" ディレクトリには多くのサブディレクトリがあり、それぞれはさらなるサブディレクトリと php コードのファイルがあります。そのいくつかは以下を含みます。
admin/ - サーバ全体を管理するためのコード
auth/ - ユーザを認証するためのプラグインモジュール
blocks/ - 多くのページで使われる小さなサイドブロックのためのプラグインモジュール
calendar/ - カレンダーを管理・表示するための全てのコード
course/ - コースを表示・管理するためのコード
files/ - アップロードファイルを表示・管理するためのコード
lang/ - 一つの言語にひとつのディレクトリがある、異なる言語のテキスト
lib/ - コア Moodle コードのライブラリ
login/ - ログインとアカウントの作成をあつかう為のコード
mod/ - すべての主要な Moodle コースモジュールはここにあります
pix/ - 共通のサイトのグラフィックス
repository/ - 2.x ファイルを扱うシステムためのコード
theme/ - サイトの外観を変更するためのテーマのパック/スキン
user/ - ユーザを表示・管理するためのコード3 moodledata - その他のフォルダ
"moodledata" はユーザファイル、コースファイル、サイトの言語、キャッシュとその他の情報を含むフォルダです。それは Moodl のインストールプロセスで作成されます。"moodle" フォルダの外に置かれるべきで、デフォルトで "moodledata" と呼ばれます。
Moodle のインストール #5 データ(moodledata)ディレクトリの作成 を参照してください。4 関連項目
カテゴリ:インストール