米米的博客

做了一点微小的工作

「表情包」是一种利用图片来表示感情的方式。在各种社交软件的带动下,「表情包」已经形成了一种流行文化。互联网上,基本人人都会发表情;很多实时通讯软件中,「斗图」成为了一种活跃气氛的常见方式。不知你是否曾有过找不到表情包去应对别人的时候?
今天笔者分享用 Python 开发个人专属的表情包网站的方法,想用什么表情包搜一下就有了!
目标:获取海量表情包,存入数据库,然后搭建简单网站,通过输入关键字获取对应的的表情包。

创建数据库

首先,我们要从这个网站爬取表情包:斗图啦
我们先来分析一下这个网页的源代码:

检查元素

通过源码,我们可以发现需要获取的内容包括每个 <img> 标签的 data-originalalt 属性。通过爬虫获取网页,用正则表达式提取内容,然后存入数据库即可。
这里用到的数据库是 MySQL。如果还没有安装的话,不妨参考前面的文章 MySQL 8.0 的安装和使用

安装完成后,你可以用 root,也可以创建一个新用户,来新建数据库和数据表,用来存放表情包:

1
2
3
4
5
6
7
8
9
10
#建立数据库images
CREATE DATABASE images;
USE images;
#然后在该数据库中新建一个表,并添加相应的name和imageUrl
CREATE TABLE images (
id int(10) UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
name varchar(1000),
imageUrl varchar(200)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
QUIT;

至此数据库方面的工作就完成了。

安装依赖

依赖包是 requestsmysql-connector-pythonFlask。使用 pip 进行安装即可。

阅读全文 »

在前面的文章 NGINX 配置 SSL 中,提到了关于创建 Crontab 定时任务的内容。事实上,在使用 Linux 系统时(特别是在服务器上),经常会碰到需要在某个特定时间执行某些任务的情况。笔者近期研究了 Crontab 的机制,并对常见的 Crontab 用法做了一个总结,收集了一些关于计划任务的实例,现把相关内容分享出来,同时也给自己一个备忘。

Crontab 使用方式

1
2
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]

各参数为:

  • -u user:用来设定某个用户的 crontab 服务。
  • file:file 是命令文件的名字,表示将 file 做为 crontab 的任务列表文件并载入 crontab。如果在命令行中没有指定这个文件,crontab 将接受从标准输入(如键盘)中键入的命令,并将它们载入 crontab 任务列表。
  • -e:编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
  • -l:显示某个用户的 crontab 文件内容。如果不指定用户,则表示显示当前用户的 crontab 文件内容。
  • -r:从 /var/spool/cron 目录中删除某个用户的 crontab 文件。如果不指定用户,则默认删除当前用户的 crontab 文件。
  • -i:在删除用户的 crontab 文件时给确认提示。

Crontab 文件格式

用户所建立的 crontab 文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

1
2
minute hour day month week command
分  时  日  月  周  命令

具体来说,每一列的内容分别是:

  • 分钟,可以是从 0 到 59 之间的任何整数。
  • 小时,可以是从 0 到 23 之间的任何整数(0 表示 0 点)。
  • 日期,可以是从 1 到 31 之间的任何整数。
  • 月份,可以是从 1 到 12 之间的任何整数。
  • 星期几,可以是从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日。
  • 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

Crontab格式说明

在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*):代表所有可能的值,例如 month 字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如 1,2,5,7,8,9
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如 2-6 表示 2,3,4,5,6
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如 0-23/2 表示每两小时执行一次。

同时正斜线可以和星号一起使用,例如 */10,如果用在 minute 字段,表示每十分钟执行一次。又如,每分钟可以用 * 或者 */1 表示。

阅读全文 »

由于之前使用的 WordPress 博客在更新后出现未知错误(最后证实是主机商的问题),同时考虑到 WordPress 存在的一些弊端,例如:

  • 较为臃肿的 PHP 后端
  • 除了官方主题外,难以找到适合博客写作的主题,大多只适合做展示站
  • 在不安装插件的情况下,只能用自带的编辑器手写 HTML,而无法使用 Markdown 来编辑文章
  • 静态文件的管理也让人头痛,「媒体库」的设计初衷很好,但实际上严重影响效率

可见,用 WordPress 写文章,特别是长文,是一件非常麻烦的事情 —— 你很难专注于写作。虽然它也有不少优点:

  • 丰富的插件库,可以拓展大量的功能
  • 完善的评论系统,无需依赖第三方服务
  • 更新非常方便

这些特点是静态博客所不具有的,但最终喜欢折腾的笔者还是决定将所有内容导出,转而使用 Hexo 进行渲染,并部署到 GitHub Pages 上。借助于 hexo-migrator-wordpress,这一工作进行的非常顺利。当然,除了 Hexo,也有很多其他的解决方案可以考虑,常见的包括 Typecho 或 Hugo 等。
迁移后的新站点使用了 zhangshuqiao.org 的域名,目前已可以通过 https 正常访问。旧的 WordPress 博客仍会保留,但不再更新,未来可能更多的用于进行插件的测试。
ZSQ.IM 站点近期也实装了全新 LOGO(使用 Monodraw 制作):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
     ___           ___           ___       ___           ___           ___
/\ \ /\ \ /\__\ /\ \ |\__\ |\__\
/::\ \ /::\ \ /:/ / /::\ \ |:| | |:| |
/:/\:\ \ /:/\:\ \ /:/ / /:/\:\ \ |:| | |:| |
/:/ \:\ \ /::\~\:\ \ /:/ / /::\~\:\ \ |:|__|__ |:|__|__
/:/__/_\:\__\ /:/\:\ \:\__\ /:/__/ /:/\:\ \:\__\ ____/::::\__\ /::::\__\
\:\ /\ \/__/ \/__\:\/:/ / \:\ \ \/__\:\/:/ / \::::/~~/~ /:/~~/~
\:\ \:\__\ \::/ / \:\ \ \::/ / ~~|:|~~| /:/ /
\:\/:/ / /:/ / \:\ \ /:/ / |:| | \/__/
\::/ / /:/ / \:\__\ /:/ / |:| |
\/__/ \/__/ \/__/ \/__/ \|__|
___ ___
/\__\ ___ /\__\ ___
/::| | /\ \ /::| | /\ \
/:|:| | \:\ \ /:|:| | \:\ \
/:/|:|__|__ /::\__\ /:/|:|__|__ /::\__\
/:/ |::::\__\ __/:/\/__/ /:/ |::::\__\ __/:/\/__/
\/__/~~/:/ / /\/:/ / \/__/~~/:/ / /\/:/ /
/:/ / \::/__/ /:/ / \::/__/
/:/ / \:\__\ /:/ / \:\__\
/:/ / \/__/ /:/ / \/__/
\/__/ \/__/

同时笔者计划于下半年将原来 ZSQ.IM 站点的所有静态页面进行一次大型的改进,敬请期待。


本文更新于 2018 年 7 月 8 日:
由于在国内 GitHub Pages 加载速度不稳定,且由于 GitHub 政策不利于 SEO,笔者已将所有托管在 GitHub Pages 上的页面迁移至另一台独立服务器。
目前全站已支持 HTTPS 访问,并启用了 HSTS,未来时机成熟时将开启 HTTP/2 访问。

本文更新于 2020 年 7 月:
ZSQ.IM 站点更新了 LOGO(使用 Text ASCII Art Generator 制作):

1
2
3
4
5
6
7
8
9
10
11
12
13
 ██████╗  █████╗ ██╗      █████╗ ██╗  ██╗██╗   ██╗
██╔════╝ ██╔══██╗██║ ██╔══██╗╚██╗██╔╝╚██╗ ██╔╝
██║ ███╗███████║██║ ███████║ ╚███╔╝ ╚████╔╝
██║ ██║██╔══██║██║ ██╔══██║ ██╔██╗ ╚██╔╝
╚██████╔╝██║ ██║███████╗██║ ██║██╔╝ ██╗ ██║
╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝

███╗ ███╗██╗███╗ ███╗██╗
████╗ ████║██║████╗ ████║██║
██╔████╔██║██║██╔████╔██║██║
██║╚██╔╝██║██║██║╚██╔╝██║██║
██║ ╚═╝ ██║██║██║ ╚═╝ ██║██║
╚═╝ ╚═╝╚═╝╚═╝ ╚═╝╚═╝

安装 Certbot

Certbot 是用来申请 SSL 证书的。Certbot 的安装方式有几种,具体可以在 Certbot 官网上查询。
笔者尝试了通过 pip 进行安装,直接执行 pip install certbot 即可安装好 Certbot。

安装完成后,可以使用

1
sudo certbot -h

查看安装是否成功。如果报错,也可以尝试使用其它安装方式。
如果你使用了 Nginx 服务器,还可以执行

1
yum install certbot-nginx

安装 Certbot 的 Nginx 拓展。

配置 Certbot

执行

1
sudo certbot --nginx

即可自动完成配置。不过由于涉及到修改 nginx.conf,建议手动进行配置:

1
sudo certbot certonly --webroot -w /path/to/your/webroot -d example.com,www.example.com

/path/to/your/webroot 替换为 nginx 的根目录,example.com 替换为你的域名,多个域名用逗号隔开,不支持通配符。

如果一切顺利,会输出以下内容:

1
2
3
4
5
6
7
8
9
10
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert
will expire on 20XX-XX-XX. To obtain a new or tweaked version of
this certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

生成的证书将会存放在 /etc/letsencrypt/live/ 目录下。

阅读全文 »

Linux is fun! Huhhh. OK so you don't believe me. Mind me at the end of this article you will have to believe that Linux is actually a fun box.
Linux 是非常有趣的,别不相信 —— 看完这篇文章,你一定会发现 Linux 系统神奇的用法。
请注意,下面部分命令给出了两种包管理软件的安装方式,如果是 Debian 系的系统,请使用 apt,如果是 Red Hat 系的系统,请使用 yum。如果你使用了其他 Linux 发行版,或使用了其他包管理工具(例如 macOS 上的 brew),可能无法找到所有这些命令。
注:为了在代码块中区别输入输出,以 $ 开头的行代表输入,其它行代表输出。

curl

命令:curl
curl 用于互联网传输数据,支持多种协议。通过以下命令可以查看天气:

1
$ curl -4 http://wttr.in

sl (Steam Locomotive)

命令:sl(蒸汽机车的缩写)
You might be aware of command 'ls' the list command and use it frequently to view the contents of a folder but because of miss-typing sometimes you would result in 'sl', how about getting a little fun in terminal and not command not found.
你一定知道 ls 是用来显示文件夹内容的常见命令,但如果不小心打成 sl 呢?通过包管理工具安装它,你就能看见一辆跑过屏幕的火车,而不是「找不到命令」:

1
2
3
$ apt install sl #In Debian like OS, or aptitude based system
$ yum install sl #In Red Hat like OS, or yum based system
$ sl

This command works even when you type 'LS' and not 'ls'.

telnet

命令:telnet
No! No!! it is not as much complex as it seems. You would be familiar with telnet. Telnet is a text-oriented bidirectional network protocol over network. Here is nothing to be installed. What you should have is a Linux box and a working Internet.
不!它并不像看上去那样复杂。你会熟悉它的。Telnet 是一个基于文本的双向网络协议。你无需安装它,只需要一台能够联网的 linux 机器就行。
输入以下命令即可观看 ASCII 版星球大战:

1
$ telnet towel.blinkenlights.nl

而以下命令将会在你的命令行中生成一个 ASCII 世界地图:

1
$ telnet mapscii.me

是不是很有趣?

fortune

命令:fortune What about getting your random fortune, sometimes funny in
terminal.
在终端获取随机的人生经验,听上去不错吧?

1
2
3
4
5
6
7
8
$ apt install fortune
$ yum install fortune
$ fortune

You're not my type. For that matter, you're not even my species!!!
Future looks spotty. You will spill soup in late evening.
You worry too much about your job. Stop it. You are not paid enough to worry.
Your love life will be... interesting.
阅读全文 »
0%