常用前端库国内免费CDN

  • bootstrap中国
  • http://www.bootcdn.cn/
  • 360
  • http://libs.useso.com/
  • 七牛
  • http://www.staticfile.org/
  • 又拍云存储
  • http://jscdn.upai.com/
  • 百度
  • http://developer.baidu.com/wiki/index.php?title=docs/cplat/libs
  • 新浪
  • http://lib.sinaapp.com/
  • cdnjs
  • http://www.cdnjs.com/
@ 04:31 PM on August 06

rust项目编译错误

一年之前写了一个蜘蛛来熟悉rust语言。当时rust刚1.0,现在已经1.9了,想再看看api是否稳定,成熟项目是否多了。 看官网,好像文档也多了不少,于是打算完善一下。先看看能不能编译。发现编译不对,提示solicit编译不过,看依赖没有solicit。于是去找是哪个依赖的依赖里有solicit。发现都没有。 cargo clean之后还是如此,但是solicit是一个http client,有关系的只能是hyper了。但是hyper的github上代码没有依赖solicit。下了一个编译,发现也没编译solicit。 偶然点开Cargo.lock一看,发现hyper有依赖solicit,但是估计是之前版本的,删除lock文件之后,这里算是过了。不过看提示还是有solicit,只是版本不同了。 提示url库的UrlParser调用错误,看来剩下的都是常规api变动错误了。。。

@ 05:29 PM on June 27

PHP windows下编译参数

configure --disable-all --enable-cgi --with-analyzer --enable-cli --enable-cli-win32 --enable-embed --with-bz2 --with-curl --enable-sockets --with-sqlite3 --without-gd --with-gmp --enable-mbstring --enable-mbregex --with-mcrypt --with-openssl --enable-zephir_parser --enable-odbc --enable-sysvshm --with-tidy --with-mysqli --with-pdo-mssql --with-pdo-mysql --with-pdo-odbc --with-pdo-pgsql --with-pdo-sqlite --with-pdo-sqlite-external --enable-phar-native-ssl --with-xsl --enable-pdo --with-mysqlnd --enable-opcache

@ 07:48 PM on June 23

rsync配置

      > [root@localhost ~]# yum install rsync
      > [root@localhost ~]# mkdir /etc/rsyncd         #创建配置目录
      > [root@localhost ~]# touch /etc/rsyncd/rsyncd.conf              #创建主配置文件
      > [root@localhost ~]# touch /etc/rsyncd/rsyncd.secrets          #创建用户密码文件
      > [root@localhost ~]# chmod 600 /etc/rsyncd/rsyncd.secrets  #用户密码文件权限设置
      > [root@localhost ~]# touch /etc/rsyncd/rsyncd.motd            #服务器欢迎信息
      > root@localhost ~]# vim /etc/rsyncd/rsyncd.conf 
      > # Minimal configuration file for rsync daemon 
      > # See rsync(1) and rsyncd.conf(5) man pages for help
      > # This line is required by the /etc/init.d/rsyncd script 
      > pid file = /var/run/rsyncd.pid 
      > port = 873   ##监听端口 
      > address = 192.168.1.1  ##监听地址 
      > #uid = nobody 
      > #gid = nobody   
      > uid = root 
      > gid = root
      > use chroot = yes   ##是否限制在指定目录,为了安装,一般需要启用 
      > read only = no
      > #limit access to private LANs 
      > hosts allow=192.168.1.0/255.255.255.0   ##允许网段 
      > hosts deny=*
      > max connections = 5 
      > motd file = /etc/rsyncd/rsyncd.motd
      > #This will give you a separate log file 
      > #log file = /var/log/rsync.log
      > #This will log every file transferred - up to 85,000+ per user, per sync 
      > #transfer logging = yes
      > log format = %t %a %m %f %b 
      > syslog facility = local3 
      > timeout = 300
      > ##定义一个同步目录
      > [webhome] 
      > path = /data
      > list=yes 
      > ignore errors 
      > auth users = nobody 
      > secrets file = /etc/rsyncd/rsyncd.secrets  ##指定上述账号密码文件 
      > comment = web home
      > exclude =   /web/   ##排除目录
      > 编辑/etc/rsyncd/rsyncd.secrets文件:
      > #Account and password 
      > apache:password123
      > 注意:这里账号虽然用的是系统账号,但是密码是自定义的密码。
      > 
      > 启动使rsync生效:
      > [root@localhost ~]# /usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf 
      > 
      > 设置为开机启动:
      > [root@localhost ~]# echo "/usr/bin/rsync --deamon --config=/etc/rsyncd/rsyncd.conf" >> /etc/rc.d/rc.local 



      > 客户端安装同上,额外只需配置一个密码文件,具体如下:
      > 
      > 
      > [root@localhost ~]# mkdir /etc/rsyncd
      > [root@localhost ~]# echo "password123" > /etc/rsyncd/rsyncd.password   #创建密码文件,密码为服务器端rsyncd.secrets文件中的密码。
      > [root@localhost ~]# chmod 600 /etc/rsyncd/rsyncd.password#一定是只读的,
      > 同步:
      > [root@localhost ~]# rsync -avzP --password-file=/etc/rsyncd/rsyncd.password apache@192.168.1.1::webhome  /var/www/html/
@ 10:17 AM on May 13

C11标准

C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准。相比C99,C11有哪些变化呢——

1、 对齐处理

alignof(T)返回T的对齐方式,aligned_alloc()以指定字节和对齐方式分配内存,头文件<stdalign.h>定义了这些内容。

2、 _Noreturn

_Noreturn是个函数修饰符,位置在函数返回类型的前面,声明函数无返回值,有点类似于gcc的attribute((noreturn)),后者在声明语句尾部。

3、 _Generic

_Generic支持轻量级范型编程,可以把一组具有不同类型而却有相同功能的函数抽象为一个接口。

4、 _Static_assert()

_Static_assert(),静态断言,在编译时刻进行,断言表达式必须是在编译时期可以计算的表达式,而普通的assert()在运行时刻断言。

5、安全版本的几个函数

gets_s()取代了gets(),原因是后者这个I/O函数的实际缓冲区大小不确定,以至于发生常见的缓冲区溢出攻击,类似的函数还有其它的。

6、 fopen()新模式

fopen()增加了新的创建、打开模式“x”,在文件锁中比较常用。

7、 匿名结构体、联合体。

8、 多线程

头文件<threads.h>定义了创建和管理线程的函数,新的存储类修饰符_Thread_local限定了变量不能在多线程之间共享。

9、 _Atomic类型修饰符和头文件<stdatomic.h>。

10、改进的Unicode支持和头文件<uchar.h>。

11、quick_exit()

又一种终止程序的方式,当exit()失败时用以终止程序。

12、复数宏,浮点数宏。

13、time.h新增timespec结构体,时间单位为纳秒,原来的timeval结构体时间单位为毫秒。

@ 05:19 PM on October 28

Tinyscheme的一个bug

    之前从1.3甚至更早开始,就发现tinyscheme运行yinyang pluzzle的时候,是有bug的。
         (let* ((yin
           ((lambda (cc) (display #\@) cc) (call-with-current-continuation (lambda (c) c))))
          (yang
            ((lambda (cc) (display #\*) cc) (call-with-current-continuation (lambda (c) c)))))
             (yin yang))

    本来是一个无限的过程,但是很快就结束了。
     但因为本来只是业余玩这个,加上之前觉得找这种bug工作量比较大,一直没找。后来觉得这么小的scheme解释器实在是少,而且恰好有时间,还是解决了这个bug比较好。
      于是去年下功夫找了下,改了这个bug。后来事情多了,又把修改的地方丢一边去了,但是还好修改过的版本一直放在网盘。
       今天对比了下,找到当时改掉的bug。
        是因为里面使用的将list顺序翻转的函数有2个,其中一个用起来有bug。
         /* reverse list -- produce new list */
static pointer reverse(scheme *sc, pointer a) {
    /* a must be checked by gc */
    pointer p = sc->NIL;

    for (; is_pair(a); a = cdr(a)) {
        p = cons(sc, car(a), p);
    }
    return (p);
}

/* reverse list --- in-place */
static pointer reverse_in_place(scheme *sc, pointer term, pointer list) {
   pointer p = list, result = term, q;

    while (p != sc->NIL) {
        q = cdr(p);
        cdr(p) = result;
        result = p;
        p = q;
    }
     return (result);
}

前面的reverse会生成新的list,后面的reverse_in_place则不会。将几个使用reverse_in_place的地方改成reverse就好了。
@ 10:19 PM on June 19

nginx配置里的一个坑

最近用flight写了点东西,因为用的request_url,所以直接用index.php框架会提示404。 用了nginx的rewrite之后,首页是没问题了,但是其他页面就都是nginx提示file not foound.rewrite配置如下 if ( !-e $request_filename ){ rewrite .* index.php last; } fastcgi是这么配置的 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 分明rewrite到index.php下了。找了很久,查资料都没找到原因。于是猜测是不是$fastcgi_script_name的缘故,改成 fastcgi_param SCRIPT_FILENAME $document_root/index.php; 发现ok了。。。

前面处理的时候,发现日志已经500多m了。于是打算压缩之后删掉。直接压缩但是发现log会变,于是打算mv之后压缩,发现mv了仍然在往里写日志,原路径没生成新的日志。 一想就明白了,因为文件node的缘故。。。有时候在目录里,另外的终端删除之后重建,然后发现之前的终端里ls是没有新的文件,只有cd ..然后重新进入目录才会看到文件,也是一样的道理。

@ 11:26 PM on May 30

php6和php7性能对比

昨天看到一个php7新特性的pdf,今天看到php.net上有php7的snapshot for win下载,于是下了一个试试。

开始用字符串和类实例化调用魔术方法试了下,php7性能是php6.6的3倍。后来看到 链接的一个测试,里面和其他语言比较,php性能垫底了。然后此处对比5.3和5.4 ,虽然有强化,但是还是很弱。下了他的测试代码,是一个找质数的,基本就是纯数字运算。测试完,发现PHP7的JIT果然不是盖的。贴下测试代码和结果吧。。。

D:\dev\test>D:\dev\php7\php -v
PHP 7.0.0-dev (cli) (built: Apr 24 2015 15:06:00)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies

D:\dev\test>D:\dev\php\php -v
PHP 5.6.6 (cli) (built: Feb 18 2015 16:02:19)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

D:\dev\test>D:\dev\php\php test.php
Test1 total cost:0.033001899719238
Test2 total cost:0.12400698661804
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Test3 total cost:63.071608066559

D:\dev\test>D:\dev\php7\php test.php
Test1 total cost:0.010000944137573
Test2 total cost:0.04600191116333
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Found 664579 prime numbers.
Test3 total cost:12.118693113327

其中php6.6使用内存500+m,而php7使用内存180+m。。。差别实在是非常大,这说明了JIT对于数字运算的性能提升是非常明显的,远超其他操作,就如基本操作提升大于实际项目表现一样。另外说明了php7里对解释器内存使用的优化效果也是很明显的。开始php6.6默认的内存上限120M总是不够用,会报错。

下面贴测试代码:

<?php
    ini_set("memory_limit", 512*1024*1024);
    $start = microtime(true);
    $string = "";
         for($i=0;$i < 100000;++$i){
            $string .= "{$i}";
         }
    $end = microtime(true);
    echo "Test1 total cost:".($end-$start)."\n";


    /**
    * 
    */
    class TestClass 
    {

        function __construct()
        {
            # code...
        }

        function __call($name,$args){
            if($name == "ttt"){return 1+1;}
        }

    }

    $start = microtime(true);
         for($i=0;$i < 100000;++$i){
            $obj = new TestClass();
            $obj->ttt();
         }
    $end = microtime(true);
    echo "Test2 total cost:".($end-$start)."\n";


    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    function get_primes7($n) {
        if ($n < 2) return array();
        if ($n == 2) return array(2);
        $s = range(3, $n, 2);
        $mroot = sqrt($n);
        $half = count($s);
        $i = 0;
        $m = 3;
        while ($m <= $mroot) {
            if ($s[$i]) {
                $j = (int)(($m*$m - 3) / 2);
                $s[$j] = 0;
                while ($j < $half) {
                    $s[$j] = 0;
                    $j += $m;
                }
            }
            $i = $i + 1;
            $m = 2*$i + 3;
        }
        $res = array(2);
        foreach ($s as $v) {
            if ($v) {
                $res[] = $v;
            }
        }
        return $res;
    }

    $res = array();
    $start = microtime(true);

    for ($i = 1; $i <= 10; ++$i) {
        $res = get_primes7(10000000);
        print "Found ".count($res)." prime numbers.\n";
    }

    $end = microtime(true);
    echo "Test3 total cost:".($end-$start)."\n";
@ 03:38 PM on April 25
Next → Page 1 of 3