作者归档:℃冻番茄

自动从标题中提取关键词及ajax输入提示

公司网站正在新做的一个功能

考虑到最近blog里没写什么新的东西就把这段代码贴一下

test.html

XML/HTML代码
  1. <html>  
  2. <head>  
  3. <title>自动从标题中提取关键词及ajax输入提示</title>  
  4. <script src="js/jquery.js" type="text/javascript" charset="utf-8"></script>  
  5.   <link href="css/global.css" rel="stylesheet" type="text/css" />  
  6. </head>  
  7. <body style="padding:20px;">  
  8. <form id="form1" name="form1" method="post" action="javascript:;">  
  9.    标题:<input type="text" name="title" id="title" />  
  10.   <label>  
  11.  <input type="submit" name="button" id="button" value="提交" onclick="sendTitle()"/>  
  12.   </label>  
  13. <input name="add" type="hidden" id="add" value="add" />  
  14. </form>  
  15. <br>  
  16.   企业:<input type="text" name="key" id="key" onkeyup="showKey()"/>  
  17. <input type="hidden" name="keys" id="keys" value="">  
  18. <style>  
  19. #showBox{overflow:auto;width:250px;border:1px solid #eee;height:100px;margin-top:10px;}   
  20. div{padding:3px;}   
  21. </style>  
  22. <div id="showBox"></div>  
  23.   
  24.   
  25. <script type="text/javascript">  
  26. function sendTitle(){   
  27.     if($("#title").val()==”){   
  28.         alert("标题不能为空");   
  29.     }else{   
  30.         $.post("?index/test/sendtitle",{title:$("#title").val()},function(data){   
  31.             var html="";   
  32.             for(var i = 0; i < data.length; i++){   
  33.                 html+="<div>"+data[i].companyid+" | "+data[i].c_name+"</div>"   
  34.             }   
  35.             $("#showBox").html(html);   
  36.             $("#key").val($("#title").val());   
  37.             $("#keys").val($("#title").val());   
  38.                
  39.         },"json");   
  40.     }   
  41. }   
  42.   
  43. function showKey(){   
  44.     var key=$("#key").val();   
  45.     var keys=$("#keys").val();   
  46.     if(key!=keys){   
  47.         $.post("?index/test/sendtitle",{title:key},function(data){   
  48.             var html="";   
  49.             for(var i = 0; i < data.length; i++){   
  50.                 var ii2=i+1;   
  51.                 html+="<div>"+i2+" | "+data[i].c_name+"</div>"   
  52.             }   
  53.             $("#showBox").html(html);   
  54.             $("#keys").val(key);   
  55.         },"json");   
  56.     }   
  57. }   
  58.   
  59. </script>  
  60.   
  61. </body>  
  62. </html>  

 

php处理部分:

 

PHP代码
  1. <?php   
  2. class box   
  3. {   
  4.     public function __construct($db)   
  5.     {   
  6.         $this->db=$db;   
  7.     }   
  8.   
  9.     //读出全部的企业关键词,用于处理标题,提取标题中对应有关的企业列表   
  10.     public function readCompanyKey($cachetime=3600*24) //关键词库的缓存时间默认为一天   
  11.     {   
  12.         global $ROOT_PATH;   
  13.         $file=$ROOT_PATH.‘/temp/CompanyKey.inc’;   
  14.         if(!file_exists($file)){   
  15.             $this->writeCompanyKey();   
  16.         }else{   
  17.             if(time()-filemtime($file)>$cachetime){   
  18.                 $this->writeCompanyKey();   
  19.             }   
  20.         }   
  21.         $row=unserialize(file_get_contents($file));   
  22.         return $row;   
  23.     }   
  24.        
  25.     //缓存全部的企业关键词库   
  26.     public function writeCompanyKey()   
  27.     {   
  28.         global $ROOT_PATH;   
  29.         $file=$ROOT_PATH.‘/temp/CompanyKey.inc’;   
  30.         $rs=$this->db->query("select * from `companykey`");   
  31.         $row = $rs->fetchall(PDO::FETCH_ASSOC);   
  32.            
  33.         $content=serialize($row);   
  34.         $fs=fopen($file,‘w’);   
  35.         if(fwrite($fs$content) === FALSE) {   
  36.             echo "不能写入到文件!请注意temp文件夹的读写权限";   
  37.             exit;   
  38.         }else{   
  39.             return true;   
  40.         }   
  41.         fclose($fs);   
  42.     }   
  43.        
  44.     //从标题中通过关键词库获取相关的企业列表   
  45.     public function getComapnyList($title)   
  46.     {   
  47.         $title=strtolower($title);   
  48.         $key=$this->readCompanyKey();   
  49.         //if(count($key)<=0){echo ‘出错,关键词不存在!’;exit;}   
  50.         foreach($key as $v){   
  51.             if(strpos($title,$v[‘key’])!==false){   
  52.                 $companyid[]=$v[‘companyid’];   
  53.                 //echo ‘1’;   
  54.             }   
  55.         }   
  56.            
  57.         //print_r($companyid);   
  58.         if(count($companyid)>0){   
  59.             $companyidArr=$this->listOrder($companyid);  //对获取的企业按权重进行排序,去除重复的企业   
  60.             foreach($companyidArr as $v){   
  61.                 $rs=$this->db->query("select `companyid`,`c_name` from `company` where `companyid`=’".$v."’ limit 1");   
  62.                 $row = $rs->fetchall(PDO::FETCH_ASSOC);   
  63.                 $list[]=$row[0];   
  64.             }   
  65.             return $list;   
  66.         }else{   
  67.             return false;   
  68.         }   
  69.     }   
  70.        
  71.   
  72.     //排序算法,按标题中同一个关键词的出现个数对其所对应的企业进行排序,并去除重复企业   
  73.     public function listOrder($arr){   
  74.         if(!is_array($arr)){   
  75.             return ;   
  76.         }   
  77.         $count=count($arr);   
  78.         $arr2=array_unique($arr);   
  79.         foreach($arr2 as $k=>$v){   
  80.             $i=0;   
  81.             $i2=0;   
  82.             for($l=$i2;$l<$count;$l++){   
  83.                 if($v==$arr[$l]){   
  84.                     $i++;   
  85.                     $s[$k]=$i;   
  86.                     //$s[$k][‘key’]=$i;   
  87.                     //$s[$k][‘var’]=$v;   
  88.                 }   
  89.                 $i2++;   
  90.             }   
  91.         }   
  92.         arsort($s);   
  93.         foreach($s as $k=>$v){   
  94.             $row[]=$arr[$k];   
  95.         }   
  96.         return $row;   
  97.     }   
  98. }   
  99.   
  100. $box=new box($db1);   
  101. if($uri[2]==‘sendtitle’){   
  102.     $title=$_POST[‘title’];   
  103.     $list=$box->getComapnyList($title);   
  104.     echo json_encode($list);   
  105.     exit;   
  106. }   
  107. $smarty->display("index/test.html");   
  108. exit();   
  109. ?>  

效果

qq截图未命名.jpg

 

vi中最最常用的一些命令

命令全部在命令模式下输入 (就是记得输命令时按下ESC键)

保存文件     :w    (注意,前面有:)

强制保存文件 :w!

退出文件但不保存    :q

强制奶出文件但不保存 :q!

保存并退出   :wq  (同理,如果是强制的话,加!)

==================================

在光标所在行插入新行    o      (注意,不是零,是字母o)

在光标前面插入字符     i

在光标后面输入字符      a

删除一行     dd

删除光标所在的字符    x

转到具体的一行    10gg  或是 :10    (10为行号)

转个首行     gg

转个尾行      shift+g

清空全部内容   :%d

清空光标所在行及下面全部行的内容   dG   (注意大小写)

撤销上一步操作     u

重做上一步操作     ctrl+r

搜索查找字符       ?str    或   /str     (str表示要查找的字符)

===========================================

这些是最基本的了,还有像替换之类的比较复杂的就找找vi的全部命令看看

Ubuntu vim 高亮

1、安装vim

       sudo apt-get install vim-full
2、配置文件的位置
在目录 /etc/vim 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
       3、设置语法高亮显示
1) 打开vimrc,添加以下语句来使得语法高亮显示:
syntax on
2) 如果此时语法还是没有高亮显示,那么在/etc目录下的profile文件中添加以下语句:
export TERM=xterm-color
      
       4、设置Windows风格的C/C++自动缩进(添加以下set语句到vimrc中)
              1设置(软)制表符宽度为4
                            set tabstop=4
                            set softtabstop=4
              2设置缩进的空格数为4
                          set shiftwidth=4
              3设置自动缩进即每行的缩进值与上一行相等;使用 noautoindent 取消设置:
set autoindent
              4设置使用 C/C++ 语言的自动缩进方式:
                          set cindent
              5)设置C/C++语言的具体缩进方式
                            set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
              6)如果想在左侧显示文本的行号,可以用以下语句:
                          set nu
              7)最后,如果没有下列语句,就加上吧:
if &term=="xterm"
set t_Co=8
             set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif

一下由网友kongove提供:

colorscheme elflord
"colorscheme darkblue
"colorscheme evening
"colorscheme murphy
"colorscheme torte
"colorscheme desert
这些事提供的一些配色方案,自选一种就很漂亮了~

 

22.jpg

解读 QQWry.Data ——IP地址库文件数据 [转自PHPCHINA 作者:terry39]

解读 QQWry.Data ——IP地址库文件数据

按项目计划,最近要实现用户IP地址到所在地址区域的转换,这里不仅只是解读出地区文字,还需要对应原有的地区数据;所以要把地区代码(机构组织码)与IP地址建立对应关系。我选择纯真版IP地址库来建立对应关系表。

从网上下载了最新的 QQWry.Data 库文件,首先碰到的一个问题是解析这个文件。根据网上的资料(LuamaQQ作者写的日志),根据自己的摸索,总结出了此文件的内容结构,以及解读方式。

一、文件结构
文件主要分三个结构
1、文件头,8个字节;
2、数据记录区,不定长度;
3、索引区,长度为 7 的整数倍;

二、文件头
文件头的8个字节分两部分,每个部分4个字节,分别指定了索引区的开始地址和结束地址。所以可以通过两个地址的差值 除 7 后 加 1 可以计算出总的记录数。

二、记录区
记录区的数据需要通过索引区的数据来获得各个数据的起始位置;本区数据记录了IP地址的结束地址和地区字符串;所有地区字符串都以 0x00 为结束。

三、索引区
检索IP对应的地区,关键就是找到IP起始地址对应的索引内容。一个IP索引数据包含7个字节,前4个字节是IP地址起始值,后3个字节是对应的IP数据记录在文件内的偏移地址;IP数据记录中,前 4 个字节是IP结束地址;紧跟的数据有两种模式: 0x01 模式 和 0x02 模式。

0x01模式,即在IP数据的第5个字节是 0x01,则在后面的 3 个字节是国家地区数据的偏移地址;国家地区数据包括国家和地区这两个字符串。即
—————————————————————
4字节 |  3字节 重定向 0x NN NN NN -> 国家地区数据的文件偏移地址
—————————————————————

0x02模式,即在IP数据的第5个字节是 0x02,则在后面的 3 个字节是国家数据的偏移地址,地区数据是再往后的字符串,以 0x00 截至。即
—————————————————————————–
4字节 | 3字节 重定向 0x NN NN NN -> 国家数据的文件偏移地址 | 地区字符串 | 0x00
—————————————————————————–

对于 0x01 模式所得到的 国家地区数据中,它可能又带有一个重定向结构,即
————————————–
国家字符串 | 0x00 | 地区字符串 | 0x00
————————————–

————————————————————————-
国家字符串 | 0x00 | 0x02 | 3字节 0x NN NN NN -> 地区字符串的文件偏移地址
————————————————————————-

对于前一种情况,比较简单,直接读出两个字符串数据就可以了;对于后一种情况,需要再次重定向到地区字符串的偏移地址,然后读取到 0x00 为字符串结尾。

对于这种采取地址映射实际字符串值的方式,主要作用是避免重复记录字符串值。在整个IP地址库文件中,有太多相同字符串记录了,采用 3 字节的映射地址要比重复记录字符串值节省太多空间了。

PHP代码
  1. <?php   
  2. function bin2ip($bin)   
  3. {   
  4.     $ip = ;   
  5.     $bd = str_split($bin, 1);   
  6.     for($i = 4; $i > 0; $i–){   
  7.         $ip .= "." . sprintf("%03d", implode(, unpack(‘s’$bd[$i-1] . chr(0))));   
  8.     }   
  9.     return substr($ip, 1);   
  10. }   
  11.   
  12. //————————————————–   
  13.   
  14. $f = fopen(‘QQWry.Dat’‘r’);   
  15.   
  16. $c = fread($f, 4);   
  17. $d = fread($f, 4);   
  18.   
  19. $index_begin = implode(, unpack(‘L’$c));   
  20. $index_end   = implode(, unpack(‘L’$d));   
  21. if($index_begin < 0) $index_begin += pow(2, 32);   
  22. if($index_end   < 0) $index_end   += pow(2, 32);   
  23.   
  24. $ip_num = ($index_end – $index_begin) / 7 + 1;   
  25.   
  26. echo "index begin at: $index_begin\n";   
  27. echo "index end   at: $index_end\n";   
  28. echo "ip data count : $ip_num\n";   
  29.   
  30. $output = ;   
  31.   
  32. for($i = 0; $i < $ip_num$i++){   
  33.   
  34.     //文件指针指到每个IP数据文件的索引取得索引数据(7字节)上   
  35.     fseek($f$i * 7 + $index_begin);   
  36.     $ip4 = fread($f, 4);                //IP起始地址   
  37.     if(strlen($ip4) < 4) exit(‘data file error’);   
  38.   
  39.     $ip3 = fread($f, 3);                //IP记录偏移地址   
  40.     if(strlen($ip3) < 3) exit(‘data file error’);   
  41.   
  42.     $dataseek = implode(, unpack(‘L’$ip3 . chr(0)));   
  43.     if($dataseek < 0) $index_ip_record += pow(2, 32);   
  44.   
  45.     //指向记录区 $dataseek 位置查找记录   
  46.     fseek($f$dataseek);   
  47.     $ipdata = fread($f, 4);                //IP结束地址   
  48.     if(strlen($ipdata) < 4) exit(‘data file error’);   
  49.        
  50.     $area = ;   
  51.     $country = ;   
  52.   
  53.     //读一个标记位   
  54.     $flag = fread($f, 1);   
  55.     if($flag == chr(1)){                //国家名偏移标记位    模式一 0x01   
  56.         $area1seek = fread($f, 3);   
  57.         if(strlen($area1seek) < 3) exit(‘data file error’);   
  58.         $area1seek = implode(, unpack(‘L’$area1seek . chr(0)));   
  59.         fseek($f$area1seek);   
  60.   
  61.         $flag = fread($f, 1);            //可能又是标记位   
  62.            
  63.            
  64.     }   
  65.     if($flag == chr(2)){                //国家地区 重定向   
  66.         $area1seek = fread($f, 3);   
  67.         if(strlen($area1seek) < 3) exit(‘data file error’);   
  68.         $area1seek = implode(, unpack(‘L’$area1seek . chr(0)));   
  69.   
  70.         $flag = fread($f, 1);   
  71.         if($flag == chr(2)){   
  72.             $area2seek = fread($f, 3);   
  73.             $area2seek = implode(, unpack(‘L’$area2seek . chr(0)));   
  74.             fseek($f$area2seek);   
  75.         }else{   
  76.             fseek($f, -1, SEEK_CUR);   
  77.         }   
  78.         while(($c = fread($f, 1)) != chr(0)) $area .= $c;   
  79.            
  80.         fseek($f$area1seek);   
  81.         while(($c = fread($f, 1)) != chr(0)) $country .= $c;    
  82.     }else{   
  83.         fseek($f, -1, SEEK_CUR);   
  84.         while(($c = fread($f, 1)) != chr(0)) $country .= $c;    
  85.   
  86.         $flag = fread($f, 1);        //如果地区是重定向的   
  87.         if($flag == chr(2)){   
  88.             $area2seek = fread($f, 3);   
  89.             $area2seek = implode(, unpack(‘L’$area2seek . chr(0)));   
  90.             fseek($f$area2seek);   
  91.         }else{   
  92.             fseek($f, -1, SEEK_CUR);   
  93.         }   
  94.   
  95.         while(($c = fread($f, 1)) != chr(0)) $area .= $c;   
  96.     }   
  97.     $adata = trim($country) . trim($area); //$country是国家字符串 , $area 是地区字符串   
  98.   
  99. }   
  100.   
  101.   
  102. fclose($f);   
  103. ?>   

Ubuntu 单网卡架设VPN并NAT共享上网办法

服务器使用shorewall作为防火墙,实际上shorewall只是作为iptables的一个配置程序而已,实际上防火墙还是iptables;
首先是建立VPN,使用软件包PPTPD,这样做的好处是方便认证,也支持windows,安全性不如openvpn,但是简单实用;

 

服务器环境:
OS:ubuntu server 8.04.1
firewall: shorewall
IP:192.168.2.100
安装:

sudo apt-get install pptpd

修改配置文件:/etc/pptpd.conf

修改localip  remoteip

localip 192.168.250.1
remoteip 192.168.250.234-238,192.168.250.245

这里随便找了个IP段localip相当于拨号后的服务器地址,可以写成本机IP,或者和remoteip的IP段相同的一个IP地址

remoteip是客户机分配的IP段,这里分配了12个IP地址,也就只允许12个机器同时通过VPN连接,再增加就不能分配到IP地址了

修改配置文件:/etc/ppp/chap-secrets

这个文件里面设置登陆用的账号密码等信息

设置格式是:

# client        server  secret                  IP addresses

abc       *            123456

第一个是用户名  然后是服务器地址   然后是登陆所用的密码  最后是为客户拨号后分配的IP地址,不指定的话就是系统自动分配

以上过程之后,咱的PPTPD就配置好了哈

由于服务器采用了shorewall防火墙,需要开放端口1723,47和gre协议

编辑/etc/shorewall/rules

增加:

ACCEPT          net             $FW             gre
ACCEPT          net             $FW             tcp     1723
ACCEPT          net             $FW             tcp     47

然后重启下shorewall:

sudo shorewall restart

开始测试在windows上VPN拨号吧

windows下VPN连接建立方法就不多说了哈

OK,测试VPN可以拨通了,但是还不能通过服务器的网络连接互联网,可能你会发现,除了访问服务器,其他你什么都干不了

下面来做NAT,不过这个地方我也没做得很好,还有点缺陷,希望以后能解决这个问题

拨通VPN后,在服务器上使用ifconfig可以看到多了一个PPP*的网络连接,例如我这里是ppp0

做NAT我也使用shorewall来做

修改/etc/shorewall/interface

增加:

ppp0   ipv4

修改/etc/shorewall/zones

增加:

ppp    ppp0

修改/etc/shorewall/masq

增加:

eth0                    ppp0

OK,然后重启shorewall

sudo shorewall restart

NAT配置好了

这里要注意的是ppp0一定要存在,否则shorewall要报错,这个就是shorewall不足的地方了,不够灵活。

如果你不用shorewall 防火墙,直接使用iptables指令进行dnat操作,就不会因为没有ppp0连接而报错了。

关注了几天国外的vps,今天出手了,先买一个月试用

配置有点低,但对于只是学习或是小流量网站放放还是不错的,
硬盘:1G (做个系统加php环境就用旧了350m)
内存:384 M (max从面板上看的,min就不清楚了,面板上没标)
IP数:1
流量:75G/月
节点:524288  (文件和文件夹的总个数,装完全部的系统环境才用20000多)
备份:2  (可以在线做二次备份)

 

IP地址:74.63.91.170

国内ping vps的速度平均在230ms左右(ping了一个下午) 对于国外服务器来说速度还是不错的!

关键是价格非常便宜  $3.5/mo (也就二十多块钱一个月,这个价格是国内是想都不用想的!)

以后有需要的话还可以非常方便的进行方案升级!

给大家贴个地址:http://www.vpsrepublic.com (就三个方案 $3.5/mo  $5.5/mo  $9.5/mo 都挺便宜)

都是美元购买,记得要有一张国际信用卡才能支付。。

还有swvps的$9.9/mo方案,10G硬盘 2个IP地址 250G流量 400-600M的内存 这个买一年的话是$99.9 价格还行 速度据说在国外的vps中是数一数二的 ping 的值基本在200ms左右
http://www.swvps.com/linux-vps.html

 

可选装的系统有:

centos-5-i386-afull (304.28MB) 
centos-5-i386-cpanel (2665.59MB)
centos-5-i386-hostinabox571 (2279.81MB)
cern-4-x86_64-minimal (135.65MB)
debian-4.0-i386-minimal (134.91MB)
fedora-9-i386-default (427.88MB) 
fedora-core-5-i386-afull (319.8MB) 
fedora-core-6-i686-default (415.64MB) 
 fedora-core-7-ut (445.63MB)
gentoo-20060317-i686-stage3 (317.3MB) 
gentoo-openvz-i686-2008.08.26 (384.61MB) 
opensuse-10-i386-default (282.33MB) 
ubuntu-6.06-i386-minimal (155.74MB) 
ubuntu-8.04-i386-minimal (121.18MB) 

可选系统比较多,非常适合新手拿来练习用,弄坏了。直接Rebuild一下,相当于重装系统了!只要花几秒钟就好了,但数据得备份好

我用了centos debian ubuntu 最后学是选了ubuntu 8.04版,ubuntu用得比较熟,其实centos也是不错的选择只是安装后占用的硬盘比较大,所以就不选了,用ubuntu安装php apache mysql等软件,最后占用硬盘容量才360m 内存占用160m!

下面发几张截图:

 

tt1.jpgtt2.jpgtt3.jpgtt4.jpgtt5.jpg