cusdis--静态网站的评论系统--hexo下应用

image-20210427111929583

看到这个帖子:最近做了一个开源的 Disqus 替代品

感觉不错。部署也简单。

就直接注册了下,用人家服务器(以后抽空再自建吧)搭建下评论系统。当然,咱这种扑街博客,评论别指望我能马上看到审批。

部署的时候坑发现Hexo版本太老了。内置变量和示例不一样。改成:

1
2
3
4
5
6
7
8
9
<div id="cusdis_thread"
data-host="https://cusdis.com"
data-app-id="xxxxxxxxxxxxxxxxxxxxxxxxx"
data-page-id="<%= post.permalink %>"
data-page-url="<%= post.permalink %>"
data-page-title="<%= post.title %>"
style="margin:12px;"
></div>
<script async defer src="https://cusdis.com/js/cusdis.es.js"></script>

也不是不能用……各位读者忍了吧。

Ubuntu 18.04/20.04 下 编译zxing-cpp for python(支持venv)

zxing-cpp简介

zxing是识别生成二维码的工具库,是一个java库。java的JRE开销其实不小,为了加快效率,zxing-cpp是不错的选择。

zxing-cpp,又有多个变种。这里选择zxing官方库推荐的“recent cpp port”库:

image-20210118171552311

准备工作

  • 工作目录创建

    1
    2
    3
    4
    5
    6
    7
    8
    mkdir /srv/zxing-env -p
    cd /srv/zxing-env
    python3 -m venv venv
    . venv/bin/activate # 之后所有的安装都在这个python虚拟环境中
    # 安装几个python的依赖
    # numpy (1.19.5)
    # Pillow (8.1.0)
    pip install numpy pillow

继续阅读···

wekan---丑陋但是强大的Trello替代品

image-20201211095419299

Trello , 强大的看板工具。精美,昂贵。

wekan,更加强大的看板工具。不过,就是有那么点丑……

看着Trello的各种Powerup!收费插件留了一年口水后,终于决定迁移到丑了点的wekan上。

安装步骤:

1
2
3
4
5
snap install wekan
snap set wekan root-url='http://192.168.x.x' # <--- 这个还很重要,wekan设计上有缺陷,不支持host:port模式。期内使用caddy做proxy_pass
snap set wekan port='3001' # <-- 用nginx做个proxy_pass

看惯了Trello的各种小美丽。wekan真是让人郁闷……

不过实在是便宜。而且功能够好。说2个我常用的:

  • 支持子任务
  • 支持自定义字段
  • 支持泳道

各种槽点也不少:

  • 丑。真丑。
  • 文档缺失。
  • 各种小问题,操作差了一丢丢顺畅。
  • 奇葩的模板设计方案。

看到免费的面子上,抽空部署到公网上去。

PS:为啥不用docker?因为snap简单。仅此而已……

PPS:作者很有趣,想要新功能吗?来,这是募资链接,支付500欧,我就马上开工。实在是我辈楷模。

利用自定义上传脚本和Onedrive实现Typora图床

image-20201207151555968

花了点时间,做了个for typora的图床。用的OneDrive相关的Microsoft Graph API。

最后还是老老实实的怂了,用的标准的authorization_code方案。

ToDo List:

  • [x] 基本雏形。(验证,获取token,刷新token,api调试之类的杂活)
  • [x] 适用于windows下的for typora的custom command 图片上传脚本
  • [ ] 脚本需要识别偶尔传入的url
  • [x] 脚本添加文件名后缀,方便typora管理。
  • [ ] 适用与Mac下的for typora的custom command 图片上传脚本(没钱买mac)
  • [ ] 日志系统
  • [ ] 链接持久化需要多次302跳转,目前走的近路,使用了 1drv.ws 的私人服务。
  • [x] 做发布安装工具
  • [ ] 写文档
  • [ ] 入github

嗯。水一篇blog,然后看看效果。(title 图使用的OneDrive 图床,随手截图黏贴到了Typora里面。)

Godot Engine --- 很完美的2D/3D游戏开发引擎

Godot , 开源2D/3D游戏开发引擎。适配 Windows/Mac/Android/IOS/Linux/HTML等平台(貌似就是全了吧……)。

设计很精美。NodeTree的组织方式非常符合一般开发直觉。

GDScript语法简单(有那么点像python),开发也很舒适。

最近躺平阶段偶尔开始看看相关资料,很喜欢这个开发工具。某种简单的GUI程序似乎也可以直接使用这个框架开发。

近期会投入精力学习下。

正则表达式补零--拯救你的播放列表

最近给娃下载各种有声书。费劲写了个爬虫,从喜马拉雅往下爬。

爬书一时爽,整理费老劲。各种不靠谱的标题,只能说明这些up主没有一个有完美强迫症。(参看封面截图)

那么,如何整理文件名,将文件按顺序执行并且对小编号文件补零呢?

贱贱的分割下:

继续阅读···

Python统计List的元素个数

以下两端代码,都可以实现。

Counter虽然强,但是数据量大的时候会比较慢。

自己写的轮子:

1
2
3
4
>>> test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
>>> d = {k:test.count(k) for k in set(test)}
>>> d
{1: 2, 2: 3, 3: 2, 4: 4}

collectionsCounter 方法:

1
2
3
>>> from collections import Counter
>>> Counter(test)
Counter({4: 4, 2: 3, 1: 2, 3: 2})

水一贴测试下 Vercel 的自动脚本。

目前本站已经改为 Vercel 托管。coding 卖给腾讯后,页面托管那叫一个蛋痛……

Python的Bool操作符--奇怪的逻辑但很有用

经常看到下面代码:

1
user_name = form['username'] or 'unknown'

一般来说,or操作符应该返回 bool类型。也就是说,上文代码的user_name 应该是 True 或者 False

php/perl用这种代码多的是,我能理解:

1
foo(bar) or die;

问题是,php/perl不能这么赋值啊……

python的这个逻辑还真挺诡异的……(是的,这种感慨一般来自c/c++程序员,我们较真)。

今日,又看到了类似代码。nnd,查查看。

于是,我得到了这个:

(Note that neither “and” nor “or” restrict the value and type they
return to “False” and “True”, but rather return the last evaluated
argument. This is sometimes useful, e.g., if “s” is a string that
should be replaced by a default value if it is empty, the expression
“s or ‘foo’” yields the desired value. Because “not” has to invent a
value anyway, it does not bother to return a value of the same type as
its argument, so e.g., “not ‘foo’” yields “False”, not “‘’”.)

确实灵活了,也符合人的第一感觉。但是……nnd,一个判断把类型换了到底是什么鬼啊……

不过,话说回来,用的时候……真香……虽然是今日查的,但是我已经用了N久了

就这样,水这么一贴是因为刚刚从半死不活的coding中换了blog服务器。测试下。

V2ray配置前置代理/代理链/链式代理转发

最近需要配置长连接跳板主机。大概的topology是这样的:

主要原因就是防火墙右侧主机设置了白名单,而左侧的服务器创建加密信道穿过防火墙,符合右侧服务器的白名单机制。

VPN配置很麻烦,而且很多国内地区禁用了VPN服务。

所以,用V2ray会简单很多。

V2ray的原理如下:

大概就是,用户主机通过SSR类型的前置代理链接左侧服务器,然后左侧服务器将流量通过VMess协议转发给防火墙右侧服务器。

配置如下:

继续阅读···

Process Substitution---Bash进程替换使用教程

故事起源一次不太愉快的运维面试:

1
2
3
4
5
6
7
8
Me: 一个巨型日志文件,如何一次性统计总行数,包含关键字error和warning的行数?
He: cat log | wc -l; cat log | grep error | wc-l; cat log | grep warning | wc -l
Me: .... , 这不算一次性啊,提示下,tee
He: .... , tee 只支持文件啊...
Me: cat log | tee >(wc -l) >(grep error| wc -l | awk '{printf "error is %s\n",$1}' ) >(grep warning | wc -l awk '{printf "warning is %s\n",$1}') | tee
He: cat log | tee >(...) >(...) 是什么诡异语法?
Me: 传说中的Process substitution啊,blablabla
He: ....

He同学吐槽了我司的奇葩需求后,拂袖而去。当然,主因是我司无法担负期望薪资…

那么,大才He同学不是很明白的诡异语法到底是啥?这里开贴解释一二。

吐槽一下,虽然各路大才都对 *nix下的万物皆文件的理念表示激赏。但真摸清楚文件/文件描述/管道/等基本概念的,还真没几个……

Process Substitution的详细解释,参看 wikimedia 。实际上,认真看完并深入理解后,就可以直接关闭本页。

当然,对这个都没啥很正规中文翻译的feature希望有个快速理解和人话白话理解的话,请继续阅读。

继续阅读···