三月沙


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 我的书单

  • 技术编年史

Python 编码错误的本质和解决方案

发表于 Nov 6 2016 | 分类于 python

Python 常见编码错误 UnicodeDecodeError 和 UnicodeEncodeError 的原理和解决方案

基础概念

字符

character 构成文本的最小组成单元

字节

byte 数据在计算机内部的存储单元,一个字节等于一个8位的比特,计算机中的所有数据都是由字节组成

字符集

Character set 由多个字符的组成的集合,常见的字符集有ASCII、Unicode、GB2312等

字符编码值

不同的字符集规定了不同的编码规则,编码规则中规定了字符对应的编码值 code point,一个整数值

编码

将字符集中的字符码根据 code point 映射为字节流(byte sequence)的一种具体实现

解码

将字节流解析为字符集中的字符

阅读全文 »

mysql 不指定 ip 的连接默认都是 localhost

发表于 Oct 14 2016 | 分类于 mysql

问题场景

在本地使用 docker 启动了一个 mysql 容器,并把本地的33067端口映射到容器内 mysql 的 3306,我们假设容器的 ip 地址是 172.17.0.2,使用本地的 mysql 客户端尝试连接容器内部的 mysql 服务。

阅读全文 »

mongodb 单表亿级数据的拆分方案

发表于 Aug 27 2016 | 分类于 mongodb

拆表是一种常见的解决单表数据库瓶颈的方案,在实际的应用场景中能够部分解决单表的写压力和读压力,但是也会带来一些更复杂的影响:

  • 聚合查询变得困难
  • 拆分的键一旦选定,更改会非常困难
  • 拆表的过程要保证线上业务不受影响,操作复杂度高

因此,表的拆分一定要选在恰当的时候进行,过早,付出很大代价也并不会带来性能的提升,过晚,数据量庞大,操作难度加大。

在本次实施的拆分方案中,数据特点是:

  • 单表过亿
  • 业务数据是用户对资源的收藏,结构比较单一
  • 只做单向(用户—>数据)查找,不要求反向(数据—>用户)查找
  • 数据处于实时变更状态(新增、删除、查询等操作并存)
阅读全文 »

如何用 redis 造一把分布式锁

发表于 Aug 20 2016 | 分类于 redis

基本概念

锁

wiki:In computer science, a lock or mutex (from mutual exclusion) is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.
在计算机科学中,锁或互斥量是一种同步机制,用于在多线程执行环境中,强行限制对资源访问。锁常被用于同步并发控制。

简单来讲,锁是用来控制多线程执行对资源的并发访问的。比如当一个资源只允许在任意时刻只有一个执行线程对其进行写操作,那当其他线程要访问资源时,就必须要检查该该资源上是否存在写操作锁,如果存在,必须要等待锁的释放并获得锁之后才能对资源进行访问。

阅读全文 »

python 轮子 turbo 的诞生记

发表于 Jul 23 2016 | 分类于 turbo

turbo 与其说是一个 framework ,不如说是一个后端的解决方案。

turbo 是如何诞生的?

tornado 是异步非阻塞的 web 服务器,同时也是一个 web framework,功能简单但完全够用。

原东家的技术栈是:tornado、mongodb、redis、openresty,最大的服务每天服务的独立用户有上百万。早期大部分项目完全使用 tornado 最原始的方式构建,一个 main 文件包含几百个路由,所有的 handler 分布在十几个大大小小的文件夹下面,项目基本的文件结构包含:

  • 一个抽象的 dal 层(数据抽象)
  • 数据库连接(db)
  • 配置(conf)
  • 工具(utils)
  • 缓存(cache)
  • 第三方库(lib)

随着项目的代码越来越多,多个特性开发常常同时进行,开发人员经常要非常小心地应对代码的更改,即使如此,冲突依然时常发生,代码的可维护性和健壮性日益变差。

创业公司由于业务面临飞速增长,多条业务线齐头并进,开发团队往往要同时维护很多个项目,有的项目生命周期很短,一次活动就结束了,有的项目要对外合作,随合作的结束而结束,有的项目服务新的产品,需要快速构建。不同的项目由不同的开发人员创建,创建项目的方式基本是 copy 旧项目,比较原始,容易出错。项目结构在不同的项目之间的差异随着业务的不同,差别渐渐凸显,重复的功能性代码和工具性代码也逐渐变多。

阅读全文 »

如何理解 Python 浅拷贝和深拷贝

发表于 Jun 18 2016 | 分类于 python

为了让一个对象发生改变时不对原对象产生副作用,此时,需要一份这个对象的拷贝,python 提供了 copy 机制来完成这样的任务,对应的模块是 copy。

浅拷贝:shadow copy

在 copy 模块中,有 copy 函数可以完成浅拷贝。

1
from copy import copy

在 python 中,标识一个对象唯一身份的是:对象的id(内存地址),对象类型,对象值,而浅拷贝就是创建一个具有相同类型,相同值但不同id的新对象。

对可变对象而言,对象的值一样可能包含有对其他对象的引用,浅拷贝产生的新对象,虽然具有完全不同的id,但是其值若包含可变对象,这些对象和原始对象中的值包含同样的引用。

1
2
3
4
5
6
7
8
9
10
11
12
>>> import copy
>>> l = {'a': [1,2,3], 'b':[4,5,6]}
>>> c = copy.copy(l)
>>> id(l) == id(c)
False
>>> l['a'].append('4')
>>> c['b'].append('7')
>>> l
{'a': [1, 2, 3, '4'], 'b': [4, 5, 6, '7']}
>>> c
{'a': [1, 2, 3, '4'], 'b': [4, 5, 6, '7']}
>>>

可见浅拷贝产生的新对象中,可变对象的值在发生改变时会对原对象的值产生副作用,因为这些值是同一个引用。

阅读全文 »

为什么选择 emberjs 开发 dashboard 和 CMS 类系统

发表于 Jun 4 2016 | 分类于 JavaScript

在开始之前,先看一组 github 数据

ember.js

  • star 16291
  • contributors 586
  • releases 181
  • issues 167 open, 4397 closed

https://github.com/emberjs/ember.js

angular.js

  • star 49643
  • contributors 1476
  • releases 169
  • issues 817 open, 6992 closed

https://github.com/angular/angular.js

vue.js

  • star 19883
  • contributors 69
  • releases 137
  • issues 27 open, 2252 closed

https://github.com/vuejs/vue

react.js

  • star 43026
  • contributors 713
  • releases 46
  • issues 480 open, 2843 closed

https://github.com/facebook/react

riot.js

  • star 9565
  • contributors 138
  • releases 137
  • issues 96 open, 1089 closed

https://github.com/riot/riot

注: 统计时间为本文编写之时

emberjs 和其他同类框架一样,至少在 github 的 表现足以证明其流行度是不低的,但各个框架的诞生的场景以及解决的问题又不尽相同。

emberjs 是基于 jquery 的一个全栈式前端框架,它提供了从路由层-> view 层->数据和网络交互层的全部解决方案,只用 emberjs 就足以解决前端单页应用遇到的所有复杂问题,而且兼具有不俗的开发效率和开发质量。

阅读全文 »

如何理解 Python 的模块查找原理与方式

发表于 May 28 2016 | 分类于 python

基础概念

module

模块, 一个 py 文件或以其他文件形式存在的可被导入的就是一个模块

package

包,包含有 __init__ 文件的文件夹

relative path

相对路径,相对于某个目录的路径

absolute path

绝对路径,全路径

路径查找

python 解释器查找被引入的包或模块

Python 解释器是如何查找包和模块的

Python 执行一个 py 文件,无论执行的方式是用绝对路径还是相对路径,interpreter 都会把文件所在的 directory 加入 sys.path 这个 list 中,Python 就是在 sys.path 中查找包和模块的,sys.path 中的内容本身又是又 Python 的环境变量决定。

阅读全文 »

程序人生的第一件艺术品

发表于 Jan 12 2016 | 分类于 程序人生

没有一点儿疯狂,生活就不值地过,同样,没有一件自己的艺术品,程序人生就是不完整的

我不是一个善于总结的人,因为看着自己的过去,就如同对着镜子不断检视自己犯得错误,数落那曾经的幼稚和愚蠢,徒增懊恼。

但是掺杂程序的人生却必须不断地审视,重构,一旦对bug恣意放纵,不管不问,这样的人生必将坎坷不断,难以运转。

所以这算是一篇象征性的总结,对某一段程序人生的重构和梳理,为的是让自己不至于看得不明不白,将来别人接管时,也能一目了然,这是对程序人自己起码的要求,也是对别的程序人起码的尊重。

我原以为可以用代码写诗,但是敲出来的只是烦躁和不安

阅读全文 »

如何尊重程序员

发表于 May 12 2015 | 分类于 程序人生

很显然,这是一个已经被多次提及并讨论的话题了,但今天还要再讲讲。

和朋友们聊天,经常会吐槽那些完全不懂得尊重程序员的产品经理和其他互联网从业者。这些人基本可以分为以下几类。

阅读全文 »
1…121314
三月沙

三月沙

135 日志
28 分类
113 标签
GitHub
© 2024 三月沙
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.2