民意调查显示,平,PubSub的,pubsubhub,pubsubhubbub
的情况下,你是持怀疑态度,有一个在上面疯狂的方法,在文章标题。 在高科技界,这是不可能,你没有听到pubsubhubbub的。 在快速的几个月中,它一直谈论的事情的前三名之一。 其他两个分别是同态加密和谷歌波 [ 1 ]。 回来到目前的职位 - 在标题上注明你从其他人的内容如何。 以下细节变得更加清晰,如果你能想象博客的事情发生,即使它们概念并不局限于博客。
投票是指在客户端要求服务器,如果新的东西拿出的情况下。 经常要求更新,将始终是一个投票过于频繁或过于频繁的问题,但作为一个读者指出, 在这里 ,一个伟大的 ,投票的事情是该服务器不维护状态。
平是指在发表文章时,您(或您的软件)也更新了一些流行(中央)更新服务的情况下。 这里的一些背景。
接下来是PubSub的发布/订阅,最早的球场之一,因为它是站在这里,埃文亨肖-普拉斯和凯兰埃利奥特-麦克雷(72张幻灯片,但值得经历)。 引人注目的例子,他们给了反对 - 在某一特定日期,FriendFeed上抓取Flickr的290万次,45754用户得到最新的照片,其中6721的24小时访问Flickr和可能潜在的“上传照片。 请注意,他们提出的是不是一种新技术,为他们指出“革命性的新的20岁的技术”。 如果你的博客,然后使用XMPP的主要问题之一 - 存在数据的开销,这可能是高达60-70%,可以减少很多。
pubsubhub代表发布订阅枢纽和pubsubhubbub是一个协议,其中核心是pubsubhub的想法。 其中出版商(比如博客)更新枢纽(驻留“在云的地方”,每个协议,可以推或拉,每协议,但在接下来的环节,可能是多个集线器,互相交谈)链,枢纽到客户端(比如读者)它总是推模型。为pubsubhubbub起点, 这个页面是好的,概述幻灯片都不错。 曾经雄辩的阿尼尔·达什介绍, 这里按钮网页。
另外两个相关的读取webhooks基本上是HTTP回调。 Github上使用它,所以贝宝付款IPN的异步通知,所以许多人。 相关的概念是rsscloud这又是PubSub的枢纽。 按照此链接查看详情。
你可能想知道,在这里写这些点是什么,有两个1。 这些东西都是值得了解,微创至少2。 这个博客是通过Feedburner的,链接在这里启用pubsubhubbub通过appspot使用该WordPress中心现在启用插件和饲料也是pubsubhubbub
-
[ 1 ]。 -很好的入门读完全同态加密, 这是由Bruce Schneier的文章, 这个讲座是或多或少谷歌波浪的唯一来源。
更新- 这个职位说明公共服务器回调的要求如何可以工作的桌面客户端周围使用XMPP网关(pubsubhubbub为)。
有点集会
看完这篇文章有关锁空闲缓冲区,看到使用了CAS(比较和交换),我发布的汇编代码,做同样的感觉。 使用的情况下,那边是写一个本地方法,并调用它从Java(1.5,当在Java并发数据结构不存在或多或少)。 事不宜迟,我会释放到你的代码
。 首先是中科院和计算GCD的第二个是用欧几里德算法(此人可以发现,在许多地方和教程以及)。
编译和运行指示 gcc file_name.c ; ./a.out
比较和交换
#包括#包括 / /交换 - newvalue,comperand是旧的/预期值 / * *函数实际上做以下的事情 - 如果在* dest的值是等于oldvalue然后newvalue其他不改变它取代:做所有这些原子 * *有两个返回值的选项 * 1.is初始值* dest的离开,调用fxn负担比较与OLDVAL * 2。 在这里做,并返回0或1,这应该是更有效 ** / / *后来改变成宏* / INT CAS(INT * dest中,oldvalue,INT newvalue){ 输出(“(%D,为%d,%d个)”,* dest中,oldvalue,newValue)以; / * CAS(目的INT,INT oldvalue,newValue)以{* / / * CAS(INT目的,newvalue INT oldvalue){* / 结果= 1 ;/ * 1可以看出,CAS成功,0表示失败* / / * BTW需要设置标志重挫CC! * / __asm__ __ volatile__( “MOVL%2,%eax中\ N \ T” “MOVL%3,%ebx中\ N \ T” “MOVL%0%ECX \ N \ T” “锁\ N \ T” \ N \ T“CMPXCHG%EBX(%ECX)”/ *应该锁定在同一行* / “JZ \ N \ T” “MOVL $ 0%1 \ N \ T” “DONE:\ N \ T” “M”(DEST),“克”(结果) :“G”(oldvalue),“G”(newValue)以“M”(DEST) :“%eax中”,“%ebx中”,“ECX”,“CC” ); 输出(“(%D,为%d,%d个)”,* dest中,oldvalue,newValue)以; 返回结果; } / *的TODO *写在一个while循环以上fxn了另一个ASM fxn的不断尝试,除非它成功* / 诠释的主要(){ A = 5,B = 6; INT * C =(INT *)malloc的(如sizeof(int)); * C = 6; / * C = 6 * / printf(“请为%d \ N”,CAS(C,B,B)); printf(“请为%d \ N”,CAS(C,B,A)); 输出(“%d个\ N”,CAS(C,A,A)); printf(“请为%d \ N”,CAS(C,B,B)); * C = 6; / * C = 5; * / 输出(“变化值* C至%d条\ n”,* C); printf(“请为%d \ N”,CAS(C,B,B)); printf(“请为%d \ N”,CAS(C,B,A)); 输出(“%d个\ N”,CAS(C,A,A)); printf(“请为%d \ N”,CAS(C,A,B)); printf(“请为%d \ N”,CAS(C,B,A)); 返回0; }
格式化笔记 - 像WP语法高亮似乎增加 在年底,忽视这一点。
最大公约数
#包括GCD INT(INT A,INT B){ int结果; / *计算最大公约数使用Euclid的算法* / __asm__ __ volatile__(“MOVL%1,%eax中;” “MOVL%2,%ebx中;” “cmpl续完:$ 0,%ebx中;” “JE; 的“xorl%EDX,%edx中;” 的“idivl%EBX; “MOVL%%EBX,EAX%; “MOVL%%,%%ebx中EDX; “JMP续完; “DONE:MOVL%eax中,%0”:“克”(结果):(一)“G”,“G”(二) ); 返回结果; } 诠释的主要(){ int的第一,第二; printf的(“请输入两个整数:”); scanf函数(“%d的%d”,与第一及第二); 输出(“%d的%d的最大公约数是%d \ N”,第一,第二,GCD(第一,第二)); 返回0; }
红宝石1层,创建哈希
昨天,同时通过我的老节目之一,我发现我写的一段时间回来:
#begin magic
hash=Hash[*CGI.unescape(raw_text).split('&').map{|x| b=x.split("=");b.push(nil) if b.size==1;b}.flatten]
#end magic
杀一些悬念,让我透露,raw_text看起来像
,权利,它已被切断,从Paypal付款确认。
如果在零件坏了上面的行读取更好:
unescaped_array CGI.unescape(raw_text)。分裂('&') = unescaped_array unescaped_array.collect {| X | B = x.split(“=”); b.push(零)如果b.size == 1;} flattened_array = unescaped_array.flatten 哈希散列[* flattened_array]
让我们做在irb中的各个步骤:
IRB(主):009:0> unescaped_array = CGI.unescape(raw_text)分裂('&') => [“侨”,“mc_gross = 10.00”,“protection_eligibility =不合格”,“payer_id = U7PPJJ4TSJ47E”,“税= 0.00”,“payment_date = 9点45分30秒2009年07月10日,PDT”,“PAYMENT_STATUS =待定“] IRB(主):013:0> unescaped_array = unescaped_array.map {| X | B = x.split(“=”); b.push(零)如果b.size == 1;} => [“侨”,无],[的“mc_gross”,“10.00”],[“protection_eligibility”,“不合格”,“payer_id”,“U7PPJJ4TSJ47E”],[“税收”,“0.00”] [“payment_date”,“9点45分30秒7月10日,2009 PDT”],[“PAYMENT_STATUS”,“待定”。]] IRB(主):014:0> flattened_array = unescaped_array.flatten =>“成功”,无“mc_gross”,“10.00”,“protection_eligibility”,“不合格”,“payer_id”,“U7PPJJ4TSJ47E”,“税法”,“0.00”,“payment_date”,“09:45: 30日2009年07月10日,PDT“,”PAYMENT_STATUS“,”待定“] IRB(主):015:0> 哈希散列[* flattened_array] => {“税”=>“0.00”,“PAYMENT_STATUS”=>“挂起”,“payer_id”=>“U7PPJJ4TSJ47E”,“mc_gross”=>“10.00”,“成功”=>“零”payment_date“= “九时45分三十秒07月10,2009 PDT”,“protection_eligibility”=>“不合格”}
顺便说一句,*被称为红宝石的图示操作员
从“对数组的哈希创建的另一种方法是使用注:
哈希= [1,2],[3,4]注入({})。{|结果,元素|结果element.first] =结果[element.last];结果} 有一个方法
写一个循环,我会留给读者作为练习!
这里是位从阵列创建哈希无关的使用情况:
IRB(主):005:0> [1,2,3,4,7,9] GROUP_BY {| X | X <5? 更低::更大} => {:较小的=> [1,2,3,4]:更大=> [7,9]}
你可以做更多的事情,基本上块的结果作为使用中产生的哈希元素的关键。
Gmail时,mutt和msmtp会修复
如果您使用mutt和SMTP访问Gmail。 这里是(坏)消息。 在谷歌酷哥再次改变证书。 哦,你问 - 如何知道? 简单的小狗开始抱怨自己的证书时,尝试使用的msmpt,臭名昭著的“msmtp会:TLS证书验证失败:证书还没有得到一个已知的发行人 迎接我在屏幕上。
交叉确认 -
只要运行以下
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
在地方老Thwate服务器现在你在发行人段
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
幸运的修复很简单,这里是你需要做的在debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
在此之后只是改变下面一行在你〜/。msmtprc的
tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem
tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem
至
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
在YAML conf文件合并哈希
YAML是相当方便的编写配置文件。 主要优点是,它像文本文件中读取。 这个作品真的很好,如果你的配置文件是平坦的(不分层),并没有重复。
如果您的配置文件中有重复,然后分离出这些元素和重用它们是有意义的。 我的意思是 - 让我们说你的配置文件看起来像这样:
发展: input_location:common_input output_location:dev_location 邮箱: smtp_server:您的服务器 登录:your_login 密码:top_secret 生产: input_location:common_input output_location:dev_location 邮箱: smtp_server:您的服务器 登录:your_login 密码:top_secret
假设上面的代码在/ tmp / test.yml这里你可以看到如何在Python和Ruby
$cat readyml.py
#!的/ usr / bin中/ env的蟒蛇 从pprint为PP进口pprint #Debian中需要安装python-YAML 从的YAML进口负载,load_all,转储 哈希=负载(开放(“/ TMP / test.yml的”)) PP(哈希['发展'])
$ cat readyml.rb
#!/ USR / BIN / env的红宝石 需要“PP” 哈希= YAML的::负载(的File.Open(“/ TMP / test.yml的”)。) PP哈希['发展']
这里是一个方便的Ruby版本的班轮
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]'或者你可以尝试在irb或Python控制台相同。
请注意,在上面的代码片断,一切都以外的输出位置是相同的开发和生产的一部分。 这是YML节点标识符来抢救。 想法很简单,有一组默认值和重写他们在不同的地方。
你可以把它拆开如下:
默认:与默认 input_location:common_input output_location:dev_location 邮箱: SENDER_NAME:发送方 smtp_server:您的服务器 登录:your_login 密码:top_secret 发展: <<:*默认 生产: <<:*默认 output_location:prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
伟大的,它的工作原理(TM)。
可以说,我们交易有点像魔术,一些清晰度。 这里是一个小说明:&,*和<<: - 这是锚标记,可以理解为节点标识符,*是节点的参考和<<:哈希合并。
详细内容见或者YAML规格或维基
到目前为止,那么好,但有一个陷阱,在这里,这些哈希合并不是递归的。 它的意思是这样的:让我们说你要在两个环境不同的邮件发送者的名字,你可能会受到诱惑,做到以下几点:
默认:与默认 input_location:common_input output_location:dev_location 邮箱: SENDER_NAME:发送方 smtp_server:您的服务器 登录:your_login 密码:top_secret 发展: <<:*默认 邮箱: SENDER_NAME:sender_dev 生产: <<:*默认 output_location:prod_location 邮箱: SENDER_NAME:sender_prod
让检查
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
哎呀,出事了,上述问题是不是递归哈希合并,合并时,它取代默认的邮件,邮件只有一个关键的生产。 展开多层次的解决方案/工作大约是:
common_settings:&common_settings input_location:common_input output_location:dev_location mail_defaults:&mail_defaults SENDER_NAME:发送方 smtp_server:您的服务器 登录:your_login 密码:top_secret 默认:与默认 <<:* common_settings 邮箱: <<:* mail_defaults 发展: <<:*默认 生产: <<:*默认 邮箱: <<:* mail_defaults SENDER_NAME:sender_prod
让我们再次检查
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
你说你多了一个嵌套级别,你绝对可以展开一个级别,但后来它变成一个烂摊子。 所以,如果你不尝试写河内塔在conf文件的解决方案,它是更好地挖成YAML或别的东西restucture比conf文件。 但是,这是你的电话了。
有点shell重定向
这里是如何,我们通常做shell重定向
$ ./pgm.sh args >out.txt 2>err.txt
我想稍作修改并运行如下
$ ./pgm.sh args
的要求,输出和错误,应该去一些内pgm.sh计算上ARGS名。 一个典型案例,可能是当日期是ARGS部分。 所以,你想输出到去说/ /目录/ pgm_out_YYYYMMDD.txt 1,
N>file.txt ,即与标准的重定向方式的问题,关联到File.txt文件描述符N是,它仅适用于新的分叉过程,而不是当前进程。
所以
$ echo hi 1>out.txt ; echo hii 。将发送您好out.txt但将打印HII到stdout 2 $ echo hi 1>out.txt ; echo hii
这是其中exec来拯救我们的。 如果我们加上exec 1>somefile.txt然后输出从脚本的其余部分将去somefile.txt
$。/ test.sh将重定向嗨以及作为HII out.txt
$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
同样重定向标准输出以及标准错误,我们会做这样的事情
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp
现在回来重定向从外壳内的一些文件的原始点,让我们说方案计算中的一些变量OUTFILE文件名 ,我们可以有刚刚完成exec 1>$OUTFILE
能够解决当前的问题。 但你可能想通过下面的示例实现“随机存取”shell脚本文件。 从这里的例子是
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
与评论,这个代码是自明的。
-
1,它也可以通过$ ./pgm.sh args >pgm_out`date +%Y%m%d`但想法是生成此文件基础上的一些程序本身的逻辑名称。
2 1 1> out.txt是多余的,但它在这里澄清,我们重定向FD 1
要缩放或不缩放
虽然谈论的数据库水平分区 ,DHH的ROR名利建议,扩大东西可以等待,一定等到您的业务需求需要的点。 他的文章肯定是有意义的小设置说创业。 不是说,创业的,你应该写的演示程序,但因为有一天,你应该专注于服务中只有24个小时,说比失去你的睡眠,担心我的应用程序将如何处理负荷为13.142万美元的1000个用户在更多的履行方式用户。 如果你的许多用户,你就会知道如何调整。 对于初创企业可扩展性是一个很好的问题要解决,但有一个更好的问题,我的意思是任何启动会喜欢碰上这个问题!
杰里米Zawodny在另一个相关的文章中写道,你不应该取决于摩尔先生, 如果您有可扩展性问题。
因为这些物品是指以摩尔定律,我不能不写,摩尔定律必须在计算机科学的最广义的法律之一。 从他原来预测的晶体管密度,这部法律现在举出任何你整个指数增长。



































