手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:mysql

世博观后感

看了一天世博,还是有点感触的。或许就象yhustc在我的评论里说的,地小人多,难免会挤。

我那天7点半左右出门,下大雨,乘公车到四号线然后转七号线,到长青路站下车(近B区),进去之后就开始排队,大约8点55分开始排队,将近10点才入园。检查的时候把我的饮料也给没收了。唉。

由于老婆带了世博护照,于是我就觉得自己想赶场子的,不是为了逛,而是为了敲章。真的有意义吗?我怀疑,而且世博护照的敲章真的没啥意思,我觉得那种拿着地图出来敲章的才是很不错的,个人建议是拿着世界地图过来敲章才过瘾。

本以为下雨人会少,结果那天却是开园以来人最多的一次,在某次排队的时候听到某老太太 说排沙特馆4小时,日本馆4小时,暈了。150块钱,就只能看两三个馆了。晚上在排队进波兰馆时,遇到一镇江男子说是看了很多馆,因为他只去那些排队很短的馆,大馆不去,这样可以看得更多一点,毕竟在上海时间太短。

我在排队的时候就觉得瑞士馆时间特长。。2小时左右。结果老婆的任务就是敲章,都没有仔细看完。

因此我最后还是认为:如果你想真正的享受人文,那么还是慢慢观看,每周看几个馆就成了,不要赶场子,否则就没有意义了,纯粹为了看而看,当然票价也太贵了。如果票价50左右,我每周去看两三个馆还是可以考虑的。

【插入】真的受不了那些插队的,大家都在排队,花了那么长时间,怎么还会有人想着插队?这些也就算了,那些带着一位70岁以上老人当挡箭牌的更无耻,一位老人后面带了7、8位人,说应该享受特殊照顾。看着他们说着流利的英文,却做着这种事情,真的感觉有点悲哀

最后说一下饮食,吃了比利时的小饼,荷兰的喜力啤酒。新加坡的美食。或许都有特色,但真的有点贵。因此,在园里还是吃KFC之类的比较合算,当然享受美食的话,真的不错。德国的啤酒坊没去成,因为老婆说里没没吃的就啤酒了。。。郁闷啊。

上一张我等了15分钟才拍到的图:

大小: 874 K
尺寸: 250 x 376
浏览: 1753 次
点击打开新窗口浏览全图(点击可看全图)

Tags: 世博

非得这么残忍吗?

司徒正美在看到老赵的博客鄙视IE6用户时,不甘寂寞,放出了一段残忍的代码,可以对IE6、7进行封杀处理。。

代码如下:

XML/HTML代码
  1. <!doctype html>  
  2. <html>  
  3.   <head>  
  4.     <meta charset="utf-8"/>  
  5.     <meta content="IE=8" http-equiv="X-UA-Compatible"/>  
  6.     <meta name="keywords" content="IE6与IE7封杀器 by 司徒正美" />  
  7.     <meta name="description" content="IE6与IE7封杀器 by 司徒正美" />  
  8.     <script type="text/javascript">       
  9.       //使用setAttribute也行,值好像是固定,为1(读作"日",日得好!)  
  10.       document.createElement("li").value = 1;       
  11.     </script>  
  12.     <title>IE6与IE7封杀器 by 司徒正美</title>  
  13.   </head>  
  14.   <body>  
  15.     <h1>杀!杀!杀!</h1>  
  16.     <h2>不行请刷新页面(这是运行框的问题)</h2>  
  17.   </body>  
  18. </html>  
还有一段是可以关闭当前窗口的:
XML/HTML代码
  1. window.opener=null;window.open('','_self');window.close();  
我的博客不能执行代码,如果你想测试,你可以到http://www.cnblogs.com/rubylouvre/archive/2010/05/18/1738370.html进行享受。

Tags: ie6, ie7, firefox, chrome

drupal的db_query安全过滤

这篇 文章已经是07年的了,不过,我一直没有关注过drupal的db类,所以对于这方面我也根本 就没有在意过。8过,我在我的siterpc中,我也是采用了sprintf的写法,不是为了安全,而是为了格式化。因为在siterpc里我们几乎不接受外部变量,所有的变量都是由我们自己传入,所以对于安全方便忽略了很多。但还是用sprintf来格式化SQL语句了。

因此看到这篇drupal的db_query安全过滤,突然发现,可以让我的代码少写很多了。(参数可变时请使用vsprintf)

以下是原文 :

Drupal通过C风格的字符串输出格式实现了对sql语句的安全过滤。
使用方法:

PHP代码
  1. db_query("SELECT n.nid FROM {node} n WHERE n.type = '%s'"$type);//正确做法  
  2. //这不等于以下语句,使用sprintf并不能避免mysql注入。  
  3. db_query(sprintf("SELECT n.nid FROM {node} n WHERE n.type = '%s'"$type)); //不正确  
drupal db_query核心代码如下:
PHP代码
  1. /** 
  2.  * Indicates the place holders that should be replaced in _db_query_callback(). 
  3.  */  
  4. define('DB_QUERY_REGEXP''/(%d|%s|%%|%f|%b)/');  
  5.   
  6. /** 
  7.  * Runs a basic query in the active database. 
  8.  * 
  9.  * User-supplied arguments to the query should be passed in as separate 
  10.  * parameters so that they can be properly escaped to avoid SQL injection 
  11.  * attacks. 
  12.  * 
  13.  * @param $query 
  14.  *   A string containing an SQL query. 
  15.  * @param ... 
  16.  *   A variable number of arguments which are substituted into the query 
  17.  *   using printf() syntax. Instead of a variable number of query arguments, 
  18.  *   you may also pass a single array containing the query arguments. 
  19.  
  20.  *   Valid %-modifiers are: %s, %d, %f, %b (binary data, do not enclose 
  21.  *   in '') and %%. 
  22.  * 
  23.  *   NOTE: using this syntax will cast NULL and FALSE values to decimal 0, 
  24.  *   and TRUE values to decimal 1. 
  25.  * 
  26.  * @return 
  27.  *   A database query result resource, or FALSE if the query was not 
  28.  *   executed correctly. 
  29.  */  
  30. function db_query($query) {  
  31.   $args = func_get_args();  
  32.   array_shift($args);  
  33.   $query = db_prefix_tables($query);  
  34.   if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax  
  35.     $args = $args[0];  
  36.   }  
  37.   _db_query_callback($args, TRUE);  
  38.   $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback'$query);  
  39.   return _db_query($query);  
  40. }  
  41.   
  42. /** 
  43.  * Helper function for db_query(). 
  44.  */  
  45. function _db_query_callback($match$init = FALSE) {  
  46.   static $args = NULL;  
  47.   if ($init) {  
  48.     $args = $match;  
  49.     return;  
  50.   }  
  51.   
  52.   switch ($match[1]) {  
  53.     case '%d'// We must use type casting to int to convert FALSE/NULL/(TRUE?)  
  54.       return (int) array_shift($args); // We don't need db_escape_string as numbers are db-safe  
  55.     case '%s': 
  56.       return db_escape_string(array_shift($args)); 
  57.     case '%%':  
  58.       return '%'; 
  59.     case '%f': 
  60.       return (float) array_shift($args); 
  61.     case '%b': // binary data  
  62.       return db_encode_blob(array_shift($args));  
  63.   }  
  64. }  
简单的对一些输入做了处理。参考: http://drupal.org/node/101496

原文来自于:http://www.luochunhui.com/id/315

Tags: drupal, php, escape_string

如何让页面清晰易懂

这段内容的摘要来自淘宝QA,http://qa.taobao.com/?p=6276,我只取了他的小标题,详细内容请移步过去,谢谢。
1.建立清楚的视觉层次
2.尽量使用用户习惯的用法
3.把页面划分为明确定义的区域
4.明确标识可以点击的地方
5.降低视觉噪声

2和3是我非常想要改进的地方。当页面明确定义再配合用户习惯,这样的内容才是用户想看到的内容。也只有这样的方式才会让用户更想继续点击看下去。【比如很多人习惯在文章结束部份放上相关文章,也就是这个道理,可是一篇文章有多个标签时,用户如果只关注其中一个,那剩余的相关文章就不准确了。如果可以判断一下referer获取用户来源的关键字,与tag匹配一下,去掉不相关的TAG内容,再取相关文章,就会更精确一点】

5也是很重要的,否则就算你的页面再明确,别人也不会停留太久

Tags: 淘宝, 页面结构

重要的不是语言,是思想

标题这种话已经在被很多人所理解,现在大多数开发人员已经不再把语言当成障碍,而是把思想当成障碍,语言的跨度其实真的很容易解决,但思想不进步,你有着再好的语言又怎么样?即使你用的是所谓的自然语言(即平时生活中的语句),但只要你没有思想,没有逻辑,你又能写出什么样的程序?

以下内容来自老王参加的某大会的记录、摘要。我是看中其中的一小部分,觉得有感触。。原文在这里,点击进入

部分我认为不错的精华,或者说是我关注的。。。

1、课程:失败来临的征兆(讲师:Michael Nvgard)这一切正是Michael Nvgard先生演讲的主旨:意外的问题总是在不经意间发生,要注意把它们的影响限制在局部,避免拖累整个应用。比如说在SOA中集成若干个服务时,应该 设置好各个服务的Timeout,避免其中一个服务崩溃连带整个系统等待。

2、课程:Twitter的可伸缩性数据架构(讲师:Nick Kallen)

Nick Kallen介绍了Twitter在处理海量数据时的经验,其实总结出来就三条:分区,索引,复制。

着重介绍了Tweets,Timelines,Social Graphs,Search Indices四个基本功能的实现:

Tweets比较简单,就是分区,虽然可以使用id或者user_id来分区,不过目前Twitter使用的是按time分区。

Timelines相对复杂了一些,最开始采用的方法是纯SQL的,大致如下:

SQL代码
  1. SELECT * FROM tweets  
  2. WHERE user_id IN (SELECT source_id FROM followers WHERE destination_id = ?)  
  3. ORDER BY created_at DESC  
  4. LIMIT 20  
这当然不是一个高效的解决方案,后来采用了被称作离线计算(Offline Computation)的解决方案,其思路大致就是每当发送一条推的时候,采用队列存储避免峰值瓶颈,同时向所有Followers分发此消息,然后每 个分发 终端在缓存中完成合并计算。乍一听起来这似乎也不是什么好的解决方案,一旦某人有非常多的Followers,即便分区,这个分发操作也会非常耗时,但按 Nick Kallen的介绍,Twitter确实是这么做的,细节操作有待研究。

剩下的问题不多说了,Nick Kallen给了PPT地址:http://www.slideshare.net/nkallen/q-con-3770885

3、课程:构建可扩展的微波系统(讲师:杨卫华)

杨卫华作为新浪微博的架构师,这次的PPT做得很酷,虽然在内容上和Twitter有些重复,但还是很不错。

提到了Memcached的evictions问题,给出了三个守则:

1:规划好cache的容量
2:将永久数据和临时性数据分开
3:不使用随机字符串做Key

至于原因,可以参考杨卫华的博客上的介绍:Memcached数据被踢(evictions>0)现象分析

4、课程:敏捷在中国(讲师:Tom Mellor) 编程工期的催促往往让程序员只考虑眼前的既得利益,却忽视了后期的风险。

5、课程:如何在团队中有效实施TDD(讲师:麦天志)在阐述为什么即便工期紧张也应该使用TDD的时候,他给了一个比喻:医生做手术的时间很紧张,但即便 这样,手术前清洗双手的工作程序也是必不可少的。在讲解重构时,他强调了TDD是重构的基础,只有这样才能保证重构没有改变现有的行为,否则就不是重构,而是重写。

Tags: 语言, 思想, 参考