8-24
Monday
标签
梦涛笔记

mysql 实现按相似度来排序

MySQL 发布时间:2025-03-14 13:42:14

select *from (select *, case when words like ‘%dog%’ then 1
when words like ‘%og%’ then 2
when words like ‘%g%’ then 3
when words like ‘%o%’ then 4 end as rn
from test
where words like ‘%dog%’ or words like ‘%og%’ or words like ‘%g%’ or words like ‘%o%’ ) as k
order by rn;

CentOS里Apache强制UTF-8乱码的解决

CentOS Apache 发布时间:2025-03-14 13:41:19

之前的网页都是gb2312编码格式的,每个页面都带有HTML的meta标签说明本页使用的是gb2312编码(DW自带的那段代码)。结果用Firefox、IE、Opera三个浏览器访问都是乱码。这简直太奇怪了!明明我浏览器里编码是选择的“自动选择”的,按道理来说浏览器应该读取HTML页面的meta标签,按照GB2312编码显示网页,可是这些浏览器都无一例外的自动选择了UTF-8!查看网页源代码,HTML的meta头还是标记的charset=gb2312,并没有变成utf-8。奇怪了,难道是CentOS的Apache强制将网页编码改成了UTF-8?

抱着这样一种心态,跑到搜索引擎上一查询,嘿,还真有这样的情况。部分VPS提供的CentOS默认是开启了强制将页面编码转换成UTF-8的功能的。一旦开启了此功能,不管HTML中原来的meta标签中的charset,浏览器将会一律以UTF-8形式渲染,于是导致了乱码的产生。

知道原因就好办了,这是Apache的一个参数“AddDefaultCharset”导致的。我们来更改下Apache的配置文件,让这个参数变为OFF即可。

输入:

#vim /etc/httpd/conf/httpd.conf
找到原来的
AddDefaultCharset UTF-8
将它改为
AddDefaultCharset OFF

输入wq保存并退出vim后,使用重载命令或者重启Apache即可生效,这里我选择了重启Apache:

#/etc/init.d/httpd restart

再到浏览器中浏览网页,一切正常,问题解决!

mysql中的 skip-name-resolve 问题

MySQL 发布时间:2025-03-14 13:38:31

今天早上开发那边发现mysql连接很慢,登陆到服务器上查看服务器日志都是正常的,无可疑记录,刚刚还好好的,怎么突然出现这个问题,于是登陆到mysql服务器上,查看下进程,发现有很多这样的连接:
218 | unauthenticated user | 192.168.10.6:44500 | NULL  | Connect | NULL | login | NULL
219 | unauthenticated user | 192.168.10.6:44501 | NULL  | Connect | NULL | login | NULL  
……..

原因是由于mysql对连接的客户端进行DNS反向解析。
有2种解决办法:

1,把client的ip写在mysql服务器的/etc/hosts文件里,随便给个名字就可以了。
2,在 my.cnf 中加入 –skip-name-resolve 。

对于第一种方法比较笨,也不实用,那么 skip-name-resolve 选项可以禁用dns解析,但是,这样不能在mysql的授权表中使用主机名了,只能使用IP。
我理解mysql是这样来处理客户端解析过程的,
1,当mysql的client连过来的时候,服务器会主动去查client的域名。
2,首先查找 /etc/hosts 文件,搜索域名和IP的对应关系。
3,如果hosts文件没有,则查找DNS设置,如果没有设置DNS服务器,会立刻返回失败,就相当于mysql设置了skip-name-resolve参数,如果设置了DNS服务器,就进行反向解析,直到timeout。
有一点不明白,为什么连接mysql服务器内网的ip地址也要进行DNS反向解析,而这时候DNS解析返回给mysql的是什么呢?
望高手解答。

PHP 5.5 新增 Generators 特性 yield 标签

PHP 发布时间:2025-03-14 13:36:57

简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,php 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

function xrange($start, $limit, $step = 1)
{
    for ($i = $start; $i <= $limit; $i += $step) {
        yield $i;
    }
}

echo 'Single digit odd numbers: '; /* 注意保存在内存中的数组绝不会被创建或返回 */
foreach (xrange(1, 9, 2) as $number) {
    echo "$number ";
}


Apache2.2整合PHP5.3以上的版本时提示错误Cannot load php5apache2_2.dll into server解决方法

Apache PHP 发布时间:2025-03-14 13:34:09

Apache2.2整合PHP5.3以上的版本时提示错误“Cannot load php5apache2_2.dll into server ”

故障现象:
  在命令符方式下启动Apache时提示错误信息“httpd: Syntax error on line 129 of D:/serviceRoot/Apache2.2/conf/httpd.conf: Cannot load D:/serviceRoot/PHP5.4.3/php5apache2_2.dll into server”,导致Apache无法启动。
  Apache的配置文件D:/Apache/conf/httpd.conf 第129行内容为:
  LoadModule php5_module D:/serviceRoot/PHP5.4.3/php5apache2_2.dll
  注意:其中D:/serviceRoot/PHP5.4.3/php5apache2_2.dll是我安装php的相应路径。Apache为2.2.22版本,php为5.4.3版本。

出现错误的原因:
  在网上查到一位朋友遇到类似情况,并提示根据PHP的安装文件名称“php-5.3.6-Win32-VC9-x86.zip”得知该版本的PHP安装文件是由VC编译完成的,因此如需要运行或调用该PHP压缩包中的相关文件,则需要首先安装VC的运行时环境。如果你的机器没有安装有VC运行时环境,则Apache调用该PHP压缩包中的相关文件时会提示如上错误信息。

解决方法:
  在网上搜索“VC2008可再发行组件”或者是“VC2008运行库”,下载安装后即可解决此故障。

MSG2200-2GE-AC 路由器虚拟服务器内网不能访问

路由 发布时间:2025-03-14 13:33:13

瑞斯康达 MSG2200-2GE-AC 路由器设置虚拟服务器转发时,在外网访问WAN口IP可以正常访问,但在本路由下的终端访问时,转发都不生效。

解决方法如下:

telnet到设备命令行界面中,输入以下命令,需要严格按照命令顺序配置

ena
con ter
address wan01 /创建地址服务名称为wan01
host-address 175.42.92.x /服务地址的ip为内网要访问的公网IP
exit
service fwq1 /创建fwq1
tcp dest 80 source 1 65535
exit
ip nat pool web 192.168.1.8 192.168.1.8 /创建私网服务器地址池
ip nat destination vlan1 any wan01 fwq1 web /创建nat,VLAN1下的any地址访问目的wan01(即175.42.92.x)的这个fwq1服务都去访问私网地址池web
ip nat source vlan1 any any fwq1 interface /创建nat,VLAN1下的any地址访问any目的fwq1的服务都到转到接口模式下
host-address 175.42.92.x 可以改为如下,指定一个网段
net-address xxx.xxx.xxx.xxx/yy IP地址/掩码 此为一个地址段


ROS 限速脚本

ROS 发布时间:2025-03-13 20:15:04
#ROS 5

for myip from 2 to 254 do={/queue simple add name=("限192.168.1." . $myip . "") target-address=("192.168.1." . $myip . "/32") limit-at=0/0 max-limit=5120000/8192000 }
#ROS 6

:for myip from 1 to 254 do={/queue simple add name=("6." . $myip . "") dst=("192.168.6." . $myip . "/32")  max-limit=204800000/30096000 target=0.0.0.0/0 }



Imghash:相似图片搜索的php实现

PHP 发布时间:2025-03-13 20:00:52

前几天看到阮一峰的博客里写到关于相似图片搜索的原理, 里面介绍了Google相似图片搜索的大致原理,主要是从Neal Krawetz博士的LOOKS LIKE IT翻译而来。文章详细的介绍了相似图片搜索处理的相关步骤,并且给出了一个python的实现,由于我对PHP比较熟,所以写了个PHP的版本。
图片相似搜索的简单原理
根据文章里的描述,其实原理比较简单,大致有如下几个步骤:

1、缩小尺寸。将图片缩小到8×8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。

2、简化色彩。将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。

3、计算平均值。计算所有64个像素的灰度平均值。

4、比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。

5、计算哈希值。将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。

这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。

图片相似搜索的PHP实现
原文中给出了一个python版本的实现,代码只有53行。我写了个对应的PHP版本,由于直接是用类写的,所以代码有100行,具体如下:

class Imghash{
	
	private static $_instance = null;
	
	public $rate = 2;
	
	public static function getInstance(){
		if (self::$_instance === null){
			self::$_instance = new self();
		}
		return self::$_instance;
	}
	public function run($file){
		if (!function_exists('imagecreatetruecolor')){
			throw new Exception('must load gd lib', 1);
		}
		$isString = false;
		if (is_string($file)){
			$file = array($file);
			$isString = true;
		}
		$result = array();
		foreach ($file as $f){
			$result[] = $this->hash($f);
		}
		return $isString ? $result[0] : $result;
	}
	public function checkIsSimilarImg($imgHash, $otherImgHash){
		if (file_exists($imgHash) && file_exists($otherImgHash)){
			$imgHash = $this->run($imgHash);
			$otherImgHash = $this->run($otherImgHash);
		}
		if (strlen($imgHash) !== strlen($otherImgHash)) return false;
		$count = 0;
		$len = strlen($imgHash);
		for($i=0;$i<$len;$i++){
			if ($imgHash{$i} !== $otherImgHash{$i}){
				$count++;
			}
		}
		return $count <= (5 * $rate * $rate) ? true : false;
	}
	public function hash($file){
		if (!file_exists($file)){
			return false;
		}
		$height = 8 * $this->rate;
		$width = 8 * $this->rate;
		$img = imagecreatetruecolor($width, $height);
		list($w, $h) = getimagesize($file);
		$source = $this->createImg($file);
		imagecopyresampled($img, $source, 0, 0, 0, 0, $width, $height, $w, $h);
		$value = $this->getHashValue($img);
		imagedestroy($img);
		return $value;
	}
	public function getHashValue($img){
		$width = imagesx($img);
		$height = imagesy($img);
		$total = 0;
		$array = array();
		for ($y=0;$y<$height;$y++){
			for ($x=0;$x<$width;$x++){
				$gray = ( imagecolorat($img, $x, $y) >> 8 ) & 0xFF;
				if (!is_array($array[$y])){
					$array[$y] = array();
				}
				$array[$y][$x] = $gray;
				$total += $gray;
			}
		}
		$average = intval($total / (64 * $this->rate * $this->rate));
		$result = '';
		for ($y=0;$y<$height;$y++){
			for ($x=0;$x<$width;$x++){
				if ($array[$y][$x] >= $average){
					$result .= '1';
				}else{
					$result .= '0';
				}
			}
		}
		return $result;
	}
	public function createImg($file){
		$ext = $this->getFileExt($file);
		if ($ext === 'jpeg') $ext = 'jpg';
		$img = null;
		switch ($ext){
			case 'png' : $img = imagecreatefrompng($file);break;
			case 'jpg' : $img = imagecreatefromjpeg($file);break;
			case 'gif' : $img = imagecreatefromgif($file);
		}
		return $img;
	}
	public function getFileExt($file){
		$infos = explode('.', $file);
		$ext = strtolower($infos[count($infos) - 1]);
		return $ext;
	}
}
require_once “Imghash.class.php”;
$instance = ImgHash::getInstance();
$result = $instance->checkIsSimilarImg(‘chenyin/IMG_3214.png’, ‘chenyin/IMG_3212.JPG’);

如果$result值为true, 则表明2个图片相似,否则不相似。

在实际的相似图片搜索中,算图片的指纹并不是难点,难点而是在怎么从海量的图片指纹里找出与之相似的指纹。


据说。。妹子们对这个姿势毫无抵抗力!!!

情感 发布时间:2025-03-13 19:58:55

image.png

其实天使就在身边,可你却听了恶魔的话

情感 发布时间:2025-03-13 19:58:17

其实天使就在身边,可你却听了恶魔的话

image.png