摘要: 整理摘抄了手册中关于PHP模式修正符的内容,真切的体会到手册的好处阅读全文
posted @ 2012-02-04 11:42 Cocowool 阅读(57) 评论(0) 编辑
很多IT公司都会给员工申请VPN,方便大家不在公司的时候访问公司的网络资源。同样是使用SecurID卡,之前的东家使用的PPTP的方式,当时买了Mac之后,很轻松的就能够配置VPN的连接。现在换了东家,他们使用的是Cisco IPSec的方式进行的VPN连接,配置的时候花了一点功夫,相信很多朋友都有配置VPN的问题,记下来供有需要朋友使用。

VPN知识科普

关于VPN,我之前的理解为就是通过一个加密可靠的信道访问一个对公网不可见的网络资源。看了下百度百科才了解VPN的隧道协议主要有三种:PPTP、L2TP和IPSec。其中PPTP和L2TP协议工作在OSI模型的二层,IPSec是第三层隧道协议,也是最常用的协议。L2TP和IPSec配合使用是目前性能最好,应用最广泛的一种,只是可惜还没有遇到过这样的VPN。

Mac下的VPN连接的创建

不得不说Mac下VPN连接的创建和管理非常方便、简单。记得之前在Fedora下为了配置一个能够使用PPTP的VPN连接,费了九牛二虎之力,Mac下,很轻松的就搞定了。言归正传,首先进入Mac的“网络配置” Network Preferences。可以通过状态栏的网络图表进入,也可以从系统配置中选择网络 Network进入,如下图:



进入网络后,看到列表下方有个加减号,用来添加和删除网络连接。



点击加号后可以创建一个新的连接,选择VPN,VPN下有三种类型,分别是:PPTP、Cisco IPSec、L2TP Over IPSec。可以根据自己的情况选择适用的类型,并且可以为每一个连接起一个名字,方便记忆。

下面就是具体每种类型的配置方法:

1、使用PPTP的方式

PPTP的连接方式比较简单,界面如下图:



其中服务器地址 Server Address这一栏填写从公司网管那里获得的VPN地址
用户名 Account Name 这一栏填写自己的用户名
因为是动态密码,所以每次连接的时候会提示输入密码,配置界面就没有密码的输入框了。

配制完成后点击状态栏的VPN连接图标,会弹出输入密码的对话框。



验证成功后,就可以在状态栏看到VPN的连接了,会显示连接的时长。

2、使用Cisco IPSec方式

适用Cisco IPSec的方式创建过程和PPTP大同小异,也是在网络配置面板中点击加号进行创建。在配置的时候与PPTP有些不同,先看截图:



在服务器地址 Server Address中填写公司VPN的地址;
在用户名 Account Name 中填写用户名;
在密码 Password 这一栏中留空,因为每次需要输入SecurID的动态密码;
然后点击授权设置 Authentication Settings 
在 共享密钥 Shared Secret 中填入从公司网管那里得到的共享密钥();
在 组名 Group Name 中填写 自己VPN所属的组名;

关于共享密钥,有些公司会以明文的形式告知,有的会用PGP的方式发送一个加密的密码,需要使用自己的私钥解密后使用。这个过程大多数都会有文档说明,这里就不过多阐述了。流程也可以参考之前的一篇文章:

SecurID卡小贴士:SecurID卡坚固小巧,用起来也很方便,只是千万要小心别丢失了,因为可以是要花大洋赔偿的。

参考资料:
posted @ 2012-01-17 18:27 Cocowool 阅读(125) 评论(0) 编辑

短链接就不说了,大家已经都清楚了,如下所示就是短链接:

新浪微博     http://t.cn/SVpONM

腾讯微博     http://url.cn/302yor

Yun.io         http://d.yun.io/PNri2v

短链接的好处:1、内容需要;2、用户友好;3、便于管理。

如何实现呢,大概有三个步骤:

1、定义一个URL映射算法,可以将长的URL映射成短字符串;

2、使用一个存储(数据库?NoSQL?)来存储完成的映射;

3、实现自己的URL映射算法;

一般来说,第三步是我们比较头疼的,如何将一个长的URL字符串,映射成一个较短的字符串呢。我总结了三种办法:

普通实现

我想以前大家学习过十进制和二进制的互相转换,或者十进制和十六进制的互相转换,那么为了更短,我们可以使用62进制,对于一个数字ID进行转码,转换成一个短字符串。

这种做法的缺点是没有办法保证所有链接都是固定的位数的长度,而且在高并发的情况下,如何保证能够快速分发是个问题。

具体实现方法:

    /**
     * 利用62进制对数字ID进行短链接编码,缺点不能保证每个短链接是固定长度
     *
     * @author  wanshiqiang<wangshiqiang@360.cn>
     * @param integer $integer
     * @param string $base
     */
    private function getShortenedURLFromID ($integer, $base = ALLOWED_CHARS)
    {  
        $length = strlen($base);
        while($integer > $length - 1)
        {  
            $out = $base[fmod($integer, $length)] . $out;
            $integer = floor( $integer / $length );
        }  
        return $base[$integer] . $out;
    }  
    /**
     * 对62进制编码的短链接进行解码
     *
     * @author  wangshiqiang<wangshiqiang@360.cn>
     * @param string $string
     * @param string $base
     */
    private function getIDFromShortenedURL ($string, $base = ALLOWED_CHARS)
    {  
        $length = strlen($base);
        $size = strlen($string) - 1;
        $string = str_split($string);
        $out = strpos($base, array_pop($string));
        foreach($string as $i => $char)
        {  
            $out += strpos($base, $char) * pow($length, $size - $i);
        }  
        return $out;
    }

文艺实现

算法描述:使用6个字符来表示短链接,我们使用ASCII字符中的'a'-'z','0'-'5',共计32个字符做为集合。每个字符有32种状态,六个字符就可以表示32^6(1073741824),那么如何得到这六个字符,描述如下:

对传入的长URL进行Md5,得到一个32位的字符串,这个字符串变化很多,是16的32次方,基本上可以保证唯一性。将这32位分成四份,每一份8个字符,这时机率变成了16的8次方,是4294967296,这个数字碰撞的机率也比较小啦,关键是后面的一次处理。我们将这个8位的字符认为是16进制整数,也就是1*('0x'.$val),然后取0-30位,每5个一组,算出他的整数值,然后映射到我们准备的32个字符中,最后就能够得到一个6位的短链接地址。

PHP实现如下:

function shorten( $long_url )
{
     $base32 = "abcdefghijklmnopqrstuvwxyz012345";
     $hex = md5( $long_url );
     $hexLen = strlen( $hex );
     $subHexLen = $hexLen / 8;
     $output = array();
     for( $i = 0; $i < $subHexLen; $i++ )
     {
          $subHex = substr( $hex, $i * 8, 8 );
          $subHex = 0x3FFFFFFF & ( 1 * ('0x' . $subHex ) );

    $out = ''; 

          for( $j = 0; $j < 6; $j++ )
          {
               $val = 0x0000001F & $int;
               $out .= $base32[$val];
               $int = $int >> 5;
          }
          $output[] = $out;
     }
     return $output;
}

二逼实现

下面这个函数使用了纯随机的方式来生成一个短链接,虽然我们可以通过查询操作来确保不重复使用短链接,可是... 这样真的靠谱吗~~

function random($length, $pool = '') {
     $random = '';
     if (empty($pool)) { $pool    = 'abcdefghkmnpqrstuvwxyz'; $pool   .=
     '23456789'; }
     srand ((double)microtime()*1000000);
     for($i = 0; $i < $length; $i++) { $random .=
     substr($pool,(rand()%(strlen ($pool))), 1); }
     return $random;
}

Technorati 标签: ,,,

参考资料:

1、微博短地址原理解析

2、微博短域名原理及作用

3、Yours.org

4、Free PHP URL Shorten script that kicks ass

5、PHP Short Url Algorithm Implementation

6、Implement your own short URL

7、短网址算法初步汇总

8、Short Url 实现方式

posted @ 2011-12-29 13:10 Cocowool 阅读(1911) 评论(9) 编辑

通过本节的学习,可以掌握如何在单节点上使用Hadoop进行Map/Reduce以及HDFS存储的实现。

环境要求:

支持的平台:

     支持GNU/Linux平台,可以作为测试和生产环境使用。Hadoop在2000个节点的生产环境中经受过考验。

     支持Win32平台作为测试环境,正式环境的测试还不够充分,所以发布版暂时不能支持Win32环境。

需要的软件:

     1、Java 1.6.x,必须。

     2、ssh、sshd,必须。

     如果是在Windows环境下,你也许需要 Cygwin。

安装必要的软件

     如果服务器没有必要的软件,就必须进行安装。不同的发行版本,有不同的安装方法。例如Ubuntu下:

     $ sudo apt-get install ssh

     $ sudo apt-get install rsync

下载Hadoop

     从 这里 下载一个Hadoop的稳定版本。

开始我们的Hadoop之旅

     解压下载的软件,在解压后的目录中,编辑 conf/hadoop-env.sh 脚本设置服务器的JAVA_HOME目录。

     我的环境是 Centos6.0,yum安装了OPEN-JDK,对应的目录为:

          /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/

     执行 bin/hadoop 命令,如果如下图所示,我们就做好使用 Hadoop 的准备了。

Image(1)

     可以用三种方式使用Hadoop:

          本地模式(Local Standalone Mode);

          伪分布式模式(Pseudo-Distributed Mode);

          完全分布式模式;

本地模式

     默认情况下,Hadoop是配置为本地运行的,以一个单独的Java进程运行,这种方式非常适合Debug。

     在本地,我选择了对 194Mb 的访问日志进行分析,如下代码:

         bin/hadoop jar hadoop-examples-0.20.203.0.jar grep input/ output/ 'favicon[a-z.]+'

     这个任务是分析日志中出现的favicon的次数,统计结果如下:

Image(2)

     其中part文件中存储了我要查找的favicon字符串出现的次数。

伪分布式模式

配置:

     参照官方的配置进行,分别对conf/core-site.xml、conf/hdf-site.xml、conf/mapred-site.xml进行配置。配置的内容都比较类似,主要是配置一个服务器的主机名,然后配置对应的IP或值。

设置无需密码的SSH:

     按照官方的设置

     $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

     $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

     但是第一次登陆的时候始终需要提示是否保存,这个有点不得其解。

执行:

     首先格式化一个新的分布式文件系统

     $ bin/hadoop namenode -format

     完成后,会有一些提示,根据提示可以在 /tmp/hadoop-root/dfs 中找到两个文件夹。

     然后启动 Hadoop 的守护进程

     $ bin/start-all.sh

我在安装的过程中提示了未知的jvm参数,但是并没有重大的影响,启动仍正常结束了,不知道什么原因

     这个问题是因为用root用户启动造成的,可以参考参考资料6中的方法,为hadoop这个文件打一个patch就可以解决。然后重新格式化namenode,进行测试。

      bin/hadoop jar hadoop-examples-0.20.203.0.jar grep logs output 'favicon'    

     执行上面的语句,可以对日志进行 WordCount 的分析。

     测试完成后,可以关闭所有的服务

bin/stop-all.sh

参考资料:

1、Single Node Setup

2、Hdfs Shell Handbook

3、Hdfs error:could only be replicated to 0 nodes instead of 1

4、Hadoop:Could not create Java Virtual Machine

5、Namenode not starting

6、Faile to start datanode while start-dfs.sh is executed by root user

posted @ 2011-12-20 12:53 Cocowool 阅读(1383) 评论(5) 编辑

Virtualbox现在更新到了4.1.6版本,我记得在之前的版本中,镜像的克隆只能通过命令行的方式来进行,现在已经可以通过界面来进行克隆了,可以说非常的方便。

克隆的时候,我选择了Reinitialize the MAC address of all the network cards。

开机启动之后,发现找不到网卡,无论netwok restart还是reboot都是无效,报错如下。

     Device eth0 does not seem to be present, delayinitialization.

使用参考资料中的 mv /etc/udev/rules.d/70-persistent-net.rules ~ 重启也没有用。

然后定睛看了一下这个文件的内容,发现 NAME 的地方配置的有问题,而且克隆后的机器,网卡配置中的MAC地址没有对应的更新,需要手工修改下。

Image

一切完成后,重新启动服务器,网卡正常工作,OK!

参考资料:

1、Virtualbox克隆

2、VMWare克隆或复制虚拟机后找不到网卡的解决方法

3、udev - Linux Man Page

posted @ 2011-12-14 11:31 Cocowool 阅读(494) 评论(0) 编辑
摘要: Centos 6.0版本提供了一个"最小化"(Minimal)安装的选项。这是一个非常好的改进,因为系统中再也不会存在那些不必要的文件和服务,这样我们就可以实现服务器为我们所需要的服务提供最大的资源能力。Minimal的安装也带来了一些缺点,系统默认提供的网络管理工具 NetworkManager 实际上没有安装在 Minimal 的系统上。这样我们就不得不手工编辑网卡的配置文件。典型的网卡配置文件(/etc/sysconfig/network-script/ifcfg-X)格式如下: IPADDR=192.168.0.33 BOOTPROTO=none NETMA...阅读全文
posted @ 2011-12-08 14:02 Cocowool 阅读(234) 评论(0) 编辑
摘要: 什么是Daemon进程这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,啰里啰唆地提一些忠告,时不时倒霉地撞在柱子上,有时候还会想出一些小小的花招,把主人公从敌人手中救出来,正因如此,daemon有时也被译作"守护神"。所以,daemon进程在国内也有两种译法,有些人译作"精灵进程",有些人译作"守护进程",这两种称呼的出现频率都很高。与真正的daemon相似,daemon进程也习惯于把自己隐藏在人们的视线之外,默默阅读全文
posted @ 2011-12-04 15:48 Cocowool 阅读(1434) 评论(1) 编辑
摘要: Gearman作为一个优秀的分布式解决方案,已经被众多的公司或者团队所采用,我在之前的一篇文章中也有过介绍。但是目前对于woker的执行状态和结果监控,特别是放入后台的worker的监控,官方还没有完善的解决方法。最近,为团队内部做了一次分享,我也得以深入的研究了 Gearmand。阅读全文
posted @ 2011-12-04 14:35 Cocowool 阅读(190) 评论(0) 编辑
摘要: 我和火星人也很好奇如何能够更安全的传输邮件,所以决定试一试。他的环境是 Linux Ubuntu ,我的环境是 Mac OS X Lion。GnuPG全称GNU PrivacyGuard,它是基于公钥/私钥体系的加密工具PGP(Pretty Good Privacy)的开源版本它遵循OpenPGP标准。你可以免费使用,自由传播,并可以获得它的源代码。可以用于对Email、文件及其他数据的加密与验证,确保通信数据的保密性、完整性和真实性。PGP原理及规则PGP使用双密匙来加密数据。每个使用PGP加密技术的人都要创建一对密匙,一个叫做公匙,另一个叫做私匙。公匙可被广泛传播,你可以贴在自己的网页上或阅读全文
posted @ 2011-11-14 22:37 Cocowool 阅读(93) 评论(0) 编辑
摘要: 在使用PHP进行开发时,经常遇到文件上传的场景。其中会隐藏很多我们平时注意不到的安全问题,我总结了一下,主要有几个方面:1、检查用户传来的文件名,避免 ../etc/passwd 这样的探测2、有些应用使用了用户名做为路径名,那么也需要对用户名进行详细的检查3、有些人提到了文件上传的Dos攻击,这个我觉得主要是依靠网络层面去解决,禁掉频繁访问的IP,但是对于僵尸网络的攻击,貌似没什么好的办法下面这篇文章中介绍的内容有些老,因为现在已经不是PHP3和PHP4的那个时代,虽然如此,关于文件上传中的安全处理,我们还是需要多加注意。正常的表单没有提供文件上传的功能,所以在 RFC 1867 中提出了《阅读全文
posted @ 2011-11-10 23:31 Cocowool 阅读(120) 评论(0) 编辑