??xml version="1.0" encoding="utf-8" standalone="yes"?>福彩快乐12开奖结果:BlogJava-xiaomage234-随笔分类 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/category/28303.html生命本就是一次凄美的漂流,记忆中放不下的,永远是孩提时代的那一份浪漫与纯真?/description>zh-cnWed, 13 Apr 2016 06:07:23 GMTWed, 13 Apr 2016 06:07:23 GMT60Jquery Ajax和getJSON获取后台普通Json数据和层级Json数据解析 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2016/04/13/430074.html小马?/dc:creator>小马?/author>Wed, 13 Apr 2016 05:47:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2016/04/13/430074.html//www.ot7t.com.cn/xiaomage234/comments/430074.html//www.ot7t.com.cn/xiaomage234/archive/2016/04/13/430074.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/430074.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/430074.html阅读全文

]]>
activemq 监控 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2015/12/24/428817.html小马?/dc:creator>小马?/author>Thu, 24 Dec 2015 11:18:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2015/12/24/428817.html//www.ot7t.com.cn/xiaomage234/comments/428817.html//www.ot7t.com.cn/xiaomage234/archive/2015/12/24/428817.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/428817.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/428817.htmlfrom:https://m.oschina.net/u/719192?ft=&p=2

现在很多公司都遵循一个准则,没有监控的程序不能上线,可见监控的重要性。这里先介绍下ActiveMQ都需要监控的内容?/p>

监控硬件物理空间是否充足?/strong>

ActiveMQ?个重要的参数,存储空间百分比,内存空间百分比和临时空间百分比。这三个参数的意义很明显,如果值到?00,则表明硬件空间已满,Broker不能再接受任何的消息了,除非有消息消费并且删除,Broker才可以再接收消息?/p>

如果这些值长时间都比较高,接近阀值,则表示硬件的配置不能满足要求,建议更换硬件,或者给予ActiveMQ的环境配置比较小,建议给予更多的资源给ActiveMQ?/p>

如果平时保持在一个稳定值,有一段时间突然增高,则有两种可能。一种可能是用户量大增(当然大家都希望是这样),另一种可能是某个或者某几个消息消费者死机了。需要人工干预重启?/p>

还有一种可能是平时保持在一个稳定值,但是一段时间内突然降低了,则表示消息的生产者可能出现问题了?/p>

监控队列?/strong>

如果ActiveMQ使用队列,需要监控队列的未消费消息数量,消费者数量,消息入队和出队的数量?/p>

未消费消息数量的含义和监控硬件的内存和硬盘空间差不多,过多的消息堆积可能是有消息消费者死机?/span>

消费者数量应该是一个相对固定的值,这个值减少,就直接表示有的消费者已经死机?/span>

消息入队和出队数量如果增长缓慢或者不增长,则表示消息发送者已经死机。一般是通过增量监控?/p>

监控主题?/span>

如果ActiveMQ使用主题,需要监控的内容和队列相似,但是没有未消费的消息数量。这里指的注意的是,ActiveMQ提供Advisory Message,用于帮助使用统计一些额外信息,详细情况在后面介绍?/span>

监控订阅者:

同样,如果ActiveMQ使用主题,订阅者的信息就十分重要。需要监控已经下线的订阅者?/span>


介绍完需要监控的内容,下面介绍一下ActiveMQ提供的几种监控方法?/span>

Web Console监控?/strong>

之所以先介绍这个,是因为Web Console是最简单的,不需要任何配置就能使用的监控方式。同时也是最直观的监控方式?/p>

直接在浏览器访问//activemq-host:8161/admin/?span style="font-size: 12.5px;">把localhost换成你activemq启动机器的ip,端口号默认?161,可以在${ACTIVEMQ_HOME}/conf/jetty.xml中修改。默认的用户名和密码都是admin?/span>

进入页面首先看到


其中下面的红色框中标示出的就是硬件物理空间?/p>

然后点击上面红色框可以进入队列的监控页面?/p>

可以看到上面所提到的队列的一些重要数据。点击傍边的Topics可以进入主题监控页面,大致差不多,就不截图了?/span>

下面看一下订阅者监控界面?/span>

需要重点关注的是中间红色框圈住的部分,是离线的订阅者?/span>

这样的页面一目了然,非常适合人类观看。但是缺点是,不适合程序直接抓数据,写监控脚本,自动报警等。这时你一定发现了这张图右边红色框部分。分别提供了队列,主题和订阅者的xml数据,下图是队列的xml数据?/p>

这样就便于程序去访问这些数据。但是缺点是数据不够全,且xml也不如json容易解析,用shell脚本解析的话比较麻烦。shell解析的话,命令行的方式才是最舒服的?/p>

命令行监控:

ActiveMQ当然也提供了命令行监控的方式。执?{ACTIVEMQ_HOME}/bin/activemq,会列出命令行的使用帮助。请注意虽然Windows平台也可以使用这个命令行,但是仅仅限于启动ActiveMQ实例,其他命令都不能很好的支持,所以这里所说的命令行方式,都是在Linux平台上的?/p>

限于篇幅,这里只是截取了重要的部分。可以看到命令行提供?6个命令,包括start,stop,restart,console等启动停止实例相关的命令。还有一些控制ActiveMQ Broker的命令,如create,purge等。这里主要介绍几个监控可能用得到的命?/p>

activemq status,显示当前的ActiveMQ是否运行正常,并且能显示pid?br />

activemq list,列出当前Broker名字?/span>

activemq bstat,显示当前Broker的统计信息?/span>

activemq query,根据筛选条件显示Broker的统计信息。如:activemq query -QQueue=string_queue,是只显示string_queue这个队列的统计信息。更多使用方法可以使用activemq query --help显示帮助?/span>

activemq browse,可以查询当前Broker为被消费的消息,会显示消息的详细信息,如消息头,消息内容,优先级等。类似于数据库的查询功能。有自己的一套查询语法但是不是很复杂,同样可以使用activemq browse --help显示帮助。需要注意的是,只有Queue才可以查询,Topic是不可以的,所以这个功能虽然强大,但是有点鸡肋?/span>

activemq dstat,比较有用的一个功能,可以用来查询队列的关键数值,如队列大小,生产者消费者数量,消息出队入队统计等。还可以支持通过类别查询,如只查询队列或者只查询主题?/span>

个人认为,activemq status和activemq dstat是比较常用的两个监控命令,可以使用shell,然后grep/awk解析。命令行虽然方便,但是明显缺失必要的信息,如硬件使用百分比,订阅者下线信息等。至少目前不能完成监控的全部工作,希望以后可以持续完善功能?/span>

JMX监控?/strong>

由Java开发的程序,一般都是支持JMX监控的,ActiveMQ也不例外。JMX监控是最全的,任何细节都可以通过JMX获取。如果远程连接JMX监控需要一些额外的配置。本机直接连接不需要,但是由于ActiveMQ是部署在linux上,所以应该很少有人会直接连接本地的JMX,除非是本地开发调试阶段?/span>

1. 修改/etc/hosts 检查hosts文件设置,不?27.0.0.1,用实际IP地址?/span>

2. 修改${ACTIVEMQ_HOME}/bin/active文件。找到下面几行,是连续的。应该都是注释掉的,解除注释,开启远程连接JMX,端口号默认?1099?/span>

ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=11099 " ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote"

3. 修改JMX用户和密码文件,必须是当前用户只读,别的用户无权限。否则启动时会报异常?/span>

chmod 400 ${ACTIVEMQ_HOME}/conf/jmx.*

其中jmx.access是用户权限配置文件,jmx.password是用户密码配置文件?/p>

配置到此,就可以使用jconsole等客户端连接了。启动jconsle,选择远程进程,填写remotehost:11099。其中remotehost是ActiveMQ所在机器的ip地址?1099是配置文件中开启的监听端口号。默认用户名是admin,密码是activemq。默认用户名和密码可以在jmx.access和jmx.password修改。连接之后如下图所示:

可以看到,从左侧树形菜单可以找到ActiveMQ的mbean,然后可以查看任何公开的JMX属性?/span>

如果你配置完了前3步,仍然不能远程连接JMX,请继续下面的配置?/span>

4. 查看${ACTIVEMQ_HOME}/conf/activemq.xml中的broker节点中useJmx="true"属性。这个属性可以没有或者为true,但是不可以是false?/span>

5. 修改${ACTIVEMQ_HOME}/conf/activemq.xml中的broker节点中找到managementContext节点,修改如下:

<managementContext>     <managementContext createConnector="true" connectorPort="11099" /> </managementContext>

其中connectorPort是你想发布的JMX端口号。注意端口号必须和之?{ACTIVEMQ_HOME}/bin/activemq里发布的端口号保持一致?/p>

JMX可以使用java开发程序,进行监测。但是对其他语言的支持有限。读到这里,你是不是觉得,每种监控方式各有优缺点,但是很难找出一个都很完美的方式,既可以看到全部的信息,又可以轻松的用程序实现监控。如果你有这方面的需求,请你继续看下一个监控方式?/p>

JMX REST API?/strong>

可能你还记得,之前提到的Web Console也有xml的数据展现形式,但是解析困难且数据不全。而命令行模式数据更加不全。所以,ActiveMQ提供把JMX导出为REST API。这样就最大限度的满足了各种需求,既有完整的数据,又可以方便编写程序监控。当然如果以后命令行的方式能提供更多的信息,那么这个JMX REST API就可以被替代了。但是至少现在来说,他是不可替代的?/p>

ActiveMQ使用一个开源的组件Jolokia来将JMX自动发布成为REST API。如果使用这个方式,你不需要配置那些上一节提到的繁琐远程JMX配置。他的原理是使用本地的JMX,然后通过HTTP发布出来,并不是远程访问JMX?/p>

在浏览器访问//activemq-host:8161/api/jolokia/。默认的用户名和密码同样都是admin。可以看到浏览器会返回json信息来描述当前系统?/p>

{"request":{"type":"version"},"value":{"agent":"1.2.1","protocol":"7.1","config":{"discoveryEnabled":"false","agentId":"xxx.xxx.xxx.xxx-29009-71a9b4c7-servlet","agentType":"servlet","agentDescription":"Apache ActiveMQ"},"info":{"product":"activemq","vendor":"Apache","version":"5.10.0"}},"timestamp":1405499528,"status":200}

通过Jolokia API可以访问JMX发布的任何mbean?/p>

//activemq-host:8161/api/jolokia/list  显示当前所有的mbean?/span>

//activemq-host:8161/api/jolokia/read/<mbean name >/<attribute name> 显示某个mbean的某个属?/span>

还有很多其他的操作,如//activemq-host:8161/api/jolokia/write/<mbean name >/<attribute name>可以动态执行方法。由于本篇文章只涉及监控,所以其他的操作先不深入?/span>

我们重点关注//activemq-host:8161/api/jolokia/read/?/span>

先说一下Mbean名字的规则。一般的MBean名字类似于:org.apache.activemq:type=Broker,brokerName=DemoBroker

org.apache.activemq:是ActiveMQ在这个Mbean的Domain名,可以修改managementContext的jmxDomainName中配置名称?/span>

<managementContext>     <managementContext createConnector="true" connectorPort="11099" jmxDomainName="MyBroker" /> </managementContext>

type=Broker是固定的?/span>

brokerName=DemoBroker,其中DemoBroker是在配置文件中Broker所配置的名字?/span>

后面会有一些自定义属性。如:destinationType=Queue,destinationName=pojo_queue?/span>

看到这里你可能会比较迷惑?/span>下面给出例子,请慢慢体会?/span>

//10.2activemq-host:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=DemoBroker/TotalEnqueueCount

获取入队的消息总数,返回结果如下:

{"request":{"mbean":"org.apache.activemq:brokerName=DemoBroker,type=Broker","attribute":"TotalEnqueueCount","type":"read"},"value":5672,"timestamp":1405501289,"status":200}

关键的数据是value的?672,表示有5672个消息入队?/p>

如果使用shell编写监控脚本,可以使用命令:

wget --user admin --password admin --auth-no-challenge //activemq-host:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/TotalEnqueueCount


下面列出几个关键的监控属性?/span>

<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,service=Health/CurrentStatus

获取当前系统状?/p>


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/MemoryPercentUsage

获取内存使用?/p>


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/StorePercentUsage

获取硬盘空间使用?/p>


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/TempPercentUsage

获取临时文件硬盘空间使用?/span>


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/QueueSize

获取队列pojo_queue的未消费消息数量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/ProducerCount

获取队列pojo_queue的生产者数?/p>


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/ConsumerCount

获取队列pojo_queue的消费者数?/p>


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/EnqueueCount

获取队列pojo_queue的已消费消息数量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/DequeueCount

获取队列pojo_queue的已接收消息数量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Topic,destinationName=pojo_topic,endpoint=Consumer,clientId=pojo_client_1,consumerId=Durable(pojo_client_1_pojo_client_1)/Active

获取主题pojo_topic的client id为pojo_client_1的订阅者是否已经下?/span>

Advisory Message监控?/strong>

ActiveMQ提供了一些额外的信息帮助用户获取系统状态,这些额外信息都存在主题中,以ActiveMQ.Advisory.开头。这些信息可以通过前面说的任何一种方式查询。这些消息包括Queue/Topic创建销毁的次数,消费比较慢的消费者统计等等。可以参?a target="_self" rel="nofollow" style="color: #2489ce; font-weight: bold;">官方文查询每个Advisory Message的意义?/p>

插件监控?/strong>

ActiveMQ还提供了一些额外的插件来监控系统,主要有可视化插件监控和统计插件监控,需要在activemq.xml中进行配置,最主要的有<connectionDotFilePlugin/>?lt;destinationDotFilePlugin/>?lt;statisticsBrokerPlugin/>。对于一些生成图标的监控系统比较有用。下面是connectionDotFilePlugin的使用截图?/span>

第三方监控:

最后一种监控方式就是第三方提供的监控,这种监控主要包括ActiveMQ Monitor,Apache ActiveMQBrowser ,HermesJMS等。由于是第三方提供的监控平台,所以一旦activemq升级,监控平台不升级,可能会带来兼容问题,所以请谨慎使用?/p>

另外不得不提的是hawtio,也是一个第三方提供的监控平台,提供了HTML5的绚丽界面。已经在ActiveMQ 5.9的版本中内嵌入发布包。但是由于Apache内部的意见分歧,在ActiveMQ 5.9.1的版本中又将其删除。如果想用,只能自己下载hawtio部署到ActiveMQ的环境中?/span>




]]>
服务监控微信通知 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2015/04/03/424090.html小马?/dc:creator>小马?/author>Fri, 03 Apr 2015 02:50:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2015/04/03/424090.html//www.ot7t.com.cn/xiaomage234/comments/424090.html//www.ot7t.com.cn/xiaomage234/archive/2015/04/03/424090.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/424090.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/424090.html
//git.oschina.net/yeetrack/weixin-alert

很简单的步骤?/p>

  1. 登录web微信,打开开发者工具,切到http请求tab
  2. 给要报警的人、或者群组发送一条微?/li>
  3. 在开发者工具中,copy出两条curl请求,一个是发送心跳的,一个是发送消息内容的?/li>
  4. 编译jar包,mvn clean pakcage
  5. 将心跳curl保存?*weixin-heart.sh**,将发送curl保存?*weixin-send.sh**?/li>
  6. 将jar包和两个shell文件放在统一路径中,执行java -jar weixinalert-1.0-SNAPSHOT-jar-with-dependencies.jar "Hello world!"即可?/li>

ps:心跳的那个请求,最好有个定时任务,crontab之类,一分钟一次,防止服务器踢掉该会话。缺点:不能退出手机上的微信(断网可以,只要不手动退出),不能再使用该微信号登录其他客户端的微信,如windows,mac,网页微信等,也就是说一个手机上的微信账号,最多额外产生一个sid,多了会踢掉之前的sid?/p>



]]>
log4j实现日志集中存储 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2014/07/09/415624.html小马?/dc:creator>小马?/author>Wed, 09 Jul 2014 07:31:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2014/07/09/415624.html//www.ot7t.com.cn/xiaomage234/comments/415624.html//www.ot7t.com.cn/xiaomage234/archive/2014/07/09/415624.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/415624.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/415624.html先描述一下问题,多个服务器实现的负载均衡,每个服务器存储在自己的硬盘里。但是现在需要对日志做统一的分析,在多个服务器上统计就麻烦了。思路是把日志统一到一台日志服务器上,再统一做统计分析。怎么统一到一台服务器上,说实话没有特别好的思路,最后尝试了log4j的SocketAppender。查了不少网络资源,都说的有些不明了,还是得亲自尝试之后才见分晓?/span>

1、客户端的配?/strong>?/span>

客户端的配置比较简单,只需要告诉log4j需要监听哪个远程服务器的哪个端口即可。直接在log4j.properties里直接配置就好?/span>

  1. <span style="font-size:12px;">log4j.appender.logs=org.apache.log4j.DailyRollingFileAppender  
  2. log4j.appender.logs.File = /data/logs/request/logs.log  
  3. log4j.appender.logs.layout = org.apache.log4j.PatternLayout  
  4. log4j.appender.logs.layout.ConversionPattern=%d [%t] - %m%n  
  5. log4j.appender.logs.DatePattern='.'yyyy-MM-dd'.log'  
  6.   
  7. log4j.appender.socket=org.apache.log4j.net.SocketAppender  
  8. log4j.appender.socket.RemoteHost=172.16.2.152  
  9. log4j.appender.socket.Port=4560  
  10. log4j.appender.socket.LocationInfo=true  
  11. #下面这两句感觉没?nbsp; 
  12. log4j.appender.socket.layout=org.apache.log4j.PatternLayout  
  13. log4j.appender.socket.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%t%m%n  
  14.   
  15. #将日志写入本地和远程日志服务?nbsp; 
  16. log4j.logger.com.test.core.filter =DEBUG,socket,logs</span>  
 

2、日志服务器的配?/strong>?/span>

日志服务器需要单独启动一个java进程,接收客户端给自己发送的socket请求。Log4j提供了org.apache.log4j.net.SocketServer类,直接运行其main函数就行了(当然也可以自己写啦)?/span>

java -cp /log4jsocket/serverConfig/log4j-1.2.16.jarorg.apache.log4j.net.SocketServer 4560 /log4jsocket/log4jserver.properties /log4jsocket/clientConfig

/log4jsocket/serverConfig/log4j-1.2.16.jar是log4j jar包存放的位置,org.apache.log4j.net.SocketServer需要三个参数:

1?560 是监听的端口?/span>

2?log4jsocket/log4jserver.properties 是记录日志服务器的日志的配置文件

3?log4jsocket/clientConfig 是客户端配置文件所在的目录(注意是目录)?/span>

着重说一?/span>org.apache.log4j.net.SocketServer的第三个参数,这个文件夹下配置的是各个客户端的日志的配置。配置文件以.lcf结尾,文件名可以用客户端的IP命名,log4j会自己找发送请求的客户端IP对应的那个配置文件,?72.16.2.46服务器发送的socket请求会寻?72.16.2.46.lcf配置文件,并根据配置将日志写入对应的文件?/span>

  1. <span style="font-size:12px;">#注意logger后面的值要与client的值相?nbsp; 
  2. log4j.logger.com.test.core.filter=DEBUG,localLogs  
  3.    
  4. log4j.appender.localLogs=org.apache.log4j.DailyRollingFileAppender  
  5. log4j.appender.localLogs.File=/data/logs/request/172.16.2.46/logs.log  
  6. log4j.appender.localLogs.layout=org.apache.log4j.PatternLayout  
  7. log4j.appender.localLogs.layout.ConversionPattern=%d [%t] - %m%n  
  8. log4j.appender.localLogs.DatePattern='.'yyyy-MM-dd'.log'  
  9. </span>  


这样做的好处是可以根据不同客户端,将日志写入不同的文件夹下的?/span>

其实,配置过程就这么简单,但是当你这么做之后,你会发现运行org.apache.log4j.net.SocketServer后,客户端向日志服务器发送请求时,会报找不到.lcf文件的错误,得不到想要的结果。原因出在org.apache.log4j.net.SocketServer代码中的一个小bug?nbsp;

  1. <span style="font-size:12px;">LoggerRepository configureHierarchy(InetAddress inetAddress)  
  2.   {  
  3.     cat.info("Locating configuration file for " + inetAddress);  
  4.   
  5.     String s = inetAddress.toString();  
  6.     int i = s.indexOf("/");  
  7.     if (i == -1) {  
  8.       cat.warn("Could not parse the inetAddress [" + inetAddress + "]. Using default hierarchy.");  
  9.   
  10.       return genericHierarchy();  
  11.     }  
  12.     String key = s.substring(0,i);  
  13.   
  14.     File configFile = new File(this.dir, key + CONFIG_FILE_EXT);  
  15.     if (configFile.exists()) {  
  16.       Hierarchy h = new Hierarchy(new RootLogger(Level.DEBUG));  
  17.       this.hierarchyMap.put(inetAddress, h);  
  18.   
  19.       new PropertyConfigurator().doConfigure(configFile.getAbsolutePath(), h);  
  20.   
  21.       return h;  
  22.     }  
  23.     cat.warn("Could not find config file [" + configFile + "].");  
  24.     return genericHierarchy();  
  25.   }</span>  

String key = s.substring(0, i);换成String key = s.substring(i+1);就好了。这段代码是解析IP地址,然后寻找对应IP命名?lcf配置文件;如果找不到,则解析默认的generic.lcf。由于截取的错误,导致找不到172.16.2.46.lcf,文件夹下又没有generic.lcf,所以会抛异常?/span>

org.apache.log4j.net.SocketServer代码中的另外一个bug是,只能接收来自一台客户端的日志请求,一旦客户端停止运行,SocketServer也将关闭。查看代码:

  1. public static void main(String[] argv)  
  2.   {     
  3.       if (argv.length == 3)  
  4.       init(argv[0], argv[1], argv[2]);  
  5.     else  
  6.       usage("Wrong number of arguments.");  
  7.     try  
  8.     {  
  9.         cat.info("Listening on port " + port);  
  10.         ServerSocket serverSocket = new ServerSocket(port);  
  11.         cat.info("Waiting to accept a new client.");  
  12.     Socket socket = serverSocket.accept();  
  13.     InetAddress inetAddress = socket.getInetAddress();  
  14.     cat.info("Connected to client at " + inetAddress);  
  15.       
  16.     LoggerRepository h = (LoggerRepository)server.hierarchyMap.get(inetAddress);  
  17.     if (h == null) {  
  18.             h = server.configureHierarchy(inetAddress);  
  19.     }  
  20.       
  21.     cat.info("Starting new socket node.");  
  22.     new Thread(new SocketNode(socket, h)).start();  
  23.       }  
  24.     catch (Exception e)  
  25.     {  
  26.       e.printStackTrace();  
  27.     }  
  28.   }  

问题出在只建立了一个socket连接就不在accept了,加上while循环问题就解决了?/p>

  1. ServerSocket serverSocket = new ServerSocket(port);  
  2. while(true){  
  3.  cat.info("Waiting to accept a new client.");  
  4.  Socket socket = serverSocket.accept();  
  5.  InetAddress inetAddress = socket.getInetAddress();  
  6.  cat.info("Connected to client at " + inetAddress);  
  7.   
  8.  LoggerRepository h = (LoggerRepository)server.hierarchyMap.get(inetAddress);  
  9.  if (h == null) {  
  10.    h = server.configureHierarchy(inetAddress);  
  11.  }  
  12.   
  13.  cat.info("Starting new socket node.");  
  14.  new Thread(new SocketNode(socket, h)).start();  
  15. }  



 

 

好了。Log4j的配置到此结束?/span>

最后一个问题,日志服务器是linux,需要有一个统一的start、shutdown命令来启动和关闭org.apache.log4j.net.SocketServer。那就需要些shell命令了,下面这段代码参考了//www.cnblogs.com/baibaluo/archive/2011/08/31/2160934.html

catalina.sh

  1. <span style="font-size:12px;">#!/bin/bash  
  2. #端口  
  3. LISTEN_PORT=4560  
  4. #服务端log4j配置文件  
  5. SERVER_CONFIG=/log4jsocket/server.properties  
  6. #客户端的配置  
  7. CLIENT_CONFIG_DIR=/log4jsocket/clientConfig  
  8.   
  9. #Java程序所在的目录(classes的上一级目录)  
  10. APP_HOME=/opt/log4jsocket/serverConfig   
  11. #需要启动的Java主程序(main方法类)  
  12. APP_MAINCLASS=org.apache.log4j.net.SocketServer  
  13.    
  14. #拼凑完整的classpath参数,包括指定lib目录下所有的jar  
  15. CLASSPATH=$APP_HOME  
  16. for i in "$APP_HOME"/*.jar; do     
  17.     CLASSPATH="$CLASSPATH":"$i"  
  18. done  
  19.   
  20. #JDK所在路?nbsp; 
  21. JAVA_HOME="/opt/jdk1.6.0_30"   
  22. #执行程序启动所使用的系统用户,考虑到安全,推荐不使用root帐号  
  23. RUNNING_USER=root  
  24.    
  25. #java虚拟机启动参?nbsp; 
  26. JAVA_OPTS="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"   
  27.   
  28. #初始化psid变量(全局?nbsp; 
  29. psid=0  
  30.    
  31. checkpid() {  
  32.    javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAINCLASS`  
  33.    
  34.    if [ -n "$javaps" ]; then  
  35.       psid=`echo $javaps | awk '{print $1}'`  
  36.    else  
  37.       psid=0  
  38.    fi  
  39. }  
  40.   
  41. start() {  
  42.    checkpid  
  43.    
  44.    if [ $psid -ne 0 ]; then  
  45.       echo "================================"  
  46.       echo "warn: $APP_MAINCLASS already started! (pid=$psid)"  
  47.       echo "================================"  
  48.    else  
  49.       echo -n "Starting $APP_MAINCLASS ..."  
  50.       JAVA_CMD="nohup $JAVA_HOME/bin/java -classpath $CLASSPATH $APP_MAINCLASS $LISTEN_PORT $SERVER_CONFIG $CLIENT_CONFIG_DIR >/dev/null 2>&1 &"  
  51.       su - $RUNNING_USER -c "$JAVA_CMD"  
  52.       checkpid  
  53.       if [ $psid -ne 0 ]; then  
  54.          echo "(pid=$psid) [OK]"  
  55.       else  
  56.          echo "[Failed]"  
  57.       fi  
  58.    fi  
  59. }  
  60.   
  61. stop() {  
  62.    checkpid  
  63.    
  64.    if [ $psid -ne 0 ]; then  
  65.       echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) "  
  66.       su - $RUNNING_USER -c "kill -9 $psid"  
  67.       if [ $? -eq 0 ]; then  
  68.          echo "[OK]"  
  69.       else  
  70.          echo "[Failed]"  
  71.       fi  
  72.    
  73.       checkpid  
  74.       if [ $psid -ne 0 ]; then  
  75.          stop  
  76.       fi  
  77.    else  
  78.       echo "================================"  
  79.       echo "warn: $APP_MAINCLASS is not running"  
  80.       echo "================================"  
  81.    fi  
  82. }  
  83.   
  84. status() {  
  85.    checkpid  
  86.    
  87.    if [ $psid -ne 0 ];  then  
  88.       echo "$APP_MAINCLASS is running! (pid=$psid)"  
  89.    else  
  90.       echo "$APP_MAINCLASS is not running"  
  91.    fi  
  92. }  
  93. info() {  
  94.    echo "System Information:"  
  95.    echo "****************************"  
  96.    echo `head -n 1 /etc/issue`  
  97.    echo `uname -a`  
  98.    echo  
  99.    echo "JAVA_HOME=$JAVA_HOME"  
  100.    echo `$JAVA_HOME/bin/java -version`  
  101.    echo  
  102.    echo "APP_HOME=$APP_HOME"  
  103.    echo "APP_MAINCLASS=$APP_MAINCLASS"  
  104.    echo "****************************"  
  105. }  
  106. case "$1" in  
  107.   
  108.    'start')  
  109.       start  
  110.       ;;  
  111.    'stop')  
  112.      stop  
  113.      ;;  
  114.    'restart')  
  115.      stop  
  116.      start  
  117.      ;;  
  118.    'status')  
  119.      status  
  120.      ;;  
  121.    'info')  
  122.      info  
  123.      ;;  
  124.   *)  
  125.      echo "Usage: $0 {start|stop|restart|status|info}"   
  126.      exit 0   
  127. esac  
  128. </span>  
startup.sh

  1. <span style="font-size:12px;">#!/bin/sh  
  2. EXECUTABLE=/log4jsocket/catalina.sh  
  3. exec "$EXECUTABLE" start "$@"</span>  
shutdown.sh

  1. <span style="font-size:12px;">EXECUTABLE=/log4jsocket/catalina.sh  
  2. exec "$EXECUTABLE" stop "$@"</span>  


]]>
GYP 简?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2014/03/18/411169.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Tue, 18 Mar 2014 06:36:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2014/03/18/411169.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/411169.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2014/03/18/411169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/411169.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/411169.html</trackback:ping><description><![CDATA[<p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">说起项目构建工具,Linux 用户最熟悉的恐怕就?nbsp;<a style="margin: 0px; padding: 0px; text-decoration: none; outline-width: 0px; color: #258fb8;">Autotools</a>,它将编译安装这个步骤大大简化。但对于项目作者来说,想要使用 Autotools 生成有效的配置文件着实需要下一番功夫,用现在流行的话来说就是用户体验不够友好。对 Unix shell 的依赖,也使?Autotools 天生对于跨平台支持不佳?/p><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">后来我从<a style="margin: 0px; padding: 0px; text-decoration: none; outline-width: 0px; color: #258fb8;">大猫</a>同学那里听说?nbsp;<a style="margin: 0px; padding: 0px; text-decoration: none; outline-width: 0px; color: #258fb8;">CMake</a>,CMake 使用 C++ 编写,原生支持跨平台,不需要像 Autotools 那样写一堆的配置文件,只需一?CMakeLists.txt 文件即可。简洁的使用方式,强大的功能使得我立马对 CMake 情有独钟。在后来的使用过程中,虽然会遇到一些因为使用习惯带来的小困扰,但我对于 CMake 还是基本满意的。直到我发现?GYP?/p><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;"><a style="margin: 0px; padding: 0px; text-decoration: none; outline-width: 0px; color: #258fb8;">GYP</a>(Generate Your Projects)是?Chromium 团队开发的跨平台自动化项目构建工具,Chromium 便是通过 GYP 进行项目构建管理。为什么我要选择 GYP,而放?CMake 呢?功能?GYP ?CMake 很是相似,在我看来,它们的最大区别在于配置文件的编写方式和其中蕴含的思想?/p><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">编写 CMake 配置文件相比 Autotools 来说已经简化很多,一个最简单的配置文件只需要写上源文件及生成类型(可执行文件、静态库、动态库等)即可。对分支语句和循环语句的支持也使?CMake 更加灵活。但是,CMake 最大的问题也是在这个配置文件,请看下面这个示例文件?/p><figure style="margin: 10px 0px 0px; padding: 5px 15px; background-color: #dddddd; border: 1px solid #cccccc; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px;"><div style="margin: 0px; overflow-x: auto;"><table style="margin: 0px; padding: 0px; border: none; border-spacing: 0px;"><tbody style="margin: 0px; padding: 0px;"><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px; padding: 0px;"><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px 15px 0px 0px; background-image: none; border-right-width: 1px; border-style: none solid none none; border-right-color: #cccccc; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.5; overflow-x: auto; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;"><span style="margin: 0px; padding: 0px;">1</span> <span style="margin: 0px; padding: 0px;">2</span> <span style="margin: 0px; padding: 0px;">3</span> <span style="margin: 0px; padding: 0px;">4</span> <span style="margin: 0px; padding: 0px;">5</span> <span style="margin: 0px; padding: 0px;">6</span> <span style="margin: 0px; padding: 0px;">7</span> <span style="margin: 0px; padding: 0px;">8</span> <span style="margin: 0px; padding: 0px;">9</span> <span style="margin: 0px; padding: 0px;">10</span> <span style="margin: 0px; padding: 0px;">11</span> <span style="margin: 0px; padding: 0px;">12</span> <span style="margin: 0px; padding: 0px;">13</span> <span style="margin: 0px; padding: 0px;">14</span> <span style="margin: 0px; padding: 0px;">15</span> <span style="margin: 0px; padding: 0px;">16</span> <span style="margin: 0px; padding: 0px;">17</span> <span style="margin: 0px; padding: 0px;">18</span> <span style="margin: 0px; padding: 0px;">19</span> <span style="margin: 0px; padding: 0px;">20</span> <span style="margin: 0px; padding: 0px;">21</span> <span style="margin: 0px; padding: 0px;">22</span> <span style="margin: 0px; padding: 0px;">23</span> <span style="margin: 0px; padding: 0px;">24</span> <span style="margin: 0px; padding: 0px;">25</span> <span style="margin: 0px; padding: 0px;">26</span> <span style="margin: 0px; padding: 0px;">27</span> <span style="margin: 0px; padding: 0px;">28</span> <span style="margin: 0px; padding: 0px;">29</span> <span style="margin: 0px; padding: 0px;">30</span> <span style="margin: 0px; padding: 0px;">31</span> <span style="margin: 0px; padding: 0px;">32</span> <span style="margin: 0px; padding: 0px;">33</span> <span style="margin: 0px; padding: 0px;">34</span> <span style="margin: 0px; padding: 0px;">35</span> <span style="margin: 0px; padding: 0px;">36</span> <span style="margin: 0px; padding: 0px;">37</span> <span style="margin: 0px; padding: 0px;">38</span> <span style="margin: 0px; padding: 0px;">39</span> <span style="margin: 0px; padding: 0px;">40</span> <span style="margin: 0px; padding: 0px;">41</span> <span style="margin: 0px; padding: 0px;">42</span> </pre></td><td style="margin: 0px; padding: 0px 0px 0px 15px; width: 721px; overflow-x: auto;"><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; background-image: none; border: none; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.5; overflow-x: auto; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;"><code style="margin: 0px; padding: 0px; background-image: none; border: none; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.9em; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; background-position: initial initial; background-repeat: initial initial;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">cmake_minimum_required</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">VERSION</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">2.8</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">project</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">VP8</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CXX</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">add_definitions</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">-Wall</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">cmake_policy</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">SET</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMP0015</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">NEW</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">include_directories</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"include"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">link_directories</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"lib"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMAKE_ARCHIVE_OUTPUT_DIRECTORY</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"../lib"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">VP8SRC</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">VP8Encoder.cpp</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">VP8Decoder.cpp</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">if</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">X86</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMAKE_SYSTEM_NAME</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">Darwin</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMAKE_SYSTEM_PROCESSOR</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">i386</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMAKE_OSX_ARCHITECTURES</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"i386"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">add_library</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">vp8</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">STATIC</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important; font-weight: bold !important;">${</span><span style="margin: 0px; padding: 0px; color: #268bd2 !important;">VP8SRC</span><span style="margin: 0px; padding: 0px; color: #586e75 !important; font-weight: bold !important;">}</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">elseif</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">IPHONE</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">if</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">SIMULATOR</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">PLATFORM</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"iPhoneSimulator"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">PROCESSOR</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">i386</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">ARCH</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"i386"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">else</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">()</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">PLATFORM</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"iPhoneOS"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">PROCESSOR</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">arm</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">ARCH</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"armv7"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">endif</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">()</span> </span><span style="margin: 0px; padding: 0px;"> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">SDKVER</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"4.0"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">DEVROOT</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"/Developer/Platforms/${PLATFORM}.platform/Developer"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">SDKROOT</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"${DEVROOT}/SDKs/${PLATFORM}${SDKVER}.sdk"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMAKE_OSX_SYSROOT</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"${SDKROOT}"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMAKE_SYSTEM_NAME</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">Generic</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMAKE_SYSTEM_PROCESSOR</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important; font-weight: bold !important;">${</span><span style="margin: 0px; padding: 0px; color: #268bd2 !important;">PROCESSOR</span><span style="margin: 0px; padding: 0px; color: #586e75 !important; font-weight: bold !important;">}</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMAKE_CXX_COMPILER</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"${DEVROOT}/usr/bin/g++"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">set</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">CMAKE_OSX_ARCHITECTURES</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important; font-weight: bold !important;">${</span><span style="margin: 0px; padding: 0px; color: #268bd2 !important;">ARCH</span><span style="margin: 0px; padding: 0px; color: #586e75 !important; font-weight: bold !important;">}</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">include_directories</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">SYSTEM</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"${SDKROOT}/usr/include"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">link_directories</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">SYSTEM</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">"${SDKROOT}/usr/lib"</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">add_definitions</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">-D_PHONE</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #859900 !important;">add_library</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">(</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">vp8-armv7-darwin</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">STATIC</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important; font-weight: bold !important;">${</span><span style="margin: 0px; padding: 0px; color: #268bd2 !important;">VP8SRC</span><span style="margin: 0px; padding: 0px; color: #586e75 !important; font-weight: bold !important;">}</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">)</span> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #859900 !important;">endif</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">()</span> </span></code></pre></td></tr></tbody></table></div></figure><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">你能一眼看出这个配置文件干了什么吗?其实这个配置文件想要产生的目标(target)只有一个,就是通过<code style="margin: 0px 3px; padding: 1px 3px; background-color: #dddddd; border: 1px solid #cccccc; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.9em; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-position: initial initial; background-repeat: initial initial;">${VP8SRC}</code> 编译生成的静态库,但因为加上了条件判断,及各种平台相关配置,使得这个配置文件看起来很是复杂。在我看来,编写 CMake 配置文件是一种线性思维,对于同一个目标的配置可能会零散分布在各个地方。?GYP 则相当不同,GYP 的配置文件更多地强调模块化、结构化。看看下面这个示例文件:</p><figure style="margin: 10px 0px 0px; padding: 5px 15px; background-color: #dddddd; border: 1px solid #cccccc; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px;"><div style="margin: 0px; overflow-x: auto;"><table style="margin: 0px; padding: 0px; border: none; border-spacing: 0px;"><tbody style="margin: 0px; padding: 0px;"><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px; padding: 0px;"><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px 15px 0px 0px; background-image: none; border-right-width: 1px; border-style: none solid none none; border-right-color: #cccccc; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.5; overflow-x: auto; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;"><span style="margin: 0px; padding: 0px;">1</span> <span style="margin: 0px; padding: 0px;">2</span> <span style="margin: 0px; padding: 0px;">3</span> <span style="margin: 0px; padding: 0px;">4</span> <span style="margin: 0px; padding: 0px;">5</span> <span style="margin: 0px; padding: 0px;">6</span> <span style="margin: 0px; padding: 0px;">7</span> <span style="margin: 0px; padding: 0px;">8</span> <span style="margin: 0px; padding: 0px;">9</span> <span style="margin: 0px; padding: 0px;">10</span> <span style="margin: 0px; padding: 0px;">11</span> <span style="margin: 0px; padding: 0px;">12</span> <span style="margin: 0px; padding: 0px;">13</span> <span style="margin: 0px; padding: 0px;">14</span> <span style="margin: 0px; padding: 0px;">15</span> <span style="margin: 0px; padding: 0px;">16</span> <span style="margin: 0px; padding: 0px;">17</span> <span style="margin: 0px; padding: 0px;">18</span> <span style="margin: 0px; padding: 0px;">19</span> <span style="margin: 0px; padding: 0px;">20</span> <span style="margin: 0px; padding: 0px;">21</span> <span style="margin: 0px; padding: 0px;">22</span> <span style="margin: 0px; padding: 0px;">23</span> <span style="margin: 0px; padding: 0px;">24</span> <span style="margin: 0px; padding: 0px;">25</span> <span style="margin: 0px; padding: 0px;">26</span> <span style="margin: 0px; padding: 0px;">27</span> <span style="margin: 0px; padding: 0px;">28</span> <span style="margin: 0px; padding: 0px;">29</span> <span style="margin: 0px; padding: 0px;">30</span> <span style="margin: 0px; padding: 0px;">31</span> <span style="margin: 0px; padding: 0px;">32</span> <span style="margin: 0px; padding: 0px;">33</span> <span style="margin: 0px; padding: 0px;">34</span> <span style="margin: 0px; padding: 0px;">35</span> <span style="margin: 0px; padding: 0px;">36</span> <span style="margin: 0px; padding: 0px;">37</span> <span style="margin: 0px; padding: 0px;">38</span> <span style="margin: 0px; padding: 0px;">39</span> <span style="margin: 0px; padding: 0px;">40</span> <span style="margin: 0px; padding: 0px;">41</span> </pre></td><td style="margin: 0px; padding: 0px 0px 0px 15px; width: 721px; overflow-x: auto;"><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; background-image: none; border: none; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.5; overflow-x: auto; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;"><code style="margin: 0px; padding: 0px; background-image: none; border: none; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.9em; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; background-position: initial initial; background-repeat: initial initial;"><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #586e75 !important;">{</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'targets'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">{</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'target_name'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'foo'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'type'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'<(library)'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'dependencies'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'bar'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'defines'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'DEFINE_FOO'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'DEFINE_A_VALUE=value'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'include_dirs'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'..'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'sources'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'file1.cc'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'file2.cc'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'conditions'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'OS=="linux"'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">{</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'defines'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'LINUX_DEFINE'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'include_dirs'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'include/linux'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">}],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span><span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'OS=="win"'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">{</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'defines'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'WINDOWS_SPECIFIC_DEFINE'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">},</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">{</span> <span style="margin: 0px; padding: 0px; color: #93a1a1 !important; font-style: italic !important;"># OS != "win",</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'defines'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">:</span> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">[</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #2aa198 !important;">'NON_WINDOWS_DEFINE'</span><span style="margin: 0px; padding: 0px; color: #586e75 !important;">,</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">}]</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">}</span> </span><span style="margin: 0px; padding: 0px;"> <span style="margin: 0px; padding: 0px; color: #586e75 !important;">],</span> </span><span style="margin: 0px; padding: 0px;"><span style="margin: 0px; padding: 0px; color: #586e75 !important;">}</span> </span></code></pre></td></tr></tbody></table></div></figure><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">我们可以立马看出上面这个配置文件的输出目标只有一个,也就?nbsp;<code style="margin: 0px 3px; padding: 1px 3px; background-color: #dddddd; border: 1px solid #cccccc; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.9em; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-position: initial initial; background-repeat: initial initial;">foo</code>,它是一个库文件(至于是静态的还是动态的这需要在生成项目时指定),它依赖的目标、宏定义、包含的头文件路径、源文件是什么,以及根据不同平台设定的不同配置等。这种定义配置文件的方式相比 CMake 来说,让我觉得更加舒服,也更加清晰,特别是当一个输出目标的配置越来越多时,使用 CMake 来管理可能会愈加混乱?/p><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">配置文件的编写方式是我区?GYP ?CMake 之间最大的不同点,当然 GYP 也有一些小细节值得注意,比如支持跨平台项目工程文件输出,Windows 平台默认?Visual Studio,Linux 平台默认?Makefile,Mac 平台默认?Xcode,这个功?CMake 也同样支持,只是缺少?Xcode。Chromium 团队成员也撰文详?a style="margin: 0px; padding: 0px; text-decoration: none; outline-width: 0px; color: #258fb8;">比较</a>?GYP ?CMake 之间的优缺点,在开?GYP 之前,他们也曾试图转?nbsp;<a style="margin: 0px; padding: 0px; text-decoration: none; outline-width: 0px; color: #258fb8;">SCons</a>(这个我没用过,有经验的同学可以比较一下),但是失败了,于?GYP 就诞生了?/p><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">当然 GYP 也不是没有缺点,相反,我觉得它的「缺点」一大堆?/p><ul style="margin: 15px 0px 0px 20px; padding: 0px; font-size: 16px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;"><li style="margin: 0px; padding: 0px;">文不够完整,项目不够正式,某些地方还保留着 Chromium 的影子,看起来像是还没有完全独立出来?/li><li style="margin: 0px; padding: 0px;">大量的括号嵌套,很容易让人看晕,有过 Lisp 使用经验的同学可以对号入座。对于有括号恐惧症,或者不使用现代编辑器的同学基本可以绕行?/li><li style="margin: 0px; padding: 0px;">为了支持跨平台,有时不得不加入某些特定平台的配置信息,比如只适用?Visual Studio ?nbsp;<code style="margin: 0px 3px; padding: 1px 3px; background-color: #dddddd; border: 1px solid #cccccc; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.9em; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-position: initial initial; background-repeat: initial initial;">RuntimeLibrary</code>配置,这不利于跨平台配置文件的编写,也无形中增加了编写复杂度?/li><li style="margin: 0px; padding: 0px;">不支?nbsp;<code style="margin: 0px 3px; padding: 1px 3px; background-color: #dddddd; border: 1px solid #cccccc; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.9em; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-position: initial initial; background-repeat: initial initial;">make clean</code>,唯一的方法就是将输出目录整个删除或者手动删除其中的某些文件?/li></ul><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">如果你已经打算尝?GYP,那一定记得在生成项目工程文件时加?nbsp;<code style="margin: 0px 3px; padding: 1px 3px; background-color: #dddddd; border: 1px solid #cccccc; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.9em; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; background-position: initial initial; background-repeat: initial initial;">--depth</code> 参数,譬如:</p><pre style="margin-top: 10px; margin-bottom: 0px; padding: 5px 15px; background-color: #dddddd; border: 1px solid #cccccc; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.5; overflow-x: auto; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px;"><code style="margin: 0px; padding: 0px; background-image: none; border: none; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 0.9em; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; background-position: initial initial; background-repeat: initial initial;">$ gyp --depth=. foo.gyp </code></pre><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">这也是一个从 Chromium 项目遗留下来的历史问题?/p><p style="margin: 20px 0px 0px; padding: 0px; font-size: 17px; font-family: HelveticaNeue-Light, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 30px; text-align: justify; background-color: #eeeeee;">也许你根本用不上跨平台特性,但是 GYP 依然值得尝试。我编写了一?GYP 配置文件?a style="margin: 0px; padding: 0px; text-decoration: none; outline-width: 0px; color: #258fb8;">模板</a>,有兴趣的同学可以参考。GYP ?CMake 分别代表了两种迥异的「风格」,至于孰优孰劣,还得仁者见仁,智者见智?/p><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/411169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2014-03-18 14:36 <a href="//www.ot7t.com.cn/xiaomage234/archive/2014/03/18/411169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php读取网络文件 curl, fsockopen ,file_get_contents 几个方法的效率对?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409869.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Fri, 14 Feb 2014 08:44:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409869.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/409869.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/409869.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/409869.html</trackback:ping><description><![CDATA[<div clearfix"="" style="zoom: 1; padding: 21px 20px 13px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e2e2e2; color: #454545; font-family: tahoma, helvetica, arial; font-size: 12px; line-height: normal; background-color: #ffffff;"><h2 class="yibqv"><a style="line-height: 1.5; font-size: 14px; color: #f16e50;">curl效率及稳定原来可以远远超越file_get_contents</a></h2></div><div id="content" mod-cs-content="" text-content="" clearfix"="" style="zoom: 1; width: 760px; overflow: visible; line-height: 1.5; margin: 7px 0px 10px; padding: 20px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff;"><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;">最近需要获取别人网站上的音乐数据。用了file_get_contents函数,但是总是会遇到获取失败的问题,尽管按照手册中?例子设置了超时,可多数时候不会奏效:</p><br />$config['context'] = stream_context_create(array(‘http’ => array(‘method’ => “GET”,<br />   ’timeout’ => 5//这个超时时间不稳定,经常不奏?br />   )<br />  ));<br /><br />这时候,看一下服务器的连接池,会发现一堆类似的错误,让我头疼万分:<br />file_get_contents(//***): failed to open stream…<br /><br />现在改用了curl库,写了一个函数替换:<br />function curl_file_get_contents($durl){<br />  $ch = curl_init();<br />  curl_setopt($ch, CURLOPT_URL, $durl);<br />  curl_setopt($ch, CURLOPT_TIMEOUT, 5);<br />  curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);<br />  curl_setopt($ch, CURLOPT_REFERER,_REFERER_);<br />  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />  $r = curl_exec($ch);<br />  curl_close($ch);<br />   return $r;<br />}<br /><br />如此,除了真正的网络问题外,没再出现任何问题?br />这是别人做过的关于curl和file_get_contents的测试:<br />file_get_contents抓取google.com需用秒数:<br /><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;">2.31319094</p>2.30374217<br />2.21512604<br />3.30553889<br />2.30124092<br /><br />curl使用的时间:<br /><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;">0.68719101</p>0.64675593<br />0.64326<br />0.81983113<br />0.63956594<br /><br />差距很大?呵呵,从我使用的经验来说,这两个工具不只是速度有差异,稳定性也相差很大?br /><p style="margin: 0px; padding: 0px;">建议对网络数据抓取稳定性要求比较高的朋友使用上面的 curl_file_get_contents函数,不但稳定速度快,还能假冒浏览器欺骗目标地址哦!</p><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;">看到的其他文章收藏于?==============================</p><p style="margin: 0px; padding: 0px;"></p><p style="margin: 0px; padding: 0px;">php fsockopen</p><p style="margin: 0px; padding: 0px;"></p><p style="margin: 0px; padding: 0px;"></p><p style="margin: 0px; padding: 0px;">方法1: 用file_get_contents 以get方式获取内容<br /><?php<br />$url='//www.domain.com/';<br />$html = file_get_contents($url);<br />echo $html;<br />?></p><p style="margin: 0px; padding: 0px;">方法2: 用fopen打开url, 以get方式获取内容<br /><?php<br />$fp = fopen($url, 'r');<br />stream_get_meta_data($fp);<br />while(!feof($fp)) {<br />$result .= fgets($fp, 1024);<br />}<br />echo "url body: $result";<br />fclose($fp);<br />?></p><p style="margin: 0px; padding: 0px;"><br /></p><p style="margin: 0px; padding: 0px;"><br /></p><p style="margin: 0px; padding: 0px;">方法3:用file_get_contents函数,以post方式获取url<br /><?php<br />$data = array ('foo' => 'bar');<br />$data = http_build_query($data);</p><p style="margin: 0px; padding: 0px;">$opts = array (<br />'http' => array (<br />'method' => 'POST',<br />'header'=> "Content-type: application/x-www-form-urlencoded\r\n" .<br />"Content-Length: " . strlen($data) . "\r\n",<br />'content' => $data<br />)<br />);</p><p style="margin: 0px; padding: 0px;">$context = stream_context_create($opts);<br />$html = file_get_contents('//localhost/e/admin/test.html', false, $context);</p><p style="margin: 0px; padding: 0px;">echo $html;<br />?></p><p style="margin: 0px; padding: 0px;"><br /></p><p style="margin: 0px; padding: 0px;">方法4:用fsockopen函数打开url,以get方式获取完整的数据,包括header和body</p><p style="margin: 0px; padding: 0px;"><?php<br />function get_url ($url,$cookie=false)<br />{<br />$url = parse_url($url);<br />$query = $url[path]."?".$url[query];<br />echo "Query:".$query;<br />$fp = fsockopen( $url[host], $url[port]?$url[port]:80 , $errno, $errstr, 30);<br />if (!$fp) {<br />return false;<br />} else {<br />$request = "GET $query HTTP/1.1\r\n";<br />$request .= "Host: $url[host]\r\n";<br />$request .= "Connection: Close\r\n";<br />if($cookie) $request.="Cookie:   $cookie\n";<br />$request.="\r\n";<br />fwrite($fp,$request);<br />while()) {<br />$result .= @fgets($fp, 1024);<br />}<br />fclose($fp);<br />return $result;<br />}<br />}<br />//获取url的html部分,去掉header<br />function GetUrlHTML($url,$cookie=false)<br />{<br />$rowdata = get_url($url,$cookie);<br />if($rowdata)<br />{<br />$body= stristr($rowdata,"\r\n\r\n");<br />$body=substr($body,4,strlen($body));<br />return $body;<br />}</p><p style="margin: 0px; padding: 0px;">    return false;<br />}<br />?></p><p style="margin: 0px; padding: 0px;"><br /></p><p style="margin: 0px; padding: 0px;"><br /></p><p style="margin: 0px; padding: 0px;">方法5:用fsockopen函数打开url,以POST方式获取完整的数据,包括header和body</p><p style="margin: 0px; padding: 0px;"><?php<br />function HTTP_Post($URL,$data,$cookie, $referrer="")<br />{</p><p style="margin: 0px; padding: 0px;">    // parsing the given URL<br />$URL_Info=parse_url($URL);</p><p style="margin: 0px; padding: 0px;">    // Building referrer<br />if($referrer=="") // if not given use this script as referrer<br />$referrer="111";</p><p style="margin: 0px; padding: 0px;">    // making string from $data<br />foreach($data as $key=>$value)<br />$values[]="$key=".urlencode($value);<br />$data_string=implode("&",$values);</p><p style="margin: 0px; padding: 0px;">    // Find out which port is needed - if not given use standard (=80)<br />if(!isset($URL_Info["port"]))<br />$URL_Info["port"]=80;</p><p style="margin: 0px; padding: 0px;">    // building POST-request:<br />$request.="POST ".$URL_Info["path"]." HTTP/1.1\n";<br />$request.="Host: ".$URL_Info["host"]."\n";<br />$request.="Referer: $referer\n";<br />$request.="Content-type: application/x-www-form-urlencoded\n";<br />$request.="Content-length: ".strlen($data_string)."\n";<br />$request.="Connection: close\n";</p><p style="margin: 0px; padding: 0px;">    $request.="Cookie:   $cookie\n";</p><p style="margin: 0px; padding: 0px;">    $request.="\n";<br />$request.=$data_string."\n";</p><p style="margin: 0px; padding: 0px;">    $fp = fsockopen($URL_Info["host"],$URL_Info["port"]);<br />fputs($fp, $request);<br />while(!feof($fp)) {<br />$result .= fgets($fp, 1024);<br />}<br />fclose($fp);</p><p style="margin: 0px; padding: 0px;">    return $result;<br />}</p><p style="margin: 0px; padding: 0px;">?></p><p style="margin: 0px; padding: 0px;"><br /></p><p style="margin: 0px; padding: 0px;">方法6:使用curl库,使用curl库之前,可能需要查看一下php.ini是否已经打开了curl扩展</p><p style="margin: 0px; padding: 0px;"><?php<br />$ch = curl_init();<br />$timeout = 5;<br />curl_setopt ($ch, CURLOPT_URL, '//www.domain.com/');<br />curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);<br />curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);<br />$file_contents = curl_exec($ch);<br />curl_close($ch);</p><p style="margin: 0px; padding: 0px;">echo $file_contents;<br />?></p><p style="margin: 0px; padding: 0px;"></p><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;"> </p><p style="margin: 0px; padding: 0px;"></p>php?curl?fsockopen ,file_get_contents 三个函数 都可以实现采集模拟发言 ?三者有什么区别,或者讲究么  <p style="margin: 0px; padding: 0px;"><strong class="yibqv">赵永?</strong><br />有些时候用file_get_contents()调用外部文件,容易超时报错。换成curl后就可以.具体原因不清?br />curl 效率比file_get_contents()和fsockopen()高一?原因是CURL会自动对DNS信息进行缓存(亮点?有我待亲?</p><p style="margin: 0px; padding: 0px;"><strong class="yibqv">范佳?</strong><br />file_get_contents curl fsockopen<br />在当前所请求环境下选择性操作,没有一概而论?br />具我们公司开发KBI应用来看?br />刚开始采用:file_get_contents<br />后来采用:fsockopen<br />最后到至今采用:curl</p><p style="margin: 0px; padding: 0px;">(远程)我个人理解到的表述如下(不对请指出,不到位请补充?br />file_get_contents 需要php.ini里开启allow_url_fopen,请求http时,使用的是http_fopen_wrapper,不会keeplive.curl是可以的?br />file_get_contents()单个执行效率高,返回没有头的信息?br />这个是读取一般文件的时候并没有什么问题,但是在读取远程问题的时候就会出现问题?br />如果是要打一个持续连接,多次请求多个页面。那么file_get_contents和fopen就会出问题?br />取得的内容也可能会不对。所以做一些类似采集工作的时候,肯定就有问题了?br />sock较底层,配置麻烦,不易操作?返回完整信息?br /><strong class="yibqv"><br />潘少?腾讯?/strong><br />file_get_contents 虽然可以获得某URL的内容,但不能post  get啊?br />curl 则可以post和get啊。还可以获得head信息<br />而socket则更底层。可以设置基于UDP或是TCP协议去交?br />file_get_contents ?curl 能干的,socket都能干?br />socket能干的,curl 就不一定能干了<br />file_get_contents  更多的时?只是去拉取数据。效率比较高  也比较简单?br />赵的情况这个我也遇到过,我通过CURL设置host 就OK了?nbsp; 这和网络环境有关?/p></div><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/409869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2014-02-14 16:44 <a href="//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>thrift rpc 使用常见问题解答和经?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409868.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Fri, 14 Feb 2014 08:42:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409868.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/409868.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/409868.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/409868.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">原文?a style="color: #336699; text-decoration: none;">//blog.rushcj.com/2010/08/21/try-thrift/</a></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;"><a style="color: #0070c5; margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; font-family: 'trebuchet ms', verdana, sans-serif;">Thrift</a>是一个非常棒的工具,是Facebook的开源项目,目前的开发非常的活跃,由Apache管理,所以用的是Apache Software License,这非常重要,因为可以放心的对其修改并用到自己的项目中?/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">谈到修改Thrift,这非常重要。因为我觉得如果要严肃的使用Thrift,不可避免的要深入了解它,并几乎都要修改Thrift的代码。一个通信框架,它不可能帮你做到所有的事情,也不可能在不了解的情况下就贸然的使用?/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">1.Thrift 的Java Server/Client有个较为严重的bug(https://issues.apache.org/jira/browse/THRIFT-601 ),随机向thrift  sever的监听端口发些数据,可能会导致Server OutOfMemory,细细看看代码,这个bug有点土?/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">2.Thrift Client线程不安全,多线程下使用可能导致Server和客户端程序崩溃。Client的每次调用远程方法其实是有多次Socket写操作,因此每个线程中使用的Client要保证独立,如果多个线程混用同一个Client(其实是用同一个Socket),可能会导致传输的字节顺序混乱,使得Server OutOfMemory(参??/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">3.Thrift定义数据结构时,尽量避免用map, 或者set。在cpp? map被对应为std::map(rb tree)和std::set,thrift生成的类不会重载”<”,因此需要手动修改生成类,否则link没法通过。较为麻烦?/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">4.如果Client端基于效率考虑,要缓存Socket,需要重新实现其TTransport类,以支?Socket缓存池。当然,这个实现其实跟thrift没多大关系,算是2次开发。但一般都要这么做的吧?/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">5.如果Client基于效率考虑,缓存了Socket,那么thrift Server端的模式选择就较为重要了。如果使用同步的TThreadPoolServer,那么无可避免的,客户端缓存1个Socket,Server端就会有一个线程一直处于Server状态,等待peek这个Socket上的数据。这个线程就不能用于其它请求了。所以,及时清理Client端的Socket及控制Socket池的大小是非常必要的?/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">6.听同事说CPP Thrift Server的Epoll NonBlocking模式有效率问题。其实,并发要求不高的Server用LT模式的EPoll其实很方便的,当然,这个要自己给Thrfit Server做patch了,不过也不麻烦。开发起来也是很方便的。我想给我们的Server加个<strong class="yibqv">EPOLLONESHOT</strong>的同步EPoll实现?/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">7.CPP下的 TThreadPoolServer和TThreadServer由一个有趣的问题,如果有客户端维护长连接,那么对这个Server实例做析构的时候会堵塞(前面说过了,在peek?#8230;)?/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">8.用valgrind看,thrift cpp似乎有一些内存问题。没细看?/p><p style="color: #333333; font-family: Arial; line-height: 26px; margin: 0px 0px 1.5385em; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline;">9.无论是Java,还是CPP,Server端都无法通过合法的方式获取Client的ip, port。可以通过编写ThriftServerEventHandler可以处理这件事情。如果想要获取Client ip, port的话,可以看看这个东西?/p><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/409868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2014-02-14 16:42 <a href="//www.ot7t.com.cn/xiaomage234/archive/2014/02/14/409868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>facebook是如何管理代码的 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2014/01/23/409278.html小马?/dc:creator>小马?/author>Thu, 23 Jan 2014 07:21:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2014/01/23/409278.html//www.ot7t.com.cn/xiaomage234/comments/409278.html//www.ot7t.com.cn/xiaomage234/archive/2014/01/23/409278.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/409278.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/409278.html感谢Rockux的投?/strong>
看完之后,终于明白为什么优秀的工程师都去?想去facebook,因为那里是工程师们的天堂?/span>我对facebook的运转着迷。这是一个很独特的环境,不容易被复制(他们的体系并不适合所有的公司,即使他们努力尝试过)。下面是我和facebook的朋友们关于他们如何开发和管理项目的记录?/div>
现在距离我收集的这些信息又过?个月了,我相信facebook肯定又对他们的项目开发实践进行了改进。所以这些记录可能会有点过时。同时facebook的工程师驱动文化也越来越为大众所知。非常感谢那些帮助我整理这篇文章的facebook的朋友们?br />
记录?br />
  • 截止?010?月,facebook有将?000名员工,10个月前只?100名,一年之间差不多翻了一番?/li>
  • 两个最大的部门是工程师和运维,每个部门大概都是400-500人。这两个部门人数大约占了公司的一半?/li>
  • 产品经理与工程师的比例大约为1-7?-10?/li>
  • 每个工程师入职时,都要接?-6周的培训,通过修补bugs和听高级开发工程师的课程来熟悉facebook?/li>
  • 培训结束后,每个工程师都可以接触线上的数据库(更大的权力意味着更大的责任,也有一?勿做清单",不然可能会被开,比如共享用户的隐私数据)?/li>
  • 有非常牢靠的安全体系,以免有人不小心/故意做了些不好的事?/li>
  • 每个工程师可以修改facebook的任何代码,随时可以迁入?/li>
  • 浓厚的工程师驱动文化?产品经理基本可以被忽?,这是facebook一名员工的话。工程师可以修改流程的细节,重新安排工作任务,随时植入自己的想法?/li>
  • 在每月的跨部门会议上,由工程师来汇报工作进度,市场部和产品经理会出席会议,也可以做些简短的发言,但如果说得太多,很可能就会被打小报告。他们确实想让工程师来主导产品的开发,对自己的产品负责?/li>
  • 项目需要的资源都是自愿?/li>
  • 一个产品经理把工程师们召集到一起,让他们对他的想法产生兴趣?/li>
  • 工程师们决定开发那些让他们感兴趣的特性?/li>
  • 工程师跟他们的经理说?我下周想开发这5个新特??/li>
  • 经理会让工程师独立开发,可能有时会让他优先完成一些特性?/li>
  • 工程师独立完成所有的特?#8212;—前端/后端/数据库,等等所有相关的部分。如果需要得到设计人员的帮助,需要先让设计人员对你的想法产生兴趣。其他如架构之类的也一样。但总体来说,工程师要独立完成所有的任务?/li>
  • 对于某个特性是否值得开发的争论,通常是这么解决的:花一个星期的时间完成他,并在小部分人群中(?%)进行测试?/li>
  • 工程师常常希望解决难题,这能获得声望和尊敬。他们很难对前端项目或UI设计产生太大的兴趣。这跟其他公司可能正好相反。在facebook,后端任务,比如新的feed算法,广告投放算法,memcache优化等等,是工程师真正感兴趣的?/li>
  • 所有的代码修改都要进行审核(通过一个或多个工程?,但News Feed是个例外,因为太重要了,Zuckerberg会亲自review?/li>
  • 所有的修改至少要被一个人审核,而且这个系统可以让任何人很方便地审核其他人的代码,即使你没有邀请他
  • 工程师负责测试,代码修复,和维护自己的项目?/li>
  • 每个办公室或通过VPN连接的员工会使用下一版的facebook,这个版本的facebook会经常更新,通常比公开的早1-12小时。所有的员工被强烈建议提交bugs,而且通常会很快被修复?/li>
  • 很奇怪只有很少的QA或自动测?#8212;—"大部分工程师都能写出基本没有bug的代码,只是在其他公司他们不需要这么做。如果有QA部门,他们只要把代码写完,扔给他们就行了"
  • [针对上一条]我们有自动测试,代码发布前必须要通过测试。我们不相信"所有的工程师都能写出没有bug的代?,毕竟这是一个商业公司?/li>
  • 很奇怪,缺少产品经理的影响和控制——产品经理是很独立的和自由的。产生影响力的关键是与工程师和工程师的领导们们搞好关系。需要大致了解技术,不要提一些愚蠢的想法?/li>
  • 所有提交的代码每周二打包一次?/li>
  • 只要多一分努力,终于一天会发生改变?/li>
  • 星期二的代码发布,需要所有的提交过代码的工程师在场?/li>
  • 代码打包前,工程师必须在一个特殊的IRC channel上?/li>
  • 运维执行打包过程
  • facebook有大?0000台服务器
  • ?个代码发布级?/li>
  • 最小的级别只有6台服务器
  • 星期二的代码发布会先发布?台服务器上,运维组会检测这6台服务器的反应,保证代码正常工作,然后再提交到下一?/li>
  • 如果发布出现了一些问题(如报错等等),那么就停止下一级的部署,提交出错代码的工程师负责修复问题,然后从头继续发布?/li>
  • 所以一次发布可能会经历几次重复?-2-3-fix. 回到1. 1-2-3-4-5-fix. 回到1. 1-2-3-4-5-6-7-8-9
  • 运维组是受过严格训练,倍受尊敬,而且有商业意识的。他们的工作包括分析错误日志,负载和内存状态等等。还包括用户行为?/li>
  • 代码发布期间,运维组使用IRC-based页面系统,可以通过facebook/email/irc/im/sms ping每一个工程师,如果需要他们注意的话。对运维组不做回应是一件很羞愧的事?/li>
  • 代码一旦发布到?级,并且稳定运行,就算发布成功了?/li>
  • 如果一个特性没有按时完成,也没什么大不了的,下次完成时一并发布即可?/li>
  • 如果被svn-blamed,public shamed或工作经常疏忽就很可能被开除?这是一个高效的文化"。不够高效或者不够聪明的员工会被剔除。管理层会在6个月的时间里观察你表现,如果不合格,只能说再见。每一级都是这个待遇,即使是C级别和VP级别,如果不够高效,也会被开除?/li>
  • 被责骂不会导致解雇。我们特别尊重别人,原谅别人。大部分高级工程师都或多或少犯过一些严重的错误,包括我。但没有人因此被解雇?/li>
  • 我也没有遇到过因为上面提到过的犯错误而被解雇。有些人犯了错,他们会非常努力地去修复,也让其他人得到了学习?/li>


]]>
php 项目开发基础工具 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2014/01/23/409263.html小马?/dc:creator>小马?/author>Thu, 23 Jan 2014 03:24:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2014/01/23/409263.html//www.ot7t.com.cn/xiaomage234/comments/409263.html//www.ot7t.com.cn/xiaomage234/archive/2014/01/23/409263.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/409263.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/409263.htmlPHPUnit
是一个轻量级的PHP测试框架。它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一?它们都基于模式先锋Kent Beck的设?

单元测试是几个现代敏捷开发方法的基础,使得PHPUnit成为许多大型PHP项目的关键工具。这个工具也可以?a target="_blank" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Xdebug扩展用来生成代码覆盖率报?,并且可以与phing集成来自动测试,最合它还可以和Selenium整合来完成大型的自动化集成测试?br />资料://phpunit.de/documentation.html

2 composer
项目依赖管理工具 资料?a style="font-family: verdana, 'courier new'; font-size: 14px;">//getcomposer.org/doc/00-intro.md#installation-nix

3 syslog-ng  
集中日志服务器,相比syslog更有优势 资料?a style="font-family: verdana, 'courier new'; font-size: 14px;">//www.gaizaoren.org/archives/428



]]>
[开源推荐]Google新的Web UI库:Polymer 【转?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2013/12/04/407211.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Wed, 04 Dec 2013 07:20:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2013/12/04/407211.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/407211.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2013/12/04/407211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/407211.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/407211.html</trackback:ping><description><![CDATA[<div style="margin: 0px 0px 1.5em; padding: 5px 10px; list-style: none; background-color: #f7f7f7; color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px;"><strong class="yibqv">摘要?/strong>Polymer是由原Palm webOS开发Enyo框架的团队加盟Google后打造的,基于Shadow DOM、Custom Elements、MDV等最新浏览器特性,支持Web Components?/div><div news_content"="" style="margin: 0px 0px 30px; list-style: none; color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #ffffff;"><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">今年的Google I/O大会,绝对是一?a target="_blank" style="cursor: pointer; color: #0066cc; text-decoration: none;">为开发者所准备的盛?/a>?a target="_blank" style="cursor: pointer; color: #0066cc; text-decoration: none;">发布多个软件产品与服?/a>,并且主要以发布平台和服务为主,比如?a target="_blank" style="cursor: pointer; color: #0066cc; text-decoration: none;">Android开发者称赞的Android Studio</a>、推出Google Play Game服务、对地图进行重大升级等。而在Web平台领域,Google则发布了最新的Web UI库Polymer?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">Polymer基于Shadow DOM、Custom Elements、MDV等最新浏览器特性,代表了下一代Web框架的方向:一切皆组件、尽量减少代码量、尽量减少框架限制。由加盟Google的原Palm webOS开发团队打造?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"><a target="_blank" style="cursor: pointer; color: #0066cc; text-decoration: none;"><img src="//cms.csdnimg.cn/article/201305/17/5195c5cedfe1f.jpg" border="0" style="vertical-align: middle; border: none;" alt="" /> </a><br /></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">架构?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"><strong class="yibqv">快速入?/strong></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">1.把项目拷贝到解决方案的根目录文件夹中,参?nbsp;<a style="cursor: pointer; color: #0066cc; text-decoration: none;">Get the code</a>?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><div style="margin: 0px; list-style: none;"><div id="highlighter_91214" js"="" style="margin: 0px 0px 20px; list-style: none; word-break: break-all;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none; width: 618px;"><tbody><tr><td style="margin: 0px; list-style: none; border: none; white-space: nowrap; width: 30px; padding: 0px !important; color: #333333 !important; background-color: #eeeeee !important; text-align: center !important;"><div number1="" index0="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 48px !important;">1</div></td><td style="margin: 0px; list-style: none; border: none; padding: 0px !important;"><div style="margin: 0px; list-style: none;"><div number1="" index0="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">git clone git:</code><code comments"="" style="margin: 0px; padding: 0px; list-style: none; display: block; color: #008200 !important;">//github.com/Polymer/polymer.git --recursive</code></div></div></td></tr></tbody></table></div></div>2.启动Web服务?p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">3.在主页面引用polymer.js</p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><div style="margin: 0px; list-style: none;"><div id="highlighter_710801" js"="" style="margin: 0px 0px 20px; list-style: none; word-break: break-all;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none; width: 618px;"><tbody><tr><td style="margin: 0px; list-style: none; border: none; white-space: nowrap; width: 30px; padding: 0px !important; color: #333333 !important; background-color: #eeeeee !important; text-align: center !important;"><div number1="" index0="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">1</div></td><td style="margin: 0px; list-style: none; border: none; padding: 0px !important;"><div style="margin: 0px; list-style: none;"><div number1="" index0="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"><script src=</code><code string"="" style="margin: 0px; padding: 0px; list-style: none; color: #0066cc !important;">"Polymer/polymer.js"</code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">></script></code></div></div></td></tr></tbody></table></div></div>4.阅读<a target="_blank" style="cursor: pointer; color: #0066cc; text-decoration: none;">开始指?/a><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">5.学习如何使用Polymer内核快速搭建Web组件</p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">6.玩转<a target="_blank" style="cursor: pointer; color: #0066cc; text-decoration: none;">toolkit-ui示例</a>(必须在Web服务器上运行?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">7.加入<a style="cursor: pointer; color: #0066cc; text-decoration: none;">mailing list</a>,提问并且得到相应地回复?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"><strong class="yibqv">Polymer内核</strong></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">Polymer内核代码由polymer.js这个文件提供,其提供了一个薄层代码来表示Polymer选项,并且提供了所有组件使用的糖?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><ol style="margin: 0px 0px 1em 30px; padding: 0px; list-style-position: initial; list-style-image: initial;"><li style="margin: 0px; padding: 0px; list-style: decimal;">组件声明</li><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">Web组件声明代码如下所示:</p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><div style="margin: 0px; list-style: none;"><div id="highlighter_558719" js"="" style="margin: 0px 0px 20px; list-style: none; word-break: break-all;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none; width: 588px;"><tbody><tr><td style="margin: 0px; list-style: none; border: none; white-space: nowrap; width: 30px; padding: 0px !important; color: #333333 !important; background-color: #eeeeee !important; text-align: center !important;"><div number1="" index0="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">1</div><div number2="" index1="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">2</div><div number3="" index2="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">3</div><div number4="" index3="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">4</div><div number5="" index4="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">5</div><div number6="" index5="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">6</div><div number7="" index6="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">7</div><div number8="" index7="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">8</div></td><td style="margin: 0px; list-style: none; border: none; padding: 0px !important;"><div style="margin: 0px; list-style: none;"><div number1="" index0="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"><element name=</code><code string"="" style="margin: 0px; padding: 0px; list-style: none; color: #0066cc !important;">"tag-name"</code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">></code></div><div number2="" index1="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"><template></code></div><div number3="" index2="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"><!-- shadow DOM here --></code></div><div number4="" index3="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"></template></code></div><div number5="" index4="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"><script></code></div><div number6="" index5="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code comments"="" style="margin: 0px; padding: 0px; list-style: none; display: block; color: #008200 !important;">// lifecycle setup here</code></div><div number7="" index6="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"></script></code></div><div number8="" index7="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"></element></code></div></div></td></tr></tbody></table></div></div><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">在该组件中添加Polymer.register生命周期来初始化组件?lt;script>块,如下所示:</p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><div style="margin: 0px; list-style: none;"><div id="highlighter_972997" js"="" style="margin: 0px 0px 20px; list-style: none; word-break: break-all;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none; width: 588px;"><tbody><tr><td style="margin: 0px; list-style: none; border: none; white-space: nowrap; width: 30px; padding: 0px !important; color: #333333 !important; background-color: #eeeeee !important; text-align: center !important;"><div number1="" index0="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">1</div><div number2="" index1="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">2</div><div number3="" index2="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">3</div><div number4="" index3="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">4</div><div number5="" index4="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">5</div><div number6="" index5="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">6</div><div number7="" index6="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">7</div><div number8="" index7="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">8</div></td><td style="margin: 0px; list-style: none; border: none; padding: 0px !important;"><div style="margin: 0px; list-style: none;"><div number1="" index0="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"><font face=</code><code string"="" style="margin: 0px; padding: 0px; list-style: none; color: #0066cc !important;">"Menlo, Monaco, monospace, sans-serif"</code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">><element name=</code><code string"="" style="margin: 0px; padding: 0px; list-style: none; color: #0066cc !important;">"tag-name"</code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">></code></div><div number2="" index1="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code spaces"="" style="margin: 0px; padding: 0px; list-style: none;">  </code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"><template></code></div><div number3="" index2="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code spaces"="" style="margin: 0px; padding: 0px; list-style: none;">    </code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"><!-- shadow DOM here --></code></div><div number4="" index3="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code spaces"="" style="margin: 0px; padding: 0px; list-style: none;">  </code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"></template></code></div><div number5="" index4="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code spaces"="" style="margin: 0px; padding: 0px; list-style: none;">  </code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"><script></code></div><div number6="" index5="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code spaces"="" style="margin: 0px; padding: 0px; list-style: none;">    </code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">Polymer.register(</code><code keyword"="" style="margin: 0px; padding: 0px; list-style: none; color: #006699 !important; font-weight: bold !important;">this</code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">);</code></div><div number7="" index6="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code spaces"="" style="margin: 0px; padding: 0px; list-style: none;">  </code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"></script></code></div><div number8="" index7="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;"></element></font></code></div></div></td></tr></tbody></table></div></div><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><li style="margin: 0px; padding: 0px; list-style: decimal;">元素初始?/li><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">第一个参数Polymer.register是引用到<element>元素里的,因为脚本在element标记里运行,所以参数就设为“this”?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">你可以提供第二个对象参数到Polymer.register里去定义对象原型,在下面的代码里,该组件初始化了一个message属性和ready方法?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"></p><div style="margin: 0px; list-style: none;"><div id="highlighter_51101" js"="" style="margin: 0px 0px 20px; list-style: none; word-break: break-all;"><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none; width: 588px;"><tbody><tr><td style="margin: 0px; list-style: none; border: none; white-space: nowrap; width: 30px; padding: 0px !important; color: #333333 !important; background-color: #eeeeee !important; text-align: center !important;"><div number1="" index0="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">1</div><div number2="" index1="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">2</div><div number3="" index2="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">3</div><div number4="" index3="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">4</div><div number5="" index4="" alt2"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">5</div><div number6="" index5="" alt1"="" style="margin: 0px; padding-left: 3px; list-style: none; padding-right: 8px !important; border-right-width: 3px !important; border-right-style: solid !important; border-right-color: #146b00 !important; height: 24px !important;">6</div></td><td style="margin: 0px; list-style: none; border: none; padding: 0px !important;"><div style="margin: 0px; list-style: none;"><div number1="" index0="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">Polymer.register(</code><code keyword"="" style="margin: 0px; padding: 0px; list-style: none; color: #006699 !important; font-weight: bold !important;">this</code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">, {</code></div><div number2="" index1="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">message: </code><code string"="" style="margin: 0px; padding: 0px; list-style: none; color: #0066cc !important;">"Hello!"</code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">,</code></div><div number3="" index2="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">ready: </code><code keyword"="" style="margin: 0px; padding: 0px; list-style: none; color: #006699 !important; font-weight: bold !important;">function</code><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">() {</code></div><div number4="" index3="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code comments"="" style="margin: 0px; padding: 0px; list-style: none; display: block; color: #008200 !important;">// component is ready now, we can do stuff</code></div><div number5="" index4="" alt2"="" style="margin: 0px; list-style: none; padding-left: 10px !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">}</code></div><div number6="" index5="" alt1"="" style="margin: 0px; list-style: none; padding-left: 10px !important; background-color: #f8f8f8 !important;"><code plain"="" style="margin: 0px; padding: 0px; list-style: none;">});</code></div></div></td></tr></tbody></table></div></div></ol><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">目前,Polymer还处于初期阶段,它和其他框架一样,尽可能地拥抱HTML。它的目标是通过使用像Custom Elements和Shadow DOM这些新兴的Web标准的少量独立polyfill发展Web平台。此外,应用于移动平台也是其中的核心目标之一。Polymer开发团队正在研究响应式组件,让其可以正确无误地在台式机、平板电脑、手机上进行自动化配置?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">当然,Polymer的诞生也意味着Google现在有三个相互竞争的Web应用开发库:Polymer、Dart(也具有UI开发功能)和AngularJS?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">对于Polymer,开发者有哪些话要说呢?让我们一起来看下?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"><a style="cursor: pointer; color: #0066cc; text-decoration: none;">清风一二两</a>:Palm webOS用另一种方式重生?<br /></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"><a style="cursor: pointer; color: #0066cc; text-decoration: none;">三合一?/a>:Enyo的Google版~换汤不换药~<a style="cursor: pointer; color: #0066cc; text-decoration: none;"></a><br /></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"><a style="cursor: pointer; color: #0066cc; text-decoration: none;">刘晗的微?/a>:在HTML领域离标准太远自己搞一套,出路不大。特别是像这种绑定机制,貌似理念是MVC,但MVC这种东西做简单页面还行?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"><a target="_blank" style="cursor: pointer; color: #0066cc; text-decoration: none;">eldude</a>:声明性质、封装、数据绑定、属性和事件驱动API这些都是数量级的,要比现有JavaScript/HTML UI组件简单?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"><a style="cursor: pointer; color: #0066cc; text-decoration: none;">neilk</a>:这个框架看起来非常酷,?#8220;built by Google”有点用词不当,像Closure或Angular、Polymer等这些都Google内部使用的技术,在经过千锤百炼后才像面向公众,因此称?nbsp;"technologies by Googlers"更为合适?/p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;"><strong class="yibqv">相关资料</strong></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">Polymer主页?nbsp;<a style="cursor: pointer; color: #0066cc; text-decoration: none;">//www.polymer-project.org/</a></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">项目主页上的FAQ描述比较清晰?nbsp;<a style="cursor: pointer; color: #0066cc; text-decoration: none;">//www.polymer-project.org/faq.html</a> <br /></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">架构图: <a style="cursor: pointer; color: #0066cc; text-decoration: none;">//www.polymer-project.org/images/architecture-diagram.svg?20130516</a><br /></p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none;">GitHub?nbsp;<a style="cursor: pointer; color: #0066cc; text-decoration: none;">https://github.com/polymer/polymer</a> </p><p style="margin: 0px 0px 1.5em; padding: 0px; list-style: none; font-weight: bold;">本文为CSDN编译整理,未经允许不得转载,如需转载请联系market#csdn.net(#换成@)</p></div><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/407211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2013-12-04 15:20 <a href="//www.ot7t.com.cn/xiaomage234/archive/2013/12/04/407211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>互联网公司linux运维生产场景常用软件工具一览【转自老男孩?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2013/11/07/406109.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Thu, 07 Nov 2013 08:12:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2013/11/07/406109.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/406109.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2013/11/07/406109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/406109.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/406109.html</trackback:ping><description><![CDATA[<p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; font-size: 16px;"><strong style="padding: 0px; margin: 0px;">互联网公司linux运维生产场景常用软件工具一览,同时补充了个别常用但不是开源的软件?/strong><br style="padding: 0px; margin: 0px;" /><br style="padding: 0px; margin: 0px;" />下午受邀请参加了一个BBS活动,于是有了下面的内容?br style="padding: 0px; margin: 0px;" />下面是在linux网站运维方向老男孩最近几年常用的免费的开源软件,临时即兴想起来的,在这里和大家分享,希望给初学者指引一点路?br style="padding: 0px; margin: 0px;" />linux的世界真的很精彩,还没入门的朋友赶紧进来吧!</span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; font-size: 16px;">操作系统:Centos<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>Freebsd,Ubuntu,Redhatlinux,suselinux<br style="padding: 0px; margin: 0px;" />网站服务:apache<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>nginx<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,lighttpd,php<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>tomcat<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>resin<span style="padding: 0px; margin: 0px; color: #ff0000;">※<br style="padding: 0px; margin: 0px;" /></span>数据库:Mysql<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>PostgreSQL,Mysql-proxy,<span style="padding: 0px; margin: 0px; background-color: #f8f8f8; text-indent: 28px; font-size: 14px; line-height: 25px; font-family: 宋体; color: #333333;">MariaDB</span><br style="padding: 0px; margin: 0px;" />代理相关:lvs,keepalived,haproxy,nginx,apache,heartbeat(此行都?span style="padding: 0px; margin: 0px; color: #ff0000;">※?br style="padding: 0px; margin: 0px;" /></span>网站缓存:squid<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>nginx<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>varnish<br style="padding: 0px; margin: 0px;" />内存缓存:memcached<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>memcachedb,TokyoTyrant<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>MongoDB,Cassandra<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>redis※,tair,CouchDB<br style="padding: 0px; margin: 0px;" />存储相关:Nfs<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>Moosefs<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>Hadoop<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>gfs<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>lustre,FastDFS<br style="padding: 0px; margin: 0px;" />版本管理:cvs,svn<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>git<span style="padding: 0px; margin: 0px; color: #ff0000;">※<br style="padding: 0px; margin: 0px;" /></span>监控报警:mboy,mrtg,nagios<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,cacti<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,zabbix,munin<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,hyperic<span style="padding: 0px; margin: 0px; color: #ff0000;">※<br style="padding: 0px; margin: 0px;" /></span>域名解析:bind<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,powerdns,dnsmq<span style="padding: 0px; margin: 0px; color: #ff0000;">※<br style="padding: 0px; margin: 0px;" /></span>同步软件:rsync,inotify,sersync,drbd,csync2,union,lsyncd,scp(此行都?#8251;?br style="padding: 0px; margin: 0px;" />分发工具:Secboy<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,expect<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>puppet<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>cfengine<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>ssh+rsync+sersync<span style="padding: 0px; margin: 0px; color: #ff0000;">※<br style="padding: 0px; margin: 0px;" /></span>虚拟软件:xen<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,kvm<br style="padding: 0px; margin: 0px;" />内网软件:iptables<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,zebra<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,iftraf,ntop<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,tc<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,iftop<br style="padding: 0px; margin: 0px;" />邮件软件:qmail<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>posfix<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>sendmail<br style="padding: 0px; margin: 0px;" />远程拨号:openvpn<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,pptp,openswan<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,ipip<span style="padding: 0px; margin: 0px; color: #ff0000;">※<br style="padding: 0px; margin: 0px;" /></span>统一认证:ldap(可结合微软活动目?<span style="padding: 0px; margin: 0px; color: #ff0000;">※<br style="padding: 0px; margin: 0px;" /></span>队列工具:ActiveMQ<span style="padding: 0px; margin: 0px; color: #ff0000;">※,</span>RabbitMQ,MemcacheQ<br style="padding: 0px; margin: 0px;" />打包发布:mvn<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,ants<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>,jenkins<span style="padding: 0px; margin: 0px; color: #ff0000;">※<br style="padding: 0px; margin: 0px;" /></span>测试软件:apacheab,smokeping,siege,JMeter,Webbench,LoadRunner(此行都?span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>?br style="padding: 0px; margin: 0px;" />日志相关:syslog,rsyslog,Awstats<br style="padding: 0px; margin: 0px;" />DB代理:mysql-proxy,amoeba(更多还是程序实现读写分离)<br style="padding: 0px; margin: 0px;" />搜索软件:Sphinx,Xapian(大公司会自己开发类似百度的小规模内部搜索引擎)<br style="padding: 0px; margin: 0px;" /></span><span style="padding: 0px; margin: 0px; font-size: 16px;"><br style="padding: 0px; margin: 0px;" />提示?br style="padding: 0px; margin: 0px;" />1)以上所有软件都是老男孩用过或测试过的?br style="padding: 0px; margin: 0px;" />2)带<strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; color: #ff0000;">※</span></strong>的为老男孩最近几年用的比较多,可信任使用的。也是近年来linux运维的大众?br style="padding: 0px; margin: 0px;" />3)有了功能分类和软件名,大家有需求,可以按功能找软件直接G就知道了?/span><br style="padding: 0px; margin: 0px;" /><span style="padding: 0px; margin: 0px; font-size: 16px;">4)学习要有舍有得,什么都抓必然短时间都不会精,希望大家能抓重点,抓精髓,大众软件(带<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>)先熟练了,这是基础加提高,在研究小众软件(不带<span style="padding: 0px; margin: 0px; color: #ff0000;">※</span>),这是高手之路,最后在研究偏门的,世外高手之路,当然前提是先掌握前面的大众和小众?br style="padding: 0px; margin: 0px;" />5)当然还有一些没有大众开源的有一些也很棒,如审计堡垒机程序?br style="padding: 0px; margin: 0px;" /><br style="padding: 0px; margin: 0px;" />还有用的多的,老男孩落下的,大家补充啊?/span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">本文出自 “<a style="padding: 0px; margin: 0px; color: #015f91; text-decoration: none;">老男孩linux运维</a>” 博客,请务必保留此出?a style="padding: 0px; margin: 0px; color: #015f91; text-decoration: none;">//oldboy.blog.51cto.com/2561410/775056</a></p><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/406109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2013-11-07 16:12 <a href="//www.ot7t.com.cn/xiaomage234/archive/2013/11/07/406109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各数据交换的协议优劣比较 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/09/11/403948.html小马?/dc:creator>小马?/author>Wed, 11 Sep 2013 04:08:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/09/11/403948.html//www.ot7t.com.cn/xiaomage234/comments/403948.html//www.ot7t.com.cn/xiaomage234/archive/2013/09/11/403948.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/403948.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/403948.html@import url(//www.ot7t.com.cn/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(//www.ot7t.com.cn/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

如何选择数据交换协议

  选择什么样的协议跟我们的应用场景有很大的关系。我们需要考虑我们开发是否方便、接口是否容易发布、是否需要考虑带宽占用成本、序列化和反序列化的性能、接口协议的扩展性等等。下面我们看下几个比较常用的交换协议实现?/p>
协议实现跨语言性能传输?/td>RPC
xml广泛几乎所?/td>?/td>很大N(可实现?/td>
json广泛大量一?/td>一?/td>N(可实现?/td>
php serializePHPRPC大量一?/td>一?/td>Y
hessianhessian大量一?/td>?/td>Y
thriftthrift大量?/td>?/td>Y
protobufprotobuf大量?/td>?/td>N(可实现?/td>
iceice大量?/td>?/td>Y
avroApache Avro少量?/td>?/td>Y
messagepackmessagepack大量?/td>?/td>Y

  上面表格列出了一些常用数据交换协议的一些特性的比较。这里并没有比较好坏,只是想说明不同数据交换协议是有区别的,所以我们需要在我们的应用场景中进行选择?br />
 messagepack相关资料

//pluto418.iteye.com/blog/1108457
优势?br />1.序列化和反序列化所需要的时间少。通过30000条的记录来测试,msgpack序列化的时间比使用jason来序列化JSON的时间要少三分之一;而反序列化的时间则要少一半?br />2.生成的文件体积小。同样也是基?0000条记录来测试,msgpack序列化后生成的二进制文件比用jason序列化出来的时间要少一半?/strong> 
劣势?br />1.msgpack对复杂的数据类型(List、Map)支持的不够,序列化没有问题,但是反序列化回来就很麻烦,尤其是对于java开发人员?br />2.在上面也提到过,msgpack是通过value的顺序来定位属性的,那么需要在不同的语言中都要维护同样的模型以及模型中属性的顺序。这个会让开发人员很困扰?br />3.msgpack无法支持在模型中包含和嵌套其他自定义的模型(如weibo模型中包含comment的列表)?br />

@import url(//www.ot7t.com.cn/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

posted on 2011-12-26 10:57 tobyxiong 阅读(958) 评论(0)  编辑  收藏 所属分? java



]]>
xsplit A PHP extension for Chinese segmentation using MMSEG algorithm[zz] - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/08/13/402755.html小马?/dc:creator>小马?/author>Tue, 13 Aug 2013 09:35:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/08/13/402755.html//www.ot7t.com.cn/xiaomage234/comments/402755.html//www.ot7t.com.cn/xiaomage234/archive/2013/08/13/402755.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/402755.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/402755.htmlfrom:https://code.google.com/p/xsplit/
一点历?/div>
这个project大约?9年初开始做的,很快就形成了现在版本的样子,后陆续做了一些小修改和修复了一些小bug,现整理了一下决定发布。把它open source的主要原因,就是希望这个小工具能对大家有用,并且能够参与进来一起把它做的更?/div>
20101025
Change Log
20130509 0.0.9 released fixed an issue when compiler uses strict type checking
20101108 0.0.8 beta,加入xs_simhash和xs_hdist函数,分别计算simhash和汉明距离?/div>
关于xsplit的交流,请到xsplit贴吧?//tieba.baidu.com/f?kw=xsplit 参与讨论?/div>
xsplit是一个PHP扩展,提供基于MMSEG算法的分词功能。目前只在linux下测试并部署过,希望有朋友可以帮忙编译提供windows下的dll?/div>
xsplit只处理UTF8编码格式,如果是其他编码格式,请在使用前自行转换
xsplit主要有以下几个函数:
bool xs_build ( array $words, string $dict_file )
resource xs_open (string $dict_file [, bool $persistent])
array xs_split ( string $text [, int $split_method = 1 ? resource $dictionary_identifier ?] )
mixed xs_search ( string $text ? int $search_method [, resource $dictionary_identifer ] ?)
string xs_simhash( string $text [, bool $isBinary] ) 
int xs_hdist( string $simhash1, string $simhash2 )
安装过程与一般的PHP扩展安装一?/div>
$phpize
$./configure --with-php-config=/path/to/php-config
$make
$make install
php.ini中可以设置以下参数:
xsplit.allow_persisten = On
xsplit.max_dicts = 5
xsplit.max_persistent = 3
xsplit.default_dict_file = /home/xdict
xsplit.allow_persistent 是否允许加载持久词典
xsplit.max_dicts 允许同时打开的最大词典数?/div>
xsplit.max_persistent 允许同时打开的最大持久词典数?/div>
xsplit.default_dict_file 默认的词典,没有指定词典时会调用此词?/div>
源码中有一个utils目录,包?/div>
make_dict.php 提供命令行方式创建词?/div>
xsplit.php 一个简单的示例文件
xdict_example.txt 一个文本词库的格式示例
make_dict.php的使用例子如下:
$php make_dict.php ./xdict_example.txt ./xdict.db
文本词库的格式请参考xdict_example.txt
bool xs_build (array $words, string $dict_file)
?words数组建立名称?dict_file的词典,若成功则返回true?words数组的格式请参考示例,key为词语,value为词频?/div>
例子如下?/div>
<?php
$dict_file='dict.db';
$dwords['美丽']=100;
$dwords['蝴蝶']=100;
$dwords['永远']=100;
$dwords['心中']=100;
$dwords['翩翩']=100;
$dwords['飞舞']=100;
$dwords['翩翩飞舞']=10;
if(!xs_build($dwords, $dict_file)) {
    die('建立词典失败?);
}
resource xs_open (string $dict_file [, bool $persistent])
打开一个词典文件,并返回一个resource类型的identifier?persistent可以指定是否是持久化词典,持久化词典在这里可以理解为词典资源生命周期的不同,一般情况下$persistent=true或者默认缺省即可。在进行分词的时候,可以指定不同的词典?/div>
$dict_file_1 = 'xdcit.db';
$dict_file_2 = 'mydict.db';
$dict1 = xs_open($dict_file);
xs_open($dict_file); 
array xs_split ( string $text [, int $split_method = 1 ? resource $dictionary_identifier ?] )
对文本进行分词,可以指定分词方法和词典。分词方法目前有两种,一个是MMSEG算法(默认),一个是正向最大匹配,分别用常量XS_SPLIT_MMSEG和XS_SPLIT_MMFWD表示。返回值是一个数组,包含所有切分好的词语。如果不指定词典,最后一次打开的词典将被使用?/div>
<?php
$text="那只美丽的蝴蝶永远在我心中翩翩飞舞着?;
$dict_file = 'xdict.db';
$dict_res = xs_open($dict_file);
$words = xs_split($text);  /* 此处没有指定词典资源,默认使用最后一次打开的词?*/
$words1 = xs_split($text, XS_SPLIT_MMSEG, $dict_res);
mixed xs_search ( string $text ? int $search_method [, $dictionary_identifer ] ?) 基于双数组trie树提供的一些功能,$search_method有四个常量表示:
XS_SEARCH_CP : darts的commonPrefixSearch封装,如果没有找到,返回false?/div>
XS_SEARCH_EM : darts的exactMatchSearch封装,如果没有找到,返回false?/div>
XS_SEARCH_ALL_SIMPLE : 按照词典返回所有词语词频总和,一个INT型数值?/div>
XS_SEARCH_ALL_DETAIL : 按照词典返回所有词典的词频,并以数组形式返回每一个词语的详细统计?/div>
如果不指定词典,最后一次打开的词典将被使用?/div>
<?php
xs_open($dict_file);
$text="那只美丽的蝴蝶永远在我心中翩翩飞舞着?;
$word='翩翩飞舞';
$result=xs_search($word, XS_SEARCH_CP); /* common prefix search */
var_dump($result);
$result=xs_search($word, XS_SEARCH_EM); /* exact match search */
var_dump($result);
$result=xs_search($text, XS_SEARCH_ALL_SIMPLE);
var_dump($result);
$result=xs_search($text, XS_SEARCH_ALL_DETAIL);
var_dump($result);
string xs_simhash( array $tokens [, bool $rawoutput] )
计算simhash。这里所有token权重都是1?tokens的例子如array('?, '这个', '世界')?rawoput默认?,即返回simhash的hex string形式,如md5?sha1函数一样;如过$rawoput为真,返回一?字节的字符串,这个字符串实际上是一?4 bits的整型数,uint64_t,在一些特殊情况下可以用到?/div>
int xs_hdist?string $simhash1, $string $simhash2)
计算汉明距离?/div>
<?php
xs_open('xdict');
$text1="那只美丽的蝴蝶永远在我心中翩翩飞舞着?;
$text2="那只美丽的蝴蝶永远在我心中翩翩飞舞?;
$tokens1=xs_search($text1, XS_SEARCH_ALL_INDICT); /* 去掉标点等特殊符号,经过实验,计算simhash时,一些标点、换行、特殊符号等对效果影响较?*/
$tokens2=xs_search($text2, XS_SEARCH_ALL_INDICT);
$simhash1=xs_simhash($tokens1);
$simhash2=xs_simhash($tokens2);
echo "simhash1 is {$simhash1}\n";
echo "simhash2 is {$simhash2}\n";
$hamming_dist=xs_hdist($simhash1, $simhash2);
echo "bit-wise format:\n";
echo decbin(hexdec($simhash1)), "\n";
echo decbin(hexdec($simhash2)), "\n";
echo "hamming distance is {$hamming_dist}\n";
Terms - Privacy


]]>Nginx优化配置(? - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/08/01/402273.html小马?/dc:creator>小马?/author>Thu, 01 Aug 2013 14:18:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/08/01/402273.html//www.ot7t.com.cn/xiaomage234/comments/402273.html//www.ot7t.com.cn/xiaomage234/archive/2013/08/01/402273.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/402273.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/402273.html

这里主要讲的是Nginx的优化方法,同时还需要优化php-fpm配置,方法请参考://blog.haohtml.com/archives/11162.

优化前:

优化?

看得出差距还是特别的大的?/p>

/etc/sysctl.conf

一般来说nginx配置文件中对优化比较有作用的为以下几项:

worker_processes 8;
nginx进程数,建议按照cpu数目来指定,一般为它的倍数,平时设置?倍?/p>

cpu个数查看方法参?//blog.haohtml.com/archives/11123 ?nbsp;//blog.haohtml.com/archives/9236

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
为每个进程分配cpu,上例中?个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu?/p>

worker_rlimit_nofile 102400;
这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。ulimit的用法参考://blog.haohtml.com/archives/9883

use epoll;
使用epoll的I/O模型,这个不用说了吧?/p>

worker_connections 102400;
每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数?strong style="border: 0px; font-family: inherit; font-style: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">worker_processes*worker_connections?/p>

keepalive_timeout 60;
keepalive超时时间?/p>

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超?k,不过由于一般系统分页都要大?k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得?/p>

open_file_cache max=102400 inactive=20s;
这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存?/p>

open_file_cache_valid 30s;
这个是指多长时间检查一次缓存的有效信息?/p>

open_file_cache_min_uses 1;
open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除?/p>

关于内核参数的优化:

net.ipv4.tcp_max_tw_buckets = 6000
timewait的数量,默认?80000?/p>

net.ipv4.ip_local_port_range = 1024    65000
允许系统打开的端口范围?/p>

net.ipv4.tcp_tw_recycle = 1
启用timewait快速回收?/p>

net.ipv4.tcp_tw_reuse = 1
开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接?/p>

net.ipv4.tcp_syncookies = 1
开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理?/p>

net.core.somaxconn = 262144
web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制?28,而nginx定义的NGX_LISTEN_BACKLOG默认?11,所以有必要调整这个值?/p>

net.core.netdev_max_backlog = 262144
每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目?/p>

net.ipv4.tcp_max_orphans = 262144
系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个?如果增加了内存之??/p>

net.ipv4.tcp_max_syn_backlog = 262144
记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则?28?/p>

net.ipv4.tcp_timestamps = 0
时间戳可以避免序列号的卷绕。一?Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这?#8220;异常”的数据包。这里需要将其关掉?/p>

net.ipv4.tcp_synack_retries = 1
为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量?/p>

net.ipv4.tcp_syn_retries = 1
在内核放弃建立连接之前发送SYN包的数量?/p>

net.ipv4.tcp_fin_timeout = 1
如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒?.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃?.5K内存,但是它们的生存期长些?/p>

net.ipv4.tcp_keepalive_time = 30
当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时?/p>

下面贴一个完整的内核优化设置?/p>

引用

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024    65000

下面是一个简单的nginx配置文件?/strong>

user  www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log  /www/log/nginx_error.log  crit;
pid        /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 204800;

events
{
use epoll;
worker_connections 204800;
}

http
{
include       mime.types;
default_type  application/octet-stream;

charset  utf-8;

server_names_hash_bucket_size 128;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 8m;

sendfile on;
tcp_nopush     on;

keepalive_timeout 60;

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
keys_zone=TEST:10m
inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 8 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;

open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;
tcp_nodelay on;

gzip on;
gzip_min_length  1k;
gzip_buffers     4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types       text/plain application/x-javascript text/css application/xml;
gzip_vary on;
server
{
listen       8080;
server_name  backup.aiju.com;
index index.php index.htm;
root  /www/html/;  #这里的位置很重要,不要写在其它指令里面,我曾经就调试了好久才发现这个问题?/span>

location /status
{
stub_status on;
}

location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
expires      30d;
}

log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log  /www/log/access.log  access;
}
}

关于FastCGI的几个指?//wiki.nginx.org/NginxChsHttpFcgiModule)?/strong>

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
这个指令为FastCGI缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间?/p>

fastcgi_connect_timeout 300;
指定连接到后端FastCGI的超时时间?/p>

fastcgi_send_timeout 300;
向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间?/p>

fastcgi_read_timeout 300;
接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间?/p>

fastcgi_buffer_size 64k;
指定读取FastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,由于页面大小为4k,所以这里设置为4k?/p>

fastcgi_buffers 8 64k;
指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答?/p>

fastcgi_busy_buffers_size 128k;
这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffers的两倍?/p>

fastcgi_temp_file_write_size 128k;
在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍?/p>

fastcgi_cache TEST
开启FastCGI缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU负载,并且防?02错误?/p>

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
为指定的应答代码指定缓存时间,如上例中将200?02应答缓存一小时?01应答缓存1天,其他?分钟?/p>

fastcgi_cache_min_uses 1;
缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数,如上例,如果?分钟内某文件1次也没有被使用,那么这个文件将被移除?/p>

fastcgi_cache_use_stale error timeout invalid_header http_500;
不知道这个参数的作用,猜想应该是让nginx知道哪些类型的缓存是没用的?/p>

以上为nginx中FastCGI相关参数,另外,FastCGI自身也有一些配置需要进行优化,如果你使用php-fpm来管理FastCGI,可以修改配置文件中的以下值:
<value name="max_children">60</value>
同时处理的并发请求数,即它将开启最?0个子线程来处理并发连接?/p>

<value name="rlimit_files">102400</value>
最多打开文件数?/p>

<value name="max_requests">204800</value>
每个进程在重置之前能够执行的最多请求数?/p>

下面贴几张测试结果图?/p>

静态页面为我在squid配置4W并发那篇文章中提到的测试文件,下图为同时?台机器运行webbench -c 30000 -t 600 //backup.aiju.com:8080/index.html命令后的测试结果?br />使用netstat过滤后的连接数:
php页面在status中的结果(php页面为调用phpinfo):
php页面在netstat过滤后的连接数:
未使用FastCGI缓存之前的服务器负载?br />此时打开php页面已经有些困难,需要进行多次刷新才能打开。上图中cpu0负载偏低是因为测试时将网卡中断请求全部分配到cpu0上,并且在nginx中开?个进程分别制定到cpu1-7?br />使用FastCGI缓存之后?br />此时可以很轻松的打开php页面?/p>

这个测试并没有连接到任何数据库,所以并没有什么参考价值,不过不知道上述测试是否已经到达极限,根据内存和cpu的使用情况来看似乎没有,但是已经没有多余的机子来让我运行webbench了?/p>

参考资料:

//hi.baidu.com/myus/blog/item/f37d05d1b1d1ad399a5027ff.html

//kenwublog.com/docs/linux-kernel-2-6-36-optimization.htm

//blog.sina.com.cn/s/blog_50a736440100j023.html

2 THOUGHTS ON “NGINX优化配置(?



]]>
web前端 HTTPS 缓存加速squid 3.3.8 实战【原创?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2013/07/31/402195.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Wed, 31 Jul 2013 05:58:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2013/07/31/402195.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/402195.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2013/07/31/402195.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/402195.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/402195.html</trackback:ping><description><![CDATA[都知?http加速器 现在 varnish ?squid 名声大,所?先整了一把varnish,但是研究之后,发现不支持SSL,只得作罢,开始换上squid.<br /><br />到网上下了一个最新版 3.3.8,开始搜索配置资料,发现都是以前的旧的,不适用,后来发现了一?针对3.0的配? <a >//linux008.blog.51cto.com/2837805/618731<br /> </a>  按照提示安装完成了,启用?--enable-ssl选项?br /><br />后来又参考官方文?加上了https支持,参考:<a >//wiki.squid-cache.org/ConfigExamples/Reverse/SslWithWildcardCertifiate<br /><br /> </a> 但是很不辛,居然报错?#8220;FATAL: http(s)_port: defaultsite option requires Acceleration mode flag.”<br /><br />然后根据提示 ?查找https_port用法,参考资料:<a >//www.squid-cache.org/Doc/config/https_port/<br /><br /></a>原来 ?缺少[mode]选项,根据我的需要,加了“accel”,问题解?<br /><br />具体业务的完整配置参考附件?br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />//www.CodeHighlighter.com/<br /><br />-->https_port 443 cert=/usr/local/squid/cert.pem key=/usr/local/squid/cert.key accel defaultsite=img0-yoursite.yourdomain.com vhost<br />cache_peer 1.2.3.4 parent 80 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=img0<br />acl sites_server_img0 dstdomain img0-yoursite.yourdomain.com<br />cache_peer_access img0 allow sites_server_img0<br />http_access allow sites_server_img0<br /><br />https_port 443 cert=/usr/local/squid/cert.pem key=/usr/local/squid/cert.key accel defaultsite=img1-yoursite.yourdomain.com vhost<br />cache_peer 1.2.3.4 parent 80 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=img1<br />acl sites_server_img1 dstdomain img1-yoursite.yourdomain.com<br />cache_peer_access img1 allow sites_server_img1<br />http_access allow sites_server_img1<br /><br />####base######<br />visible_hostname localhost<br />cache_mgr xiaomage234@163.com<br />cache_effective_user nobody<br />cache_effective_group nobody<br />####cache#####<br />cache_mem 600 MB<br />cache_swap_low 90<br />cache_swap_high 95<br />maximum_object_size 12000 KB<br />maximum_object_size_in_memory 1024 KB<br />cache_dir ufs /usr/local/squid/var/cache 10000 16 256<br />cache_access_log /usr/local/squid/var/logs/access.log<br />cache_log /usr/local/squid/var/logs/cache.log<br />cache_store_log /usr/local/squid/var/logs/store.log<br />#####no-cache##########<br />hierarchy_stoplist cgi-bin ?/.php<br />acl QUERY urlpath_regex cgi-bin /?/.php<br />#acl DIRECT url_regex -i ^http:<span style="color: #008000; ">//</span><span style="color: #008000; ">192.168.0.201</span><span style="color: #008000; "><br /></span>cache deny QUERY<br />#cache deny DIRECT<br />#####refresh_pattern####<br />refresh_pattern ^ftp: 60 20% 10080<br />refresh_pattern ^gopher: 60 0% 1440<br /><br />refresh_pattern ^gopher: 60 0% 1440<br />refresh_pattern . 0 20% 1440<br />refresh_pattern -i /.css$       360     50%     2880     reload-into-ims<br />refresh_pattern -i /.js$        1440    50%     2880     reload-into-ims<br />refresh_pattern -i /.html$      720     50%     1440     reload-into-ims<br />refresh_pattern -i /.jpg$       1440    90%     2880     ignore-reload<br />refresh_pattern -i /.gif$       1440    90%     2880     ignore-reload<br />refresh_pattern -i /.swf$       1440    90%     2880     ignore-reload<br />refresh_pattern -i /.jpg$       1440    50%     2880     ignore-reload<br />refresh_pattern -i /.png$       1440    50%     2880     ignore-reload<br />refresh_pattern -i /.bmp$       1440    50%     2880     ignore-reload<br />refresh_pattern -i /.doc$       1440    50%     2880     ignore-reload<br />refresh_pattern -i /.ppt$       1440    50%     2880     ignore-reload<br />refresh_pattern -i /.xls$       1440    50%     2880     ignore-reload<br />refresh_pattern -i /.pdf$       1440    50%     2880     ignore-reload<br />refresh_pattern -i /.rar$       1440    50%     2880     ignore-reload<br />refresh_pattern -i /.zip$       1440    50%     2880     ignore-reload<br />refresh_pattern -i /.txt$       1440    50%     2880     ignore-reload<br />######proxy agent###        <br />http_port 80 accel vhost vport<br />cache_peer 1.2.3.4 parent 80 0 no-query originserver name=img00<br />cache_peer_domain img00 img0-yoursite.yourdomain.com<br /><br />cache_peer 1.2.3.4 parent 80 0 no-query originserver name=img01<br />cache_peer_domain img01 img1-yoursite.yourdomain.com<br />######alc#####<br />acl manager2 proto cache_object<br />acl localhost src 127.0.0.1/32<br />acl to_localhost dst 127.0.0.0/8<br />acl localnet src 10.0.0.0/8     # RFC1918 possible internal network<br />acl localnet src 172.16.0.0/12  # RFC1918 possible internal network<br />acl localnet src 192.168.0.0/16 # RFC1918 possible internal network<br />acl LanSrc src all<br />acl LanDst dst all<br />acl SSL_ports port 443<br />acl Safe_ports port 80          # http<br />acl Safe_ports port 21          # ftp<br />acl Safe_ports port 443         # https<br />acl Safe_ports port 70          # gopher<br />acl Safe_ports port 210         # wais<br />acl Safe_ports port 1025-65535  # unregistered ports<br />acl Safe_ports port 280         # http-mgmt<br />acl Safe_ports port 488         # gss-http<br />acl Safe_ports port 591         # filemaker<br />acl Safe_ports port 777         # multiling http<br />acl CONNECT method CONNECT<br />acl LanDstDM dstdomain .kanbox.com<br /><br />http_access allow manager2 localhost<br />http_access deny manager2<br />http_access deny !Safe_ports<br />http_access deny CONNECT !SSL_ports<br />http_access allow LanDstDM<br />http_access allow LanSrc<br />http_access allow LanDst<br />http_access allow localnet<br />http_access deny all<br /><br />下载附件:<br /><a href="/Files/xiaomage234/squid.conf.txt">/Files/xiaomage234/squid.conf.txt<br /><br />v</a>arnish的配置,不支持https:<br /><a href="/Files/xiaomage234/default.vcl.txt">/Files/xiaomage234/default.vcl.txt</a></div><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/402195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2013-07-31 13:58 <a href="//www.ot7t.com.cn/xiaomage234/archive/2013/07/31/402195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>google的开源项目总结 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/03/14/396448.html小马?/dc:creator>小马?/author>Thu, 14 Mar 2013 09:35:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/03/14/396448.html//www.ot7t.com.cn/xiaomage234/comments/396448.html//www.ot7t.com.cn/xiaomage234/archive/2013/03/14/396448.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/396448.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/396448.htmlgoogle的开源项目总结

google?span style="line-height: 1.5;">开源项?/a>值得我们一用的,这些项目很有意义,甚至可以直接用在我们自己的工作上!学习编程的的一个比较好的方式就是阅读优秀项目的源代码,从而能够了解作者的方法、思路、技巧,另外阅读源代码对于一些朋友是枯燥乏味的,这是就可以看看项目的readme,找到项目的闪光点,我们不做开拓者那我们就做实践者和使用者,呵呵,下面是这些项目的列表,在这里存?,已备今后查阅之?nbsp;  

 

文本文件处理?/h4>

Google CRUSH (Custom Reporting Utilities for SHell)  

CRUSH是为命令行或shell scripts处理特定文字数据而制作的一系列工具?a target="_blank" style="color: navy; text-decoration: none;">这里有指?/a>?/p>

C++库和源代码:

Google Breakpad 

一个开源的多平台崩溃报告系统?nbsp;  

Google GFlags 

Gflags是一个命令行标记的处理库,它可以替代“getopt()”,其内置对C++的支持比如string?a target="_blank" style="color: navy; text-decoration: none;">指南在此?nbsp;  

Google Glog Glog库可执行应用级的登陆,提供基于C++式的登陆API,可用于Linux、BSD和Windows?a target="_blank" style="color: navy; text-decoration: none;">指南见此?nbsp;

Google PerfTools   

这个工具可让开发创建更强大的应用程序,特别是那些用C++模版开发的多线程应用程序,包括TCMalloc, heap-checker, heap-profiler 和cpu-profiler。指?a target="_blank" style="color: navy; text-decoration: none;">见此还有这里?nbsp;

Google Sparse Hash   

非常节省内存的hash-map?a target="_blank" style="color: navy; text-decoration: none;">指南见此?nbsp;

Omaha – Google Update   

Omaha,也就是Google Update,它可以保证你的软件随时升级到最新版本,目前很多Windows下的Google软件都是用Omaha升级的,包括Google Chrome和Google Earth,当然你也可以用于自己的应用程序。指?a target="_blank" style="color: navy; text-decoration: none;">看这?/a>还有这里?nbsp;

Protocol Buffers   

Protocol Buffers是一种可扩展编码序列数据的方式,Google在几乎所有内部RPC协议和文件格式都使用了Protocol Buffers?a target="_blank" style="color: navy; text-decoration: none;">指南见此?a target="_blank" style="color: navy; text-decoration: none;">它可以用于很多语言而且被一些IDE所支持,比如NetBeans?nbsp;

互联网:

Google Code Pretiffy 这是一个Javascript模块和CSS文件,它可以让HTML页面里的部分源码高亮显示,支持C/C++, Java, Python, Ruby, PHP, VisualBasic, AWK, Bash, SQL, HTML, XML, CSS, JavaScript, Makefiles和部分Perl,不支持Smalltalk和所有的CAML?a target="_blank" style="color: navy; text-decoration: none;">例子见此?nbsp;

SpriteMe – easy “CSS spirtes” SpriteMe使你可以更轻松的创造CSS Sprites(俗称雪?#8230;…)就是把网站要用到的图片都堆在一张图片里,用CSS控制调用哪个区域?a target="_blank" style="color: navy; text-decoration: none;">它有一个自己的官网在这?/a>?nbsp;

Redacisaurus   

Reducisaurus是一个压缩CSS和JS文件的网络服务,基于YUI压缩算法,运行于App Engine?nbsp;

JaikuEngine   

JaikuEngine是一个运行于App Engine的微博系统,?a target="_blank" style="color: navy; text-decoration: none;">jaiku.com运营。要查看移动客户端的源码可以看这?/a>?a target="_blank" style="color: navy; text-decoration: none;">这里还有介绍?nbsp;

Selector Shell   

Selector Shell是一个基于浏览器的测试工具,它可以让你看到CSS在不同浏览器里的样式,用Javascript写的?a target="_blank" style="color: navy; text-decoration: none;">你可以在这里测试?nbsp;

Google Feed Server   

Google Feed Server是一个开源Atom发布协议服务,基于Apache Abdera框架,允许开发者快速为当前数据源(比如数据库)配置feed。指?a target="_blank" style="color: navy; text-decoration: none;">见这?/a>?a target="_blank" style="color: navy; text-decoration: none;">这里?nbsp;

Melange, the Spice of Creation   

这个项目的目标是创建出一个适合开源贡献流程的框架,比如Google Summer of Code TM (GSoC)项目。使用这个框架你就可以用Google App Engine来运行Google Summer of Code项目,和其它类似项目比如Google Highly Open Participation TM Contest和GHOP?a target="_blank" style="color: navy; text-decoration: none;">指南见此?nbsp;

NameBench   

它可以查找最快的DNS服务器给你的电脑用,在Mac OS X、Windows和UNIX系统下都有命令行也有用户界面可以帮你测试,这是Google工程师用20%自由时间写出来的?nbsp;

Rat Proxy   

一个半自动化的大型被动网络应用安全审查工具,专为精确的探测而优化,文在此?nbsp;

TopDraw   

Top Draw是一个图形生成程序,使用简单的文字脚本,基于JavaScript编程语言,Top Draw可以创造出非常复杂和有趣的图形。支持Mac OS 10.5以上系统,使用XCode开发?nbsp;

etherpad   

开源的EtherPad,这是一个基于网络的实时合作文编辑器,这个项目主要是为了演示代码而开发,帮助那些想在自己服务器部署Etherpad的人使用?a target="_blank" style="color: navy; text-decoration: none;">这里有如何安装的指南。EtherPad使用JavaScript、Java和Comet服务器来建造实时协作服务?nbsp;

Chromium   

Chromium是开源版的Chrome浏览器,Chromium的目标是建立一个新一代的强大网络应用程序,它与Chrome有很多不同之处?a target="_blank" style="color: navy; text-decoration: none;">这里有指导如何在Linux上编译Chromium?nbsp;

V8 Google’s open source JavaScript engine V8是Google的开源JavaScript引擎,用C++写成,用于Chrome浏览器之上。V8使用ECMAScript的ECMA-262第三版可运行于Windows XP、Vista、Mac OS 10.5和使用IA-32或ARM处理器的Linux。V8可独立运行也可嵌入到任何C++程序里使用,这里有指?/a>?nbsp;

Chromium OS   

Chromium OS是开源版的Chrome OS操作系统,提供快速、简单而安全的网络体验?a target="_blank" style="color: navy; text-decoration: none;">源码在此?nbsp;

Android   

Android是第一个免费、开源而且可完全自定义的移动平台,提供完整的堆栈:一个操作系统、中间件和重要的一用应用,它包含丰富的API可以让第三方开发者开发出强大的应用程序?nbsp;

MySQL工具?/h4>

Google MySQL Tools  

 

各种管理、维护和改进MySQL数据库性能的工具,由Google编写,包括: 

  • mypgrep.py:一个类似pgrep的工具来管理MySQL连接
  • compact_innodb.py:可导出和重载所有表格的密集型innodb数据文件

Google mMAIM 

mMAIM的目标是对MySQL的监控和分析更简单,且可以和任何环境整合使用。它可显示主/从同步状态,一些性能状态,可以返回大量“show”命令的状态等等?nbsp;  

其它?/h4>

Stressful Application Test (stressapptest) 

Stressful Application Test试图让来自处理器和I/O到内存的数据尽量随机化,以创造出模拟现实的环境来测试现在的硬件设备是否稳定,Google就在使用它,现在是Apache 2.0许可,这里有介绍?a target="_blank" style="color: navy; text-decoration: none;">安装向导?a target="_blank" style="color: navy; text-decoration: none;">指南?nbsp;  

Pop and IMAP Troubleshooter 

它用于诊断并解决客户端到邮件服务器的连接问题?nbsp;  

OpenDuckBill 

Openduckbill是一个Linux下简单的命令行备份工具,可用于监视文?目录在有变化后是否标记为备份,并传输这些变化到本地备份目录、远程NFS导出分卷或是用rsync命令导出到远程SSH服务器?a target="_blank" style="color: navy;">见安装向?/a>?nbsp;  

ZXing 

ZXing(发音类似Zebra crossing)是Java的开源多格式1D/2D条码图像处理库,目的是使用内置在手机上的摄像头拍照并对条码进行解码,而不必与服务器通讯,它被用于Android系统。这里有向导?a target="_blank" style="color: navy; text-decoration: none;">支持的设备列?/a>?nbsp;Tesseract OCR Engine 

Tesseract OCR引擎?995年UNLV Accuracy测试的前三名之一,在1995?006年之间它的进展不大,但依然是当前精度最高的OCR引擎。这个源码可读取二进制、灰阶或彩色图片并输出文字,内置一个TIFF阅读器可读取非压缩的TIFF文件,增加libtiff后也可读取压缩图片?a target="_blank" style="color: navy; text-decoration: none;">指南?a target="_blank" style="color: navy; text-decoration: none;">问答?nbsp;  

Neatx – Open Source NX server 

Neatx是一个开源NX服务,类似NoMachine公司商业的NX服务。NX协议比VNX更强大,它们的区别主要在?nbsp;  

  • NX是X11客户端所以不会发送位?/li>
  • NX可兼容X、VNC和Windows版的Remote Desktop
  • NX可缓存数?/li>
  • NX安装简?/a>

另外一个可选的项目可以看看Google?a target="_blank" style="color: navy; text-decoration: none;">FreeNx?nbsp;

PSVM   

它是这个文件的代码,这是一个SVM?#8220;支持所有核?#8221;的版本,可多机并行运行,实例见此?nbsp;

GO  

Google开发的新编程语言?a target="_blank" style="color: navy; text-decoration: none;">谷奥有报?/a>?nbsp;

The Google Collections Library for Java   

这是一系列与Java 5以及更高版本有关的库,Google花钱给买过来了?nbsp;

Google styleguide  

每个主流?span style="line-height: 1.5;">开源项?/a>都有它自己的向导形式,比如一系列的演示代码。如果这些代码都按照“Style”的形式来演示,会更友好?/p>

]]>十个免费的Web压力测试工具 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395536.html小马?/dc:creator>小马?/author>Thu, 21 Feb 2013 08:27:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395536.html//www.ot7t.com.cn/xiaomage234/comments/395536.html//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395536.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/395536.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/395536.html本文列举了是十个免费工具,可以用来进行Web的负?压力测试的。这样你就可以知道你的服务器以及你的WEB应用能够扛得住多少的并发量,以及网站性能?/p>

1. Grinder –  Grinder是一个开源的JVM负载测试框架,它通过很多负载注射器来为分布式测试提供了便利?支持用于执行测试脚本的Jython脚本引擎HTTP测试可通过HTTP代理进行管理。根据项目网站的说法,Grinder?主要目标用户?#8220;理解他们所测代码的?#8212;—Grinder不仅仅是带有一组相关响应时间的‘黑盒’测试。由于测试过程可以进行编?#8212;—而不是简单地脚本 化,所?a target="_blank" title="程序员的本质" style="color: #0d4ac6; text-decoration: initial;">程序?/a>能测试应用中内部的各个层次,而不仅仅是通过用户界面测试响应时间?/p>

The Grinder

2. Pylot -Pylot是一款开源的测试web service性能和扩展性的工具,它运行HTTP 负载测试,这对容量计划,确定基准点,分析以及系统调优都很有用处。Pylot产生并发负载(HTTP Requests),检验服务器响应,以及产生带有metrics的报表。通过GUI或者shell/console来执行和监视test suites?/p>

Pylot Main Logo

2. Web Capacity Analysis Tool (WCAT) – 这是一种轻量级负载生成实用工具,不仅能够重现对 Web 服务器(或负载平衡服务器场)的脚?HTTP 请求,同时还可以收集性能统计数据供日后分析之用。WCAT 是多线程应用程序,并且支持从单个源控制多个负载测试客户端,因此您可以模拟数千个并发用户。该实用工具利用您的旧机器作为测试客户端,其中每个测试客户端又可以产生多个虚拟客户端(最大数量取决于客户端机器的网络适配器和其他硬件)。您可以选择使用 HTTP 1.0 还是 HTTP 1.1 请求,以及是否使?SSL。并且,如果测试方案需要,您还可以使用脚本执行的基本或 NTLM 身份验证来访问站点的受限部分。(如果您的站点使用 cookie、表单或基于会话的身份验证,那您可以创建正确?GET ?POST 请求来对测试用户进行身份验证。)WCAT 还可管理您站点可能设置的任何 cookie,所以配置文件和会话信息将永久保存?/p>

3. fwptt – fwptt 也是一个用来进行WEB应用负载测试的工具。它可以记录一般的请求,也可以记录Ajax请求。它可以用来测试 asp.net?jsp?php 或是其它的Web应用?/p>

4. JCrawler – JCrawler是一个开? CPL) 的WEB应用压力测试工具。通过其名字,你就可以知道这是一个用Java写的像网页爬虫一样的工具。只要你给其几个URL,它就可以开始爬过去了,它用一种特殊的方式来产生你WEB应用的负载。这个工具可以用来测试搜索引擎对你站点产生的负载。当然,其还有另一功能,你可以建立你的网站地图和再点击一下,将自动提交Sitemap给前5名的搜索引擎?/p>

5. Apache JMeter – Apache JMeter是一个专门为运行和服务器装载测试而设计的?00%的纯Java桌面运行程序。原先它是为Web/HTTP测试而设计的,但是它已经扩展以支持各种各样的测试模块。它和用于HTTP和SQL数据库(使用JDBC)的模块一起运送。它可以用来测试静止资料库或者活动资料库中的服务器的运行情况,可以用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗力,或者用来分析不同负荷类型下的所有运行情况。它也提供了一个可替换的界面用来定制数据显示,测试同步及测试的创建和执行?/p>

6. Siege -Siege(英文意思是围攻)是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行?nbsp;Siege 支持基本的认证,cookies?HTTP ?HTTPS 协议?/p>

7. http_load – http_load 以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把客户机搞死。可以可以测试HTTPS类的网站请求?/p>

8. Web Polygraph – Web Polygraph这个软件也是一个用于测试WEB性能的工具,这个工具是很多公司的标准测试工具,包括微软在分析其软件性能的时候,也是使用这个工具做为基准工具的。很多招聘测试员的广告中都注明需要熟练掌握这个测试工具?/p>

9. OpenSTA – OpenSTA是一个免费的、开放源代码的web性能测试工具,能录制功能非常强大的脚本过程,执行性能测试。例如虚拟多个不同的用户同时登陆被测试网站。其还能对录制的测试脚本进行,按指定的语法进行编辑。在录制完测试脚本后,可以对测试脚本进行编辑,以便进行特定的性能指标分析。其较为丰富的图形化测试结果大大提高了测试报告的可阅读性。OpenSTA 基于CORBA 的结构体系,它通过虚拟一个proxy,使用其专用的脚本控制语言,记录通过proxy 的一切HTTP/S traffic。通过分析OpenSTA的性能指标收集器收集的各项性能指标,以及HTTP 数据,对系统的性能进行分析?/p>

来源?a rel="nofollow" target="_blank" style="color: #0d4ac6; text-decoration: initial;">10 Free Tools to Load/Stress Test Your Web Applications



]]>
20个初学者实用的CSS技?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395535.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Thu, 21 Feb 2013 08:12:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395535.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/395535.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/395535.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/395535.html</trackback:ping><description><![CDATA[     摘要: 过去就连一个镜像站点,我们都依靠大量的开发人员和程序员进行维护。得益于CSS和它的灵活性使得样式能够从代码中被独立抽离出来,从而让一个只具备基本CSS理论的初学者都能够轻易地改变网站的样式。  不论你是对用CSS建站感兴趣还是仅仅拿它让你的博客更有feel,打好基础才能盖高楼。下面让我们来看看一些对于初学者实用的CSS常识: 1、使用reset.css  火狐和IE这两种不同的浏览器,在绘制CSS...  <a href='//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395535.html'>阅读全文</a><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/395535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2013-02-21 16:12 <a href="//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>20个很有用的PHP类库 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395532.html小马?/dc:creator>小马?/author>Thu, 21 Feb 2013 08:09:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395532.html//www.ot7t.com.cn/xiaomage234/comments/395532.html//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395532.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/395532.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/395532.html介绍20个非常有用的PHP类库,相信一定可以为你的WEB开发提供更好和更为快速的方法?/p>

图表?/h3>

下面的类库可以让你很简的创建复杂的图表和图片。当然,它们需要GD库的支持?/p>

pChart – 一个可以创建统计图的库?/p>

Libchart – 这也是一个简单的统计图库?/p>

JpGraph – 一个面向对象的图片创建类?/p>

Open Flash Chart – 这是一个基于Flash的统计图?/p>

缩略图生?/h3>

phpThumb – 功能很强大,如何强大还是自己去体会吧?/p>

支付

你的网站需要处理支付方面的事情?需要一个和支付网关的程序?下面这个程序可以帮到你?/p>

PHP Payment Library – 支持Paypal, Authorize.net ?Checkout (2CO)

RSS 解析

解释RSS并是一件很单调的事情,不过幸好你有下面的类库可以帮助你方便地读取RSS的Feed?/p>

MagpieRSS – 开源的PHP版RSS解析器,据说功能强大,未验证?/p>

SimplePie – 这是一个非常快速,而且易用的RSS和Atom 解析库?/p>

OpenID

PHP-OpenID – 支持OpenID的一个PHP库。OpenID是帮助你使用相同的用户名和口令登录不同的网站的一种解决方案。如果你对OpenID不熟悉的话,你可以到这里看看?a style="color: #0d4ac6; text-decoration: initial;">//openid.net.cn/

PDF 生成?/h3>

FPDF – 这量一个可以让你生成PDF的纯PHP类库?/p>

Excel 相关

你的站点需要生成Excel?没有问题,下面这两个类库可以让你轻松做到这一点?/p>

php-excel – 这是一个非常简单的Excel文件生成类?/p>

PHP Excel Reader – 可以解析并读取XLS文件中的数据?/p>

E-Mail 相关

不喜欢PHP的mail函数?觉得不够强大?下面的PHP邮件相关的库绝对不会让你失望?/p>

Swift Mailer – 免费的超多功能的PHP邮件库?/p>

PHPMailer - 超强大的邮件发送类?/p>

数据为抽?对象关系映射ORM

ADOdb – 数据库抽?/p>

Doctrine – 对象关系映射Object relational mapper (ORM) ,需?PHP 5.2.3+ 版本,一个非常强大的database abstraction layer (DBAL).

Propel – 对象关系映射框架- PHP5

Outlet – 也是关于对象关系映射的一个工具?/p>

注:对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术?简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式?这也同时暗示者额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在?更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据?/p>

单元测试

如果你在使用测试驱动的方法开发你的程序,下面的类库和框架绝你能帮助你的开发?/p>

SimpleTest – 一个PHP的单元测试和网页测试的框架?/p>

PHPUnit – 来自xUnit 家族,提供一个框架可以让你方便地进行单元测试的案例开发。并可非常容易地分析其测试结果?/p>

]]>
支付宝手机应用内支付官方文 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395531.html小马?/dc:creator>小马?/author>Thu, 21 Feb 2013 08:08:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395531.html//www.ot7t.com.cn/xiaomage234/comments/395531.html//www.ot7t.com.cn/xiaomage234/archive/2013/02/21/395531.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/395531.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/395531.html 手机应用内支付包支付文

https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash

下载地址?br />//download.alipay.com/public/api/base/WS_SECURE_PAY.zip 



]]>[转载]js arguments - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395021.html小马?/dc:creator>小马?/author>Fri, 01 Feb 2013 06:45:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395021.html//www.ot7t.com.cn/xiaomage234/comments/395021.html//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395021.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/395021.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/395021.htmljs进行函数调用时,除了指定的参数外,还创建一个隐含的对象——arguments?/p>

一、arguments可以用arguments[index]这样的语法取值,拥有长度属性length。arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,例如?/p>

  <script>
  function func(a,b){
  alert(a);
  alert(b);
  for(var i=0;i<arguments.length;i++){
      alert(arguments[i]);
  }
  }
 func(1,2,3,4);
  </script>

代码运行时会依次显示??????。函数定义了两个参数,但是在调用的时候传递了4个参数?/p>

 

二、arguments的callee属?/p>

它表示对函数对象本身的引用,这有利于实现无名函数的递归或者保证函数的封装性。例如:用递归来计?到n的自然数之和?/p>

<script>
   var sum=function(n){
    if(1==n) {
       return 1;
    } else {
       return n + arguments.callee(n-1);
     }
  }
  alert(sum(100));
</script>



在javascript函数体内,标识符arguments具有特殊含义。它是调用对象的一个特殊属性,用来引用Arguments对象?Arugments对象就像数组,注意这里只是像并不是哈?/p>

javascript函数体内,arguments像数?并不是真的数组,是一个Arguments对象?再次强调)一样,有length属性,可以代表传给函数的参数的个数?/p>

引用一个形式参数可以用参数名,也可以用arguments[]数组形式,其中arguments[0]表示第一个参数?/p>

所以,javascript中Arguments对象是函数的实际参数,下面,我们一起来进入这神奇的国度,一窥究竟?br />
arguments.length属性:

js不会主动为你判断你到底给函数传了多少个参数,如果你多传了,多余的部分就没有被使用,如果你少传了,那么没传的参数值就是undefined

所以我们可以借助arguments的length属性来检测调用函数时是否使用了正确数目的实际参数,因为javascript是不会为你做这些 事的

function f(x,y,z)
{
   //首先检查传递的参数数量是否正确
   if(arguments.length!=3)
   {
       thrownew Error("function f called with "+ arguments.length+"arguments ,but it not 3 arguments.");
   }
   //下面运行真正的函?/span>
}

arguments还为我们提供了这样一种可能,就是为一个函数传任意数目的实际参数:

比如说,我想判断你传给我的一些数字的大小,取出最大的那个,对,没错,你传多少参数都行,但是前提是你要传数字,因为我在函数内部懒得判断了?呵?/p>

function max()
{
   //根据我上一篇日志,这已经是JavaScript内最小的数字?/span>
   var m = Number.NEGATIVE_INFINITY;
   for(var i =0; i < arguments.length; i++)
   {
       //只要有任何一个参数比m大,那么m就变成了这个参数的?/span>
       if(arguments[i]> m)
            m = arguments[i];
   }
   return m;
}

怎么样?这个方法很巧妙吧?呵呵?/p>

说明一下arguments与真正传的形式参数是一致的?/strong>

比如,你给函数传了一个叫param的参数,并且只有这一个参数,那么param与arguments[0]都是对这个参数值的引用?/p>

改变其中一个值,即改变了二者所有的?/p>

function change(param)
{
   //比如我传的param为simaopig,那么alert就是simaopig?/span>
   //如果啥也没传就会alert undefined
   alert(param);
   //用arguments[0]改变了这个参数的?/span>
    arguments[0]='xiaoxiaozi';
   //没错,这个值变成了xiaoxiaozi
   alert(param);
}

arguments的callee属性:

arguments的callee属性是用来引用当前正在执行的函数,这对未命名的函数调用自身非常有好处?/p>

现在用arguments的这个callee同样可以简单的实现

//用函数直接量,采用arguments.callee属性实现递归函数
var result =function(x){
   if(x<=1)return1;
   return x*arguments.callee(x-1);
};

在最后提醒大家一点,既然这个arguments这么厉害,那么我们就不要为变量命名为arguments 了,事实上arguments是javascript的保留字之一。嗯?/p>



]]>
JavaScript(js) 单元测试工具 -- JsUnit(转载) - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395013.html小马?/dc:creator>小马?/author>Fri, 01 Feb 2013 03:24:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395013.html//www.ot7t.com.cn/xiaomage234/comments/395013.html//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395013.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/395013.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/395013.htmlJsunit 就是 Junit 的javascript 版本,下载并解压Jsunit zip,大部分的核心文件都?jsunit/app 目录下,
两个最基本的文件:
. jsUnitCore.js -- 每个测试文件都要引用?/span>
. testRunner.html -- 用来运行具体的jsunit 测试

(1) 起步例子?/span>
在Jsunit解压后的同级目录下建立两个文件,目录结构?/span>
|-- jsunit
|-- simple.js
|-- simple_test.html

写完后运?jsunit/testRunner.html,在页面中选择simple_test.html, 点击run,可以看到测试结果信息?/span>

// simple.js 被测试的javascript文件
function addTwoNumbers(value1, value2){
    return parseInt(value1) + parseInt(value2);
}

// simple_test.html 测试文件
<!DOCTYPE HTML PUBLIC 
"-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<script language="JavaScript" 
src="jsunit/app/jsUnitCore.js"></script>
<script language="JavaScript" 
src="simple.js"></script>
<script language="JavaScript">
function testValidArgs()
{
    assertEquals("2 + 2 is 4", 
    4, addTwoNumbers(2, 2));
}
function testWithNegativeNumbers()
{
    assertEquals("-2 + -2 is -4", 
    -4, addTwoNumbers(-2, -2));
}
function exposeTestFunctionNames()
{
    var tests = new Array(2);
    tests[0] = "testValidArgs";
    tests[1] = "testWithNegativeNumbers";
    return tests;
}
</script>
</HEAD>

<BODY>
test page for addTwoNumbers(value1, value2);
</BODY>
</HTML>

通常?test"开头的测试函数会被自动发现,但如果没有发现,就需要我们用exposeTestFunctionNames 函数来显示指定测试函数?/span>

(2) setUpPage()

jsunit 包含了一次性启动方法,setUpPage() 只对每个测试页调用一次,即在所有测试函数调用之前调用,适于做预处理,但要注意在setUpPage()最后一行要?setUpPageStatus 变量设置?“complete”, 如:

var arg1;
var arg2;

function setUpPage(){
    arg1 = 2;
    arg2 = 2;
    setUpPageStatus = "complete";
}

(3) 测试?/span>

测试集把不同的测试页分组组织,其中包含测试页或其他测试集,他们会按照顺序执行?/span>
注意点:
. 测试集中不能包含任何测试函数
. 必须包含一个返?jsUnitTestSuite 对象?suite 函数
. 有两个方法添加测试页:addTestPage(testPage) addTestSuite(testSuite), 在添加测试页时要注意路径,应是相对于testRunner.html ?/span>

例子?/span>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<script language="JavaScript" 
src="jsunit/app/jsUnitCore.js"></script>
<script language="JavaScript" 
src="simple.js"></script>
<script language="JavaScript">
function sampleSuite()
{
var sampleSuite = new top.jsUnitTestSuite();
sampleSuite.addTestPage("../simple_test.html");
return sampleSuite;
}
function suite()
{
var testSuite = new top.jsUnitTestSuite();
testSuite.addTestSuite(sampleSuite());
testSuite.addTestPage("../simple_test.html");
return testSuite;
}
</script>
</HEAD>

<BODY>
</BODY>
</HTML>

(4) 日志和跟?/span>

运行testRunner.html时会发现他有 Trace level 项,用于现实我们在测试方法中的日志信息,包含3个函数:
warn(message, [value])
inform(message, [value])
debug(message, [value])

原文出处://www.zhuoda.org/irini/83098.html
JsUnit下载地址://sourceforge.net/projects/jsunit/

]]>
JS测试工具 Google JS Test - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395014.html小马?/dc:creator>小马?/author>Fri, 01 Feb 2013 03:24:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395014.html//www.ot7t.com.cn/xiaomage234/comments/395014.html//www.ot7t.com.cn/xiaomage234/archive/2013/02/01/395014.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/395014.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/395014.html阅读全文

]]>
JavaScript 项目优化总结【转?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394701.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Thu, 24 Jan 2013 06:17:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394701.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/394701.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394701.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/394701.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/394701.html</trackback:ping><description><![CDATA[     摘要: 前端时间对公司已有项目JavaScript代码进行优化,本文的是对优化工作的一个总结,拿出来与大家分享。当然我的优化方式可能并不是最优的,或者说有些不对的地方,请指教。  JavaScript优化总结分为以下几点优化前后对比优化前优化后代码混乱,同样功能的函数重复出现在多个地方。如果需要修改实现,需要找到所有的地方。牵一发而动全身模块化,提取公共接口组织为库、结构清晰、方便代码重用、并且能够游戏防...  <a href='//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394701.html'>阅读全文</a><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/394701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2013-01-24 14:17 <a href="//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Best Practices for Speeding Up Your Web Site - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394700.html小马?/dc:creator>小马?/author>Thu, 24 Jan 2013 06:16:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394700.html//www.ot7t.com.cn/xiaomage234/comments/394700.html//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394700.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/394700.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/394700.html阅读全文

]]>
undefined与null的区?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394697.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Thu, 24 Jan 2013 05:02:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394697.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/394697.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394697.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/394697.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/394697.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body" style="margin: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 24px; background-color: #ffffff; word-break: normal !important;"><div id="blog_content" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">在JavaScript开发中,被人问到:null与undefined到底有啥区别?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理。于是,细想之后,写下本文,请各位大侠拍砖?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    总所周知:null == undefined</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    但是:null !== undefined</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    那么这两者到底有啥区别呢?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    请听俺娓娓道?..</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">null</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    这是一个对象,但是为空。因为是对象,所?typeof null  返回 'object' ?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    null ?JavaScript 保留关键字?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    null 参与数值运算时其值会自动转换?0 ,因此,下列表达式计算后会得到正确的数值:</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    表达式:123 + null    结果值:123</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    表达式:123 * null    结果值:0</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">undefined</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  undefined是全局对象(window)的一个特殊属性,其值是未定义的。但 typeof undefined 返回 'undefined' ?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">      虽然undefined是有特殊含义的,但它确实是一个属性,而且是全局对象(window)的属性。请看下面的代码?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    alert('undefined' in window);   //输出:true</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">     var anObj = {};<br style="margin: 0px; padding: 0px;" />     alert('undefined' in anObj);    //输出:false</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"> <br style="margin: 0px; padding: 0px;" />从中可以看出,undefined是window对象的一个属性,但却不是anObj对象的一个属性?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  注意:尽管undefined是有特殊含义的属性,但却不是JavaScript的保留关键字?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  undefined参与任何数值计算时,其结果一定是NaN?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  随便说一下,NaN是全局对象(window)的另一个特殊属性,Infinity也是。这些特殊属性都不是JavaScript的保留关键字?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">提高undefined性能</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  当我们在程序中使用undefined值时,实际上使用的是window对象的undefined属性?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  同样,当我们定义一个变量但未赋予其初始值,例如?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    var aValue;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  这时,JavaScript在所谓的预编译时会将其初始值设置为对window.undefined属性的引用?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  于是,当我们将一个变量或值与undefined比较时,实际上是与window对象的undefined属性比较。这个比较过程中,JavaScript会搜索window对象名叫‘undefined'的属性,然后再比较两个操作数的引用指针是否相同?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  由于window对象的属性值是非常多的,在每一次与undefined的比较中,搜索window对象的undefined属性都会花费时 间。在需要频繁与undefined进行比较的函数中,这可能会是一个性能问题点。因此,在这种情况下,我们可以自行定义一个局部的undefined?量,来加快对undefined的比较速度。例如:</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">    function anyFunc()<br style="margin: 0px; padding: 0px;" />    {<br style="margin: 0px; padding: 0px;" />        var undefined;          //自定义局部undefined变量<br style="margin: 0px; padding: 0px;" />        <br style="margin: 0px; padding: 0px;" />        if(x == undefined)      //作用域上的引用比?br style="margin: 0px; padding: 0px;" />        <br style="margin: 0px; padding: 0px;" />        <br style="margin: 0px; padding: 0px;" />        while(y != undefined)   //作用域上的引用比?br style="margin: 0px; padding: 0px;" />        <br style="margin: 0px; padding: 0px;" />    };<br style="margin: 0px; padding: 0px;" />    其中,定义undefined局部变量时,其初始值会是对window.undefined属性值的引用。新定义的局部undefined变量存在?该函数的作用域上。在随后的比较操作中,JavaScript代码的书写方式没有任何的改变,但比较速度却很快。因为作用域上的变量数量会远远少?window对象的属性,搜索变量的速度会极大提高?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">  这就是许多前端JS框架为什么常常要自己定义一个局部undefined变量的原因!</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"> </p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">本文来自CSDN博客,转载请标明出处?a style="margin: 0px; padding: 0px; text-decoration: initial; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333;">//blog.csdn.net/leadzen/archive/2009/02/17/3899392.aspx</a></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"> </p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><span style="margin: 0px; padding: 0px; font-size: small;"><strong style="margin: 0px; padding: 0px;">第二?区别Javascript中的Null与Undefined</strong></span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">在JavaScript中存在这样两种原始类?Null与Undefined。这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined?</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><strong style="margin: 0px; padding: 0px;">Undefined</strong>类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><strong style="margin: 0px; padding: 0px;">Null</strong>类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">js 代码</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px;">var oValue; <br style="margin: 0px; padding: 0px;" />alert(oValue == undefined); //output "true"</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">这段代码显示为true,代表oVlaue的值即为undefined,因为我们没有初始化它?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">js 代码</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px;">alert(null == document.getElementById('notExistElement'));</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">当页面上不存在id?#8221;notExistElement”的DOM节点时,这段代码显示?#8221;true”,因为我们尝试获取一个不存在的对象?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">js 代码</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px;">alert(typeof undefined); //output "undefined" <br style="margin: 0px; padding: 0px;" />alert(typeof null); //output "object"</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">第一行代码很容易理解,undefined的类型为Undefined;第二行代码却让人疑惑,为什么null的类型又是Object了呢?其实这 ?JavaScript最初实现的一个错误,后来被ECMAScript沿用下来。在今天我们可以解释为,null即是一个不存在的对象的占位符,但是在实 际编码时还是要注意这一特性?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">js 代码</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px;">alert(null == undefined); //output "true"</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">ECMAScript认为undefined是从null派生出来的,所以把它们定义为相等的。但是,如果在一些情况下,我们一定要区分这两个值,那应该怎么办呢?可以使用下面的两种方法?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">js 代码</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px;">alert(null === undefined); //output "false" <br style="margin: 0px; padding: 0px;" />alert(typeof null == typeof undefined); //output "false"</span></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">使用typeof方法在前面已经讲过,null与undefined的类型是不一样的,所以输?#8221;false”。?==代表绝对等于,在这里null === undefined输出false?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">以上是转载内容:</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">document.getElementById('不存在的元素')返回的是null</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">document.getElementById('不存在的元素').value返回的是undefined</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">jqury-->ajax(post,getJSON)函数中如果{id:undefined}的话,则此参数id不会提交到服务器?{id:null}会提交到服务器中,如果是将参数直接写到url中则也会提交到服务器?/p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"></p></div></div><div id="MySignature" style="margin: 10px 0px 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 24px; background-color: #ffffff;"></div><div style="margin: 0px; clear: both; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 24px; background-color: #ffffff;"></div><div id="blog_post_info_block" style="margin: 20px 0px 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 24px; background-color: #ffffff;"><div id="blog_post_info" style="margin: 0px;"><div id="BlogPostCategory" style="margin: 0px;">分类: <a style="margin: 0px; padding: 0px; text-decoration: initial; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333;">JS</a></div></div></div><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/394697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2013-01-24 13:02 <a href="//www.ot7t.com.cn/xiaomage234/archive/2013/01/24/394697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>淘宝数据魔方技术架构解析【转?/title><link>//www.ot7t.com.cn/xiaomage234/archive/2012/12/13/392923.html</link><dc:creator>小马?/dc:creator><author>小马?/author><pubDate>Thu, 13 Dec 2012 02:16:00 GMT</pubDate><guid>//www.ot7t.com.cn/xiaomage234/archive/2012/12/13/392923.html</guid><wfw:comment>//www.ot7t.com.cn/xiaomage234/comments/392923.html</wfw:comment><comments>//www.ot7t.com.cn/xiaomage234/archive/2012/12/13/392923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>//www.ot7t.com.cn/xiaomage234/comments/commentRss/392923.html</wfw:commentRss><trackback:ping>//www.ot7t.com.cn/xiaomage234/services/trackbacks/392923.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">from:<a >//blog.jobbole.com/1194/</a> <br />        淘宝网拥有国内最具商业价值的海量数据。截至当前,每天有超?0亿的店铺、商品浏览记录,10亿在线商品数,上千万的成交、收藏和评价数据。如何从这些数据中挖掘出真正的商业价值,进而帮助淘宝、商家进行企业的数据化运营,帮助消费者进行理性的购物决策,是淘宝数据平台与产品部的使命?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">为此,我们进行了一系列数据产品的研发,比如为大家所熟知的量子统计、数据魔方和淘宝指数等。尽管从业务层面来讲,数据产品的研发难度并不高;但在 “海量”的限定下,数据产品的计算、存储和检索难度陡然上升。本文将以数据魔方为例,向大家介绍淘宝在海量数据产品技术架构方面的探索?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">淘宝海量数据产品技术架?/strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">数据产品的一个最大特点是数据的非实时写入,正因为如此,我们可以认为,在一定的时间段内,整个系统的数据是只读的。这为我们设计缓存奠定了非常重要的基础?/p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3861" aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a rel="lightbox[1194]" title="淘宝海量数据产品技术架? style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3861"="" title="淘宝海量数据产品技术架? src="//blog.jobbole.com/wp-content/uploads/2011/08/1-taobao-shuju-mofan.jpg" alt="淘宝海量数据产品技术架? width="500" height="273" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">? 淘宝海量数据产品技术架?/dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "> </p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">按照数据的流向来划分,我们把淘宝数据产品的技术架构分为五层(如图1所示),分别是数据源、计算层、存储层、查询层和产品层。位于架构顶端的是我们的数据来源层,这里有淘宝主站的用户、店铺、商品和交易等数据库,还有用户的浏览、搜索等行为日志等。这一系列的数据是数据产品最原始的生命力所在?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">在数据源层实时产生的数据,通过淘宝自主研发的数据传输组件DataX、DbSync和Timetunnel准实时地传输到一个有1500个节点的 Hadoop集群上,这个集群我们称之?#8220;云梯”,是计算层的主要组成部分。在“云梯”上,我们每天有大?0000个作业对1.5PB的原始数据按照产品需求进行不同的MapReduce计算。这一计算过程通常都能在凌晨两点之前完成。相对于前端产品看到的数据,这里的计算结果很可能是一个处于中间状态的结果,这往往是在数据冗余与前端计算之间做了适当平衡的结果?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">不得不提的是,一些对实效性要求很高的数据,例如针对搜索词的统计数据,我们希望能尽快推送到数据产品前端。这种需求再采用“云梯”来计算效率将是比较低的,为此我们做了流式数据的实时计算平台,称之?#8220;银河”?#8220;银河”也是一个分布式系统,它接收来自TimeTunnel的实时消息,在内存中做实时计算,并把计算结果在尽可能短的时间内刷新到<span style="margin: 0px; padding: 0px; "><a title="8种Nosql数据库系统对? target="_blank" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; ">NoSQL</a></span>存储设备中,供前端产品调用?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">容易理解?#8220;云梯”或?#8220;银河”并不适合直接向产品提供实时的数据查询服务。这是因为,对于“云梯”来说,它的定位只是做离线计算的,无法支持较高的性能和并发需求;而对?#8220;银河”而言,尽管所有的代码都掌握在我们手中,但要完整地将数据接收、实时计算、存储和查询等功能集成在一个分布式系统中,避免不了分层,最终仍然落到了目前的架构上?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">为此,我们针对前端产品设计了专门的存储层。在这一层,我们有基于MySQL的分布式关系型数据库集群MyFOX和基于HBase的NoSQL存储集群Prom,在后面的文字中,我将重点介绍这两个集群的实现原理。除此之外,其他第三方的模块也被我们纳入存储层的范畴?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">存储层异构模块的增多,对前端产品的使用带来了挑战。为此,我们设计了通用的数据中间层——glider——来屏蔽这个影响。glider以HTTP协议对外提供restful方式的接口。数据产品可以通过一个唯一的URL获取到它想要的数据?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">以上是淘宝海量数据产品在技术架构方面的一个概括性的介绍,接下来我将重点从四个方面阐述数据魔方设计上的特点?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">关系型数据库仍然是王?/strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">关系型数据库(RDBMS)自20世纪70年代提出以来,在工业生产中得到了广泛的使用。经过三十多年的长足发展,诞生了一批优秀的数据库软件,例如Oracle、MySQL、DB2、Sybase和SQL Server等?/p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3862" aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a rel="lightbox[1194]" title="? MyFOX中的数据增长曲线" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3862"="" title="? MyFOX中的数据增长曲线" src="//blog.jobbole.com/wp-content/uploads/2011/08/2-curve-of-myfox.jpg" alt="? MyFOX中的数据增长曲线" width="500" height="208" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">? MyFOX中的数据增长曲线</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "> </p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">尽管相对于非关系型数据库而言,关系型数据库在分区容忍性(Tolerance to Network Partitions)方面存在劣势,但由于它强大的语义表达能力以及数据之间的关系表达能力,在数据产品中仍然占据着不可替代的作用?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">淘宝数据产品选择MySQL的MyISAM引擎作为底层的数据存储引擎。在此基础上,为了应对海量数据,我们设计了分布式MySQL集群的查询代理层——MyFOX,使得分区对前端应用透明?/p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3863" aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a rel="lightbox[1194]" title="? MyFOX的数据查询过? style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3863"="" title="? MyFOX的数据查询过? src="//blog.jobbole.com/wp-content/uploads/2011/08/3-data-searche-process-of-taobao.jpg" alt="? MyFOX的数据查询过? width="500" height="282" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">? MyFOX的数据查询过?/dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "> </p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">目前,存储在MyFOX中的统计结果数据已经达到10TB,占据着数据魔方总数据量?5%以上,并且正在以每天超过6亿的增量增长着(如?所示)。这些数据被我们近似均匀地分布到20个MySQL节点上,在查询时,经由MyFOX透明地对外服务(如图3所示)?/p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3864" aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a rel="lightbox[1194]" title="? MyFOX节点结构" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3864"="" title="? MyFOX节点结构" src="//blog.jobbole.com/wp-content/uploads/2011/08/4-node-of-taobao-mofang.jpg" alt="? MyFOX节点结构" width="500" height="289" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">? MyFOX节点结构</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "> </p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">值得一提的是,在MyFOX现有?0个节点中,并不是所有节点都?#8220;平等”的。一般而言,数据产品的用户更多地只关心“最近几?#8221;的数据,越早的数据,越容易被冷落。为此,出于硬件成本考虑,我们在?0个节点中分出?#8220;热节?#8221;?#8220;冷节?#8221;(如?所示)?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">顾名思义?#8220;热节?#8221;存放最新的、被访问频率较高的数据。对于这部分数据,我们希望能给用户提供尽可能快的查询速度,所以在硬盘方面,我们选择了每分钟15000转的SAS硬盘,按照一个节点两台机器来计算,单位数据的存储成本约为4.5W/TB。相对应地,“冷数?#8221;我们选择了每分钟7500转的 SATA硬盘,单碟上能够存放更多的数据,存储成本约为1.6W/TB?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">将冷热数据进行分离的另外一个好处是可以有效降低内存磁盘比。从?可以看出?#8220;热节?#8221;上单机只?4GB内存,而磁盘装满大约有 1.8TB?00 * 12 * 0.5 / 1024),内存磁盘比约?:300,远远低于MySQL服务器的一个合理值。内存磁盘比过低导致的后果是,总有一天,即使所有内存用完也存不下数据的索引?#8212;—这个时候,大量的查询请求都需要从磁盘中读取索引,效率大打折扣?br style="margin: 0px; padding: 0px; " /><strong style="margin: 0px; padding: 0px; ">NoSQL是SQL的有益补?/strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">在MyFOX出现之后,一切都看起来那么完美,开发人员甚至不会意识到MyFOX的存在,一条不用任何特殊修饰的SQL语句就可以满足需求。这个状态持续了很长一段时间,直到有一天,我们碰到了传统的关系型数据库无法解决的问?#8212;—全属性选择器(如图5所示)?/p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3865" aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a rel="lightbox[1194]" title="? 全属性选择? style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3865"="" title="? 全属性选择? src="//blog.jobbole.com/wp-content/uploads/2011/08/5-selector-of-taobao-mofang.jpg" alt="? 全属性选择? width="500" height="262" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">? 全属性选择?/dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "> </p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">这是一个非常典型的例子。为了说明问题,我们仍然以关系型数据库的思路来描述。对于笔记本电脑这个类目,用户某一次查询所选择的过滤条件可能包?“笔记本尺?#8221;?#8220;笔记本定?#8221;?#8220;硬盘容量”等一系列属性(字段),并且在每个可能用在过滤条件的属性上,属性值的分布是极不均匀的。在?中我们可以看到,笔记本电脑的尺寸这一属性有着10个枚举值,?#8220;蓝牙功能”这个属性值是个布尔值,数据的筛选性非常差?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">在用户所选择的过滤条件不确定的情况下,解决全属性问题的思路有两个:一个是穷举所有可能的过滤条件组合,在“云梯”上进行预先计算,存入数据库供查询;另一个是存储原始数据,在用户查询时根据过滤条件筛选出相应的记录进行现场计算。很明显,由于过滤条件的排列组合几乎是无法穷举的,第一种方案在现实中是不可取的;而第二种方案中,原始数据存储在什么地方?如果仍然用关系型数据库,那么你打算怎样为这个表建立索引?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">这一系列问题把我们引到了“创建定制化的存储、现场计算并提供查询服务的引?#8221;的思路上来,这就是Prometheus(如?所示)?/p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3867" aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a rel="lightbox[1194]" title="? Prom的存储结? style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3867"="" title="? Prom的存储结? src="//blog.jobbole.com/wp-content/uploads/2011/08/6-structure-of-taobao-mofang.jpg" alt="? Prom的存储结? width="500" height="265" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">? Prom的存储结?/dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "> </p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">从图6可以看出,我们选择了HBase作为Prom的底层存储引擎。之所以选择HBase,主要是因为它是建立在HDFS之上的,并且对于 MapReduce有良好的编程接口。尽管Prom是一个通用的、解决共性问题的服务框架,但在这里,我们仍然以全属性选择为例,来说明Prom的工作原理。这里的原始数据是前一天在淘宝上的交易明细,在HBase集群中,我们以属性对(属性与属性值的组合)作为row-key进行存储。而row-key 对应的值,我们设计了两个column-family,即存放交易ID列表的index字段和原始交易明细的data字段。在存储的时候,我们有意识地让每个字段中的每一个元素都是定长的,这是为了支持通过偏移量快速地找到相应记录,避免复杂的查找算法和磁盘的大量随机读取请求?/p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3868" aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a rel="lightbox[1194]" title="? Prom查询过程" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3868"="" title="? Prom查询过程" src="//blog.jobbole.com/wp-content/uploads/2011/08/7-query-of-porm.jpg" alt="? Prom查询过程" width="500" height="268" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">? Prom查询过程</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "> </p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">?用一个典型的例子描述的Prom在提供查询服务时的工作原理,限于篇幅,这里不做详细描述。值得一提的是,Prom支持的计算并不仅限于求和 SUM运算,统计意义上的常用计算都是支持的。在现场计算方面,我们对Hbase进行了扩展,Prom要求每个节点返回的数据是已经经过“本地计算”的局部最优解,最终的全局最优解只是各个节点返回的局部最优解的一个简单汇总。很显然,这样的设计思路是要充分利用各个节点的并行计算能力,并且避免大量明细数据的网络传输开销?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">用中间层隔离前后?/strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">上文提到过,MyFOX和Prom为数据产品的不同需求提供了数据存储和底层查询的解决方案,但随之而来的问题是,各种异构的存储模块给前端产品的使用带来了很大的挑战。并且,前端产品的一个请求所需要的数据往往不可能只从一个模块获取?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">举个例子,我们要在数据魔方中看昨天做热销的商品,首先从MyFOX中拿到一个热销排行榜的数据,但这里?#8220;商品”只是一个ID,并没有ID所对应的商品描述、图片等数据。这个时候我们要从淘宝主站提供的接口中去获取这些数据,然后一一对应到热销排行榜中,最终呈现给用户?/p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3869" aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a rel="lightbox[1194]" title="? glider的技术架? style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3869"="" title="? glider的技术架? src="//blog.jobbole.com/wp-content/uploads/2011/08/8-architecture-of-glider.jpg" alt="? glider的技术架? width="500" height="284" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">? glider的技术架?/dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "> </p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">有经验的读者一定可以想到,从本质上来讲,这就是广义上的异构“?#8221;之间的JOIN操作。那么,谁来负责这个事情呢?很容易想到,在存储层与前端产品之间增加一个中间层,它负责各个异构“?#8221;之间的数据JOIN和UNION等计算,并且隔离前端产品和后端存储,提供统一的数据查询服务。这个中间层就是glider(如?所示)?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">缓存是系统化的工?/strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">除了起到隔离前后端以及异?#8220;?#8221;之间的数据整合的作用之外,glider的另外一个不容忽视的作用便是缓存管理。上文提到过,在特定的时间段内,我们认为数据产品中的数据是只读的,这是利用缓存来提高性能的理论基础?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">在图8中我们看到,glider中存在两层缓存,分别是基于各个异?#8220;?#8221;(datasource)的二级缓存和整合之后基于独立请求的一级缓存。除此之外,各个异构“?#8221;内部可能还存在自己的缓存机制。细心的读者一定注意到了图3中MyFOX的缓存设计,我们没有选择对汇总计算后的最终结果进行缓存,而是针对每个分片进行缓存,其目的在于提高缓存的命中率,并且降低数据的冗余度?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">大量使用缓存的最大问题就是数据一致性问题。如何保证底层数据的变化在尽可能短的时间内体现给最终用户呢?这一定是一个系统化的工程,尤其对于分层较多的系统来说?/p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3870" aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a rel="lightbox[1194]" title="? 缓存控制体系" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3870"="" title="? 缓存控制体系" src="//blog.jobbole.com/wp-content/uploads/2011/08/9-system-of-cache.jpg" alt="? 缓存控制体系" width="500" height="288" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">? 缓存控制体系</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "> </p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">?向我们展示了数据魔方在缓存控制方面的设计思路。用户的请求中一定是带了缓存控制?#8220;命令”的,这包括URL中的query string,和 HTTP头中?#8220;If-None-Match”信息。并且,这个缓存控制“命令”一定会经过层层传递,最终传递到底层存储的异?#8220;?#8221;模块。各异构“?#8221; 除了返回各自的数据之外,还会返回各自的数据缓存过期时间(ttl),而glider最终输出的过期时间是各个异?#8220;?#8221;过期时间的最小值。这一过期时间也一定是从底层存储层层传递,最终通过HTTP头返回给用户<span style="margin: 0px; padding: 0px; "><a title="浏览? style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; ">浏览?/a></span>的?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">缓存系统不得不考虑的另一个问题是缓存穿透与失效时的雪崩效应。缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个存在的数据每次请求都要到存储层去查询,失去了缓存的意义?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。在数据魔方里,我们采用了一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">缓存失效时的雪崩效应对底层系统的冲击非常可怕。遗憾的是,这个问题目前并没有很完美的解决方案。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。在数据魔方中,我们设计的缓存过期机制理论上能够将各个客户端的数据失效时间均匀地分布在时间轴上,一定程度上能够避免缓存同时失效带来的雪崩效应?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">结束?/strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">正是基于本文所描述的架构特点,数据魔方目前已经能够提供压缩?0TB的数据存储空间,数据中间层glider支持每天4000万的查询请求,平均响应时间在28毫秒??日数据),足以满足未来一段时间内的业务增长需求?/p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">尽管如此,整个系统中仍然存在很多不完善的地方。一个典型的例子莫过于各个分层之间使用短连接模式的HTTP协议进行通信。这样的策略直接导致在流量高峰期单机的TCP连接数非常高。所以说,一个良好的架构固然能够在很大程度上降低开发和维护的成本,但它自身一定是随着数据量和流量的变化而不断变化的。我相信,过不了几年,淘宝数据产品的技术架构一定会是另外的样子?/p><img src ="//www.ot7t.com.cn/xiaomage234/aggbug/392923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="//www.ot7t.com.cn/xiaomage234/" target="_blank">小马?/a> 2012-12-13 10:16 <a href="//www.ot7t.com.cn/xiaomage234/archive/2012/12/13/392923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Makefile.am详解 - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2012/11/30/392286.html小马?/dc:creator>小马?/author>Fri, 30 Nov 2012 08:19:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2012/11/30/392286.html//www.ot7t.com.cn/xiaomage234/comments/392286.html//www.ot7t.com.cn/xiaomage234/archive/2012/11/30/392286.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/392286.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/392286.html实战Makefile.am
Makefile.am是一种比Makefile更高层次的规则。只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成?/span>
表一列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件个一般格式?/span>

?1Makefile.am一般格?/span>

对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES?/span>
Makefile.am还提供了一些全局变量供所有的目标体使用:

?2 Makefile.am中可用的全局变量
在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径?/span>

?3Makefile.am中可用的路径变量
在上文中我们提到过安装路径,automake设置了默认的安装路径?/span>
1)标准安装路径
默认安装路径为:$(prefix) = /usr/local,可以通过./configure --prefix=的方法来覆盖?/span>
其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等?/span>
2) 定义一个新的安装路?/span>
比如test, 可定义testdir = $(prefix)/test, 然后test_DATA =test1 test2,则test1,test2会作为数据文件安装到$(prefix)/ /test目录下?/span>
我们首先需要在工程顶层目录下(即project/)创建一个Makefile.am来指明包含的子目录:
SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA/apple/core 
CURRENTPATH=$(shell /bin/pwd)
INCLUDES=-I$(CURRENTPATH)/src/include -I$(CURRENTPATH)/src/ModuleA/apple/include 
export INCLUDES
由于每个源文件都会用到相同的头文件,所以我们在最顶层的Makefile.am中包含了编译源文件时所用到的头文件,并导出,见蓝色部分代码?/span>
我们将lib目录下的swap.c文件编译成libswap.a文件,被apple/shell/apple.c文件调用,那么lib目录下的Makefile.am如下所示:
noinst_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/includ
细心的读者可能就会问:怎么?中给出的是bin_LIBRARIES,而这里是noinst_LIBRARIES?这
是因为如果只想编译,而不想安装到系统中,就用noinst_LIBRARIES代替bin_LIBRARIES,对于可执行文件就用
noinst_PROGRAMS代替bin_PROGRAMS。对于安装的情况,库将会安装?(prefix)/lib目录下,可执行文件将会安?/span>
?{prefix}/bin。如果想安装该库,则Makefile.am示例如下?/span>
bin_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/include
swapincludedir=$(includedir)/swap
swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h
最后两行的意思是将swap.h安装?{prefix}/include /swap目录下?/span>
接下来,对于可执行文件类型的情况,我们将讨论如何写Makefile.am?对于编译apple/core目录下的文件,我们写成的Makefile.am如下所示:
noinst_PROGRAMS=test
test_SOURCES=test.c 
test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a 
test_LDFLAGS=-D_GNU_SOURCE
DEFS+=-D_GNU_SOURCE
#LIBS=-lpthread
由于我们的test.c文件在链接时,需要apple.o和libswap.a文件,所以我们需要在
test_LDADD中包含这两个文件。对于Linux下的信号?读写锁文件进行编译,需要在编译选项中指?D_GNU_SOURCE。所以在
test_LDFLAGS中指明。而test_LDFLAGS只是链接时的选项,编译时同样需要指明该选项,所以需要DEFS来指明编译选项,由?/span>
DEFS已经有初始值,所以这里用+=的形式指明。从这里可以看出,Makefile.am中的语法与Makefile的语法一致,也可以采用条件表?/span>
式。如果你的程序还包含其他的库,除了用AC_CHECK_LIB宏来指明外,还可以用LIBS来指明?/span>
如果你只想编译某一个文件,那么Makefile.am如何写呢?这个文件也很简单,写法跟可执行文件的差不多,如下例所示:
noinst_PROGRAMS=apple
apple_SOURCES=apple.c
DEFS+=-D_GNU_SOURCE
我们这里只是欺骗automake,假装要生成apple文件,让它为我们生成依赖关系和执行命令。所以当你运行完automake命令后,然后修改apple/shell/下的Makefile.in文件,直接将LINK语句删除,即?/span>
…….
clean-noinstPROGRAMS:
    -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
apple$(EXEEXT): $(apple_OBJECTS) $(apple_DEPENDENCIES) 
    @rm -f apple$(EXEEXT)
#$(LINK) $(apple_LDFLAGS) $(apple_OBJECTS) $(apple_LDADD) $(LIBS)
                
                
                

本文来自ChinaUnix博客,如果查看原文请点://blog.chinaunix.net/u2/61254/showart_1821022.html 

]]>
详解Linux下auto工具制作Makefile源码包(制作篇) - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2012/11/29/392204.html小马?/dc:creator>小马?/author>Thu, 29 Nov 2012 07:48:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2012/11/29/392204.html//www.ot7t.com.cn/xiaomage234/comments/392204.html//www.ot7t.com.cn/xiaomage234/archive/2012/11/29/392204.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/392204.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/392204.html一?概述

为了更好的制作configure与Makefile,我先把制作流程给写在这里,好让大伙都有个心理准备。这里只说流程,不做解释。(附图供参考)


1、autosan命令生成configure.scan文件,这只是个模板,我们重新编辑这个文件,并把它保存为configure.in文件?/p>

2、aclocal命令生成aclocal.m4文件?/p>

3、autoheader命令生成config.h.in。前提是aclocal.m4和configure.in必须生成?/p>

4、autoconf命令生成configure文件(这个文件都很熟悉吧,嘎嘎)?/p>

5、创建并编辑Makefile.am,这个文件在根目录与子目录都应该有的?/p>

6、automake命令生成Makefile.in?/p>

7?/configure命令,根据Makefile.in生成Makefile文件,这个再熟悉不过了吧?/p>

相关阅读?详解Linux下auto工具制作Makefile源码包(工具安装篇)//www.linuxidc.com/Linux/2011-05/36616.htm

二?nbsp;    制作

巧妇难做无米之炊,要想完成这次体验,我们还得按规矩一步一步来,源文件得有。首先建个目录Family用来放我们的东西,它下面的东西就多了。源代码什么阿c,阿h啊,都放在src下面,src这个文件夹命名一般都是约定俗成的,我们也不破坏。当然你也可以起其他名字,别搞忘就好?/p>

<Family>

   |-configure.in

   |-Makefile.am 

   |-<src>

     |-wife.c

     |-daughter.c                                                                   |-main.c

     |-wife.h                                                                       |-daughter.h

     |-Makefile.am

※说明:

1. configure.in 这是最重要的文?,整个安装过程都靠它来主导?/p>

2. Makefile.am automake会根据它来生成Makefile.in,再?/configure Makefile.in变成最终的Makefile,一般来说在顶级目录和各个子目录都应该有一个Makefile.am

3. wife.c daughter.c main.c wife.h daughter.h 这是我们的源程序?/p>

不用细看,这些文件除了configure.in是用模板创建手动编辑外,其他都是手动创建并编辑的,如果你还木有,动手吧。其实这里边有个小小的经验,也不一定是对的,只是个人的经验,也就是后缀名为in的文件是生成的模板?/p>

$ mkdir –p Family/src

$ touch Makefile.am

$ cd src

$ touch wife.c daughter.c main.c wife.h daughter.h Makefile.am

$ cd ..  进入刚创建的Family目录

$ autoscan 该命令产?configure.scan ?configure.log两个文件,然?/p>

$ mv configure.scan configure.i n这样configure.in就创建成了?/p>

※源代码内容:

main.c: 

#include <stdio.h>

#include "wife.h"

#include "daughter.h"

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

int main(void)

{

printf( "These are my girls\n");

daughter_say();

wife_say();

return 0;

}

daughter.c

#include <stdio.h>

#include "daughter.h"

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

void daughter_say(void)

{

printf("My Dad ,are you call me ?\n");

}

daughter.h

#ifndef _DAUGHTER_

#define _DAUGHTER_

void daughter_say(void);

#endif

wife.c

#include <stdio.h>

#include "wife.h"

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

void wife_say(void)

{

printf("My darling ,are you call me ?\n");

}

wife.h

#ifndef _WIFE_

#define _WIFE_

void wife_say(void);

#endif

※制作流程?/p>

?步:编辑configure.in文件?/p>

上面用autoscan生成的scan后缀的文件改名而成的configure.in文件,我的用autoconf版本?.66,貌似autoscan自动生成的模?.61之前与之后的不大一样,这点可以自己参照自己的版本修改,2.61以后的版本这个文件更简单了?/p>

打开看看?nbsp; #                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.66])

AC_INIT([family], [1.0], [804927399@qq.com])

AM_INIT_AUTOMAKE(family,1.0)

AC_CONFIG_SRCDIR([src/wife.c])

AC_CONFIG_HEADERS([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile

src/Makefile])

AC_OUTPUT

configure.in 未修改版,简单对上面进行说明?/p>

AC_PREREQ([2.66])这个宏是用来检测autoconf的版本的?/p>

AC_INIT()是个初始化宏,括号中内容分别为:要生成的软件名称,版本号,bug报告邮箱

AM_INIT_AUTOMAKE(family,1.0)这个宏是新添加的,不过好?.8的automake不用添加这个也可以,但是我没有添加的时候在后面make的时候会?#8220;Makefile:15: *** 遗漏分隔??停止?#8221;的问题,而加上则有警告。现在还真有点晕呼呼滴?/p>

AC_CONFIG_SRCDIR([src/wife.c])这个宏是用来检测源码目录的有效性,srcdir就可以看出来,括号里边的文件不一定非得是wife.c,也可以改成其他的?/p>

AC_CONFIG_HEADERS([config.h])这个宏用来生成标准的config.h文件?/p>

接下来的内容就是众多的check?/p>

AC_PROG_CC这个是检测编译器的宏?/p>

我们用的版本不用AC_OUTPUT输出了,还是比较省力的?/p>

?步:aclocal命令生成aclocal.m4文件

不知为何,我直接用命令:

$aclocal 命令总是出错:aclocal

aclocal: couldn't open directory `/usr/local/share/aclocal-': 没有那个文件或目录?/p>

最后还是加上绝对路?usr/bin/aclocal总算是没这个错误,生成aclocal.m4了?/p>

?步:autoconf命令生成 configure文件

这一步没什么难度,输入命令?/p>

$ autoconf 就ok了,autoconf可以根据configure.in和aclocal.m4生成大名鼎鼎的configure,这时候已经可以运行它了,但是会报错,因为Makefile.in还没出现?/p>

那么何为M4呢,M4的名称取自Macro(M后面?个字?#8230;)。它和C预处理器里的宏是一个概念(其实,M4和C预处理器都K&R操刀设计的!!),用来处理文本替换。也就是说,M4是bash里的预处理器?/p>

?步:autoheader命令生成config.h.in

$ autoheader通过autoheader命令,我们就可以得到config.h.in这个东东了。有了它?/configure才会生成config.h这个东东,所以不可大意?/p>

autoheader这个工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创?#8220;acconfig.h”文件?/p>

?步:编辑Makefile.am文件

我们再编译安装源码包的时候都知道./configure可以生成Makefile,殊不知要生成Makefile还全仰仗Makefile.in这个老东西,而这个东西是以in结尾?,也是个模板,是由Makefile.am生成的,好了,知道这个来龙去脉了,就着手编写Makefile.am,我们这里Family顶级目录与子目录各有一个,如果还有其他的子目录,理论上也是需要Makefile.am的。我们这就来编辑它:

Family/Makefile.am内容如下?/p>

AUTOMAKE_OPTIONS = foreign

SUBDIRS = src

Family/src/Makefile.am内容如下?/p>

AUTOMAKE_OPTIONS = foreign

bin_PROGRAMS = family

family_SOURCES = main.c wife.c daughter.c wife.h daughter.h

其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让?户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件,而不用检查README啊什么的?/p>

bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开?/p>

family_SOURCES定义“family”这个执行程序所需要的原始文件。如?#8221;family”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原 始文件都列出来,并用空格隔开。如果源文件名字太长,可以加?#8221;\”行连接符换行书写?/p>

?步:automake --add-missing命令生成config.h.in

$ automake –a或?automake -–add-missing,大功告成!

注意运行automake命令时一定要加参数,否则不会自动生成install.sh,missing等脚本,这样会出乱子滴?/p>

这样,源码安装包就制作成了,用tar打包就可以了,使用的时候用三部?/configure,make ?make install安装即可,帅吧!



]]>
RabbitMQ 管理指南(添加虚拟host) - 四川福利彩票快乐12快乐12开奖直播快乐12开奖辽宁福彩快乐12快乐彩12选5走势图//www.ot7t.com.cn/xiaomage234/archive/2012/11/28/392141.html小马?/dc:creator>小马?/author>Wed, 28 Nov 2012 07:43:00 GMT//www.ot7t.com.cn/xiaomage234/archive/2012/11/28/392141.html//www.ot7t.com.cn/xiaomage234/comments/392141.html//www.ot7t.com.cn/xiaomage234/archive/2012/11/28/392141.html#Feedback0//www.ot7t.com.cn/xiaomage234/comments/commentRss/392141.html//www.ot7t.com.cn/xiaomage234/services/trackbacks/392141.html翻译: bobning编译和安?/strong>ubuntu或debian下的安装非常简?/span>
# apt-get install rabbitmq-server

默认的数据库内容
当第一次启动服务,检测数据库是否未初始化或者被删除,它会用下面的资源初始化一个新的数据库:

一个命名为 / 的虚拟宿主一个名为guest密码也为guest的用户,他拥?虚拟宿主的所有权限如果你的中间件是公开访问的,最好修改guest用户的密码?/span>管理概观rabbitmqctl 是RabbitMQ中间件的一个命令行管理工具。它通过连接一个中间件节点执行所有的动作。本地节点默认被命名?#8221;rabbit”。可以通过这个命令前使 ?#8221;-n”标志明确的指定节点名? 例如:# rabbitmqctl -n rabbit@shortstop add_user tonyg changeit
这个命令指示RabbitMQ中间件在rabbit@shortstop 节点创建一个tonyg/changeit的用户?/span>
在一个名?#8221;server.example.com”的主机,RabbitMQ Erlang节点的名称通常是rabbit@server(除非RABBITMQ_NODENAM?中间件启动时候被设置)。hostnam -s 的输出通常?#8221;@”符号正确的后缀。rabbitmqctl 默认产生详细输出。通过”-q”标示可选择安静模式。rabbitmqctl -q status应用和集群管?/strong>1.停止RabbitMQ应用,关闭节?/span>
# rabbitmqctl stop
2.停止RabbitMQ应用
# rabbitmqctl stop_app
3.启动RabbitMQ应用
# rabbitmqctl start_app
4.显示RabbitMQ中间件各种信?/span>
# rabbitmqctl status
5.重置RabbitMQ节点
# rabbitmqctl reset
# rabbitmqctl force_reset
从它属于的任何集群中移除,从管理数据库中移除所有数据,例如配置过的用户和虚拟宿? 删除所有持久化的消息?/span>
force_reset命令和reset的区别是无条件重置节点,不管当前管理数据库状态以及集群的配置。如果数据库或者集群配置发生错误才使用这个最?的手段?/span>
注意:只有在停止RabbitMQ应用后,reset和force_reset才能成功?/span>
6.循环日志文件
# rabbitmqctl rotate_logs[suffix]
7.集群管理
# rabbitmqctl cluster clusternode

用户管理
1.添加用户
# rabbitmqctl add_user username password
2.删除用户
# rabbitmqctl delete_user username
3.修改密码
# rabbitmqctl change_password username newpassword
4.列出所有用?br /># rabbitmqctl list_users

权限控制1.创建虚拟主机
# rabbitmqctl add_vhost vhostpath
2.删除虚拟主机
# rabbitmqctl delete_vhost vhostpath
3.列出所有虚拟主?br /># rabbitmqctl list_vhosts
4.设置用户权限
# rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp
5.清除用户权限
# rabbitmqctl clear_permissions [-p vhostpath] username
6.列出虚拟主机上的所有权?br /># rabbitmqctl list_permissions [-p vhostpath]
7.列出用户权限

# rabbitmqctl list_user_permissions username

 

例子?/p>

添加  rabbitmqctl add_vhost az

rabbitmqctl set_permissions -p az guest ".*" ".*" ".*" 

]]>