猫窝私语 — Makumo's Blog

玛酷猫的温馨小窝,记录生活点点滴滴。

@玛酷猫12 年前

04/6
11:52
JS&JQUERY

正则表达式中的断言和非捕捉组

前段时间在cnblogs看到一道有意思的题目,传送门地址。题面很简单:将一段数字从右到左每隔三位插入一个逗号 ,也就是通常说的插入千分位符,使用javascript实现,据说是某大公司的面试题。动态语言就没有什么难点了,现成的函数都有。我第一反应也就是把类似字符串倒转原理的操作,只不过不是一位一位,是三位三位,然后用分号连接起来。各式各样的解答和效率测试就不多说了,源地址的博客中都有说明。单单说下其中的一个解答,如下:

var cuter2 = function( str ){//abcd
     return str.replace( /\B(?=(?:\d{3})+$)/g, ',' );
};

看到这个解答很神奇,单单一句正则就搞定,虽然效率一般,在页面大量需要此操作的情况下并不是很适用。老实说正则也写过不少,以前做页面抓取,各式各样的匹配也写过,但是这个正则表达式基本理解不能。幸好手上有正则利器,一个叫“Regex Match Tracer”的小工具(我就不贴下载地址,可自行搜索),可以分解测试正则表达式。去掉/g全局参数和开头的/,正则的结构分解的很清楚,见右图。其中有两个词倒是第一次见,一个是零宽度断言,另一个就是非捕捉组。网上搜索一下,明了很多。

先说非捕捉组,这个很好理解,用法(?:Expression)。非捕捉组主要是整体效率的考虑,因为并不是所有的捕捉组都是我们需要的,有一些为了方便分割,有一些是必须使用捕捉组的形式,往往并不关心捕捉组的具体内容,每一个捕捉组都会消耗一部分内存,当一个很长或者重复很多的时候,这些捕捉组消耗的内存就不是个小数目了。

再说说断言,这个比较难理解,先引用网上搜索到的说明:

元字符/b、^、$都匹配一个位置,且这个位置满足一定的条件。在此,把满足这一个条件称为断言或零宽度断言。

表达式(?=experssion)、(?!experssion)、(?<=experssion)和(?<!experssion)都是匹配一个位置。
(?=experssion)又称为零宽度正预测先行断言,它断言自身位置的后面能够匹配表达式experssion。
(?<=experssion)又称为零宽度正回顾后发断言,它断言自身位置的前面能够匹配表达式experssion。
(?!experssion)又称为负向零宽度断言或者零宽度负预测先行断言,它断言自身位置的后面不能匹配字符串experssion。
(?<!experssion)又称为零宽度负回顾后发断言,它断言自身位置的前面不能匹配字符串experssion。

说明比较绕口,个人理解为一般的正则是匹配字符或者字符串,而断言是匹配符合一定条件的位置,就拿上面那个正则说明(个人理解):\d{3}是三位数字组,(?:\d{3})非捕捉组,(?:\d{3})+贪婪模式,一个或者多个三位数字组合,(?=(?:\d{3})+$)断言,以一个或者多个3位数字组合结尾的那个位置,最后前面的/B是匹配不是在字符的开始或结束位置,防止字符串正好是3的倍数,千分号打在最开头。/g全局模式,因为一次只能将一个位置替换成逗号。其实弄清楚了每一小部分,整个正则还是很好理解的。主要就是能不能想到这个方法。

最后再多说一些,随着javascript的框架应用层出不穷,很多做前端的为了开发效率考虑,直接就使用框架来开发,在这个速成的时代,甚至有些前端只会使用框架写法,基本的javascript都写不出几行出来。这是一个很恐怖的事情,就好比一个学步的人,天天使用代步工具,汽车、飞机、甚至电动轮椅,一旦脱离这些东西,这个人将寸步难行。框架也是同样的原理,不管什么语言的框架,都是为了更高的开发效率,但是框架的实现原理也需要研究弄懂的,大部分框架都是开源的,花些时间研究并不是很困难的事情,一方面可以巩固自身的语言基础用法,最重要的是从架构上理解开发者为什么要这样部署框架结构,框架运行思想,也能从中发现存在的瑕疵或者不适应自身项目的地方,加以完善或者改进调整,同时也能为自身在系统架构认识上面,增加不少的经验。

正则表达式中的断言和非捕捉组

@玛酷猫12 年前

04/2
22:12
心情点滴

清洗大作战

难得一个假期,还是连上了7天半换来的,假期第一天就不想起来,累、疲惫。一想到上周烧烤的设备还没处理,再不处理这么热的天估计要长毛了。得,还要起来,还好这几天一直是晴天,太阳能热水器里面水滚烫的。

说弄就弄,东西搬进卫生间,烤炉拆开,从内到外喷了厚厚一次厨房去油的(忘了叫什么名字了),铁签子和乱七八糟的烧烤配件都扔进大盆里面,到了不少洗衣粉,看广告不停说去油渍,这次正好看看有多神奇。其他都还好说,直接拿花洒调成喷射那种,对着冲好了,最麻烦的就是烤网,上面粘着各式各样食物的痕迹,那天烤糊了不少东西,结果就是烤网上一块一块黑糊的物质。。。冲都冲不掉,费劲的拿刷子一点一点的刷,费劲呀。。

总算清理完了,干净说不上,至少看这不那么怕人了。顺便也把厨房弄一下好了,正好买的去油还有不少。油烟机和灶台上面那个油厚的。。看起来简单,弄起来那个较累呀,现在才体会到为什么经常在小区里面看到专门清洗油烟机和燃气灶的人,推着小车拿着喇叭喊。这活还真不是一般人弄得,也是要经验和技巧的。抹布、钢丝球、筷子、水果刀齐上阵,总算搞定。

清洗完毕,继续补觉。嘿嘿。

清洗大作战

@玛酷猫12 年前

03/13
21:31
计算机

u盘产量导致USB设备无法使用解决办法

昨天好不容易把坏掉的黑盘产量修复完毕,结果今天早上一上班就发现USB的鼠标不能用了,灯都不亮。还好用的是笔记本,鼠标出问题了还有触控板。一开始怀疑是USB鼠标坏了,毕竟之前出现过一次接触不良导致鼠标满屏幕乱飞的情况。拔下来插到别人电脑上一切正常。插回来下面红光闪了一下就灭了。重启电脑,鼠标反应正常,下面灯也亮着,一进系统,鼠标灯瞬间灭了。。无语。试了下U盘,一点反应也没有。难道是悲剧的USB接口坏了,不过系统启动前还是好的,重启能使用U盘启动,初步估计系统问题。

系统是win7的,检查了下设备控制器,通用串口总线控制器下面所有的设备都显示黄色感叹号,估计是usb的设备驱动出问题了,把所有的感叹号设备删了,重新扫描硬件变动,问题依旧。。。

于是祭出万能的谷歌,找到了处理办法,虽然说原理不是很清楚:

“开始菜单”-“运行”-输入命令:regedit,打开系统注册表。依次展开下面的注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}(适用于Windows 7系统)
或者
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/(适用于Windows XP系统)
在这下面有很多用“{}”括起来的项,一个一个的点开,看右面窗口有没有“通用串行总线控制器(Universal Serial Bus controllers)”这些文字,在右面窗口找到“upperfilter”项或“lowerfilter”项并删除。

之后重启下问题解决。如果担心删除了,最好先备份下注册表。

u盘产量导致USB设备无法使用解决办法

@玛酷猫12 年前

03/12
22:48
计算机

金士顿黑盘特殊芯片修复经历

上个月买的8G金士顿黑盘终于挂掉了,当时买的时候看这做工这价格就知道是黑盘,还从熟人那拿的。本来也不准备放什么重要的数据,就做个系统修复U盘,就一些PE工具和ghost镜像和win7的光盘镜像,所以贪个小便宜。结果没想到坏的这么快。不过坏了到不怕,以前产量过好几个U盘,产量化一下应该就能修复。

症状:U盘文件目录乱码,显示容量扩大了好几倍,无法正常格式化。使用磁盘工具检查容量正常,删除分区,重建分区无法保存分区,提示芯片写保护。

使用u盘芯片检测工具chipgenius,检测U盘信息为:

芯片厂商: Alcor Micro(安国)
芯片型号: SC908L(FC8908L)/AU6998(L/NL)/AU6989(L/NL) – F/W EE37
闪存识别码:  45DEA882 – SanDisk(闪迪) – 1CE/单通道 [TLC-8K] -> 总容量 = 8GB

能检测出U盘型号就简单了,网上找到安国的产量化工具,运行,检测出U盘,SDTNNNAHEM-008G,开始产量化,郁闷的一幕出现了,提示:30D30:请使用特殊版本产量工具!换了其他几个版本的产量工具,要不检测不出来,要不提示芯片类别错误,要不就是上面这个提示。

有互联网在,不怕,继续搜索。终于在数码之家的一个帖子中,有位高手(xumuwu2004)回答了这类问题,原话引用:

“出现这个不良的原因是目前大家所熟知的 都是87的量产工具,插上了89(87升级版主控)主控的产品所提示的现象。flash 技术日新月异,nm制程的更新,导致flash本身对ECC能力的要求提高,所以方案工具也在更新自己的主控来兼容后面新出的flash。目前89做的绝大部分都是TLC芯片(之前是SLC MLC 现在发展是TLC),这个芯片读写速度普遍慢,擦写寿命普遍短。。。我不建议数码发烧友自己用这样的U盘来拷很重要的东西,如果条件允许,可以弄个好点的,碰到这样的U盘,尽可能的找个没人的地方,挖个坑,埋起来,再尿泡尿上面,以免祸害其他朋友,谢谢”

数码之家下载文件需要点数,可怜新注册后点数还是负的。幸好互联网是开放共享的,知道产量工具的名称编号,终于让我搜到了下载源。之后就简单多了,插上U盘,运行产量工具,漫长的等待(果然像上面所说,这个主控读写真的很慢),产量成功,一半的坏块,容量变成4G,这个也比较符合黑盘大部分都是翻倍扩容的U盘。

反正这块U盘也就平时维护电脑、重做系统用,凑合着先用着了、

好东西要大家分享,产量工具115的下载地址:AlcorMP_D3eD3 115貌似没法下载了,更换新浪微盘地址:AlcorMP_D3eD3

金士顿黑盘特殊芯片修复经历

@玛酷猫12 年前

03/12
14:12
数据库

mysql定时任务以及乱码处理

前几天接到一个工作需求,在OA中增加一个功能,每天给当天过生日的同事发送一封生日快乐的邮件,并发送站内短信给所有人,提醒今天某某过生日。这个需求不错,很能体现人文关怀,如是乎构思如何实现。

先说下背景情况,OA是完全自行开发的,CI框架,WIMP架构(最初建设的时候由于各种原因,等接手的时候已经是这种别扭的架构)。最一开始准备用windows的任务计划。制作一个单页实现功能,在定时任务里面设置执行一个vbs文件,访问下该文件。内容类似如下

DIM IE
SET IE = CREATEOBJECT("INTERNETEXPLORER.APPLICATION")
IE.NAVIGATE("网址")
IE.VISIBLE=0
SET IE = NOTHING

后来考虑这一系列都是数据路操作,没必要绕一大圈,又写php程序又在windows下面建计划任务,mysql已经支持计划任务。于是乎就准备在mysql里面建一个存储过程一个计划事件搞定它。定时任务需要mysql版本在5.1以上,版本不够的话可以用上面的方式。

MYSQL的存储过程还是第一次写,以前只在MSSQL里面写过存储过程和触发器。不停地查找写法资料才完成如下代码(初次写难免存在问题,欢迎指正),

#这个是最原始版本,实际应用版本做了修改优化#
DROP PROCEDURE IF EXISTS `pro_birth`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `pro_birth`()
BEGIN
	DECLARE t_uid INT;
	DECLARE a_uid INT;
	DECLARE t_username VARCHAR(255);
	DECLARE t_depname VARCHAR(255);
	DECLARE done INT DEFAULT 0;

	DECLARE cur1 CURSOR FOR 当日过生日人员名单SQL;
	DECLARE cur2 CURSOR FOR 全员名单SQL;
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

	OPEN cur1;
	REPEAT
	FETCH cur1 INTO t_uid,t_username,t_depname;
	IF NOT done THEN

		#生日邮件
		SET @TEMP_STRING = CONCAT("'<div style=font-size:14px><p>亲爱的",t_username,":</p><p>  祝您生日快乐!</p><p>  感谢您为公司发展付出的辛勤劳动和努力。在您生日到来之际,公司代表全体员工送上衷心的祝福:生日快乐!愿所有的快乐、所有的幸福、所有的温馨、所有的好运都永远围绕在你的身边。</p><p style=text-align:right>",DATE_FORMAT(CURDATE(),'%Y年%m月%d日'),"</p></div>' ");
		SET @MAIL_STRING = "插入邮件表SQL";
		PREPARE mail_stmt FROM @MAIL_STRING;
		EXECUTE mail_stmt;

		#全员站内短信提醒
		OPEN cur2;
		REPEAT
		FETCH cur2 INTO a_uid;
		IF NOT done THEN
			SET @TEMP_STRING = CONCAT("亲爱的伙伴:今天(",DATE_FORMAT(CURDATE(),'%m月%d日'),")是",t_depname," ",t_username,"的生日,快去给TA送祝福吧!");
			SET @PM_STRING = "插入短信表SQL"
			PREPARE pm_stmt FROM @PM_STRING;
			EXECUTE pm_stmt;
		END IF;
		UNTIL done END REPEAT;
		CLOSE cur2;

	END IF;
	UNTIL done END REPEAT;
	CLOSE cur1;
END
;;
DELIMITER ;

本机测试正常,在服务器上创建存储过程的时候却报错。“#1271 – Illegal mix of collations for operation ‘concat’”,谷歌了一下,都说是编码问题导致。检查了下服务器上牵扯到得几个表,用户表、邮件表、短信息表都是utf8的编码。心想是不是存储过程中间的中文导致报错,于是重新改写了下代码,新建一个临时表,将存储过程中的文字存放在库中,读取出来替换掉中间的关键字。代码类似,就不在重复贴了。服务器重新创建存储过程的时候执行成功,但是运行存储过程后,插入邮件表和短信息表的内容还是乱码,中文部分全都是用?代替。看来还是没有解决中文乱码的问题。

多番网上查找后,有位同仁也遇到此类问题,他的表和库都是utf8的编码,同样存储过程运行后中文都是??,这时候我才发现我这服务器上库的编码居然是latin1_swedish_ci,存储过程肯定也是这个编码,虽然表的数据都是utf8的,经过存储过程一弄,就全变??了。解决办法其实也很简单,变量声明的时候定一下编码格式。

DECLARE t_username VARCHAR(255) CHARACTER SET utf8;
DECLARE t_depname VARCHAR(255) CHARACTER SET utf8;

这个也不是彻底的解决办法,最终需要统一库的编码格式。

定时事件就简单多了,新建一个事件,每天凌晨6点运行下就好了。要核对下mysql的系统时间,像我的是+8区就不用调整了,如果默认的话需要对应做个加减。如下

DROP EVENT IF EXISTS `EVENT_BIRTH`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` EVENT `EVENT_BIRTH` ON SCHEDULE EVERY 1 DAY STARTS '2012-03-08 6:00:00' ON COMPLETION NOT PRESERVE ENABLE DO CALL pro_birth()
;;
DELIMITER ;

最后,最关键一点,开启mysql的定时事件。我就是忘开启了,结果等了一天没动静。。。今天的手动执行了下存储过程。

set global event_scheduler = 1

mysql定时任务以及乱码处理

@玛酷猫12 年前

03/2
15:25
心情点滴

时隔两年,重新启程

有句话说的好:时间是把杀猪刀,杀的是青春,留下一身肉。自从上次更新,一晃两年过去了。一方面是自己发懒,另一方面有时候不少东西可能,就是登录后台却不知道该从何开始写。去年10月份就把小窝升级到新版本了,本来打算写些什么,随后也就不了了之了。。。自从慢慢投入微博的怀抱,也就没再回来打理自己的小窝了。

话说微博确实有她的优点:短小精悍,便捷,随想随发。但是慢慢的发现微博上的广告越来越多,刷屏越来越厉害,逐步的把很多关注都取消了。而且还有一点,就是自己发的东西也比较难保留,往往要翻很多页,才能找到。记录的都是片段,也很难关联在一起。

看来微博还是没法替代博客的,google reader 上订阅的不少博客也时不时的浏览下,很多知识、观点还是通过博客上面获得,毕竟简简单单的140个字没法阐述清楚,即便是使用长微博,以后查看管理还是非常的麻烦。翻翻几年前写的微博,还是蛮有感触的。

所以还是要坚持记录微博(貌似都说了好多遍了),留下自己的足迹。

时隔两年,重新启程

@玛酷猫14 年前

03/24
15:08
心情点滴

我的Google历程,以表纪念

昨天,谷歌最终还是退出中国内地,在Hongkong按了新家,原因大家也都清楚,大街小巷都在报道传阅。先前有位牛人的一句话很能概括原因:百度一下,你就知道;Google一下,你丫知道的太多了。

最早接触Google那还是刚刚工作的时候,做程序开发很多地方不会,又不好意思老是打扰别人,那时候只知道百度,一有不会的就在百度上搜,常常搜到广告、推广和一些杂七杂八无用的东西,或者干脆提示没有结果。直到有一天,公司一位“牛人”看到了,直接过来说:“你怎么还在用百度呀,那都是一般网民用的,向我们这种高级人员,向来只用Google。你不用Google,出门都不好意思和别人打招呼。”一经试用,那是屡试不爽,就是往往搜到英文的文献,自己那英文水平,那就是天书呀。

后来注册了Gmail邮箱,当时注册还没有开放,也是那位牛人给的邀请码才注册的,不过就是很少使用罢了。随后也开始慢慢的使用Google的其他功能,像日历、地图、翻译、文档、协作平台(可惜现在被墙了),还有天天在用的chrome、Gtalk、reader(觉得叫阅读器好别扭)、Buzz。Google的搜索反倒是用的越来越少了,相对于Google的域名,百度的要简单很多,也便于输入。虽然Google意识到自己的域名问题,也启用的G.cn,但是习惯还是比较难于更改的。

个人还是比较喜欢Google的,只要是他的功能应用简单、实用,一些开发和界面交互展示思想也值得借鉴。虽然他退出了中国搜索市场,即使是取消了中文版本,再即使是被万能的“墙”墙在外面,只要它的特色功能在,那我还是会继续使用的,基本的翻墙功夫还是有的,就是稍微麻烦了点。

不希望若干年后,谷歌只剩下一句话:“不要迷恋歌,歌只是传说”,那就真的悲哀了。

我的Google历程,以表纪念

@玛酷猫14 年前

03/6
21:12
生活 饮食

家常菜分享(二)

板栗烧鸡、蒜台回锅肉、鱼香茄子煲

平时很忙,基本没什么时间去菜场买菜做饭,天天也就在外面吃快餐。快餐不提大家都知道,卫生咱就不提了,菜质量也就不说了,但看那层厚厚的油,也不知道用的是什么油,不心疼的使劲放。吃几次就没什么胃口。

难得周末可以改善下伙食,想了几个想吃的菜,网上搜了下做法,然后就去菜场搜刮了。回来叮叮当当一整子,弄出来还像那么一回事。三个菜:板栗烧鸡、鱼香茄子煲、蒜苔回锅肉。还有一个炸臭干,就剩下一块了。没买整鸡,又要切又要弄,做出来还不知道是鸡的哪部分,直接买的翅根,肉多正好解馋,剥板栗皮就很郁闷了,虽然有剥好了的,一小袋居然要12块钱,大概也就半斤样子,还是买的回来自己弄了,大拇指还隐隐作痛呢。鱼香茄子煲比较失败,鱼香味完全没出来,吃起来说不出的怪味道,叫怪味茄子也不为过,不过还是属于能接受的范围,至少不用倒掉。

后面附上菜谱,都是网上搜到的。几个朋友都说我做菜挺有天分的,只要能在网上搜到+能买得到材料的基本都能做出来,抛开味道不说,至少看起来有模有样的,O(∩_∩)O~
Read More →

家常菜分享(二)

@玛酷猫14 年前

02/28
22:45
心情点滴

元宵节的大餐

元宵节的大餐

古语云:“八月十五云遮月,正月十五雪打灯”。可是外面却打着春雷,下着大雨。。。看月亮赏灯是没戏了,也只能窝在家里了。

一觉睡到午后,起来洗衣物、收拾屋子,一个星期不打扫,屋里都是灰,外加一堆脏衣服,单身男人的悲哀呀。都弄完了才想起来今天貌似过节呀,难怪外面鞭炮从早上就噼噼啪啪响个不停,怎么说也要犒劳下自己,于是乎穿衣出去突袭了菜市场。嘿嘿!

刚刚炸好出锅的臭干就被隔壁一起租的人到了,结果还没开饭就剩下空盘子了。早知道多买点撑死这丫的。在厨房叮叮当当的忙会半天,几个小菜出锅啦,百度上现学的糖排,红烧鲫鱼,还有份白菜,以及省事鸡蛋都没打,直接扔锅里,浑浊不堪的西红柿汤=。=!总体味道还是不错的。

还有一袋元宵,弄宵夜去喽。(^o^)/~

元宵节的大餐

@玛酷猫14 年前

02/13
22:48
心情点滴

踏雪归家

年三十小区公园的雪景

过年放假回家,一路上雨雪都紧紧地追赶着,终究在离家还有100多公里的地方赶了上来。天已经黑了下来,道路积雪结冰,没法前行,只有在这个陌生的城市里度过这晚,回到家已经是第二天了。一年来也就只能回家一两次,家里的父母也早早的等着我的归来,都怪那雪,下的真不是时候,阻挡了多少归家人的行程。

和往常过年一样,睡到日上三竿,走亲访友,唠唠家常,吃呀喝呀,剩下的时间就是无聊中。今天比往年好点的就是带着笔记本回家了,终于不用抱着电视期待着广告中插播的电视剧了,更幸运的事家里的小区还有不少无线,其中有几个还没有设置密码,买本本几个月了,第一次蹭了下别人的网,但愿别被发现了,呵呵。

明天就是新年了,恭祝大家新年快乐,虎年吉祥!

踏雪归家