コマンドラインで作成したファイルを実行する

※Laravel 5.3 で検証しております。バージョンによって書き方が異なる場合がありますので、確認が必要がと思われます。

 

$ php artisan --version
Laravel Framework version 5.3.31

 

ターミナルで、まとまった処理を実行するときにコマンドがあると便利ですね。

 

作成するのにartisan コマンドを使用します。

 

php artisan だけで実行すると、コマンドの説明が表示されます。

 

make に関するコマンドはこれだけあります。 

 

 

make:auth Scaffold basic login and registration views and routes
make:bindings Add repository bindings to service provider.
make:command Create a new Artisan command
make:controller Create a new controller class
make:criteria Create a new criteria.
make:entity Create a new entity.
make:event Create a new event class
make:job Create a new job class
make:listener Create a new event listener class
make:mail Create a new email class
make:middleware Create a new middleware class
make:migration Create a new migration file
make:model Create a new Eloquent model class
make:notification Create a new notification class
make:policy Create a new policy class
make:presenter Create a new presenter.
make:provider Create a new service provider class
make:repository Create a new repository.
make:request Create a new form request class
make:resource Create a new RESTfull controller.
make:seeder Create a new seeder class
make:test Create a new test class
make:transformer Create a new transformer.
make:validator Create a new validator.

 

 

 

 php make:command で作成します。

 

 

作成後、Kernel.phpに登録します。

 

laravel/app/Console/Kernel.php

 

/**
* アプリケーションで提供するArtisanコマンド
*
* @var array
*/
protected $commands = [
Commands\ClassName::class,
];

 

 

laravel/app/Console/Commands/ClassName.php

 

/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'classname:register';

 

好きな名前をつけて下さい。

 

修正したら、コマンド実行

 

php artisan classname:register 

 

修正がうまくいくと、php artisan で一覧に表示されます。

 

 

 

 

 

 

 

 

 

 

 

 

jsonbの部分更新

jsonスキーマはpostgreSQL9.2 から取り扱えるようになり多様なデータ構造を持つことが出来るようになりました。key value のセットでデータ保存しますが

 

# select version();
version
----------------------------------------------------------------------------------------------------------
PostgreSQL 9.6.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17), 64-bit
(1 row)

 

データの部分更新をしたいときですが、value がstring かnumber で更新方法が違いました。例えばこうゆうデータがあって

 

# select id, json_contents from notifications limit 1;
-[ RECORD 1 ]-+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | 1
json_contents | {"offer_id": 4333}

-[ RECORD 2 ]-+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | 2
json_contents | {"offer_id": "4333"}

 

number と string で定義されたoffer_id があります。この場合だと

select * from notifications where json_contents = jsonb_set(json_contents, '{"offer_id"}', '4333');

で、1件しかとれません。(id:1 のほう)

なので、整合性のため、データを揃えます。

update
  notifications
set
 json_contents = '{}'::jsonb || json_contents || json_build_object('offer_id',(json_contents->>'offer_id')::integer)::jsonb
;

update table_name set col = default || 'hohfeofe' の発想です。

一旦空のデータを作ってから、元コンテンツをmergeして、offer_id に対して、元データをstring -> integer -> jsonb にキャストしてます。

 

この場合だと、jsonのvalue string -> integer , integer -> string でもいけると思います。

 

 

 

広告を非表示にする

特定のフォルダ以下でのディスク容量

そもそもの始まりは

 という自分のTweet。 

どうも実行結果が計算合わない。。

 

 

現在のサーバを、どの程度ディスク容量使っているのかを調べるのに自分はよく

$ df -h

を使います。

このdf コマンドは実バイトを返さないということを知ったので詳細なデータを知りたい場合、例えば画像フォルダが何十万とあるフォルダ以下のバイト数を調べるにはどうしたらいいのか。

 

1. find DIR -type f | wc -c

自分が最初に行ったパターンです。明らかに違いました。この場合だと、参照先のファイル名の長さの総和に確かになってました。。

 

2. find DIR -type f | xargs ls -l | awk '{sum+=$5}END{print sum}'

このパターンは、Twitterで教えていただきました。この場合うまくいきました。この場合だと、ls -l で隠しファイルを含めないので純粋に画像のバイト数の総和を出すことが出来ました。

 

3. find DIR -type f | xargs wc -c | grep total | awk '{sum+=$1}END{print sum}'

wc -c でバイト数を計算する方法です。ただ、grep total | awk '{sum+=$1}END{print sum}' をつけないとwc -c | tail -n 1 の場合だと、うまくいかなかったのですがこちらに関しても教えてくださいました。

 

 

4. du -sh DIR

こちらの場合ですと、隠しフォルダのバイト数も含まって純粋な画像データとしては出せませんがシンプルという意味では使えるかなと思いました。

 

 

 

コマンドを扱う場合にオーバーフローが起こる可能性や、コマンド最大長があるということも知っていい勉強になりました。

 

 

Acrobat Pro DC をつかってPDFファイルの表をexcelに出力

PDFの表になってる部分をexcelにしたく、

ネットでググってもどうしても貼り付けられない。。

試行錯誤の末にとりあえず、それっぽいのが出力できました。

 

  1. 該当のPDFファイルを「Acrobat Pro DC」を使って開く
  2. 文章構造を読み込ませる
  3. PDFを書き出し
  4. スプレットシート Microsoft Excel ブックの設定をクリック(歯車のマーク)
  5. テーブルごとにワークシート作成
  6. 書き出し
  7. 書き出されたファイルを開く

 

あとは、指定のシート開いて加工すればいいかと思います。

ただ、どうしてもセル結合してたりとかあったりするんで、そこは対応してあげないといけないみたいです。

QueryBuilder::paginate() と Eloquent::paginate() の挙動の違いがあった

 

Laravel ver: 5.3.26

 

SQL的にcount() で取得するときには、主にそのテーブルの主キーをあてるほうがより速く実行することが出来ます。

 

今回、QueryBuilder::paginate() と Eloquent::paginate() の挙動の違いがあったためメモします。

データを取得するとき、第二引数に$column (default =['*']) を指定することが出来ます。

 

今回、DBオブジェクトが持ってるQueryBuilder::paginate()の場合だと、

/**
* Paginate the given query into a simple paginator.
*
* @param int $perPage
* @param array $columns
* @param string $pageName
* @param int|null $page
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
public function paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null)
{
$page = $page ?: Paginator::resolveCurrentPage($pageName);

$total = $this->getCountForPagination($columns);

$results = $total ? $this->forPage($page, $perPage)->get($columns) : collect();

return new LengthAwarePaginator($results, $total, $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
]);
}

 

 

    $total = $this->getCountForPagination($columns);
}

 

で、countを取得しています。

 

一方、Modelオブジェクトが持っているEloquent::paginate()だと、

 

/**
* Paginate the given query.
*
* @param int $perPage
* @param array $columns
* @param string $pageName
* @param int|null $page
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*
* @throws \InvalidArgumentException
*/
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
{
$page = $page ?: Paginator::resolveCurrentPage($pageName);

$perPage = $perPage ?: $this->model->getPerPage();

$query = $this->toBase();

$total = $query->getCountForPagination();

$results = $total
? $this->forPage($page, $perPage)->get($columns)
: $this->model->newCollection();

return new LengthAwarePaginator($results, $total, $perPage, $page, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => $pageName,
]);
}

 

    $total = $query->getCountForPagination();

 

と、$column名が引数に渡ってないため、呼ぶ側が明示してもcount(*) と実行されるみたいです。

 

以上、使ってみて気づいたことでした。

 

本体に報告してみたいのですがやり方はまた調べて、fixしてもらえるようにしたいと思います。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

baserCMSを使ってサイト公開した話

baserCMS Advent Calendar 2016 - Adventar 3日目を担当させていただきました。よろしくお願いします。

http:// http://www.adventar.org/calendars/1703

 

 

昼食にいつも使っている定食屋さんがあって、

日頃良くしていただいているので、サイトを作りましょうと話が上がったため

今年のお盆前にbaserCMSを使って公開しました。

kitchen-yumeya.com

 

baserCMSは当時(baserCMS 3.0.10)でのインストールでした。

パッケージは公式サイトからダウンロードします。

 

インストールは、以下のような作業を行いました。

  1. zipファイルを右クリックでダウンロード
  2. ダウンロードしたzipファイルを解凍
  3. 解凍したフォルダをサーバにアップロード
  4. インストールページを表示
  5. インストールページのガイダンスに従って、フォルダのパーミッション修正
  6. データベースの指定(今回、PostgreSQLにしました。)
  7. サイト上で使うテーマ選択
  8. インストール完了

 

インストール完了すると、指定したテーマが公開されます。

 

しかし、今回別のテーマにしたかったため、探してみたところ、「baserマーケット」というのがありました。

market.basercms.net

 

baserCMSでカスタマイズを行うのに便利なプラグインやテーマを販売しているサイトのようです。

プラグイン、テーマを購入するのには会員登録が必要なため、baserCMSインストール作業で使用したメールアドレスを使って会員登録しました。

 

会員登録後、早速テーマを探してみました。

用途別に様々なテーマを選択できるみたいです。

f:id:kashii1207:20161203100820p:plain

 

今回「飲食店」なので、こちらのテーマを使用させていただきました。

f:id:kashii1207:20161203101036p:plain

baserCMSで公開されてあるテーマはどれもクオリティが高くテーマごとにどうゆうところを意識して作ったかなどの「商品説明」が記載がしっかりされているため、選ぶ側としても納得して選ぶことができます。

しかも、無料配布されているものも数多くあるためbaserCMSを使用しているユーザにとってはとてもありがたいです。

 

テーマを決めたので、「カートに入れる」を押して購入手続きを進めます。

 

購入手続きの流れは以下の通りでした。

  1. 現在のカゴの中(カートの中身を確認)
  2. 支払い方法・お問い合わせ入力
  3. 入力内容確認
  4. 注文完了

簡単ですね。

「baserマーケット」はダウンロードコンテンツを販売するサイトなのでお届け先の入力は必要ありません。

 

購入完了後、早速適応してみました。

f:id:kashii1207:20161203102831p:plain

 

TOPのメインビジュアルは、管理画面から差し替える事が可能ですので、

お店の看板メニューがどどんと出るように差し替えました。

f:id:kashii1207:20161203103340p:plain

 

デフォルトで使われている画像や文言を差し替えたいときには、「固定ページ管理」で編集することが出来るみたいです。ここでは、各ページで使われている画像の差し替えなどを行いました。

 

余談ですが、固定ページでは管理しない部分は、テーマ一覧から編集することも可能です。

f:id:kashii1207:20161203103811p:plain

 

「レイアウトテンプレート 一覧」ページが表示されますが、主に以下のような用途ごとにメニューがわけられているようです。どうやら、Webサイトの構成に従って共通化している部分をまとめて管理しているみたいですね。

  1. レイアウト一覧(layout)
  2. エレメント一覧(Elements)
  3. Eメール一覧(Email)
  4. コンテンツ一覧(content)
  5. css一覧(css
  6. イメージ一覧(img)
  7. Javascript一覧(js)

※作業する際には、元に戻せなくなって動かなくなったとか怖いんで編集前に「複製」してバックアップしておくことをおすすめします。

 

 

サイトを公開したら、解析タグを入れたりするのに、GoogleAnalyticsなどで設定しておくといいですね。

www.google.com

 

できあがったGoogleAnalyticsのタグには、「UA-」から始まる文字列が作成されますので、baserCMSの管理画面の「システム管理」から設定してください。

 

 あとは、Googleエゴサーチしたときに紹介できるように設定しておくのもいいですね。

地図上に住所が表示されたりしますが、そこに「営業時間」「Webサイト」などの情報を入れたりすると、今日のランチどうしようかなって思う人に対して集客もできるので設定しておくのも効果はあると思います。

f:id:kashii1207:20161203114423p:plain

 

今回、お店の人に内緒でサプライズでやってみましたが、お店の人から「Google」から検索で☆がついてたからお客様が来たとか、中には地方アイドルがレポートさせてくださいとご来店があったとか嬉しい報告をたくさんしていただけましたし、なによりサイト作って大変喜ばれたのがうれしかったですね。

 

CMSでサイト構築をご検討の方は参考にしていただけるとありがたいですね。

以上です。

QueryLog を出力する

クエリログが

\Log::alert(print_r(DB::getQueryLog(), true));

で出なかったメモ。

 

サーバ要件

ver. Laravel5.3

php: 5.6.x

 

```

\DB::enableQueryLog();

// query

\Log::alert(print_r(\DB::getQueryLog(), true));

```

広告を非表示にする