他会将第一个参数插入第二个 form 的第二个位置,然后将这个结果再插入第三个 form 的第二个位置,以此类推形成一个嵌套的 form 结构。而 ->> 则总是将参数插入 form 的最后一个位置。观察下我们的 all-keys,会发现数据的变换都发生在函数调用的最后一个位置,很明显,我们应该用 ->>。
<formmethod="get"action="/hello"><%= if @conn.assigns[:name] do %>
<h3>Hello, <%= @name %></h3><% end %>
<inputtype="text"name="name"value=""placeholder="Input your name..."/><buttontype="submit">Submit</button></form>
(def ……defn (fn defn [&form&envname &fdecl];; Note: Cannot delegate this check to def because of the call to (with-meta name ..)(if (instance? clojure.lang.Symbolname)nil(throw(IllegalArgumentException."Fi……(. (var defn)(setMacro))
user=> ^{:doc "this is a doc metadata for the form"}(inspect-called-form 1 2 3){:form (inspect-called-form 1 2 3)}user=> (meta (:form *1)){:doc "this is a doc metadata for the form", :line 23, :column 1}
接下来是配置,Netflix 提供的轮子都是成套的,比如配置它就有 archaius,这又是一个类似过去在淘宝做过的 diamond 的东西,不过他不提供服务端,专心做好客户端的事情。我现在就拿 taobao diamond server + netflix archaius 当做我们的分布式配置方案。 Diamond server 的设计是非常朴素的,也非常可靠,利用域名+多机静态化配置文件的方式,将风险降到最低。
在 clojure 里使用 archaius,当然可以用他的 java 客户端,不过我们过去都在用 environ 做配置,为了将迁移成本降到最低,很直接的想法就是按照 environ 的方式来封装 archaius,这就有了 clj-archaius,使用方式跟 environ 没有什么区别,同时提供了动态注册配置监听器的方法:
1234
(require'[clj-archaius.core:refer:all])(int-env:a)(int-env:not-exists100)(on-int-env:a(fn [](println "The new :a is "(int-env:a))))
流控
原来我们 API 的流控算法简单的基于 memcached 计数器,总所周知,这样的思路无法很好地应对瞬时高峰等情况,也无法做到更精确的控制。
而掌握了 xx 核心科技的精英人群,利用技术更快速更惊人的聚集起大量财富,无论是中国还是美国,贫富差距都在拉大,占领华尔街和占领中环都是一次启示。这就像蒸汽机发明后的工业革命,机器替代人类,将工人阶层压榨到极致,乃至马克思要写《共产宣言》来鼓动无产阶级,但是随着两次世界大战的财富再分配和资本主义的自我改良,财富不均的问题其实得到了重新平衡。而现在,似乎又一个轮回开始了,会诞生什么主义?还是第三次自我毁灭?效率与公平,真是永恒的矛盾。