0%

1. 写在前面

感觉有必要写一下每个月的交易情况,也算是对自己有个交代。虽然每笔交易目前都会写到 Google Sheet

从这个月开始有期货的交易单,也准备作为记录写进来。

Read more »

1. 安装

1
2
brew install redis
pip3 install redis celery
1
2
>redis-cli PING
PONG

返回PONG表示启动 redis 成功

Read more »

1. 在谷歌 domain 申请域名

如果有域名则不需要,比如我的域名alwa.info已经转到了google domain上。

然后把WWW前缀的链接修改CNAME记录为c.storage.googleapis.com. 注意有最后的点。

再加上子域名转向,把alwa.info 转到 www.alwa.info

至此域名已经配置成功。

2. 建立Google Cloud存储区域

创建新的存储分区,叫做www.alwa.info即你自己的域名。修改存储分区权限,点击增加新成员allUsers,权限是环境用户和存储对象查看者。

点击新建的存储区域,上传静态网页文件。这个静态文件就是hexo g生成的public文件夹下所有内容。

修改存储分区的网页配置,增加index页面为index.html

3. 建立图片存储区域

继续在 Google Cloud Storage 上建立一个新的存储区域,这个无所谓域名。修改存储分区权限,点击增加新成员allUsers,权限是环境用户和存储对象查看者。

这样在这个里面上传文件,然后通过public link所有人都能访问到。

4. 上传文件到Google Cloud

Google Cloud Storage 直接直接上传文件夹到相应目录。当然你也可以自己写一个脚本自动上传文件。但如果你写脚本帮助上传静态文件。则需要制定已经引入权限文件。

5. 上传博客代码

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
def upload_blob(source_file_name, destination_blob_name):
"""Uploads a file to the bucket."""
blob = bucket.blob(destination_blob_name)

blob.upload_from_filename(source_file_name)

print('File {} uploaded to {}.'.format(
source_file_name,
destination_blob_name))


def download_blob(source_blob_name, destination_file_name):
"""Downloads a blob from the bucket."""
blob = bucket.blob(source_blob_name)

blob.download_to_filename(destination_file_name)

print('Blob {} downloaded to {}.'.format(
source_blob_name,
destination_file_name))


def find_all_files_with_prefix(local_prefix='public', prefix=''):
name_list = os.listdir(os.path.join(local_prefix, prefix))
ans_list = []
for name in name_list:
if name in IGNORE_LIST:
continue
if os.path.isdir(os.path.join(local_prefix, os.path.join(prefix, name))):
ans_list.extend(find_all_files_with_prefix(local_prefix, os.path.join(prefix, name)))
else:
ans_list.append(os.path.join(prefix, name))
return ans_list

def main():
local_prefix = 'public'
file_names = find_all_files_with_prefix(local_prefix)
for file_name in file_names:
upload_blob(os.path.join(local_prefix, file_name), file_name)
return

if __name__ == '__main__':
main()

因为我们是朋友,所以你可以使用我的文字,但请注明出处:http://alwa.info

1. 介绍

本文主要介绍 Google Authenticator 的实现,以及背后的算法 TOTP

实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。

otpauth://TYPE/LABEL?PARAMETERS

实现的原理大概是:

  1. 服务器生成一个类似HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ的密匙,以下称作密匙A,并且保存在数据库中。
  2. 页面上显示一个二维码,内容是一个URI地址otpauth://totp/账号?secret=密钥,比如otpauth://totp/ACME%20Co:[email protected]?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30
  3. 客户端扫描二维码,把密匙HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ保存在客户端。

当用户需要登录时:

  1. 客户端每30秒通过密匙A和时间戳通过算法生成一个6位数字的一次密码。比如123456
  2. 用户输入密码,服务端通过数据库密匙和时间戳通过同一种算法生成一个6位数字的一次性密码。那么就能得到相同结果。验证成功。
Read more »

0. 前言

PhotoSwipe 是一个前端显示图片的一个框架,不依赖其他额外框架便可以单独运行。此文大部分翻译自官方文档。自己写的demo Github,图片文件存储在firebase上。

Read more »