AngularJS 1.4开始开发, 更多版本有待2015年发布

AngularJS 1.4的相关工作已经开始。在宣布了2.0版本的计划后,开发团队决定继续在1.x版本中开发新功能,并在2015年持续开发。

由于1.4版还在早期开发阶段,目前没有很详细的新特性列表。Brian Ford在他的一篇 博文 里提到了1.4中几个主要的“主题”:

  • New Router
  • Internationalization
  • Forms
  • $http
  • $parse
  • Documentation

来自HeroKu的HTTP API 设计指南(中文版)

API

简介

本指南中文翻译者为@Easy, 他是国内首家互联网人才拍卖网站JobDeer.com的创始人。转载请保留本信息。

本指南描述了一系列HTTP+JSON API的设计实践, 来自并展开于Heroku Platform API 的工作. 本指南指导着Heroku内部API的开发,我们希望也能对Heroku以外的API设计者有所帮助。

目录

基础

  1. 总是使用TLS
  2. 在Accepts头中带上版本号
  3. 通过Etags支持缓存
  4. 用Request-Ids追踪请求
  5. 用Ranges来分页

请求

  1. 返回适当的状态码
  2. 总是返回完整的资源
  3. 在请求body中接收JSON序列
  4. 使用一致的路径格式
  5. 小写所有路径和属性
  6. 支持非ID的参数作为快捷方式
  7. 少用路径嵌套

响应

  1. 总是提供资源(UU)ID
  2. 提供标准的时间戳
  3. 使用ISO8601格式的UTC时间
  4. 嵌入外键数据
  5. 总是生成结构化的错误信息
  6. 显示频率限制的状态
  7. 在所有的响应中压缩JSON数据

文档及其他

  1. 提供机器可读的JSON格式
  2. 提供人类可读的文档
  3. 提供可执行的示例
  4. 描述稳定性

基础

总是使用TLS

总是使用TLS(就是https)来访问API,没有必要指出什么时候需要用,什么时候不需要用,只管任何时候都用它就好。

对所有非TLS的请求返回403 Forbidden,不要用重定向,这会允许一些不良的客户端行为,而又没有任何好处。依赖重定向的客户端会使流量翻倍,而让TLS毫无意义 —— 敏感数据已经在第一次请求时发送出来了。
在Accepts头中带上版本号

从一开始就为API分配版本。使用Accepts头来发送版本信息,可以使用自定义的内容类型,如:

Accept: application/vnd.heroku+json; version=3

不要提供默认版本,而由客户端显式指定它使用哪一个特定的版本。
通过Etags支持缓存

在所有的请求中带上 ETag 头 , 用于识别特定版本的返回资源。用户可以在随后的请求中通过提供If-None-Match头的值来检查内容是否过期。
用Request-Ids追踪请求

在每个API相应中提供Request-Id头,带上一个唯一的UUID值。如果服务器和客户端都记录了这些值,在跟踪和调试请求时会派上大用场。
用Ranges来分页

对所有可能产生大量数据的响应进行分页。使用Content-Range 头来标记分页请求。可以参考这个例子,来了解请求和响应头、状态码、Limit、排序和翻页:Heroku Platform API on Ranges
请求
返回适当的状态码

Python 中的进程、线程、协程、同步、异步和回调

进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?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内核中,两者几乎没有差别,除了一点——线程并不产生新的地址空间和资源描述符表,而是复用父进程的。
但是无论如何,线程的调度和进程一样,必须陷入内核态。

前端工作面试问题集锦

###前端工作面试问题

备注: 这篇文章是从Github上转载的, 原文请参考 这里.

Rebecca MurpheyBaseline For Front-End Developers 是你在准备面试前应该阅读的绝佳资源。

记住: 很多问题都是开放的,可以引发有趣的讨论。这比直接的答案更能体现此人的能力。

目录

  1. 最初的贡献者
  2. 常见问题
  3. HTML 相关问题
  4. CSS 相关问题
  5. JS 相关问题
  6. jQuery 相关问题
  7. 代码相关的问题
  8. 有趣的问题
  9. 其他参考资料
  10. 协议

最初贡献者

这里大部分的面试题都摘抄自 Paul Irish (@paul_irish) 在 oksoclap 创建的帖子,这份原帖的贡献者还有:

16 个 Sublime Text 快捷键

选择

  • 选择一个选中项的下一个匹配项
  • 选择一个选中项的所有匹配项
  • 选择与光标关联的开始和结束标签
  • 选择容器内内容(新)
  • 选择括号内的内容

移动行和文本

  • 上移或下移行
  • 复制行或选中项
  • 增加和减少缩进

剪切和删除,复制和粘贴

  • 剪切行或选中项
  • 粘贴并保持缩进
  • 用标签包裹行或选中项
  • 移除未闭合的容器元素

Django class-based view 深入

上一篇我们粗略介绍了Django中的class-based view基础知识, 本篇我们继续来看关于class-based view的高级应用.

我们继续沿用上篇中的model:

from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Meta:
ordering = ["-name"]
def __unicode__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField('Author')
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()

Django class-based view 基础

自从Django在1.3中新增了class-based view以来,还没有仔细研究它,开始感觉这个东西是否有点多余?因为Django已经有了Generic veiws了啊, 可是仔细看过class-based veiw之后, 这种想法打消了, 因为你完全可以用类方法实现你所有的视图, 而代码阅读起来却更容易!

如果要深入理解class-based view, 那首先就要了解什么是Mixin! Django把基本的http请求和响应抽象出来, 封装成各自的类, 在使用过程中只需把各个基类聚合到一起使用, 并按照自己的要求重写自己需要的方法就可以了, 那么就把这些基类叫Mixin吧. 在Django中比较基础的Mixin主要有几类:

  1. View(视图基础类)
  2. SingleObjectMixin(单对象类)
  3. MultipleObjectMixin(多对象类)
  4. TemplateResponseMixin(模板响应类)
  5. FormMixin(表单类)
  6. YearMixin, MonthMixin, DayMixin, WeekMixin, DateMixin(几个基于时间关系的类)

其他的所有内置class-based view都是把以上几个基础类组合, 重写方法以达到预期的结果. 比如DetailView这个类就组合了SingleObjectTemplateResponseMixin和BaseDetailView. 而在Django官方文档中有比较详细的ListView和DetailView的详细例子和说明, 本文这里就不在重复了, 本文的目的主要集中在官方文档中没有仔细说明的FormMixin上,下面来看例子, 我们就用官网上提供的models:

from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Meta:
ordering = ["-name"]
def __unicode__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField('Author')
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器