ためすう

PHP でデザインパターン (Facade)

2018-09-29

Facade の目的

Facade 役は、システムの外側に対してはシンプルなインターフェース( API )を見せます。 また、Facade 役はシステムの内側にある各クラスの役割や依存関係を考えて、正しい順番でクラスを利用します。

Facade のメリット

  • サブシステムの構成要素を隠蔽する
  • サブシステムとクライアントの結びつきをゆるくする

実装例

<?php

class ArrDatabase
{
    private function __construct()
    {
    }

    public static function getProperties()
    {
        return [
            'abc@xxx' => 'abc ABC',
            'def@xxx' => 'def DEF',
            'xyz@xxx' => 'xyz XYZ',
        ];
    }
}

class HtmlWriter
{
    private $writer;

    public function __construct($writer)
    {
        $this->writer = $writer;
    }

    public function title($title)
    {
        $this->writer->open();
        $this->writer->write("title始まり\n");
        $this->writer->write($title . "\n");
        $this->writer->write("title終わり\n");
    }

    public function paragraph($message)
    {
        $this->writer->write("paragraph始まり\n");
        $this->writer->write($message . "\n");
        $this->writer->write("paragraph終わり\n");
    }

    public function close()
    {
        $this->writer->close();
    }
}

/*
 * ファイルの書き出す
 *
 */
class FileWriter
{
    private $filename;
    private $file_handler;

    public function __construct($filename)
    {
        $this->filename = $filename;
    }

    public function open()
    {
        $this->file_hanlder = fopen($this->filename, 'w');
    }

    public function write($content)
    {
        fwrite($this->file_hanlder, $content);
    }

    public function close()
    {
        return fclose($this->file_hanlder);
    }
}

class PageMaker
{
    private function __construct()
    {
    }

    public static function makeWelcomePage($mailaddr, $filename)
    {
        $mailprop = ArrDatabase::getProperties();
        $username = $mailprop[$mailaddr];

        $writer = new HtmlWriter(new FileWriter($filename));
        $writer->title("Welcome to " . $username . "'s page!");
        $writer->paragraph($username . "のページへようこそ");
    }
}

PageMaker::makeWelcomePage('xyz@xxx', '/tmp/welcome.html');

参考

PHP でデザインパターン (Factory Method)

2018-09-25

Factory Method の目的

インスタンスを生成する工場を Template Method パターンで構成したもの

Factory Methodパターンを利用することで、オブジェクトの利用側はどのインスタンスが生成されるのかを知る必要がなくなります。

Factory Method パターンのメリット

  • オブジェクトの生成処理と使用処理を分離できる
  • オブジェクトの利用側とオブジェクトのクラスの結びつきを低くする

実装例

<?php

interface Reader
{
    public function read();
    public function display();
}

class CSVFileReader implements Reader
{
    private $filename;

    public function __construct($filename)
    {
        $this->filename = $filename;
    }

    public function read()
    {
        echo "CSVファイルの読み込み\n";
    }

    public function display()
    {
        echo "CSVの各行を表示\n";
    }
}

class XMLFileReader implements Reader
{
    private $filename;

    public function __construct($filename)
    {
        $this->filename = $filename;
    }

    public function read()
    {
        echo "XMLファイルの読み込み\n";
    }

    public function display()
    {
        echo "XMLの各行を表示\n";
    }
}

class ReaderFactory
{
    public function create($filename)
    {
        $reader = $this->createReader($filename);
        return $reader;
    }

    private function createReader($filename)
    {
        if (preg_match('/.+\.csv$/', $filename)) {
            return new CSVFileReader($filename);
        } elseif (preg_match('/.+\.xml$/', $filename)) {
            return new XMLFileReader($filename);
        }

        throw new Exception('サポートしていない');
    }
}

// 呼び出し元
$filename = 'abc.xml';
$factory = new ReaderFactory();
$data = $factory->create($filename);
$data->read();
$data->display();

参考

apache ユーザーが root ユーザーとして処理を実行する方法

2018-09-24

目的

Web サーバー (apache) で php を実行すると、

実行ユーザーは apache ユーザーとなります。

処理の中で root 権限が必要な処理がありました。

方法

  • abc.py
print(30)
  • test.php
$a = exec('sudo -u root /usr/bin/python /var/www/html/abc.py', $d);

というように、root ユーザーでコマンドを実行できるようにします。

今のままではできないので、下記ファイルを編集します。

# vim /etc/sudoers

下記行を追加してください。

apache ALL=(root) NOPASSWD: ALL

これで root ユーザーで実行することができるようになりました。

参考

pip でインストール先を指定する方法

2018-09-24

目的

pip でインストールをする時、権限がなくインストールできないことがありました。

なので、インストール先を任意の場所に変更する方法を調べました。

方法

例えば、下記を実行すると

1. インストール先のディレクトリを指定する

pycrypto ライブラリを /tmp ディレクトリにインストールします

$ pip install pycrypto -t /tmp/

2. ~/.local/ へインストールする

また、下記のように指定すると ~/.local/ へインストールすることができます

$ pip install pycrypto --user

参考

マシンのスペックを調べる方法

2018-09-23

目的

マシンのスペックを調べる方法になります。

Mac では動くけど、 CentOS では動かないプログラムがあったので調査のためマシンのスペックをそれぞれ調べます。

方法

Mac のスペックを調べる

下記コマンドで調べることができます

$ system_profiler SPHardwareDataType

※ 一部 x で情報を伏せています。

Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro11,3
      Processor Name: Intel Core i7
      Processor Speed: 2.5 GHz
      Number of Processors: 1
      Total Number of Cores: 4
      L2 Cache (per Core): 256 KB
      L3 Cache: 6 MB
      Memory: 16 GB
      Boot ROM Version: MBP112.0146.B00
      SMC Version (system): 2.19f12
      Serial Number (system): XXXXX
      Hardware UUID: XXXXX

Cent OS のスペックを調べる

Virtual Box で試してみました。

$ cat /etc/redhat-release
CentOS release 6.5 (Final)
$ cat /proc/version
Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013
$ cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 70
model name	: Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz
stepping	: 1
cpu MHz		: 2494.451
cache size	: 6144 KB
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc up rep_good xtopology nonstop_tsc pni pclmulqdq monitor ssse3 cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx rdrand lahf_lm abm avx2
bogomips	: 4988.90
clflush size	: 64
cache_alignment	: 64
address sizes	: 39 bits physical, 48 bits virtual
power management:
$ cat /proc/meminfo
MemTotal:         469452 kB
MemFree:           17892 kB
Buffers:            2980 kB
Cached:            31916 kB
SwapCached:         6052 kB
Active:           179468 kB
Inactive:         196776 kB
Active(anon):     168616 kB
Inactive(anon):   183976 kB
Active(file):      10852 kB
Inactive(file):    12800 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        950264 kB
SwapFree:         821776 kB
Dirty:                 4 kB
Writeback:             0 kB
AnonPages:        336028 kB
Mapped:            20112 kB
Shmem:             11244 kB
Slab:              58108 kB
SReclaimable:       8248 kB
SUnreclaim:        49860 kB
KernelStack:         832 kB
PageTables:         9096 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1184988 kB
Committed_AS:    1068704 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        4052 kB
VmallocChunk:   34359723152 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        8128 kB
DirectMap2M:      483328 kB

参考

tmux で vim のカラースキーマが反映されない件

2018-09-23

目的

tmux を導入してから vim のカラースキーマが反映されない状態になってしまっていました。

見にくいので、カラースキーマが反映されるようにします。

方法

~/.tmux.conf を作成

set -g default-terminal "screen-256color"

注意する点としては、tmux を起動している場合は

tmux を立ち上げ直してください。

参考

jekyllで目次を設定する (jekyll-toc-generator)

2018-09-23

目的

jekyll の各記事に目次を追加します。

方法

今回、jekyll-toc-generator を利用します。

github からリポジトリをダウンロードします。

_plugins フォルダのセット



#### css ファイルのセット、html から読み込み

```css/toc.css``` ファイルを、任意の場所に指定します。

次に配置した css ファイルを読み込むようにします。


#### _config.yml の設定

目次の項目となる見出しの要素を指定します。

今回、h3 タグを指定しました。

jekyll-toc-generator

tocTopTag: h3


#### テンプレートで指定

下記のように設定します。

{% raw >}}

{{ content | toc_generate }}

{% endraw >}} ```

最後に

GitHub Pages の場合、この方法では目次が追加できませんでした。

別記事で、違う方法を試してみます。

参考

jekyll で目次を設定する (jekyll-toc)

2018-09-23

目的

GitHub Pages で、jekyll の各記事に目次を追加します。

今回は下記リポジトリを利用します。

方法

  1. 最新の toc.html ファイルをダウンロードします

  2. _includes に 1. でダウンロードしたtoc.htmlファイルを配置します

  3. テンプレートファイルに記述

下記のように指定します。content は目次を生成したい html になります。

{% raw >}}

{% include toc.html html=content >}}

{% endraw >}}

Use it in your template layout where you have {% raw >}}{{ content }}{% endraw >}} which is the HTML rendered from the markdown source with this liquid tag:

MySQL のインデックス追加、変更、削除

2018-09-23

目的

mysql のテーブルでインデックスを追加・変更・削除します。

よく調べ直しているので、メモしておきます。

方法

使用テーブル

CREATE TABLE test_2018 (
    id int,
    id2 int
);

ユニークキー

追加

ALTER TABLE test_2018
ADD UNIQUE uk_id2 (id2)
;

削除

ALTER TABLE test_2018
DROP INDEX uk_id2
;

インデックス

追加

ALTER TABLE test_2018
ADD INDEX idx_id2 (id2)
;

削除

ALTER TABLE test_2018
DROP INDEX idx_id2
;

参考

MySQL のテーブルのカラム追加、変更、削除

2018-09-22

目的

mysql のテーブルでカラムを追加・変更・削除します。

よく調べ直しているので、メモしておきます。

方法

使用テーブル

CREATE TABLE test_2018 (
    id int
);

追加

ALTER TABLE test_2018
ADD id2 int AFTER id
;

変更

change を使用する場合

ALTER TABLE test_2018
CHANGE id2 id2_changed int
;

modify を使用する場合

ALTER TABLE test_2018
MODIFY id2_changed text
;

削除

ALTER TABLE test_2018
DROP id2_changed
;

参考