其实我很想谦虚一下的
Posted on 二月 26th, 2009 in 我想 | No Comments »
大头健似乎有些担心,因为他并不知道他需要的只是一段简单的JS,这段JS放置在他的门户中就会显示出他想要的结果。他所担心的则是显示的结果与他的门户页面从外观看上去是否和谐。他打算打包一份门户页面的截图给我,要我按截图的风格来进行数据显示。
我耐心地向他解释,我的JS显示的数据遵循XHTML,而且我会提供一份输出XHTML的CSS结构表,他的设计师可以按照这个结构自由进行样式设计。然而这原本是很简单的工作仍然出现了障碍。很明显的,他的设计师并不了解XHTML和CSS。我无法想象他们的门户是用什么来做样式呈现,由于他们的门户放在GA网内,不是GA休想进入,所以我的好奇心看来得不到满足了!
于是还是问大头健要了截图,老老实实地将CSS嵌入XHTML通过JS一并输出。非常不unobtrusive,没办法,其实我很想谦虚一下的。
WordPress多个域名支持
Posted on 二月 20th, 2009 in 我想 | 7 Comments »
手头上有闲着的域名若干,指向同一个WordPress就麻烦了,出了一堆稀里糊涂的错。google一番找到了解决方法,就是改wp-config.php文件。加入下面代码:
这样WordPress就会根据不同的域名进行转向,但新的问题又冒出来。写文章上传图片时图片的URL是当前域名的URL,如果更换其它域名访问文章时图片的URL不会作出相应变化。万一哪天域名用于别的网站那就糟糕了,会留下红叉叉。解决办法也是很简单,在后台管理中“设置-杂项”里将“文件的完整URL地址”设为“/wp-content/uploads”即可,当然这个值可以根据实际文件上传目录灵活设定。原因很简单,绝对路径指向是不会出错的,不管用的是哪个域名。题外话,我发现很多人不太闹得清楚绝对和相对路径概念。没有从DOS时代过来的人尤其摸不着头脑……
WordPress的Shortcode
Posted on 二月 9th, 2009 in 我学 | 3 Comments »
Shortcode,从字面上就知道是干什么用的。打开WordPress主题中的functions.php文件(如果选用的主题没有这个文件就创建一个),键入下面的代码:
-
function hello(){
-
return 'Hello World!';
-
}
-
add_shortcode('hw', 'hello');
这是个经典的Hello World,几乎所有的教程的开端都会教我们如何输出Hello World,不管是输出到控制台还是显示器上。这个函数很简单,就是返回这个字符串。
-
add_shortcode('hw', 'hello');
这一句是告诉WordPress,要将这个函数做为一个Shortcode形式调用,第一个参数是调用标识为“hw”,第二个参数是函数名称“hello”。接下来就是如何在我们的文章或页面里调用这个Shortcode。很简单,添加一篇新文章,在html模式下键入“[hw]”。发布后,会在[hw]位置出现经典的“Hello World”。这意味着以后我们写文章刚好需要写这个短语的时候只要输入[hw]就行了。不过我们相信Shortcode不只是这点点功能。
这又是一个函数,并且这个函数可以进行Shortcode调用。myUrl函数的第一个参数用于获取Shortcode调用标识中的属性(集合),第二个参数是获取Shortcode调用标识中的内容。函数先提取标识属性(集合),shortcode_atts函数用于提取属性和属性值。如果在调用时没有设置属性或属性值,那么函数将生成所需的属性和默认值。该例只有一个属性,就是href,它设置了默认值http://。在文章或页面里可以这样进行Shortcode调用:
-
[url href="http://lzby.net/boho/blog"]我的博客[/url]
调用后,实际上会输出
-
<a href="http://lzby.net/boho/blog">我的博客</a>
这让我想起了BBCODE……
发挥一下我们的想像力吧,让我们做个“发送到Twitter”的功能,访问者用这个功能可以将我们的文章或页面发送到他的Twitter。
-
function twitt() {
-
return '<div id="twitit"><a href="http://twitter.com/home?status=Currently reading '.get_permalink($post->ID).'" title="Click to send this page to Twitter!" target="_blank">Share on Twitter</a></div>';
-
}
-
add_shortcode('twitter', 'twitt');
然后在文章或页面里输入[twitter],发布即可。
这里有更多的实例和应用,比如生成RSS订阅按钮,随地乱放广告等等:http://www.smashingmagazine.com/2009/02/02/mastering-wordpress-shortcodes/
.NET的一个计划任务类库
Posted on 二月 1st, 2009 in 我学 | No Comments »
可以用Windows系统自带的“计划任务”(通常在控制面板里,要么就在Windwos目录下的Tasks文件夹里)创建一系列的任务调度,另外还可以用schtasks和at命令创建任务。对于开发者来说已经有了一套COM接口,据我说知.NET框架中还尚未有这样的支持。还好这里有一套.NET的类库,将很好地在系统中创建计划任务。
该库支持Windows Vista,Windows xp,Windows Server2003和Windows2000。
下图为类库的层次说明图:
抽象类StartableTrigger看起来很复杂,是为了保持完整性。用户在绝大多数情况下只需涉及Trigger子类进行触发设置。看代码:
-
//获得ScheduledTasks对象,目标计算机名为"DALLAS"
-
// 获得对象中的所有任务名称(数组)
-
string[] taskNames = st.GetTaskNames();
-
//打开对象中所有任务,并在控制台打印出任务字串
-
foreach (string name in taskNames) {
-
Task t = st.OpenTask(name);
-
Console.WriteLine(" " + t.ToString()); t.Close();
-
}
-
//关闭对象,并释放COM资源
-
st.Dispose();
创建一个新的任务:
-
//获得本地计算机的ScheduledTasks对象
-
// 创建task
-
Task t;
-
try {
-
t = st.CreateTask("D checker");
-
} catch (ArgumentException) {
-
Console.WriteLine("Task name already exists");
-
return;
-
}
-
//设置任务信息
-
t.ApplicationName = "chkdsk.exe";
-
t.Parameters = "d: /f";
-
t.Comment = "Checks and fixes errors on D: drive";
-
//设置计算机用户
-
t.SetAccountInformation(@"THEDOMAIN\TheUser", "HisPasswd");
-
// 声明必须要在系统要闲置10分钟时任务开始进行。
-
t.IdleWaitMinutes = 10;
-
//允许任务进行时间不超过2小时30分
-
// 设置优先级别为仅当系统空闲时才远行
-
t.Priority = System.Diagnostics.ProcessPriorityClass.Idle;
-
// 创建触发,每周上午6:30
-
// 保存任务
-
t.Save();
-
// 关闭COM资源
-
t.Close();
-
// 关闭对象,并释放COM资源
-
st.Dispose();
这里有更多的实例,包括了类库和MSDN帮助文件的下载。
PHPMailer-用gmail帐号发邮件
Posted on 一月 21st, 2009 in 我学 | No Comments »
1,下载PHPMailer;
2,下载后解压到你的站点目录;
3,在站点中创建一个email.php脚本文件;
4,将下面的代码复制到email.php文件中,蓝色部分要设置成自己相应的值:
<?php
include("class.phpmailer.php");//加载phpmailer主类,一般情况下要设定好phpmailer路径
include("class.smtp.php"); // 加载smtp类,一般情况下要设定好phpmailer路径
$mail = new PHPMailer();
IsSMTP(); // 使用SMTP
$mail->SMTPSecure = "ssl"; // 设置连接服务器前缀
$mail->Host = "smtp.gmail.com"; // GMAIL的SMTP
$mail->Port = 465; // GMAIL的SMTP端口号
$mail->SMTPAuth = true; // 开启SMTP认证
$mail->Username = "username@gmail.com"; // GMAIL用户名
$mail->Password = "password"; // GMAIL密码
$webmaster_email = "username@doamin.com"; //回复到该地址
$email="username@domain.com"; // 收件人
$name="name"; // 收件人名称
$mail->From = $webmaster_email;
$mail->FromName = "Webmaster";
$mail->AddAddress($email,$name);
$mail->AddReplyTo($webmaster_email,"Webmaster");
$mail->WordWrap = 50; // 设定 word wrap
$mail->AddAttachment("/var/tmp/file.tar.gz"); // 附件1
$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // 附件2
$mail->IsHTML(true); // 以HTML发送
$mail->Subject = "This is the subject";
$mail->Body = "Hi,
This is the HTML BODY "; //HTML Body
$mail->AltBody = "This is the body when user views in plain text format"; //纯文字时的Body
if(!$mail->Send())
{
echo "Mailer Error: " . $mail->ErrorInfo;
}
else
{
echo "Message has been sent";
}
?>
完了,email.php运行后就会用gmail给目标地址发邮件……
我想……
Posted on 一月 21st, 2009 in 我想 | No Comments »
今天一PHP超粉给我留言:弃暗投明了吧!知道PHP好了吧!大概这段时间我的delicious里都有不少PHP的收录,被他看到了,误认为我如何如何。好像我从未表示过要坚持什么,更没有表示过要放弃什么。只是这段时间需要我用PHP去完成一些工作,所以我不得不进一步去了解PHP。同样的道理,前些日子我需要用.net去完成一些工作,所以那段时间我不得不进一步去了解.net。说不定过些日子需要我用JAVA去完成一些工作,我又钻进JAVA里去了。我已经不得不被工作牵着鼻子走了,再被各种各样的语言牵着鼻子我大概也不想混互联网了……
用jQuery解析XML
Posted on 一月 18th, 2009 in 我学, 我看, 未分类 | 1 Comment »
XML就不多说了,看看jQuery是如何解析XML内容的。首先要准备好一个XML文件,内容如下:
-
<?xml version="1.0" encoding="utf-8" ?>
-
<RecentTutorials>
-
<Tutorial author="The Reddest">
-
<Title>Silverlight and the Netflix API</Title>
-
<Categories>
-
<Category>Tutorials</Category>
-
<Category>Silverlight 2.0</Category>
-
<Category>Silverlight</Category>
-
<Category>C#</Category>
-
<Category>XAML</Category>
-
</Categories>
-
<Date>1/13/2009</Date>
-
</Tutorial>
-
<Tutorial author="The Harriest">
-
<Title>Cake PHP 4 - Saving and Validating Data</Title>
-
<Categories>
-
<Category>Tutorials</Category>
-
<Category>CakePHP</Category>
-
<Category>PHP</Category>
-
</Categories>
-
<Date>1/12/2009</Date>
-
</Tutorial>
-
<Tutorial author="The Tallest">
-
<Title>Silverlight 2 - Using initParams</Title>
-
<Categories>
-
<Category>Tutorials</Category>
-
<Category>Silverlight 2.0</Category>
-
<Category>Silverlight</Category>
-
<Category>C#</Category>
-
<Category>HTML</Category>
-
</Categories>
-
<Date>1/6/2009</Date>
-
</Tutorial>
-
<Tutorial author="The Fattest">
-
<Title>Silverlight 2 - Using initParams</Title>
-
<Categories>
-
<Category>Tutorials</Category>
-
<Category>Silverlight 2.0</Category>
-
<Category>Silverlight</Category>
-
<Category>C#</Category>
-
<Category>HTML</Category>
-
</Categories>
-
<Date>12/12/2008</Date>
-
</Tutorial>
-
</RecentTutorials>
假如这个XML的文件名是jquery_xml.xml。接着,需要用jQuery的AJAX函数来对这个文件进行异步请求:
-
$(document).ready(function()
-
{
-
$.ajax({
-
type: "GET",
-
url: "jquery_xml.xml",
-
dataType: "xml",
-
success: parseXml
-
});
-
});
正如上面代码所看到的,当ajax请求XML文件成功时,执行一个parseXml函数。该函数对XML文件内容进行解析遍历,找到Tutorial节点。然后再将Tutorial节点中的author属性的值添加到id="output"的元素里。
-
function parseXml(xml)
-
{
-
//find every Tutorial and print the author
-
$(xml).find("Tutorial").each(function()
-
{
-
$("#output").append($(this).attr("author") + "<br />");
-
});
-
-
// Output:
-
// The Reddest
-
// The Harriest
-
// The Tallest
-
// The Fattest
-
}
看起来真的很简单,我们再来一个稍微复杂点的应用。这次我们不在id="output"元素里追加Tutorial节点的author属性值,而是追加Tutorial节点下的Date和Title节点的内容。这两个节点都是Tutorial的子节点。
-
$(xml).find("Tutorial").each(function()
-
{
-
$("#output").append($(this).find("Date").text());
-
$("#output").append(": " + $(this).find("Title").text() + "<br />");
-
});
-
-
// Output:
-
// 1/13/2009: Silverlight and the Netflix API
-
// 1/12/2009: Cake PHP 4 - Saving and Validating Data
-
// 1/6/2009: Silverlight 2 - Using initParams
-
// 12/12/2008: Silverlight 2 - Using initParams
很显然,目的是显示每部教程的名称,名称前面是教程的发布日期。有别于第一个例子的显示的是节点的内容,而不是节点的属性值。
好的,再来看一看更复杂一些的例子。我们要将Tutorial节点下Category子节点中的所有数据也显示出来:
-
$(xml).find("Tutorial").each(function()
-
{
-
$("#output").append($(this).find("Title").text() + "<br />");
-
-
$(this).find("Category").each(function()
-
{
-
$("#output").append($(this).text() + "<br />");
-
});
-
-
$("#output").append("<br />");
-
});
-
-
// Output:
-
// Silverlight and the Netflix API
-
// Tutorials
-
// Silverlight 2.0
-
// Silverlight
-
// C#
-
// XAML
-
-
// Cake PHP 4 - Saving and Validating Data
-
// Tutorials
-
// CakePHP
-
// PHP
-
-
// Silverlight 2 - Using initParams
-
// Tutorials
-
// Silverlight 2.0
-
// Silverlight
-
// C#
-
// HTML
-
-
// Silverlight 2 - Using initParams
-
// Tutorials
-
// Silverlight 2.0
-
// Silverlight
-
// C#
-
// HTML
不难看出其实在遍历Tutorial节点时又嵌入了一个对Category子节点的遍历。最终将完整的数据呈现出来。如此来看,jQuery对XML的解析是很简单的,有着和解析XHML一样的方法.attr()和.text……
Aquaron jQuery插件集
Posted on 一月 15th, 2009 in 我学, 我看, 我译 | No Comments »
Aquaron包含了10个相当不错的jQuery插件。并附有源代码,实例和详细的开发文档。
post插件——简单地实现AJAX提交数据功能。
-
$.post('/script.cgi', 'q=searchstring', function($j) {
-
var _o = eval($j);
-
alert(_o.status);
-
}
代码对script.cgi进行AJAX调用,以q=searchstring作为参数数据。然后执行回调函数。
cloudinizr插件——实现从某个元素内容中生成一组标签云。
-
$('#example').html($('textarea').val()).cloudinizr();
-
$('#example span').hover(
-
function() { $(this).css('backgroundColor','#fff') },
-
function() { $(this).css('backgroundColor','transparent') })
-
.click(function(){ $(this).css({fontWeight: 'bold',color: '#888'}) });
代码将textarea这个多列文本框中的所有单词进行组合,并在id="example"的元素里生成组合后的标签云。然后设置标签云中的单个标签的悬浮效果。
vertigro插件——实现输入框随着字数增加自动改变高度。
-
$('textarea').vertigro();
定义多列文本框进行自动变高。
aqPaging插件——实现分页功能。
-
// create paging container
-
$('#example').aqPaging({
-
current: 1, pages: 10, flip: true,
-
cb: function(p){ $('.brownbox b').html('Page '+p); }
-
});
-
-
// submit the form to call the flipping function
-
$('#example').aqPaging({current: 1, pages: 11});
定义id="example"为分页容器,并设置当前页为1,总页数为10,启用跳页回调函数功能,回调函数执行弹出显示当前页号的对话框。
aqMenu插件——创建一个菜单。
-
$('#example').aqMenu([
-
['hom', 'Home', "$('#example').aqMenu('hom');"],
-
['bed', 'Bed', "$('#example').aqMenu('bed');"],
-
['gar', 'Garage',"$('#example').aqMenu('gar');"]
-
],{currentID: 'hom'});
代码定义id="example"为菜单容器,然后用一个多维数组定义各菜单项。
aqString插件——用于处理字符串。比如:
-
var str = ",a,,b,c,d,,e,,,,f,g,";
-
var list = $.aqString.trim(str,',');
清除变量str中多余的逗号字符。
aqCookie插件——用于获取或设置Cookie。
-
var f = document.forms['fex'];
-
$.aqCookie.set(f.key.value,f.val.value);
-
var arry = $.aqCookie.get(f.key.value);
-
alert(arry[f.key.value]);
-
$.aqCookie.del(f.key.value);
从表单里得到或设置一些Cookie值。
aqFloater插件——使一个元素浮动,并依附于浏览器窗口。
-
$('button').click(function(){
-
$('#example').aqFloater({attach: 'nw'});
-
});
点击按钮,并让id="example"元素浮动依附在窗口的左上角。
aqLayer插件——创建一个样式化的层,并依附在某个元素上。用于提示信息的呈现作用。
-
$('#example1').aqLayer({closeBtn:true,attach:'se'})
-
.click(function(){
-
$(this).aqLayer('lower-right corner; try moving this box around')
-
});
将样式层依附在id="example1"的右下方。
aqTip插件——用于当鼠标移至某个元素时,在旁边弹出一个信息框。
-
$('#example1').aqTip('Tip me');
-
-
$('#example2').hover(
-
function(){
-
var p = $(this).position();
-
$(this).aqTipOne('top: '+p.top+'<br>left: '+p.left,{marginX: 20}) },
-
function(){ $(this).aqTipOne() }
-
);
当鼠标移至id="example1"元素时,在旁边弹出“Tip me”。当鼠标移至id="example2"的元素时,弹出元素的位置信息。







