AngularJS 1.4的相关工作已经开始。在宣布了2.0版本的计划后,开发团队决定继续在1.x版本中开发新功能,并在2015年持续开发。
由于1.4版还在早期开发阶段,目前没有很详细的新特性列表。Brian Ford在他的一篇 博文 里提到了1.4中几个主要的“主题”:
- New Router
- Internationalization
- Forms
- $http
- $parse
- Documentation
简介
本指南中文翻译者为@Easy, 他是国内首家互联网人才拍卖网站JobDeer.com的创始人。转载请保留本信息。
本指南描述了一系列HTTP+JSON API的设计实践, 来自并展开于Heroku Platform API 的工作. 本指南指导着Heroku内部API的开发,我们希望也能对Heroku以外的API设计者有所帮助。
目录
基础
- 总是使用TLS
- 在Accepts头中带上版本号
- 通过Etags支持缓存
- 用Request-Ids追踪请求
- 用Ranges来分页
请求
- 返回适当的状态码
- 总是返回完整的资源
- 在请求body中接收JSON序列
- 使用一致的路径格式
- 小写所有路径和属性
- 支持非ID的参数作为快捷方式
- 少用路径嵌套
响应
- 总是提供资源(UU)ID
- 提供标准的时间戳
- 使用ISO8601格式的UTC时间
- 嵌入外键数据
- 总是生成结构化的错误信息
- 显示频率限制的状态
- 在所有的响应中压缩JSON数据
文档及其他
- 提供机器可读的JSON格式
- 提供人类可读的文档
- 提供可执行的示例
- 描述稳定性
基础
总是使用TLS
总是使用TLS(就是https)来访问API,没有必要指出什么时候需要用,什么时候不需要用,只管任何时候都用它就好。
对所有非TLS的请求返回403 Forbidden,不要用重定向,这会允许一些不良的客户端行为,而又没有任何好处。依赖重定向的客户端会使流量翻倍,而让TLS毫无意义 —— 敏感数据已经在第一次请求时发送出来了。
在Accepts头中带上版本号
从一开始就为API分配版本。使用Accepts头来发送版本信息,可以使用自定义的内容类型,如:
不要提供默认版本,而由客户端显式指定它使用哪一个特定的版本。
通过Etags支持缓存
在所有的请求中带上 ETag 头 , 用于识别特定版本的返回资源。用户可以在随后的请求中通过提供If-None-Match头的值来检查内容是否过期。
用Request-Ids追踪请求
在每个API相应中提供Request-Id头,带上一个唯一的UUID值。如果服务器和客户端都记录了这些值,在跟踪和调试请求时会派上大用场。
用Ranges来分页
对所有可能产生大量数据的响应进行分页。使用Content-Range 头来标记分页请求。可以参考这个例子,来了解请求和响应头、状态码、Limit、排序和翻页:Heroku Platform API on Ranges
请求
返回适当的状态码
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生?
在刚刚结束的 PyCon2014 上海站,来自七牛云存储的 Python 高级工程师许智翔带来了关于 Python 的分享《Python中的进程、线程、协程、同步、异步、回调》。
一、上下文切换技术
简述
在进一步之前,让我们先回顾一下各种上下文切换技术。
不过首先说明一点术语。当我们说“上下文”的时候,指的是程序在执行中的一个状态。通常我们会用调用栈来表示这个状态——栈记载了每个调用层级执行到哪里,还有执行时的环境情况等所有有关的信息。
当我们说“上下文切换”的时候,表达的是一种从一个上下文切换到另一个上下文执行的技术。而“调度”指的是决定哪个上下文可以获得接下去的CPU时间的方法。
进程
进程是一种古老而典型的上下文系统,每个进程有独立的地址空间,资源句柄,他们互相之间不发生干扰。
每个进程在内核中会有一个数据结构进行描述,我们称其为进程描述符。这些描述符包含了系统管理进程所需的信息,并且放在一个叫做任务队列的队列里面。
很显然,当新建进程时,我们需要分配新的进程描述符,并且分配新的地址空间(和父地址空间的映射保持一致,但是两者同时进入COW状态)。这些过程需要一定的开销。
进程状态
忽略去linux内核复杂的状态转移表,我们实际上可以把进程状态归结为三个最主要的状态:就绪态,运行态,睡眠态。这就是任何一本系统书上都有的三态转换图。
就绪和执行可以互相转换,基本这就是调度的过程。而当执行态程序需要等待某些条件(最典型就是IO)时,就会陷入睡眠态。而条件达成后,一般会自动进入就绪。
阻塞
当进程需要在某个文件句柄上做IO,这个fd又没有数据给他的时候,就会发生阻塞。具体来说,就是记录XX进程阻塞在了XX fd上,然后将进程标记为睡眠态,并调度出去。当fd上有数据时(例如对端发送的数据到达),就会唤醒阻塞在fd上的进程。进程会随后进入就绪队列,等待合适的时间被调度。
阻塞后的唤醒也是一个很有意思的话题。当多个上下文阻塞在一个fd上(虽然不多见,但是后面可以看到一个例子),而且fd就绪时,应该唤醒多少个上下文呢?传统上应当唤醒所有上下文,因为如果仅唤醒一个,而这个上下文又不能消费所有数据时,就会使得其他上下文处于无谓的死锁中。
但是有个著名的例子——accept,也是使用读就绪来表示收到的。如果试图用多个线程来accept会发生什么?当有新连接时,所有上下文都会就绪,但是只有第一个可以实际获得fd,其他的被调度后又立刻阻塞。这就是惊群问题thundering herd problem。
现代linux内核已经解决了这个问题,方法惊人的简单——accept方法加锁。
(inet_connection_sock.c:inet_csk_wait_for_connect)
线程
线程是一种轻量进程,实际上在linux内核中,两者几乎没有差别,除了一点——线程并不产生新的地址空间和资源描述符表,而是复用父进程的。
但是无论如何,线程的调度和进程一样,必须陷入内核态。
Awesome Django
这篇文章收集的关于django app大多是很有参考意义的, 所以在此备份下, 以供以后参考.(原文在Github)
- Awesome Django
- Admin Interface
- Asset Management
- Authentication
- Authorization
- Caching
- Compatibility
- Debugging
- Fields
- File Transfers
- Forms
- Migrations
- Mobile Support
- Model Extensions
- Project Management
- RESTful API
- Search
- Security
- Settings
- Storage
- Tagging
- Task Queue
- Testing
- Thumbnail
- Cropping Images
- Translations
- Web frontend integration
- Wiki apps
- Workflows
- Other
- Projects
- Resources
- Contributing
###前端工作面试问题
备注: 这篇文章是从Github上转载的, 原文请参考 这里.
Rebecca Murphey 的 Baseline For Front-End Developers 是你在准备面试前应该阅读的绝佳资源。
记住: 很多问题都是开放的,可以引发有趣的讨论。这比直接的答案更能体现此人的能力。
目录
最初贡献者
这里大部分的面试题都摘抄自 Paul Irish (@paul_irish) 在 oksoclap 创建的帖子,这份原帖的贡献者还有:
- @bentruyman - http://bentruyman.com
- @cowboy - http://benalman.com
- @ajpiano - http://ajpiano.com
- @SlexAxton - http://alexsexton.com
- @boazsender - http://boazsender.com
- @miketaylr - http://miketaylr.com
- @vladikoff - http://vladfilippov.com
- @gf3 - http://gf3.ca
- @jon_neal - http://twitter.com/jon_neal
- @wookiehangover - http://wookiehangover.com
- @darcy_clarke - http://darcyclarke.me
- @iansym
选择
- 选择一个选中项的下一个匹配项
- 选择一个选中项的所有匹配项
- 选择与光标关联的开始和结束标签
- 选择容器内内容(新)
- 选择括号内的内容
移动行和文本
- 上移或下移行
- 复制行或选中项
- 增加和减少缩进
剪切和删除,复制和粘贴
- 剪切行或选中项
- 粘贴并保持缩进
- 用标签包裹行或选中项
- 移除未闭合的容器元素
上一篇我们粗略介绍了Django中的class-based view基础知识, 本篇我们继续来看关于class-based view的高级应用.
我们继续沿用上篇中的model:
自从Django在1.3中新增了class-based view以来,还没有仔细研究它,开始感觉这个东西是否有点多余?因为Django已经有了Generic veiws了啊, 可是仔细看过class-based veiw之后, 这种想法打消了, 因为你完全可以用类方法实现你所有的视图, 而代码阅读起来却更容易!
如果要深入理解class-based view, 那首先就要了解什么是Mixin! Django把基本的http请求和响应抽象出来, 封装成各自的类, 在使用过程中只需把各个基类聚合到一起使用, 并按照自己的要求重写自己需要的方法就可以了, 那么就把这些基类叫Mixin吧. 在Django中比较基础的Mixin主要有几类:
- View(视图基础类)
- SingleObjectMixin(单对象类)
- MultipleObjectMixin(多对象类)
- TemplateResponseMixin(模板响应类)
- FormMixin(表单类)
- YearMixin, MonthMixin, DayMixin, WeekMixin, DateMixin(几个基于时间关系的类)
其他的所有内置class-based view都是把以上几个基础类组合, 重写方法以达到预期的结果. 比如DetailView这个类就组合了SingleObjectTemplateResponseMixin和BaseDetailView. 而在Django官方文档中有比较详细的ListView和DetailView的详细例子和说明, 本文这里就不在重复了, 本文的目的主要集中在官方文档中没有仔细说明的FormMixin上,下面来看例子, 我们就用官网上提供的models:
当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器