历史上的今天
如果要在网页上显示一些随机的语句,获得一些人生的经验,你会选择什么?
也许,一言是一个很好的选择,它可以提供一些动漫中的台词,或是网络上的各种小段子。
在前面的文章有趣的 Linux 命令行工具中提到的 fortune
命令或许也可以满足需求,pure-ftpd
就可以设置在连接成功时显示随机的来自 fortune
的语句。
那除此之外呢?历史上的今天是一个不错的方案。当你访问一些门户网站的首页,有时会看到这样的栏目。它也是一些百科全书网站,比如维基百科的传统。事实上,在 Mac 上就自带了一个小型的「历史上的今天」数据库,执行:1
cat /usr/share/calendar/calendar.history
就可以看到。
这篇文章将介绍如何搭建一个提供「历史上的今天」信息的 API。
建立数据库
首先,建立 MySQL 数据库和数据表,用于存储爬取的信息。这里数据库和数据表名都以 event
为例。1
2
3
4
5
6
7
8
9
10CREATE DATABASE event;
USE event;
CREATE TABLE event (
id int(10) UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
type int(1) DEFAULT NULL,
year varchar(6) DEFAULT NULL,
date varchar(6) DEFAULT NULL,
info text DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
QUIT;
获取数据
数据来源是维基百科,使用 Python 爬取数据,并存入数据库中。项目地址:TodayInHistory-Crawler,可以打包下载所有文件。
下载程序源码后,进入目录并安装依赖:1
pip3 install -r requirements.txt
config.py
中的 username
、password
、dbname
和 tablename
分别是你的登录用户名、密码、数据库名和数据表名。将它们修改成和之前创建的数据库和数据表名一致。
然后,运行 spider.py
,程序将会开始爬取数据。程序会用 try except
处理特殊字符(非 UTF-8 范围)的问题,并将失败的项目记录在 failed.txt
中。
查询数据
比较简单的方式是按照 json 格式进行输出,server.py
给出了一种使用 Python 的方案,运行后就可以访问 Flask 创建的服务器了。
在 macOS 上读写 NTFS 磁盘
本文将介绍一种在 macOS 上读写 NTFS 磁盘的方法,通过它可以方便的在不同系统中传输文件。默认情况下,macOS 是无法向 NTFS 磁盘写入的 —— 这个功能由于种种原因被禁用了。我们使用一种 Hack 的方法将其启用即可。
首先,打开磁盘工具,查看 NTFS 磁盘的设备路径。例如,disk3s1
就对应了 /dev/disk3s1
。也可以通过执行1
diskutil list
来查看 NTFS 磁盘的分区名,也就是 IDENTIFIER
这一列中对应的名字,例如 /dev/disk3s1
。
如果 macOS 已经通过只读模式挂载了 NTFS 磁盘,还需要先卸载它。在磁盘工具中选中硬盘并将其卸载即可。
随后,根据所使用的不同系统版本,可以使用不同的工具重新挂载 NTFS 磁盘。
macOS Monterey 及更早版本
在 Monterey 和更早的 macOS 上,可以利用系统自带的 mount_ntfs
工具来挂载 NTFS 磁盘。具体方法是,执行以下命令1
2sudo mkdir /Volumes/disk3s1
sudo mount -t ntfs -o rw,auto,nobrowse /dev/disk3s1 /Volumes/disk3s1
将 /dev/disk3s1
根据实际情况替换。这里的 nobrowse
是为了避免挂载上来的还是只读模式,但是它同时会导致磁盘不可见,也就是挂载后不会在桌面和 Finder 中显示,需要手动到 /Volumes
下打开。
如果一切正常的话,就可以愉快的使用了。
macOS Ventura 及之后的版本
在 Ventura 及之后的 macOS 上,mount_ntfs
被移除了,我们需要使用第三方工具才能够实现对 NTFS 磁盘的读写。一个免费的方案是 ntfs-3g,我们可以通过 Homebrew 安装它,然后手动挂载 NTFS 磁盘。具体方法是1
2
3brew tap gromgit/homebrew-fuse
brew install --cask macfuse
brew install ntfs-3g-mac
然后执行以下命令1
2sudo mkdir /Volumes/disk3s1
sudo ntfs-3g /dev/disk3s1 /Volumes/disk3s1 -olocal -oallow_other -o auto-xattr
这里的设备名同样需要根据实际情况替换。
需要注意,ntfs-3g 第一次启动时需要安装内核拓展,需要在系统偏好设置中允许安装,并重启系统。之后就可以正常使用了。
参考文章:How to Write NTFS Drives on macOS Monterey
本文更新于 2021 年 9 月 14 日:
原先介绍的方法需要修改 /sbin/mount_ntfs
,不太优美。笔者找到了一个修改 /etc/fstab
的方法,可以在 macOS Big Sur 上使用。
本文更新于 2022 年 2 月 26 日:
修改 /etc/fstab
的方法在 macOS Monterey 上又不好使了,改为手动 mount
。
本文更新于 2024 年 1 月 18 日:
macOS Ventura 移除了 mount_ntfs
,改为使用 ntfs-3g。
Windows 安装 tensorflow-gpu
准备工作
下面列出了笔者测试成功的环境,使用其它的版本可能出现不可预料的情况。
硬件
显卡
根据 Tensorflow 官网上对于 GPU 支持的描述,需要 CUDA® 计算能力为 3.5 或更高的 NVIDIA® GPU 卡。GeForce 900 系列及更新的 N 卡都能满足这一点,如果不确定的话,可以在官网上查看:CUDA GPUs。笔者使用了一块 NVIDIA GeForce RTX 2070 进行测试。其它
其它硬件达到主流配置即可。
软件
Windows 系统
由于 macOS Mojave 的 N 卡驱动迟迟没有更新(据说是苹果已经抛弃了 N 卡,未来很有可能不会再更新驱动);并且 Tensorflow 官方已经不再推出适配 macOS 的tensorflow-gpu
了,需要自己编译;因而使用 Windows 或者 Linux 系统会是更好的选择。笔者使用的是 Windows 10。显卡驱动程序
在连接到网络时,Windows 10 会自动下载安装显卡驱动,但可能不是最新版本。建议通过 GeForce Experience 管理驱动程序。CUDA
tensorflow-gpu
依赖于 CUDA,需要到 NVIDIA 官网上的 CUDA Zone 下载。Tensorflow 官网中会给出支持的 CUDA 版本号,下载时选择对应的版本即可(例如 v10.0),因为最新的版本可能不被 tensorflow 所支持。历史版本可以在这里查看:CUDA Toolkit Archive。cuDNN
cuDNN 的全称为 NVIDIA CUDA® Deep Neural Network library,是 NVIDIA 专门针对深度神经网络(Deep Neural Networks)中的基础操作而设计基于 GPU 的加速库。这也是一个重要依赖,需要准备好。其主页是 NVIDIA cuDNN,下载需要注册账号,不过也可以选择微信快捷登陆。同样需要注意的是,要正确选择与 CUDA 对应的 cuDNN 版本。Python
笔者使用的是 Python 3.7.0。建议从 Python 官网下载安装包,安装时记得勾选将 Python 添加到环境变量中,确保能够通过 PowerShell 执行python
和pip
即可。Microsoft Store 中也有 Python,但是安装路径太长,可能在使用pip
时遇到问题。tensorflow-gpu
安装tensorflow-gpu
的方法也有很多,例如 Anaconda 或者 pip。如果不想折腾环境,直接从这里找一个 wheel 就行了:tensorflow-gpu · PyPI。需要根据自己的系统和 Python 版本选择,例如tensorflow_gpu-1.13.1-cp37-cp37m-win_amd64.whl
。
安装
安装 CUDA
安装过程并不复杂。运行从 NVIDIA 官网上下载的 CUDA 安装程序,将其安装在默认目录下即可。以 10.0 版本为例,安装成功后,相关组件会出现在 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
目录下。
安装 cuDNN
解压 cuDNN 的安装包,会得到一个文件夹,将其打开后,可以看到名为 bin
,include
和 lib
的子目录。而在前面所说的 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0
目录下也有这样几个子目录。因此,直接将 cuDNN 的相关文件复制合并进对应的目录即可。
安装 tensorflow-gpu
以 PowerShell 为例,将 CUDA 相关组件添加至环境变量:1
$Env:path=$Env:Path+";C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64;"
完成后,cd 进入下载的 whl 文件所在目录,使用 pip 安装即可1
pip install tensorflow_gpu-1.13.1-cp37-cp37m-win_amd64.whl
pip
会自动下载所需的依赖。
运行
如果一切顺利,打开 Python,执行1
2
3
4import tensorflow as tf
hello = tf.constant("Hello, TensorFlow!")
sess = tf.Session()
print(sess.run(hello))
不报错的话,就安装成功了。
本文更新于 2020 年 12 月 8 日:
Tensorflow 2.0 的安装方式更加简单。在安装好支持的 CUDA(现为 v10.1)和 cuDNN 后,可以直接执行1
pip install tensorflow
测试的方法是1
2
3import tensorflow as tf
tf.test.is_built_with_cuda()
tf.config.list_physical_devices("GPU")
如果提示动态库加载失败,可以重启计算机或手动设置环境变量。
MySQL 重置 AUTO_INCREMENT
在 WordPress 中,文章、用户的 ID 都是通过 AUTO_INCREMENT
分配的,如果要改变其值,可以在 wp_usermeta
和 wp_users
数据表中执行:1
2
3ALTER TABLE `wp_usermeta`
MODIFY `umeta_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=177;
COMMIT;
以及1
2
3ALTER TABLE `wp_users`
MODIFY `ID` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
COMMIT;
将 AUTO_INCREMENT
根据你自己的情况,修改为当前的行数即可。
对于存储评论信息的 wp_comments
也是类似的。