HTTP 缓存策略解析

做项目的时候遇到过需要将静态资源长期缓存的情况,因为在我们的需求里,最初一个静态资源上传完毕,针对此链接一次发布终生受益——于是乎,是时候研究一波缓存策略了:

我们都知道缓存状态码:304 Not Modified. 然而实际上,命中缓存也不一定是 304 的。

我们这里先要说明 HTTP Response 头中的 cache-control 的几种不同类型或者说关键词:no-cache / no-store / public / private / max-age

- 阅读剩余部分 -

编译原理从零到一 写一个 JSON parser

最近在做 Chrome 插件的高级功能,突然想要试试可视化选择 key 的路径,再一想,咦,这不就是个编译原理的典型例题吗?

于是我就开始着手学编译原理了,主要参考 dalao 的以下两篇文章:

编译原理一共分为四个部分:词法分析,语法(文法)分析,语义分析,代码生成。

词法分析,就是逐个解析之后加上词性,语法分析则是将词法分析后的结果解析为抽象语法树,语义分析是在语法分析时针对具体的实例加上额外的动作解释。具体的可以见上面的链接。

JSON 的首页有非常完整的词法和语法分析的 token 列表甚至是流程图,所以可以省去了一些劳动。

- 阅读剩余部分 -

学生开发者教育福利一览

一直想在毕业之前整理一下相关资源,造福一下学弟学妹嘛。

其实免费的、廉价的资源还是有很多的,完全不必去费劲心机找破解版或者使用便宜不好用的资源,支持正版嘛。

GitHub Education Student Developer Pack

不是所有的 edu.cn 邮箱都能免费秒过的,基本上像我们这样的辣鸡大学还是需要人工绑定邮件,认真填写申请理由(如果不会请去找谷歌翻译)。

认证通过后,你将获得一年的资源使用机会,如果一年之后还需要,请重新申请:

申请网址:https://education.github.com/pack

- 阅读剩余部分 -

使用 mongo-connector 同步 MongoDB 数据库到 ElasticSearch

在做毕设的时候,有一个需求,需要把 MongoDB 的数据同步到 ElasticSearch,于是发现了这个 mongo-connector

mongo-connector 可以把 MongoDB 的数据同步到 Solr、ElasticSearch 或者另一个 MongoDB。
支持 Python 2.6, 2.7, 3.3+ 、 MongoDB 版本 2.4, 2.6, 3.0, 3.2, and 3.4.

其实官方 Get Started 也挺清楚的,但是用的时候还是会遇到一些非常智障的问题。

- 阅读剩余部分 -

MongoDB aggregate 入门

本文可能随着 MongoDB 使用技能的增长而更新,因为 aggregate 可以做的事情太多啦。

在 MongoDB 中,最强大的工具无异于 aggregate,aggregate 接受一个数组,数组的每一项都是管道(pipeline)对象。

管道的概念我们在 Linux 中也遇到过,可以把前面的返回值作为后者的输入值操作。

- 阅读剩余部分 -

MongoDB 初窥

这周开始由于项目的原因正式接触 MongoDB,之前稍微看过一点,但没怎么正式用过,一方面是设计思维牢固的钉死在了关系数据库的三大范式上(第四和 BC 有点过了……),另一方面是没有一个机会去做 PHP 以外的站(嗯,因为黄金搭档……)。

所以兜兜转转,稍微介绍一下 MongoDB 的一些事。

引言

MongoDB 是一个 NoSQL (Not Only SQL) 的数据库,提供面向文档的存储,操作简单,天生的分布式,带文件存储功能(GridFS)。

- 阅读剩余部分 -

Xcode 编译 Weex Playground 到 iOS 设备

作为不懂 iOS 开发的萌新,Weex Playground 的 App Store 版本现在还不能运行 Vue 版本,实在是苦大仇深,原生自然比模拟器爽一些,所以试了一下编译到自己的手机上,步骤如下:

首先,git clone git@github.com:alibaba/weex.git

然后如同文档介绍的:

npm install
./start

- 阅读剩余部分 -

双端队列 Deque 与 随机化队列 RandomizedQueue 的实现

双端队列,也就是栈和队列的结合,同时可以从头和尾进行进出栈 / 队列的功能,看一下他的数据结构就懂了:

public class Deque<Item> implements Iterable<Item> {
   public Deque()                           // construct an empty deque
   public boolean isEmpty()                 // is the deque empty?
   public int size()                        // return the number of items on the deque
   public void addFirst(Item item)          // add the item to the front
   public void addLast(Item item)           // add the item to the end
   public Item removeFirst()                // remove and return the item from the front
   public Item removeLast()                 // remove and return the item from the end
   public Iterator<Item> iterator()         // return an iterator over items in order from front to end
   public static void main(String[] args)   // unit testing (optional)
}

双端队列的实现还是比较简单的(虽然实际上还会是踩了一些微小的坑)。

- 阅读剩余部分 -