在博客养一只猫

从今天起这里多了一只白色,高冷的看门喵。视线会一直跟着你的鼠标,鼠标靠近它就可以撸了! 目前只设定让它在PC出现,在移动端显示有些突兀。 养猫攻略 喵喵基于 live2d 绘图技术,在前端使用canvas绘制。 使用hexo搭建的站点可以直接使用 hexo-helper-live2d 快速养猫 使用 live2d-widget.js 源码导入 打包源码 # 拉取源码 $ git clone https://github.com/xiazeyu/live2d-widget.js.git # 下载依赖 $ yarn # 打包源码 $ npm run build:prod lib文件夹里就是打包成果。 在hugo中使用 将打包后的lib路径中的 L2Dwidget.min.js 文件放到hugo根目录的 static/js 目录中。 在这儿下载喜欢的 live2d 模型放到hugo根目录的 static/live2d_models 目录中。 在当前使用的主题模板中导入和执行以上代码。一般是在 hugo/themes/xx/layouts/partials/script.html 中,这个文件是页面导入的script部分(虽是html文件,但是编辑时不能使用prettier-js格式化,会破坏hugo的模板语法)。 <script src="/js/L2Dwidget.min.js"></script> <script> /** ​ * The init function ​ * @param {Object} [userConfig] User's custom config 用户自定义设置 ​ * @param {String} [userConfig....

July 27, 2020 · 2 min · zakudriver

emacs管理博客写作流程

使用emacs作为hugo博客的客户端 Hugo 生成博客的静态页面虽然已经很方便了,ox-hugo 自动md -> org也很便捷了,但写作和发布博客需要经过若干命令行操作才能完成。没有客户端界面直观。 目前写作和发布的流程 新建org文件 -> balabala并自动转md -> 命令行: $ hugo // 生成静态页面 -> magit stage/commit/push -> 完成 hugo 的 major-mode 插件: easy-hugo easy-hugo 是 emacs 上的 hugo 博客管理的插件。支持markdown or org-mode or AsciiDoc or reStructuredText or mmark or html 等格式文档,多博客多站点,以及多平台部署。 easy-hugo 配置 (use-package easy-hugo :commands easy-hugo :bind (:map easy-hugo-mode-map ("SPC" . general-simulate-C-c) ("G" . kumo-easy-hugo-github-deploy)) :custom (easy-hugo-org-header t) (easy-hugo-basedir kumo/easy-hugo-basedir) (easy-hugo-postdir kumo/easy-hugo-postdir) (easy-hugo-url kumo/easy-hugo-url) (easy-hugo-preview-url kumo/easy-hugo-preview-url) (easy-hugo-github-deploy-script kumo/easy-hugo-github-deploy-script) (easy-hugo-default-ext "....

July 8, 2020 · 2 min · zakudriver

redis发布订阅

redis发布订阅 相比rabbitmq等专业消息队列的缺陷: 没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中。 package main import ( "context" "fmt" "log" "strconv" "time" "github.com/gomodule/redigo/redis" ) // ConsumeFunc consumes message at the channel. type ConsumeFunc func(channel string, message []byte) error // RedisClient represents a redis client with connection pool. type RedisClient struct { pool *redis.Pool } // NewRedisClient returns a RedisClient. func NewRedisClient(addr string, passwd string) *RedisClient { pool := &redis.Pool{ MaxIdle: 10, IdleTimeout: 300 * time.Second, Dial: func() (redis.Conn, error) { c, err := redis....

July 2, 2020 · 3 min · zakudriver

限制goroutine数量

package main import ( "fmt" "sync" "time" ) type Glimit struct { n int c chan struct{} } func New(n int) *Glimit { return &Glimit{ n: n, c: make(chan struct{}, n), } } func (g *Glimit) Run(f func()) { g.c <- struct{}{} go func() { f() <-g.c }() } var wg = sync.WaitGroup{} func main() { number := 10 g := New(2) for i := 0; i < number; i++ { wg....

July 2, 2020 · 1 min · zakudriver

golang gc优化

小对象要合并 函数频繁创建的简单的对象,直接返回对象,效果比返回指针效果要好 类型转换要注意,官方用法消耗特别大。 package string_util import ( "unsafe" ) func str2bytes(s string) []byte { x := (*[2]uintptr)(unsafe.Pointer(&s)) h := [3]uintptr{x[0], x[1], x[1]} return *(*[]byte)(unsafe.Pointer(&h)) } func bytes2str(b []byte) string { return *(*string)(unsafe.Pointer(&b)) } 避免反复创建slice,map func(r*Reader)Read()([]byte,error) // 此函数没有形参,每次调用的时候返回一个[]byte。 func(r*Reader)Read(buf[]byte)(int,error) // 此函数个函数在每次迪调用的时候,会重用形参声明。 避免使用"+“拼接字符串 package string_utils import ( "strings" ) func strAppend(s string, ss ...string) string { var r strings.Builder r.WriteString(s) for _, v := range ss { r.WriteString(v) } return r.String() }

June 23, 2020 · 1 min · zakudriver