cfscript 随机打乱数组元素顺序

前段时间有遇到这样的一个需求,原本给定一个数组,比如是:

array = [‘1′,’2′,’3′,’4′,’5’]

现在需要把数组里所有元素的顺序随机打乱,于是自己写了一个算法,分享出来。


	public array function sortQuestions( required array arrayOfQuesions){
		LOCAL.arrayOfSortedQuestion = [];

		numOfQuestions = arrayLen(ARGUMENTS.arrayOfQuesions);
		for (i=1; i<=numOfQuestions; i=i+1) {
			if(i == numOfQuestions){
				maxNum = 1;
			}
			else{
				maxNum = numOfQuestions - i + 1;
			}
			pos = randRange(1, maxNum);
			arrayAppend(LOCAL.arrayOfSortedQuestion, ARGUMENTS.arrayOfQuesions[pos]);
			arrayDeleteAt(ARGUMENTS.arrayOfQuesions, pos);
		}

		return LOCAL.arrayOfSortedQuestion;
	}

	writeDump(sortQuestions(['1','2','3','4','5']));

执行一次得出的结果是:
random_items

jQuery HTML clone

有时候我们会有这样的需求:

在HTML页面中单击一个按钮,某处表格会增加一行新的内容
如果使用js直接串HTML,在js代码里就会显得很乱
那么我们就可以用到jQuery的clone方法了

Step 1. HTML代码中添加Template
[xhtml]


[/xhtml]

Step 2. JS中可以这样获取HTML Template,并替换内容追加到现有的HTML后
[js]
var emailItem = $($(“script.template”).html()).clone();
emailItem.attr(“id”, userId);
emailItem.find(“td.name”).text(userName);
emailItem.find(“td.email input”).val(userEmail);
$(“#email-selected”).append(emailItem);

$(this).closest(“tr”).fadeOut(1000, function() {
$(this).closest(“tr”).remove();
});
[/js]

分享一些好的技术学习站点

不知不觉,身后也跟了几个做IT的,每个人基础和天赋不一样,学习态度也不一样,所以掌握的技术深度自然也就不一样了。

我刚走出培训学校参加工作的时候,觉得自己什么都不是。害怕所有的即将到来的工作自己Hold不住,所以除了每天正常的工作外,还会抽出时间学习新的知识。ColdFusion、Oracle、jQuery也都是在这段时间学习并了解的。

然后就一直在Webtribe了,跟着Alan学习了许多新的开发技术(如OOP)和工具(如Git),但学到的远远不止这些了,对我来说都是一生的财富。

闲话不多说了,自己Bookmark的东西开始放出,以后还会随时更新。其实这些东西Google一下就能很方便的找到了。

学习站点:

工具集:

技术类站点:

官方API文档:

看来自己的Bookmark也需要整理一下了,后续还会再补充:)

常用的cfscript snippets

现在自己写CFML程序,除非老的代码修改,已经不再使用Tags,基本上是用Script了。

有时候花了很长时间在Google或Stackoverflow上查到的cfscript snippets,是已经用到了项目上,但是没有记录,可能过了有一段时间,再有用到这写cfscript snippets时,绞尽脑汁去回忆之前用在什么地方。

这样,挺浪费时间的,于是有想法在此Post里记录下,用到的时候就直接来这里Copy了。懒人么,就是这样:)

setting

setting enablecfoutputonly="true" requesttimeout="150" showdebugoutput="false";

param

param name="form.role" type="string" default="user";

directory

if(!directoryExists(filesDir)){
	directory action="create" directory="#filesDir#";
}

if(directoryExists(empFilesDir)){
	directory action="delete" directory="#filesDir#" recurse="true";
}

transaction

transaction {
	try {
		// do something
		transaction action="commit";
	} catch (any e) {
		writeDump(e);
		transaction action="rollback";
	}
}

query insert

queryObj = new query();
queryObj.setDatasource(request.dsn);

queryObj.setName("qryName");
queryObj.setSQL("
	INSERT INTO table_name (
		name,
		age,
		status
	) VALUES (
		:name,
		:age,
		:status
	)
");
queryObj.addParam(name="name",value="#mid#",cfsqltype="cf_sql_varchar");
queryObj.addParam(name="age",value="#empId#",cfsqltype="cf_sql_integer");
queryObj.addParam(name="status",value="#status#",cfsqltype="cf_sql_varchar");
queryPrefix = queryObj.execute().getPrefix();
newId = queryPrefix.generatedKey;
queryObj.clearParams();

query delete

queryObj.setName("deleteUser");
queryObj.setSQL("
	DELETE FROM users
	WHERE id = :id
");
queryObj.addParam(name="id",value="#id#",cfsqltype="cf_sql_numeric");
queryObj.execute();
queryObj.clearParams();

query update

queryObj.setName("updateTbl");
queryObj.setSQL("
	UPDATE tbl SET
		page = :page,
		status = :status
		modified_date = GETDATE()
	WHERE id = :id
");
queryObj.addParam(name="page",value="#form.page#",cfsqltype="cf_sql_numeric");
queryObj.addParam(name="status",value="#form.status#",cfsqltype="cf_sql_varchar");
queryObj.addParam(name="id",value="#form.id#",cfsqltype="cf_sql_numeric");
queryObj.execute();
queryObj.clearParams();

query select

queryObj.setName("getStuDtl");
queryObj.setSQL("
	SELECT	*
	FROM	students
	WHERE	id = :stu_id
");
queryObj.addParam(name="id",value="#form.stu_id#",cfsqltype="cf_sql_integer");
qryStuDtl = queryObj.execute().getResult();
queryObj.clearParams();

coldfusion query of queries

queryObj.setName("getOldTeachers");
queryObj.setDBType("query");
queryObj.setAttributes(questions=qryAllTeachers);
queryObj.setSQL("
	SELECT	*
	FROM 	qryAllTeachers
	WHERE	age > :max_age
	ORDER BY id
");
queryObj.addParam(name="max_age",value="55",cfsqltype="cf_sql_integer");
qryOldTeachers = queryObj.execute().getResult();
queryObj.clearParams();

Lucee Server Email 发送异常

前两天有客户提出最近自动发送Email的功能好像不是很稳定,很多次mail-to-list都接收不了邮件,我在本地也做了多次尝试,这里记录一下。

将SMTP设置成一个未知的Host,使用发送邮件时,程序中Catch不到任何异常。后来我就在\WEB-INF\lucee\logs\mail.log文件中查看有没有错误信息:

未知SMPT Server时,mail.log会记录如下信息:

"ERROR","Thread-186","04/08/2016","21:09:00","","mail;Unknown SMTP host: smtp.mail.test.com;
  nested exception is:
	java.net.UnknownHostException: smtp.mail.test.com;Unknown SMTP host: smtp.mail.test.com;
  nested exception is:
	java.net.UnknownHostException: smtp.mail.test.com
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1225):1225
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:322):322
	at javax.mail.Service.connect(Service.java:236):236
	at lucee.runtime.net.smtp.SMTPSender.run(Unknown Source):-1
"

Email用户名或密码不对时,mail.log会记录如下信息:

"ERROR","Thread-182","04/08/2016","20:18:37","","mail;553 Mail from must equal authorized user
;553 Mail from must equal authorized user

	at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1333):1333
	at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:906):906
	at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:535):535
	at lucee.runtime.net.smtp.SMTPSender.run(Unknown Source):-1
"

后来我打开Lucee的Web Administrator页面,进入Services – Tasks页面,就能看到type=mail的Task列表,这些都是自己发送异常的Email。Lucee会把这些发送异常的Email放在Task列表中,于第二天的那个时间再次尝试发送。
Lucee Email Task List

怎么判断浏览器是否是IE11

新建is_ie11.html,添加js代码如下:

console.log(navigator);

在IE11中打开这个文件,按下F12,看控制台里输出的userAgent为:

Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; GWX:DOWNLOADED; rv:11.0) like Gecko

所以,我们可以这样判断浏览器是否是IE11

//jQuery
var isIE11 = navigator.userAgent.test(/Trident.*rv[ :]*11\./);
if(isIE11){
	return true;
}

//js
var ie11Regex = new RegExp("Trident.*rv[ :]*11\.");
if(ie11Regex.test(navigator.userAgent)){
	return true;
}

Git 基本命令

查看Git全局设置:

git config -l

从远程仓库克隆项目到本地:

git clone https://github.com/sunpengcheng/my_blog.git /d/Projects/my_blog

查看远程仓库的fetch和push地址:

git remote -v

查看本地分支:

git branch

删除本地分支:

git branch -d xxxxx

查看远程分支:

git branch -r

删除远程分支:

git push origin :dev

jQuery Datepicker 开始日期不能大于结束日期

今天在测试Datepicker时,发现了如下情况,原代码是:
[js]
$(“#start-date”).datepicker({
changeMonth: true,
changeYear: true,
maxDate: “Now”,
onSelect:function(dateText,inst){
$(“#end-date”).datepicker(“option”,”minDate”,new Date(dateText);
}
});
[/js]
在IE11、Chrome、FF下,new Date(dateText)这种方式都是可以生成 Wed Mar 02 2016 08:00:00 GMT+0800 这样的标准时间。而到了IE8下却不能生成,出现了NaN。

原来是因为IE8不像IE11和Chrome及FF那样聪明,new Date()这个方法如果带参数初始化时,应该使用像new Date(yyyy,mm,dd)这样的标准格式才能生成日期;

所以代码改成了这样:
[js]
$(“#start-date”).datepicker({
changeMonth: true,
changeYear: true,
maxDate:”Now”,
onSelect:function(dateText,inst){
$(“#end-date”).datepicker(“option”,”minDate”,new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay));
}
});
[/js]
也会有同学有这样的需求,开始日期不能大于结束日期,于是就可以这样写了:
[js]
$(“#start-date”).datepicker({
changeMonth: true,
changeYear: true,
maxDate:”Now”,
onSelect:function(dateText,inst){
$(“#end-date”).datepicker(“option”,”minDate”,new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay));
}
});

$(“#end-date”).datepicker({
changeMonth: true,
changeYear: true,
maxDate:”Now”,
onSelect:function(dateText,inst){
$(“#start-date”).datepicker(“option”,”maxDate”,new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay));
}
});
[/js]