猫窝私语 — Makumo's Blog

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

@玛酷猫9年前

07/8
10:23
计算机

URL Rewrite终于支持WINDOWS10了

自从升级到Windows 10后,IIS下两大常用工具URL Rewrite和PHP Manager就装不上了,都提示需要IIS7或者以上版本,Windows 10的IIS版本是10,两个软件都识别不了。PHP Manager直接在IIS站点下面新建程序映射就行了,虽然切换修改PHP稍微麻烦点,URL Rewrite只能写web.config,就是麻烦点。毕竟很多源码都自带.htaccess规则文件,直接导入就行了,不用自己把.htaccess内容翻译成web.config。

前段时间无意去微软官网搜了下,发现URL Rewrite更新新版本了,看时间5月27号发布的,快一个月了。Supported Operating System里面赫然写着Windows 10,立马下下来安装,一切顺利,打开IIS又看到那熟悉的图标,唯一遗憾的就是设置是英文的,估计本地化工作还欠缺,不过不影响使用。

PHP Manager依旧不支持,作者页面下面不少留言说是不支持windows 10,不知道作者啥时候更新下软件。也只有等等Windwos 10正式版发布后作者会不会有所行动。

URL Rewrite终于支持WINDOWS10了

@玛酷猫9年前

06/30
12:07
计算机

使用ngrok进行微信本地调试

接手微信公众平台的二次开发工作,最苦逼的莫过于调试了,每次完成都要传到服务器上,在用手机调试,各种烦躁。于是乎在网上找找本地调试的方法,一搜还真不少,思路都是一样的,就是想办法把手机端提出的请求转变到本地测试环境上。综合难易程度,决定选用ngrok软件来进行本地调试。

设置起来也很简单,首先去ngrok官网注册一个账号(不幸被墙,需要自行搭梯子。顺便吐槽下很多很好用的小工具都在墙外。),注册完成后会得到一个Tunnel Authtoken,先复制保存下来,留着后用。然后下载软件,由于用的windows,所以就下载windows版本的,下载后解压,就得到一个ngrok.exe的文件

WIN+R,cmd打开命令提示行,进入ngrok.exe那个目录,运行ngrok authtoken 之前得到的Tunnel Authtoken,登陆下,然后运行ngrok http 80 就可以使用了,窗口会显示关联的域名、状态、连接数和请求。如下图ngrok

由于个人开发习惯,IIS下面会有多个测试网站存在,然后在HOST里面会写一堆如下的指向

www.a.com 127.0.0.1
www.b.com 127.0.0.1
www.c.com 127.0.0.1
#等等…………………………

在IIS站点中主机名填上www.a.com就可以直接用www.a.com这个域名来做测试,再将上面ngrok虚拟出来的网址填写进主机名中,就OK了,从此就可以愉快的调试了。不过每次运行得到的网址都会变更,需要重新修改微信公众平台和IIS设置。如果想每次运行网址不变,可以使用ngrok http -subdomain=自定义的域名 80 来固定二级域名,不过这个功能属于高级用户,也就是要收费的,5美元/月起,我等屌丝还是老老实实用免费版的。

使用ngrok进行微信本地调试

@玛酷猫9年前

04/29
12:05
计算机

Laravel 学习(二)数据库建立与迁移

继续按着教程走,Laravel自带了一个用户系统,http://站点/home 即可直接访问,不过由于没有数据库部分,登陆和注册都是铁定报错的。Laravel鼓励敏捷、迭代的开发方式,所以Laravel迁移给你提供了一种在迭代方式中修改数据库架构的手段,它不要你用SQL操作,而是允许你使用PHP代码。Laravel架构生成器允许我们快速创建数据库表和插入列或索引。它使用清洁和富有表现力的语法来操作数据库。Laravel迁移可以当作数据库的版本控制。

按着教程来,首先先修改数据库配置文件,在Laravel文件下下面的.env文件

DB_HOST=localhost
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=123456

接着运行命令执行数据库迁移操作

php artisan migrate

以上都是按照在linux环境下,而我本地环境是IIS,必然就是各种坑爹错误。搜索了下网上关于IIS下运行Laravel资料很少,琢磨了下无外乎路径问题。

首先是php路径,如果没有配置,直接运行php会提示“php 不是内部或外部命令,也不是可运行的程序
或批处理文件。” 依次右击桌面上的“计算机”,选择“属性”,选择“高级系统设置”,点击“环境变量”,在系统变量中找到“Path”并双击,在变量最后面加上php的文件夹,例如我的php文件夹“D:\Work\work-dll\php-5.6.7”(我配置的时候Path里面已经有了,估计应该是安装composer的时候写入的)

然后依次左下角“开始”,点击运行,输入“CMD”回车,WINDOWS8便利很多,直接WIN+X,选“命令提示符”,敲命令进入站点目录,然后执行数据库迁移操作,比如我的

C:\Users\makumo>d:
D:\>cd Work\work-zone\wwwroot\laravel
D:\Work\work-zone\wwwroot\laravel>
D:\Work\work-zone\wwwroot\laravel>php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table

这样数据库就建立好了,在mysql里面就能看到migrations、password_resets、users三个表,就可以只用Laravel自带的用户系统。

Laravel 学习(二)数据库建立与迁移

@玛酷猫9年前

04/8
13:44
计算机

Laravel 学习(一)安装

写在前面:话说自从换工作以来这两年,除了能够使用flash做广告条新技能get外,其他方面一直原地踏步,还在吃好几年前的老本,尤其是参加了一次技术活动后,更感觉自己脱钩严重,技术群里讨论只有听别人说的份,各种术语理解不能,插不上嘴。趁着最近有点时间,提升下自己好了。这两年Laravel异常火热,以前用过CI和thinkphp做过开发,学习起来难度应该不会太大,就拿这个下手好了。

开始之前,首先去官网转了圈,对于英文苦手的我来说这个完全理解不能,度娘了下,找到中文的手册,顺道找了份教程,大概看了遍,有个印象。网上各种安装教程都是在linux环境下,由于本机开发环境是IIS,各种懒病发作不想在装个虚拟器配个linux,在度娘的指引下,找到一份iis下安装的教程,万事俱备,下面开搞(开搞以后才知道各种坑)。

Laravel最新版本是5,环境需求php >=5.4,由于之前开发环境一直是php-5.2.17和php-5.3.8,第一件事就是去php官网下个最新的稳定版php,目前最新的版本号是5.6.7,借助IIS一个强大的官方插件php manager for iis,可以很轻松的在各个版本php之间切换,修改配置,启用禁用插件都相当方便,点点鼠标就行,正适合我这种懒人。

laravel框架使用composer来管理代码依赖性,去官网下载composer的windows版本,依照教程安装,各种失败,度娘了下才知道还需要准备梯子翻越伟大的墙,这个对于IT屌丝来说不是问题,祭出屌丝专用梯子搬瓦工(具体教程可自行度娘,30块钱不到一年,)顺利安装完成。

接着安装Laravel,按着教程从Github上下载最新的版本,解压,进入命令行,composer install,漫长等待后,出来一堆代码,虽然完全看不懂,但是各种errer,各种failed还是看得懂的,总之一句话,安装失败。不知道是环境配置缺少什么还是梯子不好使,试过几次后果断放弃直接安装方法。好在国内有同仁制作了完整安装包,直接下来就能用的,方便至极。

剩下的就简单了,解压放到工作环境中,新建站点,指向Laravel的public目录,直接访问,简洁的”Laravel 5  When there is no desire, all things are at peace. – Laozi“引入眼帘。

最后,借助IIS另一个实用的官方插件URL Rewrite,导入根目录下的.htaccess文件,伪静态也搞定。

自此Laravel安装完成。

Laravel 学习(一)安装

@玛酷猫9年前

12/2
10:47
计算机

也谈代码规范化

先说个事情:前段时间网编那边做了个专题,有个聚焦图效果插入专题中就不显示,跑来找我。我先用chrome打开,正常,换IE(11),聚焦图正常,打开开发者模式,渲染方式切换到IE7,聚焦图不显示,debug模式报错如下:

SCRIPT438: 对象不支持此属性或方法,文件: eval code (14),行: 1,列: 683,

对应的代码片段一部分,其中 a = arguments 报错

if (arguments.length > 1) {
     a = arguments
} else {
     if (g.C.isKdoms(p)) {
          return p
     } else {
          if (g.C.isarr(p) || g.C.isDoms(p)) {
               a = p
          } else {
               if (g.C.isstr(p)) {
                    a = /^n:(\w+)$/.test(p) ? _doc.getElementsByName(RegExp.$1) : _doc.getElementsByTagName(p)
               }
          }
     }
}

单独焦点图效果没问题,故问题应该不会出在上面这段代码上,估计是什么冲突了。文本编辑器打开专题页面,代码各种乱,不知道从哪个网站上面扒下来的,先大概浏览了下,把各种无用的脚本,多余的代码统统清理掉后,测试了下问题依旧。看来只有祭出大杀器了,删删删。随着页面代码不断删除,直到删掉这一行

<h2 id="a"></h2>

聚焦图效果正常了,看到这个代码,瞬间明白啥问题了。在低版本IE浏览器中,页面中id为a的元素,a就相当于document.getElementById(“a”),代码中arguments是个数组,a = arguments直接报错了。导致这个问题原因也很简单,网编为了方便,直接把各个锚点命名成a,b,c,d,e,…问题找到了,解决起来就方便了,直接让网编把所有的锚点都换成栏目拼音。

一个小问题,浪费了个把小时,太不值得,归根结底还是一个代码规范问题。对于一个网编来说,让她完全准守代码规范可能要求比较高了,但是对于一个开发人员来说,命名规范化,这点是最基本要求。

顺便说下另一个同事的事情,php开发人员,有一次我在检查他写的代码片,定义变量都是nimeide、madan、cao等等词语,果断打回去重写,写段代码至于带着这么多负面情绪在里面么。虽然这个小伙已经跳到新的单位,这种心态不调整,他的职业发展也不会这么顺利。

两年前我曾今去过一家单位,负责前端工作,由于各种原因,只待了一周的时间。入职第一天,除了基本的常规介绍,就是一份前端规范(网易的NEC规范,传送门),这个前端规范相对于一般的来说,样式命名书写更为复杂和繁琐,短短的一周2、3个页面完全按照规范来实施,虽然速度有点影响,一气写下来还是很舒畅的,而且后续的接手人员也不会觉得各种突兀,按着规范来很清楚各个部分代表什么意思。比较遗憾只待了1周,那个公司的网站目前看还是同行业里代码最优雅的,页面用户体验最好的。

以码认人,也不是不无道理的,一个代码写得优美规范的团队/个人,虽然技术能力不一定有多么多么的高端,至少是一个良好的开端,今后的发展不可估量。

关于各大互联网公司前后端规范,网上都能搜到,不在这里面列举了,有兴趣的可以自行搜索。

也谈代码规范化

@玛酷猫11年前

08/22
17:52
计算机

云存储的战争

今天百度云盘大打促销,PC端、移动端、1块钱3步扩充1T云盘空间,数字公司紧接其后,撤去页面上的免费360G空间,直接换上1T空间,宣传语也换成不要1块钱,3B大战又开辟新的战场。话说如今网盘产品也非常多了,老牌的dropbox,微软的skydrive,Google Drive,再加上国内的115,华为,百度云,360云,腾讯的微云,新浪的微盘等等,总有种网盘太多,数据都不够用了。

老实说我自己网盘用的不是很多,装一大堆客户端,时时刻刻盯着你的硬盘,想想就不靠谱,尤其是国内基本没有什么信任机制可言。算下来用的最多的也就是dropbox,主要还是把手机上的照片同步到电脑上,虽然蓝牙或者数据线也可以满足,不过自己比较懒。其次就是QQ的微云,最早好像叫网络收藏夹还是什么的,毕竟每天都在用QQ,一些小东西直接往里面扔,虽然空间不大,记得刚开始就128M,后来开会员就大了些。115注册过账号,也基本都是下载别人的资源顺手保存在115上的。后来再用百度,用处也很单一,就是把别人共享的美剧放过来在线播放,彻底沦为看片基地。重要的数据还是习惯放到移动硬盘里面,所做的项目、各种工作文档、照片等等。反正现在硬盘也不是很贵。

我总觉得各家网盘的炒作容量其实就是争一个噱头,经常使用的大的东西一般是不会放到网盘上去的,等你想用的时候下载都要下半天,国内的网速还没有快到百兆光钎接入的情况。而小东西的话像平时的文档,编码,加起来也就几十M而已,直接打个包放邮箱都可以。可能有些人会说我就是喜欢把东西存档在里面,说不定过了几年或者十几年再翻出来看看。且不说几年后这个公司还在不在,即便是在的话,那些文件还能不能下的下来还是个问题。

对于云存储,我觉得够用就行了,针对不同需求灵活使用就好,没必要奔着哪家大用哪家。关键数据还是留在自己电脑里面或者U盘、移动硬盘更安全。实在觉得不方便的话还是找国外比较靠谱的云存储。空间有价,数据无价。

云存储的战争

@玛酷猫11年前

07/16
16:25
JS&JQUERY

Ajax的收录与history API

虽然google reader已经关闭,但是作为一个重要的学习途径,rss阅读之路还要走下去。

rss上面好东西还是不少的,毕竟还是有不少人还是分享自己的技术知识,今天看到了一篇文章《如何让搜索引擎抓取AJAX内容?》,以前经常在cnbeta上看新闻,就有个疑问,它的首页是不停的用ajax加载的,搜索引擎该如何收录。这篇文章至少提及了一种解决思路。核心就是靠history api来实现。这东东其实并不陌生,工作中经常会用到:

history.back;
history.go(-1);

在HTML4的中,经常使用如下几种方法

  • length:历史堆栈中的记录数。
  • back():返回上一页。
  • forward():前进到下一页。
  • go([delta]):delta是个数字,如果不写或为0,则刷新本页;如果为正数,则前进到相应数目的页面;若为负数,则后退到相应数目的页面。

在HTML5中,又增加了几种用法

  • pushState(data, title [, url]):往历史堆栈的顶部添加一条记录。data为一个对象或null,它会在触发window的popstate事件(window.onpopstate)时,作为参数的state属性传递过去;title为页面的标题,但当前所有浏览器都忽略这个参数;url为页面的URL,不写则为当前页。
  • replaceState(data, title [, url]):更改当前页面的历史记录。参数同上。这种更改并不会去访问该URL。

看完后突发奇想,岂不是这个方法可以用来掩饰钓鱼网站。。在chrome控制台里面试了下,直接报错“Error: SECURITY_ERR: DOM Exception 18”,看来担心是多余的,应该只能在同域名下使用。用这个方法也可以在网站上面搞搞恶作剧,比如做一个好玩的页面,pushState替换成另一个恶搞页面,发给别人,别人不注意再复制转发的话,嘿嘿。再比如Google的20 Things I Learned About Browsers and the Web(需要科学上网),还有这个Eight Equals Equals Dee IN UR URLS(少儿不宜:))

Ajax的收录与history API

@玛酷猫12年前

09/7
17:47
JS&JQUERY

JavaScript闭包和匿名函数

PS:最近在研究JavaScript的模块化,随手做些笔记吧。

模块化首先要了解两个概念,那就是闭包(closure)和匿名函数(anonymous function)。

关于闭包,网上文章非常多,有位牛人的这篇文章《闭包漫谈(从抽象代数及函数式编程角度)》写的很全面。话说数学相关的知识全都还给大学老师了,好多看不懂。

百度百科的解释:

闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。

话说百科的东西都是文字绕呀绕,把你绕糊涂位置,不看也罢。JavaScript的闭包官方解释:指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。一样文绉绉的,不解其意。套用网络通俗的解释就是“闭包就是能够读/写函数内部的某些变量的子函数,并将这些变量保存在内存中。”,其中两个效果,一是读写函数内部变量,二是常驻内存。

匿名函数是指那些无需定义函数名的函数。匿名函数与 Lambda 表达式(拉姆达表达式)是一回事。唯一的不同——语法形式不同。Lambda 表达式更进一步。本质上,它们的作用都是:产生方法——内联方法,也就是说,省去函数定义,直接写函数体。

引用网络上面一个例子

var baz;
(function() {
	var foo = 10;
	var bar = 2;
	baz = function() {
		return foo * bar;
	};
})();
baz();

尽管在匿名函数外执行,但 baz 仍然可以访问 foo 和 bar。
1,第 1 行,baz 是全局变量;
2,第 2 ~第 8 行,定义一个匿名函数;
3,第 3 和 4 行,foo 和 bar 是匿名函数内的局部变量;第 5 ~ 7 行,在匿名函数内定义一个匿名函数,并将其赋值给全局变量 baz;
4,第 9行,调用 baz。若改成 “alert(baz());”,将显示 20;
5,按理说,在匿名函数外不能访问 foo 和 bar,但是现在可以。
要注意的是,函数内部声明变量时,一定要使用 var 关键字,否则,声明的是一个全局变量。最早自己写代码很少注意这个,也出现过变量被修改的混乱情况。

闭包常用于两种情况,一个是保护函数内的变量安全。函数中foo和bar只有函数baz才能访问,而无法通过其他途径访问到,因此保护了变量的安全性。另一个是在内存中维持一个变量。依然如前例,由于闭包,函数中foo和bar一直存在于内存中。

由于闭包的维持占用内存的特性,频繁使用会大量消耗内存,引起内存泄露。如无特殊需要,尽量不适用闭包,如果使用,当使用完毕后,要记得释放占用的内存。

JavaScript闭包和匿名函数

@玛酷猫12年前

08/30
15:07
JS&JQUERY

javaScript模块规范、AMD、CMD

学无止境真是一点没错,IT行业新知识新技术简直是井喷状态在发展,这两年javaScript(以下简写JS)发展是相当迅猛,09年诞生的node.js成长迅速,今天又在网上看到AMD/CMD两新名词,互联网就是这点好,不懂可以查可以搜。

AMD/CMD其实都是JS模块化开发的规范。最早JS需求都很简单,基本都是写函数,一种面向过程的写法,后来慢慢的引入面对对象开发思想,慢慢写成类。随着应用程序的日益增大,JS代码行数迅猛增长,如何管理、组织、优化成为一个很头疼的事情。node.js的模块化写法让人眼前一亮,于是乎各路牛人纷纷效仿,各种写模块的规范也就涌现出来了。

异步模块定义(AMD)是Asynchronous Module Definition的缩写,是 RequireJS 在推广过程中对模块定义的规范化产出。规范传送门
通用模块定义(CMD)是Common Module Definition的缩写,是SeaJS 在推广过程中对模块定义的规范化产出。规范传送门
此外还有 CommonJS Modules/2.0 规范,是 BravoJS 在推广过程中对模块定义的规范化产出。
等等。。。

话说光看介绍理解不能呀,主要还是试试其中的功能,感觉一下,好像各大常用的JS框架也慢慢支持模块化调用,试用下,之后再来写写感受。

javaScript模块规范、AMD、CMD

@玛酷猫12年前

08/21
16:18
JS&JQUERY

正则表达式中的反向引用

今天群里有人抛出一个正则求分析,如下:

^(?:(?!\d{4}).)*(\d{4})(?:(?!\1).)*\1

咋一看,整句全都是特殊符号,头晕中。不过正则表达式都是看起来晕,慢慢分析起来还是蛮有意思。里面有两天稍微复杂点,一个是断言,这个之前写过一篇文章介绍《正则表达式中的断言和非捕捉组》,另外一个就是反向引用,这个以前遇到的少,遇到不怕,搜索一下就好了。一下引用百度百科:

正则表达式的最重要功能之一是存储匹配的模式的一部分以供以后重新使用的能力。您可能想起,若在正则表达式模式或模式的一部分两侧加上括号,就会导致表达式的一部分被存储到临时缓冲区中。可以通过使用非捕获元字符 ?:、?= 或 ?! 来重写捕获。
反向引用
每个捕获的子匹配项按照它们在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。可以使用 \n来访问每个缓冲区,其中n 是标识特定缓冲区的一位或两位十进制数字。

清楚这个,上面那个就好分析了。借助Regex Match Tracer试着分析如下:

^边界开头条件,(?!\d{4}). 负向零宽度断言,意思断言自身位置的后面不能匹配四位数字,也就是开头到第一组四位数字为止,(?:(?!\d{4}).)*非捕捉组,不进行捕捉组记录。(\d{4}),第一个捕捉组,4位数字。\1反向引用,也就是前面第一个捕捉组所捕捉到的4位数字,(?!\1).,和前面的负向零宽度断言相同,意思断言自身位置的后面不能匹配第一个捕捉组的四位数字,这之间可以出现其他的数字组合。(?:(?!\1).)*非捕捉组,最后再跟一个\1,也就是第一捕捉组的那4位数字。

整体意思大概就是:从开始遇到第一个4位数字。继续,当遇到第二次同样的4位数字后截止,匹配这部分内容。

另外还有一点需要注意,就是反向引用如果后面要加数字,例如\10,不同的引擎会有不同的解释:在.NET中,这里的“\10”被解析成第10个捕获组的反向引用,但如果正则表达式加了RegexOptions.ECMAScript参数,则这里的“\10”被解析成第1个捕获组的反向引用加一个普通字符“0”;而在JavaScript中,在IE的浏览器引擎中,“\10”被解析成第1个捕获组的反向引用加一个普通字符“0”,而在Firefox、Opera等浏览器中,得到的结果为空,说明“\10”被解析成第10个捕获组的反向引用。为了防止这种情况,后面跟的数字一般用非捕捉组代替,例如:\1(?:0)表示。

本人正则表达式并不是很熟练,如有问题,欢迎指正。

正则表达式中的反向引用