来到乌市已经一个多月了,这段时间里,参加了别人的毕业典礼,心里可不是一番滋味。总是想起去年这个时候,经历了托福考试,毕业答辩。等到论文交稿,几张照片几次酒会,倏忽间大学就毕业了,留给我的又有什么呢?有句话就是,不是我上了大学,而是大学上了我,现在偶尔怀念高中时的经历,对大学生活反而没有多少印象和留恋。

话虽如此,我也有过记忆深刻的事情,还有某些人。陪我一起度过四年时光的朋友,不知近况安好?大部分人估计和我都不在一个层次上了吧。偶尔在校内/人人上看见一篇与我同届但休学一年毕业同学的日志,诸事不顺,满篇心酸,可惜悲剧往往都是自己造成的。末了,一句“你是我的P大,我能算你的学子么??”苦笑,我也不是一样吗?可怜必有可恨之处,优胜劣汰,不适应环境,不思进取,只能被淘汰,没人能帮得了。

一个人的时候总是不自觉的怀念过去。一些事情是难以释怀的,有时候,我真的怀疑也许自己怀念的不是某个人或者某件事,我不能忘记的只是过去,过去的经历,过去的一切,那些随风飘逝的日子。

往事已矣,我还是面对现实,活在当下比较轻松。乌市的环境还不错,蓝天白云,空气也很好,除了太干燥之外。这里是离海洋最远的城市,虽然我只在飞机上俯视过大海,但我也知道离海洋越远,气候必然干燥,夏季炎热,冬季寒冷。最近几天算是体会到了,内地大部分地方还二十多度,这里温度直接上三十了。不过这也算不了什么,比起炎热,更让我烦躁的是自己的生活态度:懒待懒怠懒得失,人来人往人随缘。没有激情,生活就一潭死水。sigh~什么时候才能脱离这样的生活呢?

在六月最后一天,谨以此纪念毕业一年,顺便留点愿望,来年,准确的说应该是再过几年,祝我能顺利毕业吧~

以上

写文章最痛苦的事情莫过于好不容易码完字,洋洋洒洒一大篇,自我感觉良好的情况,正准备发布的时候,按下发布键出现个错误。啊,各种错误,非法程序,白屏,网路错误,由于意外错误windows live writer将自动退出….

以上我说的是离线写博文的情况,这绝对不是第一次啦。习惯用wlw和手机写文章,每发生一次,真是欲哭无泪。wlw还好,平时也很稳定,还有自动保存功能,只是默认时间太长,现在必须修改成一分钟一次。手机上就麻烦了,我常用的是UCWEB直接登录到博客的wap界面写博文,就是这个地址:http://winysky.com/wap  用的是wordpress- t-wap插件生成的页面。有个已知问题,如果不打开ucweb的wap压缩中转选项的话,是无法正常登陆的。但最郁闷的是,写东西一般时间比较长,弄完了偶尔就会出现网络错误导致无法提交,一后退写的东西就没啦,我在这里已经栽了两次╮(╯▽╰)╭

昨天发现一个PPC上写博客专用的软件,就是wm平台上的writer,简介在这里,就是可以直接通过xmlrpc直接发布文章,还能指定分类目录。为了测试,码了一大段字,最后按下一步发布的时候,悲剧就来了,程序运行错误,运行错误,错误,误。。。真没个好用的软件。

终于发现wordpress自动保存和修订功能的用处了,从来就是为这种情况考虑的。用浏览器我也用了firefox的GM脚本—textarea backup,自动保存文本框里的输入,后退刷新都可以还原。可惜离线情况下还得自己想办法,以后还是老老实实用word mobile写好了再贴上来吧

一年了文章也就100多点,平均3天~4天更新一次,PR还是2,毕竟我不做链接,也不主动去吸引流量,自娱自乐罢了。不过还是挺感谢来访并留言的朋友,但凡来过的都会回访,互相交流还是很有乐趣的。

文章内容大多数是一些wordpress相关的东西吧,记录的日志倒是相对少了些,人太懒啦。更新不勤,还有原因就是关注博客程序本身胜过写日志了,爱折腾嘛,这可不是我的本意了。下一年平衡下文章分类,博客定位还是应该明确。

再次,记录过去,遥望未来,不会是永久,只希望能坚持更长的时间。

以前写过一些关于jQuery的ajax在wordpress中的应用,其中提到了评论分页采用ajax翻页的效果,实现评论分页无刷新翻页。国外早有相关的插件,国内也有mg12写的ajax commmet page。这些都是js实现的,既然用到了jQuery框架,改写下简洁点,当然基本还是mg12插件的方法。我也参考了philna2主题里的代码,提取出来适应其他主题,没啥技术。其实原作者也写过一篇教程,可惜直接copy是不行的,仅写了一半,我这里給补全。

基本原理是获取评论分页数,文章id,通过jQuery ajax过程传入参数,php部分响应用wp_list_comments函数获取评论输出。

1.、jQuery框架必须的。

2、在主题comment.php里找到<?php paginate_comments_links(); ?>前面加上一段:

<span id=”cp_post_id" style=”display:none;”>

<?php echo $post->ID; ?>

</span>

如果找不到<?php paginate_comments_links(); ?>,那就在分页代码,如上一页、下一页(具体看你主题)前加这个,其实也可以加到评论部分之前或之后的任意地方。这段的代码的作用是输出postid以便传入参数,如果你的文章div给出了postid,那也就不需要了。

 

3、js部分,放在模板最后,按照注释根据你的主题修改:

function ajacpload(){
$('#comment_pager a').click(function(){
    var wpurl=$(this).attr("href").split(/(\?|&)action=AjaxCommentsPage.*$/)[0];
    var commentPage = 1;
    if (/comment-page-/i.test(wpurl)) {
    commentPage = wpurl.split(/comment-page-/i)[1].split(/(\/|#|&).*$/)[0];
    } else if (/cpage=/i.test(wpurl)) {
    commentPage = wpurl.split(/cpage=/)[1].split(/(\/|#|&).*$/)[0];
    };
    //alert(commentPage);//获取页数
    var postId =$('#cp_post_id').text();
	//alert(postId);//获取postid
    var url = wpurl.split(/#.*$/)[0];
    url += /\?/i.test(wpurl) ? '&' : '?';
    url += 'action=AjaxCommentsPage&post=' + postId + '&page=' + commentPage;
    //alert(url);//看看传入参数是否正确
    $.ajax({
    url:url,
    type: 'GET',
    beforeSend: function() {
    document.body.style.cursor = 'wait';
    var C=0.7;//修改下面的选择器,评论列表div的id,分页部分的id
    $('#thecomments,#comment_pager').css({opacity:C,MozOpacity:C,KhtmlOpacity:C,filter:'alpha(opacity=' + C * 100 + ')'});
    var loading='Loading';
    $('#comment_pager').html(loading);
    },
    error: function(request) {
        alert(request.responseText);
    },
    success:function(data){
    var responses=data.split('');
    $('#thecomments').html(responses[0]);
    $('#comment_pager').html(responses[1]);
    var C=1; //修改下面的选择器,评论列表div的id,分页部分的id
    $('#thecomments,#comment_pager').css({opacity:C,MozOpacity:C,KhtmlOpacity:C,filter:'alpha(opacity=' + C * 100 + ')'});
    $('#cmploading').remove();
    document.body.style.cursor = 'auto';
    ajacpload();//自身重载一次
	//single_js();//需要重载的js,注意
	$body.animate( { scrollTop: $('#comment_header').offset().top - 200}, 1000);
        }//返回评论列表顶部
    });
    return false;
    });
}

4、下面是php响应部分,加到function里面:注意修改callback,参看你的主题comment.php里面wp_list_comments的写法。如果没有回调函数,就去掉callback。

<?php
/**ajax comment page
 * @return unknown_type
 */
function AjaxCommentsPage(){
 if( isset($_GET['action'])&& $_GET['action'] == 'AjaxCommentsPage'  ){
	global $post,$wp_query, $wp_rewrite;
	$postid = isset($_GET['post']) ? $_GET['post'] : null;
	$pageid = isset($_GET['page']) ? $_GET['page'] : null;
	if(!$postid || !$pageid){
		fail(__('Error post id or comment page id.'));
	}
	// get comments
	$comments = get_comments('post_id='.$postid);

	$post = get_post($postid);

	if(!$comments){
		fail(__('Error! can\'t find the comments'));
	}

	if( 'desc' != get_option('comment_order') ){
		$comments = array_reverse($comments);
	}

	// set as singular (is_single || is_page || is_attachment)
	$wp_query->is_singular = true;

	// base url of page links
	$baseLink = '';
	if ($wp_rewrite->using_permalinks()) {
		$baseLink = '&base=' . user_trailingslashit(get_permalink($postid) . 'comment-page-%#%', 'commentpaged');
	}

	// response 注意修改callback为你自己的,没有就去掉callback
	wp_list_comments('callback=winyskyComments&type=comment&page=' . $pageid . '&per_page=' . get_option('comments_per_page'), $comments);
	echo '<!--winysky-AJAX-COMMENT-PAGE-->';
	echo '<div id="comment_pager" class="cf"><span class="pages">评论分页</span><span id="cpager">';
	paginate_comments_links('current=' . $pageid . $baseLink);
	echo '</span></div>';
	die;
	}
}
add_action('init', 'AjaxCommentsPage');
?>

最后根据你的主题修改下css,你也可以自定义loading的样式,改改js就好了。

端午节放假,抽空折腾一会儿,\(^o^)/~

最近迷上玩三国杀,各种版本:

三国杀高考

考试开始,诸葛亮同学前五道题一挥而就,答得非常快,听说他前一天晚上在楼顶观星多时。
吕布心中默念:“无双!”发动技能,手拿两支笔,同时开做。
周瑜更强,同时用三支笔答题,运笔如飞。
夏侯渊干脆把笔一扔,直接交卷。
黄盖拿出小刀削铅笔,不当心把手指划破,流了好多血,监考老师赶紧送他去医务室包扎,等黄盖止血后回到考场,兜里满是答案。
许褚则是学习《越狱》,把答案纹在身上,考试的时候把衣服一脱,裸衣答题。
学习委员刘备同学成绩很好,第一时间把题目做完,然后把答案抄下来,偷偷传给后面的兄弟张飞。
张飞立刻把答案抄成N份,四处散发。
黄月英同学拿了一张小抄,抄完又拿一张,拿完又抄,抄完又拿……
马超在隔壁的考场,不知为什么居然也拿到张飞的小纸条。
曹操没拿到小纸条,急得满头大汗,突然他大叫一声:“魏将何在?”
马上甄姬扔过来一个小纸团。
曹操的叫声惊动了监考老师。老师扭头一看,却正好看见小乔在传纸条,于是就过去问:“你怎么回事?”小乔脸涨得通红,急着说:“不是我,”
然后随手一指旁边的郭嘉,“是他……”
监考老师不由分说,把郭嘉的考卷没收,郭嘉长叹一声,走出考场,路过曹操座位的时候,偷偷给他塞了两张字条。
这时貂蝉向监考老师告密:“老师,我看见的,陆逊和夏侯惇也在传纸条!”
监考老师果然从陆逊手里搜出小纸条,没收!不料一张刚收走,陆逊手里又出现一张小纸条,收了一张又一张,怎么也收不完。监考老师无奈,只好
转身去找夏侯惇。
老师没收了夏侯惇的小纸条,正要走开,突然感觉下身一痛,痔疮破裂了~~
华佗赶紧对老师急救,扶老师回到讲台坐下,递了个桃子给老师吃。
大乔同学也很关心的上前慰问老师,顺手在讲台上放了一本Playboy杂志。监考老师一手抚臀,一手揽书,看得爱不释手,把别的事情都忘了……
等考场安静下来,刘备突然发现自己的考卷没有了,四下一看,张辽面带微笑,拿着刘备的试卷拼命抄答案呢。
甘宁给张辽使眼色,要他把刘备的考卷给他看看,张辽不肯。甘宁大怒,一把抢过试卷撕了。
刘备急坏了,没考卷怎么办?孙尚香把手里的两张小纸条扔掉,悄悄对刘备说:“夫君身体要紧”,刘备的考卷又恢复如初。
考试时间到,监考老师开始收试卷,收到周泰,周泰说,老师您等一下,先收后面的同学吧。
于是老师去收后面曹仁的试卷,曹仁说,下次考试的时候一起交卷吧,我多做3道题。
再后面是吕蒙同学,他交了20多张答卷,从小学到大学的考卷都有……
再后面是孙权。孙权同学觉得最后一个大题太难,于是制衡了一题。谁知道制衡出来的题目更难……
终于老师收完了其他考卷,回到周泰面前。周泰偷眼一看,最上面是孙权的卷子,最后一题的答案跟他一样,于是交卷。
过了几天,成绩发表:
赵云同学判断题全对
司马懿同学选择题全对
黄忠同学计算题全对
于吉同学论述题全对
司马懿同学最终成绩98分,阅卷老师批改试卷后发现遗失文具两件。
神吕蒙同学100分。
神关羽同学考卷没有批完,据说阅卷老师批了他5道错题后,突然觉得心神不宁,口吐鲜血,倒地不起……

世界杯太可怕了

太可怕了,夏侯惇被进球后裁判没有出示红牌,对方也丢了一分!
太可怕了,世界杯上张飞拿出N个球竟然都射进了,结果没犯规竟然赢了!
太可怕了,司马懿趁裁判不注意,把黄牌换成了红牌!
太可怕了,孟德队被攻门时,可以请后卫代为守门!
太可怕了,小乔直接把球弹进对方球门了!
太可怕了,陆逊踢出去一球,从兜里又拿出了一个球!
太可怕了,周瑜队让对方猜球的颜色,猜错了就要算他进球!
太可怕了,孙权队一场比赛可以无限换人!
太可怕了,有个叫吕蒙的竟然90分钟没射!
太可怕了,典韦队员扔出了一把铁扳手,直接得了一分!
太可怕了,张辽把对方两名球员变成己方!
太可怕了,郭嘉队每被进一个,就可以多上场两名球员!
太可怕了,庞德队每被扑出一次射门,就可以多罚一次点球!
太可怕了,刘备队每被罚下两人,就可以吹掉对手一个进球!
太可怕了,于吉可以把球鞋当球射进对方球门,还算分!
太可怕了,吕布射点球门将要扑两次!
太可怕了,魏延罚进了一个点球,不仅自己得一分,对方还少了一分!
太可怕了,荀彧拿出了一叠票子,强迫一队帮自己罚点球!
太可怕了,孙尚香换了双球鞋,她们就多了两人!
太可怕了,诸葛队球员全离开对方就不能射门了!
太可怕了,庞统队输了一场之后居然还可以重赛一场!
太可怕了,夏侯渊脚上没球也能射门,射完后把裤子一脱,还可以再补一脚!!
太可怕了,于吉队守门员在对方要射门时突然拿出张纸说这是红牌你信不信!
太可怕了,赵云可以把手当作脚用,把脚当作手用!
太可怕了,张角在完成一次扑救后,可以要求裁判随机选择观众,如果他的衣服是黑的,
那么对方算被攻入两球!
靠,黄盖队踢了三个乌龙以后,上了 20个球员! 

WordPress显示QQ头像,以前觉得好玩,在Gravatar缓存多的基础上又增加了QQ的头像缓存,Gravatar 頭像和QQ头像緩存Gravatar -QQ头像緩存(更新)两篇文章。以前是用“网站地址” 检测QQ号,觉得影响隐私,加上很难获取到QQ的自定义头像(腾讯没有接口),所以就放弃了。

最近又有博友问起,我找了几种实现方法,觉得Hacklog的方法不错,拿过来修改了一下:

使用方法,只需要在邮箱那里填写QQ号+QQ.com.现在实现的功能:

访客填写的邮箱地址,如果是以QQ.com/VIP.QQ.com/FOXMAIL.com结尾的邮箱,并且前面是数字的(即QQ号码),加载QQ头像,并缓存。

访客网址部分填写的url如果是以纯数字开头,判断为QZONE(当然会有误判,但很少),获取号码,也显示QQ头像,并缓存。

其它情况,获取Gravatar头像缓存。

这样做避免了输入QQ号码泄漏的问题,你看源代码也没关系。因为我是直接调用的缓存头像,参数是邮箱地址,经过MD5加密。

代码还是一样,加在function.php里面:

<?php
function my_avatar( $avatar, $id_or_email ) {
 $email = '';
    $url='';
    if ( is_numeric($id_or_email) ) {
        $id = (int) $id_or_email;
        $user = get_userdata($id);
        if ( $user )
            $email = $user->user_email;
    } elseif ( is_object($id_or_email) ) {
        if ( isset($id_or_email->comment_type) && '' != $id_or_email->comment_type && 'comment' != $id_or_email->comment_type )
            return false; // No avatar for pingbacks or trackbacks

        if ( !empty($id_or_email->user_id) ) {
            $id = (int) $id_or_email->user_id;
            $user = get_userdata($id);
            if ( $user)
                $email = $user->user_email;
        } elseif ( !empty($id_or_email->comment_author_email) )
        {
            $email = $id_or_email->comment_author_email;
            $url=$id_or_email->comment_author_url;
        }
    } else {
        $email = $id_or_email;
    }
$f = md5(strtolower($email));
$w = get_bloginfo('wpurl');
$e = ABSPATH.'/wp-content/avatar/'. $f .'.jpg';//缓存路径777权限
$t = 1209600; //設定14天, 單位:秒
//如果博客是Qzone或者邮箱以QQ邮箱结尾的 ,就用QQ头像。   
if ( !empty($url) && preg_match('/^(http:\/\/)?[1-9][0-9]*[\.a-zA-Z\/]+$/i', $url) ||  preg_match('/^[1-9][0-9]*@qq\.com$/i', $email) ||  preg_match('/^[1-9][0-9]*@foxmail\.com$/i', $email) ||  preg_match('/^[1-9][0-9]*@vip\.qq\.com$/i', $email))
 {
     $qq_face_url = 'http://face7.qun.qq.com/cgi/svr/face/getface?&uin=%s';
//QQ头像地址, %s表示QQ号
        $qq = preg_replace('|\D*|', '', $url);
        if(!$qq)
            $qq = preg_replace('|\D*|', '', $email);
$g = str_replace('%s', $qq, $qq_face_url);

  }
 else
 {
//否则就用gravatar头像(缓存)
$tmp = strpos($avatar, 'http');
$g = substr($avatar, $tmp, strpos($avatar, "'", $tmp) - $tmp);
}
if ( !is_file($e) || (time() - filemtime($e)) > $t ){
copy($g, $e); //當頭像不存在或文件超過14天才更新
@chmod($e,0777);
}
if ( filesize($e) < 500 ) {
@copy($w.'/wp-content/avatar/default.jpg', $e);
@chmod($e,0777);
}
$out = $w.'/wp-content/avatar/'.$f.'.jpg';
$avatar = preg_replace('/src=\'[^\']*\'/', 'src=\''.$out. '\'',  $avatar);

return $avatar;
}
add_filter('get_avatar', 'my_avatar' ,10 ,2); 

其实我觉得意义不大,放出来给需要的TX参考,没啥技术。

注意:请勿在本站测试,我没用使用这段代码,只在本地测试有用。不保证没有bug,已知问题是很大程度上不能显示QQ自定义头像,请看看前面两篇文章

如果你使用了这段代码,并觉得有用,欢迎留言提供地址,做个示例。

Typecho很多模板都是移植wordpress的模板,因为这两者实际上很相似。这次,我反其道行之,把typecho默认的模板移植到wordpress上来。这个白色版的皮肤纯css打造,简洁清新,无需插件,分页用了willin的Mini Pagenavi代码,支持自定义侧边栏。格外特色也没啥了,只是熟悉一下typecho的模板,练手。

demo

在线预览:http://winysky.com/demo?wptheme=typecho

提供下载

附加阅读:

Typecho是什么?

Typecho是一款博客程序,它在GPL Version 2许可证下发行,基于PHP(需要PHP5以上版本)构建,可以运行在各种平台上,支持多种数据库(Mysql,PostgreSQL,SQLite)

在使用博客程序的大部分时间里,我们只是发几段文字,贴几张图片,不需要高级复杂的系统,需要的是一个简单快速的博客平台。如果你觉得wordpress功能增加的同时越来越臃肿,那么Typecho是一个很好的替代选择。

域名转移到Godaddy后,附送了一个10G空间,一直闲置。因为有广告的原因,做图床还是可以的。今天有空把WP的附件全部弄到图床上去了,很多人都在用,据说速度还不错。

测试图片,用live writer很方便用FTP上传文件到图床:

22

首先是开通Godaddy的免费空间(当然默认是没有的),这个教程网上都有,就是选择主机类型的时候,linux的广告比较多,图床就用个windows的就好了。一般申请后一天就好,值得注意的是先看看分配共享IP被河蟹了没有。。。

更换数据的方法来自六维博客很早写的一篇文章: 关于将WP的附件转移到外部

第一步到自己的wp备份所有附件文件,一般就是/wp-content/uploads/文件夹下,都是按月归档的,打包就好。

第二步就是将其上传到你的附件库,将uploads文件夹内的东西全部上传进去。当然你可以给你的附件库绑定一个域名,Godaddy的主机管理页面中绑定一个二级域名,例如pic.winysky.com,再在主DNS中绑定一个A记录到免费空间共享IP Godaddy会自动创建该域名的A记录指向该空间。

第三步:进入WP的数据库,先备份,然后执行以下SQL命令:

UPDATE wp_posts SET post_content = replace(post_content, 'http://pic.winysky.com/content', 'http://pic.winysky.com/content');

这样还没完,我自己有个相册用的是imagevue:独立出来也放到图床上去,并且 pic.winysky.com 这个地址指向的就是相册首页。

此外,把这个相册嵌入到WP中,用的是iframe框架。演示:demo

刚好有博友写了一个超详细的教程,从安装到整合,点击这里去围观。我自己倒是写了个page的模板,适应主题大小。

换个背景