20200120のPHPに関する記事は16件です。

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel で バリデーションルールに Twitter のTweetのルールを使う

やりたいこと

Twitter連携アプリを作成しており、入力をフロントでtwitter-text.jsを使ってバリデーションしましたが、サーバー側でも行いたい。

公式からはPHP向けのが公開されていませんが、PHP向けのを公開していただけている方がいるので、ありがたく使わせていただきます。
メンテンナンス頻度も高いです。

インストール

composer require nojimage/twitter-text-php

Laravelで独自ルール作成

php artisan make:rule TwitterTextRule
TwitterTextRule
<?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できません。';
    }
}

あとはバリデーションルールに指定する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初学者向け】セキュリティ対策入門②〜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 --build

DB準備

今回はDBを使うので、そのあたりの準備を行っていきます。

http://localhost:8888

にアクセスしてログインしましょう。

そしてtestという名前のDBを作りましょう。

次に以下のようなuserテーブルを作成しましょう。

スクリーンショット 2020-01-15 22.12.40.png

ブラウザアクセス

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カラムに挿入されたというわけです。

参考文献

独習PHP 第3版

今回の内容は以上です。最後までご覧いただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 Technologies

php-7.0.17 が使えることを確認

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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にインストールし、地道に開発環境を仮想マシン上に手作業で構築する方法で落ち着きました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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();

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laradockを使ってLaravel環境を試した

はじめに

今更感満載ですが、 流行りの LaravelLaradock を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)m

Laradockとは?

こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。

前提

下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。

Laradockのインストール

プロジェクト用ディレクトリ作成

まずは下記コマンドで、プロジェクト用のディレクトリを作成します。

% mkdir ~/workspace/laravel_sample
% cd ~/workspace/laravel_sample

githubからの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=beanstalkd

dockerコンテナの実行

これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例では 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/cache

nginxのドキュメントルートの設定

このままだと nginx が別のディレクトリを参照しているため、
laradockディレクトリ内の default.conf を修正して、ドキュメントルートを設定します。

vim /var/www/laradock/nginx/sites/default.conf

13行目あたりにある、 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 にアクセスし、下記画面が表示されることを確認します。
スクリーンショット 2020-01-20 18.31.42.png

これでLaravelが立ち上がりました!簡単!

まとめ

Laradock を使用すると、 Laravel の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。

今回の記事では触れませんでしたが、
ホストの Laravel プロジェクトと Docker 内の Laravel プロジェクトをマウントすることで、
ホスト側を修正すると Laravel プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする

Docker 便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laradockを使ってLaravel環境を構築した

はじめに

今更感満載ですが、 流行りの LaravelLaradock を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)m

Laradockとは?

こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。

前提

下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。

Laradockのインストール

プロジェクト用ディレクトリ作成

まずは下記コマンドで、プロジェクト用のディレクトリを作成します。

% mkdir ~/workspace/laravel_sample
% cd ~/workspace/laravel_sample

githubからの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=beanstalkd

dockerコンテナの実行

これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例では 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/cache

nginxのドキュメントルートの設定

このままだと nginx が別のディレクトリを参照しているため、
laradockディレクトリ内の default.conf を修正して、ドキュメントルートを設定します。

vim /var/www/laradock/nginx/sites/default.conf

13行目あたりにある、 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 にアクセスし、下記画面が表示されることを確認します。
スクリーンショット 2020-01-20 18.31.42.png

これでLaravelが立ち上がりました!簡単!

まとめ

Laradock を使用すると、 Laravel の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。

今回の記事では触れませんでしたが、
ホストの Laravel プロジェクトと Docker 内の Laravel プロジェクトをマウントすることで、
ホスト側を修正すると Laravel プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする

Docker 便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!

共に働くWebエンジニアを募集しています!

不動産SHOPナカジツでは自社サービスを作っていく仲間を募集しています。
詳しくはWantedlyからお問い合わせください。
お待ちしております!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WPプラグイン「Event Organiser」でイベントの開催日を取得する

Event Oraniser

イベントカレンダーを作れるWordpress公式プラグイン。
https://ja.wordpress.org/plugins/event-organiser/

ただ、デフォルトだと日付の表示が1月 2020年とか25-01-2020になってるので馴染みのある形式にフォーマットして取得します。

日付の表示を修正

まずはプラグインを検索して有効化します。
スクリーンショット 2020-01-20 16.34.31.png

修正するファイルは下記
/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カレンダーっぽい感じで使えそうなところが ◯

イベントカレンダー作るときはお世話になりそうなプラグインですが
毎回「これどうやるんだっけ?」ってなりそうなので備忘として残しておきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WPプラグイン「Event Organiser」でイベント開催日を取得する

Event Oraniser

イベントカレンダーを作れるWordpress公式プラグイン。
https://ja.wordpress.org/plugins/event-organiser/

ただ、デフォルトだと日付の表示が1月 2020年とか25-01-2020になってるので馴染みのある形式にフォーマットして取得します。

日付の表示を修正

まずはプラグインを検索して有効化します。
スクリーンショット 2020-01-20 16.34.31.png

修正するファイルは下記
/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カレンダーっぽい感じで使えそうなところが ◯

イベントカレンダー作るときはお世話になりそうなプラグインですが
毎回「これどうやるんだっけ?」ってなりそうなので備忘として残しておきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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件以上をそのままつなげるのは注意が必要そうです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP関連のアドベントカレンダーを持ち寄って紹介して話し合う【Web x PHP TechCafe 3杯目】

PHP × Web Tech Cafe

『Web×PHP TechCafe』は、WebやPHPに関わるITエンジニアがスキルアップのために開発や勉強、LTをするコミュニティです。オフィスをスキルアップの場としてご提供します。

本コミュニティは以下の2部構成になっています。

  1. Lightning Talks 発表
  2. ワーキングテーマに基づき参加者で議論

connpassのページはこちら

今回は PHP × Web Tech Cafe 1月の内容をまとめてお伝えします!!

1. Lightning Talks

Zvalについて

  • 下記のQiita記事作成中に、PHP.net に記載されていた内容が古いことが分かったので、zvalについて改めて調べてみた

  • PHP変数は「zval」というコンテナに保管される

    • PHPは参照されるたびに参照カウントがカウントアップされる
    • 0になったら解放される
  • PHP.net に記載されている内容が古い

    • $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 の新機能について話していた

  • その時には気づかなかったその機能の使い方について説明があり興味深かった

  • mb_str_split でZWJシーケンスも分割できるため👨‍👩‍👦‍👦の文字も分割して、「👨」「👩」「👦」「👦」のようにできる

余談

Laravelのここが便利

  • 認証処理
    • フレームワーク上で認証機能を作ってくれる
  • バリデーション
    • 画面のバリデーションチェックから項目値の挿入まですべてやってくれる
  • ルーティングのグルーピング
    • ルートをグルーピングしてmiddleware を一括で登録することができる
  • セッション管理
    • Flashセッションなど、手書きで実装しようとすると大変そうな機能が全てやってくれる
  • ルートモデルバインディング
    • コントローラ内の処理を実行するときにモデルを渡すことができる
  • マイグレーション
    • スキーマ管理しやすい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 tokenchannel secretを書き込む

Herokuでアプリサーバーを作る

GUIでも出来るし、コマンドラインからでも良い

Herokuへのデプロイ方法

heroku git:remote -a Heroku上のapp名
これを行うと、自分がいるディレクトリ内のgitの情報がheroku上に登録される

heroku apps:info
フォルダのgitと繋がっているherokuのアプリ情報が参照出来る

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP入門をローカル開発環境で学習する時の手順】【備忘録】

【PHP入門をローカル開発環境で学習する時の手順】

[vagrant@localhost php_lessons]$〜

の状態にする迄の手順は、

https://bit.ly/30CrL6L

を参照しつつ、手順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(これでターミナルを終了できる)

完了

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 ON

If 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 = utf8mb4

Restart 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> quit

2.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データベース(翻訳準備中)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 関連項目

Moodle のインストール

カテゴリ:インストール

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む