国金证券万一开户

国金证券支持同花顺,雪球登录。
 
国金证券.jpeg


费率:
 
股票万一
场内基金万0.5
可转债上海百万分之五(没有最低),深圳十万分之五(最低0.1)
融资利率5.0%
 
开通后可以直接开通QMT,ptrade量化功能,不收取流量费。
QMT和ptrade的一些介绍资料:
 
自动化交易:QMT安装python第三方库
https://zhuanlan.zhihu.com/p/445599417
 
什么是Ptrade
http://www.30daydo.com/article/44230
  
需要的可以扫码开通。
 

 
继续阅读 »
国金证券支持同花顺,雪球登录。
 
国金证券.jpeg


费率:
 
股票万一
场内基金万0.5
可转债上海百万分之五(没有最低),深圳十万分之五(最低0.1)
融资利率5.0%
 
开通后可以直接开通QMT,ptrade量化功能,不收取流量费。
QMT和ptrade的一些介绍资料:
 
自动化交易:QMT安装python第三方库
https://zhuanlan.zhihu.com/p/445599417
 
什么是Ptrade
http://www.30daydo.com/article/44230
  
需要的可以扫码开通。
 

  收起阅读 »

不是所有的bytes都可以转换为string

byte转为string
b.decode('utf8')
 
如果报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 1: invalid continuation byte

说明字节无法字节转为string, 

Shutter_2022-01-14-14:49:54.png

 
上面的字节是可以正常decode为utf8
 
而改下字节数据

Shutter_2022-01-14-14:53:40.png

 
所以你试下decode下面的字节:
c=b'\x1e\xe4\xd5\x97\x9a#\x99kC\xadD\x7f\x9a\xc2G\x92'

是无法解析的。
 
这个是没有办法的,如果要硬刚 。
可以加入参数errors = ‘replace’
 
b.decode('utf8',errors='replace')

这样就不会报错。但是这也只是输出的乱码。
 
正确的姿势是要看看你的字节的最原始编码格式。如果是gbk,那么就应该使用b.decode('gbk')
 
 
继续阅读 »
byte转为string
b.decode('utf8')
 
如果报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 1: invalid continuation byte

说明字节无法字节转为string, 

Shutter_2022-01-14-14:49:54.png

 
上面的字节是可以正常decode为utf8
 
而改下字节数据

Shutter_2022-01-14-14:53:40.png

 
所以你试下decode下面的字节:
c=b'\x1e\xe4\xd5\x97\x9a#\x99kC\xadD\x7f\x9a\xc2G\x92'

是无法解析的。
 
这个是没有办法的,如果要硬刚 。
可以加入参数errors = ‘replace’
 
b.decode('utf8',errors='replace')

这样就不会报错。但是这也只是输出的乱码。
 
正确的姿势是要看看你的字节的最原始编码格式。如果是gbk,那么就应该使用b.decode('gbk')
 
  收起阅读 »

Ptrade、QMT如何在虚拟机下运行?

QMT在阿里云的虚拟机上无法运行的,QMT会检测到当前的环境是虚拟机,会阻止你登录。
 
那是不是只能在本地的物理机上执行的呢?
 
不过有办法解决:
使用阿里云的云服务中的无影云。
 
关键它价格也不贵,一年的2核4G的价格也就是139元,支持windows
 

 https://www.aliyun.com/minisite/goods?userCode=nebb965s


无影云桌面 (Elastic Desktop Service),是一种易用、安全、高效的云上桌面服务。它支持快速便捷的桌面环境创建、部署、统一管控与运维。无需前期传统硬件投资,帮您快速构建安全、高性能、低成本的企业桌面办公体系。可广泛应用于具有高数据安全管控、高性能计算等要求的安全办公、金融、设计、影视、教育等领域。


 其实就是一个windows的远程桌面,里面可以按照各种应用程序,比如同花顺,东方财富,QQ等等

 
连接方式,使用浏览器就可以连上远程桌面了:
 

我用的谷歌浏览器,现在无论走到那里,只要可以上网,就可以在浏览器里面连接到远程桌面,看到Ptrade里面的情况。
 

20220610004.png


 
继续阅读 »
QMT在阿里云的虚拟机上无法运行的,QMT会检测到当前的环境是虚拟机,会阻止你登录。
 
那是不是只能在本地的物理机上执行的呢?
 
不过有办法解决:
使用阿里云的云服务中的无影云。
 
关键它价格也不贵,一年的2核4G的价格也就是139元,支持windows
 

 https://www.aliyun.com/minisite/goods?userCode=nebb965s


无影云桌面 (Elastic Desktop Service),是一种易用、安全、高效的云上桌面服务。它支持快速便捷的桌面环境创建、部署、统一管控与运维。无需前期传统硬件投资,帮您快速构建安全、高性能、低成本的企业桌面办公体系。可广泛应用于具有高数据安全管控、高性能计算等要求的安全办公、金融、设计、影视、教育等领域。


 其实就是一个windows的远程桌面,里面可以按照各种应用程序,比如同花顺,东方财富,QQ等等

 
连接方式,使用浏览器就可以连上远程桌面了:
 

我用的谷歌浏览器,现在无论走到那里,只要可以上网,就可以在浏览器里面连接到远程桌面,看到Ptrade里面的情况。
 

20220610004.png


  收起阅读 »

性能测试: flask WSGI vs 异步 ASGI vs tornodo vs Golang Gin

做一个基本的性能基准测试。测试脚本使用是apach benchmark
测试命令:
ab -kc 1000 -n 4000 http://127.0.0.1:5000/
 

代码最精简:
flask wsgi:
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

if __name__ == '__main__':
app.run(host='0.0.0.0')

得到的结果:
 

ASGI的代码:
async def app(scope, receive, send):
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
[b'content-type', b'text/html']
]
})

await send({
'type': 'http.response.body',
'body': b'Hello This is server running',
'more_body': False
})
 
运行命令:
uvicorn --host 0.0.0.0 simple_asgi:app
 
得到的结果:

 
 
python的tornado
from tornado import  ioloop
from tornado import web
class Homepage(web.RequestHandler):

def get(self):
print('get method')
self.write("This is tornado server")

if __name__ == '__main__':
app = web.Application([
("/",Homepage),

])

app.listen(8888)
ioloop.IOLoop.current().start()

 
 
Goland的gin
 package main

import "github.com/gin-gonic/gin"

// 测试专用

func main() {
r := gin.Default()
r.GET("/index", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Working"})
})
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Working"})
})
r.Run()
}


 
通过requests per second 每秒的请求数:
flask : 1000
uvicorn: 2000
tornoda:3000
go gin:4000

 
所以综合测试结果,flask的性能最烂,go gin的性能最好。差了4倍。
 
转载请注明出处:
http://www.30daydo.com/article/44336
 
继续阅读 »
做一个基本的性能基准测试。测试脚本使用是apach benchmark
测试命令:
ab -kc 1000 -n 4000 http://127.0.0.1:5000/
 

代码最精简:
flask wsgi:
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

if __name__ == '__main__':
app.run(host='0.0.0.0')

得到的结果:
 

ASGI的代码:
async def app(scope, receive, send):
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
[b'content-type', b'text/html']
]
})

await send({
'type': 'http.response.body',
'body': b'Hello This is server running',
'more_body': False
})
 
运行命令:
uvicorn --host 0.0.0.0 simple_asgi:app
 
得到的结果:

 
 
python的tornado
from tornado import  ioloop
from tornado import web
class Homepage(web.RequestHandler):

def get(self):
print('get method')
self.write("This is tornado server")

if __name__ == '__main__':
app = web.Application([
("/",Homepage),

])

app.listen(8888)
ioloop.IOLoop.current().start()

 
 
Goland的gin
 package main

import "github.com/gin-gonic/gin"

// 测试专用

func main() {
r := gin.Default()
r.GET("/index", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Working"})
})
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Working"})
})
r.Run()
}


 
通过requests per second 每秒的请求数:
flask : 1000
uvicorn: 2000
tornoda:3000
go gin:4000

 
所以综合测试结果,flask的性能最烂,go gin的性能最好。差了4倍。
 
转载请注明出处:
http://www.30daydo.com/article/44336
  收起阅读 »

python异步编程实战 基于AIO的全栈开发技术 勘误


 
是一本用心写的好书。
 
不过也存在一些纰漏(个人认为的);
定期更新,看到哪更新到哪
 
P11 : 最后一行的pool 应该是线程池 应该改为进程池。
 P35: 执行的docker 命令: docker-compose up -d   -d前面有一个空格
 
持续更新
 
 
 
继续阅读 »

 
是一本用心写的好书。
 
不过也存在一些纰漏(个人认为的);
定期更新,看到哪更新到哪
 
P11 : 最后一行的pool 应该是线程池 应该改为进程池。
 P35: 执行的docker 命令: docker-compose up -d   -d前面有一个空格
 
持续更新
 
 
  收起阅读 »

ubuntu goland破解激活教程

很大小伙伴是使用ubuntu作为主力开发机的。
ubuntu下的goland可以直接到官网下载。
或者在自带的software center。
 
不过goland只能试用一个月,一个月后只能要激活。
 
所以有一个reset插件,可以每次开启goland的时候把激活日期重置,往后推一个月。
 
只需要打开goland,然后把插件拖进去goland的界面即可。

 

 


 
插件获取方式:
关注公众号:
 
30天尝试新事情

 
 
后台回复:goland激活
即可
继续阅读 »
很大小伙伴是使用ubuntu作为主力开发机的。
ubuntu下的goland可以直接到官网下载。
或者在自带的software center。
 
不过goland只能试用一个月,一个月后只能要激活。
 
所以有一个reset插件,可以每次开启goland的时候把激活日期重置,往后推一个月。
 
只需要打开goland,然后把插件拖进去goland的界面即可。

 

 


 
插件获取方式:
关注公众号:
 
30天尝试新事情

 
 
后台回复:goland激活
即可 收起阅读 »

腾讯云上的centos 然后没有sudo

轻服务器,感觉是最小安装的centos,连sudo都不默认安装。还得自己yum安装。
 
yum -y install sudo
 
稍等片刻就可以了。
 
现在腾讯的轻服务器还是很便宜,双核4G的服务器,3年,价格才200左右,平均一年60多,随便拿来挖矿就可以回本了。单买一年的话74块,也就一天的饭钱。
 
活动还在继续,点击下面的官网链接就可以购买了。不限定是否新用户,老用户也可以的。
https://curl.qcloud.com/eCqCAb4a

 
继续阅读 »
轻服务器,感觉是最小安装的centos,连sudo都不默认安装。还得自己yum安装。
 
yum -y install sudo
 
稍等片刻就可以了。
 
现在腾讯的轻服务器还是很便宜,双核4G的服务器,3年,价格才200左右,平均一年60多,随便拿来挖矿就可以回本了。单买一年的话74块,也就一天的饭钱。
 
活动还在继续,点击下面的官网链接就可以购买了。不限定是否新用户,老用户也可以的。
https://curl.qcloud.com/eCqCAb4a

 
收起阅读 »

Chrome插件批量清除浏览器的收藏夹中重复,无法访问的网址

这个chrome插件挺好用的:
 
Bookmarks clean up
 
chrome应用商场下载即可。
 
可以自动清除一些年代久远,无法访问的站点。
 
还有一些重复收藏的网址。
 
这个chrome插件挺好用的:
 
Bookmarks clean up
 
chrome应用商场下载即可。
 
可以自动清除一些年代久远,无法访问的站点。
 
还有一些重复收藏的网址。
 

揭露垃圾的短信收码平台

短信收码平台,主要用来注册一些临时的论坛, 不想泄露自己的隐私。 所以得找一些临时的手机号来收验证码。
 
一起的收码平台质量挺好的。
 
可是现在越来越烂了。
 
总结一些完全没有用的收码平台。 希望大家不要浪费时间在这些垃圾网站上浪费时间。
 
都是自己平时使用过的,在上面等了几分钟后,短信没收到,而上面的短信全是广告。
 
垃圾排名第一:(按搜索引擎出来的,大家就不要点这些网站)
 

无敌云短信验证码接收平台
https://www.clearcode.cn/

 
 

 
上面的基本都是套路,是一些商家的广告。并没有你的验证码。
 
 
 
 
继续阅读 »
短信收码平台,主要用来注册一些临时的论坛, 不想泄露自己的隐私。 所以得找一些临时的手机号来收验证码。
 
一起的收码平台质量挺好的。
 
可是现在越来越烂了。
 
总结一些完全没有用的收码平台。 希望大家不要浪费时间在这些垃圾网站上浪费时间。
 
都是自己平时使用过的,在上面等了几分钟后,短信没收到,而上面的短信全是广告。
 
垃圾排名第一:(按搜索引擎出来的,大家就不要点这些网站)
 

无敌云短信验证码接收平台
https://www.clearcode.cn/

 
 

 
上面的基本都是套路,是一些商家的广告。并没有你的验证码。
 
 
 
  收起阅读 »

后生可畏 看到某个作者的github commit状态

基本每天保持绿色状态。
没有绿的3天应该是过年状态吧。
 
基本每天保持绿色状态。
没有绿的3天应该是过年状态吧。
 

ubuntu(centos)下golang下载libxml2 报错信息, go 安装libxml2

ubuntu下golang下载libxml2 报错信息:
$ go get -u github.com/lestrrat-go/libxml2                     
# pkg-config --cflags -- libxml-2.0 Package libxml-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libxml-2.0.pc' to the PKG_CONFIG_PATH environment variable
No package 'libxml-2.0' found pkg-config: exit status 1 ​ ​

 
因为系统少了个libxml2 开发包:

使用以下命令即可修复:
sudo apt install libxml2-dev
 
 
如果是centos的话,安装命令:
yum install libxml2
yum install libxml2-devel

注意是 libxml2-devel !
别用那种下载源码编译的方法,能用yum就用yum,否则弄得系统一堆依赖问题。
继续阅读 »
ubuntu下golang下载libxml2 报错信息:
$ go get -u github.com/lestrrat-go/libxml2                     
# pkg-config --cflags -- libxml-2.0 Package libxml-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `libxml-2.0.pc' to the PKG_CONFIG_PATH environment variable
No package 'libxml-2.0' found pkg-config: exit status 1 ​ ​

 
因为系统少了个libxml2 开发包:

使用以下命令即可修复:
sudo apt install libxml2-dev
 
 
如果是centos的话,安装命令:
yum install libxml2
yum install libxml2-devel

注意是 libxml2-devel !
别用那种下载源码编译的方法,能用yum就用yum,否则弄得系统一堆依赖问题。 收起阅读 »

REST ful API的规范 delete方法不建议在body放入数据

毕竟delete参数是根据uri删除资源.
 
因为资源的唯一性,所以就没必要再在body里面放入其他的数据了.
 
什么? 通过uri不能确定资源的唯一? 那么你这个设计就不是REST规范了.
 
那PUT这些操作也无法准确更新资源了.
毕竟delete参数是根据uri删除资源.
 
因为资源的唯一性,所以就没必要再在body里面放入其他的数据了.
 
什么? 通过uri不能确定资源的唯一? 那么你这个设计就不是REST规范了.
 
那PUT这些操作也无法准确更新资源了.

摘自 网易音乐 评论


去年高三帮好朋友给实验班的男孩子写一封信 只有“山有木兮木有枝”七个字 想让他领会后半句心悦君兮君不知的含义 第二天男孩子主动来班里送信 还是昨天那封 他在后面补充到“心悦君兮君已知 奈何十二寒窗苦 待到金榜题名时” 后来这段故事无疾而终 愿你们遇到的每段感情都能有处安放


 
继续阅读 »


去年高三帮好朋友给实验班的男孩子写一封信 只有“山有木兮木有枝”七个字 想让他领会后半句心悦君兮君不知的含义 第二天男孩子主动来班里送信 还是昨天那封 他在后面补充到“心悦君兮君已知 奈何十二寒窗苦 待到金榜题名时” 后来这段故事无疾而终 愿你们遇到的每段感情都能有处安放


 
收起阅读 »

现在很多公众号都是粗制滥造, 代码也没经过验证 就贴上来害人

来看看这个公众号 :  Golang来啦
 

 
你说函数签名的Counter写错就算了. 但是返回的也是一个指针呀......
 
正确写法
func NewNotSafeCounter() *NotSafeCounter {
return &NotSafeCounter{0}
}

 
 
继续阅读 »
来看看这个公众号 :  Golang来啦
 

 
你说函数签名的Counter写错就算了. 但是返回的也是一个指针呀......
 
正确写法
func NewNotSafeCounter() *NotSafeCounter {
return &NotSafeCounter{0}
}

 
  收起阅读 »

可转债指数 vs 基金指数 vs 股票指数


 
上面这个图是3个百度指数图的对比. 描述的是百度每天搜索的收录次数
典型的周期图. 
 
山谷的地方是周六周天.
说明平时周末大家关心股市的人比平时锐减.  平时大伙都是上班时候看看行情. 一到周末,就不太关心行情.
 
看来上班摸鱼看股票的人不少.
 
 
继续阅读 »

 
上面这个图是3个百度指数图的对比. 描述的是百度每天搜索的收录次数
典型的周期图. 
 
山谷的地方是周六周天.
说明平时周末大家关心股市的人比平时锐减.  平时大伙都是上班时候看看行情. 一到周末,就不太关心行情.
 
看来上班摸鱼看股票的人不少.
 
  收起阅读 »

内网穿透软件 frp和ngrok的比较

内网穿透就是访问某个内网主机.
 
可以理解为一个vpn网络. 同在一个内网. 不过原理不一样.

内网穿透是绑定的某个端口的数据转发与接收.

 
前提都是需要一台有公网ip的主机,通过这个主机作为跳板, 先访问这个跳板主机, 然后把数据转发到链接到内网.
 
那么比较frp和ngork的各个方面,从而让用户了解各自的需求:
 
1. 开源
frp 开源免费,ngrok1.x开源,但2.x开始收费

2. 配置难度
二者都是用go编写的,所以基本可以跨平台是,linux,windows都可以。
都需要一个客户端,一个服务端

配置而言,frp要比ngrok配置容易多了. 
 
虽然都是go写的.不过ngrok的配置比较麻烦,而且go get 经常拉不下来.
 
推荐frp, 直接下载下来就可以使用了.

 
可以自定义域名. 即使域名没有备案,也可以直接用ip访问.

 
ngrok有个随机的域名,不过那个速度有限速,用来偶尔测试一下还可以。 长期用来工作或者建站肯定不行。
 
 ngrok 2.x 官网提供下载的版本需要注册,获取token,才能使用
 
 ngrok config add-authtoken <token>

然后
 ngrok http 80
监听本地的80端口。
 
 
继续阅读 »
内网穿透就是访问某个内网主机.
 
可以理解为一个vpn网络. 同在一个内网. 不过原理不一样.

内网穿透是绑定的某个端口的数据转发与接收.

 
前提都是需要一台有公网ip的主机,通过这个主机作为跳板, 先访问这个跳板主机, 然后把数据转发到链接到内网.
 
那么比较frp和ngork的各个方面,从而让用户了解各自的需求:
 
1. 开源
frp 开源免费,ngrok1.x开源,但2.x开始收费

2. 配置难度
二者都是用go编写的,所以基本可以跨平台是,linux,windows都可以。
都需要一个客户端,一个服务端

配置而言,frp要比ngrok配置容易多了. 
 
虽然都是go写的.不过ngrok的配置比较麻烦,而且go get 经常拉不下来.
 
推荐frp, 直接下载下来就可以使用了.

 
可以自定义域名. 即使域名没有备案,也可以直接用ip访问.

 
ngrok有个随机的域名,不过那个速度有限速,用来偶尔测试一下还可以。 长期用来工作或者建站肯定不行。
 
 ngrok 2.x 官网提供下载的版本需要注册,获取token,才能使用
 
 ngrok config add-authtoken <token>

然后
 ngrok http 80
监听本地的80端口。
 
  收起阅读 »

微信公众号token验证失败的原因

主要是文档写的过于模糊(比较含蓄,实际上是垃圾到不行)
 
因为提供的文档,用的是python2的代码:
import hashlib
import web

class Handle(object):
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "xxxx" #请按照公众平台官网\基本配置中信息填写

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()
print "handle/GET func: hashcode, signature: ", hashcode, signature
if hashcode == signature:
return echostr
else:
return ""
except Exception, Argument:
return Argument

如果按照上面的代码,放到python3上执行, 实际返回的 echostr 的值是错的. 所以服务器拿这个错的值,匹配, 会总是失败.
 
什么年代了, 一个demo 也不换个新一点的python版本.
 
提供一个新版的python3通过检验的代码:
 
 
# -*- coding: utf-8 -*-

# -*- coding: utf-8 -*-
# filename: handle.py

import hashlib
import web

class Handle(object):

def POST(self):
pass

# get方法,验证token
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "token success!"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "123456abcdefg" # 请按照公众平台官网\基本配置中信息填写,两个token保持一致

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update(list[0].encode("utf-8"))
sha1.update(list[1].encode("utf-8"))
sha1.update(list[2].encode("utf-8"))
hashcode = sha1.hexdigest() # 获取加密串

# 验证
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return ""

except Exception as Argument:
return Argument
继续阅读 »
主要是文档写的过于模糊(比较含蓄,实际上是垃圾到不行)
 
因为提供的文档,用的是python2的代码:
import hashlib
import web

class Handle(object):
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "xxxx" #请按照公众平台官网\基本配置中信息填写

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()
print "handle/GET func: hashcode, signature: ", hashcode, signature
if hashcode == signature:
return echostr
else:
return ""
except Exception, Argument:
return Argument

如果按照上面的代码,放到python3上执行, 实际返回的 echostr 的值是错的. 所以服务器拿这个错的值,匹配, 会总是失败.
 
什么年代了, 一个demo 也不换个新一点的python版本.
 
提供一个新版的python3通过检验的代码:
 
 
# -*- coding: utf-8 -*-

# -*- coding: utf-8 -*-
# filename: handle.py

import hashlib
import web

class Handle(object):

def POST(self):
pass

# get方法,验证token
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "token success!"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "123456abcdefg" # 请按照公众平台官网\基本配置中信息填写,两个token保持一致

list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update(list[0].encode("utf-8"))
sha1.update(list[1].encode("utf-8"))
sha1.update(list[2].encode("utf-8"))
hashcode = sha1.hexdigest() # 获取加密串

# 验证
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return ""

except Exception as Argument:
return Argument
收起阅读 »

golang的时间格式化 做法有点像格力手机的开机画面是董小姐

网络上的开发者基本都是一路吐槽。
 
过去用java,python,php,等语言,将一个时间格式化成一个字符串都是用“yyy-MM-dd hh:mm:ss”之类的方法,golang 的格式化方法真令我大开眼界

先看官方文档说明:

func (Time) Format
func (t Time) Format(layout string) string
Format returns a textual representation of the time value formatted according to layout, which defines the format by showing how the reference time, defined to be

Mon Jan 2 15:04:05 -0700 MST 2006
would be displayed if it were the value; it serves as an example of the desired output. The same display rules will then be applied to the time value. Predefined layouts ANSIC, UnixDate, RFC3339 and others describe standard and convenient representations of the reference time. For more information about the formats and the definition of the reference time, see the documentation for ANSIC and the other constants defined by this package.


下面给个代码:

fmt.Println(time.Now().Format("2006-01-02 150405"))

要注意那时间,只能是2006-01-02 15:04:05分,其它的时间都不行,真是够绝。

 做法有点像格力手机的开机画面是董小姐。
用个语言还得记住你golang的生日??
继续阅读 »
网络上的开发者基本都是一路吐槽。
 
过去用java,python,php,等语言,将一个时间格式化成一个字符串都是用“yyy-MM-dd hh:mm:ss”之类的方法,golang 的格式化方法真令我大开眼界

先看官方文档说明:

func (Time) Format
func (t Time) Format(layout string) string
Format returns a textual representation of the time value formatted according to layout, which defines the format by showing how the reference time, defined to be

Mon Jan 2 15:04:05 -0700 MST 2006
would be displayed if it were the value; it serves as an example of the desired output. The same display rules will then be applied to the time value. Predefined layouts ANSIC, UnixDate, RFC3339 and others describe standard and convenient representations of the reference time. For more information about the formats and the definition of the reference time, see the documentation for ANSIC and the other constants defined by this package.


下面给个代码:

fmt.Println(time.Now().Format("2006-01-02 150405"))

要注意那时间,只能是2006-01-02 15:04:05分,其它的时间都不行,真是够绝。

 做法有点像格力手机的开机画面是董小姐。
用个语言还得记住你golang的生日?? 收起阅读 »

golang json Unmarshal 无法修改结构体的值。传入指针

假如我的json文件的格式如下:
 
{ "username": "root", "password": "123456", "host": "1.1.1.1.", "port": 3306, "db": "admin" }

然后我的定义的结构体:
 
type T struct { 

username string `json:"username"`
password string `json:"password"`
host string `json:"host"`
port int `json:"port"`
db string `json:"db"`

}


然后程序里面解析json的代码:
var t T
data, err := ioutil.ReadFile(filename)
fmt.Println("read from file")
//fmt.Println(string(data))
if err != nil {
fmt.Println("in error")
fmt.Println(err)
return err
}
err = json.Unmarshal(data, &t)
if err != nil {
fmt.Println("error ")
fmt.Println(err)
return err
}
fmt.Println("outpout ")
fmt.Printf("%v\n", t)
fmt.Println(t)

发现是无法把t的值修改为json文件里面的值,最后的记过输出,还是一个零值的结果体。

后面知道问题所在了,如果定义的结构体的首字母小写的时候,包外的反射是无法修改结构体的值的,也就是只能只读。

所以只需要把结构体的首字母改为大写,问题就可以解决了。
type T struct {
Username string `json:"username"`
Password string `json:"password"`
Host string `json:"host"`
Port int `json:"port"`
Db string `json:"db"`
}

json文件里面不用修改,因为
Unmarshal映射的时候可以适配大小写。
 
继续阅读 »
假如我的json文件的格式如下:
 
{ "username": "root", "password": "123456", "host": "1.1.1.1.", "port": 3306, "db": "admin" }

然后我的定义的结构体:
 
type T struct { 

username string `json:"username"`
password string `json:"password"`
host string `json:"host"`
port int `json:"port"`
db string `json:"db"`

}


然后程序里面解析json的代码:
var t T
data, err := ioutil.ReadFile(filename)
fmt.Println("read from file")
//fmt.Println(string(data))
if err != nil {
fmt.Println("in error")
fmt.Println(err)
return err
}
err = json.Unmarshal(data, &t)
if err != nil {
fmt.Println("error ")
fmt.Println(err)
return err
}
fmt.Println("outpout ")
fmt.Printf("%v\n", t)
fmt.Println(t)

发现是无法把t的值修改为json文件里面的值,最后的记过输出,还是一个零值的结果体。

后面知道问题所在了,如果定义的结构体的首字母小写的时候,包外的反射是无法修改结构体的值的,也就是只能只读。

所以只需要把结构体的首字母改为大写,问题就可以解决了。
type T struct {
Username string `json:"username"`
Password string `json:"password"`
Host string `json:"host"`
Port int `json:"port"`
Db string `json:"db"`
}

json文件里面不用修改,因为
Unmarshal映射的时候可以适配大小写。
  收起阅读 »

为什么现在还有那么多在线的gonlang 字符串生成json struct的网站? Goland IDE一个快捷方式帮你搞定

在golanad的ide上,敲入 type xx struct{
}
 
在出现的generate from json的页面,把json的字符串输入进去。
 
IDE即可帮你转换为对应的结构体了。 根本就没有在线IDE什么事情了。
在golanad的ide上,敲入 type xx struct{
}
 
在出现的generate from json的页面,把json的字符串输入进去。
 
IDE即可帮你转换为对应的结构体了。 根本就没有在线IDE什么事情了。

golang根据不同返回解析不同结构的json

// 数据源
{"type":"a_number", "data":{"somenumber":1234}}
{"type":"b_string", "data":{"somestring":"a string", "anotherstring": "a second string"}}`
 
如何解析上面返回的json结构体
 
答:json.RawMessage
 
type Head struct {
Type string `json:"type"`
Data json.RawMessage `json:"data"`
}


var msg Head

json.Unmarshal([]byte(jsonString), &msg)

switch msg.Type {
case "a_number":
var detail A
json.Unmarshal([]byte(msg.Data),&detail)
fmt.Println(detail.SomeNumber)
case "b_string":
var detail B
json.Unmarshal([]byte(msg.Data),&detail)
fmt.Println(detail.SomeString)
default:
fmt.Printf("I don't know about type %s!\n", msg.Type)
}

 
就可以解析上面的不规则的结构体了。
 
 
继续阅读 »
// 数据源
{"type":"a_number", "data":{"somenumber":1234}}
{"type":"b_string", "data":{"somestring":"a string", "anotherstring": "a second string"}}`
 
如何解析上面返回的json结构体
 
答:json.RawMessage
 
type Head struct {
Type string `json:"type"`
Data json.RawMessage `json:"data"`
}


var msg Head

json.Unmarshal([]byte(jsonString), &msg)

switch msg.Type {
case "a_number":
var detail A
json.Unmarshal([]byte(msg.Data),&detail)
fmt.Println(detail.SomeNumber)
case "b_string":
var detail B
json.Unmarshal([]byte(msg.Data),&detail)
fmt.Println(detail.SomeString)
default:
fmt.Printf("I don't know about type %s!\n", msg.Type)
}

 
就可以解析上面的不规则的结构体了。
 
  收起阅读 »

现在还有哪些券商可以万一免五?

不得不说,最近的监管以及严禁大V低佣开户,加上券商之间互相投诉,撕皮,很多免五的券商已经暂时或永久关闭关闭了免五的通道。
 
不过如果要开免五还是有办法的,一些券商即使没有免五,费率也是很优惠的。
 
 

 

 
普遍转债都是是百万分之二,etf万0.5的费率,股票万1到万1.2,基本这里的券商到手的费率都是最低的。如果有更低的券商,也欢迎推荐,可以给你发个大大的红包。

需要的可以联系:
 
继续阅读 »
不得不说,最近的监管以及严禁大V低佣开户,加上券商之间互相投诉,撕皮,很多免五的券商已经暂时或永久关闭关闭了免五的通道。
 
不过如果要开免五还是有办法的,一些券商即使没有免五,费率也是很优惠的。
 
 

 

 
普遍转债都是是百万分之二,etf万0.5的费率,股票万1到万1.2,基本这里的券商到手的费率都是最低的。如果有更低的券商,也欢迎推荐,可以给你发个大大的红包。

需要的可以联系:
 
收起阅读 »

vs code 无法启动jupyter notebook 修复 亲测

错误信息:
failed to start INotebook in kernel, UI Disabled = false s [Error]: Unable to start Kernel 'base (Python 3.8.3)' due to connection timeout.  View Jupyter [log](command:jupyter.viewOutput) for further detail

NM3I8.png


之前一直运行得好好的。不知道安装了什么依赖库后就这样了。。
 
在国外网站找了一通后,找到了解决办法:
 
pip install traitlets==4.3.3

不得不感慨,国外大神多,国内csdn乱ctrl cv.
 
 
继续阅读 »
错误信息:
failed to start INotebook in kernel, UI Disabled = false s [Error]: Unable to start Kernel 'base (Python 3.8.3)' due to connection timeout.  View Jupyter [log](command:jupyter.viewOutput) for further detail

NM3I8.png


之前一直运行得好好的。不知道安装了什么依赖库后就这样了。。
 
在国外网站找了一通后,找到了解决办法:
 
pip install traitlets==4.3.3

不得不感慨,国外大神多,国内csdn乱ctrl cv.
 
  收起阅读 »

QMT代码详解<一> 行业ETF轮动

QMT
回测代码如下: 代码里面加入了个人理解的注释。
 
#coding:gbk

'''
回测模型示例(非实盘交易策略)

本策略每隔1个月定时触发计算1000能源(399381.SZ)、1000材料(399382.SZ)、1000工业(399383.SZ)、
1000可选(399384.SZ)、1000消费(399385.SZ)、1000医药(399386.SZ)这几个行业指数过去
20个交易日的收益率并选取了收益率最高的指数的成份股并获取了他们的市值数据
随后把仓位调整至市值最大的5只股票上
该策略在股票指数日线下运行
'''
import numpy as np
import math
def init(ContextInfo):
MarketPosition ={}
ContextInfo.MarketPosition = MarketPosition #初始化持仓
index_universe = ['399381.SZ','399382.SZ','399383.SZ','399384.SZ','399385.SZ','399386.SZ']
index_stocks = []
for index in index_universe:
for stock in ContextInfo.get_sector(index): # 获取指数的成分股
index_stocks.append(stock)
ContextInfo.set_universe(index_universe+index_stocks) #设定股票池,
ContextInfo.day = 20
ContextInfo.ratio = 0.8
ContextInfo.holding_amount = 5
ContextInfo.accountID='testS'

def handlebar(ContextInfo):
buy_condition = False
sell_condition = False
d = ContextInfo.barpos
print(d)
lastdate = timetag_to_datetime(ContextInfo.get_bar_timetag(d - 1), '%Y%m%d')
date = timetag_to_datetime(ContextInfo.get_bar_timetag(d), '%Y%m%d')
print(date)
index_list = ['399381.SZ','399382.SZ','399383.SZ','399384.SZ','399385.SZ','399386.SZ']
return_index = []
weight = ContextInfo.ratio/ContextInfo.holding_amount
size_dict = {}
if (float(date[-4:-2]) != float(lastdate[-4:-2])):
#print '---------------------------------------------------------------------------------'
#print '当前交易日',date,date[-4:-2] 20210101 获取到的月份不一样,这样在每个月初会执行一次这个函数

# 获取的是股票池的
his = ContextInfo.get_history_data(21,'1d','close')

#print "his",his,timetag_to_datetime(ContextInfo.get_bar_timetag(d),"%Y%m%d")
for k in list(his.keys()):
if len(his[k]) == 0:
del his[k]
for index in index_list:
ratio = 0
try:
ratio = (his[index][-2] - his[index][0])/his[index][0]
except KeyError:
print('key error:' + index)
except IndexError:
print('list index out of range:' + index)
return_index.append(ratio)
# 获取指定数内收益率表现最好的行业
best_index = index_list[np.argmax(return_index)]
#print '当前最佳行业是:', ContextInfo.get_stock_name(best_index)[3:]+'行业'
# 获取当天有交易的股票
index_stock = ContextInfo.get_sector(best_index)
stock_available = []
for stock in index_stock:
if ContextInfo.is_suspended_stock(stock) == False: # 是否停牌
stock_available.append(stock)

for stock in stock_available:
if stock in list(his.keys()):
#目前历史流通股本取不到,暂用总股本
if len(his[stock]) >= 2:
stocksize =his[stock][-2] * float(ContextInfo.get_financial_data(['CAPITALSTRUCTURE.total_capital'],[stock],lastdate,date).iloc[0,-1])
size_dict[stock] = stocksize
elif len(his[stock]) == 1:
stocksize =his[stock][-1] * float(ContextInfo.get_financial_data(['CAPITALSTRUCTURE.total_capital'],[stock],lastdate,date).iloc[0,-1])
size_dict[stock] = stocksize
else:
return
size_sorted = sorted(list(size_dict.items()), key = lambda item:item[1]) # 根据股本顺序排序
pre_holding = []

for tuple in size_sorted[-ContextInfo.holding_amount:]: # 最好不要占用关键词
pre_holding.append(tuple[0])
#print '买入备选',pre_holding
#函数下单
if len(pre_holding) > 0:
sellshort_list = []
for stock in list(ContextInfo.MarketPosition.keys()): # 遍历持仓,如果不在当前条件范围内,卖出
if stock not in pre_holding and (stock in list(his.keys())):
order_shares(stock,-ContextInfo.MarketPosition[stock],'lastest',his[stock][-1],ContextInfo,ContextInfo.accountID)
print('sell',stock)
sell_condition = True
sellshort_list.append(stock)
if len(sellshort_list) >0: # 这句多余
for stock in sellshort_list:
del ContextInfo.MarketPosition[stock]

for stock in pre_holding:
if stock not in list(ContextInfo.MarketPosition.keys()): # 买入
Lots = math.floor(ContextInfo.ratio * (1.0/len(pre_holding)) * ContextInfo.capital / (his[stock][-1] * 100))
order_shares(stock,Lots *100,'lastest',his[stock][-1],ContextInfo,ContextInfo.accountID)
print('buy',stock)
buy_condition = True
ContextInfo.MarketPosition[stock] = Lots *100






如果遇到不懂的,可以关注公众号咨询:
继续阅读 »
回测代码如下: 代码里面加入了个人理解的注释。
 
#coding:gbk

'''
回测模型示例(非实盘交易策略)

本策略每隔1个月定时触发计算1000能源(399381.SZ)、1000材料(399382.SZ)、1000工业(399383.SZ)、
1000可选(399384.SZ)、1000消费(399385.SZ)、1000医药(399386.SZ)这几个行业指数过去
20个交易日的收益率并选取了收益率最高的指数的成份股并获取了他们的市值数据
随后把仓位调整至市值最大的5只股票上
该策略在股票指数日线下运行
'''
import numpy as np
import math
def init(ContextInfo):
MarketPosition ={}
ContextInfo.MarketPosition = MarketPosition #初始化持仓
index_universe = ['399381.SZ','399382.SZ','399383.SZ','399384.SZ','399385.SZ','399386.SZ']
index_stocks = []
for index in index_universe:
for stock in ContextInfo.get_sector(index): # 获取指数的成分股
index_stocks.append(stock)
ContextInfo.set_universe(index_universe+index_stocks) #设定股票池,
ContextInfo.day = 20
ContextInfo.ratio = 0.8
ContextInfo.holding_amount = 5
ContextInfo.accountID='testS'

def handlebar(ContextInfo):
buy_condition = False
sell_condition = False
d = ContextInfo.barpos
print(d)
lastdate = timetag_to_datetime(ContextInfo.get_bar_timetag(d - 1), '%Y%m%d')
date = timetag_to_datetime(ContextInfo.get_bar_timetag(d), '%Y%m%d')
print(date)
index_list = ['399381.SZ','399382.SZ','399383.SZ','399384.SZ','399385.SZ','399386.SZ']
return_index = []
weight = ContextInfo.ratio/ContextInfo.holding_amount
size_dict = {}
if (float(date[-4:-2]) != float(lastdate[-4:-2])):
#print '---------------------------------------------------------------------------------'
#print '当前交易日',date,date[-4:-2] 20210101 获取到的月份不一样,这样在每个月初会执行一次这个函数

# 获取的是股票池的
his = ContextInfo.get_history_data(21,'1d','close')

#print "his",his,timetag_to_datetime(ContextInfo.get_bar_timetag(d),"%Y%m%d")
for k in list(his.keys()):
if len(his[k]) == 0:
del his[k]
for index in index_list:
ratio = 0
try:
ratio = (his[index][-2] - his[index][0])/his[index][0]
except KeyError:
print('key error:' + index)
except IndexError:
print('list index out of range:' + index)
return_index.append(ratio)
# 获取指定数内收益率表现最好的行业
best_index = index_list[np.argmax(return_index)]
#print '当前最佳行业是:', ContextInfo.get_stock_name(best_index)[3:]+'行业'
# 获取当天有交易的股票
index_stock = ContextInfo.get_sector(best_index)
stock_available = []
for stock in index_stock:
if ContextInfo.is_suspended_stock(stock) == False: # 是否停牌
stock_available.append(stock)

for stock in stock_available:
if stock in list(his.keys()):
#目前历史流通股本取不到,暂用总股本
if len(his[stock]) >= 2:
stocksize =his[stock][-2] * float(ContextInfo.get_financial_data(['CAPITALSTRUCTURE.total_capital'],[stock],lastdate,date).iloc[0,-1])
size_dict[stock] = stocksize
elif len(his[stock]) == 1:
stocksize =his[stock][-1] * float(ContextInfo.get_financial_data(['CAPITALSTRUCTURE.total_capital'],[stock],lastdate,date).iloc[0,-1])
size_dict[stock] = stocksize
else:
return
size_sorted = sorted(list(size_dict.items()), key = lambda item:item[1]) # 根据股本顺序排序
pre_holding = []

for tuple in size_sorted[-ContextInfo.holding_amount:]: # 最好不要占用关键词
pre_holding.append(tuple[0])
#print '买入备选',pre_holding
#函数下单
if len(pre_holding) > 0:
sellshort_list = []
for stock in list(ContextInfo.MarketPosition.keys()): # 遍历持仓,如果不在当前条件范围内,卖出
if stock not in pre_holding and (stock in list(his.keys())):
order_shares(stock,-ContextInfo.MarketPosition[stock],'lastest',his[stock][-1],ContextInfo,ContextInfo.accountID)
print('sell',stock)
sell_condition = True
sellshort_list.append(stock)
if len(sellshort_list) >0: # 这句多余
for stock in sellshort_list:
del ContextInfo.MarketPosition[stock]

for stock in pre_holding:
if stock not in list(ContextInfo.MarketPosition.keys()): # 买入
Lots = math.floor(ContextInfo.ratio * (1.0/len(pre_holding)) * ContextInfo.capital / (his[stock][-1] * 100))
order_shares(stock,Lots *100,'lastest',his[stock][-1],ContextInfo,ContextInfo.accountID)
print('buy',stock)
buy_condition = True
ContextInfo.MarketPosition[stock] = Lots *100






如果遇到不懂的,可以关注公众号咨询:
收起阅读 »

Go 测试题1

问一个基础
func main() {
v := [...]int{1: 2, 3: 4}
fmt.Println( len(v))
}

这个为什么长度是 4?
 
 
答案:
v数组分配内存[0,2,0,4],所以长度为4。
继续阅读 »
问一个基础
func main() {
v := [...]int{1: 2, 3: 4}
fmt.Println( len(v))
}

这个为什么长度是 4?
 
 
答案:
v数组分配内存[0,2,0,4],所以长度为4。
收起阅读 »

图床网站横向对比 测试

1. SM.SM
网站提供登录,可是,一直是登录不了,点击按钮点击后是一直没有反应。后台做的不好。 
不能登录,也就是你上传的图片,就下次想找回,也很难找,除非你找回你的原文章,在原来的文章里面找出原来的链接。
 
然后图片的话遇到一些美女图会经常误删,也就是这样子的。
 

 
就是你的图片链接被吃了。 这也侧面说明图床网站对你的图片进行审查的。 
 
推荐指数:0
 
 
2. imgUrl
这个网站的图片也是有审查的,一般而言,二维码就是直接会被删除,所以不建议拿来存放一些公众号二维码等传播性的工具。
 
优点是速度比较快
 
推荐指数:3星
 
3. 七牛
上传下载速度快,并且正常的图片不会屏蔽,二维码也不会被屏蔽。支持很多的工具。可以自定义名字,也就是你上传的图片的URL不再是一串随机的字符,而是可以设定为指定日期,或者你的原来的文件名。
这样对于查找本地文件,或者根据本地的文件名,查找线上的图片文件,都是很有李的。
 
但是,部署这个有点难度,需要配置一些服务器的内容。比如需要通过API生产token,才可以放入到sharex中,并且需要定时更新。
 
推荐指数:5星
 
继续阅读 »
1. SM.SM
网站提供登录,可是,一直是登录不了,点击按钮点击后是一直没有反应。后台做的不好。 
不能登录,也就是你上传的图片,就下次想找回,也很难找,除非你找回你的原文章,在原来的文章里面找出原来的链接。
 
然后图片的话遇到一些美女图会经常误删,也就是这样子的。
 

 
就是你的图片链接被吃了。 这也侧面说明图床网站对你的图片进行审查的。 
 
推荐指数:0
 
 
2. imgUrl
这个网站的图片也是有审查的,一般而言,二维码就是直接会被删除,所以不建议拿来存放一些公众号二维码等传播性的工具。
 
优点是速度比较快
 
推荐指数:3星
 
3. 七牛
上传下载速度快,并且正常的图片不会屏蔽,二维码也不会被屏蔽。支持很多的工具。可以自定义名字,也就是你上传的图片的URL不再是一串随机的字符,而是可以设定为指定日期,或者你的原来的文件名。
这样对于查找本地文件,或者根据本地的文件名,查找线上的图片文件,都是很有李的。
 
但是,部署这个有点难度,需要配置一些服务器的内容。比如需要通过API生产token,才可以放入到sharex中,并且需要定时更新。
 
推荐指数:5星
  收起阅读 »

毕业7年,白手起家到资产千万,我的6个致富发财赚钱秘诀 --观后感

看了油管上 土妹的视频,《毕业7年,白手起家到资产千万,我的6个致富发财赚钱秘诀》

她总结了几点,并且有人在评论里面总结了。
 
1、有时候选择大于努力(投资炒股->炒美股)
2、不努力就没有选择的机会(名校本科+研究生+充分准备面试技巧+争取工作调动)
3、关键点很重要,在最关键的时候,必须全力一击!
4、富贵险中求,适当冒一点险(风控能力)
5、越早开始存钱,越好
6、打工是发不了财的、但是前期要积累工作经验和锻炼品质,竭尽全力把工作做好!再想办法开拓其他的赚钱方式!
 
基本都是很认同她的说法。
以后需要不断地思考,思考未来。该集中努力的地方得一定努力才行。
 
最后附上视频链接:
https://www.youtube.com/watch?v=094BcDIc0LM
 
 
继续阅读 »
看了油管上 土妹的视频,《毕业7年,白手起家到资产千万,我的6个致富发财赚钱秘诀》

她总结了几点,并且有人在评论里面总结了。
 
1、有时候选择大于努力(投资炒股->炒美股)
2、不努力就没有选择的机会(名校本科+研究生+充分准备面试技巧+争取工作调动)
3、关键点很重要,在最关键的时候,必须全力一击!
4、富贵险中求,适当冒一点险(风控能力)
5、越早开始存钱,越好
6、打工是发不了财的、但是前期要积累工作经验和锻炼品质,竭尽全力把工作做好!再想办法开拓其他的赚钱方式!
 
基本都是很认同她的说法。
以后需要不断地思考,思考未来。该集中努力的地方得一定努力才行。
 
最后附上视频链接:
https://www.youtube.com/watch?v=094BcDIc0LM
 
  收起阅读 »

github pages是可以被百度检索到的,网上的文章都是瞎扯


 
有图有证。
 
看来还是继续用回github pages吧。
 
 

 
有图有证。
 
看来还是继续用回github pages吧。
 
 

gitee pages 文章需要审核才能发布

最近用gitee pages部署了一个写文字的地方。
 写了一篇关于某国歌手的文章,内容实际只有一句话,配了一张百度图片上出来的贴图。
 
然后按照原来的方法,hexo g -> hexo d
部署到码云gitee上。
 
然后过了一天发现缓存没有更新。
 
第二天,缓存依然没有更新。
 
后面登录上去看了一下,发现说内容违规。我去。
 
原来这个gitee pages 还要这样审核一下才能通过。这样就没多少意思了。 
 
关键这个gitee pages 是每次要git push到服务器后,都要手动在网页端,点一下更新按钮。。。。

遂删除repo了,say bye bye to gitee。
 

 
继续阅读 »
最近用gitee pages部署了一个写文字的地方。
 写了一篇关于某国歌手的文章,内容实际只有一句话,配了一张百度图片上出来的贴图。
 
然后按照原来的方法,hexo g -> hexo d
部署到码云gitee上。
 
然后过了一天发现缓存没有更新。
 
第二天,缓存依然没有更新。
 
后面登录上去看了一下,发现说内容违规。我去。
 
原来这个gitee pages 还要这样审核一下才能通过。这样就没多少意思了。 
 
关键这个gitee pages 是每次要git push到服务器后,都要手动在网页端,点一下更新按钮。。。。

遂删除repo了,say bye bye to gitee。
 

  收起阅读 »

hexo下的markdown文件无法生成html文件

 
hexo下的source/_post/ 下的markdown文件后缀只能md 小写。 大写是识别不到,也就无法生成html文件了。
 
继续阅读 »
 
hexo下的source/_post/ 下的markdown文件后缀只能md 小写。 大写是识别不到,也就无法生成html文件了。
  收起阅读 »