安装keras

keras与Tensorflow

keras是一个用于快速构建模型的API库,但是他不处理实际的计算,所以它需要一个更底层的“服务”,这个服务负责把keras构的模型具体的实现。常用的有 TensorFlow, CNTK 或者 Theano作为它的后端服务,但是从Tensorflow2开始,Tensorflow中集成了Keras。目前Keras也是推荐使用Tensorflow作为它的后端。

安装keras

在anaconda的体系下,安装keras,实际上,只需要安装了Tensorflow就自然的装上了。如何安装Tensorflow可以看前面的博文。当然,这是安装CPU版的,GPU版的与CPU的类似,只是多了CUDA的安装部分。

测试

在jupyter notebook中写入下面的代码

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
import keras
from keras import models
from keras import layers
from keras.datasets import imdb
import numpy as np

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

def vectorize_sequences(sequences, dimension=10000):
# Create an all-zero matrix of shape (len(sequences), dimension)
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1. # set specific indices of results[i] to 1s
return results

# Our vectorized training data
x_train = vectorize_sequences(train_data)
# Our vectorized test data
x_test = vectorize_sequences(test_data)
# Our vectorized labels
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc'])

model.fit(x_train, y_train, epochs=4, batch_size=512)
result = model.evaluate(x_test, y_test)
print(result)

运行,如果过程中不报错,就表示都安好了。

安装tensorflow

安装前操作

anaconda的源可能下载比较慢,所以国内使用清华的源,速度会稳定些。

打开anaconda prompt,粘贴下面的命令,实现换源

1
2
3
4
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/

新建虚拟环境

tensorflow 支持的python版本,需要到官网上查看,https://tensorflow.google.cn/install?hl=zh-cn 。当前的是tensorflow2, 支持的python版本是3.6-3.9。所以创建虚拟环境时,需要指定python版本在这个范围里。这里使用新的3.9。

打开anaconda prompt,粘贴下面的命令
conda create -n tensorflow python=3.9

回车后,它会解析要安装的文件,根据网络和电脑性能,需要等一会,然后确认是否安装,输入 y 或直接回车,然后它就下载,安装环境。

安装tensorflow

先激活tensorflow的环境
conda activate tensorflow

这时命令行变成(tensorflow) C:\**\**\表示切换环境成功。

安装cpu版的tensorflow,输入命令conda install tensorflow,还是要等待一会,查找要安哪些包,输入y,然后它开始下载安装。

也有的教程里写用pip安装,pip安装的话,与conda安装有时会冲突,为了避免这种问题,优先使用conda安装。conda安不上的,再用pip试试。

测试

安完以后,在anaconda prompt里输入python,进入python环境,然后输入import tensorflow as tf,如果过程中不报错,大概率是安装成功了。

还可以继续输入tf.__version__)回车后,应该会回显tensorflow的版本号。此时安装tensorflow成功。

安装anaconda3

下载anaconda

打开网址https://www.anaconda.com/download/sucess 直接打开官网的话,它会让你注册,但下面有小字,skip,就不用注册了。

打开网页以后,根据操作系统,选择对应的版本,点下载,等着下载完成就可以了。

Anaconda的版本是不断的更新的,就像python的版本不断的更新一样。官网上下载的总是最新的。不用担心python的历史版本问题。因为它本身就是为了管理不同的python版本存在的。

安装anaconda

下载完成后,双击运行,依次点击 “next”,“I Agree”,这时会出现一个选择,是只给自己安装,还是所有用户都可以用。推荐的是只有当前用户可以用。主要的不同在于安装位置和一些包的文件存放位置不同。对于一般的用户来说,选“Just me”, 再点“next”。这时又会跳出一个安装路径的选择界面,这里我也建议不要更改,保留原始的状态。点“Next”,然后会出现一个选择界面,把Recommended的选项都勾上,NOT recommended的选项不要勾。点“Install”。

安装过程进行到Setting up the package cache时会很慢,如果有杀毒软件,会更慢,另外安装过程可能会下载一些包,所以安装过程需要保持联网。稍等,进度条跑完就安装完成了。如果一直卡住不动,可以试下重启安装程序。重启安装程序时,它会提示安装位置非空,让你换一个安装位置,可以去删了那个文件夹。

安完以后,默认安装程序会打开Navigator,这个打开很慢,等着就好了。

使用anaconda

点开始菜单,从所有程序列表里,找到Anaconda的文件夹,里面有一些安装完成的程序。

包括:Anaconda Navigator,Anaconda Powershell Prompt,Anaconda Prompt,Jupyter Notebook,Reset Spyder Settings,Spyder。

Anaconda Navigator是anaconda的管理软件,可以通过鼠标点点来完成管理和配置,包括虚拟环境的管理,包管理,界面的操作全部可以用命令行来实现,它还启动慢,适合不太习惯命令行的人使用。

Anaconda Powershell Prompt是基于Powershell的命令行工具,启动它时,自动加载了conda所需要的一些命令。

Anaconda Prompt是基于CMD的命令行工具。

Jupyter Notebook是一个交互式开发的IDE工具,适合探索式的写一些程序。也可以记录一些心得。

Spyder是一个类似MATLAB的IDE,可以比较方便的调试。

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
conda --version #查看conda版本
conda config --show #查看conda的环境配置
#设置清华镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
#设置bioconda
conda config --add channels bioconda
conda config --add channels conda-forge
#设置搜索时显示通道地址
conda config --set show_channel_urls yes
conda update conda #将conda自身更新到最新版本
conda update Anaconda #将整个Anaconda都更新到确保稳定性和兼容性的最新版本
conda create --help #查询create命令的帮助
#创建python版本为3.8、名字为env_name的虚拟环境
conda create -n env_name python=3.8
#查看有哪些虚拟环境
conda env list
conda info -e
conda info --envs
conda activate env_name #激活虚拟环境
#退出当前工作的虚拟环境
conda activate
conda deactivate
#将指定虚拟环境及其中所安装的包都删除
conda remove --name env_name --all
#只删除虚拟环境中的某个或者某些包则是
conda remove --name env_name package_name

#获得环境中的所有配置
conda env export --name myenv > myenv.yml
#重新还原环境
conda env create -f myenv.yml

conda list #查询看当前环境中安装了哪些包

#查询是否有安装某个包
conda list pkgname
conda list pkgname*

conda install package_name #安装一个包
conda update numpy #更新到它的最新版本

conda uninstall package_name #卸载包
conda clean -p # 删除没有用的包 --packages
conda clean -t # 删除tar打包 --tarballs
conda clean -y -all # 删除所有的安装包及cache(索引缓存、锁定文件、未使用过的包和tar包)

conda install 与pip install

只有在conda install搞不定时才使用pip intall。

使用nginx发布静态文件

起因

家中有个宽带有公网ip,动态的,为什么有公网ip还要买虚拟服务器呢?因为先买了个域名,大陆的ip地址绑到域名上无法正常解析。二级的免费域名呢,总是会招来一些攻击,导致宽带基本用不了。所以就取消了域名与ip绑定,但是这样一来,通过那个ip来访问的服务就不能用了。为什么不直接用虚拟服务器呢?带宽不如宽带的高,宽带的上行50,下行500,虚拟服务器上行10,下行100。

因为没有绑域名,导致很难记ip地址,导致跑在那上面的服务不好用。所以自己想着自己管理一个域名解析,又不想去搭dns,防止查水表,就只想写一个host文件来实现对宽带ip的域名绑定。

步骤

可以分为六步;

  1. 获取公网ip
  2. 生成host文件
  3. 更新到虚拟服务器
  4. 其他客户端从服务器下载host文件
  5. 将host文件应用到客户端
  6. 通过域名访问宽带服务

发布host文件到服务器

要想让客户端可以下载到这个host文件,需要在服务器上发布这个文件。由于服务器上已经跑了一个nginx,索性就用这个nginx来发布。

这里使用了智谱清言来帮我生成代码。我问他:

我有一个名为host的文件,这个文件在/var/www/html路径下,我想用nginx发布这个文件,让我通过domain.com/host获取文件内容

可以看到文字在快速的生成,生成了一堆代码和说明,比较有用的是这两行

1
2
alias /var/www/html/host;  # 指向你的 host 文件
try_files $uri$uri/ =404;

我开心的照着写了下,发现直接报404的错误,试着改了改文件权限,还是报错,后面在$uri$uri中间加了个空格,变成$uri $uri,再重载nginx,刷新页面,好了!

客户端使用host文件

对于windows系统,可以使用switchhost软件,linux桌面版也可以用,server不清楚。安卓系统可以用一个叫vitual host的APP,可以应用一个远程的host文件,然后通过域名访问服务。

为网站申请ssl以使用https

申请ssl的好处

安全,ssl是一种加密传输方式,有了它,密码传的过程,网页数据传的过程都是加密的,不易被破解。打开站点可以用https,而不是http,显的高级一些。

申请过程记录

先在网上查了一圈,免费申请的方法有一些,比如知乎上的这个文章,但是下面的评论有人说一些不好用,不能用了,也有人说有一个挺好的,比如acme,搜了一下,github上有项目,而且几个月前还在更新,算是比较新了,有中文的README,看了一下挺简单的,就照着做了一下。

下载acme.sh

1
2
bash
curl https://get.acme.sh | sh -s email=my@example.com

这里我输入了我用的一个邮箱,很快就安上了脚本

生成证书

acme.sh 实现了 acme 协议支持的所有验证协议.
一般有两种方式验证: http 和 dns 验证。 我用的是http认证。

http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.

1
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/

只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.

更高级的用法请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert

copy/安装 证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.

注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.

正确的使用方法是使用 --install-cert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置,

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"

(一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload)

Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/<domain>.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

--install-cert命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.

这里补充一下,我在做这里的时候不知道/path/to/keyfile/in/nginx/key.pem是应该写哪里,后面看到/etc/nginx/ssl/fullchain.cer,我就在nginx目录下创建了ssl文件夹,然后替换了/path/to/keyfile/in/nginx//etc/nginx/ssl/,其他保持不变,后面测试成功了。

详细参数请参考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc

值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.

查看已安装证书信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
acme.sh --info -d example.com
# 会输出如下内容:
DOMAIN_CONF=/root/.acme.sh/example.com/example.com.conf
Le_Domain=example.com
Le_Alt=no
Le_Webroot=dns_ali
Le_PreHook=
Le_PostHook=
Le_RenewHook=
Le_API=https://acme-v02.api.letsencrypt.org/directory
Le_Keylength=
Le_OrderFinalize=https://acme-v02.api.letsencrypt.org/acme/finalize/23xxxx150/781xxxx4310
Le_LinkOrder=https://acme-v02.api.letsencrypt.org/acme/order/233xxx150/781xxxx4310
Le_LinkCert=https://acme-v02.api.letsencrypt.org/acme/cert/04cbd28xxxxxx349ecaea8d07
Le_CertCreateTime=1649358725
Le_CertCreateTimeStr=Thu Apr 7 19:12:05 UTC 2022
Le_NextRenewTimeStr=Mon Jun 6 19:12:05 UTC 2022
Le_NextRenewTime=1654456325
Le_RealCertPath=
Le_RealCACertPath=
Le_RealKeyPath=/etc/acme/example.com/privkey.pem
Le_ReloadCmd=service nginx force-reload
Le_RealFullChainPath=/etc/acme/example.com/chain.pem

更新证书

目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.

请确保 cronjob 正确安装, 看起来是类似这样的:

1
2
3
crontab  -l

56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

最后, 本文并非完全的使用说明, 还有很多高级的功能, 更高级的用法请参看其他 wiki 页面.

https://github.com/Neilpang/acme.sh/wiki

hexo的安装与部署到虚拟服务器

引子

网上有很多关于怎么把hexo部署到github上的教程,部署到虚拟服务器的也有一些。我是在腾讯的开发者社区看到了一个文章,照着他写的做的。在这里也记录一下。

hexo是一个基于markdown的个人博客工具,因为我觉得markdown挺好的,以前学过一点。以前也用过wordpress,觉得那东西做的是挺好看的,但是会花费不少的精力在找排版上面。而markdown就没有这个问题,主打一个记录,让记录回归记录的本质。所以选了hexo。当然可能有更优秀的工具,但我是新手,并不是很熟悉,有能用的就先用着。

安装前准备

  1. 虚拟服务器
  2. 安装必要的库
  3. 本地安装node和git
  4. 安装hexo包

以上是将hexo部署到虚拟服务器上的一些必备的东西。如果是github上,不需要虚拟服务器,但需要github的账号。

虚拟服务器

虚拟服务器的准备,如果要长期用,就要花钱了,短期是不用的,有一些体验的账号可以用,但是体验一般是一个月或三个月,很少有体验很久的。

要买服务器的话,其实有很多选择。国内的有腾讯云,阿里云,华为云,京东云等等,虽有一些差异,但总体来说,都那个样。不会的都不会。会的,都一样。我试用了一个月的腾讯云服务器,发现要想正常的访问,备案是必要的,因为试用的是国内的服务器,并没有香港的可以试用。

然后也我了解了一下备案的流程,服务器要租够满2个月还是3个月才能备案,备案还要有域名,备案前不需要建站,但需要明确建站的用途、域名、服务器。看了下个人备案的所需材料,还是挺麻烦的,我就放弃了。但是这时,我已经买了一个域名,不想浪费了,就又在别的地方买了一个香港的服务器。也不知道能用多久,先买了一年的。如果一年后觉得还可以,再续吧。

个人博客的话,流量不大,虚拟服务器的性能不用很好,带宽也是,2M其实就够用。内存也不用很大,这时一般选Linux系统,因为Windows server内存占用还是很大的。我因为以前用ubuntu用的我,所以选了ubuntu的系统。

安装必要的库

虚拟服务器(以后简称服务器)一般会给配上操作系统,但是软件包会比较少。在ubuntu里要做以下几个操作:(下面步骤比腾讯那里给的少了一些,可以结合我的说明去看原文)

  1. 创建git仓库
  2. 配置nginx
  3. 创建git钩子

创建git仓库

这里需要先安openssh,因为买的服务器一般都自带了这个组件,所以这步可以跳过。

创建一个博客用户,这是为了做隔离,防止黑客通过博客拿到系统权限。我不害怕这点,因为站小,也没啥东西,要是有技术能拿下博客,还能注入指令,那以我的技术根本防不住,所以就不给自己添麻烦了。所以我也跳过了这步,直接在root下面开干。

安装git,这是必需的,在终端中输入sudo apt install git-core,因为我是直接在root里干的,所以可以省掉sudo。

创建hexo_static裸仓库。这个是必需的。

1
2
3
4
5
6
sudo mkdir /var/repo/
sudo chown -R $USER:$USER /var/repo/
sudo chmod -R 755 /var/repo/

cd /var/repo/
git init --bare hexo_static.git

同样,sudo在root账户下可省略。执行完以后,目录里会出现下面的这些文件。

仓库内容

配置nginx

nginx可以管理多个站点,如果只想用一个hexo可以改端口,或在服务器上做端口映射。

安装ngixn,apt install nginx

创建/var/www/hexo目录,用于Nginx托管,修改目录所有权和权限。

1
2
3
sudo mkdir -p /var/www/hexo
sudo chown -R $USER:$USER /var/www/hexo
sudo chmod -R 755 /var/www/hexo

使用vim修改/etc/nginx/sites-enabled/default,使root指向hexo目录
nano /etc/nginx/sites-enabled/default

找到server部分,修改如下内容
root /var/www/hexo;

重启Nginx服务,使得改动生效
service nginx restart

创建Git钩子

在之前创建的hexo_static裸仓库下有一个hooks文件夹,在其中创建一个名为post-receive的钩子文件:
nano /var/repo/hexo_static.git/hooks/post-receive

在其中写入如下内容:

1
2
#!/bin/bash
git --work-tree=/var/www/hexo --git-dir=/var/repo/hexo_static.git checkout -f

保存后退出

让该文件变为可执行文件
chmod +x /var/repo/hexo_static.git/hooks/post-receive

本地安装git和node

git安装

git下载的时候有2个选项,安装版一免安装版。git for windows 下载
免安装版解压后是一个文件夹,里面有git-cmd.exe,可以直接运行。我个人喜欢这种免安的版本。

node.js安装

node.js下载链接
下载后一路下一步就可以了。

安装hexo包

在安完node以后,在git-cmd.exe里执行node -v,能看到回显的版本号,软件基础就都有了。
还是在git-cmd.exe里执行npm install -g hexo-cli,等待安装完成就行了。

安装成功后,可以通过
hexo -version
查看hexo的版本。

初始化hexo

先创建一个存博客文件的文件夹,比如C:\blog,在git-cmd.exe里cd C:\blog,执行命令hexo init

稍等一会儿,在blog目录里可以看到一堆文件。

这里如果再执行hexo s,在浏览器中输入 http://localhost:4000 就可以看到网站。

部署到服务器

安装部署工具

执行npm install hexo-deployer-git --save安装部署用的工具。

修改_config.yml

用vscode打开blog目录,在里面找到_config.yml这个文件,修改deploy参数

1
2
3
4
deploy:
type: git
repo: root@server_ip:/var/repo/hexo_static.git
branch: master

这里,看了几个介绍,都没有细说这块怎么写。通过查一些资料,发现了原理。
root@server_ip的root,就是用户名,前面创建的git钩子的所有者的用户名,
server_ip就是服务器的ip地址,域名也可以。这里默认是22端口的,如果是非22端口,
可以在本地计算机的.ssh目录里创建一个config文件,文件里写上下面的内容

1
2
3
4
5
Host hostname
User user
Port port
Hostname hostname
IdentityFile id_rsa

配了上面这些,就可以省略端口,就用上面的repo的写法,如果不配这个,resp那里就需要带上端口。
这些可以从ssh免密登陆查到相关的说明。

部署到服务器

执行hexo deploy,git会自动把项目传到服务器,中间可能会要输入服务器ssh的用户密码,
这里和ssh一样,密码是不回显的,输入的时候注意一下。

写博文

使用cmd定位到hexo blog的目录,执行hexo new "文章名称",系统会自动创建一个文章名称.md 的文件,使用VS Code这样的编辑器可以直接编辑文件,然后cmd输入hexo g,hexo d就可以发布到服务器上了。