Before You Feel Pressure

Alright, everyone looking forward, please.

请大家都朝我这边看。

Good morning , year elevens.

早上好,11年级的同学们。

Today’s assembly is about the start of a journey

今天的集会是关于一段新的开始。

The start of the rest of your lives.

它将开启你们今后的余生。

In 2 years time all of you will be finishing your A levels.

再过两年,你们就会完成A levels的学业。

In 3 yeas time you’ll be studying across the world, studying at the university of your choice.

再过三年,你们就会去到自己想去的国家,上自己想上的大学。

In 5 years time you’ll have started your careers.

再过五年,你们就会开启自己的职业生涯。

Many of you will be in this room working for the top institutions across the globe.

你们在座的很多同学会进入世界顶尖公司工作。

You will then get married, you then may buy a house.

然后你们会结婚,买房。

In 10 years time your life will be set for you.

十年之后,你的人生就会安定下来。

In 15 years you’ll be 30 and from then on your path, your life will be set.

再过十五年,你就三十岁了,你的人生轨迹就会定型。

I’m sorry, Mr.Headmaster, let me tell you why that approach may fail you.

抱歉,校长,我想告诉你为什么你的这些话是错的。

I know people who graduated at 21 and didn’t get a job until they were 27.

有的人21岁毕业,到27岁才找到工作。

I know people who graduated late at 25 and they found work immediately.

有的人25岁才毕业,但马上就找到了工作。

I know people who never went to university, but found what they love at 18.

有的人没上过大学,却在18岁就找到了热爱的事。

I know people who found a job straight out of college making decent money, but hate what they do.

有的人毕业就找到好工作,赚很多钱,却过得不开心。

I know people who took gap years and found their purpose.

有的人选择间隔年,去寻找自我。

I know people who were so sure about what they were going to do at 16, they change their mind at 26.

有的人在16岁就清楚知道自己要什么,但在26岁时改变了想法。

I know people who have children but are single, and I know people who are married but had to wait 8 to 10 years to have children.

有的人有了孩子,却还是单身。有的人结了婚,却等了10年才生孩子。

I know people in relationships who love someone else.

有的人身处一段感情,爱的却是别人。

I know people who love each other but aren’t together.

有的人明明彼此相爱,却没有在一起。

So my point is everything in life happens according to our time, our clock.

我想说的是,人生中的每一件事都取决于我们自己的时间。

You may look at some of your friends and think that they’re ahead of you, maybe some of them you feel are behind, but everything happens at their own pace.

你身边有些朋友也许遥遥领先于你。有些朋友也许落后于你,但凡事都有它自己的节奏。

They have their own time and clock and so do you.

他们有他们的节奏,你有你自己的。

Be patient.

耐心一点。

At age 25, Mark Cuban was a bartender in Dallas.

库班25岁的时候还在酒吧做酒保。

It took till 32 for J.K.Rowling to be published for Harry Potter after being rejected by 12 publishers.

在被拒12次之后,JK罗琳到32岁才出版了哈利波特。

Ortega launched ZARA when he was 39.

Ortega 到39岁才创办了ZARA。

Jack Ma started Alibaba when 35.

马爸爸35岁才建立了阿里巴巴。

Morgan Freeman got his big break at 52.

摩根佛里曼到52岁才迎来他演艺事业的大爆发。

Steve Carell only got his break after40 yeas old.

Steve Carell 40岁才红。

Virgin was started by Richard Branson at 34. Richard Branson

34岁才创办维珍航空。

Getting your degree after 25 is still an achievement.

25岁后才拿到文凭,依然值得骄傲。

Not being married at 30 but still happy is beautiful.

30岁没结婚,但过得快乐也是一种成功。

Starting a family after 35 is still possible and buying a house after 40 is still great.

35岁之后成家也完全可以,40岁买房也没什么丢脸的。

Don’t let anyone rush you with their time lines.

不要让任何人扰乱你的时间表。

Because as Einstein said, “ Not everything that counts can be counted and not everything that’s counted truly counts.”

因为爱因斯坦曾经说过:并不是每一件算的出来的事,都有意义,也不是每一件有意义的事,都能够被算出来。

And this is the most important thing, I want you to be able to create meaningful, purposeful fulfilling lives for yourselves and learn how to use that to make an impact and a difference in the lives of others.

这才是最重要的事,我希望你们可以创造属于自己的充满意义的人生,我希望你们可以创造属于自己的充满意义的人生。学会用这些去影响点亮他人的生活。

That will be true success.

这才是真正的成功。

本文截取字天龙八部

本因、本观、本相、本参四僧见了鸠摩智献演三种指力,都不禁怦然心动,知道三卷奇书中所载,确是名闻天下的少林寺七十二门绝技,是否要将“六脉神剑”的图谱另录副本与之交换,确是大费踌躇。

本因道:“师叔,明王远来,其意甚诚。咱们该当如何应接,请师叔见示。”

枯荣大师道:“本因,咱们练功习艺,所为何来?”

本因方丈没料到师叔竟会如此询问,微微一愕,答道:“为的是弘法护国。”枯荣大师道:“外魔来时,若是吾等道浅,难用佛法点化,非得出手降魔不可,该用何种功夫?”本因道:“若不得已而出手,当用一阳指。”枯荣大师问道:“你在一阳指上的修为,已到第几品境界?”本因额头出汗,答道:“弟子根钝,又兼未能精进,只修得到第四品。”枯荣大师再问:

“以你所见,大理段氏的一阳指与少林拈花指、多罗叶指、无相劫指三项指法相较,孰优孰劣?”本因道:“指法无优劣,功力有高下。”枯荣大师道:“不错。咱们的一阳指若能练到第一品,那便如何?”本因道:“渊深难测,弟子不敢妄说。”枯荣道:“倘若你再活一百岁,能练到第几品?”本因额上汗水涔涔而下,颤声道:“弟子不知。”枯荣道:“能修到第一品吗?”

本因道:“决计不能。”枯荣大师就此不再说话。

githubPage 博客迁移

从 jeyll 到 hexo

hexo 的中文文档较为健全,我这里就只引入一下我参考部署相关的一些参考网站,

1
2
https://hexo.io/zh-cn/
http://theme-next.iissnan.com/getting-started.html

个人补充

jeyll 和 hexo 虽然从效果上看都可以将个人博客部署到 githubPage , 但个人看来在部署上还是有实现上的差别, jeyll 是基于 reby 由模板引擎渲染生成, hexo 则是将一整套静态网页部署到github。(个人感觉在 jeyll 投入过多,只是在重复的学习后端轮子的使用,倒不如切换到 hexo)

关于 hexo 的部署,网上有详细的操作,这里只是对 hexo generator repo 保存的补充,当使用 git 引入别的 themes 时,如果对themes 进行改动时,要注意将 themes 进行保存提交 ,一个方案是将 themes 单独作为一个项目保存, 另一个方案是将该主题的仓库清除,并入 hexo generator repo 保存,命令如下

1
2
3
git rm -r --cached some-directory
git commit -m "Remove the now ignored directory some-directory"
git push -u origin master

参考:
github上文件夹都是灰色-解决办法 使用hexo,如果换了电脑怎么更新博客? Hexo Next主题 设置圆形头像并旋转

hexo hello world

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

过滤语句

1
2
message:("Argument 10 passed " AND "4000")
"arg1" NOT "arg2"

1
2
3
4
5
6
7
8
9
10
11
12
13
$ vagrant init      # 初始化    
$ vagrant up # 启动虚拟机
$ vagrant halt # 关闭虚拟机
$ vagrant reload # 重启虚拟机
$ vagrant ssh # SSH 至虚拟机
$ vagrant suspend # 挂起虚拟机
$ vagrant resume # 唤醒虚拟机
$ vagrant status # 查看虚拟机运行状态
$ vagrant destroy # 销毁当前虚拟机
#box管理命令
$ vagrant box list # 查看本地box列表
$ vagrant box add # 添加box到列表
$ vagrant box remove # 从box列表移除
1
2
3
4
# 更改Homestead.yaml 后 执行以下指令,进行重新配置
vagrant.exe up --provision

==> homestead-7: Machine already provisioned. Run `vagrant provision` or use the `--provision`

如何利用php严格模式写出理想的代码

php限定类型

1
2
3
4
5
6
7
8
9
function returnIntByBool(bool $param):int
{
if($param){
$result = 1;
} else {
$result = 2;
}
return $result;
}

php严格模式开启

1
declare (strict_types = 1);

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

<?php
declare (strict_types = 1);

function returnArr($param) : array
{
if ($param) {
return [];
}
}

try {
var_dump(returnArr(1));
} catch (\Throwable $e) {
echo ($e->getMessage());
}

try {
var_dump(returnArr(0));
} catch (\Throwable $e) {
echo ($e->getMessage() . PHP_EOL);
}

function returnArrByBoolean(bool $param) : array
{
if ($param) {
return [];
}
}


try {
var_dump(returnArrByBoolean(1));
} catch (\Throwable $e) {
echo ($e->getMessage() . PHP_EOL);
}

try {
var_dump(returnArrByBoolean(true));
} catch (\Throwable $e) {
echo ($e->getMessage() . PHP_EOL);
}


function returnArrayByBooleanUseFormat(bool $param) : array
{
$result = [];
if ($param) {
$result = ['param' => true];
}
return $result;
}

try {
var_dump(returnArrayByBooleanUseFormat(true));
} catch (\Throwable $e) {
echo ($e->getMessage() . PHP_EOL);
}


try {
var_dump(returnArrayByBooleanUseFormat(false));
} catch (\Throwable $e) {
echo ($e->getMessage() . PHP_EOL);
}

今天在研究了下 php curl cookie的使用 , 本來打算写一篇关于 php curl 的使用,主要是关于 cookie 的,但是 curl 在一定程度上相比于 socket 算是一个经过封装的扩展,所以写的过程中又引入了一个使用 socket 进行 http 请求的文章

PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务器、使用各种协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能通过 PHP 的 FTP 扩展完成)、HTTP 基于表单的上传、代理、cookies、用户名+密码的认证

curl 基础用法

1
2
3
4
5
$ch = curl_init();
curl_setopt($ch,xxx,xxx);
curl_setopt_array($ch,[]);
curl_exec($ch);
curl_close($ch);

使用socket进行http访问 (这一部分可以跳过,之后再看)

这是一段使用 php socket 模拟 http get 请求的代码

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
/**
* super socket client
*/
define('GET', 'GET');
define('POST', 'POST');
define('sp', "\r\n");
$url = 'http://localhost:8080/';
$url = 'https://www.xiaozhu.com/';
$body = '';
$protocol = 'HTTP/1.1';
$urlInfo = parse_url($url);
$host = $urlInfo['host'];
$port = $urlInfo['port'] ?? '80';
$headerArr = [
'Host' => $host
];
$headerArr['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36';
if (stristr($url, 'xiaozhu')) {
$headerArr['connection'] = 'close';
}
$method = GET;
$requestLine = $method . ' ' . $urlInfo['path'] . '' . '?' . ($urlInfo['query'] ?? '') . ' ' . $protocol;
$header = '';
foreach ($headerArr as $key => $value) {
$header .= $header == '' ? ($key . ':' . $value) : (sp . $key . ':' . $value);
}
$requestHeader = $header . sp . sp;
$requestInfo = $requestLine . sp . $requestHeader;
$requestInfo .= $body;

$fp = fsockopen($host, $port, $errno, $errStr);

if (!$fp) {
echo $errStr . '(' . $errno . ')';
return;
}
function readByFEof($fp)
{
$str = '';
while (!feof($fp)) {
$result = fread($fp, 1024);
$str .= $result;
}
return $str;
}

if (fwrite($fp, $requestInfo)) {
$responseInfo = readByFEof($fp);
}
fclose($fp);
echo $responseInfo;
这是一段使用 php socket 模拟 http get 请求的代码
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
/**
* super socket client
*/
define('GET', 'GET');
define('POST', 'POST');
define('sp', "\r\n");
//$url = 'http://localhost:8080/';
$url = 'http://www.xiaozhu.com/';
$body = '';
$protocol = 'HTTP/1.1';
$urlInfo = parse_url($url);
$host = $urlInfo['host'];
$port = $urlInfo['port'] ?? '80';
$headerArr = [
'Host' => $host
];
$postData = ['username' => '发一个中文', 'age' => 22];
$body = http_build_query($postData);
$headerArr['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36';
$headerArr['Content-Type'] = 'application/x-www-form-urlencoded';
$headerArr['Content-Length'] = strlen($body);
$headerArr['cookie'] = 'name=1417760419;';
if (stristr($url, 'xiaozhu')) {
$headerArr['connection'] = 'close';
}
$method = POST;
$requestLine = $method . ' ' . $urlInfo['path'] . '' . '?' . ($urlInfo['query'] ?? '') . ' ' . $protocol;
$header = '';
foreach ($headerArr as $key => $value) {
$header .= $header == '' ? ($key . ':' . $value) : (sp . $key . ':' . $value);
}
$requestHeader = $header . sp . sp;
$requestInfo = $requestLine . sp . $requestHeader;
$requestInfo .= $body;

$fp = fsockopen($host, $port, $errno, $errStr);

if (!$fp) {
echo $errStr . '(' . $errno . ')';
return;
}

/**
* PHP 的 feof() 函数用于检测是否已到达文件末尾 (eof)。如果文件指针到了 EOF 或者出错时则返回 TRUE,否则返回一个错误(包括 socket 超时),其它情况则返回 FALSE。
* while (!feof($fp)) 即当文件指针没有达到 End Of File,就循环读入数据直至读完。这是一个常见用法,我们使用fsockopen打开一个$fp来发送http头,请求后用feof判断是否读完来获取服务器响应的内容。
* 但是这使用feof时要特别注意一点,php手册上关于feof有这样一个说明:
* Warning:如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回 TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。
* 也就是一个打开的socket连接,没有在读完后关闭,feof会一直返回true直到超时。
*/
function readByFEof($fp)
{
$str = '';
while (!feof($fp)) {
$result = fread($fp, 1024);
$str .= $result;
}
return $str;
}

if (fwrite($fp, $requestInfo)) {
$responseInfo = readByFEof($fp);
}

echo $responseInfo;

curl 进行请求

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
39
40
41
42
43
44
<?php
$url = 'http://localhost:8080/';
$path = __DIR__ . '/tmp';
$cookie_file = $path . '/cookie.txt';

if (!file_exists($cookie_file)) {
file_put_contents($cookie_file, '');
}

// init

$ch = curl_init();

// set

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 60,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_COOKIEFILE => $cookie_file,
CURLOPT_COOKIEJAR => $cookie_file,
]);

// $cookie = 'a=b;c=d;name=方世玉';
// curl_setopt($ch, CURLOPT_COOKIE, $cookie);
// exec

$output = curl_exec($ch);

if ($output === FALSE) {
echo 'CURL Error:' . curl_error($ch);
}

// close

curl_close($ch);

echo $output;

上面就是一个带有 cookie 的 http 请求,cookie 在 php-curl 的设置中有4种

( 我才发现我用的这个主题不支持表格md mmp)

  • CURLOPT_COOKIE
    • 包含 cookie 数据的文件名,cookie 文件的格式可以是 Netscape 格式,或者只是纯 HTTP 头部风格,存入文件。如果文件名是空的,不会加载 cookie,但 cookie 的处理仍旧启用。
  • CURLOPT_COOKIEFILE
    • 包含 cookie 数据的文件名,cookie 文件的格式可以是 Netscape 格式,或者只是纯 HTTP 头部风格,存入文件。如果文件名是空的,不会加载 cookie,但 cookie 的处理仍旧启用。
  • CURLOPT_COOKIEJAR
    • 连接结束后,比如,调用 curl_close 后,保存 cookie 信息的文件。 |

还有一种方法就是在header中直接设置

正常使用的话 CURLOPT_COOKIEFILE , CURLOPT_COOKIEJAR 这两个设置使用起来很方便如果使用其他的方式的话,那么需要自行处理 cookie 的存储

在使用 CURLOPT_COOKIEJAR 发现了一个有趣的事,相比与日常使用的浏览器(谷歌,edge等),我们使用脚本进行请求cookie请求会将cookie保存起来并不会过期这就会导致尽管cookie已经过期了但是仍然传送了过去,其实从某些方面来说也可以把这个作为一个辨别是否是爬虫的手段(手动滑稽)

在使用 socket 进行 http 模拟的时候很明显就能感觉到是字符串在通信,传过去的和传回来的都是按格式规整好的字符串

发送

1
2
3
4
5
6
7
8
POST /? HTTP/1.1
Host:localhost
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Content-Type:application/x-www-form-urlencoded
Content-Length:61
cookie:name=1417760419;

username=%E5%8F%91%E4%B8%80%E4%B8%AA%E4%B8%AD%E6%96%87&age=22
返回
1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 200 OK
Host: localhost
Date: Sun, 10 Feb 2019 23:15:08 +0800
Connection: close
X-Powered-By: PHP/7.2.10-0ubuntu0.18.04.1
Set-Cookie: mc1549811708=my+cookie+value
Set-Cookie: mc=my+cookie+value; expires=Sun, 10-Feb-2019 15:15:07 GMT; Max-Age=0
Content-type: text/html; charset=UTF-8

array (
....//太多了省略其实也就是一堆字符串
)

很容易看到一些关于 http 协议的参数,其中我在测试我们公司的主站时由于公司的服务器并没有主动断开 socket ,而我是用的 feof 读取返回值就导致程序一直等啊等,这一点我没有细做调试,所以也不太清楚是出在 nginx 上还是 php, 但是确实是可以让客户端和服务端建立长久的无用链接如果在客户端设置 Connection: close,也可以解决这种问题,而这种问题出现的源头是http1.1支持相关网络请求相关的实现,有兴趣的同学可以自行研究一下(手动狗头)

codeception

创建单元测试

1
2
$.\vendor\bin\codecept run g:test unit src/CouponAccountClient
# Test was created in C:\Users\hzj\Desktop\xz\xz_stub-client\tests\unit\src\CouponAccountClientTest.php
运行单元测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$  .\vendor\bin\codecept run  tests\unit\src\CouponAccountClientTest.php
Codeception PHP Testing Framework v2.5.1
Powered by PHPUnit 7.3.5 by Sebastian Bergmann and contributors.
Running with seed:


Unit Tests (1) -------------------------------------------------------------------------------------------------------------------------------------------

+ CouponAccountClientTest: Some feature (0.03s)
-------------------------------------------------------------------------------------------------------------------------------------------

Time: 749 ms, Memory: 10.00MB

OK (1 test, 0 assertions)

php爬虫

1
2
3
4
5
6
7
8
9
10
# 异步 HTTP 客户端
composer require clue/buzz-react
# DomCrawler 的适配组件 CSS-selector
composer require symfony/dom-crawler

composer require symfony/css-selector

# 异步处理文件
composer require react/filesystem

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
<?php

$timeManager = [];
$timeMark = 0;

$i = 1000;
while ($i--) {
$jobTime = (time() + mt_rand(0, 1000));
echo (1000 - $i) . '个任务 将于' . date('Y-m-d H:i:s', $jobTime) . '执行' . PHP_EOL;
$timeManager[$jobTime][] = '$i 任务 ' . $i;
}

while (true) {
ksort($timeManager);
$timeMark = key($timeManager);
if (count($timeManager) > 0 && $timeMark < time()) {
var_dump($timeMark);
var_dump(date('Y-m-d H:i:s', $timeMark));
$job = $timeManager[$timeMark];
unset($timeManager[$timeMark]);
#$job = array_shift($timeManager);
} else {
sleep(1);
}
}
0%