新年快乐!

今天是2012年的第一天,jucelin恭祝各位在新的一年里身体健康,财源广进,万事如意。


话说这个新建的博客从2011年的神棍节正式上线,至今已经跨年了,怎么说也是2年历史了。原本自己也不是一个经常写博客的人,但又是个大脑不够用的人,公司里的笔记总是忘记备份到网络上,所以干脆就选择直接记在网络上,这也是所谓的云吧,起个高级的名字:云笔记,呵呵。

找了几个和龙相关对联,自己欣赏欣赏,本来想找几个关于龙的祝福对联,可惜不才,没找到:

江山故国堪留鹤 华夏昊天可跃龙
龙腾华夏钟灵地 德启门庭毓秀人
唯大英雄能伏虎 是真豪杰乃降龙
无边春色来天地 有志金龙越古今
澳归犹凭龙剑气 邦兴勿忘虎门烟
八面威风增国力 九州春色启龙年
百尺高梧栖彩凤 万川汇海起蛟龙
北海云生龙对舞 丹山日上凤双飞
笔架山高才气现 砚池水满墨龙飞
笔走神龙大手笔 春归盛世好青春
笔走神龙凭大手 诗流雅韵有高人
碧海惊涛龙献瑞 苍梧茂叶凤呈祥
才闻兔岁凯旋曲 又唱龙年祝福
彩凤来仪迎大治 金龙起舞庆新春
苍龙半挂秦川雨 石马长嘶汉苑风
苍龙日暮还行雨 老树春深更著花
苍梧拔地栖金凤 碧海连天潜玉龙
辰居其所众星拱 龙腾于天万国钦
辰年迪吉千重瑞 龙岁呈祥四季宁
辰日一轮驰浩宇 龙年百业壮中华
赤兔追风千里志 金龙拱日万家春
出海神龙开世纪 挥毫妙笔颂春秋
春到人间争虎跃 喜传域外庆龙飞
春光明媚江山上 龙虎腾飞事业中
春节迎来春气象 龙年抖擞龙精神
春日春风春浩荡 龙年龙岁龙腾飞
春雨多情绿大地 金龙展志壮神州
大业功成惊世界 巨龙飞跃盛中华
大治凤鸣尤乐耳 小康龙舞更开心
丹凤朝阳歌盛世 苍龙布雨润神州

最后再次恭祝各位新年快乐!Happy new year!

偌大个互联网竟放不下一个安全的密码

CSDN,天涯社区密码被盗现在已经闹的沸沸扬扬,不禁让人想说,偌大个互联网竟放不下一个“安全”的密码,这不是坑爹嘛。

CSDN是国内非常牛的程序员社区,也是jucelin上学和现在经常光顾的社区之一,里面的牛人很多也很热情,结果就这样一个搞IT的社区却被IT给搞了,还使用原始的明文保存方式,明文吧也能理解,但保存也能忘记使用加密方式?我相信CSDN的程序员不会这么粗心大意的,那么到底是什么原因导致的,相信很多人和我一样都在期待最后的结果。在结果没出来值钱,我们也来猜猜。

朋友讨论时猜测了几种情况,发出来大家也讨论下:

1. 确实的工作人员的疏忽,导致帐号泄漏。那么CSDN的企业文化,工作流程估计需要重新刷新了,不,应该是重构。这个不解释。

2. CSDN自己出售给第三方,后因第三方的原因导致泄漏。那得替CSDN诉苦了,咱都卖出去了,哪还能hold住啊。用户帐号再值钱(这个还真值钱),那也得找个能hold住的买主啊!!

3. 内部员工自己出售的。那么估计最后的解释可能是,他是无证程序员,而且还是实习生,行为与公司无关,至于你信不信,反正我信了。

4. G·O·V实名制的要求,密码明文保存,并上交,结果还是从G·O·V里面泄漏出来了。这个咱就解释不了了。CSDN都被要求了,QQ,微博,那不是都是明文保存,并上交?原来G·O·V能很快查出来你在那些论坛说了那些话就是这个原因啊。别以为你宅在家里,黑灯瞎火的“我们”就看不见你。

5. 炒作。某杀毒软件商在扫描用户信息的时候扫到了该包,收集,发布,还好心提醒,这种一夜成名的事,多少能让公司挽回点正面形象。当然这种可能性不大,就针对这次事件来说。

当然上面的讨论也是纯属无稽之谈,仅供娱乐,因为上面的很多是永远得不到证明的,就想“砖家”在电视上评论各国的军事一样,你猜我猜大家猜,反正又证实不了。

现在又有很多“砖家”出来提醒用户使用高强度的密码,还建议不要使用同一个密码,我注册过上百个网站,使用不同的密码,就意味着我的建个文档几下我的密码,而且还得网络存储,那还不是一个样嘛。要是本地保存,再来个360服务器被google收录,可以搜索到密码这样的事,结果还是一个样。要我说,该咋样还是咋样,分几个级别的密码,应该基本上满足需求了,和钱有关的以及密保邮箱有关的,使用独有密码,那些使用QQ邮箱作为密保邮箱的该自个提醒提醒自己了。

另外,“听说”被盗的600万账户是CSDN2009年的数据库,这么说来,这600万帐号包含了很多CSDN核心用户的帐号,某些程序员的账户应当相当“值钱”,在加上很多网友的上网密码都是一号通,难怪卖上几百万也不为过呢。

IE BUG:内联的图片超链接失效

BUG描述下先:在标签<a>下加入<span>和<img>标签,并将<a>和<span>标签定义为display:block,设定大小,测试发现鼠标放在图片是不会显示手型,图片的链接也“失效”了(其实未失效,下面解释),点击没有任何效果,但点击<a>标签的空白位置,链接依然有效。

适用平台

IE6-8下出现,IE9未测试,Chrome正常。

BUG重现

下面是专门写的一个测试页面,有兴趣的可以测试下。

<html><head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

<title>IE BUG:内联的图片超链接失效 - Design by jucelin.com</title>

<style>

.test-a{display:block; width:100px; height:100px; background:#eee;}

.test-a .test-img{display:block; width:50px; height:50px; background:yellow;}

.test-a .test-title{display:block;}

</style>

</head><body>

<div>

<a href="https://jucelin.com" target="_blank">

<span><img src="Images/form.png" border="0" /></span>

<span>jucelin.com</span>

</a>

</div>

<div>

<a href="https://jucelin.com" target="_blank" class="test-a">

<span class="test-img"><img src="Images/form.png" border="0" /></span>

</a>

</div>

</body></html>

下面是测试的截图(图片丢失):

图中的鼠标应该是正常的鼠标,单截图没办法截下鼠标的样式,就随便找了个样式演示下。

从测试可以看出来,图片的链接实际上仍然存在的,鼠标放上去之后在IE的状态栏中显示了链接的地址,但单击时,则链接无法相应。jucelin也解释不了这其中的原因,只能记下来自己以后注意下。

解决办法

BUG 就找个Hack的方法补补,将img所在的span添加position:relative; z-index:-1;样式,就是将span的层级放到a的下方,此时的要求是a不能有背景色,否则img就看不到了。另外使用JS也可以很好的解决。

相关文档

IE6,7中, 图片导致超链接失效的bug:http://blog.163.com/thinker_creator/blog/static/101933149200941994831531/

网页下雪JS代码

圣诞节了,看到网易的活动页面上有个下雪的特效,就下下来看看,使用的是JS特效,看的比较浅,目前只会简单的使用下,不知道有没有高手能解析下。这里贴出来网页下雪JS代码,如果需要的朋友可以玩玩。

显示样式

正如你在我的博客上看到的,全屏,背景建议不是纯白,否则看不到雪花,你不可能把雪花调彩色吧,哈哈。(好吧,我的博客背景有些白,看的不明显,正考虑要不要调成彩色的,可找了半天没彩色的雪花,如果你有,记得给我个哦,蓝色的就算了,因为我链接的颜色的是蓝色的)

使用方法:

直接复制下面的代码粘贴到你博客页面底部模版。

<script type="text/javascript" language="javascript">

(function(){function k(a,b,c){if(a.addEventListener)a.addEventListener(b,c,false);else a.attachEvent&&a.attachEvent("on"+b,c)}function g(a){if(typeof window.onload!="function")window.onload=a;else{var b=window.onload;window.onload=function(){b();a()}}}function h(){var a={};for(type in{Top:"",Left:""}){var b=type=="Top"?"Y":"X";if(typeof window["page"+b+"Offset"]!="undefined")a[type.toLowerCase()]=window["page"+b+"Offset"];else{b=document.documentElement.clientHeight?document.documentElement:document.body; a[type.toLowerCase()]=b["scroll"+type]}}return a}function l(){var a=document.body,b;if(window.innerHeight)b=window.innerHeight;else if(a.parentElement.clientHeight)b=a.parentElement.clientHeight;else if(a&&a.clientHeight)b=a.clientHeight;return b}function i(a){this.parent=document.body;this.createEl(this.parent,a);this.size=Math.random()*5+5;this.el.style.width=Math.round(this.size)+"px";this.el.style.height=Math.round(this.size)+"px";this.maxLeft=document.body.offsetWidth-this.size;this.maxTop=document.body.offsetHeight- this.size;this.left=Math.random()*this.maxLeft;this.top=h().top+1;this.angle=1.4+0.2*Math.random();this.minAngle=1.4;this.maxAngle=1.6;this.angleDelta=0.01*Math.random();this.speed=2+Math.random()}var j=false;g(function(){j=true});var f=true;window.createSnow=function(a,b){if(j){var c=[],m=setInterval(function(){f&&b>c.length&&Math.random()<b*0.0025&&c.push(new i(a));!f&&!c.length&&clearInterval(m);for(var e=h().top,n=l(),d=c.length-1;d>=0;d--)if(c[d])if(c[d].top<e||c[d].top+c[d].size+1>e+n){c[d].remove(); c[d]=null;c.splice(d,1)}else{c[d].move();c[d].draw()}},40);k(window,"scroll",function(){for(var e=c.length-1;e>=0;e--)c[e].draw()})}else g(function(){createSnow(a,b)})};window.removeSnow=function(){f=false};i.prototype={createEl:function(a,b){this.el=document.createElement("img");this.el.setAttribute("src",b+"http://mimg.127.net/hxm/quan/hd/111207_sdj/style/img/snow.gif");this.el.style.position="absolute";this.el.style.display="block";this.el.style.zIndex="99999";this.parent.appendChild(this.el)},move:function(){if(this.angle< this.minAngle||this.angle>this.maxAngle)this.angleDelta=-this.angleDelta;this.angle+=this.angleDelta;this.left+=this.speed*Math.cos(this.angle*Math.PI);this.top-=this.speed*Math.sin(this.angle*Math.PI);if(this.left<0)this.left=this.maxLeft;else if(this.left>this.maxLeft)this.left=0},draw:function(){this.el.style.top=Math.round(this.top)+"px";this.el.style.left=Math.round(this.left)+"px"},remove:function(){this.parent.removeChild(this.el);this.parent=this.el=null}}})();

createSnow("", 80);

</script>

注意看下最后一句话,上面的是函数,打乱了,createSnow(“”, 80);就是调用上面的函数,共2个参数,第二个参数就是密度,简单点就是页面上显示多少个雪花,切记不要调的太高,不然可能导致硬件不好的电脑卡死;第一个我也不知道是干嘛的,JS我了解的也不是很多,随便给个值的话,雪花图片被修改了,可给定雪花地址,显示依然出错,望高手解析。

或者直接在页面模版末尾添加下面的代码

<script type="text/javascript" src="http://hd3.mail.163.com/christmas/js/snow.js"></script>
<script language="javascript">
createSnow("", 800);
</script>

注意的地方

1. JS中指定了雪花图片的链接,记得修改为自己的雪花图片哦,否则人家图片地址换了,就没了。

2. 记得放在</body>前面,避免JS的下载影响了前面正文内容的下载,这样做基本上可以实现页面已经加载完成,雪花才开始飘。

3. 不知道怎么在模版里面添加?以WP为例,后台-外观-编辑-右侧选择“底部(footer.php)”-看到</body>没?就在之前回车,在空行上直接添加调用snow.js,也可以直接把上面最长的代码复制上去。

4. 删除的方法:请参照3,但要求倒着操作。

相关资料

JS来自页面:http://quan.163.com/activity/index.do

JS链接地址:http://hd3.mail.163.com/christmas/js/snow.js(这里只是JS的函数,需要createSnow(“”, 800);来调用)

雪花图标:http://mimg.127.net/hxm/quan/hd/111207_sdj/style/img/snow.gif(如果修改请在上面的JS上直接替换就行,建议绝对地址)

jucelin雪花图标:https://jucelin.com/wp-content/uploads/2011/12/snow.gif(圣诞节过后会撤掉)

蓝色的雪花图标:https://jucelin.com/wp-content/uploads/2011/12/snow_blue.png(适合博客背景色为纯白色的)

圣诞节快到了,jucelin提前恭祝各位我认识的、认识我的、以及不认识的天天发财,身体倍棒。

一份黑客写的情书

hack技术学的再好, 却无法入侵你的心,服务器入侵的再多,

对你只有guest的权限,是我的ddos造成了你的拒绝服务?

还是我的webshell再次被你的anti-virus防护?

你总有防火墙

我始终停不掉

想提权

无奈jsp+mysql成为我们的障碍

找不到你的注入点 扫不到你的弱口令

所有对我的回应都用了MD5加密

你总是自定文件格式 我永远找不到你的入口点

忽略所有异常 读取内存代码

却还是跟踪不到你的注册码

虽然我们是不同的对象,都有隐私的一面,

但我相信总有一天我会找到你的接口,把我的最真一面给你看!

因为我是你的指针,在茫茫内存的堆栈中, 永远指向你那片天空,不孜不倦!

我愿做你的内联,供你无限次的调用,直到海枯石烂!

我愿做你的引用,和你同进退共生死,一起经受考验!

只是我不愿苦苦地调试你的心情,最终沦为你的友元!

如今我们已被MFC封装&#8211;事事变迁!

如今我们已向COM走去&#8211;可想当年!

没任何奢求,只愿做你最后的Administrator!

我能抽象出整个世界

但是我不能抽象出你

因为你在我心中是那么的具体

所以我的世界并不完整

我可以重载甚至覆盖这个世界里的任何一种方法

但是我却不能重载对你的思念

也许命中注定了你在我的世界里永远的烙上了静态的属性

而我不慎调用了爱你这个方法

当我义无返顾的把自己作为参数传进这个方法时

我才发现爱上你是一个死循环

它不停的返回对你的思念压入我心里的堆栈

在这无尽的黑夜中

我的内存里已经再也装不下别人

我不停的向系统申请空间

但却捕获一个异常:我爱的人不爱我

为了解决这个异常

我愿意虚拟出最后一点内存

把所有我能实现的方法地址压入堆栈

并且在栈尾压入最后一个方法-将字符串"我爱你,你爱我吗?"传递给你.

如果返回值为真--我将用尽一生去爱你

否则--我将释放掉所有系统资源.

此文是在h3lpless’ blog看到的,感觉不错,就果断转载过来,娱乐下。先不说写情书的人的HACK技术,就文中的关键字,他也应该不是新手了。同时也看出来此人寂寞了。哈哈

省市县城市联动JS库

插件名称:PCAS (Province City Area Selector 省、市、地区联动选择JS封装类) Ver 2.02 完整版

官方地址:http://www.popub.net/script/pcasunzip.html

使用说明:

演示地址:http://www.popub.net/script/pcasunzip.html

下载地址:http://www.popub.net/script/pcasunzip.js

应用说明:页面包含<script type=”text/javascript” src=”pcasunzip.js” charset=”gb2312″></script>

省市联动

new PCAS("Province","City")

new PCAS("Province","City","吉林省")

new PCAS("Province","City","吉林省","吉林市")

省市地区联动

new PCAS("Province","City","Area")

new PCAS("Province","City","Area","吉林省")

new PCAS("Province","City","Area","吉林省","松原市")

new PCAS("Province","City","Area","吉林省","松原市","宁江区")

new PCAS("Province","City","Area","","","")

省、市、地区对象取得的值均为实际值。

注:省、市、地区提示信息选项的值为””(空字符串)

使用案例:

<script type="text/javascript" src="pcasunzip.js" charset="gb2312"></script>

<select name="Province" ></select>

<select name="City"></select>

<select name="Area"></select>

<script language="javascript">

new PCAS("Province","City","Area","","","");

</script>

省:市:县:

 JS库下载:pcasunzip

网站到底还需不需要兼容IE6?

现在的网站到底还需不需要兼容IE6?wordpress宣布将在下一代版本中不再兼容IE6,如此消息相信会让很多中国用户放弃对WP的进一步升级。前几日看到某设计师出售的最新主题,非常不错,唯一不足是不兼容IE6,留言问其原因,得到的回复是放弃对IE6兼容,而其主题在IE6下可谓是错乱不堪,一塌糊涂。

从CNZZ的统计数据来看,IE6在国内的使用率还是第一,如果加上那些穿上马甲的IE6,IE6依然位居榜首。让我很是困惑的是很多的前端设计师都在选择放弃兼容IE6,现在放弃是否是时候?jucelin在设计网站的时候,总是在思考兼容IE6,因为IE6确实是让人蛋疼的事,看到这么多牛人都在放弃IE6,是否也应该响应他们的号召?

实际上我们应该做的还是以用户为主,不应该让用户因为我们而改变,正如QQ和360打架的时候强制要求卸载360的动作让很多用户感到反感一样。这也算是用户体验了吧。

从网站的用户分别出发,对于国内用户,用户的浏览器主要以IE为主,此时IE6的用户应该仍然占主流,对应国外的用户,IE6则早已成过去时,外贸网站则不用考虑兼容IE6了,其他面向国内的,你是否该考虑下。

从网站的主题来看,什么技术类的,计算机专业类的,这些网站的用户基本都会为自己升级浏览器,IE6估计早已成为他们唾弃的对象。其他像什么食谱类的,散文类的,用户还是以普通大众为主,他们是能用就行,因为他们不知道还有更好的,如此一来,也是得考虑兼容了。

如此说来,基本上都得兼容IE6,你还有其他理由不兼容吗?IE9确实是未来的趋势,IE6也正在走向消亡的道路,但路漫漫其修远兮,哥们为你的用户想想吧。一打开网站,就和百度快照一样,还是加了样式的快速版,用户看了早走了。

话说,兼容归兼容,咱有不一定要求在其他浏览器一样的效果,咱至少让IE6用户看到头部导航还在画的圈子里面待着就行。加速IE6消亡的不应该是小网站,应该让大的门户网去做,想想360的软件管家,IE6直接被提示要更新,这样的提示每天可以干掉多少IE6?要是哪天QZONE的右下角提示“升级IE6,看更美的空间”,又会有一大票IE6被升级掉。

windows安装Sql Server2005终极教程

这2天被着sql server2005搞伤了,原本是因为其他软件冲突的原因,重装了操作系统,XP SP2,纯净版,安装啥的一路绿灯,软件冲突问题也解决了,可开发使用的SQL Server2005企业版客户端怎么也安装不上,总是提示下面的内容:

SQL Server版本的操作系统兼容性(警告)

此操作系统不支持此版本的SQL Server 的某些组件,有关详细信息…..“安装SQL Server 2005 的硬件和软件要求”。

如图:

Windows安装sql server2005

开始以为是系统问题,再次重装,也没能解决,果断换win7,晕死的是,人家直接提示存在兼容性问题。你妹的,再次傻眼了,这不是坑爹嘛。

问硬件组的,人家给出的答案很简单,“你就强制安装试试”!俺反正快被搞疯了,死马当活马医,不兼容就不兼容,拉到吧你。再次坑爹的事发生了,居然正常使用,什么兼容不兼容的,全部没有。

在安装到选择“要安装的组件”时,选择下方的“高级”,再全部选择“安装到本地”之类的选项,安装吧。XP没试,不过你也可以当死马医,大不了重装系统。

好吧,写到这,我得承认这篇日志是标题党,只为记录今天蛋疼的经历!

PS:重装系统的时候忘了备份以前收集的养眼壁纸,现在没了。。。伤心呐。。。

高效 CSS 指南

避免通用类

确保选择器不是以通用类结束。

不要用标签名或class来描述ID类

如果你有一个选择器是以ID类作为关键选择符,请不要添加多余标签名上去。因为ID是唯一的,你不要为了一个不存在的理由而降低了匹配的效率。

差 – button#backButton { }
差 – .menu-left#newMenuIcon { }
好 – #backButton { }
好 – #newMenuIcon { }

不要用标签名来描述 class 类

和上一条类似,所有的 class 也是唯一的。你应该把标签名包含在 class 名中。

差 – treecell.indented { }
好 – .treecell-indented { }

尽量选择最特殊的类来存放选择器

降低系统效率的一个最大原因是我们在标签类中用了过多的选择符。通过添加 class 到元素,我们可以将类别进行再细分为 class 类,这样就不用为了一个标签浪费时间去匹配过多的选择符了。

差 – treeitem[mailfolder="true"] > treerow > treecell { }
好 – .treecell-mailfolder { }

避免子孙选择符

子孙选择符是CSS中最耗资源的选择符。他真的是非常的耗资源,尤其是在选择器使用标签类或通用类的时候。很多情况中,我们真正想要的是子选择符。除非有明确说明,在 UI CSS 中是严禁使用子孙选择符的。

差 – treehead treerow treecell { }
好一点,但还是不行(参照下一条) – treehead > treerow > treecell { }

标签类中不要包含子选择符

不要在标签类中使用子选择符。否则,每次元素的出现,都会额外地增加匹配时间。(特别是当选择器似乎多半会被匹配的情况下)

差 – treehead > treerow > treecell { }
最好 – .treecell-header { }

留意所有子选择符的使用

小心地使用子选择符。如果你能想出一个的不使用他的方法,那么就不要使用。特别是在 RDF 树和菜单会频繁地使用子选择符,像这样。

差 – treeitem[IsImapServer="true"] > treerow > .tree-folderpane-icon { }

请记住 RDF 的属性是可以在模板中被复制的!利用这一点,我们可以复制那些想基于该属性改变的子 XUL 元素上的 RDF 属性。

好 – .tree-folderpane-icon[IsImapServer="true"] { }

运用继承

理解哪个属性会继承,并允许他们这么做!我们已经清楚地建立了 XUL widgetry(?) ,所以你可以把 list-style-image 或 font 属性设置在父标签上,然后他会渗透到匿名内容里。这样,你就不需要浪费时间在匿名内容上直接写声明了。

差 – #bookmarkMenuItem > .menu-left { list-style-image: url(blah); }
好 – #bookmarkMenuItem { list-style-image: url(blah); }

在上面的例子中,定义匿名内容样式的需求(不用去搞明白 list-style-image 是如何继承的)导致需要一个 class 类的选择器,而这条规则实际上更应该以最唯一的 ID 类结尾。
请记住,特别是在匿名内容中,他们都拥有相同的 class 。上面那条不好的选择器写法导致每个菜单的图标都会被检查是否包含在收藏夹菜单栏目中。这是非常耗资源的(因为有很多菜单);这个选择器应该不要被收藏夹以外的菜单检查。

使用 -moz-image-region

把很多图片组合在一张图片里,然后用 -moz-image-region 来选择他们,会比每张图片分开存储,执行效率上高很多。

原文转自css88:http://www.css88.com/archives/402

简单获取新浪微博短地址接口(API)

短地址(也称短链接、缩短地址等)方面,在twitter发展之后就接着发展了起来,而且很多互联网网站都使用了短地址,国内国外都很多,但稳定和可靠性,还是国内的比较靠谱些,不怕没墙,国外几家已经悲剧了,所以如果项目中用到短地址,个人还是建议使用新浪或者其他国内的短链接服务。

新浪微博短链接API是开放的,而腾讯微博的短地址API没有开放,本想着通过不一样的路径获取腾讯微博的API的,最后还是以失败收场。新浪微博短地址API是不需要用户登录的,所以直接可以调用,而且速度很快,下面的代码是从网站找来的,用的是CURL POST的方法,可供参考。

新浪微博短链接API文档在旧版开发文档中,新版中暂未加入:http://open.weibo.com/wiki/Short_url/shorten

function shortenSinaUrl(long_url){apiKey='1234567890';//这里是你申请的应用的API KEY,随便写个应用名就会自动分配给你
apiUrl='http://api.t.sina.com.cn/short_url/shorten.json?source='.apiKey.'&url_long='.long_url;curlObj = curl_init();
curl_setopt(curlObj, CURLOPT_URL,apiUrl);
curl_setopt(curlObj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(curlObj, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt(curlObj, CURLOPT_HEADER, 0);
curl_setopt(curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
response = curl_exec(curlObj);
curl_close(curlObj);json = json_decode(response);
returnjson[0]->url_short;
}

function expandSinaUrl(short_url){apiKey='1234567890';//要修改这里的key再测试哦
apiUrl='http://api.t.sina.com.cn/short_url/expand.json?source='.apiKey.'&url_short='.short_url;curlObj = curl_init();
curl_setopt(curlObj, CURLOPT_URL,apiUrl);
curl_setopt(curlObj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(curlObj, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt(curlObj, CURLOPT_HEADER, 0);
curl_setopt(curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
response = curl_exec(curlObj);
curl_close(curlObj);json = json_decode(response);
returnjson[0]->url_long;
}

参照新浪微博的开发文档,其推荐的是使用get的方法获取。那代码就更简单了

function shorturl(long_url){apiKey='1234567890';//要修改这里的key再测试哦
	apiUrl='http://api.t.sina.com.cn/short_url/shorten.json?source='.apiKey.'&url_long='.long_url;response = file_get_contents(apiUrl);json = json_decode(response);
	returnjson[0]->url_short;
}

function expandurl(short_url){apiKey='1234567890';//要修改这里的key再测试哦
	apiUrl='http://api.t.sina.com.cn/short_url/expand.json?source='.apiKey.'&url_short='.short_url;response = file_get_contents(apiUrl);json = json_decode(response);
	returnjson[0]->url_long;
}

OK,是不是更简单了?

大家在调试上面的代码是需要填写自己的API key哦,不然肯定获取不到的。

特别提示:短地址服务现在仅对已经认证的APP KEY提供服务,刚申请的APP KEY会被提示无权限。大家可以使用209678993和3818214747两个KEY做测试,这2个KEY来历不明,不建议用于生产。(感谢@congxz6688的提醒)

jucelin写了个调试的文档,大家可以测试下:

长转短:https://jucelin.com/lab/short.php?type=1&url=https://jucelin.com

短转长:https://jucelin.com/lab/short.php?type=2&url=http://t.cn/S4bLBm

就2个参数,type:1表示长转短,2表示短转长,后面的URL就是目标域名了,因为比较懒,就没有写错误判断,新浪微博短地址不支持短地址再转短地址的,逻辑上也应该这样控制。(不信你可以试试)。

关于新浪微博短地址接口的更详细说明可以参考《新浪微博短地址接口》。

分享个评论回复邮件的CSS样式

前几日看到QQ空间发来的邮件,使用一个什么简单的样式,感觉不错就替换了现在模板中自带的评论回复邮件的模板,由于我现在使用的主题是Weisay提供的,评论回复功能在functions.php中自带的,只需简单的替换即可,其他朋友的邮件回复样式可能要到具体的文档找找了。整个代码相当简单,高手记得飘过哦~

先看下面的演示:

您在jucelin博客上的留言有回复啦!

Google, 您好!

您曾在 [jucelin] 的文章 《这里是文章标题》 上发表评论:

Hi, 我来评论啦。

jucelin给您的回复如下:

亲,你的评论真见血了啊。

您可以点击 查看回复的完整內容

欢迎再次光临 jucelin

(此郵件由系統自動發出, 請勿回覆.)

OK,贴上代码:

<div style="background-color:#fff; border:2px solid #4C7BAA; color:#111; -moz-border-radius:8px; -webkit-border-radius:8px; -khtml-border-radius:8px; border-radius:8px; font-size:12px; width:702px; margin:0 auto; margin-top:10px; font-family:微软雅黑, Arial;">
	<div style="background:#4C7BAA; width:100%; height:60px; color:white;"><span style="height:60px; line-height:60px; margin-left:30px; font-size:15px;">您在' . get_option('blogname') . '博客上的留言有回复啦!</span></div>
	<div style="width:90%; margin:0 auto">
		<p>' . trim(get_comment(parent_id)->comment_author) . ', 您好!</p>
		<p>您曾在 [' . get_option("blogname") . '] 的文章 《' . get_the_title(comment->comment_post_ID) . '》 上发表评论:
		<p style="background-color: #EEE;border: 1px solid #DDD;padding: 20px;margin: 15px 0;">' . nl2br(get_comment(parent_id)->comment_content) . '</p>
		<p>' . trim(comment->comment_author) . ' 给您的回复如下:
		<p style="background-color: #EEE;border: 1px solid #DDD;padding: 20px;margin: 15px 0;">' . nl2br(comment->comment_content) . '</p>
		<p>您可以点击 <a href="' . htmlspecialchars(get_comment_link(parent_id)) . '">查看回复的完整內容</a></p>
		<p>欢迎再次光临 <a href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>
		<p>(此郵件由系統自動發出, 請勿回覆.)</p>
    </div>
</div>

上面已经把参数带上了,如果你觉得麻烦,就直接换成你要的文字。在使用时,如果是直接邮件内容赋值给变量(好像都是这么做的),那么在赋值时注意使用单引号赋值,如$message=’这里是上面的代码哦’;

因为使用到了CSS3中的border-radius,所以IE9一下的浏览器不能看到圆角,建议使用非IE浏览器浏览!

PHP模拟QQ登录

在微博上看到网友使用PHP实现自动挂QQ,就自我思考了下模拟登录的方式。在PHP中CURL模拟提交则可以很简单的实现登录动作,这个方式在ASP则较难实现,使用JS倒是有点思路,但JS不能跨域限制就让我傻眼了。不过至少那位网友也是使用了PHP的curl实现的。好,让咱这个PHP的门外汉也试试吧。

PHP我确实是刚看,至于什么是curl,上php官网查,虽然不明白到底是什么意思,但照葫芦画瓢还是会的,共享万岁。因为是由程序来自动提交登录的,所有JS在程序里面就没什么用处了,而且要找个流量小的,太大程序下载的速度就会非常慢,最后定在使用3gqq登录方式。

跟着CURL的参数来,找个提交登录的3gqq的登陆URL,http://pt5.3g.qq.com/,因为网页格式是wap格式的,所以只有使用chrome或者opera才能访问,否则都会出现下载提示,IE8也不能访问,IE9不知道会不会改善。查看源码,会看到就几个输入框和几个隐藏的输入框,相信看到这里的你知道是神马个东西了。

<?php 
qqno='你的QQ';qqpw='QQ密码';
cookie = dirname(__FILE__).'/cookie.txt';post = array(
	'login_url' => 'http://pt.3g.qq.com/s?sid=ATAll43N7ZULRQ5V8zdfojol&aid=nLogin',
	'q_from' => '',
	'loginTitle' => 'login',
	'bid' => '0',
	'qq' => qqno,
	'pwd' =>qqpw,
	'loginType' => '1',
	'loginsubmit' => 'login',
);
curl = curl_init('http://pt.3g.qq.com/handleLogin?aid=nLoginHandle&sid=ATAll43N7ZULRQ5V8zdfojol');
curl_setopt(curl, CURLOPT_HEADER, 0);
curl_setopt(curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt(curl, CURLOPT_COOKIEJAR, cookie); // ?Cookie
curl_setopt(curl, CURLOPT_POST, 1);
curl_setopt(curl, CURLOPT_POSTFIELDS, http_build_query(post));
result = curl_exec(curl);
curl_close($curl);
?>

我在测试的时候主要是因为cookie没有设置,因为总是想着这不是在客户端提交,记录Cookie也没有什么用,就删除了Cookie参数,试了好多次之后加上Cookie就成功了。

另外,QQ登录的时候会对你的IP进行检测,如果登录的IP地址不是经常登录的IP地址,则需要输入验证码,此时上面的模拟登录就不能用了,jucelin也没想到什么好的方式解决。不过,可以手动尝试在http://pt5.3g.qq.com/上登录,多登录几次,验证码就不会再有了,当然这里的几次不是登录就退出再登录再退出那么简单,估计至少时间跨度要大点,登录2-3次基本上就OK了。

其实使用SID登录也是一种模拟QQ登录的方式,SID码来自于登录后的URL中,每次登录都会分配唯一的SID码,这也是3gqq全站登录的方式,因为要考虑有的手机不支持Cookie(这里突然想到腾讯要是使用session,会是什么样的状况),但又要实现全站登录的需求。

OK,通过SID码登录就不多说了,相信聪明的你肯定能想到。 😆

PHP模拟QQ登录

因为这个程序一个多星期之前就写了,就进行了一些拓展,感兴趣的可以看看我写的这个实例:QQ挂机宝(好吧,我承认这个名字取得由点鸟,但我确实没想到啥名,凑合着叫叫吧)。这个实例主要重点放在了功能实现上,所有什么安全措施,什么用户体验,什么程序运行效率都没去弄,,所以…你懂的,如果你发现功能上不对的地方记得给我留言。

如果你有更好的思路或者更深的想法,欢迎交流,例如用来发QQ消息,发微博什么的,虽然上面2项都测试成功了。