データ取得

Posted by muchag | CakePHP 3.x | 2017-12-23 (土) 0:40:15


公式:データベースアクセス & ORM
公式:クエリービルダー
公式:データの取り出しと結果セット
公式:データの保存

【環境】
CakePHP: 3.5.8
php: 7.1.5
取得タイプ

// 全行取得
$results = $articles->find()->all();

// 全行を配列に変換して取得
$results = $articles->find()->toArray();

// 先頭の1行だけ取得
$results = $articles->find()->first();
リレーション

contain キーワードを利用してリレーション設定を行う。

オプションでもメソッドでも設定可能。


// コントローラーやテーブルのメソッド内で

// find() のオプションとして
$query = $articles->find('all', ['contain' => ['Authors', 'Comments']]);

// クエリーオブジェクトのメソッドとして
$query = $articles->find('all');
$query->contain(['Authors', 'Comments']);
モデル名

上記で設定した、Authors, Comments はモデル名といえばモデル名なんだけど
Table クラスで設定したリレーションに基づくので
Table クラスでエイリアスを設定した場合は
エイリアス名を記述する。

入れ子(階層)

// 配列記法?
$query = $articles->find()->contain([
    'Authors' => ['Addresses'], 'Comments' => ['Authors']
]);

// ドット記法
$query = $articles->find()->contain([
    'Authors.Addresses',
    'Comments.Authors'
]);

// 3階層
$query = $products->find()->contain([
    'Shops.Cities.Countries',
]);
詳細設定

公式:クエリービルダー contain に条件を渡す
contain 内、無名関数にて対応。
引数が \Cake\ORM\Query $query。


// コントローラーやテーブルのメソッド内で
// 3.5.0 より前は、 contain(['Comments' => function () { ... }]) を使用

$query = $articles->find()->contain('Comments', function ($q) {
    return $q
        ->select(['body', 'author_id'])
        ->where(['Comments.approved' => true]);
});
ソート

公式:クエリービルダー contain に条件を渡す

再設定

クエリー上の contain を再設定する必要があるなら、第2引数に true を指定することができます。

公式:クエリービルダー 関連を含んだソート

現在のところ意味不明。

/vendor/cakephp/cakephp/src/ORM/Query.php

public function contain($associations = null, $override = false)
SELECT
フィールド指定

テーブル名を省略すると、
自動的に当該テーブル(FROM に設定されるテーブル)のカラムとして認識される。


$query = $articles->find();
$query->select(['country']);

$query = $articles->find();
$query->select(['Users.country']);

SELECT DISTINCT Users.country AS `Users__country`

よって、普段からテーブル名を付記する癖を付ける方がよさそう。

DISTINCT

$query = $articles->find();
$query->select(['Users.country'])
      ->distinct(['Users.country']);

SELECT DISTINCT Users.country AS `Users__country`
COUNT

$query = $articles->find();
$query->select(['count' => $query->func()->count('*')]);

SELECT COUNT(*) AS count
WHERE

$query = $articles->find();
$query->where(['name' => 'goku']);
LIKE

$query = $articles->find();
$query->where(['name LIKE' => '%goku%']);
AND

andWhere メソッドも存在するらしい。


$query = $articles->find();
$query->where(['first_name' => 'goku', 'last_name' => 'son']);

$query->where(['first_name' => 'goku']);
      ->where(['last_name' => 'son']);
OR

orWhere メソッドも存在するらしい。


$query = $articles->find();
$query->where('OR' => [['first_name' => 'goku'], ['last_name' => 'son']]);
GROUP BY

$query = $articles->find();
$query = ->group(['Users.country', 'Users.gender']);

GROUP BY
    Users.country,
    Users.gender
WITH ROLLUP

GROUP BY -> WITH ROLLUP


$query = $articles->find();
$query = ->group(['Users.country', 'Users.gender'])
         ->epilog('WITH ROLLUP');

Raph’s world:CakePHP 3 ORM – with rollup(2015-09-20)
こちらには、上記のようにするように書いてあったけど
これではエラーになる。

500エラーだけど、原因は探っていない。

その上に書いてあった、下記の書式で誤魔化せた。
GROUP BY -> WITH ROLLUP


$query = $articles->find();
$query = ->group(['Users.country', 'Users.gender WITH ROLLUP']);

GROUP BY
    Users.country,
    Users.gender WITH ROLLUP

但し!
抽出カラムと GROUP BY 指定カラムが同一でなければエラーになる。

Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘database_name.Users.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

CakePHP3 では、JOIN したテーブルの id カラムを自動的に抽出カラムに加えるので
最初から抽出カラムに指定した上で、GROUP BY 対象にも指定する必要がある。

ORDER BY

$query = $articles->find();
$query = ->order(['Users.country' => 'ASC', 'Users.gender' => 'DESC']);

ORDER BY
    Users.country ASC
    Users.gender DESC
キャッシュ

クエリキャッシュ 参照。

CakePHP 3.x | 2017-12-23 (土) 0:40:15 |

Migration -> ファイル

Posted by muchag | CakePHP 3.x | 2017-12-21 (木) 19:31:23


Phinx:Writing Migrations

【環境】
CakePHP: 3.5.8
php: 7.1.5
メソッド

// マイグレーション
public function up()

// ロールバック
public function down()

// up と down の自動判別
// drop 系、remove 系は記述不可
public function change()
テーブル生成
書式

$table = $this->table(string $table_name, array $options);

第1引数:テーブル名。基本複数形
第2引数:オプション


$table = $this->table('posts', [ // テーブル名。基本複数形
  'id' => false,
  'primary_key' => [
    'id'
  ]
]);
$table
テーブル操作メソッド
  • createTable
  • renameTable
  • addColumn
  • renameColumn
  • addIndex
  • addForeignKey

change メソッド内に記述することを念頭に
上記6種に絞るようにする。

テーブル変更メソッド
  • create:生成
  • update:更新
  • save:自動判別
    • change メソッド内には記述できない
チェーン
カラム操作
addColumn

$table->addColumn(string $column_name, string $data_type , array $options);

/vendor/cakephp/migrations/src/Table.php

public function addColumn($columnName, $type = null, $options = [])

第1引数:カラム名(string|Column)
第2引数:データ型(string)
第3引数:オプション(array)

オプション
  • default:デフォルト値
  • comment:カラムコメント
  • limit:最大値
  • null:null を許容するか
addPrimaryKey
/vendor/robmorgan/phinx/src/Phinx/Db/Table.php

public function addPrimaryKey($columns)

第1引数:カラム名(string|array)

addIndex

$table->addIndex(mixed $columns , array $options);

/vendor/robmorgan/phinx/src/Phinx/Db/Table.php

public function addIndex($columns, $options = array())

第1引数:カラム名(string|array|Index)
第2引数:オプション

オプション
/vendor/robmorgan/phinx/src/Phinx/Db/Table/Index.php

$validOptions = array('type', 'unique', 'name', 'limit');

type:index? or fulltext(不明なので指定しないに限る)
unique:true or false
name:string
limit:int?(数値を設定するみたいだけど、用途不明)

addForeignKey
/vendor/robmorgan/phinx/src/Phinx/Db/Table.php

public function addForeignKey($columns, $referencedTable, $referencedColumns = array('id'), $options = array())

第1引数:カラム名(string|array)
第2引数:親テーブル名(string|Table)
第3引数:親カラム名(string|array)
第4引数:オプション

オプション

on upudate, on delete の挙動を指定。


$table->addForeignKey('admin_id', 'users', 'id', [
	'update' => 'CASCADE',
	'delete' => 'RESTRICT',
]):
UPDATE DELETE
RESTRICT エラーになる エラーになる
CASCADE 参照先の変更に追従する 参照先が無くなると同時に削除される
SET NULL NULLに置き換わる NULLに置き換わる
NO ACTION RESTRICTと同じ RESTRICTと同じ

Qiita:MySQLの外部キー制約RESTRICT,CASCADE,SET NULL,NO ACTIONの違いは?(2016-03-08)

おまけ

CakePHP3 では、ルール通りにテーブル定義をすると
自動で外部キー設定をしてくれるけど
それはフレームワーク内の話で
MySQL 側にはしてくれてないかも?

phpMyAdmin からテーブル削除をした際に
外部キーチェックに引っかからなかったので
そのように思いました。

データ型
DB Phinx(Ecto?) MySQL 内容
共通 biginteger
id int(11) 指定なしの場合
binary binary(255)
boolean tinyint(1)
char char(255)
date date
datetime datetime
decimal decimal(10,0)
float float
integer bigint(20) unsigned
map text 参考サイトに書いてあるけど、エラー ※1
string varchar(255) limit を指定可
text text
time time
timestamp
uuid char(36)
MySQL enum
set
blob
Postgres smallint
json
jsonb
uuid
cidr
inet
macaddr

※1

Exception: An invalid column type “map” was specified for column “url_provider”. in [/vendor/robmorgan/phinx/src/Phinx/Db/Table.php, line 351]

その他、当該 DB で使えるデータ型については
そのデータ型を指定すれば、その通りにしてくれる。
Qiita:PhoenixでDBスキーマの変更を行う(2016-02-12)
→CakePHP3 では、大分事情が違うっぽい。

LIMIT

text(blob, text),integer のサイズを指定したい場合
下記のような書式でできるみたい。
Phinx 公式:Writing Migrations Limit Option and MySQL

Limit Column Type
BLOB_TINY TINYBLOB
BLOB_REGULAR BLOB
BLOB_MEDIUM MEDIUMBLOB
BLOB_LONG LONGBLOB
TEXT_TINY TINYTEXT
TEXT_REGULAR TEXT
TEXT_MEDIUM MEDIUMTEXT
TEXT_LONG LONGTEXT
INT_TINY TINYINT
INT_SMALL SMALLINT
INT_MEDIUM MEDIUMINT
INT_REGULAR INT
INT_BIG BIGINT

$table = $this->table('cart_items');
$table->addColumn('user_id', 'integer')
      ->addColumn('product_id', 'integer', ['limit' => MysqlAdapter::INT_BIG])
      ->addColumn('subtype_id', 'integer', ['limit' => MysqlAdapter::INT_SMALL])
      ->addColumn('quantity', 'integer', ['limit' => MysqlAdapter::INT_TINY])
      ->create();
インデックス
書式

$table->addIndex(array $columns, string $index_name);

第1引数:対象カラム名配列
第2引数:インデックス名

SQL の実行

どういうときに用いるのか、現在不明。


//影響を及ぼしたレコード数が返値
$count = $this->execute('DELETE FROM users');

//実行した結果が返値
$rows = $this->query('SELECT * FROM users');
ID

Phinx では、自動的に id カラムを auto_increament で生成する。
よって、auto_increament の id カラムは、指定不要。

任意の ID カラム

好きな ID カラムを生成したい場合は
テーブル生成時に id カラムを生成しないようにし
改めて、手動で任意のカラムを追加するとともに
primary_key として、指定することができる。


$table = $this->table('statuses',
    [
        'id' => false,
        'primary_key' => ['id']
    ]);
$table->addColumn('id', 'char', ['limit' => 36])
      ->addColumn('name', 'char', ['limit' => 255])
      ->addColumn('model', 'string', ['limit' => 128])
      ->create();
参考サイト

Qiita:Phinx導入ガイド(2015-06-29)

パチ公の雑ブログ:CakePHP3/Migrations 既知の問題(2018-03-13)
→LIMIT オプションの件を教えていただいた

CakePHP 3.x | 2017-12-21 (木) 19:31:23 |

タイムゾーン

Posted by muchag | MySQL | 2017-12-10 (日) 23:47:19

【環境】
MySQL: 5.7.18
経緯

CakePHP3 を利用しているときに、下記エラーが出た。

SQLSTATE[HY000]: General error: 1298 Unknown or incorrect time zone: ‘Asia/Tokyo’

調べてみると、MySQL のタイムゾーン設定がなされていないとのこと。

mysql データベースを見ると、確かに空っぽだった。


mysql> select * from mysql.time_zone;
Empty set (0.00 sec)
手順
Linux 環境
コマンド

mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql -p
Enter password:
Warning: Unable to load '/usr/share/zoneinfo//iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo//zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo//zone1970.tab' as time zone. Skipping it.
結果

3つ位失敗したみたいだけど、無事にタイムゾーンが mysql データベース time zone name テーブルへ登録された♪


select * from mysql.time_zone;
+--------------+------------------+
| Time_zone_id | Use_leap_seconds |
+--------------+------------------+
|            1 | N                |
|            2 | N                |
|            3 | N                |

            __ snip __

|         1778 | Y                |
|         1779 | Y                |
|         1780 | Y                |
+--------------+------------------+
1780 rows in set (0.00 sec)
参考サイト

有限会社 エス技研:MySQLのタイムゾーン(mysql_tzinfo_to_sql)の設定方法・XAMPP環境の解説も(2017-06-16)

MySQL | 2017-12-10 (日) 23:47:19 |

初期設定

Posted by muchag | CakePHP 3.x | 2017-12-10 (日) 23:20:05

【環境】
CakePHP: 3.5.6
php: 7.1.5
app.php
/config/app.php
ローカライズ

App 項目の defaultLocale を ja_JP とする。


'App' => [
    'namespace' => 'App',
    'encoding' => env('APP_ENCODING', 'UTF-8'),
    'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
    'base' => false,
    'dir' => 'src',
    'webroot' => 'webroot',
    'wwwRoot' => WWW_ROOT,
    // 'baseUrl' => env('SCRIPT_NAME'),
    'fullBaseUrl' => false,
    'imageBaseUrl' => 'img/',
    'cssBaseUrl' => 'css/',
    'jsBaseUrl' => 'js/',
    'paths' => [
        'plugins' => [ROOT . DS . 'plugins' . DS],
        'templates' => [APP . 'Template' . DS],
        'locales' => [APP . 'Locale' . DS],
    ],
],
DB

DB 周りの設定。

  • host
  • usernama:MySQL のユーザ名
  • password:MySQL パスワード
  • database:当該アプリデータベース名(テスト用は、test_ プレフィクスを付ける)
  • timezone:Asia/Tokyo

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        /**
         * CakePHP will use the default DB port based on the driver selected
         * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
         * the following line and set the port accordingly
         */
        //'port' => 'non_standard_port_number',
        'username' => 'my_app',
        'password' => 'secret',
        'database' => 'test_myapp',
        'encoding' => 'utf8',
        'timezone' => 'UTC',

    'test' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        //'port' => 'non_standard_port_number',
        'username' => 'my_app',
        'password' => 'secret',
        'database' => 'test_myapp',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
タイムゾーンエラー

タイムゾーンに Asia/Tokyo を設定したら
苦労して辿り着いた CakePHP3 のTOPページが姿を消し
エラーの画面になった。 X-P

SQLSTATE[HY000]: General error: 1298 Unknown or incorrect time zone: ‘Asia/Tokyo’

そして、MySQL への対応。
タイムゾーン

bootstrap.php
タイムゾーン

- date_default_timezone_set('UTC');
+ date_default_timezone_set('Asia/Tokyo');
.htaccess

アプリケーションディレクトリに phpMyAdmin を配置するとき
こちらも CakePHP のルーティング対象となってしまうため
ルーティングルールから除外する必要が生じる。


<IfModule mod_rewrite.c>
    RewriteEngine on    
+   RewriteCond   %{REQUEST_URI} !(^/pma/)
    RewriteRule   ^$    webroot/    [L]
+   RewriteCond   %{REQUEST_URI} !(^/pma/)
    RewriteRule   (.*) webroot/$1    [L]
</IfModule>

除外ルールは、各リライトルールに対して設定する必要があるため
同じ内容を2回記述する必要がある。

参考サイト

Step On Board:RewriteCondが効かない?特定のディレクトリを除外する方法でつまずいたお話(2015-05-13)

CakePHP 3.x | 2017-12-10 (日) 23:20:05 |

バージョン情報

Posted by muchag | CakePHP 3.x | 2017-12-10 (日) 22:21:40

【環境】
CakePHP: 3.5.6
バージョン情報
/vendor/cakephp/cakephp/VERSION.txt

////////////////////////////////////////////////////////////////////////////////////////////////////
// +--------------------------------------------------------------------------------------------+ //
// CakePHP Version
//
// Holds a static string representing the current version of CakePHP
//
// CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
// Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
//
// Licensed under The MIT License
// Redistributions of files must retain the above copyright notice.
//
// @copyright     Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
// @link          https://cakephp.org
// @since         CakePHP(tm) v 0.2.9
// @license       https://opensource.org/licenses/mit-license.php MIT License
// +--------------------------------------------------------------------------------------------+ //
////////////////////////////////////////////////////////////////////////////////////////////////////
3.5.6

派手な枠に目を取られて
最終行に書いてあることに気がつくのに
1分位かかったw

CakePHP 3.x | 2017-12-10 (日) 22:21:40 |

VBoxManage

Posted by muchag | VirtualBox,Windows | 2017-12-10 (日) 21:43:10

【環境】
VirtualBox グラフィカルユーザーインターフェース: 5.1.24 r117012 (Qt5.6.2)
Windows: 10 Pro
list

Windows コマンドプロンプトより
VirtualBox の現在の設定や情報を取得できる。

vms

登録されている仮想マシン一覧。


"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms
"VirtualMachineName1" {d8c214b5-df18-4cdf-9208-dd7b99fe1778}
"VirtualMachineName2" {48b8dabe-26af-450c-b549-21e226695f4b}
参考サイト

VirtualBox Mania:VBoxManage listコマンド

VirtualBox,Windows | 2017-12-10 (日) 21:43:10 |

インストール

Posted by muchag | phpMyAdmin | 2017-12-10 (日) 11:39:12

いつも大変お世話になっている phpMyAdmin。
この度、初めてインストール作業を行うことになりました。

公式:Bringing MySQL to the web

【環境】
phpMyAdmin: 4.7.6
DL

上記公式サイト右上の [Douwload 4.7.6] をクリックすると DL できる。

2017-12-10 現在
phpMyAdmin-4.7.6-all-languages.zip

ダウンロードページ

または、ダウンロードページ から、詳細な選択をすることも可能。

配置

DL した .zip ファイルを解凍して、任意のディレクトリへ配置。

今回は、アプリケーションディレクトリ直下へ配置した。

また、ディレクトリ名が長いので
phpMyAdmin-4.7.6-all-languages → pma とリネームした。

ログイン

Cookie を有効にしておかないと、ログインできない。

設定

必須ではない。

設定ファイルの配置
/pma/config.sample.inc.php

をコピーリネームして

/pma/config.inc.php

を配置。

デフォルト設定
/pma/libraries/config.default.php

これがデフォルトの設定らしい。

パスフレーズ

今回はローカル環境なので、適当に。


$cfg['blowfish_secret'] = 'hoge'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
大問題!

上記設定をしたら、pma 側で下記エラーが出だ。

phpMyAdmin – エラー
設定ファイルのパーミッションが正しくありません。誰でも書き込み可能になっています!

現在の VirtualBox を利用した仮想環境においては
config.inc.php に、パーミッションを設定できないので
こうなるらしい。

config.inc.php を削除しました。。。

ここまで

その他の config.inc.php については
ko-iya528:phpMyAdminのインストール(2017-10-26)

テーマ

phpMyAdmin は、テーマの概念があり
テーマを変更することで外観を変更することができる。

意義

テスト環境と本番環境において
取り違えによる大事故を起こさないためにも
テーマは設定しておこうね!

策定

色々とあるのかもしれないけど
公式:Themes
で、配布しているので、こちらから頂戴する。

今回は、4.7.6 なので、4.7 の中から選択。

4種類ある中から、Metro 2.6 にした。

DL

metro-2.6.zip というリンクから DL。

配置

DL してきた .zip ファイルを解凍して
出てきた metro ディレクトリをそのまま

/pma/themes

へ配置。

設定
pma

ホームページ
「外観の設定」
Theme:[metro] を選択

Metro のテーマ
/metro/layout.inc.php

にて、Metro テーマのテーマを選択できる。(ややこしいw)


/* Theme color scheme
 * Values: "teal", "redmond", "blueeyes", "mono", "win"
 * Set this value for the desired color scheme
 */

$scheme                                     = "win";
カスタマイズ
/metro/layout.inc.php

に、色設定があるので、そちらをカスタマイズ。


case "win":

    $GLOBALS['cfg']['NaviColor']                = '#EEEEEE';
    $GLOBALS['cfg']['NaviBackground']           = '#377796';	// ページ上部ナビゲーションバーの背景色
    $GLOBALS['cfg']['NaviBackgroundLight']      = '#428EB4';
    $GLOBALS['cfg']['NaviPointerColor']         = '#333333';
    $GLOBALS['cfg']['NaviPointerBackground']    = '#377796';
    $GLOBALS['cfg']['NaviDatabaseNameColor']    = '#333333';
    $GLOBALS['cfg']['NaviHoverBackground']      = '#428EB4';
    $GLOBALS['cfg']['MainColor']                = '#444444';
    $GLOBALS['cfg']['MainBackground']           = '#FFFFFF';
    $GLOBALS['cfg']['BrowsePointerColor']       = '#377796';
    $GLOBALS['cfg']['BrowseMarkerColor']        = '#000000';
    $GLOBALS['cfg']['BrowseWarningColor']       = '#D44A26';
    $GLOBALS['cfg']['BrowseSuccessColor']       = '#01A31C';
    $GLOBALS['cfg']['BrowseGrayColor']          = '#CCCCCC';
    $GLOBALS['cfg']['BrowseMarkerBackground']   = '#EEEEEE';
    $GLOBALS['cfg']['BorderColor']              = '#DDDDDD';
    $GLOBALS['cfg']['ButtonColor']              = '#FFFFFF';
    $GLOBALS['cfg']['ButtonBackground']         = '#377796';
    $GLOBALS['cfg']['ButtonHover']              = '#428EB4';
    $GLOBALS['cfg']['ThBackground']             = '#F7F7F7';
    $GLOBALS['cfg']['ThDisabledBackground']     = '#F3F3F3';
    $GLOBALS['cfg']['ThColor']                  = '#666666';
    $GLOBALS['cfg']['ThPointerColor']           = '#000000';
    $GLOBALS['cfg']['BgOne']                    = '#F7F7F7';
    $GLOBALS['cfg']['BgTwo']                    = '#FFFFFF';
    $GLOBALS['cfg']['BlueHeader']               = '#3A7EAD';	// 注意書きなどの背景色
    break;
phpMyAdmin | 2017-12-10 (日) 11:39:12 |

VirtualBox + CakePHP + Eclipse + xdebug

Posted by muchag | CakePHP 3.x,Eclipse,Library & PlugIn & AddIn,VirtualBox | 2017-12-09 (土) 21:31:49

【環境】
VirtualBox グラフィカルユーザーインターフェース: 5.1.24 r117012 (Qt5.6.2)
php: 7.1.5
CakePHP:3.4
Eclipse: 4.7
xdebug: 2.5.5
xdebug のインストール

yum --enablerepo=remi-php71 -y install php71-php-pecl-xdebug

例によって、標準以外のディレクリにインストールされるので、コピー。


find / -name 'xdebug.so'
/opt/remi/php71/root/usr/lib64/php/modules/xdebug.so
cp /opt/remi/php71/root/usr/lib64/php/modules/xdebug.so /usr/lib64/php/modules/xdebug.so
ll /usr/lib64/php/modules/ | grep xdebug
-rwxr-xr-x 1 root root  261560 12月  9 21:28 xdebug.so
設定
php.ini
/etc/php.ini

[xdebug]
zend_extension=xdebug.so
xdebug.default_enable = 1
xdebug.remote_enable = 1
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.remote_host=192.168.56.1
Eclipse
実行構成
  1. [実行]-[実行構成]
  2. 「実行構成」ダイアログ
    1. 左ペイン
      1. [PHP Web アプリケーション] を選択
      2. 上部ツールボタンから [新規の起動構成]
    2. 右ペイン
      1. 名前:任意
      2. 「サーバー」タブ
        1. PHP サーバー:[新規]
        2. 「PHP サーバーの作成」ダイアログ
          1. 「新規 PHP サーバー」
            1. サーバー名:任意
            2. ベース URL:http://192.168.56.2
            3. [次へ]
          2. 「デバッガー設定」
            1. デバッガー:[XDebug]
            2. 右の [グローバル設定] リンクをクリック
            3. 「XDebug」ダイアログ
              1. リモート・セッション受信(JIT):[任意] を選択
              2. [OK]
            4. ポート:任意(php.ini で設定した値)
            5. [次へ]
          3. 「パス・マッピング」
            1. [追加]
            2. 「パスマッピングの追加」ダイアログ
            3. 「新規パス・マッピングの追加」
              1. サーバー上のパス:/var/www/html/hoge
              2. 「ファイル・システムのパス」を選択
              3. ファイル・システムのパス:[参照] から、Windows ローカルの index.php があるディレクトリを選択
              4. [OK]
          4. [完了]
        3. ファイル:[参照] から、Eclipse プロジェクトディレクトリ内の index.php を選択
        4. URL
          1. [自動生成] の✔を外す
          2. URL:右のテキストボックスに /index.php
    3. [実行]
デバッグ

[ウインドウ]-[設定]
「設定」ダイアログ
左ペイン [PHP]-[デバッグ]
右ペイン [最初の行でブレーク] の✔を外す

デバッグ実行

[デバッグ] ツールボタン(虫アイコン)で、直前のデバッグ構成を実行。
[デバッグ] ツールボタン(虫アイコン)右の▼から、デバッグ対象を選択して実行。

リモート・セッション

実は上記設定を最初に行ったときは、
左記のようなアラートが出た。

アラートの [here] からダイアログを開き
リモート・セッション受信(JIT):[任意] を選択したら、
無事にブレークポイントで止まってくれた♪

外部ブラウザ

スマートフォンサイトのエミュレーションであったり
デベロッパーツールを利用するために
Chrome 上でデバッグを行いたい場合は
スマートフォンサイト

CakePHP 3.x,Eclipse,Library & PlugIn & AddIn,VirtualBox | 2017-12-09 (土) 21:31:49 |

prism.js

Posted by muchag | Library & PlugIn & AddIn,WordPress | 2017-12-07 (木) 22:30:03

今度こそ、長年愛用してきた iG:Syntax Hiliter とおさらばすることになりそう。
寂しい><
前回

公式:Prism

【環境】
PrismJS: 1.9.0
導入
設定

公式サイトの ダウンロードページ にて設定。

わけも分からず、欲張って入れたので
Total filesize: 146.01KB (96% JavaScript + 4% CSS)
あちゃーw

()内は、<code class=”language-xxxxx”> の xxxxx に設定すべき値。
公式:Supported languages

  • Compression level:
    • カスタマイズをしたいので、[Development version] を選択
  • Core
  • Themes
    • ダークテーマが好きなので、[Okaidia]
  • Languages
    • Markup(markup)
    • CSS(css)
    • C-like(clike)
    • JavaScript(javascript)
    • ActionScript(actionscript)
    • Apache Configuration(apacheconf)
    • AppleScript(applescript)
    • Bash(bash)
    • BASIC(basic)
    • Batch(batch)
    • C(c)
    • C#(csharp)
    • C++(cpp)
    • CoffeeScript(coffeescript)
    • Diff(diff)
    • Docker(docker)
    • Git(git)
    • Go(go)
    • Haskel(haskell)
    • HTTP(http)
    • Ini(ini)
    • Java(java)
    • JSON(json)
    • Less(less)
    • Markdown(markdown)
    • nginx(nginx)
    • Objective-C(objectivec)
    • PHP(php)
    • .properties(properties)
    • Python(python)
    • Ruby(ruby)
    • Sass (Sass)(sass)
    • Sass (Scss)(scss)
    • Scala(scala)
    • Smarty(smarty)
    • SQL(sql)
    • Stylus(stylus)
    • Swift(swift)
    • Textile(textile)
    • Twig(twig)
    • TypeScript(typescript)
    • VB.Net(vbnet)
    • vim(vim)
    • Wiki markup(wiki)
    • YAML(yaml)
  • Plugins
    • Line Highlight
    • Line Numbers
    • Autolinker
    • Show Language
    • JSONP Highlight
    • Highlight Keywords
    • Remove initial line feed
    • Command Line
    • Unescaped Markup
    • Toolbar
DL

ページ下部より .js と .css を個別に DL。

配置

テーマディレクトリ内に配置。

/theme_directory/css/prism.css
/theme_directory/js/prism.js
WordPress へ組み込み
/wp-includes/functions.php

こちらだと、WordPress をアップデートする度に下記設定が消えてしまうので

/wp-content/themes/[theme_name]/functions.php

へ、下記を追加。
nobbi LABO:WordPressでシンタックスハイライトならPrism.jsが軽量&多機能でベストチョイス(2017-03-27)


/*---------------------------------------------------------
 * Prism.jsの呼び出し
 ----------------------------------------------------------*/
add_action( 'wp_enqueue_scripts', 'startPrism' );
function startPrism() {

 	wp_enqueue_style( 'prism-style', get_stylesheet_directory_uri() . '/css/prism.css' );
 	wp_enqueue_script( 'prism-script', get_stylesheet_directory_uri() . '/js/prism.js', array('jquery'), '20171206', true );
}
利用
書式

<pre>
<code>

</code>
</pre>

この中にコードを書くだけ。

メタ文字

HTML タグなどは、そのまま書くとおかしくなるので
調整が必要。

エスケープ(サニタイズ)

Syncer:HTML Escape / Unescape
mwSoft Tools:HTMLエスケープ(サニタイズ)ツール

スクリプト扱い

公式:Unescaped markup


<script type="text/plain" class="language-markup">
<p>Example</p>
</script>

と書かれていたけど、実際にやってみるとうまく表示されない。

コメント化

公式:Unescaped markup


<pre class="language-markup"><code><!--
<p>Example</p>
--></code></pre>

と書かれていたけど、実際にやってみるとうまく表示されない。

改行

個人的には、下記のように、code タグとコード本文は改行して記述したいのだけど


<pre class="line-numbers" data-language="HTML" data-start="" data-line="">
<code class="language-markup">
&lt;script type=&quot;text/plain&quot; class=&quot;language-markup&quot;&gt;
&lt;p&gt;Example&lt;/p&gt;
&lt;/script&gt;
</code>
</pre>

このように記述すると、下記のごとく、

  • 先頭行が空白
  • 最後尾に空白

という見た目になってしまう。



<script type="text/plain" class="language-markup">
<p>Example</p>
</script>

なので、

  • 公式:Remove initial line feed を導入することで先頭行を解決
  • code 閉じタグをコード本文の最後に続けることで最後尾を解決

<pre class="line-numbers" data-language="HTML" data-start="" data-line="">
<code class="language-markup">
&lt;script type=&quot;text/plain&quot; class=&quot;language-markup&quot;&gt;
&lt;p&gt;Example&lt;/p&gt;
&lt;/script&gt;</code>
</pre>
class

<code> へ class=”language-xxxxx” と指定。


<pre>
<code class="language-xxxxx">

</code>
</pre>

xxxxx に書くべきワードは、上述。

行番号
サンプル
クラスの設定方法

公式:Different markup

言語毎のサンプル

公式:Per language examples

カスタマイズ
言語表記

下記優先順位にて決定される。

  1. <pre data-language=”xxxxx”>
  2. var Languages に定義されている内容
  3. <code class=”language-xxxxx”>

<code class=”language-xxxxx”> の xxxxx の部分に
prism.js 内に定義されていない語句を書けば、
Plain Text と判断されて、文字色は白一色となり
言語名は、xxxxx がパスカライズされる。

文字サイズ

言語表記が小さいと感じたので、font-size を修正。


pre.code-toolbar > .toolbar a,
pre.code-toolbar > .toolbar button,
pre.code-toolbar > .toolbar span {
	color: #bbb;
	/* font-size: .8em; ← コメントアウト */
	padding: 0 .5em;
	background: #f5f2f0;
	background: rgba(224, 224, 224, 0.2);
	box-shadow: 0 2px 0 0 rgba(0,0,0,0.2);
	border-radius: .5em;
}
行ハイライト

.line-highlight {
	position: absolute;
	left: 0;
	right: 0;
	padding: inherit 0;
	margin-top: 1em; /* Same as .prism’s padding-top */

	background: hsla(24, 20%, 50%,.08);
-	background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
+	background: linear-gradient(to right, rgba(255, 255, 0, .3) 70%, rgba(255, 255, 0, 0));

138行目。
hsla はピンとこないので、rgba に書き換えて、アルファ値を調整した。

文字色

諸々調整。

Library & PlugIn & AddIn,WordPress | 2017-12-07 (木) 22:30:03 |