设计模式从头学习-前言

注意
本文参考了书籍《大话设计模式》和文章从招式与内功谈起——设计模式概述
#写作初衷
我有空的时候就会学习一下设计模式,零零散散半年过去了,真正能够静下心来学习
设计模式的事件少之又少,而且很多模式例如单例模式,命令模式等我学过后就忘了,让我现在再
复述或者使用我又需要重新去学一下,因此我抛弃以前学习的零零散散的与设计模式相关的东西,
尝试从头再学一次,边学边使用,并做好详细的笔记,以后可以直接翻阅。
#设计模式的作用
(1)设计模式经过多年的使用和实践,包含了大量成功的,可维护可复用的设计方案,在很多情况下,设计模式可以提高开发效率,节约时间
(2)设计模式跨语言、跨平台、跨应用、跨国界,提供了通用的词汇和使用方式,节约交流时间
(3)大部分设计模式都兼顾了系统的可重用性和扩展性,这使很多系统可以重用,减少代码重复
(4)合理使用设计模式有助于别人理解自己的代码
(5)有助于更为深刻地理解面对对象编程
#如何掌握设计模式
a.这个设计模式的意图是什么
b.它要解决一个什么问题
c.什么时候可以使用它
d.它是如何解决问题的
e.掌握它的结构图
f.记住它的关键代码
g.能够想到至少两个它的应用实例,一个生活中的,一个软件中的
h.这个模式的优缺点是什么
i.在使用时要注意什么
#注意事项
(1)最好的掌握设计模式的方法是使用它们
(2)千万不要滥用模式

《第一本docker书》学习笔记01

Docker与配置管理

docker的核心组件

(1)docker客户端和服务器,也称为docker引擎
(2)docker镜像
(3)Registry
(4)Docker容器

基本使用

docker info

查看docker程序是否存在,功能是否正常

docker exec(docker run)

docker run 命令提供了docker容器的创建到启动的功能
(1)-i:保证容器STDIN是开启的
(2)-t:为要撞见的容器分配一个伪tty终端
docker exec -it backend_jiapin /bi
n/bash

php多维数组相关处理

使用场景

在工作中遇到了两次需要把不确定维度的多维数组渲染出来的情况,且还需要修改值和结构,如果使用json-patch会受到限制(需要根据不同的情况打补丁,且由于结构不一定一致,打补丁可能会错误地修改某些文件),因此需要自行设计批量修改如yaml,json等类似于多级结构的方法

具体解析

多维数组转化的json前端渲染

结构不固定,获取对应的json,ts实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
formatJsonData = (obj: any, name: string, moduleName?: string, getModuleName?: string): any[] => {
const arr: any[] = []
if (Object.keys(obj)) {
let keys = Object.keys(obj);
let i = 0;
return keys.map((items) => {
i++;
if (obj[items] instanceof Object) {
let itemRes = items;
if (obj[items]['type']) {
itemRes = obj[items]['type'];
}
const names = name + '=' + itemRes
return this.formatJsonData(obj[items], names, moduleName);
} else {
const resItems = name + '=' + items;
this.routesValue.set(resItems, obj[items])
if (getModuleName && resItems === getModuleName) {
return obj[items];
}
}
});
}
return arr
}

结构不固定,根据json获取对应的值,php实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
/**
* 将数组格式化为mongo可用的filter
* @param array $arr
* @param string $origin
* @return array
*/
private function formatArr2MongoFilter(array $arr, string $origin = 'data'): array
{
if (array_keys($arr)) {
$keys = array_keys($arr);
foreach ($keys as $key) {
if (is_array($arr[$key])) {
$resName = $origin . '.' . $key;
return $this->formatArr2MongoFilter($arr[$key], $resName);
} else {
$resName = $origin . '.' . $key;
return ['mongoFilter' => $resName, 'value' => $arr[$key]];
}
}
}
}
?>

比较两个多维数组获取差异

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
/**
* 比较多维数组获取差异值
* @param $array1
* @param $array2
* @return int
*/
private function array_diff_assoc_recursive($array1, $array2)
{
foreach($array1 as $key => $value)
{
if(is_array($value))
{
if(!isset($array2[$key]))
{
$difference[$key] = $value;
}
elseif(!is_array($array2[$key]))
{
$difference[$key] = $value;
}
else
{
$new_diff = $this->array_diff_assoc_recursive($value, $array2[$key]);
if($new_diff != FALSE)
{
$difference[$key] = $new_diff;
}
}
}
elseif(!isset($array2[$key]) || $array2[$key] != $value)
{
$difference[$key] = $value;
}
}
return !isset($difference) ? 0 : $difference;
}
?>

linux命令大全

系统信息

arch

描述

显示机器的处理器架构
举例

towrow

uname

描述

显示机器的处理器架构
参数

-a或–all  显示全部的信息。
-m或–machine  显示电脑类型。
-n或-nodename  显示在网络上的主机名称。
-r或–release  显示操作系统的发行编号。
-s或–sysname  显示操作系统名称。
-v  显示操作系统的版本。
–help  显示帮助。
–version  显示版本信息。
举例

towrow

dmidecode

描述

显示硬件信息,不常用,可忽略

开关机

shutdown

描述

关机或重启
参数

-t seconds : 设定在几秒钟之后进行关机程序。
-k : 并不会真的关机,只是将警告讯息传送给所有使用者。
-r : 关机后重新开机。
-h : 关机后停机。
-n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机。
-c : 取消目前已经进行中的关机动作。
-f : 关机时,不做 fcsk 动作(检查 Linux 档系统)。
-F : 关机时,强迫进行 fsck 动作。
time : 设定关机的时间。
message : 传送给所有使用者的警告讯息。
举例

shutdown -h now //立即关机
shutdown -r now //立即重启

reboot

描述

重启
参数

-n : 在重开机前不做将记忆体资料写回硬盘的动作
-w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
-d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
-f : 强迫重开机,不呼叫 shutdown 这个指令
-i : 在重开机之前先把所有网络相关的装置先停止

logout

描述

登出系统
###

linux命令大全

文件操作

cat

描述

查看文件内容
参数

-n 或 –number 由 1 开始对所有输出的行数编号
-b 或 –number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 –squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 –show-nonprinting
举例
1 从键盘创建一个文件:
towrow
2 将几个文件合并成一个文件:
towrow

cd

描述

计算相关

1 计算矩形是否相交

描述
给定两个矩形的左上角起始点坐标和矩形的宽,高,计算这两个矩形是否相交
分析
1 矩形1左上角坐标p1,右下角坐标p2,矩形2左上角坐标p3,右下角坐标p4
2 M点坐标为P1与P3点在X方向较大值与Y方向较大值的交点
3 N点坐标为P2与P4点在X方向较小值与Y方向较小值的交点
4 如果M点的X坐标和Y坐标值均比N点相应的X坐标和Y坐标值小,亦即M和N可以分别构成一个矩形的左上角点和右上角点,则两矩形相交;其余情况则不相交
代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
function checkRectInterSect($rect1, $rect2)
{
$x1 = $rect1['x']; $w1 = $rect1['w'];
$y1 = $rect1['y']; $h1 = $rect1['h'];
$x2 = $rect2['x']; $w2 = $rect2['w'];
$y2 = $rect2['y']; $h2 = $rect2['h'];
$p1 = [$x1, $y1];
$p2 = [$x1 + $w1, $y1 + $h1];
$p3 = [$x2, $y2];
$p4 = [$x2 + $w2, $y2 + $h2];

$M = [max($p1[0], $p3[0]), max($p1[1], $p1[1])];
$N = [min($p2[0], $p4[0]), min($p2[1], $p4[1])];

if ($M[0] < $N[0] && $M[1] < $N[1]) {
return true;
} else {
return false;
}
}
?>

2 json转csv

描述
需要将数据库数据导出为csv文件
代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
function getCsvData(int $limit = 1000, int $skip = 0, string $ageId = '')
{
$data = $this->dao->conn->query(['faceItems' => ['$in' => [$ageId]], 'status' => 2, 'apiCheckPass' => true],
null, ['limit' => $limit, 'skip' => $skip]);
foreach ($data as $v) {
foreach ($v as $key => $values) {
if (is_array($values)) {
$v[$key] = implode('|', $values);
}
(string)$v[$key];
}
$exportData = implode(',', $v);
$exportData = $exportData . "\r\n";
$myfile = fopen("data.csv", "a") or die("Unable to open file!");
$this->writeToCsvFile($data, $myfile, $exportData);
fclose($myfile);
}
}
function writeToCsvFile(array $data, $myfile, $exportData)
{
// $txt = \GuzzleHttp\json_encode($data);
fwrite($myfile, $exportData);
return true;
}
?>

运行相关

1 下载数据

描述
根据链接下载文件
代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
function downloadOldFile($url,$rename,$ext){
$file_path = 'public/images/age_60-120/';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$rawdata=curl_exec ($ch);
curl_close ($ch);
// 使用中文文件名需要转码
$fp = fopen($file_path. $rename .".".$ext,'w');
fwrite($fp, $rawdata);
fclose($fp);
// 返回路径
return $_SERVER['DOCUMENT_ROOT'].$file_path.$rename.".".$ext;
}
?>

2 按步骤执行方法

描述
经常有需求:分页执行脚本,例如前1000条执行完后继续分页,此时就需要自动跳页执行
代码

```php
<?php
/**
* @param mixed …$args
* @return bool
* @throws Exception
*/
private function stepRun(…$args)
{
$count = $args[0];
$method = $args[1];
$step = array_key_exists(2, $args) ? $args[2] : 10;
$limit = array_key_exists(3, $args) ? $args[3] : 10;
$param = array_key_exists(4, $args) ? $args[4] : ‘’;
$stepCount = ceil($count / $step);
for ($nowStep = 0; $nowStep < $stepCount; $nowStep ++) {
$this->$method($limit, $nowStep * $step, $param);
sleep(1);
}
sleep(1);
return true;
}
// 调用
// $this->stepRun($exportCount, ‘loopChildData’, 1000, $ageId);

// 执行方法
/**
    function loopChildData(int $limit = 1000, int $skip = 0, string $ageId = '')
    {
        $data = $this->dao->conn->query(['faceItems' => ['$in' => [$ageId]], 'status' => 2, 'apiCheckPass' => true],
            null, ['limit' => $limit, 'skip' => $skip]);
        foreach ($data as $v) {
            $this->downloadChildFile(Url::createPrivateUrl($v['url']), $v['_id'], 'jpg');
        }
    }
**/

?>
``

有用的代码段-ts篇

查询数组中值相等的

1
modules.modules.find(item => item.route === route).chinese

ref调用子组件

1
<FacePointsMarkTool ref={com => this.com = com} customRightRender={this.customRightRender} hideSaved={this.handleHideSaved} dataSource={dataSource} loadMore={this.getFaceData} isShowFacePlus saveFaceData={this.saveFaceData}></FacePointsMarkTool>

有用的代码段-php篇

分步骤执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
/**
* @param mixed ...$args
* @return bool
* @throws Exception
*/
public function stepRun(...$args): bool
{
$count = $args[0];
$method = $args[1];
$step = array_key_exists(2, $args) ? $args[2] : 10;
$limit = array_key_exists(3, $args) ? $args[3] : 10;
$param = array_key_exists(4, $args) ? $args[4] : '';
$stepCount = ceil($count / $step);
for ($nowStep = 0; $nowStep < $stepCount; $nowStep ++) {
$this->$method($limit, $nowStep * $step, $param);
sleep(1);
}
sleep(1);
return true;
}
?>

使用方法

1
2
3
<?php
$this->stepRun($groupChangeCount, 'loopGetData', 30, 30);
?>

分析

可运用于需要遍历数据库数据,对数据执行操作的功能上。

mongodb查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
/** 宜宾爱你宝贝
* @return bool|int
* @throws \yii\base\InvalidConfigException
*/
public function checkAssign()
{
$query = [
'$or' => [
['isMarked' => false],
['isMarked' => ['$exists' => false]]
],
'faceChecked' => true,
'assignAuthor' => BackendCookieHelper::getName()];
if ($this->dao->conn->count($query) >= 20) {
return true;
} else {
unset($query['assignAuthor']);
return $this->assignToPerson($query);
}
}
?>