2015年一月月 发布的文章

rust的pointer和borrowing

对于rust的pointer和borrowing,前面没理解明白,以为是指针在函数调用过程中的传值。但是在学习和写代码的过程中,发现一些问题,传指针老是提示类型不匹配。仔细找了些资料,现在rust的资料很少,中文的就更少,而且rust前期变化太快,也不一定适用。
找到一个2014年的文章http://segmentfault.com/blog/xiongxin/1190000000596516 说到一些问题,之前传值的时候函数参数用的&mut xx:T,如果是xx:&T或者xx:&mut T,要么有类型问题,要么不能修改变量的值。原来是传参数的时候需要使用&mut x这样显式地说明是可写指针。这样好处是指针的使用更明确不容易出错,而且编译器更容易跟踪,避免指针上出问题。 不过这个&到处加都没报错,不知道都是什么含义。

use std::vec::Vec;
fn test1(mut n: i32){
n = 8;
}
fn test2( n: &mut i32){
*n = 8;
}
//fn test3(n: &i32){
//  *n = 8;
//}
fn main(){
let mut t:i32= 1;
t = 2;
println!("raw-t:{}",t);
test1(t);
println!("test1-t:{}",t);
let mut t2:i32 = 2;
test2(&mut t2);
println!("test2-t2:{}",t2);
//let t1 = 1;
//test3(&t1);
//println!("test3-t1:{}",t1);
}

Source: xundaoinfo

折腾ubuntu 14.10硬盘安装

笔记本上的win7越来越卡,加上最近本来就没什么空,游戏玩得少,学习的多,这样就想和之前一样弄个双系统。
现在用的大部分是easyBCD,用了下,确实很方便,但是直接用iso的那个项无法启动。打算用上面的grub试试,grub参数有点变化。启动的时候总是提示找不到cdrom,手动mount不支持ntfs。在grub指定了下iso,发现还是提示找不到cdrom。然后换了debian,也是一样。改成arch,提示找不到cdrom,但是手动mount可以挂载。但挂载了也无法安装,后来又找到一个将iso加载到内存的方法。http://blog.sina.cn/dpool/blog/s/blog_6c9d65a10100oetc.html 用debian成功,试了下ubuntu,也是成功了。
然后分区提示不能卸载iso所在分区,但是根本没涉及这个分区啊,只是写了分区表。结果我退出去用shell分好之后,再试,也是不行。后来看到前面那个链接里写了这个问题。。。然后安装成功。
进入系统,装了点东西后,发现用账号登不进去了。切换到tty1,又建了个用户,发现还是不行。开始以为是输入法的问题,但观察发现和密码错误不太一样。于是找了下,有说是窗口管理器的问题,我之前也遇到过换成xfce就可以的情况,但发现不登录不能打开wifi,guest虽然能进,但是也没法打开wifi,也没法修改设置。。。tty1改/etc/profile等也没用,最后发现http://tieba.baidu.com/p/3333869633 然后登进去了。
发现现在unity和应用中心都和苹果越来越像了。。。

Source: xundaoinfo

PHP 7.0性能与php5.6对比

之前看到phpng已经进入php的git主线。编译github上的phpng,编译很顺利,结果发现运行有问题。最近在家用git.php.net上的最新代码又编译了一次,貌似没问题。到公司也下了个,多了个commit,然后编译执行文件也没问题。测试了下性能。
第一个简单的调用函数测试:

function add($a ,$b){
return $a + $b;
}
$t=microtime(true);    
for(   $i=0;$i <1000000;$i++) {     
if(($i%20)!=0)    
{  
add($i , $i+1);
}     
else     
{  
add($i-1 , $i);
}     
}  
$t1 = microtime(true);
echo   "costs: ";   echo   $t1-$t;   echo   " n";   

php -v
PHP 5.6.3 (cli) (built: Nov 12 2014 17:19:25)
Copyright (c) 1997-2014 The PHP Group

php test.php
costs: 0.20501208305359

php -v
PHP 7.0.0-dev (cli) (built: Jan 19 2015 16:44:35)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies

php test.php
costs: 0.15400910377502

$primes = [];
function isPrime($a){
global $primes;
foreach($primes as $b){
if($a %  $b == 0 ){
return false;
}
}
return true;
}
$t=microtime(true);    
for(   $i=2;$i <100000;$i++) {     
if(isPrime($i)){
array_push($primes, $i);
} 
}  
$t1 = microtime(true);
echo   "costs: ";   echo   $t1-$t;   echo   " n";   

php 7

php test.php
costs: 2.0501170158386

php 5.6

php test.php
costs: 1.9711117744446

再换一段 来源

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;
}
$t1 = microtime(true);
$res = array();
for ($i = 1; $i <= 10; ++$i) {
$res = get_primes7(1000000);
//print "Found ".count($res)." prime numbers.n";
}
$t2 = microtime(true);
echo "cost:" . ($t2 - $t1);

php 5.6

php test.php
cost:3.7742161750793

php7

php test.php
cost:0.85604906082153

Source: xundaoinfo

Rust 1.0.0alpha小试

早在rust的早期版本,看了文档写hello world还行,写个socket的程序总是报错。错在读取到的内容不是string或者str,而是core::result::Result<collections::vec::Vec, std::io::IoError>,当时想到的是Vec如何转换成字符串,发现没有这个api,而且搜索也没有结果,看github上的代码,发现根本不能用。应该是当时语法变化很大导致的,前面看过几次语法却是有比较大的变化,于是打算等api稳定再学。

最近1.0.0alpha出来了,下了一个试试看,也看到1.0.0alpha的文档已经更新。完整看了下book,感觉清晰多了。然后又参照例子写了一个socket的client来试试。结果还是老问题,开始以为是Vec需要转换成[u8]。结果发现是Result,于是在按api文档里的例子试过几次之后,最后用match获取成功。得到的是Vec,发现没有方法可以直接转换成字符串,也没有方法直接转换成array。用from_utf8的参数也不能是Vec,找的github上的例子还是老样子。于是看了很久文档,发现Vec可以转换成slice,而slice可以转换成字符串。于是改了,发现虽然有几个warning: use of unstable item,但还是编译成功,执行无误。

extern crate collections;
use std::io::TcpStream;
use std::str;
fn main() {
let mut socket = TcpStream::connect("192.168.32.129:80").unwrap();
socket.write(b"GET / HTTP/1.0nn");
let response = socket.read_to_end();
//let r = str::from_utf8(response);
let mut t = match response {
Ok(s) => s,
Err(w) => panic!("{}",w),
};
let c =  match str::from_utf8(t.as_slice()) {
Ok(s) => s,
Err(w) => panic!("{}",w),
};
println!("{}",c);
}

Source: xundaoinfo

windows下编译PHP 5.6

PHP官方教程:https://wiki.php.net/internals/windows/stepbystepbuild

PHP在windows上只能用VS编译,用MingW和Cygwin都会遇到很多问题。之前试过很多次,没一次成功的,后来看到官网的文档,不支持MingW和Cygwin才作罢。

之前查的资料都是setenv /x86或者setenv /x64 是没法用的。

1、首先下载 PHP-SDK ,这些是编译PHP过程中需要的一些辅助工具,如flex,re2c,bison,wget等。下载最新的 php-sdk-binary-tools-20110915.zip,解压到F:php-sdk。解压后,这个目录下有bin和script、share三个子目录
2、 装了个visual studio 2012,打开命令工具。
执行 vcvarsall.bat 如果需要64位,则执行vcvarsall.bat x86_amd64。
如果使用的是vs2013,使用【VS2013 x86 本机工具命令提示】和上面vs2012的一致。但是如果使用的是【VS2013 x64 兼容工具命令提示】则执行vcvarsx86_amd64.bat
之前查的资料都是setenv /x86或者setenv /x64 是没法用的。
然后cd到 F:php-sdk 这个目录
执行 binphpsdk_setvars.bat
执行 binphpsdk_buildtree.bat php56dev
这样,在F:php-sdk目录下多了一个php56dev目录

3、接着继续在 php-sdk 目录下载 deps-5.6-vc11-x64.7z ,并解压到 F:php-sdkphp56devvc11x64目录下。这里面包括了编译PHP和一些常用扩展所需要的基本的包含文件和库文件。

4、下载PHP5.6 最新源代码。 解压到 F:php-sdkphp56devvc11x64depsphp-5.6目录(此处 php-5.6为我们新建的目录 )。

5、可以开始编译了。进入PHP源码目录, c:php-sdkphp56devvc9x64depsphp-5.6,运行buildconf.bat,之后我们就可以用configure.bat –help 命令查看构建选项了。 可以先试着编译php了。最开始,一般编译尽可能少的模块,先让核心能正常编译出来。
configure –disable-all –enable-cli
nmake
稍等一会,php5.6最核心部分及一个命令行工具就编译出来了(这中间的警告信息可以不用顾及)。
cd x64Release_TS
php -m
就可以看到
[PHP Modules]
Core
date
ereg
pcre
Reflection
SPL
standard
[Zend Modules]
然后我们也可以试着加入更多的模块,比如:configure –disable-all –enable-cli –with-sqlite3 –with-mcrypt=static –with-mysqlnd –with-mysql=mysqlnd –with-mysqli=mysqlnd –with-gd –with-mhash –with-curl –with-gettext –with-iconv –enable-mbstring –enable-session

如果要编译php扩展,将扩展解压放到c:php-sdkphp56devvc9x64depsphp-5.6ext 目录下,然后buildconf之后,configure里加上–enable-扩展名就可以了。或者在解压到目录之后,打开扩展目录,直接双击dsp打开VS开始编译。

编译完PHP5.6后,看到PHPNG已经进入PHP源码的master了,也编译了下,用同样的方法也能编译成功,但貌似执行的时候会出错。看开得等到beta或者rc了。

Source: xundaoinfo