0%

以下操作中的快捷键在Windows下有效,macOS可能需要用Command代替Ctrl
原始素材尽量选择人物,最好不要全身。

博主以下面这张梅西庆祝的照片为例。

调整对比度

打开素材,Ctrl+j复制图层;选定新图层,Ctrl+m打开曲线,调大对比度。

阅读全文 »

如果要在网页上显示一些随机的语句,获得一些人生的经验,你会选择什么?
也许,一言是一个很好的选择,它可以提供一些动漫中的台词,或是网络上的各种小段子。
在前面的文章有趣的Linux命令行工具中提到的fortune命令或许也可以满足需求,pure-ftpd就可以设置在连接成功时显示随机的来自fortune的语句。
那除此之外呢?历史上的今天是一个不错的方案。当你访问一些门户网站的首页,有时会看到这样的栏目。它也是一些百科全书网站,比如维基百科的传统。事实上,在Mac上就自带了一个小型的「历史上的今天」数据库,执行:

1
cat /usr/share/calendar/calendar.history

就可以看到。
这篇文章将介绍如何搭建一个提供「历史上的今天」信息的API。

建立数据库

首先,建立MySQL数据库,用于存储爬取的信息。

1
2
3
4
5
6
7
8
9
10
11
CREATE DATABASE dbname;
#建立数据库,dbname保持一致即可
USE dbname;
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 varchar(300) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
QUIT;

获取数据

数据来源是维基百科,使用Python爬取数据,并存入数据库中。代码中的usernamepassworddbname分别是你的登录用户名、密码和数据库名。数据表名默认是event,也可以自行修改。

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
#!/usr/bin/env python3

username = "username"
password = "password"
dbname = "dbname"

import requests
from bs4 import BeautifulSoup
import re
import datetime
import pymysql

conn = pymysql.connect(host = "127.0.0.1", user = username, password = password, db = dbname, charset = "utf8")
print(conn)
cur = conn.cursor()
cur.execute("SET NAMES utf8mb4")

def savedb(data):
print(data)
try:
cur.execute("insert into event values(null,%s,%s,%s,%s)", data)
except pymysql.err.InternalError:
print("\033[31mERROR: Incorrect string value.\033[0m", data)
with open("failed.txt", "a") as myfile:
myfile.write(str(data) + "\n")
except pymysql.err.DataError:
print("\033[31mERROR: Data too long.\033[0m", data)
with open("failed.txt", "a") as myfile:
myfile.write(str(data) + "\n")

def getDateList():
list = []
date = datetime.date(2016, 1, 1)
for i in range(366):
date_str = str(date.month) + "月" + str(date.day) + "日"
list.append(date_str)
date += datetime.timedelta(days = 1)
return list

def getInfo(html, type, date):
typeList = ["大事记", "出生", "逝世"]
flag = re.compile("(<h2><span id=.*<span class=\"mw-headline\" id=.*?" + typeList[type] + "[\s\S]*?</ul>\s*?)<h2>").search(html)
if flag:
bsObj = BeautifulSoup(flag.group(1), "html.parser").findAll("li")
for li in bsObj:
match = re.compile("((^前|^)\d{1,4}年):([\s\S]*$)").match(li.get_text())
if match:
year = match.group(1)
info = re.sub("\[\d{1,}\]", "", match.group(3).strip())
data = (type, year, date, info)
savedb(data)

list = getDateList()
for date in list:
print(date)
url = "https://zh.wikipedia.org/zh-cn/%s" % date
r = requests.get(url)
getInfo(r.text, 0, date) # 大事记
getInfo(r.text, 1, date) # 出生
getInfo(r.text, 2, date) # 逝世

cur.connection.commit()
cur.close()
conn.close()

这里的两个except分别处理的是特殊字符(非UTF-8范围)和内容长度超出的问题。

查询数据

比较简单的方式是按照json格式进行输出,这里给出一种使用Python的方案。

阅读全文 »

本文将介绍一种在macOS上读写NTFS磁盘的方法,通过它可以方便的在不同系统中传输文件。默认情况下,macOS是无法向NTFS磁盘写入的——这个功能由于种种原因被禁用了。我们使用一种Hack的方法将其启用即可。
macOS在挂载NTFS磁盘时加载的脚本为/sbin/mount_ntfs,参数为:

1
mount_ntfs -o nodev -o noowners -o nosuid /dev/disk2s1 /Volumes/DATA

这时,只要加上额外的参数,就可以启用对NTFS磁盘的写入。具体方法是:

1
2
3
4
sudo -s #输入密码,获取root权限
cd /sbin
mv mount_ntfs mount_ntfs_orig
vim mount_ntfs

mount_ntfs重命名为mount_ntfs_orig,然后再新建一个mount_ntfs,输入以下内容:

1
2
#!/bin/sh
/sbin/mount_ntfs_orig -o rw,nobrowse "$@"

这样就可以欺骗系统,运行带有额外参数的指令。这里的nobrowse是为了避免挂载上来的还是只读模式,但是它同时会导致磁盘不可见,也就是挂在后不会在桌面和Finder中显示,需要手动到/Volumes下打开。如果这样不爽的话,你可以尝试

1
2
#!/bin/sh
/sbin/mount_ntfs_orig -o rw "$@"

将磁盘推出再挂载,如果一切正常的话,就可以愉快的使用了。


参考文章:OS X 原生可读写挂载NTFS分区

准备工作

下面列出了博主测试成功的环境,使用其它的版本可能出现不可预料的情况。

硬件

  • 图形卡
    根据Tensorflow官网上对于GPU 支持的描述,需要CUDA® 计算能力为 3.5 或更高的 NVIDIA® GPU卡。大部分主流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下载。下载时选择10.0版本即可,因为最新的版本可能不被tensorflow所支持。历史版本可以在这里查看:CUDA Toolkit Archive

  • cuDNN
    cuDNN的全称为NVIDIA CUDA® Deep Neural Network library,是NVIDIA专门针对深度神经网络(Deep Neural Networks)中的基础操作而设计基于GPU的加速库。这也是一个重要依赖,需要准备好。其主页是NVIDIA cuDNN,下载需要注册账号,不过也可以选择微信快捷登陆。同样需要注意的是,要正确选择与CUDA对应的cuDNN版本。本文发布时,与CUDA 10.0兼容的最新版本cuDNN为v7.6.0。

  • Python
    博主使用的是Python 3.7.0。安装好之后确保能够通过PowerShell执行pythonpip即可。

  • tensorflow-gpu
    安装tensorflow-gpu的方法也有很多,例如Anaconda或者pip。如果不想折腾环境,直接从这里找一个wheel就行了:tensorflow-gpu · PyPI。需要根据自己的系统和Python版本选择,例如tensorflow_gpu-1.13.1-cp37-cp37m-win_amd64.whl

安装

安装CUDA

安装过程并不复杂。运行从NVIDIA官网上下载的CUDA安装程序,将其安装在默认目录下即可。如果一切正常,相关组件会出现在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0目录下。

安装cuDNN

解压cuDNN的安装包,会得到一个文件夹,将其打开后,可以看到名为binincludelib的子目录。而在前面所说的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
4
import tensorflow as tf
hello = tf.constant("Hello, TensorFlow!")
sess = tf.Session()
print(sess.run(hello))

不报错的话,就安装成功了。

在WordPress中,文章、用户的ID都是通过AUTO_INCREMENT分配的,如果要改变其值,可以在wp_usermetawp_users数据表中执行:

1
2
3
ALTER TABLE `wp_usermeta`
MODIFY `umeta_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=177;
COMMIT;

以及

1
2
3
ALTER TABLE `wp_users`
MODIFY `ID` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
COMMIT;

AUTO_INCREMENT根据你自己的情况,修改为当前的行数即可。

对于存储评论信息的wp_comments也是类似的。