Akawa

ETY001的博客

转自:http://blog.csdn.net/cy513/article/details/4285579

SIFT/SURF基于灰度图,

一、首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点,再使用二次插值法得到精确特征点所在的层(尺度),即完成了尺度不变。

二、在特征点选取一个与尺度相应的邻域,求出主方向,其中SIFT采用在一个正方形邻域内统计所有点的梯度方向,找到占80%以上的方向作为主方向;而SURF则选择圆形邻域,并且使用活动扇形的方法求出特征点主方向,以主方向对齐即完成旋转不变。

三、以主方向为轴可以在每个特征点建立坐标,SIFT在特征点选择一块大小与尺度相应的方形区域,分成16块,统计每一块沿着八个方向占的比例,于是特征点形成了128维特征向量,对图像进行归一化则完成强度不变;而SURF分成64块,统计每一块的dx,dy,|dx|,|dy|的累积和,同样形成128维向量,再进行归一化则完成了对比度不变与强度不变。

阅读全文 »

转载请注明:土人的国度 » SQL防注入:使用base64构建安全查询

SQL注入,主要是通过加入特殊字符,使用特殊编码将非法SQL语句注入到查询中,并得到返回数据

看到了一些防SQL注入的手段,自己也经过思考总结了一下,得到了一个流程:

1.查询前强制转换输入

对于提交的输入:

特定类型int, date等:进行强制类型转换,如intval, date_create;

字符串一律使用mysql_real_escape_string过滤

有格式的使用正则表达式进行验证

对于不需要模糊查询的字段,建议使用base64编码后再进一步处理并存入数据库,下文详述

阅读全文 »

在参加一个48小时的创客活动时,做了一个应用,用到了html5中的canvas,其中有一个步骤是读取9张图片画在canvas上,我遇到的难题就是onload函数的异步回调问题。最初的部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
function fillJPG(ctx, el , width , height , i){
var img;
for(var i=0;i<MAX;i++){
img = new Image();
img.onload = function(){
ctx.drawImage(img,width*i,0,width,height);
/* console.log(i); */
}
img.src = el[i];
}
}

这个代码中ctx是画布,el是图片url的数组,width和height分别是单张图片的宽和高,同时也可以用于计算坐标和图片大小压缩。
问题出现就是本来应该横向并排出现的9张图片一张都没有出现。把MAX调整为1后,发现,图片显示出来了,就一张,但是位置却出现在了第二张图片应该出现的问题,经过一晚上的调试,发现问题出现在回调函数。回调函数的执行时间是发生在图片载入结束,而循环体的执行是一直的,也就是i是一直在累加的,可以发现的就是i的累加速度快于图片载入的速度,所以,第一张图片载入完成的时候,i已经是1了(在MAX为1的情况下,其实也就是i为MAX了),也就是说图片是出现在了第MAX+1的位置上面了。

尝试过了一些方法,都避免不了这个异步,最终使用递归的方法来实现了这个功能,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
function fillJPG(ctx, el , width , height , i){
var img = new Image();
img.onload = function(){
ctx.drawImage(img,width*i,0,width,height);
i++;
if(i<MAX){
fillJPG(ctx,el,width,height,i);
} else {
return;
}
}
img.src = el[i];
}

This function not exists for mysqli db extension. For Persistent Connections can use p: prefix by hostname at php 5.3.

fix:

function mysqli_pconnect($host, $username, $password, $new_link = false, $port = 0)
{
    if($port)
    {
        mysqli_connect("p:".$host, $username, $password, $new_link, $port);
    }
    else
    {
        mysqli_connect("p:".$host, $username, $password, $new_link);
    }
}

for more infomation:http://us1.php.net/manual/zh/mysqli.construct.php

今天在写程序的时候,发现运算浮点数的时候,总是带着一串随机的小数尾巴,查资料知道,浮点数不能做精确计算,如果要是做精确计算,需要用decimal类型的字段,而不是单精或者双精。

附:http://my.oschina.net/miaoyushun/blog/12684

对于这个问题的发现源于一个计时器程序,先看下这段代码吧。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$s = gettime();
usleep(10000);
$e = gettime();
var_dump($s);
var_dump($e);
echo $e-$s."\n";
function gettime(){
list($sec, $uses) = explode(' ', microtime());
return $sec + $usec;
}
?>

输出结果为:

1
2
3
float(1296098836.2033)
float(1296098836.2135)
0.010126113891602

有没有发现一个很诡异的现象?被减数和减数整数部分是相同的,小数点后都只是四位,
但是这两个数相减之后得出的结果,小数点后的位数却要大于4。
其实想解释也不难,因为被减数和减数的精度都为14,所以为不造成精度损失,所以结果的精度也必须是14位的。

但出现这种现象的根本原因在哪?

所以我去网上逛了逛,看了些东西后,得到了一些启发。所以又写了一段测试代码:

1
2
3
4
5
6
7
8
<?php
ini_set('precision', 14);
$a = 0.3;
$b = 0.1+0.2;
var_dump($a);
var_dump($b);
$a == $b ? print "equals\n" : print "not equals\n";
?>

输出的结果是:

1
2
3
float(0.3);
float(0.3);
not equals

大家是不是感觉很奇怪,两个变量都是浮点型的,都是0.3,为什么不相等呢?

使用序列化函数serialize查看一下两个数的实际值:

1
2
3
4
<?php
echo serialize(0.3)."\n";
echo serialize(0.1+0.2)."\n";
?>

输出结果:

1
2
d:0.299999999999999988897769753748434595763683319091796875;
d:0.3000000000000000444089209850062616169452667236328125;

你会发现这两个数实际上都不是真正的0.3,为什么这样呢?

其实这个问题要追溯到微机原理(也有可能是计算机组成原理,记不清楚是哪一本书了),
这里面讲了计算机是如何用二进制来存储定点小数。大致是这样的:如果用一个字节的长度来表示一个定点小数,
第一位表示小数的符号,0为正,1为负;后面7位表示小数的值,第2位至第8位的位权分别是1/2,1/4,1/8,1/16,1/32,1/64,1/128,
然后用这些权值的和来表示所有的小数。如何表示0.625呢?

这个有固定的算法:

首先,将小数点左侧的整数部分变换为其二进制形式,处理小数部分的算法是将我们的小数部分乘以基数 2,
记录乘积结果的整数部分,接着将结果的小数部分继续乘以 2,并不断继续该过程。

1
2
3
0.625 × 2  =  1.25    1
0.25  × 2  =  0.5     0
0.5   × 2  =  1       1

当最后的结果为1时,结束这个过程。这时右侧的一列数字就是我们所需的二进制小数部分,即 0.101。
这样,我们就得到了完整的二进制形式 0.101 ,按阶展开:1x1/2+0x1/4+1x1/8=0.5+0.125=0.625。

我们上面先的例子比较特殊,这个数只需要三次运算就能够结束。那会不会有无法结束的情况,不难想象,
很多小数根本不能经过有限次这样的过程而得到结 果(比如最简单的0.1)。

但浮点数尾数域的位数是有限的,为此,浮点数的处理办法是持续该过程直到由此得到的尾数足以填满尾数域,
之后对多余的位进行舍入。也就是说,十进制到二进制的变换也并不能保证总是精确的,而只能是近似值。

事实上,只有很少一部分十进制小数具有精确的二进制浮点数表达。再加上浮点数运算过程中的误差累积,
结果是很多我们看来非常简单的十进制运算在计算机上却往往出人意料。这就是最常见的浮点运算的”不准确”问题。

所以,在计算机里表示的浮点数只是一个近似的数,并不是像表示整数那样精确没有偏差。既然它只是一个约数,那么你用精确的==来比较两位不精确的约数就没有太大意义了。如果一定要比较两个浮点数,可以考虑先转换成字符串,然后再去比较。

我在Linux下使用c编写了一段类似的浮点数比较的代码,结果也是不相等的。实际上在所有的语言里都会存在此问题,
因为这是计算机原理所决定的。但也不排除一些语言做了些后期处理,可以直接比较两个浮点数。

以上仅是个人理解,不保证绝对正确,有错误还请多多谅解。

转自:http://blog.csdn.net/cindy9902/article/details/5886355

以前在用MMM管理multi master 作failover是看到过MMM使用read-only选项来控制对其读写角色的分配,当时尝试过加上这个选项,然后对其进行update,insert操作,发现也是可以的。。所以觉得这个选项没有什么实际意义。。。现在想想当时是用管理员的帐户去执行的,肯定是有super权限的,所以才可以进行update和insert操作。

今天在测试过程中也遇到了read-only的问题,发现写操作因为read-only 这个选项的开启,而不能够成功执行。找了下资料,才了解read-only的真正含义和用法:

阅读全文 »

参考:http://forum.ubuntu.org.cn/viewtopic.php?t=296420

使用udev来实现,udev是linux2.6内核以上的功能,read more:/2013/10/22/some-nifty-udev-rules-and-examples.html

具体实现方法:

如实现U盘自动挂载
Vim 11-add-usb.rules

添加如下内容
ACTION!=”add”,GOTO=”farsight”
KERNEL==”sd[a-z][0-9]”,RUN+=”/sbin/mount-usb.sh %k”
LABEL=”farsight”

这个文件中ACTION后是说明是什么事件,KERNEL后是说明是什么设备比如sda1,mmcblk0p1 等,RUN这个设备插入后去执行哪个程序%k是传入这个程序的参数,这里%k=KERNEL的值也就是sda1等。

在/sbin/下创建mount-usb.sh文件添加如下内容
#!/bin/sh
/bin/mount -t vfat /dev/$1 /tmp
sync

修改文件权限为其添加可执行的权限。

这样就实现了U盘的自动挂载,下面附上U盘的卸载规则文件和sd卡的文件

Usb卸载

11-add-remove.rules
ACTION !=”remove”,GOTO=”farsight”
SUBSYSTEM!=”block”,GOTO=”farsight”
KERNEL==”sd[a-z][0-9]”,RUN+=”/sbin/umount-usb.sh”
LABEL=”farsight”

umount-usb.sh
#!/bin/sh
sync
umount /tmp/

需要注意的是rule文件中的一些符号,比如!=和==,在ubuntu下,如果你的符号有问题,文字的显示颜色会是白色的。

转自:http://blog.csdn.net/scutth/article/details/6980758

其中setresuid()具有最清晰的语法:
setresuid()被执行的条件有:
①当前进程的euid是root
②三个参数,每一个等于原来某个id中的一个
如果满足以上条件的任意一个,setresuid()都可以正常调用,并执行,将
进程的ID设置成对应的ID。
例子:
如果ruid=100,euid=0,suid=300
则setresuid(200,300,100)可以执行,因为原来的euid=0.
如果ruid=100,euid=300,suid=200
则setresuid(200,300,100)也可以执行,因为这三个新的id都是原来id中的某一个。
但是setresuid(100,200,400)就不能执行,因为400不等于原来三个id中的任意一个。

setresuid()有个性质,英文名称是all-or-nothing effect,意思是,如果setresuid()
对某一个ID设置成功了,其他的失败了,比如只改变了ruid,suid和euid都改失败了
那么程序会将ruid改回原来的值,即保证要么三个ID都能成功修改,要么三个都没能修改成功。
PS:FreeBSD和Linux支持setresuid,Solaris不支持setresuid,但有自己的实现方式。

阅读全文 »
0%