ためすう
Mac のスクリーンショットの保存場所を変更する方法
2018-09-30目的
Mac で撮影したスクリーンショットの保存場所を変更します。
方法
$ defaults write com.apple.screencapture location ~/Pictures/
SystemUIserver について
> SystemUIserverとは、メニューバーの通知アイコンを制御してるプロセス
SystemUIserver を再起動します。
$ killall SystemUIServer ```
参考
PHP でデザインパターン (Template Method)
2018-09-29Template Method パターンとは
スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定めるようなデザインパターン
クラスの振る舞いに注目したパターンで、サブクラスで具体的な振る舞いを決定させることを目的としています。
Template Method パターンのメリット
スーパークラスのテンプレートメソッドでアルゴリズムが記述されており、サブクラス側では アルゴリズムを記述する必要がなくなる
親クラス視点で見ると、「抽象メソッドとして定義したメソッドの実装が「保証される」
子クラス視点で見ると、クライアント側のコードを変更することなく、利用する処理を切り替えることができる。
実装例
<?php
abstract class AbstractDisplay
{
private $data;
public function __construct($data)
{
if (!is_array($data)) {
$data = [$data];
}
$this->data = $data;
}
public function getData()
{
return $this->data;
}
/**
* 処理のアルゴリズムがまとまっている
*
*/
public function display()
{
$this->displayHeader();
$this->displayBody();
$this->displayFooter();
}
protected abstract function displayHeader();
protected abstract function displayBody();
protected abstract function displayFooter();
}
class ListDisplay extends AbstractDisplay
{
protected function displayHeader()
{
echo 'ListDisplay.displayHeader()' . "\n";
}
protected function displayBody()
{
echo 'ListDisplay.displayBody()' . "\n";
foreach ($this->getData() as $key => $val) {
echo $val . "\n";
}
}
protected function displayFooter()
{
echo 'ListDisplay.displayFooter()' . "\n";
}
}
class TableDisplay extends AbstractDisplay
{
protected function displayHeader()
{
echo 'TableDisplay.displayHeader()' . "\n";
}
protected function displayBody()
{
echo 'TableDisplay.displayBody()' . "\n";
foreach ($this->getData() as $key => $val) {
echo sprintf("***%s***\n", $val);
}
}
protected function displayFooter()
{
echo 'TableDisplay.displayFooter()' . "\n";
}
}
$data = [
'Design Pattern',
'Gang of Four',
'Template Method Sample1',
'Template Method Sample2',
];
$display1 = new ListDisplay($data);
$display2 = new TableDisplay($data);
$display1->display();
echo "------\n";
$display2->display();
おまけ
リスコフの置換原則(LSP:The Liskov Substituion Principle): 「サブクラスの型はその親クラスの型と置換可能」
ハリウッドの原則(The Hollywood Principle:「Don’t call us. We’ll call you.」「我々を呼び出すな。必要なときは、我々が君を呼び出す」
参考
PHP でデザインパターン (Facade)
2018-09-29Facade の目的
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-25Factory 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 の各記事に目次を追加します。
今回は下記リポジトリを利用します。
方法
最新の
toc.html
ファイルをダウンロードします_includes
に 1. でダウンロードしたtoc.html
ファイルを配置しますテンプレートファイルに記述
下記のように指定します。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: