opensuse 12.1 安装sun java

opensuse 12.1默认只有openjdk (可能是因为版权的问题吧),也不像ubuntu发行版openjdk和sun java都带的有,可以自己切换。

首先到sun java网站下载sub java jre,下载地址 http://www.java.com/en/download/manual.jsp

如果你使用的是32位opensuse,那么就下载Linux RPM,64位的话Linux x64 RPM

下载完成之后在终端(Terminal)下执行

安装sun java

rpm -iv 下载的文件路径

安装update-alternatives

cnf update-alternatives

把sun java添加到update-alternatives管理

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/java/jre1.7.0_07/bin/java" 40

选择你要使用的java

sudo update-alternatives --config java

安装PHP_Beautifier出现错误

Failed to download pear/PHP_Beautifier, version "0.0.15", latest release is version 0.1.15, stability "beta", use "channel://pear.php.net/PHP_Beautifier-0.1.15" to install
install failed

今天在opensuse上面安装PHP_beautifier出现上面的问题。

如果你也同样出现上面的问题,请使用下面命令进行安装:

sudo pear install PHP_Beautifier-beta

openSUSE 12.1启动没有(不能)运行after.local的问题

在openSUSE 12.1中,默认的/etc/init.d/after.local不执行,先介绍下after.local

在openSUSE中没有redhat,centos系的rc.local,作为代替的有boot.local,before.local和after.local,这3个文件都在/etc/init.d/目录下

  • boot.local

    系统中运行rc启动脚本之前会执行这个文件,所以这个文件执行时候系统的网络是没有的

  • befor.local

    该文件在也是在rc启动脚本之前执行,但是会在boot.local之后执行。

  • after.local

    该文件在rc启动脚本之后执行。类似redhat,centos系的rc.local

但是我安装了openSUSE之后,需要开机自动启动一些脚本,但是after.local就是不会执行,问google之后,只有一个老外说了此问题,下面是解决方法:

  1. 我们需要创建一个after-local.server的文件在/lib/systemd/system目录中,可以在openSUSE的KDE桌面下按快捷键Alt + F2,然后输入下面命令很回车

    kdesu kwrite /lib/systemd/system/after-local.service
    

    把下面内容复制到文件中并保存:

    #  This file is part of systemd.
    #
    #  systemd is free software; you can redistribute it and/or modify it
    #  under the terms of the GNU General Public License as published by
    #  the Free Software Foundation; either version 2 of the License, or
    #  (at your option) any later version.
    
    [Unit]
    Description=/etc/init.d/after.local Compatibility
    ConditionFileIsExecutable=/etc/init.d/after.local
    
    [Service]
    Type=oneshot
    ExecStart=/etc/init.d/after.local
    TimeoutSec=0
    StandardOutput=tty
    RemainAfterExit=yes
    SysVStartPriority=99
    
    [Install]
    WantedBy=multi-user.target
    
  2. 我们需要把after-local.service加入到systemd中。打开你的终端(Termial),执行下面命令:

    sudo systemctl enable /lib/systemd/system/after-local.service
    
  3. 最后我们编辑/etc/init.d/after.local加入你的启动脚本即可,继续Alt+F2执行下面命令

    kdesu kwrite /etc/init.d/after.local
    

ubuntu桌面版32位和64位对比及选择

我们要装一台电脑开发使用当然首先ubunut 12.04系统,但是应该选择32位还是64位呢?

对于我们大家都知道的区别,大概就是内存上面的32位系统最高能使用大概3.5G的内存, 当然开启PAE之后可以使用更多内存,而64位系统我们可以理解为没有限制(当然还是有限制的, 只是他所限制的大小,我们普通的桌面系统根本达不到)。再有什么区别,我们还是不能想到。 另外你可能说CPU的区别,是否支持64位,我想说现在这年头还有32位的CPU吗?

对于我们选择,还是要看看32位和64位他们的性能如何,下面是老外做的测试,分别测试了ubuntu 32位、 32位PAE以及64位:

测试硬件:

  • CPU: Intel Core i7 720Q @ 1.6Ghz (8 Cores)
  • 主板: LENOVO 4318CTO
  • 芯片: Intel Core DMI
  • 内存: 4096MB, 32位只能使用3584MB
  • 显卡: NVIDIA Quadro FX 880M 1024MB (550/790MHz)
  • 网卡: Intel 82577LM Gigabit Connection + Intel Centrino Ultimate-N 6300
  • 编译器: GCC 4.6
  • 文件系统: ext4
  • 显示器分辨率: 1600×900

测试结果,测试项目挺多的

  • OpenArena 显卡帧数,越高越好 OpenArena-v0.8.5

  • C-Ray 越小越好 C-Ray-v1.1

  • Smallpt 越小越好 Smallpt-v1.0

  • LAME MP3 Encoding 越小越好 LAME-MP3-Encoding-v3.99.3

  • x264 越高越好 x264-v2011-12-06

  • Apache Benchmark 越高越好 Apache-Benchmark-v2.2.21

  • PostMark 越高越好 PostMark-v1.51

  • Timed MAFFT Alignment 越小越好 Timed-MAFFT-Alignment-v6.864

  • Timed HMMER Search 越小越好 Timed-HMMER-Search-v2.3.2

  • Himeno Benchmark 越高越好 Himno-Benchmark-v3.0

  • OpenSSL 越高越好 OpenSSL-v1.0.0e

看了这些测试,还有什么理由不选择64位呢。

Slim框架,只支持PHP 5

Slim是一个微型的PHP 5框架,他可以帮助你快速编写简单功能强大的RESTful风格的web应用程序 和APIs。Slim的简单可以让新手和专业人士使用。

特性:

  • 干净而简单的使用DSL编写强大的web应用程序
  • HTTP URL路由
    • 支持所有标准的和自定义的HTTP请求方法
    • 路由支持参数和条件
    • 支持跳转
    • 支持略过
    • Route halting
    • 支持中间层
    • 给路由命名和 urlFor() 帮手
  • 简单的配置
  • 简单的模板和自定义视图(例如:Twig,Mustanche,Smarty)
  • Flash消息
  • 支持使用AES-256加密的cookies
  • HTTP缓存(Etag和Last-Modified)
  • 日志
  • 错误处理
    • 自定义404处理方法
    • 自定义错误处理方法
    • 调试
  • 内置Rack协议(?)
  • 可扩展的中间层和hook架构
  • 支持PHP >= 5.2.0

“Hello Word”应用程序(PHP >= 5.3)

Slim支持PHP 5.3的匿名函数。这是最好的方法来定义Slim路由程序,下面这个例子 假设你已经配置了web服务器的url重写

<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/hello/:name', function ($name) {
    echo "Hello, $name!";
});
$app->run();

PHP类属性3种不同访问方式的性能测试

PHP给了我们3种访问类属性的方法,我们来测试以下他们的性能差异。

1.直接访问

class dog { 
    public $name = "";
} 
$rover = new dog(); 
for ($x=0; $x<10; $x++) { 
    $t = microtime(true); 
    for ($i=0; $i<1000000; $i++) { 
        $rover->name = "rover"; 
        $n = $rover->name;
    } 
    echo microtime(true) - $t;echo "\n";
}

2.使用类函数访问

class dog {
    public $name = "";

    public function setName($name) {
        $this->name = $name; 
    }

    public function getName() {
        return $this->name; 
    } 
}

$rover = new dog();
for ($x=0; $x<10; $x++) { 
    $t = microtime(true);
    for ($i=0; $i<1000000; $i++) { 
        $rover->setName("rover");
        $n = $rover->getName();
    }
    echo microtime(true) - $t;echo "\n";
}

3.使用PHP提供的魔术方法__set和__get访问

class dog { 
    private $data = array();
    function __set($name, $value) {
        $this->data[$name] = $value;
    }
    function __get($name) {
        if(array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        return null;
    }
} 
$rover = new dog(); 
for ($x=0; $x<10; $x++) { 
    $t = microtime(true); 
    for ($i=0; $i<1000000; $i++) { 
        $rover->name = "rover"; 
        $n = $rover->name;
    } 
    echo microtime(true) - $t;echo "\n";
}

执行结果分别为:

1.直接访问

0.59869480133057
0.59985685348511
0.61411023139954
0.61089015007019
0.59671401977539
0.60318994522095
0.60059809684753
0.59980893135071
0.59794902801514
0.59721207618713

2.使用类函数访问

4.107736825943
4.0344598293304
4.009449005127
4.0501089096069
4.070415019989
4.0576939582825
4.0664989948273
4.0609030723572
4.0520219802856
4.0485868453979

3.使用PHP提供的魔术方法__set和__get访问

7.6956799030304
7.810909986496
7.7758450508118
7.7235188484192
7.7205560207367
7.7772619724274
7.9401290416718
7.8542349338531
7.8687150478363
7.9177348613739

差距还是挺大的。

为了让大家方便自己测试,下面把3种直接可以在命令行执行的代码整理出来:

php -d implicit_flush=off -r  'class dog { public $name = "";} $rover = new dog(); for ($x=0; $x<10; $x++) { $t = microtime(true); for ($i=0; $i<1000000; $i++) { $rover->name = "rover"; $n = $rover->name;} echo microtime(true) - $t;echo "\n";}'

php -d implicit_flush=off -r  'class dog {public $name = "";public function setName($name) {$this->name = $name; }public function getName() {return $this->name; } }$rover = new dog();for ($x=0; $x<10; $x++) { $t = microtime(true);for ($i=0; $i<1000000; $i++) { $rover->setName("rover");$n = $rover->getName();}echo microtime(true) - $t;echo "\n";}'

php -d implicit_flush=off -r 'class dog { private $data = array();function __set($name, $value) {$this->data[$name] = $value;}function __get($name) {if(array_key_exists($name, $this->data)) {return $this->data[$name];}return null;}} $rover = new dog(); for ($x=0; $x<10; $x++) { $t = microtime(true); for ($i=0; $i<1000000; $i++) { $rover->name = "rover"; $n = $rover->name;} echo microtime(true) - $t;echo "\n";}'

你们结果如何?

(End)

PHP 5.5会有哪些改进

PHP 5.4刚刚发布4个月,现在来谈论下一个版本的PHP,可能为时过早,但是在 PHP的内部邮件列表中,这个话题现在很火。

PHP 5.5目前还处于早期发展阶段,最终他会成什么样子,现在没人会知道,下面 只是总结人们对PHP 5.5的期望,但是PHP 5.5并不会包含下面所有的内容。

简单的来说,有4个比较重要的功能点:

  • 一个简单的密码hash函数
  • 类型约束检测 (Scalar typehinting)
  • Getters and seters (属性)
  • 生成器 (Generators)

其他的很多细节:

不支持Windows XP和2003

PHP 5.5将不再支持Windows XP和2003系统,这些系统太老了。

/e修饰符定义为过时的

/e修饰符被设置之后 preg_replace()在进行了对替换字符串的后向引用替换之后, 将替换后的字符串作为php代码评估执行(eval函数方式), 并使用执行结果作为实际 参与替换的字符串. 单引号, 双引号, 反斜线(\)和NULL字符在 后向引用替换时会 被用反斜线转义。

这将会导致安全问题,作为替代,应该使用preg_replace_callback函数。

boolval()

PHP已经实现了strval, intval, floatval函数,转换为bool类型的boolval函数将会被添加。 他和(bool)的转换是一样的,但是他可以作为回调函数使用。

array_column()

array_colume或者array_pluch函数将会表现如下:

<?php

$userNames = array_column($users, 'name');
// 等同于下面代码
$userNames = [];
foreach ($users as $user) {
    $userNames[] = $user['name'];
}

一个简单的密码hash函数

最近很多大型网站泄漏密码(注意这个的泄漏密码不是国内的各种密码门,老外才不关心国内呢,在国外也 有很多类是国内的密码泄漏事件),对于密码我们一直提倡使用bcrypt进行加密,但还是有很多人使用不 安全的sha1哈希。(国内、外的密码泄漏,虽然都是泄漏,但国外泄漏是被哈希过的密码,而国内直接是 明文)

我估计这可能是使用crypt函数太困难的(sha1, md5的确很简单),因为我们需要一个简单而且安全的密码 哈希函数:

<?php

$password = "foo";

// 创建一个密码哈希
$hash = password_hash($password, PASSWORD_BCRYPT);

// 验证一个密码
if (password_verify($password, $hash)) {
    // 密码正确!
} else {
    // 密码错误!
}

新的密码哈希有更多的更能,这里是 RFC 概述。

常量引用 (Constant dereferencing)

“Constant dereferencing” 是指可以直接用操作数组的方式来操作字符串,看下面2个例子:

<?php

function randomHexString($length) {
    $str = '';
    for ($i = 0; $i < $length; ++$i) {
        $str .= "0123456789abcdef"[mt_rand(0, 15)]; // direct dereference of string
    }
}

function randomBool() {
    return [false, true][mt_rand(0, 1)]; // direct dereference of array
}

我不认为应该使用该特性,但他让语言语法多了一点。查看 RFC

empty()函数将支持参数是一个函数调用(和其他表达式)

目前的empty()函数的参数只能是一个变量,PHP 5.5中将支持emtpy($this->getFriends())这样使用,在之前的版本 这将会抛出一个错误。查看 RFC

获取完整的类名

PHP 5.3中增加了命名空间的特性。就导致下面代码的问题:

<?php

use Some\Deeply\Nested\Namespace\FooBar;

// 这个代码不能工作,因为他会在全局中查找FooBar类,显然这是找不到的
$reflection = new ReflectionClass('FooBar');

为了解决这个问题引入一个新的语法FooBar::class返回完整的类名

use Some\Deeply\Nested\Namespace\FooBar;

// this works because FooBar::class is resolved to "Some\\Deeply\\Nested\\Namespace\\FooBar"
$reflection = new ReflectionClass(FooBar::class);

更多示例查看 RFC

函数参数可以跳过(Parameter skipping)

如果你有一个函数接受多个可选参数,目前你没有办法使用中间参数的默认值,新增的default可以做到使用某些参数的默认值, 而不是在调用函数的地方再定义一遍值。

下面是 RFC 中的一个例子:

function create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true) { ... }

如果我们要设置 $report_errors = false 而不需要设置 $join_type和 $execute参数,我们就可以使用下面代码:

create_query("deleted=0", "name", default, default, false);

类型约束检测

检测类型约束原本是要包含中PHP 5.4中的,但是由于未达成共识,他没有被包含进PHP 5.4。

现在PHP 5.5又开始讨论提议他了。查看 RFC

他会检测并转换输入值的类型,但只有在转换不丢失数据的情况下,例如:123, 123.0, “123″ 都是一个int类型参数的 有效值,但”hello word.”不会。

function foo(int $i) { ... }

foo(1);      // $i = 1
foo(1.0);    // $i = 1
foo("1");    // $i = 1
foo("1abc"); // not yet clear, maybe $i = 1 with notice
foo(1.5);    // not yet clear, maybe $i = 1 with notice
foo([]);     // error
foo("abc");  // error

新的Getters和 Setters语法

如果你是 getXYZ()和 setXYZ()写法的粉丝,那么这是一个可喜的变化。PHP 5.5中提议增加一个对于直接属性读写的 语法:

<?php

class TimePeriod {
    public $seconds;

    public $hours {
        get { return $this->seconds / 3600; }
        set { $this->seconds = $value * 3600; }
    }
}

$timePeriod = new TimePeriod;
$timePeriod->hours = 10;

var_dump($timePeriod->seconds); // int(36000)
var_dump($timePeriod->hours);   // int(10)

也有一些其他的特性,例如只读的属性,更多内容可以参考 RFC

生成器

目前自定义的迭代器很少被使用,因为使用他太麻烦了,需要很多其他无关的代码(被称为模板代码),生成器提供一个方便 使用迭代器的方法来解决这个问题。

例如,这是一个自定义范围的函数,但他也可以被当迭代器使用:

<?php

function *xrange($start, $end, $step = 1) {
    for ($i = $start; $i < $end; $i += $step) {
        yield $i;
    }
}

foreach (xrange(10, 20) as $i) {
    // ...
}

上面xrange函数具有同内置的range函数相同的功能,唯一不同的是他返回的不是一个包含了所有值的数组,而是一个迭代器 生成的动态值。

更多的功能可以参考 RFC

列表内涵和生成器表达式

列表内涵提供一个简单的访问数组的方式:

$firstNames = [foreach ($users as $user) yield $user->firstName];

上面类表内涵等同于下面代码:

$firstNames = [];
foreach ($users as $user) {
    $firstNames[] = $user->firstName;
}

他也可以过滤数组:

$underageUsers = [foreach ($users as $user) if ($user->age < 18) yield $user];

生成器表达式类是,但他返回的是一个迭代器动态生成的值,而不是一个数组。

(End)

代码优化,重构

今天把09年写的一个类拿来使用,浏览了一下,看着之前写的烂代码挺难读的,随手就优化了一下,直接看代码。

老代码:

$getStr = '';
if($_GET) {
    $getStr = '?';
    foreach ($_GET as $k => $v) {
        if($k != 'p' && $k != 'ps') {
            if(!in_array($k,$this->mIgnoreGet)) {
                $getStr .= $k . '=' . $v . '&';
            }
        }
    }
    if($getStr == '?') {
        $getStr = '';
    }
}

优化之后的代码:

parse_str($_SERVER['QUERY_STRING'], $query_array);
if(!empty($query_array)) {
    unset($query_array['p']);
    foreach (array_keys($this->mIgnoreGet) as $v) {
        unset[$v];
    }
}
$getStr = http_build_query($query_array);
$getStr = empty($getStr) ? '' : '?' . $getStr;

对于结构的优化就不写了。

这就是一次很小的重构。真的很小,用时很短。但是真实的改善了代码结构, 减少代码行数,提升代码的可读性。