月度归档:2014 年九月

golang 影响性能的写法

下面有些结论是看了达达在github上的一些测试代码以及他总结出来的经验,我挑了一些,在这里进行总结一下。个人认为比较耗性能,平时也经常犯错的就列出来了。

达达的测试github地址

https://github.com/codyi/go-labs
  1.  对slice数据结构,如果里面存放的是结构铁,不要使用range遍历,最消耗性能。可以考虑如下写法:
    var a := make([]BigStruct, 1000)
    for i := 0; i < len(a); i++ {
        obj := a[i]
    }

     

css margin,padding的百分比的距离。。

margin,padding是设置一个dom对象距离外边距和内边距的css属性。具体作用就不在详细的说了,今天发现可以赋给这两个属性百分比的值。。那么这个百分比的值,是怎么计算的?先看下面的例子:

<style type="text/css">
    html{
        height: 100%;
        width: 1000px;
    }
    #parent{
        height: 200px;
        width: 100%;
        background: #ccc;
    }
    #test{
        padding-top: 10%;
        margin-left: 10%;
        background: red;
    }
</style>
<div id='parent'>
    <div id='test'>Hello world</div>
</div>

下面是谷歌浏览器的布局

C3AB479F-96F0-403F-9C59-45B0AE761797

 

很明显,margin-top和padding-top的值是100px 经过多次试验发现这个百分比是根据父容器的宽度计算的。

linux df 查看磁盘使用情况

df 查看系统磁盘的使用情况

常用参数:

       -a, --all  
              显示所有的文件系统

       --total
              对df结果,进行汇总,在最下面输出一行每列的总数

       -h, --human-readable
              将结果的数字转换成更加易读的格式。这个参数很好用

       -H, --si
              与-h作用,但是计算使用1000进制,而不是1024

       -i, --inodes
              显示i节点信息,而不是磁盘块

       -k     like --block-size=1K
              将空间的结果,以kb为单位显示

       -l, --local
              只显示本地文件系统

       --no-sync
              忽略 sync 命令

       -P, --portability
              输出格式为POSIX

       --sync
             在取得磁盘信息前,先执行sync命令

       -t, --type=TYPE
              只显示特定类型的文件系统。如只显示ext4的,可以用 df -t ext4 或者 df --type=ext4

       -T, --print-type
              显示文件系统的类型

       -x, --exclude-type=TYPE
              显示不是指定类型的文件系统,与-t使用相反。如想显示不是ext4类型的文件系统,可以用 df -x ext4 或者df --exclude-type=ext4
       --version 查看版本信息
       --help 获取帮助信息

更多参数使用如下命令查看:

man df
或者
df --help

例子:看磁盘占用空间,还剩多少空间。

df -lh

结果:

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G  6.8G   13G  36% /
udev            993M  4.0K  993M   1% /dev
tmpfs           201M  284K  200M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1002M     0 1002M   0% /run/shm
/dev/xvdb1       40G   33G  4.6G  88% /mnt

解释:

Filesystem:文件系统
Size:总共大小
Used:使用大小
Avail:可用
Mounted on:挂在分区

如果要查看一个文件系统的信息,可以这样写

df -h /mnt

 

amazon ubuntu vpn server

最近一直想买个VPN用,偶然间看见了亚马逊有免费的服务器可以用。时间是一年。这个可以考虑。于是开始申请亚马逊的server。然后搭建VPN SERVER。

亚马逊的服务器申请,就不在此描述了。申请了一个EC2实例。不过后来碰到了连接ssh的问题,原来一直习惯是用户名和密码的登陆方式。现在需要使用证书的方式。具体连接方式,亚马逊的官网又讲。

记得原来在阿里云的服务器上搭建一个vpn server还是蛮简单的。但是到了亚马逊这里,怎么也就不成功。后来发现,亚马逊的每台服务器只开了22端口。80端口 vpn端口,需要自己添加。具体的位置:点击左边连接 Security Groups 选择对应EC2的网络,点击下面Inbound 增加规则就可以了。注意:80端口是http类型,vpn的是tcp类型的。

注:以下操作全部是root帐户。如果不是,需要添加sudo

端口打开后,就安装pptpd

apt-get install pptpd

配置pptpd

vi /etc/pptpd.conf

添加如下信息:

localip 192.168.2.1
remoteip 192.168.2.10-100

修改ppp的配置信息

vi /etc/ppp/pptpd-options

添加如下信息

ms-dns 8.8.8.8
ms-dns 8.8.4.4

添加VPN用户名和密码

vi /etc/ppp/chap-secrets

下面信息用户名和密码设置成VPN登陆的用户名和密码就可以了。

# client        server  secret                  IP addresses
username pptpd password *

启用网络转发设置:

vi /etc/sysctl.conf

启用网络转发

net.ipv4.ip_forward=1

执行 如下命令,让网络转发立即生效

sysctl -p

在iptables规则中添加NAT。注意下面的public server ip,我写的是vpn服务器的外网IP。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ppp0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -j SNAT --to-source <Public Server IP>

重启pptpd服务

service pptpd restart

赶紧用vpn连接一下试试吧。

 

 

 

ssh 无法使用密码登陆

今天研究了一会亚马逊的EC2。官网声称一年免费试用,于是想着是不是可以搭建一个VPN呢?

马上就开始注册账号,申请服务器。发现亚马逊的EC2登陆是使用证书登陆的。那么要是用密码怎么修改呢?毕竟要是电脑不在身边,登陆服务器就不方便了。好吧,查看一下ssh怎么能够使用密码登陆。

很简单只要修改 /etc/ssh/sshd_config文件

PasswordAuthentication yes

修改完成后,重启服务。

service ssh restart

以上操作在ubuntu中进行的。账户是root账户。

php pear No releases for package 错误

最近服务器由于升级到了5.4。公司用的第三方打电话的库,出现了一些问题。由于是php5.4将一些函数放弃了。而第三方的库,却还在采用。所以决定将第三方的库升级一下。
由于很多的库,都是通过pear安装的。所以这次升级也是通过pear升级。代码如下:

sudo pear install pear/Services_Twilio-3.12.4

结果出现了以下错误:

No releases for package "twilio/Services_Twilio" exist
install failed

这个错误信息,还是很奇怪的。在去第三方提供的pear页面去查看,发现包是存在的。那为什么安装失败呢?在google大神的指导下,找到了答案:

pear clear-cache
pear update-channels

 

php call_user_func_array

call_user_func_array() 调用回掉函数,并把一个数组参数坐位回掉函数。也可以执行类中的方法。

例子:

<?php
function foobar($arg, $arg2) {
    echo __FUNCTION__, " got $arg and $arg2</br>";
}
class foo {
    static function bar($arg, $arg2) {
        echo __METHOD__, " got $arg and $arg2</br>";
    }

    function food($arg, $arg2) {
        echo __METHOD__, " got $arg and $arg2</br>";
    }
}

call_user_func_array("foobar", array("one", "two"));

$foo = new foo;
call_user_func_array(array($foo, "food"), array("three", "four"));
//这种方式是错误的
//call_user_func_array(array("foo", "food"), array("three", "four"));
//下面这种办法,通过PHP的对象的方式调用一个静态方法,并不会报错。但是静态方法中不可以出现$this关键字
call_user_func_array(array($foo, "bar"), array("three", "four"));
//个人感觉调用静态方法还是这样会好些
call_user_func_array(array("foo", "bar"), array("three", "four"));
?>

结果:

foobar got one and two
foo::food got three and four
foo::bar got three and four
foo::bar got three and four

 

 

php restore_exception_handler

restore_exception_handler ()函数恢复PHP自身的异常处理。会清除set_exception_handler中用户自定义的函数处理方式

例子:

function handleException(Exception $e)
{ 
    do{
        echo "<b>错误信息</b>:" . $e->getMessage() . "</br>";
        echo "<b>错误码</b>:" . $e->getCode() . "</br>";
        echo "<b>错误文件</b>:" . $e->getFile() . "</br>";
        echo "<b>错误行数</b>:" . $e->getLine() . "</br>";
        echo "<b>错误行数</b>:" . $e->getPrevious() . "</br>";
        echo "<b>异常追踪信息</b>:</br>";
        echo "</pre>" . print_r($e->getTrace(), true) . "</pre></br>";
        echo "***********</br>";
    } while($e = $e->getPrevious());
}

set_exception_handler("handleException");

function test($name) {
    throw new Exception("Test exception", 1000);
}

restore_exception_handler();
test("codyi");

结果:

Fatal error: Uncaught exception 'Exception' with message 'Test exception' in /Users/liguosong/work/php/Testing/test.php on line 21 Exception: Test exception in /Users/liguosong/work/php/Testing/test.php on line 21 Call Stack: 0.0002 251616 1. {main}() /Users/liguosong/work/php/Testing/test.php:0 0.0003 252240 2. test(???) /Users/liguosong/work/php/Testing/test.php:25

 

 

php Exception 详解

Exception 类是php所有异常的基类。这个类包含如下方法:

__construct — 异常构造函数
getMessage — 获取异常消息内容
getPrevious — 返回异常链中的前一个异常
getCode — 获取异常代码
getFile — 获取发生异常的程序文件名称
getLine — 获取发生异常的代码在文件中的行号
getTrace — 获取异常追踪信息
getTraceAsString — 获取字符串类型的异常追踪信息

以上方法的简介直接从PHP官网抄来的。

下面写个例子:

function handleException(Exception $e)
{ 
    do{
        echo "<b>错误信息</b>:" . $e->getMessage() . "</br>";
        echo "<b>错误码</b>:" . $e->getCode() . "</br>";
        echo "<b>错误文件</b>:" . $e->getFile() . "</br>";
        echo "<b>错误行数</b>:" . $e->getLine() . "</br>";
        echo "<b>错误行数</b>:" . $e->getPrevious() . "</br>";
        echo "<b>异常追踪信息</b>:</br>";
        echo "</pre>" . print_r($e->getTrace(), true) . "</pre></br>";
        echo "***********</br>";
    } while($e = $e->getPrevious());
}

set_exception_handler("handleException");

class MyException extends Exception {}

function test($name) {
    throw new Exception("Test exception", 1000);
}

try{
    test("codyi");
} catch (Exception $ex) {
    throw new MyException("My exception", 1001, $ex);
}

输出结果:

错误信息:My exception
错误码:1001
错误文件:/Users/liguosong/work/php/Testing/test.php
错误行数:27
错误行数:exception 'Exception' with message 'Test exception' in /Users/liguosong/work/php/Testing/test.php:21 Stack trace: #0 /Users/liguosong/work/php/Testing/test.php(25): test('codyi') #1 {main}
异常追踪信息:
Array ( ) 
***********
错误信息:Test exception
错误码:1000
错误文件:/Users/liguosong/work/php/Testing/test.php
错误行数:21
错误行数:
异常追踪信息:
Array ( [0] => Array ( [file] => /Users/liguosong/work/php/Testing/test.php [line] => 25 [function] => test [args] => Array ( [0] => codyi ) ) ) 
***********

 

php set_error_handler

set_error_handler() 设置用户自定义的错误处理函数。在程序的运行期间,通过这个函数可以将错误信息按照我们自己的函数处理。

例子:

function handleError($errno, $errstr, $errfile, $errline)
{ 
    echo "<b>Custom error:</b> [$errno] $errstr<br />";
    echo " Error on line $errline in $errfile<br />";
}

set_error_handler("handleError");

$test = 2;

if ($test>1)
{
    trigger_error("A custom error has been triggered");
}

结果:

Custom error: [1024] A custom error has been triggered
Error on line 14 in /Users/liguosong/work/php/Testing/test.php

 

php restore_error_handler

restore_error_handler()函数恢复PHP自身的错误处理程序。从下面的例子中,可以看出,当执行restore_error_handler()函数之后,我们自己定义的错误处理函数已经不在起作用了。

例子:

function handleError($errno, $errstr, $errfile, $errline)
{ 
    echo "<b>Custom error:</b> [$errno] $errstr<br />";
    echo " Error on line $errline in $errfile<br />";
}

set_error_handler("customError");

$test = 2;

if ($test>1)
{
    trigger_error("A custom error has been triggered");
}

//恢复PHP本身的错误处理。正常显示trigger信息
restore_error_handler();

if ($test > 1)
{
    trigger_error("A custom error has been triggered");
}

结果:

Custom error: [1024] A custom error has been triggered
Error on line 14 in /Users/liguosong/work/php/Testing/test.php
Notice: A custom error has been triggered in /Users/liguosong/work/php/Testing/test.php on line 22 Call Stack: 0.0096 253080 1. {main}() /Users/liguosong/work/php/Testing/test.php:0 0.0100 253952 2. trigger_error(???) /Users/liguosong/work/php/Testing/test.php:22

 

php strstr

strstr()函数返回字符串中的一部分。

strstr(string,search,
string:必须,规定被搜索的字符串
search:必须,搜索字符串
before_needle:可选,默认值是false。如果是true,从被搜索字符串往前开始截取。如果是false,从搜索字符串开始,一直到结尾

例子:

echo strstr("Hello world.", "w");

结果:

world.

例子:

echo strstr("Hello world.", "w", true);

结果:

Hello

 

)