• 2012-07-29

    动态语言应该有多动态?

    Views: 25833 | 12 Comments

    一加一等于几, 这是个问题

    某些所谓的动态语言是名不副实的 - 我称之为伪动态语言. 这些伪动态语言之所以是伪的, 是因为它们只是在代码层面的变量是动态的, 而它们的类型系统并不是真正动态的, 一个简单的例子, 考虑字符串能否直接和整数进行拼接成为一个新的字符串.

    当然, 语言维护者用另一个名词"类型强度(type strength)"来表示这种行为, 然后把这种本质上不动态的行为称为"强类型(strong typing)", 把真正的动态称为"弱类型(weak typing)".

    但我认为, "动态语言"的概念应该重新定义, "动态"应该脱离字面的意义, 去探究真正本质的动态.

    Continue reading »

    Posted by ideawu at 2012-07-29 01:00:33
  • 2012-05-29

    PHP求天数常犯的错误

    Views: 17478 | No Comments

    按N天分隔时间, 求出每一个时间段的开始和结束. 例如按7天分隔里头, 求当前时间所处的区间的开始和结束. 要注意时区!

    注意, 不要简单地对时间戳取模, 而是要对时间戳与开始时间(1970-01-01)的距离进行取模.

    <?
    $step = 7;
    $zerotime = strtotime('1970-01-01'); // 不一定是0!
    
    $span = ($time - $zerotime) % ($step * 86400);
    $stime = $time - $span;
    $etime = $stime + ($step * 86400) - 1;
    
    $sdate = date("Y-m-d H:i:s", $stime);
    $edate = date("Y-m-d H:i:s", $etime);
    ?>
    

    注意: Asia/Chongqing 时区, php 5.2.14

    strtotime('1980-5-1 01:00:00') - strtotime('1980-5-1 00:00:00'); // 输出 0!
    
    Posted by ideawu at 2012-05-29 16:03:05
  • 2012-04-12

    Nginx + PHP 配置和启动脚本

    Views: 21993 | No Comments

    做个笔记.

    # nginx.conf
    
    server {
        listen 8080 ;
        server_name localhost;
    
        location / {
            root           /home/work/htdocs;
            expires 1d;
            autoindex on;
            index  index.php index.html;
        }
        location ~* \.php$ {
            root           /home/work/htdocs;
            fastcgi_pass   127.0.0.1:30000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/work/htdocs/$fastcgi_script_name;
            client_max_body_size       100m;
            include        fastcgi_params;
            fastcgi_connect_timeout 1000s;
            fastcgi_send_timeout 1000s;
            fastcgi_read_timeout 1000s;
        }
    }
    
    # nginx.sh ngix 启动脚本
    
    #!/bin/sh
    case "$1" in 
        'start')
            sudo /usr/local/nginx/sbin/nginx -s start
            ;;      
        'stop') 
            sudo /usr/local/nginx/sbin/nginx -s stop
            ;;      
        'restart')
            sudo /usr/local/nginx/sbin/nginx -s reload
            ;;      
        *)
            echo "Usage: $0 {start|stop}"
            exit 1  
        ;;      
    esac
    
    # spaw-php.sh php-cgi 启动脚本
    #!/bin/sh
    dir=`dirname $0`
    PID_FILE=/home/work/htdocs/spaw-php.pid
    PHP_FCGI="/home/work/php/bin/php-cgi -f /home/work/htdocs/php.ini"
    
    case "$1" in 
        'start')
            spawn-fcgi -C 3 -p 30000 -f "$PHP_FCGI" -P $PID_FILE
            ;;      
        'stop') 
            kill `cat $PID_FILE`
            ;;      
        'restart')
            kill `cat $PID_FILE`
            spawn-fcgi -C 3 -p 30000 -f "$PHP_FCGI" -P $PID_FILE
            ;;      
        *)
            echo "Usage: $0 {start|stop}"
            exit 1  
        ;;      
    esac
    
    Posted by ideawu at 2012-04-12 15:52:17
  • 2012-03-08

    PHP的优势

    Views: 22424 | 5 Comments

    以前偶尔被人问到, 为什么你(和大部分互联网公司)做Web开发要选择PHP, PHP有什么好处. 简单的回答便是"PHP简单,开发快速".

    但是, ASP.NET不简单吗? ASP.NET上手不快吗? Python呢?

    有些人用各种PHP框架能快速搭建简单博客的例子来说明PHP的优势, 但这全是狗屎! 实际的业务不可能是博客那么简单.

    我认为, PHP的最大优势便是他的数据结构和内置函数, 具体地说便是字符串和数组, 以及字符串和数组的函数.

    PHP的字符串既能表示一般文本, 也能表示任意二进制数据, 也就是说, PHP的字符串就是一段内存. PHP的的字符串操作函数囊括了大部分常见和不常见的文本操作: 截取, 查找, 正则, 字符集编码转换...每一个都是一把利器.

    PHP的数组是整合了列表和哈希表的数据结构. 由于"树"是最能描述现实世界的数据结构, 而PHP的数组可以(轻松地)表示任意树, 所以, PHP的数组也最能描述现实世界(建模).

    如果要用一句话来描述PHP的优势, 我会用这一句:"PHP语言的数据结构和内置函数, 可以几乎直接地描述和处理实际业务. PHP是计算机与现实业务的最直接胶合剂."

    Posted by ideawu at 2012-03-08 10:43:18
  • 2011-10-12

    PHP重用curl句柄, CURLOPT_HTTPGET的BUG

    Views: 23543 | No Comments

    重用一个CURL句柄时, 发现curl_setopt($ch, CURLOPT_HTTPGET, TRUE) 不起作用. 期望在调用这条语句之后发起请求, 应该发送的是GET, 但看服务器log, 却使用了和前一次请求相同的HTTP方法.

    PHP脚本:

    <?php
    $url = 'http://www.ideawu.net/';
    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_exec($ch);
    
    curl_setopt($ch, CURLOPT_HTTPGET, true); // 错误! BUG
    curl_exec($ch);
    
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); // 正确
    curl_exec($ch);
    ?>
    

    web server log:

    124.127.130.50 "2011-10-12 18:55:09" "POST / HTTP/1.1" 200 3516 "-" www.ideawu.net
    124.127.130.50 "2011-10-12 18:55:09" "POST / HTTP/1.1" 200 3516 "-" www.ideawu.net
    124.127.130.50 "2011-10-12 18:55:09" "GET / HTTP/1.1" 200 3516 "-" www.ideawu.net
    

    这个BUG目前还没找到相关的资料.

    补充: 不仅仅是CURLOPT_HTTPGET, CURLOPT_POST也有同样的问题. 所以, 结论是: 只有CURLOPT_CUSTOMREQUEST才是正确的方法.

    Posted by ideawu at 2011-10-12 18:55:51
  • 2011-09-09

    PHP浮点数显示和转成字符串

    Views: 21194 | 2 Comments

    你可能会觉得PHP中将浮点数(float)转成字符串非常简单, 但是, 常用的方法隐藏着严重的bug. 因为, PHP在处理浮点数时有非常不合理的做法, 会有精度丢失. 经研究, 其实是PHP在显示浮点数时的问题, 也可以说是BUG. PHP内置的echo, var_dump, json_encode, 字符串拼接等函数(指令)在显示浮点数时都有问题, 导致精度丢失.

    <?php
    $a = 1315537636.338467;
    printf("%f", $a); echo "\n";
    echo $a . "\n";
    echo $a; echo "\n";
    

    结果

    1315537636.338467
    1315537636.3385
    1315537636.3385
    

    也就是说, 用PHP最顺手的方法将浮点数转成字符串或者显示是不行的, 必须使用printf/sprintf将浮点数转成字符串.

    Posted by ideawu at 2011-09-09 11:33:47
|<<<123456789>>>| 3/10 Pages, 55 Results.