2010年4月

绕过图片防盗链的两个方法

方法一:使用iframe,这里iframe没有发送referer

<script>
window.sc="<img src='http://www.businessinfo.co.uk/labs/hackvertor/images/logo.gif?"+Math.random()+"'>";
</script>
<iframe src="javascript:parent.sc"></iframe>

方法二:使用https跳转到http

<img src=https://www.xxx.com/redirect?target=http://www.baidu.com/xxx.jpg />

利用在https下的一个第三方提供redirect的接口,重定向到http的一个页面,是不发送referer的。

参考自:http://hi.baidu.com/aullik5/blog/item/d55d97efca1333222df53445.html

wordpress半角引号变成全角引号问题的解决

这个问题困扰我很久了,一直都懒得处理,今天看到下面的文章可以解决。

不管是哪个语言版本的 WordPress,总会把文章中的'(英文单引号)替换成‘和’(中文单引号),把"(英文双引号)替换成“和”(中文双引号)。更有意思的是英文的三 个句号(...)居然会被转换为中文的半个省略号(…)。这么处理可能是基于方便数据库存储的考虑吧,或者也许WordPress的开发人员是中国人 吧:) 对于一般的文章没有什么问题,对于经常要在文章里面贴代码的人来说就麻烦了,因为中文引号的代码人家COPY回去是没法用的。

这个替换是在文件wp-includes/formatting.php中进行的。

解决方法:
修改位于”WordPress安装目录/wp-includes/”目录里面的”formatting.php”文件, 在第25行到第43行的这个for循环语句的第一个if条件里, 你应该能看到以下4行代码(或者你直接搜索这些代码查找也可以):

查找以下代码并注释掉:

// static strings
$curl = str_replace($static_characters, $static_replacements, $curl);
// regular expressions
$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);

成为:

// static strings
//屏蔽转换为中文标点符号
//$curl = str_replace($static_characters, $static_replacements, $curl);
// regular expressions
//$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);

保存即可。

此外,也有人编写了一个插件Quotmarks Replacer来处理这个事情。插件库里面可以搜索到,不想修改源代码的朋友可以使用这个插件。

原文作者博客

IE6下position:absolute定位错误的bug和解决方法

IE6确实太讨厌,但现在还是有很多用户,没办法。position:absolute定位在IE6下存在left和bottom的定位错误问题:

1. left 定位问题
<div style="position:relative;border:1px solid orange;text-align:right;">
<a href="http://junstyle.me">http://junstyle.me</a>
<div style="position:absolute;top:0;left:0;background:#ccc;">定位</div>
</div>

如果position:absolute的父层,也就是position:relative的层没有设置宽或高,那么在IE6下,出现left错位的 bug,其原因是没有触发haslayout。
解决方法:1. 给position:relative层加上width或height;2. 给position:relative层加上zoom:1,触发layout。
2. bottom定位问题:
<div style="position:relative;border:1px solid orange;text-align:center; zoom:1; ">
<a href="http://junstyle.me">http://junstyle.me</a>
<div style="position:absolute;bottom:0;left:0;background:#ccc;">定位< /div>
</div>

如果position:absolute的父层,也就是position:relative的层没有设置宽或高,那么在IE6下,出现bottom错位的 bug,其原因是没有触发haslayout。
解决方法:1. 给position:relative层加上width或height;2. 给position:relative层加上zoom:1,触发layout。

其中,还有一个问题,奇偶数问题,如果高度是奇数,在IE6下,会出现bottom:1px这样的现象,解决问题的办法就是把高度设为偶数。

IE6赶快淘汰吧!

javascript获取某个月的天数

Javascript里面的new Date("xxxx/xx/xx")这个日期的构造方法有一个妙处,当你传入的是"xxxx/xx/0"(0号)的话,得到的日期是"xx"月的前一个月的最后一天("xx"月的最大取值是69,题外话),如果传入"1999/13/0",会得到"1998/12/31"。而且最大的好处是当你传入"xxxx/3/0",会得到xxxx年2月的最后一天,它会自动判断当年是否是闰年来返回28或29,不用自己判断,太方便了!!所以,我们想得到选择年选择月有多少天的话,只需要

var d=new Date("选择年/选择月+1/0");

alert(d.getDate());

下面是使用Javascript编写的获取某年某月有多少天的getDaysInOneMonth(year, month)方法:

function getDaysInOneMonth(year, month){
month = parseInt(month,10)+1;
var d= new Date(year+"/"+month+"/0");
return d.getDate();
}

firefox无法初始化应用程序安全组件

今天关闭firefox,然后重启它又出现了这个错误:”无法初始化应用程序安全组件。很有可能您的程序个人目录中的文件出现问题。请检查并确认此目录没有读/写限制,而且您的硬盘没有写满或接近于写满。推荐您退出程序并修正问题。如果继续使用此会话,您在访问安全特性时将会看到程序运行发生错误。“,已经是第二次出现这个错误了,不知道是怎么回事,以前用32位的vista都没出现过这个错误,现在换了64位的win7老是出现这个问题,很是烦人,想想第一次处理这个问题时把我所有的浏览记录都搞不见了,这次出现问题一定要弄个安全的解决办法。在网上看到以下的解决方法,可能存在以下几种情况。

一、硬盘的容量不足

检查您的硬盘驱动器的剩余容量。为了做到 Windows机器上的:

1。打开我的电脑
2。右键单击在C:驱动器
3。选择属性。一个对话框将会出现。
4。转到常规选项卡

如果报告不到1MB的可用空间,您需要提供更大的空 间。

二、文件权限问题

检查您的配置文件夹中的文件权限。档名为 cert8.db不能是只读的。若要在Windows机器上的:

1。打开您的配置文件夹在Windows资源管理器。
2。右键单击该文件名为cert8.db。
3。选择属性。一个对话框将会出现。
4。转到常规选项卡
5。确保“只读”复选框未选中。
6。按确定。

三、文件已经损坏

在您的个人文件夹文件cert8.db可能已损坏。删 除这个文件,而应用程序(火狐,SeaMonkey,建立等)已关闭。[1]要做到这在Windows的机器:

1。关闭应用程序中选择文件 - >“退出。
2。打开您的配置文件夹在Windows资源管理器。
3。点击名为cert8.db文件。
4。按删除。
5。重新启动该应用程序。Cert8.db将重新创建 时,你这样做。

四、新建一个配置文件

实在无法解决的话,你只能创建一个新的配置文件了。具体操作方法:随便找个firefox的快捷方式,右键单击,选择“属性”,选择弹出选项卡顶部的”快捷方式“栏,在”目标“一项中,在文字 最后加入” -p“,然后”确定“。之后关掉所有已经在运行的firefox窗口,再双击刚刚修改过的firefox快捷方式,就会弹出一个窗口提示选择配置文件,新建一个配置文件即可。

c#:UNIX时间戳和DateTime的相互转换

[code language="csharp"]
// Unix时间戳格式转换为DateTime时间格式
public DateTime GetTime(string timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime = long.Parse(timeStamp + "0000000");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
}

// DateTime时间格式转换为Unix时间戳格式
public int ConvertDateTimeInt(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
return (int)(time - startTime).TotalSeconds;
}
[/code]

SQL Server2008:解决“阻止保存要求重新创建表的更改”

在SQL Server 2008企业管理器中更改表结构时(特别是修改了某个字段的类型时),总是会弹出:必须要先删除原来的表,然后重新创建新表,才能完成表的更改,如果强行更改会出现以下提示:不允许保存更改。您所做的 更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改”选项。如何避免此提示,可从“工具”菜单中 选择“选项”,在“选项”对话框中,选择Designers,选择“表设计器和数据库设计器”,清除“ 阻止保存要求重新创建表的更改”复选框。

用BirdNest在Google App Engine上搭建一个twitter API

想在手机上看看twitter,下了个程序,但登录不上去,网上找来找去也找不到一个可以放心使用的api,看到一篇教程,用birdnest在google app engine上搭建一个api就好了,幸好gae还没有被封。

环境准备:Google App Engine

先要注册Google App Engine,注册地址 http://appengine.google.com/ ,然后建立一个application,目前第一次使用需要验证用户手机,输入手机号码就收验证码即可,之后,就可以用 yourid.appspot.com来访问你的app应用。

此外,还需要下载安装Google APP Engine的开发环境,注意Python的版本,需要是2.6系列的,不能使用3.1系列的,否则运行会出错。

Google App Engine SDK 下载地址 http://code.google.com/intl/zh-CN/appengine/downloads.html

Python 2.6.5 下载地址 http://www.python.org/download/releases/2.6.5/

环境准备:BirdNest

下载birdnest要注意是下载分支branches/gae,别下载主干trunk,否则更新到GAE上也不能用,会报错。可以使用一个SVN工具下载。例如TortoiseSVN等。 将其放到一个目录中,进入目录,编辑app.yaml文件,将第一行的application里的参数修改为自己的应用名。

发布应用到GAE

准备好了上面的一切后,就可以发布这个应用到自己的Appspot上了,打开Google App Engine Launcher。点击菜单创建一个新的application(这里创建的application名称要和上面修改的app.yaml应用名一样),然后把下载的birdnest文件复制到这个application的目录里面,(ps:在复制文件到这个application目录下面的之后,在我的电脑上发现Google App Engine Launcher里面的这个应用无效,最后把app.yaml用记事本打开重新保存一遍就好了,可能是文件编码的问题,如果你也出现了这个错误,可以试试把文件重新在记事本里面打开再保存一下),最好在Google App Engine Launcher里面选中这个应用后,点击Deploy按钮把代码上传到网上去,等待上传完毕后,你创建的API地址应该是:应用名.appspot.com/api/

打开api可能出现的错误提示和解决办法

出现“internal server error”错误,这个看别个说是代码里面有问题,你可以尝试删除code.py里面的下面一段代码:

import socket
import re
ua = web.ctx.environ.get("HTTP_USER_AGENT", 'None')
if ua.find('jibjib') >= 0:
socket.setdefaulttimeout(60)
elif ua.find('zh-CN') >= 0:
#raise Exception('unknown error')
socket.setdefaulttimeout(2)
else:
socket.setdefaulttimeout(2)

如果不想去下载birdnest或者运行时程序出现错误,可以试试本站提供的压缩包:birdnest.rar
注意把app.yaml文件里面的你的应用名字改成你自己的。

支付宝导入数字证书出现Microsoft Visual C++ Runtime Library

windows 7 x64操作系统,用IE8登录支付宝导入证书的时候出现Microsoft Visual C++ Runtime Library错误,貌似是因为IE8的安全选项默认设置的问题,导致了这个错误。进入internet选项,修改一下安全设置就可以了。

IE8浏览器的菜单:工具 -> Internet选项 -> 安全 -> 自定义级别 -> 将本地文件上载至服务器时包含本地目录路径,选中启用即可。

Firefox里实现自动换行的方法

为了是文字自动换行,IE里面可以加入这个样式属性text-justify:inter-ideograph;但firefox里面就不起作用了,文章不换行, 会突破div边框的限制, 在外部显示, 严重影响了页面显示的美观和整洁。

现提供一种解决方法, 首先创建wrap.xml, 内容如下

[code language="xml"]
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml">
<binding id="wordwrap" applyauthorstyles="false">
<implementation>
<constructor>
//<![CDATA[
var elem = this;
doWrap();
elem.addEventListener('overflow', doWrap, false);

function doWrap()
{
var walker = document.createTreeWalker(elem, NodeFilter.SHOW_TEXT, null, false);
while (walker.nextNode())
{
var node = walker.currentNode;
node.nodeValue = node.nodeValue.split('').join(String.fromCharCode('8203'));
}
}
//]]>
</constructor>
</implementation>
</binding>
</bindings>

[/code]

然后页面在页面中这样使用, 内容如下:

[code language="html"]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
.wordwrap {
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
-moz-binding: url('./wordwrap.xml#wordwrap');
}
</style>
</head>
<body>
<div style="width:200px;border:1px solid red;" class="wordwrap">
asdlfkasdfjlaksjdflajsdlfkajsdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalskdjflakjsdflajsdlf asdkfjlaksjdf alksjdlfkjasdlfkjalsdjfasdf as dfalskdjflkajsdlfkjalsdkjflasdf askdjfasdf asdfasdfasdfasdf
</div>
</body>
</html>

[/code]