通过MySql日志恢复丢失的数据

最郁闷的情况是没有备份数据库,但是因为自己的疏忽不小心把数据给删除了,特别是删除了积累很久的数据,那真是想死的心都会有。

不过如果你没有关闭MySql的日志功能,那么还是有补救的方法。前两天就遇到这样一件事,一朋友由于误操作导致公司网站数据几乎全丢,并且之前没有任何备份;我上服务器查看后发现,还好MySql日志全部在(mysql下的var目录下可以看到mysql-bin.0000XX这样的文件,这个就是MySql的日至,这个里面记录了所有之前运行过的SQL语句;没有查询语句)。

既然日志还在,那就算有得救,先将二进制的日志文件转成SQL语句,MySql提供了这样的方法“mysqlbinlog”;方法还提供了–start-date和–stop-date这两个选项来确定开始和结束时间,如果不带这两个参数将恢复日至文件中的所有SQL语句,当然-u,-p,-h,-P这样的基础参数一定会有;因为是误操作导致数据丢失,所以要将结束时间定义在误操作前,不然恢复出来的数据还是和现在一样。以下命令是从bin.000001这个日志中生成2012年1月1日0点到2012年8月1日0点之间的SQL语句,并且存入1.sql中,如果有多个日志文件那就要进行多次这个动作。

cd /usr/local/mysql/bin
mysqlbinlog -uroot -p --start-date="2012-01-01 0:00:00" --stop-date="2012-08-01 0:00:00" /usr/local/mysql/bin.000001 > 1.sql

通过这个命令导出的文件估计大家都能看懂了,就是一些带了注释的SQL语句;有了这个那直接将SQL导入到MySql中即可;这里注意下,因为日至中有那个时间段所有的建库,建表,添加,删除,修改语句,所以最好将数据库恢复到导出时设定的那个开始时间点,这样不会出现语句冲突的问题;当然如果是在已经忘记时间或者有很多数据库,那么就要自己去处理下所有的SQL语句,要么将需要恢复的有关SQL整理好或者解决导入过程中所有的冲突。

这里着重提醒,恢复前一定要对现在的MySql做全面备份,以免产生更大损失

具体的导入数据方法应该就不用过多说了,只要将你导出的所有sql文件全部运行一遍即可。

mysql -uroot -p < 1.sql

PHP基于openCV实现人脸识别

最近公司在做一个面部识别的项目,突然想起来OpenCV也有相关功能,并且还有PHP的扩展;因为OpenCV是开源的,就想到配置起来玩玩。

首先我们下载OpenCV源代码进行编译,首先可以去OpenCV的官方网站(http://opencv.org/)下载最新的版本,我这里下载的是2.4.2版本。

wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.2/OpenCV-2.4.2.tar.bz2
tar -jxvf OpenCV-2.4.2.tar.bz2
cd OpenCV-2.4.2
mkdir release
cd release/
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make && make install

这里我们发现使用了cmake命令,没有的可以先安装下,我是Centos系统,直接yum install cmake

接下来就是安装facedetect的PHP扩展,一样是先到官方网站(http://www.xarg.org/project/php-facedetect/)下载最新的源码包,然后编译安装。

wget https://nodeload.github.com/infusion/PHP-Facedetect/zipball/master
unzip infusion-PHP-Facedetect-4b1dfe1.zip
cd infusion-PHP-Facedetect-4b1dfe1
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

最后就是在php.ini中加入扩展

extension=facedetect.so

保存,重启php或Apache

/etc/init.d/php-fpm restart
/etc/init.d/httpd -k restart

这个PHP的扩展只提供了两个方法,官方网站也有具体介绍

array face_detect(string picture_path, string cascade_file)
int face_count(string picture_path, string cascade_file)

face_detect方法需要带入两个参数,照片和模版文件,输出一个数组,数组中有人脸的坐标和大小
face_count方法同样需要上面两个参数,输出是照片中人脸的数量。

下面是一个简单的例子,找出人脸并切将他框出来(因为要操作图片,所以要用到GD库):

<?php
$face = "pb.jpg";
$faces = face_detect($face, "haarcascades/haarcascade_frontalface_alt.xml");

$image = imagecreatefromjpeg ($face);
$backgroundcolor = ImageColorAllocate($image, 255, 0, 0);
if (is_array($faces)){
        foreach ($faces as $v){
                imagerectangle($image, $v[x], $v[y], $v[x]+$v[w], $v[y]+$v[h], $backgroundcolor);
        }
}
header('Content-type: image/jpeg');
imagejpeg($image);
?>

DEMO地址:http://honglei.net/demo/face.php
有人会问那个模版的XML哪里来,进入前面OpenCV的解压目录,有没有看到一个haarcascades的文件夹,进入,是不是有很多XML文件,你还会发现除了上面提到的脸的模版还有鼻子,眼睛,耳朵的;这些模版都可以用,分别能找出不同的结果,至于哪个模版好,哪个模版不好那就你自己试试看,我测试的结果是haarcascade_frontalface_alt.xml相对较准。
运行上面的PHP会发现找出了所有的脸,但是有个找错了,并且消耗的时间也比较长;要真正将这个大规模应用还需要靠你自己作一定的优化,并且还要了解下找脸的思想。
其实找脸只是看着比较酷,在实际应用中其实也没有啥地方好用的,我能想到的就是辅助生成头像和做一些利用人脸的图片。

另类的用户贡献

一说到用户贡献,一般都会想到UGC(User Generated Content),觉得是用户发的文章,用户发的照片,用户发的视频这类用户原创内容。

但是大家也要关注到用户无意间的贡献(也可以所是用户无意间的反馈),比如用户听首歌,看了一个视频都会产生很多的动作,这可能有转移到另外一个领域——“数据挖掘”了,但是我更愿意叫他们是用户贡献,因为这是你所有用户默默作出的贡献。

怎样设计这类“默默的用户贡献”呢?
首先用户明确业务的目标,你的设计不能打断或影响用户使用业务的方式和流程;然后抓住要们所需要的数据重点,通过技术手段采集他们,并且将他们“偷偷”的传回服务器。

“默默用户贡献”的使用?
我们之所以设计这个环节,就是希望这些用户贡献能给我们带来一些东西,所以一定要用好他们,因为这类的用户贡献基数非常大,并且不是可以进行的贡献,存在不确定性,所以需要有很好的统计算法来分析数据。

说到这个案例我现在也还会兴奋,这个是07年在雅虎音乐的时候的一个小设计;当时困扰音乐搜索质量的有几个方面,歌曲的正确定,歌曲的连通率,是否Spam(其中分成音乐直接跳转到网页,音乐只有一段,音乐中间有广告);这些问题其实都可以通过用户来帮忙搞定。
当时我设计了一个JS的小功能,插入在IE用户(FF没有办法取得某些数据,并且IE用户基数足够大)的音乐播放页面中;这个JS的功能是读取歌曲加载后的时长信息,记录用户播放到关闭(换歌)的时间,记录用户打开页面到开始播放的时间;其实就将这么简单的三个数据设置一个阀值,超过后就将它们传回服务器。
分解下设计中的三个值:
歌曲的总时长:这个可以判断出音乐是否完整,以及是否中间加了广告;我们很意外的得到了一个非常有意思的值”5.099“,如果是跳转别的页面的歌曲,时长总是5.099
用户播放歌曲的时间:如果时间较短一般可以判断歌曲有质量问题,或则不是那首歌曲
打开页面到开始播放的时长:这个恰好反映的连通的速度,也就是连通率,并且还是以用户准的连通率,不是我们自己服务器测试出来的(服务器的网络环境和用户真的差不少)
当然,以上取得的是海量数据,一定要通过统计方法得出问题最大的那些,然后人工解决。
因为上面这个小操作,雅虎音乐搜索在那个时期的品质是超越了百度音乐和搜狗音乐的(判断依据是我们内部的测试,如果大家要喷也没有办法)。

其实这样的应用还有很多,比如google的某些数据采集(我猜测的、个人没有证实过),因为Google地图手机版本的使用量很大,所以完全通过Google地图来采集基站和热点数据;用户打开地图一般都会打开GPS功能,这时Google就可以通过程序抓去能搜索到的基站和热点信息,并且和经纬度信息一起返回给服务器,这样就能非常快速有便捷的得到那些有用数据,然后通过海量数据的分析,入库后给其他用户使用。

再比如foursquare,通过一个很小的签到游戏可以得到那个经纬度的活地图,能知道那个店在那并且是否还在。

iphone英文系统,中文通讯录排序解决方案

一般我会使用英文的操作系统,手机也不例外,但是iPhone设置成英文系统后会有一个很郁闷的结果,就是通讯录中所有中文联系人都会被归为最后“#”号那个分类中,查找非常麻烦,但是也不能全用英文名,至少我的大部分长辈就没有英文名,用拼音更就加奇怪。

不过看了下Frameworks和在网上查找一番,还确实有了解决方案:
/System/Library/Frameworks/AddressBook.Framework/下有各种语言的文件夹,每个文件夹中都有一个ABContactSections.plist文件,这个文件就是用来控制通讯录排序的;接下来就很简单了,只要把zh_CN.lprog/下的ABContactSections.plist拷贝到English.lprog/下就可以解决(为了安全,最好能备份需要替换的文件),以此类推,你当然也可以使用日文,韩文的排序文件;最后别忘记重启你的iPhone哦。

如果你觉得名在前姓在后的显示你也不爽,那么就把ABLocalizableDefaults.plist也给替换掉,这样姓名显示方式也对了。

有些同学要问,怎么替换这个文件,先越狱,然后使用iTools等工具就可以,如果没有越狱那就不用想了。

LNMP添加ImageMagick

ImageMagick 是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。

但是LNMP只默认安装了GD,在此提供下LNMP下安装ImageMagick以及imagick扩展的方法。

1、安装ImageMagick
首先要下载最新的编译包,最新的包可以在下面的地址中找到http://www.imagemagick.org/download/
我们在这里选择ImageMagick-6.7.8-8.tar.gz

wget http://www.imagemagick.org/download/ImageMagick-6.7.8-8.tar.gz
tar -zxvf ImageMagick-6.7.8-8.tar.gz
cd ImageMagick-6.7.8-8/
./configure --prefix=/usr/local/imagemagick
make && make install

安装完成后可以使用以下命令验证下

convert -version

如果正常会显示版本号;也可能会出现错误“convert: error while loading shared libraries: libMagickCore.so.3: cannot open shared object file: No such file or directory”
如果不幸出现可以使用命令

ldconfig /usr/

2、安装imagick(PHP的扩展)
和上面一样,先下载编译包,最新的包可以在下面的地址中找到http://pecl.php.net/package/imagick
我们选择imagick-3.0.1.tgz,建议尽量选择正式版本

wget http://pecl.php.net/get/imagick-3.0.1.tgz
tar -zxvf imagick-3.0.1.tgz
cd imagick-3.0.1/
export PKG_CONFIG_PATH=/usr/local/imagemagick/lib/pkgconfig
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local/imagemagick
make && make install

3、配置php.ini
需要在php.ini中添加imagick扩展

vim /usr/local/php/etc/php.ini

然后添加:

extension = "imagick.so"

保存并退出

4、重启PHP-FPM或Apache

/etc/init.d/php-fpm restart
/etc/init.d/httpd -k restart

一般情况通过上述几部就能搞定,如果遇到问题可以Google下解决掉。
LNMP.org已经提供现成的sh,可以直接用

意外断电导致KVM无法启动

昨天服务器意外断电,结果其中一个KVM虚机死活起不来,只抱错
“Error restoring domain: operation failed: failed to read qemu header”

起初是再新建一个虚机,然后将硬盘挂上,启动,正常启动,只是原来的配置没有了,这说明虚拟的磁盘没有问题;还是想着完美恢复,就去Google搜索,发现原来是原来主机关机过程中KVM的当前状态,并在下次启动时恢复,虚拟状态文件保存在/var/lib/libvirt/qemu/save,应该是意外断电导致虚拟状态文件有缺失,无法正常读取并且恢复,解决方法就是删除虚拟状态文件。

命令:
rm -Rf /var/lib/libvirt/qemu/save/(虚机名称).save

然后重启,正常;问题解决。

Picking Up The Pieces

前段时间听英国单曲榜时听到了这首歌,觉得还不错,虽然名次不怎样,还是推荐下。

这首歌名字叫:Picking Up The Pieces
演唱者:Paloma Faith(帕洛玛费丝)

不知道怎么,最近超喜欢听英国歌(就是英国乐队或歌手唱的)。

最后再分享下这个MV(720P):http://115.com/file/anrvk6c2#Paloma Faith – Picking Up The Piecesm.mkv

HTML5位置服务( Geolocation API)

HTML5中提供了能够得到当前设备位置的接口Geolocation API,可以使用相关的JavaScript方法获得当前位置的经纬度以及海拔和速度数据。
W3C对此接口的具体解释可以看:http://www.w3.org/TR/geolocation-API/

因为位置是个人隐私信息,所以当需要取得用户位置信息的时候浏览器(系统)将会提示用户,只有在允许的情况下才可以使用;某些移动设备中还需要设置“分享位置”才能使用此服务。

位置的获得原理是通过设备自身的GPS装置(通过GPS卫星定位,误差能在10米以内),Wifi热点(根据你周围的Wifi热点算出你的位置,误差在100米以内),其次是蜂窝网络基站(我们熟悉的GMS,WCDMA,CDMA2000,LTE,此误差在1千米内),最差的是通过IP定位(非常不靠谱)。

支持Geolocation API的浏览器:
Firefox 3.5+
Chrome 5.0+
Safari 5.0+
Opera 10.60+
Internet Explorer 9.0+

支持Geolocation API的移动系统
Android 2.0+
iPhone 3.0+
Opera Mobile 10.1+
Symbian (S60 3rd & 5th generation)
Blackberry OS 6
Maemo

可以看到IE8以下的IE浏览器不支持,也几乎所有的智能手机都支持。

很多朋友反映Android 4.0中出现了无法获取位置信息的问题,我也在网上查询了相关的资料然后做了些测试;以下是产生的原因和解决方案:
1、很多国行的手机已经去掉了Google的原生服务,而基站和wifi定位其实就是依赖Google的基础服务包实现的,网上也有相关安装Google基础服务包的文章。
2、中国大陆墙了很多Google的服务,而定位服务器也是需要发起相关请求的,因为使用的也是Google的服务,所以也有被墙的风险。
第三方浏览器:即使原生的浏览器不能使用定位服务器,并不代表第三方浏览器也不支持,很多浏览器有自己的定位服务接口,比如Firefox、QQ,而且速度可能比你想象的快。
产品解决方案:在很多产品设计中,定位不是核心需求,而是一个景上添花的需求,那么我们可以设置一个超时,如果实在取得不了位置信息就给用户一个友好的提示。

火星坐标
首先我们了解下偏移的原因:天朝测绘局以国家安全为理由,用法律的形式对所有在天朝发行的地图类产品加了强制性规范,要 求所有地图类产品都必须使用国家测绘局的一种加偏移的算法,对地图的真实坐标进行加偏移处理,之后才可能通过审批准许上市。因此,天朝的所有官方及商用地 图的坐标都是偏移的,这种偏移属于非线性的,偏移量在300至1000米不等,偏移方向也不定。这种加过偏移的地图坐标就是所谓“火星坐标”。
偏移的官方解决方案:国家 Bao Mi 插件,也叫做加密插件或者加偏或者SM模组,其实就是对真实坐标系统进行人为的加偏处理,按照几行代码的算法,将真实的坐标加密成虚假的坐标,而这个加偏 并不是线性的加偏,所以各地的偏移情况都会有所不同。
偏移的民间解决方案:通过百度、google等公司的纠偏接口(好像有些已不能使用);还有就是通过网上流传出来的火星坐标数据库,然后通过简单的线性计算;如果你都觉得麻烦,那就用卫星图展示吧(因为卫星图不是地图,所以天朝相关部门管不了)。

Geolocation API存在于navigator对象中,只包含3个方法:
1、getCurrentPosition
2、watchPosition
3、clearWatch

getCurrentPosition()函数
getCurrentPosition(successCallback, errorCallback[, options])
successCallback 成功时的回调
errorCallback 失败时的回调
options 参数设置,选填

1、successCallback
coords.latitude 纬度
coords.longitude 经度
coords.altitude 高度
coords.accuracy 精确度
coords.altitudeAccuracy 高度的精确度
coords.heading 设备正北顺时针前进的方位
coords.speed 设备外部环境的移动速度(m/s)
timestamp 当位置捕获到时的时间戳

2、errorCallback
message 错误信息
code 错误代码。
0 — UNKNOW_ERROR:表示不包括在其它错误代码中的错误,这里可以在 message 中查找错误信息
1 — PERMISSION_DENIED:表示用户拒绝浏览器获取位置信息的请求
2 — POSITION_UNAVALIABLE:表示网络不可用或者连接不到卫星
3 — TIMEOUT:表示获取超时。必须在options中指定了timeout值时才有可能发生这种错误

3、options
enableHighAccuracy 参数表示是否高精度可用,为Boolean类型,默认为false,如果开启,响应时间会变慢。
timeout 参数表示等待响应的最大时间,默认是0毫秒,表示无穷时间。
maximumAge 表示应用程序的缓存时间。单位毫秒,默认是0,意味着每次请求都是立即去获取一个全新的对象内容。

watchPosition()函数
watchPosition(successCallback, errorCallback[, options])
watchPosition 的三个参数和 getCurrentPosition 完全一样。不同在于它像一个监视器时刻监视用户的位置,只要发生变化,就会触发回调函数。
此函数返回值是一ID,可以使用clearWatch清除此ID相关的事件。

clearWatch()函数
clearWatch(id)
用来清除对用户位置的循环监视。

代码:

if(navigator.geolocation){//判断是否可以使用getCurrentPosition
	navigator.geolocation.getCurrentPosition(
		function(o){//成功时
			var html = 'Latitude: '+o.coords.latitude
			+';Longitude: '+o.coords.longitude
			+';Altitude: '+o.coords.altitude
			+';Accuracy: '+o.coords.accuracy
			+';Alt Accuracy: '+o.coords.altitudeAccuracy
			+';Heading: '+o.coords.heading
			+';Speed: '+o.coords.speed
			+';Timestamp: '+o.timestamp;
			alert(html);
		},
		function(o){//失败时
			var html = 'Code: '+o.code
			+';Message: '+o.message;
			alert(html);
		}
	);
}else{
	alert('not geolocation');
}

示例地址:http://honglei.net/demo/geo.html

爱就爱

今年儿童节,要好的哥们在公司全员大会上勇敢的向自己喜欢的女孩表白,当时真是感动。

昨天在车里和另一朋友聊起了那个哥们追女孩的事;似乎应为老了,说的非常理智;但是现在回想我们两的聊天真事比较搞笑,像我们说的那样似乎不是恋爱了吧,哈哈

下面用张靓颖同学的几段歌词表达下

《爱就爱》
也许是我愿意 这麽让你摆布
或许是我这样 让你糊涂
可惜 原来我比起你更糊涂
宁愿为你把我自己也辜负

爱就爱了 爱了 爱你的全部
不论可爱 可恶 爱就是全部
爱的盲目 辛苦 只要你幸福
你能幸福 是否 我真能满足

爱就爱了 爱了 爱你的全部
我的可爱 可恶 你是否在乎
谁不贪图 谁不 求回报付出
多麽渴望 你也顽固 爱我的全部

当然是我决定 毫无条件爱你
当然是我选择 用尽心力
当然你也可以继续 爱自己
能不能至少别打击 我的心

难道这样爱你 即使不曾谈起
你也感到压力 所以抗拒
我能装作毫不在意 走下去
你是否能装作在意 不放弃

曾经也年轻,曾经也爱就爱,曾经也有这样的心情。
现在已经结婚,我愿还有这份心境,和她去到世界各地;和她去分享一切。

创业公司要注意的问题

刚好一个朋友创业中,公司已经有20几号人,也十分苦恼公司的组织架构怎么制定比较好;经过和高手的几轮聊天后大概有个概念,我也发出来让大家提提意见。

一、核心团队
作为一个创业型的公司,需要有自己的核心团队,既然是团队,那就肯定不是一个人;但是也不能太多,多了后众口难调;
适宜的是三个人,互相协作和提醒对方的问题,三个人也比较容易出结果,不至于两个人那样可能永远意见不统一,不方便出结果;
最好各有特长,并且能独挡一面,而且一定要找准定位。

二、部门设置合理
1、数量不宜过多
很多公司创业阶段要不就是部门过多,要不就是没有部门概念;其实创业公司没有办法去运作很多部门,部门一多,可能很多部门就没有事情可做了;但是也不能没有部门,没有部门后就没有分配,没有合作;
部门设置在5~6个为宜,这样核心团队还有能力管理下来(毕竟核心团队不可能专职做管理)
2、拼图理论
这个拼图理论是某高人提出的,既然是拼图理论,意思就是不重叠,不遗漏;对于创业公司的部门设置这个理论很关键;
部门直接的工作内容和责任一定要做到不重叠,不遗漏;这个很考验管理者,要把公司的业务和部门权责划分清楚,不然很容易遇到一件事情没有关要你自己搞,或则很多部门关一件事出不了结果。

三、因人设岗
这个事情原来有和朋友讨论过,一开始我们觉得不好,后来我们觉得创业公司就应该这样;应该总结为科学的因人设岗。
因为创业公司招人难,所以我们会非常珍惜每个决定加入公司的同学,很多时候就会觉得他做这个也行,做那个也行,然后就会产品一个这个甚至这个星球上也不存在的岗位;但是这个的做法并没有对他个人好,也没有对公司有利;还是应该了解他的长处,以及和他长处相关的优点,如果工作性质合适可以考虑适当的因人设岗,而不是一味的东拉西凑非出一个适合他的岗位。

四、目标明确,计划清晰
创业公司除了核心团队外,其他都是刚上班不久,经验不足的同学,作为公司应该有明确的目标和清晰的计划,不然难到要员工自己去想公司的目标?特别是创业公司的目标,就算核心团队也未必能想清楚。
但是就算难,核心团队也必须将目标和计划想清楚,并且给个主管说清楚,然后由主管分配下去。

五、多走走,多碰碰
作为创业团队最大的问题可能就是不清晰,不明确,问题不聚焦,那么就需要主管们多走走、看看,去发现本部门和公司的问题;经常坐到一起碰碰,说说自己发现的问题,以及工作上遇到的困难,这样才能使公司更好的发展
当然员工也一样,也需要多碰碰,不但是主管和员工之间,要多碰碰,帮员工解决问题,指明方向,员工和员工直接也要多碰碰,了解对方的工作,互相学习

今天先总结这5点,大家也多指正,也希望给各位创业中的同学带去一丝管理上的灵感。