sqlalchemy session 执行 delete 时 synchronize_session 策略
开发中常用的 CSS framework(2015年至今)
自 bootstrap CSS framework 已经成了开发者必不可少的技术选型了,随着移动端的不断发展和日趋复杂化的 UI 交互模式的需要,适应各种场景的 CSS framework 也层出不穷,在此盘点一下个人日常开发时选择的几种 CSS framework,排名不分先后。
purecss
优点
简单实用响应式,提供了 grid 布局、form、menu、 button、table 几种常用组件,无 JavaScript。
适用场景
页面所需组件比较少,适用于只需要比较简单的 form 以及很基础的交互,中大型项目不适合,缺 JavaScript,需要借助第三方 JavaScript 或者自己实现,开发效率差。
bulma
龙珠布尔玛的英文名字?好像是。
优点
mobile first、语义化、模块化、html 结构简洁明确,提供了大量基础性组件,甚至是一般做官方网站使用的 banner、hexo 都有,可以快速构建官网等非常常用的网站样式。
提供了一些非常基础的工具化 class,比如 modifiers 可以直接修改内边距、外边距、边框都常需要改动的地方,非常实用。
开发者友好。
如果 SQLAlchemy model 自增主键等于 0
SQLAlchemy 使用 session 生成新的数据根据主键的不同大致有以下几种情况,其中主键是 0 最为特殊。
测试环境
- SQLAlchemy 1.0.9
- mysql 5.6.27
- pythonn 2.7
无处不在的架构
概念
Architecture
Architecture is both the process and the product of planning, designing, and constructing buildings and other physical structures. —— From wiki https://en.wikipedia.org/wiki/Architecture。
Architecture 意在计划、设计、构建建筑物的过程。
Software architecture
Software architecture refers to the high level structures of a software system, the discipline of creating such structures, and the documentation of these structures…..The architecture of a software system is a metaphor, analogous to the architecture of a building.—— From wiki https://en.wikipedia.org/wiki/Software_architecture
software architecture 和构建一座实体建筑是非常相似的,都具有计划、设计、构建的过程。
创业三年,使用 mongodb 的实践教训
在生产环境中使用 mongodb 始于 2012 年左右,从最初的 master-slave 模式到后来的 master-replication,到评估 mongodb-sharding 并放弃在生产环境中使用,使用 mongodb 作为基础数据库已经服务了上亿用户。在 4 年的 mongodb 生产环境使用当中,踩了很多坑也走了不少弯路,在此记录,与君共享。
No schema 并不代表没有一致性
mongodb 是 nosql 数据库,强调 schema 的灵活性和强大的集群功能,以及牺牲事务带来的巨大性能提升。如果只是用 mongodb 记录日志,一致性并不是很重要,相反如果是关键性业务,鉴于 schema 极强的灵活性,经常会造成 collection 数据结构被变更而且不易察觉,表现的结果是应用程序常会出现诡异而无法深入跟踪原因的 bug 和异常。业务越庞大,这样的改变越是灾难性的。
设计之初就对一致性做出非常严格的校验和控制,好消息是 mongodb 3.2 开始已经从数据库层面支持对 collection 结构的校验。每次表结构调整,都要对历史数据进行相应的变更。
tornado 中的异步调用模式
fundamental concepts
同步
调用者等待调用结果的返回
异步
调用者不等待调用结果的返回,而是通过间隔轮询、通知等方式得知结果
阻塞
调用方式影响后续指令的执行
非阻塞
调用方式不影响后续指令的执行
一般来说,阻塞是绝对的,非阻塞则是相对的,因为任何指令或调用的执行都要占用 CPU 周期,或网络,或 IO。非阻塞只是说调用或者资源消耗不影响后续逻辑执行,他们经得起等待。非阻塞往往和异步一起出现。
tornado 是一个异步非阻塞 httpserver,同时也是一个 web framework。
Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. By using non-blocking network I/O, Tornado can scale to tens of thousands of open connections, making it ideal for long polling, WebSockets, and other applications that require a long-lived connection to each user。
在 tornado 中异步和非阻塞是通过 ioloop 和 Future 实现的,Future 是借助 python 的协程来实现非阻塞调用。tornado 提供了不同的异步调用形式来适配不同的调用场景,本文的目的就是为了说明不同形式是如何使用的以及它们的差别。
为了演示方便,这里使用了一个公共模块 util.py 来提供 ioloop 的启动和销毁,下文不做特殊说明皆是如此。
理解 semantic-ui grid 的使用
semantic-ui 是一套类似于 bootstrap 的 ui framework,相比 bootstrap 有如下优点:
- 组件采用语义化的组织方式,容易理解,容易记忆
- 组件库非常丰富,几乎不需要引入第三方的组件,统一性强
- 由于采用语义化的方式命名,所有组件都有自己的命名空间,相互不受干扰,侵入性弱,对自定义 css 干扰小,bootstrap 则改写了很多元素的默认样式,复写困难
- 自定义容易,semantic ui 的源码中各个组件相互独立,依赖清晰,自定义方便
fundamental concepts
- container
A fixed width container 具有固定宽度的容器 - grid
网格 - column
网格的列 - row
网格的行
固定宽度居中布局
semantic ui 提供容器 container 来快速实现固定宽度居中,使用 container
不需要任何 grid
1 | <div class="ui container"> |
如果需要对一段文本进行固定居中,semantic ui 提供了 text container
Python 编码错误的本质和解决方案
Python 常见编码错误 UnicodeDecodeError 和 UnicodeEncodeError 的原理和解决方案
基础概念
字符
character 构成文本的最小组成单元
字节
byte 数据在计算机内部的存储单元,一个字节等于一个8位的比特,计算机中的所有数据都是由字节组成
字符集
Character set 由多个字符的组成的集合,常见的字符集有ASCII、Unicode、GB2312等
字符编码值
不同的字符集规定了不同的编码规则,编码规则中规定了字符对应的编码值 code point,一个整数值
编码
将字符集中的字符码根据 code point 映射为字节流(byte sequence)的一种具体实现
解码
将字节流解析为字符集中的字符