Iptables usages
Wed, 20 Nov 2013 12:45:53 +0800
iptables -I INPUT -s 111.111.111.0/24 -j DROP
iptables will drop the packets from 111.111.111.0-111.111.111.255


Chain options
the options list below:
-A / --append 
add a rule to chain.
e.g 
iptables -A INPUT ... append a rule to INPUT chain.

-D / --delete 
delete a rule from chain
e.g
iptables -D INPUT 1 ... delete a rule which indicated by 1 from INPUT chain.

-R / --replace 
replace a rule in chain
e.g
iptables -R INPUT 1
iptables -R INPUT 1 -s 192.168.1.100 --dport 80 -j DROP

-I / --insert
insert a rule to chain
e.g
iptables -I INPUT -s 1.2.3.4 -j DROP

-L / --list
show current rule list in chain
e.g
iptables -L INPUT

-F / --flush
delete all rules in a chain
iptables -F INPUT

-Z / --zero
reset the packet counter
e.g iptables -Z INPUT

-N / --new-chain
create a chain
e.g iptables -N allowed

-X / --delete-chain
delete a chain
e.g iptables -X allowed

-P / --policy
define the rule policy. That means, the packets which unmatched the rule will do this rule.
e.g iptables -P INPUT DROP

-E / --rename-chain
rename a chain
e.g. iptables -E allowed disallowed

Packet options:
-p / --protocol
Indicate the protocol
e.g
iptables -A INPUT -p tcp
It can use operator, such as !, e.g iptables -A INPUT -p ! tcp, meaning that all protocol but TCP.

-s / --src / --source / -d / --dst / --distination
Indicate the source/distination packets
e.g iptables -A INPUT -s 1.2.3.0/24

-i / --in-interface / -o / --out-interface
Indicate which interface to match on.
e.g iptables -A INPUT -i eth0

--sport / --source-port / --dport / --distination-port
Indicate which port to match on.
e.g iptables -A INPUT -p tcp --dport 80

--tcp-flags
Match the packet's TCP flag
e.g iptables -A INPUT --tcp-flags SYN,ACK,FIN
flag values: SYN, ACK, FIN, RST, URG, PSH

Operation options:
-j operator, values: 
ACCEPT,REJECT,DROP,REDIRECT,MASQUERADE,LOG,DNAT,SNAT,MIRROR,QUEUE,RETURN,MARK

We use following ways to set the default policy:

1) Accept all packets first, then prevent the danger.
#iptables -P INPUT ACCEPT
#iptables -P OUTPUT ACCEPT
#iptables -P FORWARD ACCEPT

2) Reject all packets first, then accept the requisite.
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP

Frequently used:

Open 80 port:
# iptables -A INPUT -p tcp -dport 80 -j ACCEPT
# iptables -A OUTPUT -p tcp -sport 80 -j ACCEPT

Prevent SyncFlood:
# iptables -A FORWARD -p tcp -syn -m limit -limit 1/s -j ACCEPT

Prevent scanning:
# iptables -A FORWARD -p tcp -tcp-flags SYN,ACK,FIN,RST RST -m limit -limit 1/s -j ACCEPT

Prevent Ping of death:
# iptables -A FORWARD -p icmp -icmp-type echo-request -m limit -limit 1/s -j ACCEPT


More »
Show coding system currently in emacs
Mon, 30 Sep 2013 01:55:02 +0800
C-x RET r utf-8-unix

More »
DEDECMS安全
Sun, 07 Apr 2013 19:23:18 +0800
为了提高DEDECMS的安全,照着DEDECMS官方的设置仍然有被非法上传。
这个,通过NGINX来更好点,看DEDECMS的设置有点头晕。

在配置文件加入以下设置,把除了后台外的有PHP文件的地方都关了。当然了,默认管理DEDE文件夹得改成另外的名字。

location ~ ^/(data|install|include|member|a|special) {
    return 404;
}

More »
SSL certificates inside
Tue, 01 Jan 2013 10:32:25 +0800
SSL certificate have installed on lewphee.com yesterday.

Thanks to StartSSL
More »
lewphee.com is about to close the comments.
Sat, 11 Aug 2012 23:21:45 +0800
Yes, for anti-spam, i will close the comment.

Your patience and understanding is greatly appreciated.
More »
Using SSL to improve the security of SSH login
Sat, 11 Aug 2012 22:55:46 +0800
I can find out many alerts from system log that there're somebody attempt to try the password of server's root user in the past few months. Therefore, use the SSL certification in SSH is neccessary.

1. Generate the RSA Public Key and Private Key
ssh-keygen -t rsa

then to generate the RSA Pair Key(Public & Private)

2. Rename the Public Key.
SSH use the Public Key File named authorized_keys(in sshd_config), so,
mv id_rsa.pub authorized_keys
or configured in sshd_config

3. sshd_config
Protocol 2
ServerKeyBits 1024

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

PasswordAuthentication no
PermitEmptyPasswords no

4. Restart SSH Service

5. Dwnload the Private Key
Download the Private Key to local and delete it.

6. Putty Client.
   1) Transform the SSH Private Key into Putty(ppk)
       use puttygen to rebuild the local private key.

   2) Configure the Session use SSL certification.
More »
The Perl scripts occur 'No such file or directory' error on Unix
Tue, 17 Jul 2012 02:36:27 +0800
Please check the coding system of the file whether is a WINDOWS-DOS style, if it is, revert to Unix system resolve it.

In Emacs, use the following command to revert the buffer's coding system:
C-x RET r
More »
Perl require syscall.ph
Sun, 15 Jul 2012 18:01:16 +0800
There is need the syscall.ph at last post's Perl script, but sometimes the Perl is not available for this.

We build it manually.
cd /usr/include
h2ph -r -l .

It's done.

More »
FastCGI-Wrapper.pl sources
Sun, 15 Jul 2012 17:54:20 +0800
#!/usr/bin/perl

use FCGI;
use Socket;
use POSIX qw(setsid);

require 'sys/syscall.ph';

&daemonize;

#this keeps the program alive or something after exec'ing perl scripts
END() { } BEGIN() { }
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=".shift()."\n"; };
eval q{exit};
if ($@) {
    exit unless $@ =~ /^fakeexit/;
};

&main;

sub daemonize() {
    chdir '/'                 or die "Can't chdir to /: $!";
    defined(my $pid = fork)   or die "Can't fork: $!";
    exit if $pid;
    setsid                    or die "Can't start a new session: $!";
    umask 0;
}

sub main {
        $socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 ); #use IP sockets
        $request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket );
        if ($request) { request_loop()};
            FCGI::CloseSocket( $socket );
}

sub request_loop {
        while( $request->Accept() >= 0 ) {

           #processing any STDIN input from WebServer (for CGI-POST actions)
           $stdin_passthrough ='';
           $req_len = 0 + $req_params{'CONTENT_LENGTH'};
           if (($req_params{'REQUEST_METHOD'} eq 'POST') && ($req_len != 0) ){
                my $bytes_read = 0;
                while ($bytes_read < $req_len) {
                        my $data = '';
                        my $bytes = read(STDIN, $data, ($req_len - $bytes_read));
                        last if ($bytes == 0 || !defined($bytes));
                        $stdin_passthrough .= $data;
                        $bytes_read += $bytes;
                }
            }

            #running the cgi app
            if ( (-x $req_params{SCRIPT_FILENAME}) &&  #can I execute this?
                 (-s $req_params{SCRIPT_FILENAME}) &&  #Is this file empty?
                 (-r $req_params{SCRIPT_FILENAME})     #can I read this file?
            ){
        pipe(CHILD_RD, PARENT_WR);
        my $pid = open(KID_TO_READ, "-|");
        unless(defined($pid)) {
            print("Content-type: text/plain\r\n\r\n");
                        print "Error: CGI app returned no output - ";
                        print "Executing $req_params{SCRIPT_FILENAME} failed !\n";
            next;
        }
        if ($pid > 0) {
            close(CHILD_RD);
            print PARENT_WR $stdin_passthrough;
            close(PARENT_WR);

            while(my $s = <KID_TO_READ>) { print $s; }
            close KID_TO_READ;
            waitpid($pid, 0);
        } else {
                    foreach $key ( keys %req_params){
                       $ENV{$key} = $req_params{$key};
                    }
                    # cd to the script's local directory
                    if ($req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/) {
                            chdir $1;
                    }

            close(PARENT_WR);
            close(STDIN);
            #fcntl(CHILD_RD, F_DUPFD, 0);
            syscall(&SYS_dup2, fileno(CHILD_RD), 0);
            #open(STDIN, "<&CHILD_RD");
            exec($req_params{SCRIPT_FILENAME});
            die("exec failed");
        }
            }
            else {
                print("Content-type: text/plain\r\n\r\n");
                print "Error: No such CGI app - $req_params{SCRIPT_FILENAME} may not ";
                print "exist or is not executable by this process.\n";
            }

        }
}
More »
Emacs Tips(4) -- Find & Replace Text
Sun, 01 Jul 2012 11:45:52 +0800
1. Find
C-s  find forward
C-r find backward

2. Replace
M - %
then type the words to be replaced & replace.
and, y is confirm the current one to replace.
n is not replaced and highlight the next one,
q is quit the search process,
! is replace all.
More »
Emacs Tips(3)
Mon, 18 Jun 2012 05:02:17 +0800
Open & edit utf-8 file
If u open a utf-8 file which have the i18n chars within it, sometimes emacs can't process correctly, u can use the following command to revert buffer's coding system:
revert-buffer-coding-system
type: MX RET, CMD
or: CX RET r

revert the file(buffer) to utf-8 for saving:
CX RET f, 
the type the coding system of utf-8, like utf-8-unix or utf-8-dos


More »
Emacs Tips(2)
Wed, 06 Jun 2012 23:52:22 +0800
Emacs's tab:
setq tab-width 8
      indent-tabs-mode t
      c-basic-offset 8)

Close the bell:
(setq visible-bell t)

The pairs mode:
(setq show-paren-mode t)

and not jump the cursor:
(setq show-paren-style 'parenthesis)

Display the buffer path on titlebar
(setq frame-title-format "emacs@%f")

Use the following auto load mode:
(autoload 'php-mode "php-mode" "Major mode for editing php code." t)
(add-to-list 'auto-mode-alist '("\\.php$" . php-mode))
More »
Recompile PHP with SOAP support.
Wed, 28 Mar 2012 06:44:17 +0800
cd /data/tools/php-5.3.8/ext/soap
/usr/local/php5/bin/phpize
./configure --with-php-config=/usr/local/php5/bin/php-config --enable-soap
make
make install

Then, add extension="soap.so" to your php.ini.
More »
VPS被植入用于攻击其它机器的DDOS代码
Fri, 23 Dec 2011 02:19:15 +0800
上星期Linode的流量警报不断响起,全月200G的流量已经用了180G。我疑惑呢,不放什么站啊,平时一个月都只用几G的流量,这是怎么回事。

于是查看Linode的数据图表,发现都是一段时间一段时间的高网络流量。初始怀疑是搜索引挚可能搜到了服务器内的一些MP3的文件,导致流量大增。遂删除MP3及其它大文件(因为发现瞬时输出有29Mb/s)。

第二天,警报仍然,流量升到192G,还有8G......一看,哇靠,才月中啊,这样下去,我这个月肯定要支付超额的流量费......

再装上awstats查看是哪个文件流量那么高,第三天,看awstats,无文件记录......此时仍没想到被植入。此时196G......还有4G流量,毛的,才20号啊......

想想看哪个文件刚好是在流量高的时候被读取,于是 find查找最近被读取的文件,发现可疑文件(正是被植入的用于攻击其它机器的程序)。

至此明白了,马上down下来,留作分析,并rm之。现在好了,流量不那么变态地升了。4G可以够到我月底了,哈哈哈


P.S: 正是dedecms的上传漏洞引发。现在,我正全力开发自己的Publishing Platform,准备把dede扔了
More »
Loading system variables into Emacs
Tue, 28 Jun 2011 04:41:17 +0800
In order to compile program sources inside Emacs, i use Emacs's shell to do these.
M-x shell

But, the original shell is so weak to do these, there was message 'command not found' when i run 'make' etc. However, i have installed them before.

The reason is Emacs shell have not imported the variables of system's.
(setenv "PATH" (concat "d:/emacs/bin;" (getenv "PATH")))

It'll import all of them into Emacs.
More »
Emacs Tips (1)
Mon, 27 Jun 2011 23:09:03 +0800
1. Insert a C-style comment.
[CODE style="lisp"]
(defun ccm()
 "insert a C-style comment at current position"
 (interactive)
 (insert "/**
* Copyright(C)2011 Vencs corporation. All rights reserved.
*/")
)
[/CODE]

with this skill, can insert current date time like following:
(insert (format-time-string "%Y/%m/%d"))

To run above function, use M-x function.

2. Cursor type
[CODE type="lisp"]
(set-default `cursor-type `bar)
[/CODE]

More »
Install Subversion on FreeBSD
Sun, 26 Jun 2011 15:02:25 +0800
It's necessary to install a source manage system to sort out my sources, so i choose Subversion.
My enviroment is FreeBSD 8.2.

[CODE type="shell"]
cd /usr/ports/develop/subversion
make install clean
[/CODE]

Install completely.

Now i need to configure it.

1) Configure it run automatically
add the following to /etc/inetd.conf
[CODE type="shell"]svn stream tcp nowait root /usr/local/bin/svnserve svnserve -i -r /data/svn/repos1[/CODE]

add the following to /etc/rc.conf
[CODE type="shell"]inetd_enable="YES"[/CODE]


2) Create A Repository
[CODE type="shell"]svnadmin create /data/svn/repos1[/CODE]

We create a repository for store the projects..


That's over, the installation guild end with here. Next, we can use Subversion to control the sources' version.
More »
Configure Emacs on Windows
Sun, 19 Jun 2011 19:47:45 +0800
Enviroment: W7 x64

First, we download the Emacs windows version from http://www.gnu.org/software/emacs/

unzip the file to any folder u want, i unzip it to D: driver. The full path is D:\emacs-23.3

The running configure file .emacs dosen't exist when u first run emacs. This file is locate in C:/[USERHOME]/AppData/Roaming

If you can't create file .emacs, see following or use file name _emacs.
emacs-1.jpg

emacs-2.jpg

OK, the .emacs(_emacs) file is created, the next is configure the running enviroment.

1. Load another configure file
I do not like the default .emacs location, so i need load my own configure file from another path. The Emacs command load can do this. For example:
(load "f:/conf/emacs.conf")

2.My Emacs's options:

;;Full scree after start-up
(defun jbr-init ()
  "Called from term-setup-hook after the default
terminal setup is
done or directly from startup if term-setup-hook not
used.  The value
0xF030 is the command for maximizing a window."
  (interactive)
  (w32-send-sys-command #xf030)
;;  (ecb-redraw-layout)
;;  (calendar)
)
;;(setq term-setup-hook 'jbr-init)
(setq window-setup-hook 'jbr-init)

;;no default guide page.
(setq inhibit-splash-screen t)

;;disabling auto-save and backups
(setq backup-inhibited t)
(setq auto-save-default nil)

;;line number
(global-linum-mode 1)

;;no toolbar and menubar
(tool-bar-mode -1)
(menu-bar-mode -1)

3.Add the shortcut to the menu, like "Edit with..."
Create A .reg file, contains

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\emacs]
@="&Edit with Emacs"
[HKEY_CLASSES_ROOT\*\shell\emacs\command]
@="D:\\emacs-23.3\\bin\\runemacs.exe \"%1\""

then import the regedit file.
More »
Using Emacs to translate the encoding of document
Sat, 18 Jun 2011 11:47:52 +0800
I often need to translate the encoding of document to utf8, so can use the following command to translate the current document:
C-x C-m f utf-8-unix RET
More »
X-UA-Compatible 无效
Fri, 20 May 2011 16:54:43 +0800
近做个网站的项目中,遇到X-UA-Compatible无效的问题。
经测试,X-UA-Compatible只有在前面也有meta的时候,才有效。
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
这是给IE8看的,以兼容(IE7)模式呈现网页。
More »
Nginx SSL配置
Fri, 07 Jan 2011 11:23:46 +0800

我之前写过一篇 Apache的SSL配置 ,现在记录一下Nginx下的SSL配置。

首先生成ca和pem

 

生成RSA密钥
websrv# openssl dsaparam -rand -genkey -out rsa.key 1024

生成CA密钥:(要记得,重启Nginx的时候要用)
websrv# openssl gendsa -des3 -out ca.key rsa.key
Generating DSA key, 1024 bits
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

用这个CA密钥来创建ROOT证书(当然也可以用来颁发证书):
websrv# openssl req -new -x509 -days 365 -key ca.key -out ca.pem
Enter pass phrase for ca.key:     #输入上一步的密码
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:GuangXi
Locality Name (eg, city) [Newbury]:Nanning
Organization Name (eg, company) [My Company Ltd]:Vencs Corporation
Organizational Unit Name (eg, section) []:CoreTeam
Common Name (eg, your name or your server's hostname) []:ssl.lewphee.com   #跟https的域名保持一致
Email Address []:test@test.com

下一步,Nginx方面的配置

    server {
        listen       443;
        server_name  localhost;

        ssl                  on;
        ssl_certificate      ca.pem;
        ssl_certificate_key  ca.key;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;
        error_page 497 "https://$host$uri?$args"; #这是跳转HTTP请求到HTTPS的

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

More »
结束多个进程
Tue, 28 Dec 2010 17:03:35 +0800
利用管道結束多個進程。命令太長,不得不記下:
比如,結束所有php-cgi進程:
ps aux|grep php-cgi|grep -v grep|cut -c 9-15|xargs kill -9

ps aux:列出所有進程
grep php-cgi:過濾出php-cgi進程
grep -v grep:濾掉grep本身的進程
cut -c 9-15:取得進程PID,9-15剛好是PID列
xargs kill -9:在這裡了,xargs就是把剛才獲取的東東,都傳給kill。剛才獲取的是PID,所以kill -9 PIDs
More »
FreeBSD查看即时网络流量
Sun, 21 Nov 2010 04:50:39 +0800

1、数据包 "netstat 1"一秒钟累计一次,"netstat 2"两秒钟累计一次。依此类推

2、查看网卡流量:"systat -if 1"每秒钟刷新一次,"systat -if 2"两秒钟刷新一次,依此类推

 

More »
影响影响者:产生需求的5种战术
Wed, 06 Oct 2010 06:16:48 +0800

原文标题: Influence the Influencers: 5 Tactics to Generate Demand

原文网址:http://www.marketingsherpa.com/article.php?ident=31717(可能进入收费区而无法阅读原文)

另外,thanks laolu

摘要:一些消费者在购买前会做系统研究。如果你知道他们在哪里研究、与谁讨论过,那你能影响他们的购买决策吗?披露这五个手段,让一个影响者营销专家能抵达和追逐关键的个人,了解为什么你不应该----也许违背直觉----向他们发送你的宣传册和新闻列表。

消费者的购买会受其周围的影响。有时,知道是谁或是什么影响着他们的决定,能让商家有杠杆来撬动销售增长。

如果我们能影响到那些影响者,他们又能转而影响购买者,这会让商家有更好的命中率,"Influencer50的总裁Nick Hayes说道。

Hayes的团队专长于帮助B2B公司识别和影响它们市场中最大的50个影响者。尽管他的团队并不特定地与消费者营销公司合作,但他的团队所遵循的原则,对消费者市场也可直接应用。

以下是我们强调的五种战术,Hayes的团队以此赢得了影响者。

 

战术#1 不要向影响者销售

消费者市场的影响者通常都是记者、出版物、网站的经营者和名人。B2B市场中的影响者常常是个人而不是机构。他们也许是一家大公司里的专家,或者是为多家公司工作的咨询顾问。

无论如何,大多数影响者都有一个共同的特质:他们讨厌被当做销售对象。把影响者当成顾客、向他们营销并推动他们去购买,是"在公司找到这些个人后,所犯下的最大错误,"Hayes说。

我们努力接触影响者,是因为他们至少有一种看法。我们没必要让这一看法是正面的,但我们希望他们有一种看法,并且希望尽可能使之见多识广,"Hayes说。

一定要倾听他们的需求。不要向影响者散发你的营销材料,而要询问他们,你的公司如何才能最好地帮助它们。

"并不是他需要你营销部门制作的每一本手册和宣传册,"Hayes说。


 

战术#2 提供接触和联络

人们之所以变得有影响,是因为他们的接触范围和专门知识。当你的公司联系到一个影响者时,一定要向他提供联络机会,以及与你公司主要领导的接触。

例如,Hayes的团队经常发现,影响者有兴趣与该领域内其他有影响力的人进行会面。你的团队可以为几个有影响的人进行介绍,无论当面或通过电话都行。一个影响者会乐于结识这样的一些人,但不会乐于结识所有人。

至于接触范围,告诉影响者你能与公司的中层或经理层成员建立联系,所以他们能更多了解你的产品和机构。这会有助于建立他们的专门知识,并向影响者提供他们应有的特殊待遇。

有时,Hayes说,影响者会提到,他们接触一家公司,只是为了摆脱低级别的地区销售代表。通过向他们提供与你公司领导的接触,他们会感觉受到了更多认真的对待。


 

战术#3 与影响者个别地进行互动

Hayes的团队通常为客户所在市场领域,识别出最前面的50个影响者,因此公司取名为Influencer50。这一数字并非随意而定。Hayes说,这个数字小到足以让公司能集中关注列表中的每个人,大到足以引起真正的商业影响。

"超过50人之外,那就是另外一个数据库了,"Hayes说。"这50人足够重要,以至于公司应当在个别对待的基础上,去了解他们。"

在个别对待的基础上,与每个影响者进行接触和互动,有必要向每个人提供相应的关注。在接触他们时,应当避免群发邮件和直邮,这太像向他们营销或销售了。

 

战术#4 影响者会感到荣幸的

在电话给一个影响者之前,要做好你的功课。要知道他在公司里的头衔和角色,了解那公司卖什么。如果你电话了,又清楚地暴露了对他们或他们的公司了解不多,那他们很可能会搪塞敷衍。

但是,如果你电话告诉影响者,你刚做完一个为期2个月的项目,从你们市场中确定出了最有影响力的人,他们使公司进入了行业前十,那你很可能会得到热烈的回应。

"大多数影响者会回应恭维,"Hayes说。"影响者讨厌群发邮件。"

部分影响者并没有意识到他们有影响力,会因这样的消息而兴高采烈。其他人很清楚自己的能量,会对这样的确认表示感激。

 

战术#5 为不情愿做好准备

有些影响者,比如记者和咨询顾问,能开放地看待额外的关注。但其他人,如任职于某公司的人,并不总喜欢抛头露面。

例如,一个员工也许不愿承认她的影响力,并受那些不这么看的评论所怀疑。或者,一个员工也许意识到了他的影响力,却因为个人偏好或公司政策,而宁愿选择不承认。

在这些情况下,不要硬推。简单地把你公司领导的联系信息留给他,并说明他可以在任何时候联系你们公司。不要给他们公众都知道的联系信息;给他们更高级别的接触范围。

Hayes的团队在对外联络中,他说,当人们不情愿时,"一般来说,他们会因为被恭维而引起兴趣"。

 

 

影响者来源广泛。包括但不限于:

Industry analysts 行业分析师
Business & Trade Journalists 商业和贸易记者
Broadcast Media 广播媒体
Top-Tier Management Consultancies 高层管理咨询公司
Financial analysts 金融分析师
Your competitors 你的竞争对手
Conferences & events 会议和事件
Customer Organisations & User Groups 消费者机构和用户团体
Authors & Management Thinkers 作者和管理思想者
Niche Consultancies 利基市场咨询公司
VARs, Systems Integrators & Outsourcers 增值经销商,系统集成商和外包商
 Consumers and Consumer Groups 消费者和消费者团体
Individual Consultants 独立咨询顾问
Blogs & Online Forums 博客和在线论坛
Industry Bodies, Forums & Federations 行业团体,论坛和联合组织
Venture Capitalists and Financiers 风险投资人和金融家
Retailers 零售商
Procurement Authorities & Buyers Groups 采购组织和买家团体
Government Agencies & Regulators 政府机构和协调组织
Complementary Partner Brands 互补的合作伙伴
Standards bodies 标准机构
Academics 专业学着
 

More »
SH获取昨天日期
Tue, 02 Feb 2010 02:15:06 +0800

区别于bash的sh获取昨天的日期

bash里使用 date -d "yesterday"就可以了,但sh里不行

我们用变换时区的办法获取:

> d=`TZ=$TZ+24 date "+%Y/%m/%d"`

> echo $d

2010/02/01

-----

但是,建议还是看一下date的用法。不同的环境可能有更好的办法

我在freebsd下,

date的用法如下

usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]
---

其中,参数-v可以进行这样的操作

> date -v-1d +%Y%m%d

20100201

> date -v-2d +%Y%m%d

20100131

More »
FreeBSD安装Nginx+PHP+Mysql
Thu, 03 Dec 2009 15:26:58 +0800

首先,需要强调的是,用ports安装,避免叮叮当当的许多问题。

FB 7.0 -RELEASE

之前的版本了,所以更新一下ports

portsnap fetch extract update

 

安装MySQL

cd /usr/ports/databases/mysql51-server/
make WITH_CHARSET=utf-8 WITH_XCHARSET=all WITH_PROC_SCOPE_PTH=yes BUILD_OPTIMIZED=yes BUILD_STATIC=yes SKIP_DNS_CHECK=yes WITHOUT_INNODB=yes install clean
cp /usr/local/share/mysql/my-small.cnf /etc/my.cnf
 
/usr/local/bin/mysql_install_db --user=mysql
mysqladmin -u root password 'new_password' //root的新密码

 

安装 PHP 及其扩展

cd /usr/ports/lang/php5
make install clean
cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini
cd /usr/ports/lang/php5-extensions/
make install clean

安装Nginx

cd /usr/ports/www/nginx/
make install clean

开机启动

vi /etc/rc.conf
mysql_enable="YES"
nginx_enable="YES"
/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -g www -C 4 -f /usr/local/bin/php-cgi

More »
为PHP打上fpm的支持
Thu, 03 Dec 2009 00:19:10 +0800

php-fpm是PHP的FastCGI Process Manager,我们可以在这里获取:www.php-fpm.org

那里通常有最新版本的patch,下载一个下来,比如php-fpm-0.6-103~5.3.1.tar.gz,这个对应的是PHP-5.3.1版本的fpm patch

tar zxf php-fpm-0.6-103~5.3.1.tar.gz

php-fpm-0.6-103~5.3.1/generate-patch  (这里会产生一个fpm.patch的文件)

cd php-5.3.1

patch -p1 < ../fpm.patch

----------------

OK,打上fpm了,编译PHP前,先

./buildconf --force

不然,configure不认--with-fastcgi这个选项

./configure ...........

即可

More »
SQL之JOIN结构简单理解
Fri, 18 Sep 2009 23:30:52 +0800

以前写JOIN的时候都是这样:

select * from a join b on a.xx=b.yy where a.zz=ww

现在遇到了多表联合了,一下连join几个都不对,其实,可以这样理解,SELECT 就是从某个源取得数据的,所以应该这样:

select * from (((a join b on a.xx=b.yy) join c on c.zz=a.ww) join d on d.kk=c.ii .....)......

括号内的是表联合后构成的数据源

More »
OS?SO?
Thu, 16 Jul 2009 18:27:57 +0800

  谷歌7月8日宣布,将推出基于Chrome浏览器的PC操作系统,直接与微软展开竞争。其实这则新闻不算突然,早在2008年底就有相关的新闻了。

 

  有人说这个操作系统会对微软带来实质性的威胁,我并不这样认为。

 

  原因是操作系统的开发关联的技术性问题并不是重点,重点是市场化。当前相当多的硬件厂商,相对都是针对Windows来进行优化和定制的,很多品牌机都贴有Windows XP、Windows Vista的标签就很说明问题。硬件的支持是一个操作系统的关键因素,如果没有全面的硬件厂商的支持,想发展一个操作系统是相当的困难。这方面Linux就是一个很好的范例。

 

  Linux本身获得硬件厂商的直接支持很少,这使得新出的硬件产品有一部分并不能很好地兼容Linux。如果Google的Chrome OS(暂这叫吧)能获得硬件厂商的支持,那发展的第一步就不是什么问题了。可喜的是,Google已经在这样做了。

 

  另外,OS的市场是个问题。Windows是个非常成功的产品,这得益于其不断改进的友好的用户界面。大家都知道,Google历来都是以简洁(甚至简洁得很难看)著称的,我现在真有点担心这个Chrome OS一出来就是DOS这样的东西。如果界面不友好,支持的软件少,市场是很难打开的。如此一来,就绕不开Microsoft的授权了。要知道,Windows的市场占有率超过85%,多数人的工作都是在Windows平台下的,要想转到Chrome OS上,Chrome OS上就必须有相关的工具。但,Linux没有吗?可以说Windows能干的事,Linux基本都可以,Linux不也没把MS勒倒么?Linux没有固定的支持中心或许是个原因,但原因不单止这个。

 

  如此看来,Google Chrome OS还真有相当长的一段路要走的,不是一出来就能把Windows弄倒的。不管怎么说,独门独市总是不好的,希望Chrome OS能走得好,让用户有更多的选择。

More »
使用SSH爬墙
Tue, 30 Jun 2009 21:35:55 +0800

  得益于我们伟大的GFW,我们经常无法查到一些事情的真实情况,有时,连资料都没法查。所以只能使用SSH进行代理爬墙了。

  刚好,在国外的主机是使用SSH进行远程管理的,所以我就使用SSH进行代理查找资料了。

 

Windows客户端我使用了Putty,Putty里带有个plink的程序,可以用它来建立从客户端到服务器的隧道。

plink -N username@ip -D localport

把username、ip以及localport替换成你的主机信息。如:

plink -N lewphee@myserver.com -D 4800

这样,就建立了个隧道。在浏览器使用SOCK5代理,端口为4800,就可以爬墙了

More »
MySQL数据库优化(一)
Thu, 25 Jun 2009 02:24:35 +0800

  对于许多访问量大的网站来说,数据库优化是性能提升、负载提升的至关重要的一个环节。本篇是由Sams Publishing出版的<MySQL Administrator's Guide>中的第六章"MySQL Optimization"翻译过来,诣在做个学习的笔记,以及为有需要的人作个参考。在内容中可能穿插有我的一些注解,但都会明显地标识出来的。由于是一节节地翻译出来,所以就以一篇篇日记的方式发布吧。另,由于水平有限,难免有错漏或意思表达欠妥的地方,还请各位能指出,以能进一步修改。

内容主要有:

* 优化概览

* SELECT语句以及其它查询的优化

* 关于"锁"的问题

* 数据库结构优化

* MySQL 数据库服务器的优化

* 关于磁盘

---------

 

 

  基础设计是让一个系统更快速运行的最重要的因素。你必须知道你的系统将要进行什么工作并且知道它的瓶颈在哪里。

 

  绝大多数的瓶颈在以下几个方面:

 

  磁盘寻址。寻址需要耗费时间,在近代的磁盘里,每次的寻址耗费平均为10ms,这样,一秒内,磁盘可进行大约100次的寻址。这个时间由于磁盘的更新换代,正正慢慢地减小,然而对于单一数据源来说,这个寻址时间已经很难优化了。将数据源置于多磁盘中,是优化寻址时间的方法之一。

 

  磁盘读写。当磁盘指针位于合适的位置时,我们需要读取数据,当前的磁盘都有10~20MB/s的吞吐能力。相较之下,这个指标比磁盘寻址时间更容易优化,因为我们可以同时从多个磁盘并行地读取数据。

 

  CPU时钟周期。当我们将数据读入内存中(或数据早已在内存),我们必须处理它以期得到我们想要的结果。此数据量小的表的数量与内存数量的比率是比较常见的限制因素,但对于小表来说,速度通常不是问题所在。

 

  内存带宽。当CPU需要更多的数据以填入CPU的缓存里时,主存带宽就成了瓶颈----在多数系统里,这个通常不是瓶颈,但我们应该意识到有这个瓶颈的存在。

 

 * MySQL设计的限制和权衡

  当使用MyISAM存储引挚时,MySQL极快地将表锁定以让多个客户端进行读取数据或只一个数据写入的客户端。此类型的数据引挚最大的问题是,当你持续不断地对某一数据表进行数据更新时,对那个表操作(如查询)的其它客户端就显得过于慢了。当你能确定是哪个表进行的操作过于频繁时,我们可以对那个表单独使用其它的存储引挚,如InnoDB等。

 

  MySQL可以对混合类型的表进行操作,即一个数据库内包含不同的数据存储引挚,事务型或非事务型的。为了能更好地运行非事务型的表,MySQL进行了以下的约定:

 

  - 所有的字段都有默认值
  - 如果你插入"错误"的值,比如,插入的整型过大,MySQL将不会报错,代之以插入其认为最合适的值。对数值类型来说,这些"最合适的值"通常为0、最小的值、最大的值。对字符串类型一说,是空值或者该字段能存储的最长的字符串。
  - 所有的计算式都会返回值,即使是错误的计算,也会返回一个"合适"的值而不会报错。如 1/0将返回NULL

  根据以上的约定,很显然,MySQL的本意是你必须在你的程序中检查插入的值是否正确,而不要等MySQL将你的值检查再转换成合法的值。

 

* 设计具可移植性的应用程序

  因为所有的数据库服务器都实现了标准SQL的不同部分,所以要写一个具可移植性的SQL程序也是一个相当耗力的工作。写出具有可移植性的简单查询或插入SQL语句是件相当容易的事,但是,当你的查询越复杂时,要实现复杂查询的同时具有良好的可移植性,就是件难事了。

 

  写个具有可移植性的复杂程序前,你需要确定你的程序所使用的数据库以及该种数据库所具有的各种功能。所有的数据库系统都有一个弱点,即是,它们不同的设计让步从而导致不同的行为后果。

 

  你可以使用MySQL crash-me程序在一个已选择的数据库中查询函数、类型或者限制。crash-me并不查询所有可能支持的功能,但它支持的功能已相当多,大约在450个左右。比如,当你使用Informix或者DB2时,crash-me可以告诉你,字段的名称的长度不能超过18个字符。

 

  crash-me和MySQL benchmarks都是无关数据库系统的。看看它们是怎么写成的,你可以对写具有可移植性的数据库程序有个大概的了解。程序可以在MySQL源码中的sql-bench目录找到。它们是用Perl写成的,使用了DBI的数据库接口。使用DBI可以解决其本身的可移植性问题,因为DBI提供了一些无关数据库类型的访问方法。

 

  查找关于crash-me和benchmarks的信息,请访问http://dev.mysql.com/tech-resources/crash-me.phphttp://dev.mysql.com/tech-resources/benchmarks/

 

  如果你想设计无关平台的数据库,你需要对每个数据库服务器的瓶颈有所了解。比如,MySQL在MyISAM类型的表中读写都相当的快,但是,如果对同一个表同时进行读取和写入数据操作时,它将会显得慢了。Oracle,当你访问刚刚更新的数据行时,将会有问题。事务型数据库在从日志表生成汇总表通常都不是很好,因为如果这样,行锁基本是没什么大的作用了。

 

  为了让你的程序真正做到无关数据库系统平台,你需要定义一个简单的扩展接口以对你的数据进行操作。因为C++在许多系统中都兼容,就用C++的类作为数据库的操作接口吧。

 

  如果你用了某些指定数据库才具有的应用(如,MySQL中的REPLACE),你必须为其它的数据库系统也实现一个兼容的动作。虽然会慢一点,但至少可在其它的数据库系统运行相同的任务。

 

  MySQL中,你可以使用/*! */来加入一个MySQL已定义的关键字到查询。但是,/**/就是注释了,这个是大多数数据库系统都支持的注释语法。

 

  如果高性能远比精确度更具重要性(比如在Web项目中),那么,你可以建立一个应用层以缓存所有记录集,这样可以提高不少的性能。对结果的过期时间进行设置后,你可以在相当程度上保持缓存的记录为最新的。你可以动态增加缓存并且合理设置过期时间,以有效地提高负荷。

 

  因此,一个表的信息应该包含缓存的初始大小以及更新的频率等信息。

 

  使用MySQL查询缓存是应用程序缓存的替换方法。启用查询缓存后,数据库服务器会监控详细的查询信息以决定一个查询是否使用缓存。这个会简化你的应用程序。参看章节4.10 "MySQL查询缓存"。

 

* 我们用MySQL做了什么

  本节我们讨论MySQL的早期。

  在MySQL开发的初期,MySQL主要的功能是满足于我们的一个最大的客户。其使用了数据仓库来处理在瑞典的两个最大的分销商的数据。

 

  我们对每个店面每周出一收益概要报表,并且提供一些有用的信息以让店主清楚如何进行对他们的客户进行有效的广告运作。

 

  数据的容量是非常巨大的(大概每月700万条交易数据),并且有4~10年的数据要向客户提供查询。我们每周从这些数据中为有需要的客户生成报表。

 

  为了解决这一问题,我们每月将所有的信息压缩存进交易表中。我们有一系列简单的宏来按不同的需要(产品、客户id、商店等等)从交易表中生成汇总表。报告是Perl脚本动态生成的WEB页面。

 

  对于图片数据,我们使用C写了个简单的工具,能处理SQL查询请求并根据查询结果生成GIF图像。这个工具也能通过WEB页的Perl脚本进行动态地调用。

 

  多数情况下,一个新的报表能通过复制和更改现有的脚本进行产生。少数情况我们需要为现有的报表添加更多的字段信息,但这也是很简单的事,因为我们已经把所有的数据都存在硬盘上了。

 

* MySQL Benchmark套件

  本节包含一些MySQL Benchmark(以及crash-me)的尚未编写的技术描述。当前你可以通过sql-bench目录的源码获取一些好的解决办法。

 

  MySQL Benchmark是用来测试MySQL的SQL语句的性能情况的。需要提醒的是,当前benchmark是单线程的,这样它能很好地测试SQL操作的最小时间。我们在往后的时间里将转成多线程的。

 

  要使用Benchmark套件,以下必需条件是要满足的:
  - Benchmark套件已经在源码中提供。你当然也可从 http://dev.mysql.com/downloads/ 那单独下载来自行编译使用。
  - Benchmark脚本是使用Perl以及Perl的DBI模块来写的,所以DBI是必须安装的。如果需要测试其它类型的数据库,你还需要指定类型的DBD模块。

  当你取得MySQL源码后,你会在sql-bench目录下找到benchmark,要运行benchmark,只需运行run-all-tests脚本。

 

shell> cd sql-bench
shell> perl run-all-tests --server=server_name

server_name是个可用的服务器,想查看更多的可用列表,运行此命令:

shell> perl run-all-tests --help

crash-me脚本也在sql-bench目录下。crash-me会取得当前数据库的一些支持信息比如它的实际运行容量和限制等。如:
  - 支持的字段数据类型
  - 支持多少索引
  - 支持的功能
  - 支持多大的查询
  - VARCHAR类型支持多大的数据量

More »
非增量每日备份
Tue, 23 Jun 2009 13:55:56 +0800

被FSCK搞怕了,所以得每天都备份(之前都是1个星期才备份一次-_-!)。现在就写了个备份的脚本,让服务器每天自动备份

备份是通过FTP来的,所以首先建立一个backup用户
useradd -g sites -d /backups -s /usr/sbin/nologin backup
passwd backup
*****
*****
update successfully...

然后使用以下脚本进行备份到本地:
vi backup-server.pl

#/usr/bin/perl -w

#backup server scripts

#files
$datadir = "/www";
@fl = ("www.lewphee.com");
@db = ("dbname"); #数据库
$pswd = "*****"; #root 密码

#backup directory
$bto = '/backups';
$bto1 = '/backups';
my ($sec,$min,$hour,$mday,$mon,$year,
          $wday,$yday,$isdst) = localtime time;

$bto = sprintf("$bto/%4d%02d%02d/", $year+1900, $mon+1, $mday);
if (!-e $bto) {
    system("mkdir -p ".$bto);
}

foreach (@fl){
    system("cd $datadir;tar -czf ".$bto.$_.".tar.gz ".$_);
    system("echo \"".localtime(time)." tar ".$datadir."/".$_." ok.\" >> /logs/backup.log");
}

#database
foreach (@db){
    #登录数据库服务器并完全备份数据库成一个压缩文件
    system("/usr/local/mysql/bin/mysqldump -uroot -p".$pswd." -S /tmp/mysql.sock -R --add-drop-database=TRUE ".$_." | gzip > ".$bto.$_.".sql.gz");
    system("echo \"".localtime(time)." database ".$_." backup successfully\" >> /logs/backup.log");
}

#now, tar the directory.
system("cd ".$bto1.";tar -czf ".sprintf("%4d%02d%02d", $year+1900, $mon+1, $mday).".tar.gz ".sprintf("%4d%02d%02d", $year+1900, $mon+1, $mday));
system("rm -rf ".$bto);
system("echo \"".localtime(time)."backup total successfully\" >> /logs/backup.log");

这样,本地要备份的数据库和文件目录,只用在@fl和@db数组添加就可以了。
本地备份完成了,但我们得从别的服务器里拷回这些备份,不然只在本地备份就等于没备份!

之前建立的FTP帐号派上用场了----我们同样用脚本登录FTP进行数据下载:

vi backup-client.pl

#/usr/bin/perl -w

use Net::FTP;

#backup remote server's file to local

#local backup dir
$dir = "/backups/";

#remote server
$server = "server.name.here";

#ftp parameters
$user = "backup";
$pswd = "****";

$ftp = Net::FTP->new($server, Debug=>0) or die("can't connect to $server:$@");
$ftp->login($user, $pswd);
$ftp->cwd("/");

my ($sec,$min,$hour,$mday,$mon,$year,
          $wday,$yday,$isdst) = localtime time;

$file = sprintf("%04d%02d%02d.tar.gz", $year+1900, $mon+1, $mday);

$ftp->binary();
$ftp->get($file, $dir.$server."-".$file);
system("echo \"".localtime(time)." backup remote ".$server." total successfully\" >> /logs/backup.log");
$ftp->quit();

最后,在主数据服务器里的crontab里设置每日0时备份
crontab -e
0 0 * * * (perl /tools/backup-server.pl)

远程备份服务器(有延迟,因为不可能同时运行,那边还没压缩完呢):
crontab -e
30 0 * * * (perl /tools/backup-client.pl)

这样,就可以做到天天备份,不用怕down机了(不down肯定好过down的,我意思是说,不怕down机找不回数据了)^o^

More »
awstats安装与配置
Mon, 15 Jun 2009 05:32:35 +0800

为了对站点进行更有效的优化,我使用AWStats来进行分析和统计。在此之前得配置Nginx生成相关的访问记录,请参考我另一篇关于Nginx访问记录的配置文档。

wget http://prdownloads.sourceforge.net/awstats/awstats-6.9.tar.gz
tar zxf awstats-6.9.tar.gz
cd awstats-6.9
mv wwwroot /data/www/awstats.lewphee.com

安装GeoIP的C库
wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
tar zxf GeoIP.tar.gz
cd GeoIP
./configure
make && make install && make clean


perl -MCPAN -e 'install Geo::IP'
perl -MCPAN -e 'install Geo::IPfree'

下载GeoIP/GeoIPCityLite包:解包并部署到awstats目录下:
wget  http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
wget  http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

gzip -d *.gz

复制通用可包含配置文件,当使用参数config时,awstats会找awstats.xxxx.conf的文件。所以把相同部分包含进来。如果不指定config时,awstats会找awstats.conf配置文件
cp awstats.model.conf awstats.common.conf

修改awstats.common.conf的一些配置选项:
LoadPlugin="decodeutfkeys"
LoadPlugin="geoip GEOIP_STANDARD /data/www/awstats.lewphee.com/cgi-bin/GeoIP.dat"
LoadPlugin="geoip_city_maxmind GEOIP_STANDARD /data/www/awstats.lewphee.com/cgi-bin/GeoLiteCity.dat"

创建data目录用于统计数据输出:
mkdir data

然后生成awstats.lewphee.conf
Include "awstats.common.conf"
LogFile="/logs/www.lewphee.com/%YYYY-24%MM-24/access_%YYYY-24-%MM-24-%DD-24.log"
SiteDomain="www.lewphee.com"
HostAliases="lewphee.com"
DefaultFile="index.html"
DirData="/data/www/awstats.lewphee.com/cgi-bin/data/"

并修改awstats.pl: 设置LIMITFLUSH加10倍
$LIMITFLUSH=50000

自动更新:
在crontab那可以设置自动更新:
#update awstats
0 0 * * * (/data/www/awstats.lewphee.com/cgi-bin/awstats.pl -update -config=lewphee)

More »
Nginx访问记录的配置和分割
Mon, 15 Jun 2009 05:27:48 +0800

Nginx目前不支持pipe输出日志文件,所以我们没法像用cronlog分割apache的日志那样来处理。
不过我们还有另一种方法来进行分割:即使用脚本来移动日志文件。以下脚本是shell脚本:

nginx_log_cron.sh

#!/bin/bash

site_log="/logs/www.lewphee.com/"
#创建当月目录,我使用这样的格式/sitelog/YYYYMM/access_YYYY-MM-DD.log
mkdir -p ${site_log}$(date -d "yesterday" +"%Y")$(date -d "yesterday" +"%m")/
mv ${site_log}access.log ${site_log}$(date -d "yesterday" +"%Y")$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y-%m-%d").log
kill -USR1 `cat /usr/local/nginx/sbin/nginx.pid`

在Nginx方面,我们设置日志输出:
logformat main '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';

access_log /logs/www.lewphee.com/access.log main;

把脚本存在一个地方,比如/logs/nginx_log_cron.sh
把它设置为每天0时进行分割
crontab -e
00 00 * * * (/bin/bash /logs/nginx_log_cron.sh)

More »
给Nginx加上对Perl CGI的支持
Sat, 13 Jun 2009 21:40:32 +0800

我们使用FastCGI的方式支持PERL CGI,所以装PERL的FCGI模块。
perl -MCPAN -e 'install FCGI'
perl -MCPAN -e 'install FCGI::ProcManager'

获取fastcgi-wrapper.pl
wget http://www.ruby-forum.com/attachment/1583/fastcgi-wrapper.pl

把文件保存在/usr/local/bin/里,编辑/etc/rc.local让其开机以daemon方式启动:
/usr/local/bin/fastcgi-wrapper.pl &

它会建立/var/run/nginx/perl_cgi-dispatch.sock

这个sock,在Nginx的配置文件上要用到。
到nginx.conf里
加入对cgi的处理
fastcgi_pass  /var/run/nginx/perl_cgi-dispatch.sock;

重启Nginx即可

More »
Nginx架构WEB服务器
Tue, 02 Jun 2009 20:17:53 +0800

现在说一下LNMP架构的服务器的安装过程,作为自己的一个笔记,也为一些需要帮助的朋友提供点参考。
L方面使用Debian(其实我用FreeBSD),基本是个什么都没的干净系统(连GCC都没)。

1.首先我们安装GCC编译环境
因为后面的软件都需要编译,所以这个不装就太不像话了。
apt-get install build-essential

如果出现如下提示:
E: Couldn't find package build-essential
则需要更新包列表:
apt-get update

此开发环境包安装后,则已经安装上如下包了:
binutils bzip2 cpp cpp-4.3 dpkg-dev g++ g++-4.3 gcc gcc-4.3 libc6 libc6-dev libgmp3c2 libgomp1 libmpfr1ldbl libstdc++6-4.3-dev libtimedate-perl linux-libc-dev make patch perl perl-modules

Suggested packages:
  binutils-doc bzip2-doc cpp-doc gcc-4.3-locales debian-keyring g++-multilib g++-4.3-multilib gcc-4.3-doc libstdc++6-4.3-dbg gcc-multilib
  manpages-dev autoconf automake1.9 libtool flex bison gdb gcc-doc gcc-4.3-multilib libmudflap0-4.3-dev libgcc1-dbg libgomp1-dbg libmudflap0-dbg
  glibc-doc libc6-i686 libstdc++6-4.3-doc make-doc diff-doc perl-doc libterm-readline-gnu-perl libterm-readline-perl-perl

2.安装MYSQL
获取MysQL
wget http://mysql.west.mirrors.airband.net/Downloads/MySQL-5.1/mysql-5.1.34.tar.gz

tar -zxvf mysql-5.1.34.tar.gz
cd mysql-5.1.34
./configure --prefix=/usr/local/mysql --with-charset=utf8 \
--with-extra-charsets=complex \
--enable-thread-safe-client \
--enable-assembler \
--with-big-tables \
--with-readline \
--with-ssl \
--with-embedded-server \
--enable-local-infile \
--with-plugins=innobase

make && make install

如果有以下错误
checking for termcap functions library... configure: error: No curses/termcap library found
说明 curses/termcap 库没有安装
apt-cache search curses | grep lib

安装 libncurses5-dev

wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.6.tar.gz
tar zxvf ncurses-5.6.tar.gz
cd ncurses-5.6
./configure --prefix=/usr --with-shared --without-debug
make
make install clean
或者这样更方便
apt-get install libncurses5-dev

之后重新安装MYSQL部分

完成后加入运行mysql用户和组
groupadd mysql
useradd -g mysql mysql

更改权限以及拷贝默认配置文件
chmod +w /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql

cp support-files/my-medium.cnf /usr/local/mysql/my.cnf

*
建立MYSQL数据库
/usr/local/mysql/bin/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

设置为开机启动MYSQL
在/etc/rc.local中加入以下启动语句
/bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf &

如果有错误,查看mysql的错误日志即可。

3.安装PHP
因为要与Nginx配合,所以PHP以FastCGI的方式安装和运行。
同样,PHP也有相关的包要装。

首先获取PHP:
wget http://us.php.net/distributions/php-5.2.9.tar.gz

因为PHP需要一些库,我们先安装,具体如下:
libiconv libxml2 libxslt freetype libmcrypt jpeg6 libpng curl gd
OpenSSL-dev

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz
tar zxvf libiconv-1.13.tar.gz
cd libiconv-1.13/
./configure --prefix=/usr/local
make && make install && make clean
cd ..

wget http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure
make && make install
cd libltdl
./configure --enable-ltdl-install
make && make install
cd ..
make clean

wget http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz
tar zxvf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
./configure
make && make install && make clean
cd ..

//注
ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1

wget http://downloads.sourceforge.net/mcrypt/mcrypt-2.6.8.tar.gz
tar zxvf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8
/sbin/ldconfig
./configure
make && make install && make clean
cd ..

安装libxml2
apt-get install libxml2-dev

安装libxslt
wget ftp://xmlsoft.org/libxslt/libxslt-1.1.24.tar.gz
tar -zxf libxslt-1.1.24.tar.gz
cd libxslt-1.1.24
./configure --prefix=/usr/local/libxslt --with-libxml-prefix=/usr/local/libxml2
make && make install && make clean
cd ..

安装OpenSSL-dev
aptitude update
aptitude install openssl-dev

安装libzlib1g-dev
apt-get install libzlib1g-dev

安装freetype
wget http://superb-west.dl.sourceforge.net/sourceforge/freetype/freetype-2.3.9.tar.gz
tar zxvf freetype-2.3.9.tar.gz
cd freetype-2.3.9
./configure --prefix=/usr/local/freetype
make && make install && make clean
cd ..

安装libpng
wget http://superb-west.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.36.tar.gz
tar zxvf libpng-1.2.36.tar.gz
cd libpng-1.2.36
cp scripts/makefile.std makefile
make && make install

安装jpeg6
mkdir /usr/local/jpeg6
mkdir /usr/local/jpeg6/bin
mkdir /usr/local/jpeg6/lib
mkdir /usr/local/jpeg6/include
mkdir /usr/local/jpeg6/man
mkdir /usr/local/jpeg6/man/man1
wget http://www.ijg.org/files/jpegsrc.v6b.tar.gz
tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static
make && make install && make clean
cd ..

安装GD库
wget http://www.boutell.com/gd/http/gd-2.0.33.tar.gz
tar -zxf gd-2.0.33.tar.gz
cd gd-2.0.33
./configure --prefix=/usr/local/gd2 \
--with-jpeg=/usr/local/jpeg6/ \
--with-png \
--with-zlib \
--with-freetype=/usr/local/freetype/
make && make install && make clean
cd ..

安装CURL
wget http://curl.download.nextag.com/download/curl-7.19.5.tar.gz
tar -zxf curl-7.19.5.tar.gz
cd curl-7.19.5
./configure --prefix=/usr/local/curl

配置并编译PHP(谢谢patch来源提供者):
wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.9-fpm-0.5.10.diff.gz
gzip -cd php-5.2.9-fpm-0.5.10.diff.gz | patch -d php-5.2.9 -p1
./configure --prefix=/usr/local/php5 --with-config-file-path=/usr/local/php5 \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-iconv-dir=/usr/local \
--with-freetype-dir=/usr/local/freetype \
--with-jpeg-dir=/usr/local/jpeg6 \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr/local/libxml2 \
--enable-xml \
--disable-rpath \
--enable-discard-path \
--enable-safe-mode \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl=/usr/local/curl \
--with-curlwrappers \
--enable-mbregex \
--enable-fastcgi \
--enable-fpm \
--enable-force-cgi-redirect \
--enable-mbstring \
--with-mcrypt \
--with-gd=/usr/local/gd2 \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-ldap \
--with-ldap-sasl \
--with-xmlrpc \
--with-xsl=/usr/local/libxslt \
--enable-xslt \
--enable-zip
make ZEND_EXTRA_LIBS='-liconv'
make install

cp php.ini-dist /usr/local/php5/php.ini

4. 安装memcache以及eaccelerator

memcache

wget http://pecl.php.net/get/memcache-2.2.5.tgz
tar -zxf memcache-2.2.5.tgz
cd memcache-2.2.5
/usr/local/php5/bin/phpize
./configure --with-php-config=/usr/local/php5/bin/php-config
make && make install && make clean

eAccelerator
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
tar jxvf eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3
/usr/local/php5/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php5/bin/php-config
make && make install
cd ..

修改php.ini,以加memcache和eaccelerator
修改为extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/"
extension = "memcache.so"
修改output_buffering 为 On

加入eAccelerator加速
mkdir /usr/local/ea_cache

[eaccelerator]
zend_extension="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/usr/local/ea_cache"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="300"
eaccelerator.shm_prune_period="120"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

修改php-fpm配置文件,启动php-cgi进程
vi /usr/local/php5/etc/php-fpm.conf
内容如下:
<?xml version="1.0" ?>
<configuration>
  <section name="global_options">
    <value name="pid_file">/usr/local/php5/logs/php-fpm.pid</value>
    <value name="error_log">/usr/local/php5/logs/php-fpm.log</value>
    <value name="log_level">notice</value>
    <value name="emergency_restart_threshold">10</value>
    <value name="emergency_restart_interval">1m</value>
    <value name="process_control_timeout">5s</value>
    <value name="daemonize">yes</value>
  </section>

  <workers>
    <section name="pool">
      <value name="name">default</value>
      <value name="listen_address">127.0.0.1:9000</value>
      <value name="listen_options">
        <value name="backlog">-1</value>
        <value name="owner"></value>
        <value name="group"></value>
        <value name="mode">0666</value>
      </value>
      <value name="php_defines">
        <value name="sendmail_path">/usr/sbin/sendmail -t -i</value>
        <value name="display_errors">1</value>
      </value>
        <value name="user">www</value>
        <value name="group">www</value>
      <value name="pm">
        <value name="style">static</value>
        <value name="max_children">25</value>
        <value name="apache_like">
          <value name="StartServers">20</value>
          <value name="MinSpareServers">5</value>
          <value name="MaxSpareServers">35</value>
        </value>
      </value>
      <value name="request_terminate_timeout">0s</value>
      <value name="request_slowlog_timeout">0s</value>
      <value name="slowlog">logs/slow.log</value>
      <value name="rlimit_files">10240</value>
      <value name="rlimit_core">0</value>
      <value name="chroot"></value>
      <value name="chdir"></value>
      <value name="catch_workers_output">yes</value>
      <value name="max_requests">10240</value>
      <value name="allowed_clients">127.0.0.1</value>
      <value name="environment">
        <value name="HOSTNAME">$HOSTNAME</value>
        <value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
        <value name="TMP">/tmp</value>
        <value name="TMPDIR">/tmp</value>
        <value name="TEMP">/tmp</value>
        <value name="OSTYPE">$OSTYPE</value>
        <value name="MACHTYPE">$MACHTYPE</value>
        <value name="MALLOC_CHECK_">2</value>
      </value>
    </section>
  </workers>

</configuration>

5. 安装Nginx
Nginx依赖一些库,先安装它们,但都取决于是否需要
.gzip 模块需要 zlib 库
.rewrite 模块需要 pcre 库
.ssl 功能需要 openssl 库

我需要rewrite,所以得装个pcre
wget http://superb-west.dl.sourceforge.net/sourceforge/pcre/pcre-7.9.tar.gz
tar zxf pcre-7.9.tar.gz
cd pcre-7.9
./configure
make && make install
cd ..

创建www用户和组,用于Nginx
好了,装Nginx

wget http://sysoev.ru/nginx/nginx-0.7.59.tar.gz
tar zxf nginx-0.7.59.tar.gz
cd nginx-0.7.59
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install

配置Nginx
cd /usr/local/nginx/conf

#vi nginx.conf
server段内
 location ~ .*\.(php|php5)?$
    {
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
      expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
      expires      1h;
    }

    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
    access_log  /data1/logs/access.log  access;

fcgi.conf的内容如下:
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;

开机启动
在/etc/rc.local中加入
ulimit -SHn 10240
/usr/local/php5/sbin/php-fpm start
/usr/local/nginx/sbin/nginx

More »
艺术模糊处理
Fri, 08 May 2009 01:26:29 +0800

以前发过一篇一样的处理文章的,但因那BLOG年久失修,丢了。现在再补发吧。

现在看看,好像我图层1副本的透明度调得还不够,以致效果不太明显。调成40%更好一点。

艺术模糊处理

More »
江城子
Tue, 24 Feb 2009 04:57:24 +0800

江城子

蘇軾


十年生死兩茫茫。不思量,自難忘。千里孤墳,無處話淒涼。縱使相逢應不識,塵滿面、鬢如霜。

夜來幽夢忽還鄉。小軒窗,正梳妝。相顧無言,惟有淚千行。料得年年腸斷處:明月夜,短松岡。

注:
這是一首悼亡詞,是爲悼念妻子王弗去世十周年而作。生死闊別,本詞的時間跨度達二十年。上闋寫死別十年,一直對亡妻銘記在心,但亡妻若能見到自己,也會認不出來,因我過於衰老。於是由悼亡到自傷,哀婉淒涼。"塵滿面"道盡十年輾轉塵世,曆盡坎坷和創傷。下闋記夢,兼寫生前死後。"小軒窗,正梳妝",既是十年夫妻生活的回憶,又是夢境。"相顧無言"二句,狀寫今日失意、哀苦無處訴的情懷。具體真實, 生動傳神。全篇採用白描手法,樸素自素,字字句句流露出深沈的感情。

More »
关于MYSQL的错误
Sat, 07 Feb 2009 21:48:34 +0800

经常见到MYSQL的错误信息如下:

Lost connection to MySQL server during query

......呃,这个"或"的错误我忘记是什么了,总之也挺常见的。

网上的解决方法都不适用我的情况。在执行一次存储过程后,再执行mysql_query就会出现这样的错误。GOOGLE出来的解决方法是bind-address,说是大流量网络故障的问题。

然而,事实不是这样。

出现这样的问题,有时是存储过程里的SQL语句出错了,比如联合查询字段问题,或者少了什么(如LIMIT中的逗号,还真经常忘记的-_-!!!)

 

仔细检查一下SQL语句,总会发现的。set-variable=thread-stack=256k不适用于我的情况。

More »
showModalDialog的参数说明
Sat, 13 Dec 2008 17:04:39 +0800
showModalDialog() (Internet Explorer 4 and above)
showModelessDialog() (Internet Explorer 5 and above) vReturnValue = window.showModalDialog(sURL[, vArguments][, sFeatures]);
vReturnValue = window.showModelessDialog(sURL[, vArguments][, sFeatures]); 其中:
vArguments 是要傳到子窗口的參數;
sFeatures 指定子窗口顯示的狀太,與 window.open() 的相似; sFeatures 所用的參數:
dialogHeight: iHeight
dialogWidth: iWidth
dialogLeft: iXPos
dialogTop: iYPos
center: {yes | no | 1 | 0 }
help: {yes | no | 1 | 0 }
resizable: {yes | no | 1 | 0 } (Internet Explorer 5 and above)
status: {yes | no | 1 | 0 } (Internet Explorer 5 and above)
More »
更改FIREFOX界面字体
Sat, 13 Dec 2008 17:02:53 +0800
userChrome.css

修改~/.mozilla/firefox/*/chrome/userChrome.css

改变界面字体及大小

如果想使用verdana 12号字体,可以加入以下两行
文件: ~/.mozilla/firefox/*/chrome/userChrome.css

*{font-size: 12pt !important}
*{font-family: verdana !important}


userContent.css

修改~/.mozilla/firefox/*/chrome/userContent.css

让 mailto 连接显示紫色
文件: ~/.mozilla/firefox/*/chrome/userContent.css

a[href^="mailto:"] {
color: purple !important;
text-decoration: none !important;
}


在 mailto 连接前显示一个邮箱
文件: ~/.mozilla/firefox/*/chrome/userContent.css

a[href^="mailto:"]:before {
content: "\2709 " !important;
}


让 javascript 连接显示绿色
文件: ~/.mozilla/firefox/*/chrome/userContent.css

a[href^="javascript:"] {
color: green !important;
text-decoration: underline !important;
}
More »
FreeBSD Tips(一)
Sat, 13 Dec 2008 17:00:20 +0800
1.Gaim's font:
Add the following to the ~/.gtkrc-2.0

gtk-font-name="simsun 12"

2.Use the mouse moving button:
add the following to the section 'InputDevice' of /etc/xorg.conf:

Option ZaxisMapping "4 5"

3.FCITX's standard setting:
add the following to the ~/.xinitrc:
setenv XMODIFIERS @im=fcitx
setenv LANG zh_CN.eucCN
setenv LC_CTYPE zh_CN.eucCN
LANG=zh_CN.eucCN
LC_ALL=zh_CN.eucCN
export LANG LC_ALL
export XMODIFIERS=@im=fcitx
fcitx&

#kde enviroment.
startkde

4.Occur 'blanktime' when the system booting:
edit the rc.conf:
sendmail_enable="none"
More »
查询及删除重复记录的方法大全
Sat, 13 Dec 2008 16:58:24 +0800

做个小李他妈的飞刀的笔记先,免得到处找~~

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)


5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

(二)
比方说
在A表中存在一个字段"name",
而且不同记录之间的"name"值有可能会相同,
现在就是需要查询出在该表中的各记录之间,"name"值存在重复的项;
Select Name,Count(*) From A Group By Name Having Count(*) > 1

如果还查性别也相同大则如下:
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1


(三)
方法一

declare @max integer,@id integer

declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1

open cur_rows

fetch cur_rows into @id,@max

while @@fetch_status=0

begin

select @max = @max -1

set rowcount @max

delete from 表名 where 主字段 = @id

fetch cur_rows into @id,@max

end

close cur_rows

set rowcount 0

方法二

"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

  1、对于第一种重复,比较容易解决,使用

select distinct * from tableName

  就可以得到无重复记录的结果集。

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

select distinct * into #Tmp from tableName

drop table tableName

select * into tableName from #Tmp

drop table #Tmp

  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

select identity(int,1,1) as autoID, * into #Tmp from tableName

select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID

select * from #Tmp where autoID in(select autoID from #tmp2)

  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

(四)查询重复

select * from tablename where id in (
select id from tablename
group by id having count(id) > 1)

More »
FreeBSD下配置SSH登陆远程主机
Sat, 13 Dec 2008 16:53:11 +0800
  1.什么是SSH
  传统的网络服务程序,如:ftp、POP和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以 截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到"中间人"(man-in-the-middle)这种方式的攻 击。所谓"中间人"的攻击方式,就是"中间人"冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送 被"中间人"一转手做了手脚之后,就会出现很严重的问题。

  通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,虽然许多人把Secure Shell仅当作Telnet的替代物,但你可以使用它来保护你的网络连接的安全。你可以通过本地或远程系统上的Secure Shell转发其他网络通信,如POP、X、PPP和FTP。你还可以转发其他类型的网络通信,包括CVS和任意其他的TCP通信。另外,你可以使用带 TCP包装的Secure Shell,以加强连接的安全性。除此之外,Secure Shell还有一些其他的方便的功能,可用于诸如Oracle之类的应用,也可以将它用于远程备份和像SecurID卡一样的附加认证。



  2.SSH的工作机制
  SSH分为两部分:客户端部分和服务端部分。

  服务端是一个守护进程(demon),他在后台运行并响应来自客户端的连接请求。服务端一般是sshd进程,提供了对远程连接的处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接。

  客户端包含ssh程序以及像scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。

  他们的工作机制大致是本地的客户端发送一个连接请求到远程的服务端,服务端检查申请的包和IP地址再发送密钥给SSH的客户端,本地再将密钥发回给服务端,自此连接建立。刚才所讲的只是SSH连接的大致过程,SSH 1.x和SSH 2.x在连接协议上还有着一些差异。

  SSH被设计成为工作于自己的基础之上而不利用超级服务器(inetd),虽然可以通过inetd上的tcpd来运行SSH进程,但是这完全没有必要。启动SSH服务器后,sshd运行起来并在默认的22端口进行监听(你可以用 # ps -waux | grep sshd 来查看sshd是否已经被正确的运行了)如果不是通过inetd启动的SSH,那么SSH就将一直等待连接请求。当请求到来的时候SSH守护进程会产生一个子进程,该子进程进行这次的连接处理。

  但是因为受版权和加密算法的限制,现在很多人都转而使用OpenSSH。OpenSSH是SSH的替代软件,而且是免费的,

  SSH是由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x和2.x。用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。



  3.安装使用OpenSSH
这里主要讲的是基于FreeBSD的OpenSSH的配置,其它Unix及派生系统使用OpenSSH的方法大致相同FreeBSD中集成了 OpenSSH,在很多Linux的发行版中都没有包括OpenSSH。但是,可以从网络上下载并安装OpenSSH,他是完全免费的。(可以访问 OpenSSH的主页 http://www.openssh.org)

  生成密钥对

  使用ssh-keygen来生成密钥对,比如要用DSA加密算法生成一个4096Bit的密钥对可以输入如下命令(具体参数请参阅man ssh-keygen):


#ssh-keygen -b 4096 -t dsa


%ssh-keygen -b 4096 -t dsa



Generating public/private dsa key pair.
Enter file in which to save the key (/home/lewphee/.ssh/id_dsa):


(密钥对将要存的路径,括号内为默认)
Created directory '/home/lewphee/.ssh'.
Enter passphrase (empty for no passphrase):
(输入口令)
Enter same passphrase again:
(再次输入口令,千万不要忘记否则就只有从新生成密钥了)
Your identification has been saved in /home/lewphee/.ssh/id_dsa.
(你的私钥)
Your public key has been saved in /home/lewphee/.ssh/id_dsa.pub.
(你的公钥)
The key fingerprint is:
ba:1f:f5:2c:fa:92:a0:23:ab:7e:44:65:e5:24:c6:e5 lewphee@freebsd


密钥分发

  刚才生成了一对密钥,把私钥放在自己的机器上的~/.ssh/目录下并保证访问权限是"-rw-------"(即600)。再把生成的公钥放在要连接的远程主机的~/.ssh/目录下并改名为authorized_keys,并且保证文件除了属主外没有被人修改的权限。



4.配置使用SSH

  配置服务端

启动SSH服务端很简单只需要运行
# sshd

就可以了。或者在/etc/rc.conf中加入
sshd_enable="YES"
就可以在每次启动时自动运行SSH服务端了。
SSH服务端的配置使用的配置文件是"/etc/ssh/sshd_config",并且OpenSSH1.x和2.x的服务器配置文件均为此文件。

  配置客户端

客户端想连接远程服务器只需要输入
#ssh 域名(或ip)
就可以了

windows下想使用ssh功能可以使用secureCRT进行远程连接。
More »
在PHP上使用UTF-8
Sat, 13 Dec 2008 16:51:42 +0800
  不单是PHP,在其它的页面上是也类似的方法。先前我在网上查资料的时候,看过一篇文章,说他的PHP不经处理就直接输出了,这实在是对UTF-8的误会。

  引起上述情况是,那PHP页面根本不是UTF-8的,而是UNICODE,可能那人以为,UTF-8就是UNICODE了。UNICODE是4个字节的东西,UTF-8只3个而已,不执行就输出也不奇怪了。

  1.把页面转成UTF-8先,用UE或其它的工具都行。

  2.META头charset=utf-8

  3.如果是Mysql的话,还要在最初执行:mysql_query("SET NAMES utf-8;");
More »
钗头凤
Sat, 13 Dec 2008 16:41:25 +0800
红酥手,黄藤酒,满城春色宫墙柳;

东风恶,欢情薄,

一怀愁绪,几年离索,

错、错、错。

春如旧,人空瘦,泪痕红邑鲛绡透;

桃花落,闲池阁,

山盟虽在,锦书难托,

莫、莫、莫

世情薄,人情恶

雨送黄昏花易落

晓风干,泪痕残

欲笺心事,独语斜阑

难!难!难!

人成各,今非昨

病魂常似秋千索

角声寒,夜阑珊

怕人寻问,咽泪装欢

瞒,瞒,瞒

背景:
  陆游是在沈园写下这首著名的《钗头凤》的。沈园位于绍兴东南。

  故事的发生是这样的:
  公元1155年(南宋高宗绍兴二十五年),陆游在家乡山阴(今绍兴)闲居,一个宜人的好春天气,他偶然到城南沈园游玩,不期和前妻唐琬在园中相遇。
  唐琬是陆游母亲的甥女,也就是陆游的表妹。
  据周密《齐东野语》卷一、陈鹄《耆旧续闻》卷十以及刘克庄《后村诗话续集》卷二等书的记载,陆游初娶表妹唐琬为妻,夫妻间感情一直很好,在小两口的心中,都以为可以偕老百年。不料世事无常,也不知是什么原因,陆游的母亲很不喜欢这个甥女兼媳妇的唐琬,并且事情越闹越僵,婆媳的感情竟然逐步恶化到不可收拾的地步。终于婆婆一怒之下,逼迫陆游休了唐琬。陆游另娶,唐琬也改嫁赵士程。
  在沈园偶遇唐琬时,陆游已经三十一岁,并且已是三个孩子的父亲。唐琬是同丈夫赵士程一起来沈园游玩的,也未曾想会在这种情况下再见陆游,当时三人一定非常尴尬。应该是出于礼貌吧,唐琬遣仆人致送酒肴给陆游,陆游心中非常凄苦,前思后想,辛酸难当,挥笔在沈园壁上题下这首《钗头凤》。后来唐琬看到了这首词,也和了一首。唐琬的和词是:"世情薄,人情恶,雨送黄昏花易落。晓风干,泪痕残。欲笺心事,独语斜栏。难!难!难! 人成各,今非昨,病魂常似秋千索。角声寒,夜阑珊。怕人寻问,咽泪装欢。瞒!瞒!瞒!"不久便郁郁而逝。
  陆游一直没有忘记这位无辜被弃、郁郁早逝的妻子。在他的诗集里,曾再三提到沈园的那次最后会面,表示难以消释的悲痛。直到他八十四岁,也就是去世的前一年,还在一首《春游》诗中提到这次偶遇和死别。
  "红酥手,黄縢酒,满城春色宫墙柳。"这是陆游对新婚不久一段美好生活的回忆。
  那是一个明媚的春日,夫妻二人共同出游赏春,在宫墙旁,在柳荫下,摆开酒菜,坐下小酌。她有着怎样的一双红润细软的手啊,捧着满满一杯黄縢酒。那神情,无限欢娱;那姿态,无比娇美。袅娜的柳丝轻拂宫墙,满城的春色,满目的好景,满心的幸福。这面画,定格在陆游的眼中,定格在陆游的心底。
  谁成想,这种美好生活竟是那样短暂!繁华易逝,好景难留。刚才还是满城的春色,转眼之间,东风恶吹,把一切美好欢情,都吹得灰飞烟灭,只剩下"一怀愁绪",空叹息"几年离索"。夫妻俩落得如此不幸的结局,当然不是事先所能预料的。但为什么当时没有把各种因素都考虑清楚,就匆匆忙忙结下这段姻缘呢?为什么婆媳关系会越弄越糟,终至不可收拾呢?为什么没能劝说母亲收回成命呢?为什么没能违背母命而坚持在一起呢?......他心里万分痛苦又实在无法解答,只有一迭声的长叹:"错!错!错!"
  画面又转到现在:"春如旧,人空瘦,泪痕红浥鲛绡透。"这几句是写唐琬,也是陆游眼中所见的前妻形象。依然是美丽可爱的春天,可她却比从前憔悴消瘦了许多。这几年,她的心情显然是非常不好过,想必常常追思前事,泪湿罗帕。"鲛绡",手帕的代称,它常是男女间赠送的信物。"春如旧",呼应上文"满城春色"。"人空瘦"呼应上文"红酥手"。行文针线细密,不可不知。
  "桃花落,闲池阁。山盟虽在,锦书难托。"这几句写出陆游此时此地的心情。灼灼桃花转眼凋零,亭台池阁瞬间冷落。从前的山盟海誓,仿佛还回响在耳边。可如今,竟然连托人捎一封信给她也变成不可能了。徘徊在沈园的春色里,眼看着唐琬遣人送来的酒食,曾经的爱侣已是他人之妻,曾经的娇妻竟成憔悴的怨妇......陆游心里便纵有千种情愁,万般牵挂,最终也只能一迭声的长叹:"莫!莫!莫!"不行!不行!不行啊!封建礼教的威权是厉害的,你想公然触犯它,不单要冒着丧失生命的危险,还要冒着丧失生命以外的诸如名誉等东西的危险。陆游是没有这个勇气的,他只有用自己的笔,将愁苦,将牵挂,诉之于诗,诉之于词,也算是对以母亲为代表的封建礼教的一种控诉吧。
More »
在世界中心呼唤爱
Sat, 13 Dec 2008 16:37:30 +0800
  日本2003年度第一畅销书,我在2004年的时候读的。当时的感觉是这本书的写作风格有点像《挪威的森林》。不过我现在怀疑是译者林少华的风格。

  刚开始我是挺惊讶的。本书的唯美与触动,只有在读了之后才感觉到。阿朔真是可怜,我一度这样想。后来,过不久,我又觉得阿朔是幸福的了。在通往天国的路上,亚纪并没有让阿朔失望过,也始终自信地在阿朔的面前。

  "我们的人生或许也是同样,好几年后我这样想道。一个人活着的人生,感觉上漫长而又枯燥;而若同喜欢的人在一起,一忽儿就来到岔路口。"

去看看吧:新浪读书频道

在世界中心呼唤爱
More »
fcitx settings
Thu, 04 Dec 2008 19:44:20 +0800

vi /$HOME/.xinitrc

setenv XMODIFIERS @im=fcitx
setenv LANG zh_CN.eucCN
setenv LC_CTYPE zh_CN.eucCN
LANG=zh_CN.eucCN
LC_ALL=zh_CN.eucCN
export LANG LC_ALL
export XMODIFIERS=@im=fcitx
fcitx&
startkde

REMARKS:
this is the settings in KDE, you need to do appropriate modify in GNOME enviroment.

More »
Using SSL with Apache in Win32
Thu, 04 Dec 2008 19:41:28 +0800

SSL is a safely way to visite the specifically site. The following is guide you to setting the SSL enviroment with Apache.

Notation:
THIS GUIDE NOT FOR OFFICIAL, AND, IT PASS BY APACHE 2.X, THE OTHER VERSION OF SERVER SOFTWARE IS NOT WARRANTABLE.

1. Get the mod_ssl at:
http://hunter.campbus.com/

2. Copy the following files into it's own folder:
./modules/mod_ssl.so
./conf/ssl.conf
./conf/ssl.default.conf
./bin/libeay32.dll
./bin/ssleay32.dll

3. Add the Following into httpd.conf
Listen 80

#SSL Port
Listen 443

#Load Module
LoadModule ssl_module modules/mod_ssl.so

# see http://www.modssl.org/docs/2.4/ssl_reference.html for more info
SSLMutex default
SSLRandomSeed startup builtin
SSLSessionCache none
ErrorLog logs/ssl.log
LogLevel info
# You can later change "info" to "warn" if everything is OK

<VirtualHost *:443>
SSLEngine On
SSLCACertificateFile conf/ca.crt
SSLCertificateFile conf/server.crt
SSLCertificateKeyFile conf/server.key
SSLVerifyClient require
SSLVerifyDepth 1
DocumentRoot H:\www\pursung
ServerName my.pursung.com
</VirtualHost>


4. Using OpenVPN create The crt file, key file and C.A files.
this section please refer to the correlation documents.

More »
Tags
Recent Post
Recent Comments
Links
Copyright Notes
You can reship all of these articles without permission but MUST mark the original link in your post. Please contact with me() if u have advice or other arrangements.
Copyright©2007-2011 lewphee.com All rights reserved.