SHUHARI 的博客

流光飞舞

Qt LTS 将只对商业用户开放

2020-01-29
Qt
Qt

在公布新版(5.14.1)的同时,Qt 官方同时也释出了这样的信息:Qt LTS 及安装包将只对商业用户开放。具体内容可参考 Qt offering changes 2020,主要声明如下:

  • Installation of Qt binaries will require a Qt Account
  • Long-term-supported (LTS) releases and the offline installer will become available to commercial licensees only
  • New Qt offering for start-ups and small businesses for $499/year

2020 新版网站发布

2020-01-29

在 2020 年的第一个月将近结束的时候,本站今年的第一个新版发布了。

本次重写在架构上最大的变更,是网站的 Web 框架从 Django 换到了 Flask。以前我也说过,和 Flask 比起来,Django 才是对初学者更友好的框架;但是当你经验增多以后,Django 的部分特性(尤其是用户验证和 Admin)复杂且封闭、难于扩展的缺点就会凸显出来,这时候 Flask 就会成为一个更为灵活和开放的选择。然而我对 Flask 也不是完全满意,就像我在 上一篇文章 抱怨过的,Flask 自身在架构设计上也有一些问题,如果不小心规划的话,很容易造成强耦合与循环依赖的问题。好在了解内部机制以后,上述问题多少都是可以规避的。

Flask 问题:Blueprint 的 template_folder 设置不起作用

2020-01-07

按照规定,Flask 的模板默认放在 app 所属的 templates 子目录下,但也可以通过构造参数 template_folder (以及类似的 static_folder)来修改。同时,在 Blueprint 的构造方法中也包含同样的 template_folder/static_folder 参数。我从前并未真正修改过这些参数,按照一般的理论推测,既然 Blueprint 提供了这些参数,那么它应该覆盖 app 级别的配置才对。

这几天要写一个 Flask 程序,由于相关模块较多,都堆在一起找起来很麻烦,也容易产生无疑的耦合。因此我考虑采用另外一种代码布局,即把每个 Blueprint 和它所使用的模板一起存放,同时和其他模块分离开来。哪知道,修改以后才发现这样无法工作:不管怎么配置 App/Blueprint 的参数,所有 index.html 都会显示同一个页面。

Visual Studio Code 的 “圣诞帽” 风波

2019-12-19

不知大家是否还记得一年以前的 Ant Design “圣诞彩蛋” 事件,这个彩蛋带给程序员的不是惊喜,而是惊吓。(关于该事件的讨论可以参见知乎问题 如何看待 Ant Design 圣诞节彩蛋事件? )时隔一年,“圣诞彩蛋” 再次惹祸,不过这次翻车的不是阿里,而是风头正劲的微软 Visual Studio Code 团队。令人略感欣慰的是,这次事件只影响到 VSCode 本身,而不至于给使用 VSCode 的产品带来什么麻烦。

你在 GitChat 上的文章该如何标价?

GitChat 给了作者自己定义价格的权利,然而有些作者却因此犯难了,不知道为自己的文章标什么样的价格才合适。

我自己偶尔也会抓取 GitChat 的一些数据,因此分享一下自己获得的一些信息与数据分析的结果,给这些朋友提供一些参考。

本文的图表都是用 Matplotlib 创建的。由于本文只关心数据,并未在外观的美化上多下功夫,所以图表的界面都比较粗糙,请读者朋友们不要介意。

迷惑行为:Win10 中的 Python

2019-11-30

最近在使用 Python 的时候发生了很奇怪的现象:从命令行执行 python.exe 并不会进入 REPL,似乎也没有其他反应,然而稍等片刻,会看到系统弹出 Windows Store 页面,并定位到 Python App 的详情页。

Python launch Windows Store

这个现象让我很是迷惑了一下,还以为是 Python 运行环境出了什么状况,但很快反应过来,从现象看,应该是 Windows 搞的鬼。

让多个 Github 仓库使用相同的 Deploy Key

2019-11-19

相信在同一机器上部署多个应用并不是什么罕见的需求,特别是像我这样很小的个人网站来说更是如此。但在我部署子站的时候发现一个问题,那就是 Github 并不允许多个仓库使用相同的 Deploy Key。如果你尝试这样做的话,会得到如下提示:

Deploy Key Already Exist

但我又需要 Deploy Key 来简化项目的部署,其他方式(包括每次更新时手工输入,或者用明文记录 Github 登录信息)都是不可接受的。那应该怎么办呢?稍加检索,找到了如下的方法,记此备考。

说透 CSV 格式

2019-10-19

CSV 这么简单的格式,需要单独一篇文章来说明吗?其实细节隐藏在魔鬼之中,我们过去的团队在生成 CSV 内容的时候,由于兼容性问题也是吃过苦头的。因此,我觉得还是有必要写一篇文章,从各个方面把这个格式彻底讲透。

本文将介绍:

  • CSV 格式的来源、历史背景和规范化情况;
  • 规范化的 CSV 格式要求与实际支持情况;
  • Python 内置库与第三方库处理 CSV 的接口与细节;
  • 处理 CSV 格式应该注意的常见问题和注意事项。

简单解决大型 Flask 蓝图的路由划分

2019-10-15

Flask 框架提供了蓝图(Blueprint)的概念,作为划分大型网站的主要工具。但对于地址较为复杂的网站,仅靠 Blueprint 仍然是不够的。以个人博客为例,如果我们把它规划为个人网站的一个子分区,那么很自然地会设置一个 url_prefix='/blog' 的蓝图。但 blog 下面可能不只是一个简单的平面结构,还会有更多的层次,类似这样:

  • /blog/post/
  • /blog/post//edit
  • /blog/post//comments
  • /blog/category
  • /blog/category/
  • ...

当然,我们仍然可以逐项在路由中添加必要的前缀,但是这样显然违反了 DIY 原则。有没有办法将 Blueprint 再进行细分呢?

说说 Flask 中的 Signal

概述

信号(Signal)是 Flask 中一个比较鲜为人知的功能,在官方文档中也对此着墨不多。的确,Signal 并不是 Flask 的核心功能————你完全可以在不使用 Signal 的前提下写出完整的 Flask 应用。但在某些场景下,使用 Signal 有助于避免代码中不必要的耦合,提高可维护性;并且,部分工程化实践,比如针对特定逻辑进行的测试,需要借助 Signal 的帮助才能完成(后面我们会看到一个具体的例子)。因此,本文将帮助你了解什么是 Signal,它的原理、使用方法,以及它在 Flask 中有哪些实际应用。