Permalink
Browse files

fork from blaenk

  • Loading branch information...
linhualai committed Nov 12, 2013
0 parents commit 8d1b1a0b208ddf86f95c9d5a30206306a99ee89a
Showing with 3,924 additions and 0 deletions.
  1. +6 −0 .gitignore
  2. +2 −0 Setup.hs
  3. +1 −0 provider/CNAME
  4. 0 provider/drafts/.gitkeep
  5. BIN provider/favicon.png
  6. BIN provider/images/haskell-logo.png
  7. +76 −0 provider/js/blaenk.js
  8. +7 −0 provider/pages/about.md
  9. +58 −0 provider/posts/360-search.md
  10. +101 −0 provider/posts/continuation-based-thread-in-haskell.md
  11. +26 −0 provider/posts/enterprise-market.md
  12. +122 −0 provider/posts/io-and-monad.md
  13. +174 −0 provider/posts/monad-purpose.md
  14. +48 −0 provider/posts/queens.md
  15. +5 −0 provider/scss/_base.scss
  16. +5 −0 provider/scss/_custom.scss
  17. +8 −0 provider/scss/_parts.scss
  18. +7 −0 provider/scss/base/_color.scss
  19. +4 −0 provider/scss/base/_font.scss
  20. +40 −0 provider/scss/base/_layout.scss
  21. +97 −0 provider/scss/base/_theme.scss
  22. +26 −0 provider/scss/base/_typography.scss
  23. +24 −0 provider/scss/base/_utilities.scss
  24. +43 −0 provider/scss/custom/_color.scss
  25. +10 −0 provider/scss/custom/_font.scss
  26. +21 −0 provider/scss/custom/_layout.scss
  27. +673 −0 provider/scss/custom/_style.scss
  28. +87 −0 provider/scss/parts/_archive.scss
  29. +141 −0 provider/scss/parts/_article.scss
  30. +2 −0 provider/scss/parts/_comment.scss
  31. +5 −0 provider/scss/parts/_footer.scss
  32. +336 −0 provider/scss/parts/_header.scss
  33. +44 −0 provider/scss/parts/_index.scss
  34. +60 −0 provider/scss/parts/_post.scss
  35. +127 −0 provider/scss/parts/_syntax.scss
  36. +4 −0 provider/scss/screen.scss
  37. +530 −0 provider/static/html/convolution-criterion.html
  38. +3 −0 provider/templates/404.html
  39. +4 −0 provider/templates/archive.html
  40. +25 −0 provider/templates/comments-js.html
  41. +6 −0 provider/templates/comments.html
  42. +6 −0 provider/templates/index-post.html
  43. +1 −0 provider/templates/index.html
  44. +119 −0 provider/templates/layout.html
  45. +10 −0 provider/templates/note.html
  46. +5 −0 provider/templates/page.html
  47. +10 −0 provider/templates/post.html
  48. +2 −0 provider/templates/tags.html
  49. +15 −0 readme.markdown
  50. +155 −0 src/Site.hs
  51. +190 −0 src/Site/Fields.hs
  52. +13 −0 src/Site/Filters.hs
  53. +226 −0 src/Site/Pandoc.hs
  54. +27 −0 src/Site/Routes.hs
  55. +59 −0 src/Site/ShellFilter.hs
  56. +96 −0 src/deploy.sh
  57. +32 −0 xl.cabal
@@ -0,0 +1,6 @@
.DS_Store
/site
/site.exe
dist/
generated/
deploy/
@@ -0,0 +1,2 @@
import Distribution.Simple
main = defaultMain
@@ -0,0 +1 @@
veryr.com
No changes.
BIN +206 Bytes provider/favicon.png
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,76 @@
$(function() {
var mobilenav = $('#mobile-nav');
$('html').click(function(){
mobilenav.find('.on').each(function(){
$(this).removeClass('on').next().hide();
});
});
mobilenav.on('click', '.menu .button', function(e){
if (!$(this).hasClass('on')) {
var width = $(this).width() + 42;
$(this).addClass('on').next().css({width: width}).show();
} else {
$(this).removeClass('on').next().hide();
}
}).on('click', '.search .button', function(e){
if (!$(this).hasClass('on')){
var width = mobilenav.width() - 51;
mobilenav.children('.menu').children().eq(0).removeClass('on').next().hide();
$(this).addClass('on').next().show().css({width: width}).children().children().eq(0).focus();
} else {
$(this).removeClass('on').next().hide().children().children().eq(0).val('');
}
}).click(function(e){
e.stopPropagation();
});
var $nav = $('#main-nav .main');
var $search = $('.desk_search');
var hideSearch = function() {
$nav.removeClass('searching');
$search.hide();
};
var showSearch = function() {
$nav.addClass('searching');
$search.show().find('input[type="text"]').focus();
};
$('#search_btn').click(function() {
if ($nav.hasClass('searching')) {
hideSearch();
} else {
showSearch();
}
});
$('.desk_search input[type="text"]').keyup(function(e) {
if (e.keyCode == 27) {
hideSearch();
}
})
// header links
$('.entry-content').find('h1, h2, h3, h4, h5').each(function() {
var $id = $(this).attr('id');
var $text = $(this).text();
$(this).html('').prepend('<a href="#' + $id + '" class="hash">#</a>')
.append('<a href="#' + $id + '" class="header-link">' + $text + '</a>');
});
$('.collapse').not(function() {
return "#" + $(this).attr('id') == window.location.hash;
}).next('.collapsible').hide();
$('.collapse').click(function(e) {
e.preventDefault();
$(this).next('.collapsible').slideToggle('fast');
});
$('sup .footnoteRef').parent().addClass('fn');
$('a[href^="#fnref"]').html('<i class="fa fa-level-up"></i>');
});
@@ -0,0 +1,7 @@
---
title: About
published: 2013-11-12
comments: off
toc: off
---
@@ -0,0 +1,58 @@
---
title: 为什么我觉得 360 搜索能成功
published: 2013-03-03
excerpt:
tags:
---
## 百度
先看看为什么百度能打败 Google.
1. Google 和政府关系不好, 在05, 06年中国人的搜索习惯的开始形成的关键时间点上不间断的被 GFW reset 连接.
2. Baidu 线下工作做得好, 派人挨个网吧给点钱让把首页设成 Baidu. 积级联系代理商拉客户. 这是 Google 不会做, 不屑于做的 "不酷"的事, Baidu 做好了.
可以说是流氓打败了贵族, 也可以说是务实打败了清高.
## 搜索格局为什么难有大变动
这几年不论国内国外, 搜索的格局一直没怎么变. 即使是微软这个财主, 对Bing的持续投入已达数十亿美元, 却依然撬不动 Google 的一点份额. 腾讯 soso 数十亿的投入也如打水漂了. 为什么说 360 就能成事呢?
搜索的技术壁垒基本上没有了, 连盘古, 即刻这些个国家队上场的时候更加说明了这一点. 问题在两边: 用户和客户.
- 用户这边
由于上文说的搜索的技术壁垒基本没有, 结果说就是大家的搜索质量最差不太远, 也就是多索引了些和少索引了些的区别, 因为用户需要的内容一般都在前几页, 所以没什么影响. 那怎么拉用户? 一是用户习惯, 这个不说了; 二是软件预装, 这说是巨头都做浏览器的原因, Google 的浏览器做得好, 微软的做的不好, 所以微软的搜索份额上不去. 腾讯的浏览器做得了不好, 所以搜索上不去, 搜狗的浏览器做得好, 搜索的份额就抢到一点. 360也是. Baidu 浏览器没啥份额, 但是人捆绑插件做得好(:D).
- 客户这边
有了流量怎么变现? 这个各家技术就有区分度了. Facebook 的一名早期员工 Hammerbacher 曾说过这么一句话: \> 我这代人中最聪明的大脑都在思索如何让人们点击广告,很操蛋。
Google 靠的是机器学习, 通过海量的数据挖掘来, 通过用户的搜索习惯来找到用户的兴趣, 把用户再卖给客户. 这个精确程度能决定你变现的能力. 而且是数据量越大, 挖掘越精准, 变现越容易. 所以 Google 和 Baidu 在这方面的优势只会越来越大.
用户那边其实不重要, 客户这边没变现才很致命. 无收入意味得撑不久, 所以 soso 撤了.
## 为什么说 360 能够成功
那就是比百度更加流氓, 更加务实.
1. 拉用户无所不用, "安全卫士" 捆绑 "安全浏览器", "安全浏览器" 捆绑 "安全搜索", 圆环套圆环, 一条龙服务.
2. 别人不敢用的变现手段. 这才是 360 的杀手锏.
我现在也在做广告投放, 海量数据的机器挖掘有个很大的弱点: 无法精确定位一个人. 传统的 Cookie, Flash Cookie, 随着用户改用浏览器, 重装系统, 换新电脑, Ghost 还原就失效了. 给机器挖掘带来很大的杂音, 除在挖掘信息之前需要把不同的 Cookie 合并成一个人, 这个合并是不准确的, 再加上机器挖掘本身就不是很准确, 这样偏差就很大了, 处理起来很困难.
Google 的办法是用 Gmail, Google Reader, Gtalk, Google+, Google Docs 等免费好用的服务让你用, 让你自愿的将自己的搜索数据送给 Google. Baidu 这方面就做得不好, 一直没有像 Google 一样有一个 Gmail ID 打通自己的产品线, 用一个 Google ID 将一个人的行为统一收集起来.
360 的办法就更牛了, 通过客户端直接收集用户的行为: 不管你注册不注册 360 账号, 360 都可以把你的所有行为关联起来, 只要你用了 360 "安全浏览器", 360 "安全卫士", 360 "安全搜索". 这样省去了把不同的 Cookie 合并成一个人这一高难度, 吃力做不好的事情, 精确定位到人, 精准投放广告, 变现能力变得比 Google 还强了.
所以说收集用户隐私是 360 的基因, 所以每日经济新闻发表了一篇[《360 黑匣子之谜——奇虎360“癌”性基因大揭秘》](http://epaper.nbd.com.cn/shtml/mrjjxw/20130226/118530.shtml), 才会让周红衣暴跳如雷, [起诉《每日经济新闻》](http://tech.163.com/13/0228/16/8OQK8N7T000915BF.html), 因为这简直要了 360 的命根子. 这就是为什么 360 在媒体的天天曝光下还要收集用户资料, 这就是 2012 年 [360产品被苹果应用商店全部下架](http://news.163.com/12/0206/18/7PJM5MMR00014JB5.html), 之后还不改, 今年又发生了除 360 云盘外的 [360 全部应用被苹果 从 App Store 下架](http://www.techweb.com.cn/internet/2013-01-26/1273042.shtml).
有人可能会说 Google 也是收集用户隐私, 360 也是收集用户隐私, 用户隐私难道是庙里的尼姑, Google 动得, 我 360 动不得. 这有个区别, Google 收集的只是你搜索和点击和浏览的记录, 而且还提供了工具给你[查看下载](https://www.google.com/settings/exportdata), 让你[删除](https://www.google.com/history/edit?authuser=0). 而且你是自愿给 Google 送过去的, 像很多人知道 Google 在收集信息, 也懒得在每次搜索前退出 Google 帐号. 360 则还收集你硬盘上的数据, 你使用电脑的记录, 还不承认它收集了, 更不要说提供给你查看, 删除的入口.
收集用户隐私违法吗, 这个不好界定, 现在也没有太完善的法律. 在美国去年[Google 就绕过 Safari 隐私控制的行为收集用户隐私被处 2250 万美元的罚款](http://www.guao.hk/posts/google-agrees-to-pay-hefty-22-5m-fine-in-safari-bypass-dispute.html). 美国人的隐私, 欧洲人的隐私是比较金贵的, 所以微软的 [Bing](http://bing.com) 不会有前途. 中国人的隐私, 呵呵. 所以说 360 说 [360 搜索 2015 年份额超 40%](http://mobile.163.com/13/0227/22/8OOM5NRO0011665S.html). 我觉得是可能的, 40% 没有, 30% 总是有的.
## 百度会坐以待毙吗
简单来说答案是会的.
周红衣 做 "免费" 的安全卫士, 杀毒软件, 安全浏览器, 目的不是做活雷锋, 目的就是做搜索, 多年以前的他就只这么盘算的, 只是现在到了他收割的时候了. 你不让他收割能答应吗? 百度家大业大, 这种盗取用户隐私的事一是没能力做(Baidu 没有做客户端的基因), 二是不敢做, 这种会把自己置于风口浪尖的事风险太大(躺着也能竞价排名, 做这么高危的事情做什么?), 搞不好被竞争对手死命宣传, 偷鸡不成蚀把米就惨了. 360 不一样, Nothing to lose, 不做不能变现(参考 Sougou, Bing, Soso), 白做了这么久的雷锋, 做了争议大, 但是很大的可能能变现. 你会选择那样?
@@ -0,0 +1,101 @@
---
title: 在 Haskell 中使用 Continuation 实现单线程并发控制
published: 2012-08-23
excerpt:
tags: Haskell, Scheme
---
之前在 [Section 3.3. Continuations](http://scheme.com/tspl4/further.html#./further:h3) 看到 Scheme 实现的一个用 call/cc 模拟的多任务程序, 还挺好玩的:
~~~ {lang="scheme"}
(define lwp-list '())
(define lwp
(lambda (thunk)
(set! lwp-list (append lwp-list (list thunk)))))
(define start
(lambda ()
(let ([p (car lwp-list)])
(set! lwp-list (cdr lwp-list))
(p))))
(define pause
(lambda ()
(call/cc
(lambda (k)
(lwp (lambda () (k #f)))
(start)))))
(lwp (lambda () (let f () (pause) (display "h") (f))))
(lwp (lambda () (let f () (pause) (display "e") (f))))
(lwp (lambda () (let f () (pause) (display "y") (f))))
(lwp (lambda () (let f () (pause) (display "!") (f))))
(lwp (lambda () (let f () (pause) (newline) (f))))
(start)
~~~
这个程序会不断地输出: \>hey! \>hey! \>hey! \>hey! \>...
## 热身
我估摸着吧, Haskell 里的 callCC 也可以这么玩,不过 Haskell 里面没有副作用,也就没有赋值,这个 `set!` 就需要绕个弯子, 借助 IORef 来实现了。
~~~ {lang="haskell"}
import Control.Monad.Cont
import Data.IORef
main = (`runContT` return) $ do
ref <- lift $ newIORef undefined
callCC $ \k -> lift $ writeIORef ref k
lift $ putStrLn "print once"
continue <- lift $ readIORef ref
continue ()
~~~
稍微解释一下:这个程序会不断地打印 "print once". 程序的执行过程是这样的,callCC 把 callCC 之后的三行代码绑定到 k 上了, 然后把 k 保存到 ref 里面。 这后三行代码呢,打印一个行 "print once", 然后把保存在 ref 里的 k 拿出来,继续执行, 跳转到 callCC 那去了。 这样就形成了一个死循环,不断打印。
## 模拟
接下来就简单了,依葫芦画瓢抡一个 Haskell 版本的 light weight process 了 :
~~~ {lang="haskell"}
import Control.Monad.Cont
import Data.IORef
pause ref = callCC $ \k -> do
lwp ref (k ())
start ref
start ref = do
(t:ts) <- lift $ readIORef ref
lift $ writeIORef ref ts
t
lwp ref t = lift $ modifyIORef ref $ \ts -> ts ++ [t]
main = (`runContT` return) $ do
ref <- lift $ newIORef []
lwp ref . forever $ do
pause ref
lift $ putStrLn "Hello"
lwp ref . forever $ do
pause ref
lift $ putStrLn "World"
start ref
~~~
这个程序呢,不断打印 "Hello World", 几乎就是原来 Scheme 版本的一一对应, 没啥好解释的了。
## 后话
ps: The Scheme Programming Language 真是一本好书。 前三章就把 Scheme 编程的要素讲完了, 包括 Continuation, CPS, 宏定义等都讲透了, 后面九章就是具体解释和应用了。Kent Dybvig 端的是功力深厚,学术一流,工程能力也没话说, Chez petite 编译器不管易用性,性能都是一等一的。话说作者还把这本书公开放在网上了: http://www.scheme.com/tspl4/ , 真的是功德无量哈。SICP 固然是好书,不过里面讲 Scheme 的东西其实不多,看过 SICP 的来看这本,想必会如或至宝。SICP 练就一身内力,不过不好使出来 (小测验: 用 Scheme 编写一个文件读写的程序?), 这本 TSPL 就是教你太极招式的好书。
## 参考文献
1. [The Scheme Programming Language](http://scheme.com/tspl4)
@@ -0,0 +1,26 @@
---
title: 企业级市场
published: 2013-02-20
excerpt:
tags:
---
## 企业级市场
黑莓给人的印象一直是专注于“企业级市场”,近些年在消费市场上节节败退。 与黑莓类似的还的一家公司:微软。微软的 Window Phone 8 发布好久了, Surface RT, Surface Pro 也上市了。但是反响貌似也不是很好,市场占有率一直上不去。这两家公司号称在企业级市场上有独到的优势,它们的消费电子市场上一塌糊涂还情有可原,可是现在他们在企业市场上也被 Google,苹果打得满地找牙,是什么原因呢?
## 到底什么是企业级市场
我浅陋,也不太知道企业级市场是个什么东东。大概估计就是个企业采购的市场。我觉得下面的几个东西的大概就是企业级市场应用了:IBM Lotus, IE 6, 公司服务器上的 RHEL 5。 这些玩意有什么共同特征呢?
1. 版本老,旧,基本上是10年前开发的,N久没更新了
2. 难用,不想用
3. 但是必需要用
那我就明白了,到底什么是企业级市场。往好里说是追求稳定和安全在第一位的市场。一般采用了一个应用以后,会用很长一段时间,替换的成本很大。比如我们服务器上的 Centos 5.5, GCC 4.1.2,7,8年了也不能更新,安装个啥新软件都很费劲,安装一个 GHC 7.6 费了我一天多的时间。说得难听点就是绑架住用户,一旦用了以后要一直用,一直收钱,收钱还贼贵。
这个东西你偷偷做就行了,骗人骗久了,垄断的钱赚的太容易,自己智商也下降了,以为这真的是一个真正存在的“企业级市场”,还把这做为贵司的一个优势来宣传,真真让人笑掉大牙。微软花了天价的广告费宣传 Windows Phone,但是其销售没点起色,不是没有原因的。
差点忘了,还有一家企业在消费市场上不得意,也转向“企业级市场”。这是惠普,把刚买一年的Webos给废了,让无数Palm粉丝心灰意冷。怎么进军这个企业级市场呢?收购Autonomy,不曾想遭Autonomy财务欺诈亏损88亿美元,真是不好好做产品,想去“企业级市场”骗钱,反倒被骗子给骗了,真是活该。
根本就没有什么所谓的企业级市场,企业到底也是由人构成的,企业购买产品到底也是人用的。产品做的不好,想着绑架企业,迟早是要被抛弃的。像苹果没有特地去经营什么企业级市场,被企业内的人自下而上的推动,反而在企业级的销售情况变得越来越好。
Oops, something went wrong.

0 comments on commit 8d1b1a0

Please sign in to comment.