有趣的选择

Posted on 三月 4th, 2009 in 我想 | No Comments »

一篇blog引发的争论,不过还是在嘈杂声中看到一个有趣的选择。其实我挺庆幸自己还有选择的权力,或者说能力。

其实我很想谦虚一下的

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文件。加入下面代码:

PHP:
  1. $home = 'http://'.$_SERVER['HTTP_HOST'];
  2. $wpurl = 'http://'.$_SERVER['HTTP_HOST'];
  3. define('WP_HOME', $home);
  4. define('WP_SITEURL', $wpurl);

这样WordPress就会根据不同的域名进行转向,但新的问题又冒出来。写文章上传图片时图片的URL是当前域名的URL,如果更换其它域名访问文章时图片的URL不会作出相应变化。万一哪天域名用于别的网站那就糟糕了,会留下红叉叉。解决办法也是很简单,在后台管理中“设置-杂项”里将“文件的完整URL地址”设为“/wp-content/uploads”即可,当然这个值可以根据实际文件上传目录灵活设定。原因很简单,绝对路径指向是不会出错的,不管用的是哪个域名。题外话,我发现很多人不太闹得清楚绝对和相对路径概念。没有从DOS时代过来的人尤其摸不着头脑……

WordPress的Shortcode

Posted on 二月 9th, 2009 in 我学 | 3 Comments »

Shortcode,从字面上就知道是干什么用的。打开WordPress主题中的functions.php文件(如果选用的主题没有这个文件就创建一个),键入下面的代码:

PHP:
  1. function hello(){
  2.   return 'Hello World!';
  3. }
  4. add_shortcode('hw', 'hello');

这是个经典的Hello World,几乎所有的教程的开端都会教我们如何输出Hello World,不管是输出到控制台还是显示器上。这个函数很简单,就是返回这个字符串。

PHP:
  1. add_shortcode('hw', 'hello');

这一句是告诉WordPress,要将这个函数做为一个Shortcode形式调用,第一个参数是调用标识为“hw”,第二个参数是函数名称“hello”。接下来就是如何在我们的文章或页面里调用这个Shortcode。很简单,添加一篇新文章,在html模式下键入“[hw]”。发布后,会在[hw]位置出现经典的“Hello World”。这意味着以后我们写文章刚好需要写这个短语的时候只要输入[hw]就行了。不过我们相信Shortcode不只是这点点功能。

PHP:
  1. function myUrl($atts, $content = null) {
  2.     extract(shortcode_atts(array(
  3.         "href" => 'http://'
  4.     ), $atts));
  5.     return '<a href="'.$href.'">'.$content.'</a>';
  6. }
  7. add_shortcode("url", "myUrl");

这又是一个函数,并且这个函数可以进行Shortcode调用。myUrl函数的第一个参数用于获取Shortcode调用标识中的属性(集合),第二个参数是获取Shortcode调用标识中的内容。函数先提取标识属性(集合),shortcode_atts函数用于提取属性和属性值。如果在调用时没有设置属性或属性值,那么函数将生成所需的属性和默认值。该例只有一个属性,就是href,它设置了默认值http://。在文章或页面里可以这样进行Shortcode调用:

HTML:
  1. [url href="http://lzby.net/boho/blog"]我的博客[/url]

调用后,实际上会输出

HTML:
  1. <a href="http://lzby.net/boho/blog">我的博客</a>

这让我想起了BBCODE……
发挥一下我们的想像力吧,让我们做个“发送到Twitter”的功能,访问者用这个功能可以将我们的文章或页面发送到他的Twitter。

PHP:
  1. function twitt() {
  2.   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>';
  3. }
  4. 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。

下图为类库的层次说明图:

TSNewLib

抽象类StartableTrigger看起来很复杂,是为了保持完整性。用户在绝大多数情况下只需涉及Trigger子类进行触发设置。看代码:

C#:
  1. //获得ScheduledTasks对象,目标计算机名为"DALLAS"
  2. ScheduledTasks st = new ScheduledTasks(@"\\DALLAS");
  3. // 获得对象中的所有任务名称(数组)
  4. string[] taskNames = st.GetTaskNames();
  5. //打开对象中所有任务,并在控制台打印出任务字串
  6. foreach (string name in taskNames) {
  7. Task t = st.OpenTask(name);
  8. Console.WriteLine(" " + t.ToString()); t.Close();
  9. }
  10. //关闭对象,并释放COM资源
  11. st.Dispose();

创建一个新的任务:

C#:
  1. //获得本地计算机的ScheduledTasks对象
  2. ScheduledTasks st = new ScheduledTasks();
  3. // 创建task
  4. Task t;
  5. try {
  6. t = st.CreateTask("D checker");
  7. } catch (ArgumentException) {
  8. Console.WriteLine("Task name already exists");
  9. return;
  10. }
  11. //设置任务信息
  12. t.ApplicationName = "chkdsk.exe";
  13. t.Parameters = "d: /f";
  14. t.Comment = "Checks and fixes errors on D: drive";
  15. //设置计算机用户
  16. t.SetAccountInformation(@"THEDOMAIN\TheUser", "HisPasswd");
  17. // 声明必须要在系统要闲置10分钟时任务开始进行。
  18. t.IdleWaitMinutes = 10;
  19. //允许任务进行时间不超过2小时30分
  20. t.MaxRunTime = new TimeSpan(2, 30, 0);
  21. // 设置优先级别为仅当系统空闲时才远行
  22. t.Priority = System.Diagnostics.ProcessPriorityClass.Idle;
  23. // 创建触发,每周上午6:30
  24. t.Triggers.Add(new WeeklyTrigger(6, 30, DaysOfTheWeek.Sunday));
  25. // 保存任务
  26. t.Save();
  27. // 关闭COM资源
  28. t.Close();
  29. // 关闭对象,并释放COM资源
  30. 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:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <RecentTutorials>
  3.   <Tutorial author="The Reddest">
  4.     <Title>Silverlight and the Netflix API</Title>
  5.     <Categories>
  6.       <Category>Tutorials</Category>
  7.       <Category>Silverlight 2.0</Category>
  8.       <Category>Silverlight</Category>
  9.       <Category>C#</Category>
  10.       <Category>XAML</Category>
  11.     </Categories>
  12.     <Date>1/13/2009</Date>
  13.   </Tutorial>
  14.   <Tutorial author="The Harriest">
  15.     <Title>Cake PHP 4 - Saving and Validating Data</Title>
  16.     <Categories>
  17.       <Category>Tutorials</Category>
  18.       <Category>CakePHP</Category>
  19.       <Category>PHP</Category>
  20.     </Categories>
  21.     <Date>1/12/2009</Date>
  22.   </Tutorial>
  23.   <Tutorial author="The Tallest">
  24.     <Title>Silverlight 2 - Using initParams</Title>
  25.     <Categories>
  26.       <Category>Tutorials</Category>
  27.       <Category>Silverlight 2.0</Category>
  28.       <Category>Silverlight</Category>
  29.       <Category>C#</Category>
  30.       <Category>HTML</Category>
  31.     </Categories>
  32.     <Date>1/6/2009</Date>
  33. </Tutorial>
  34.   <Tutorial author="The Fattest">
  35.     <Title>Silverlight 2 - Using initParams</Title>
  36.     <Categories>
  37.       <Category>Tutorials</Category>
  38.       <Category>Silverlight 2.0</Category>
  39.       <Category>Silverlight</Category>
  40.       <Category>C#</Category>
  41.       <Category>HTML</Category>
  42.     </Categories>
  43.     <Date>12/12/2008</Date>
  44.   </Tutorial>
  45. </RecentTutorials>

假如这个XML的文件名是jquery_xml.xml。接着,需要用jQuery的AJAX函数来对这个文件进行异步请求:

JavaScript:
  1. $(document).ready(function()
  2. {
  3.     $.ajax({
  4.       type: "GET",
  5.       url: "jquery_xml.xml",
  6.       dataType: "xml",
  7.       success: parseXml
  8.     });
  9. });

正如上面代码所看到的,当ajax请求XML文件成功时,执行一个parseXml函数。该函数对XML文件内容进行解析遍历,找到Tutorial节点。然后再将Tutorial节点中的author属性的值添加到id="output"的元素里。

JavaScript:
  1. function parseXml(xml)
  2. {
  3.   //find every Tutorial and print the author
  4.   $(xml).find("Tutorial").each(function()
  5.   {
  6.     $("#output").append($(this).attr("author") + "<br />");
  7.   });
  8.  
  9.   // Output:
  10.   // The Reddest
  11.   // The Harriest
  12.   // The Tallest
  13.   // The Fattest
  14. }

看起来真的很简单,我们再来一个稍微复杂点的应用。这次我们不在id="output"元素里追加Tutorial节点的author属性值,而是追加Tutorial节点下的Date和Title节点的内容。这两个节点都是Tutorial的子节点。

JavaScript:
  1. $(xml).find("Tutorial").each(function()
  2. {
  3.   $("#output").append($(this).find("Date").text());
  4.   $("#output").append(": " + $(this).find("Title").text() + "<br />");
  5. });
  6.  
  7. // Output:
  8. // 1/13/2009: Silverlight and the Netflix API
  9. // 1/12/2009: Cake PHP 4 - Saving and Validating Data
  10. // 1/6/2009: Silverlight 2 - Using initParams
  11. // 12/12/2008: Silverlight 2 - Using initParams

很显然,目的是显示每部教程的名称,名称前面是教程的发布日期。有别于第一个例子的显示的是节点的内容,而不是节点的属性值。
好的,再来看一看更复杂一些的例子。我们要将Tutorial节点下Category子节点中的所有数据也显示出来:

JavaScript:
  1. $(xml).find("Tutorial").each(function()
  2. {
  3.   $("#output").append($(this).find("Title").text() + "<br />");
  4.  
  5.   $(this).find("Category").each(function()
  6.   {
  7.     $("#output").append($(this).text() + "<br />");
  8.   });
  9.  
  10.   $("#output").append("<br />");
  11. });
  12.  
  13. // Output:
  14. // Silverlight and the Netflix API
  15. // Tutorials
  16. // Silverlight 2.0
  17. // Silverlight
  18. // C#
  19. // XAML
  20.  
  21. // Cake PHP 4 - Saving and Validating Data
  22. // Tutorials
  23. // CakePHP
  24. // PHP
  25.  
  26. // Silverlight 2 - Using initParams
  27. // Tutorials
  28. // Silverlight 2.0
  29. // Silverlight
  30. // C#
  31. // HTML
  32.  
  33. // Silverlight 2 - Using initParams
  34. // Tutorials
  35. // Silverlight 2.0
  36. // Silverlight
  37. // C#
  38. // HTML

不难看出其实在遍历Tutorial节点时又嵌入了一个对Category子节点的遍历。最终将完整的数据呈现出来。如此来看,jQuery对XML的解析是很简单的,有着和解析XHML一样的方法.attr()和.text……

Aquaron jQuery插件集

Posted on 一月 15th, 2009 in 我学, 我看, 我译 | No Comments »

Aquaron包含了10个相当不错的jQuery插件。并附有源代码,实例和详细的开发文档。

post插件——简单地实现AJAX提交数据功能。

JavaScript:
  1. $.post('/script.cgi', 'q=searchstring', function($j) {
  2. var _o = eval($j);
  3. alert(_o.status);
  4. }

代码对script.cgi进行AJAX调用,以q=searchstring作为参数数据。然后执行回调函数。

cloudinizr插件——实现从某个元素内容中生成一组标签云。

JavaScript:
  1. $('#example').html($('textarea').val()).cloudinizr();
  2. $('#example span').hover(
  3. function() { $(this).css('backgroundColor','#fff') },
  4. function() { $(this).css('backgroundColor','transparent') })
  5. .click(function(){ $(this).css({fontWeight: 'bold',color: '#888'}) });

代码将textarea这个多列文本框中的所有单词进行组合,并在id="example"的元素里生成组合后的标签云。然后设置标签云中的单个标签的悬浮效果。

vertigro插件——实现输入框随着字数增加自动改变高度。

JavaScript:
  1. $('textarea').vertigro();

定义多列文本框进行自动变高。

aqPaging插件——实现分页功能。

JavaScript:
  1. // create paging container
  2. $('#example').aqPaging({
  3. current: 1, pages: 10, flip: true,
  4. cb: function(p){ $('.brownbox b').html('Page '+p); }
  5. });
  6.  
  7. // submit the form to call the flipping function
  8. $('#example').aqPaging({current: 1, pages: 11});

定义id="example"为分页容器,并设置当前页为1,总页数为10,启用跳页回调函数功能,回调函数执行弹出显示当前页号的对话框。

aqMenu插件——创建一个菜单。

JavaScript:
  1. $('#example').aqMenu([
  2. ['hom', 'Home'"$('#example').aqMenu('hom');"],
  3. ['bed', 'Bed',   "$('#example').aqMenu('bed');"],
  4. ['gar', 'Garage',"$('#example').aqMenu('gar');"]
  5. ],{currentID: 'hom'});

代码定义id="example"为菜单容器,然后用一个多维数组定义各菜单项。

aqString插件——用于处理字符串。比如:

JavaScript:
  1. var str = ",a,,b,c,d,,e,,,,f,g,";
  2. var list = $.aqString.trim(str,',');

清除变量str中多余的逗号字符。

aqCookie插件——用于获取或设置Cookie。

JavaScript:
  1. var f = document.forms['fex'];
  2. $.aqCookie.set(f.key.value,f.val.value);
  3. var arry = $.aqCookie.get(f.key.value);
  4. alert(arry[f.key.value]);
  5. $.aqCookie.del(f.key.value);

从表单里得到或设置一些Cookie值。

aqFloater插件——使一个元素浮动,并依附于浏览器窗口。

JavaScript:
  1. $('button').click(function(){
  2. $('#example').aqFloater({attach: 'nw'});
  3. });

点击按钮,并让id="example"元素浮动依附在窗口的左上角。

aqLayer插件——创建一个样式化的层,并依附在某个元素上。用于提示信息的呈现作用。

JavaScript:
  1. $('#example1').aqLayer({closeBtn:true,attach:'se'})
  2. .click(function(){
  3. $(this).aqLayer('lower-right corner; try moving this box around')
  4. });

将样式层依附在id="example1"的右下方。

aqTip插件——用于当鼠标移至某个元素时,在旁边弹出一个信息框。

JavaScript:
  1. $('#example1').aqTip('Tip me');
  2.  
  3. $('#example2').hover(
  4. function(){
  5. var p = $(this).position();
  6. $(this).aqTipOne('top: '+p.top+'&lt;br&gt;left: '+p.left,{marginX: 20}) },
  7. function(){ $(this).aqTipOne() }
  8. );

当鼠标移至id="example1"元素时,在旁边弹出“Tip me”。当鼠标移至id="example2"的元素时,弹出元素的位置信息。

8个很有用的jQuery插件

Posted on 一月 14th, 2009 in 我学, 我看 | No Comments »

jQuery虚拟键盘

非常适用于在公共场所输入密码,极高的用户体验。查看或下载插件

在IE中显示文字阴影

查看教程

快速搜索

可以快速定位数据表格。下载插件

滑动门

菜单动画以及华丽的滑动门效果。下载插件

日期选择器

下载插件

精美的提示信息

下载插件

FaceBox

是一个类似FaceBook样式的lightbox,可以显示图片,div,甚至整个页面。下载插件

ColorPicker

就像Adobe Photoshop的色彩选择效果一样。下载插件