作者归档:lgs

mac install wget

刚才想用wget下载一个文件,结果发现wget命令找不到了。去bin目录下,没有找到。记得原来用过这个命令,不知道怎么就突然没了。。那就重新安装吧。

curl -O http://ftp.gnu.org/gnu/wget/wget-1.13.4.tar.gz
tar -xzvf wget-1.13.4.tar.gz
cd wget-1.13.4
./configure --with-ssl=openssl
make
sudo make install

如果上面的文件不能下载,可以点击这个连接 wget-1.13.4.tar

PHP实现BF算法

BF算法(Brute Force)

从字符串主S中查找到字符串T的位置。每次一个字符串的对比,若相等,则继续查找后面的字符串。不相等,则从S的下一个字符串继续查找。最后找不到,则返回了-1,否则返回T在S中的开发位置。

下面是PHP的实现:

<?php
 function index($str, $reg, $startPos = 0) {
    $strArr = str_split($str);
    $regArr = str_split($reg);

    if ($startPos >= count($strArr)) {
        return -1;
    }

    $i = $startPos;
    $j = 0;

     while($i < count($strArr) && $j < count($regArr)) {
         if ($strArr[$i] == $regArr[$j]) {
             $i++;
             $j++;
         } else {
             $i = $i - $j + 1;
             $j = 0;
         }

         if ($j >= count($regArr))
         {
             return $i - count($regArr);
         }
     }

     return -1;
 }

 $str = "abdsfasjdkfl";
 $reg = "dkfl";
 print_r(index($str, $reg, 9));

 

php 快速排序

之前写冒泡,选择排序的算法。今天就抽空看看快速排序,快速排序先选择一个基数,将数组中的数据分别与这个基数对比。小于基数的放在一组,大于基数的放在一组。最后在递归对这两个数组继续排序。最后merge返回就是排序好的数据了。

function quick_sort(array $arr) {
    $length = count($arr);

    if ($length <= 1) return $arr;

    $leftArr = $rightArr = array();
    $baseValue = $arr[0];

    for ($i = 1; $i <= $length - 1; $i++) {
        if ($arr[$i] <= $baseValue)
            $leftArr[] = $arr[$i];
        else
            $rightArr[] = $arr[$i];
    }

    return array_merge(quick_sort($leftArr), array($baseValue), quick_sort($rightArr));
}

print_r(quick_sort(array(1,5,3,6,7,2)));

 

 

php Invalid photo dimension

刚才线上的项目,图片旋转的功能,不能使用了。奇怪的是这功能,很久没有变动了。突然就失灵了。后来在本地服务器上测试,正常使用。估计很有可能跟服务器的配置有关。于是把服务器的log下载下来,看了看。硬盘满载了。。原因是因为getimagesize的函数报了一个warning:Invalid photo dimension。估计这个方法,在计算图片的高宽的时候,将远程服务器的地址下载下来了。本地没有空间造成的。

list($width, $height) = getimagesize($url);

 

php二分查找

二分查找法,每次查找的数据,都是上一次的一半。所以速度很快。不过需要建立在已经排序好的数组上。

<?php
function binarySearch(array $arr, $target) {
    $low = 0;
    $max = count($arr) - 1;

    while($low <= $max) {
        $mid = (int)(($max + $low) / 2);

        if ($arr[$mid] > $target) $max = $mid - 1;

        if ($arr[$mid] < $target) $low = $mid + 1;

        if ($arr[$mid] == $target) return $mid;
    }

    return false;
}

echo binarySearch(array(1,2,3,4,5,6,7,8,9,10), 3);

 

php 选择排序

选择排序的算法也很简单。第二层循环,每次就是找出最小的数,然后交换。很简单,但是效率不是很高。

function select_sort(array $arr) {
    $length = count($arr);

    if ($length <= 1) {
        return $arr;
    }

    for ($i = 0; $i < $length; $i++) {      
        for ($j = $i; $j < $length; $j++) {
            if ($arr[$i] > $arr[$j]) {
                $tmp = $arr[$i];
                $arr[$i] = $arr[$j];
                $arr[$j] = $tmp;
            }
        }
    }

    return $arr;
}

$arr = array(1,4,6,2,100,10,9);
print_r(select_sort($arr));

 

PHP冒泡排序

网上关于冒泡的排序的算法,已经很多了。这个算法也很简单。下面是两种冒泡的方式,一个是每次筛选出最大的数,放到最后面。一个是每次找到最小的数,放到最前面。

<?php
$arr = array(10,6,3,8,1,9,33,22,0,-1);

function bubble_sort_one(array $arr) {
    $length = count($arr);

    if ($length <= 1) {
        return $arr;
    }

    for ($i = 0; $i < $length - 1; $i++) {
        for ($j = 0; $j < $length - 1 - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j + 1] = $tmp;
            }
        }
    }

    return $arr;
}

function bubble_sort_two(array $arr) {
    $length = count($arr);

    if ($length <= 1) {
        return $arr;
    }

    for ($i = 0; $i < $length - 1; $i++) {
        for ($j = $length - 1; $j > $i; $j--) {
            if ($arr[$j] < $arr[$j - 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j - 1];
                $arr[$j - 1] = $tmp;
            }
        }
    }

    return $arr;
}

print_r(bubble_sort_one($arr));
echo "<br/>";
print_r(bubble_sort_two($arr));

 

php ${} 可变变量

记得之前看过这样的php变量写法:

$hello = "Hello world";
$test = "hello";

echo $$test;

结果输出的Hello world。今天又发现,这样可以做到:

$hello = "Hello world";
$test = "hello";

echo ${$test};

${} 大括号中间的字符串,再加上外面的$,就变成$hello变量了。。

后来又查了查资料,这叫可变变量。

升级mac系统到Yosemite,太坑了。。。

刚刚把mac系统升级了。开机之后,发现本地站点都不能访问了,以为是hosts问题,查看hosts文件,里面添加的站点都存在。然后查看一下apache,重启了apache。能够访问了。却奇怪的发现,站点都返回了Its work。晕。。

难倒我添加的那些站点配置文件不存在了?经查看,配置文件存在。那是哪里除了问题?应该是这些站点配置,没有起作用。

去看apache的配置文件。还真是这个问题。我估计是mac系统升级,导致apache的配置文件重置了。随后发现,很多配置文件全部都失效了。php的配置文件也不能用了。。

唉,系统不能随便升级啊。

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