慢慢读《月亮与六便士》

书桌上的寂寞

2018年10月30日

下班到家8点来钟了,看教程的确心不在焉的看不进去了就拿这本说过度翻了一个来小时吧。读了前10章,作者以第三人称的视角去切入故事进入主线。大体意思是斯特里克兰的夫人喜欢宴请文人,但是一天斯特里克兰突然不辞而别去了巴黎,作者受托去巴黎拖回斯特里克兰。但从前2章的铺垫来看特里克兰去巴黎可定不是像她夫人猜想的那样去找小姐姐了,人物刻画得还算细腻,有点东西抽空继续看

2018年11月03日

花了周六一天时间读完了余下的章节,斯克里克兰的原型其实是保罗·高更,虽然名字是假的但是故事是真的。一个40岁过后的中年男人放弃一个体面的证券公司经纪人的工作,放弃一个外人看来美好的家庭,可以用抛妻弃子来形容了。在快要病死的时候朋友出手相助,这老小子勾引朋友的妻子最后还导致朋友妻子自杀。。。故事很精彩的,而且很真实讲述了高更的一生。比较佩服这种为了自己梦想爱好着魔为之努力的人奋斗的人,他们不在乎别人的眼光知道自要什么,追求精神层面的满足。
我不想谋生,我想要生活

C语言自学系列三_结构体_枚举与位字段

序上篇C语言自学系列二_结构体,中结构体还有两个特性需要补充枚举变量和字段,又是一个深夜希望明天能起得来吧。

#枚举

有时候你不想保存数字或者文本,而是想保存一组符号。如果你想记录一周中的七天时间,因为数值在可预料范围内,并且很好列举出来。所以有了枚举

定义与调用

1
2
3
4
5
6
7
8
9
10
11
12
方法一:
enum sex {man,woman,katoey};

enum sex kName = man;

方法二
typedef enum {
man,woman,katoey
} sex;

sex kName = man;

  • 结构与联合用分号分割,枚举用逗号分割
  • 枚举只能赋值定义在内的值

举个栗子趟个坑

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

typedef enum {
man,woman,katoey
} sex;

int main()
{
sex sex = man;
printf("%d\n",man);
}

枚举运行结果

如果我们换上一个枚举中未定义的值会有什么样情况呢?

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

typedef enum {
man,woman,katoey
} sex;

int main()
{
sex sex = test;//未定义此内容
printf("%d\n",man);
}

枚举错误结果展示

编译器会提示undeclared

先来一段官方解析位段(bit-field)是以位为单位来定义结构体(或联合体)中的成员变量所占的空间。含有位段的结构体(联合体)称为位段结构。采用位段结构既能够节省空间,又方便于操作。,在实际开发中第一次用到位和接触到位这个概念是在redis中的bitmap,它在统计活跃用户数等特定场景下的性能和成本惊艳到我

##定义与使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

typedef struct {
unsigned int low_pass_vcf:1;
unsigned int filter_coupler:1;
} synth;

int main()
{
synth test = {.filter_coupler=0};
printf("内容:%d\n", test.filter_coupler);

return 0;
}
  • 位声明unsigned int是教科书必要条件,网上也看到一些野路子说不一定int
  • 位声明冒号后的个数实际是二进制表达的最大区间

ps:总感觉位这种高端的东西停留在认知阶段,希望以后有时间可以尝试一番~

shell备份mysql到远程oss服务

做了个梦辛辛苦苦做了半天网站突然服务器到期被释放掉了,最尴尬的是数据库也放在了同一台上。写了大半年的博客,数据全丢了。不行,感觉我的小网站还是需要做点容灾措施的。

用到知识点

  • shell expect
  • mysqldump
  • 又拍upx命令行工具
  • corntab

实现原理

一张很直的流程图

1
2
3
4
5
6
7
8
9
st=>start: corntab命令执行
op1=>operation: 触发shell
op2=>operation: 登陆upx
op3=>operation: 创建当日临时目录
op4=>operation: mysqldump 备份数据库
op5=>operation: 上传dump数据
op6=>operation: 删除本地临时dump文件夹
end=>end: 备份完成
st->op1->op2->op3->op4->op5->op6->end

shell 脚本

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
#!/usr/bash
#----------------
# filename: mysql_dump.sh
# date: 2018/10/23
# author: zjj
# email: 526353781
#----------------
#当天时间
time=`date +%Y%m%d`
#备份临时文件路径
tmpDir='/home/admin/'$time
#数据库账号
db_user=''
#数据库密码
db_password=''
#备份的库
db_name=("XX OO")
#又拍空间名
serviceNam=''
#又拍操作员名称
operator=''
#又拍操作员密码
password=''

#创建当日文件夹
mkdir $tmpDir


#又拍登陆
/usr/bin/expect <<EOF
set timeout 10
spawn upx login
expect {
"ServiceName:" { send "$serviceNam\r";exp_continue }
"Operator:" { send "$operator\r";exp_continue }
"Password:" { send "$password\r";expect eof }
}
EOF

for value in ${db_name[@]}
do
mysqldump --host=localhost -u$db_user -p$db_password ${value} > $tmpDir/${value}_$time.dump
#上传
/usr/local/bin/upx put $tmpDir/${value}_$time.dump $time/${value}_$time.dump
done

#删除
if [ -d "$tmpDir" ]; then
rm -rf $tmpDir
fi

添加定时脚本

1
2
3
4
5
6
crontab -e

加入定时,每天23点执行

00 23 * * * /bin/bash /home/admin/mysql_dump.sh >> /home/admin/shell.log #备份数据库

shell脚本引用expect完成人机交互,实现自动登录

在shell中总会遇见一些需要人机交互输入的内容,比较通用的方法个人喜欢使用expect。

安装

ubuntu

1
apt-get install tcl tk expect

命令

expect有几个核心的指令:

  • spawn:启动新进程,后跟新进程要执行的指令;
  • expect:指定要监听的字符串,如果spawn进程返回了匹配的字符串(如标准输入的提示信息),则触发send;
  • send:发送指定的字符串到spawn进程,代替标准输入;
  • interact:用户参与交互;
  • “\r” #表示回车
  • exp_continue #当问题不存在时继续回答下边的问题
  • expect eof #问题回答完毕退出expect环境
  • set NAME [ lindex $argv n] #定义变量

#使用

虽然 expect 功能强大但是笔者还是喜欢用 bash 毕竟通用,在bash中引用expect的用法。下面得expect{}内应答内容与先后顺序无关。expect会自动帮你完成

1
2
3
4
5
6
7
8
9
10
11
#又拍登陆
/usr/bin/expect <<EOF
set timeout 10
spawn upx login
expect {
"ServiceName:" { send "$serviceNam\r";exp_continue }
"Operator:" { send "$operator\r";exp_continue }
#在流程上输入密码是最后一步,所以输完密码后退出expect
"Password:" { send "$password\r";expect eof }
}
EOF

又拍云upx安装

又拍云 upx 是什么

upx是又拍云自家用go写的一个客户端的命令行管理工具,最大的优点个人感觉是方便shell进行脚本方便的操作。

#安装
ps:官方推荐源码编译,但是其实。。。有编译好的二进制文件,开包即用

1
2
$ wget -O /usr/local/bin/upx http://collection.b0.upaiyun.com/softwares/upx/upx-linux-i386-v0.1.3
chmod +x /usr/local/bin/upx

成功

1
2
upx -v
upx version v0.1.3 linux/amd64 go1.6

《你只是看起来很努力》

这是我第一篇读书笔记以博文的形式记录到自己的博客上,我不爱读书。只是在沪独居时想听听别人的道理或者故事


它刚到我手上的时候讲真的我不想继续往下阅读,因为中间送了一个小本本上面全是鸡汤文集,翻了它的前面几个小故事让我更加的确定了这一想法,心想:一个当兵的除了执行,能有多少的阅历和故事。他们口中的努力只怕只是操场上面流的那几滴汗水。

前段时间尚龙的一句话刷爆了我的朋友圈 在大城市里,搞废一个人的方式特别简单。给你一个安静狭小的空间,给你一根网线,最好再加一个外卖电话。好了,你开始废了,醍醐灌顶没错这就是我的现状!

本周末重拾此书有幸拜读,对它又有了新的认识。这本书很适合北漂一族,开篇讲梦想,中间写儿女情长,快结尾了吹吹自己的梦想和对读书的理解。全书满满的正能量,同时也慢慢的叙述了一个北漂青年的成功经历。巧了,同是北漂的孩子,为什么我有的时候感觉自己像一个孤儿。我也是异地恋为什么中间却有了这多苦辣酸甜。

不管怎么说,在这个阶段读了这本书,给了我不一样的感受。看见笔者的经历,读着笔者的故事,感受着笔者给我叙述的道理仿佛多年好友叙述着自己的过往。

沪漂,既是选择亦是青春的一份回忆,愿你我芳华不负。

laravel打印sql语句

引言

很多同学刚接触laravel不久对ORM操作有点不自信,无法判断自己写的ORM语句是否正确,这个时候需要将ORM的原生语句打印出来了,这里总结几种方法和大家学习探讨。也是自己做的一个小备份

ROM 调用 toSql

此方法仅支select

1
2
3
dd(self::where('id', 1)->toSql());
输出
"select * from `zjj_articles` where `id` = ?"

用DB自己带QueryLog记录

此方法仅支select

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  DB::connection()->enableQueryLog();
$db = self::all()
->load('joinTgas')
->where('joinTgas.tid', '=', '1');
dd(DB::getQueryLog());

输出

array:2 [
0 => array:3 [
"query" => "select * from `zjj_articles`"
"bindings" => []
"time" => 309.03
]
1 => array:3 [
"query" => "select * from `zjj_tags` where `zjj_tags`.`aid` in (?, ?, ?)"
"bindings" => array:3 [
0 => 6030
1 => 6031
2 => 6032
]
"time" => 59.44
]
]

DB监听事件

此方法支持 insert, update, delete, select基本所有语句

1
2
3
4
5
6
7
8
9
10
// 在需要打印SQL的语句前添加监听事件。
DB::listen(function ($query) {
$bindings = $query->bindings;
$sql = $query->sql;
foreach ($bindings as $replace) {
$value = is_numeric($replace) ? $replace : "'".$replace."'";
$sql = preg_replace('/\?/', $value, $sql, 1);
}
print_r($sql.PHP_EOL);
});

一个好用的工具 laravel-debugbar

github地址

github链接

安装

1
2
composer require barryvdh/laravel-debugbar --dev

APP_DEBUG=true

效果

好了看下最后的效果吧

网站架构情况

服务 平台 链接
服务器 JD云
CDN 又拍云
代码托管 阿里code
代码提交 git
代码发布 阿里rdc
环境 LNMP
PHP版本 7.1
框架 laravel 5.6
后台 laravel-admin
前端 mdbootstrap
Nginx日志分析 阿里日志服务
搜索 sphinx,coreseek

MAC phpstorm 安装 PHP_codesniffer 检查代码规范

介绍

PHP_CodeSniffer 是 PEAR 中的一个用检测PHP代码是否符合编码规范的扩展包. 它可以促进你写出符合编码规范的代码, 也可以实现代码审查中对编码规范审查自动检测工作. 总的来说, 就是个犀利的工具.


PHP_CodeSniffer

github地址

这里选择MAC的brew进行安装 codesniffer 的 github 上有很多种安装方式可以根据自己的实际情况选择

安装 PHP_CodeSniffer

运行:brew install php-code-sniffer
查看安装的版本和是否成功 :phpcs –version

PHPStorm中配置检查脚本

依次点开 Perferences/Languages&Frameworks/PHP/Code Sniffer

配置编辑器

选择 phpcs ,如果不清楚安装目录可以find查找下

PHPStorm中配置插件

1.依次点开 Perferences/Editor/Inspections/
2.查找 ‘php code sniffer validation’ 选择安装
3.选择需要检查的规范

完成

网站更新日志

2018年10月11日02:03:20

  • 【后台】mkdown 编辑器
  • 【后台】tree 管理
  • 【后台】类目选择
  • 【后台】编辑器图片上传又拍
  • mkdown 解析 HTML 存储

2018年10月13日01:15:09

  • 修改主页UI
  • 首页分类测试
  • 标签云
  • 分类

2018年10月16日00:40:55

  • 首页分类测试
  • 标签云
  • 分类页样式 tags

2018年10月17日00:41:40

  • DB文章时区修复
  • mkdwon 详情页语法样式修复
  • 分类页标签功能完善点击状态修改

2018年10月18日01:22:40

  • 换一个好看点的代码高亮显示
  • 按照psr2规范修改部分代码
  • service 和 model 分离

2018年10月18日23:21:25

  • 分类页点击筛选文章
  • 全站样式微调

2018年10月24日22:22:34

  • SEO TKD撰写
  • SEO 文章预览页添加蜘蛛页

2018年11月02日01:25:17

  • nginx 日志分析后台可视化图表

2018年11月04日03:26:41

  • SEO百度主动提交
  • SEO百度自动提交
  • SEO百度sitemap
  • SEO谷歌sitemap
  • SEO360 sitemap
  • SEO百度自动提交

2018年11月04日14:31:11

  • 添加百度统计代码
  • 添加棒子留言插件

2018年11月11日01:47:06

  • 谷歌广告

2018年12月01日12:28:48

  • 后台编辑文章保存到session_storage
  • 引入es官方索引包,索引全部文章
  • 修改列表页文章展示顺序

2018年12月02日17:48:08

  • session_storage h换为local_storage

2018年12月08日20:48:12

  • 日志内图片放大

2019年02月19日01:32

  • web 又拍云ssl https

2019年02月20日01:46:40

  • web push 通知信息保存
  • web push 推送消息dome
  • 后台https

2019年05月24日

  • 升级操作系统 centos7
  • sphinx,coreseek部署

2019年06月04日

  • 添加OG协议

2022年07月31日

  • 迁移hexo

整理优化点

  • 书评板块
  • 列表页右侧样式
  • 后台编辑定时保存到redis
  • ElasticSearch 分词器
  • ElasticSearch 高亮搜索
  • 搜索样式

请我喝杯咖啡吧~