sheng00 的所有文章

IIS7 WordPress 中文 URL 解决方案

1、
使用插件 IIS Chinese Tag Permalink
2、
用 WordPress 写中文博客时 URL 中经常会包含中文字符,一般出现在 Tag 和分类的 URL 中。而 IIS7 对包含中文的 URL 支持有问题。这样的情况下访问如「http://sheng00.com/tag/软件」这样的 URL 就会发生 404 错误。
像 Godaddy 的 Windows 主机正是使用 IIS7 作为 Web 服务器的,在此空间上使用 WordPress 就会出现以上问题,虽然可以通过修改程序文件或者修改 Tag 和分类的别名为英文的方法来解决,但非常不实用。
下面介绍一种解决方法,只需要增加一个 PHP 文件,并修改一下 web.config 文件中的 Rewrite 规则即可,不需要修改程序文件。
新建一个“chineseurl.php”文件,内容如下:

<?php
if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
// IIS Mod-Rewrite
$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];
} else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
// IIS Isapi_Rewrite
$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
} else {
// Use ORIG_PATH_INFO if there is no PATH_INFO
(!isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO'])) && ($_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO']);
// Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice)
if (isset($_SERVER['PATH_INFO'])) {
($_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME']) ? ($_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO']) : ($_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO']);
}
// Append the query string if it exists and isn't null
(isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) && ($_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']);
}
require("index.php");
?>

修改 web.config 文件内容如下:

?<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <system.webServer>
 <rewrite>
 <rules>
 <rule name="cnUrl" stopProcessing="true">
 <match url="^(tag|category)/(.*)$" />
 <action type="Rewrite" url="cnurl.php" />
 </rule>
 <rule name="WordPress" patternSyntax="Wildcard">
 <match url="*" />
 <conditions>
 <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
 <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
 </conditions>
 <action type="Rewrite" url="index.php" />
 </rule>
 </rules>
 </rewrite>
 </system.webServer>
</configuration>

以上两个文件都存放在 WordPress 的安装目录。
如果 WordPress 不是装在根目录,则需要更改“<match url=”^(tag|category)/(.*)$” />”为“<match url=”^安装目录/(tag|category)/(.*)$” />”。如果在固定链接设置里把默认的标签前缀和分类目录前缀(tag 和 category)改了,则更改这句里的对应内容即可。
此文适用于 WordPress 2.9,2.9以下版本应该也可以适用,但笔者没有测试过。

js验证代码

1.JS判断是否是邮编

<script>
function isPostalCode(s)
{
//var patrn=/^[a-zA-Z0-9]{3,12}$/;
var patrn=/^[a-zA-Z0-9 ]{3,12}$/;
if (!patrn.exec(s)) return false
return true
}
var a = "315400";
alert(a+"是否合法!");
alert(isPostalCode(a));
a = "ab";
alert(a+"是否合法!");
alert(isPostalCode(a));
</script>

2.JS判断电话传真号码是否有效

<script>
function isTel(s)
{
var patrn=/^[+]{0,1}(d){1,3}[ ]?([-]?((d)|[ ]){1,12})+$/;
if (!patrn.exec(s)) return false
return true
}
var a = "0574-56158888";
alert(a+"是否合法!");
alert(isTel(a));
a = "123456a";
alert(a+"是否合法!");
alert(isTel(a));
</script>

3.js正则判断:只能输入5-20个以字母开头、可带数字、“_”、“.”的字符串

<script>
function isRegisterUserName(s)
{
var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;
if (!patrn.exec(s)) return false
return true
}
var a = "abc";
alert(a+"是否合法!");
alert(isRegisterUserName(a));
a = "abcdef";
alert(a+"是否合法!");
alert(isRegisterUserName(a));
</script>

4.判断身份证号码的JS函数

<script type="text/javascript">
var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
function cidInfo(sId)
{
var iSum=0
var info=""
if(!/^d{17}(d|x)$/i.test(sId))
{
return false;
}
sId=sId.replace(/x$/i,"a");
if(aCity[parseInt(sId.substr(0,2))]==null)
{
return false;
}
sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));
var d=new Date(sBirthday.replace(/-/g,"/"))
if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))
{
return false;
}
for(var i = 17;i>=0;i --)
{
iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)
}
if(iSum%11!=1)
{
return false;
}
return true;
}
alert(cidInfo("3432423432423432"));
</script>

5.验证日期是否合法的JS函数

<script type="text/javascript">
function isDateFormat(txt){ //是否为合法的日期格式:YYYY-MM-DD
if(txt==null || txt == ""){return false;}
else{
var regex = /[0-9]{1,4}-[0-9]{1,2}-[0-9]{1,2}/;
if( regex.test(txt) ){
var noArr = txt.split("-");
var year = eval(noArr[0]);
var month = eval(noArr[1]);
var day = eval(noArr[2]);
if ( year < 1 || month < 1 || month > 12 || day < 1 || day > 31) {return false;}
if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30){return false;}
if (month == 2){
if ((year % 4 != 0) && day > 29) { return false;}
if (year % 4 == 0){
if(year % 100 == 0 && year % 400 != 0 && day > 29){return false;}
else if (day > 28){ return false;}
}
}
return true;
}else{return false;}
}
}
alert("2008-05-11是日期吗?答:"+isDateFormat("2008-05-11"));
</script>

6.验证手机号码固定电话号码的JS函数

<script type="text/javascript">
function isPhoneNum(txt){ //检测是否为电话号码(固定电话或手机)
return isPhone(txt)||isMobile(txt);
}
function isPhone(txt){//检测是否为固定电话号码
if(txt == null || txt == ""){return false;}
else{
var regex = /[0-9]{1}[0-9]{2,3}-[1-9]{1}[0-9]{5,8}/;
return regex.test(txt);
}
}
function isMobile(txt){//检测是否为手机号码
if(txt == null || txt == ""){return false;}
else{
var regex = /13[0-9]{9}/;
return regex.test(txt);
}
}
alert(isPhone("0574-56157573"));
alert(isMobile("0574-56157574"));
alert(isMobile("13956122541"));
</script>

7.控制文本框输入长度的例子

<script>
function test()
{
if(a.value.length>10){
alert("不能超过10个字符");
a.focus();
}
else
top.location.href="http://www.baidu.com";
}
</script>
<input type="text" name=a><input type="button" value="测试" onclick="test();">

8.JS判断中文的正则表达式

<script>
function strChinese(str){
var pattern = /[^u4E00-u9FA5]/;
return !pattern.test(str);
}
alert(strChinese("中文"))
alert(strChinese("abc"))
alert(strChinese("中文Abc"))
</script>

9.验证email邮箱地址的js

<script type="text/javascript">
function isEmail(str){
res = /^[0-9a-zA-Z_-.]+@[0-9a-zA-Z_-]+(.[0-9a-zA-Z_-]+)*$/;
var re = new RegExp(res);
return !(str.match(re) == null);
}
alert(isEmail("abc.com"));
alert(isEmail(""));
</script>

JS operations on JSON summary

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式。同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包。
本文主要是对JS操作JSON的要领做下总结。
在JSON中,有两种结构:对象和数组。

  1. 一个对象以{(左括号)开始,}(右括号)结束。每个“名称”后跟一个:(冒号);“‘名称/值’ 对”之间运用 ,(逗号)分隔。 名称用引号括起来;值如果是字符串则必须用括号,数值型则不须要。例如:
    var o = {
      "xlid": "cxh",
      "xldigitid": 123456,
      "topscore": 2000,
      "topplaytime": "2009-08-20"
    }
    
  2. 数组是值(value)的有序集合。一个数组以[(左中括号)开始,](右中括号)结束。值之间运用 ,(逗号)分隔。例如:
    var jsonranklist = [{
      "xlid": "cxh",
      "xldigitid": 123456,
      "topscore": 2000,
      "topplaytime": "2009-08-20"
    }, {
      "xlid": "zd",
      "xldigitid": 123456,
      "topscore": 1500,
      "topplaytime": "2009-11-20"
    }];
    

为了方便地处理JSON数据,JSON提供了json.js包,下载地址:http://www.json.org/json.js
在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键。例如:

  • JSON字符串:
    var str1 = '{ "name": "cxh", "sex": "man" }';
    
  • JSON对象:
    var str2 = { "name": "cxh", "sex": "man" };
    
  1. JSON字符串转换为JSON对象,要运用上面的str1,必须运用下面的要领先转化为JSON对象:
    var obj = eval('(' + str + ')');//由JSON字符串转换为JSON对象
    

    或者

    var obj = str.parseJSON(); //由JSON字符串转换为JSON对象
    

    或者

    var obj = JSON.parse(str); //由JSON字符串转换为JSON对象
    

    然后,就可以这样读取:

    Alert(obj.name);
    Alert(obj.sex);
    

    特别留心:如果obj本来就是一个JSON对象,那么运用 eval()函数转换后(哪怕是多次转换)还是JSON对象,但是运用 parseJSON()函数处理后会有疑问(抛出语法异常)。

  2. 可以运用 toJSONString()或者全局要领 JSON.stringify()将JSON对象转化为JSON字符串。
    例如:

    var last=obj.toJSONString(); //将JSON对象转化为JSON字符
    

    或者

    var last=JSON.stringify(obj); //将JSON对象转化为JSON字符
    
    alert(last);
    

    留心:上面的多个要领中,除了eval()函数是js自带的之外,其他的多个要领都来自json.js包。新版本的 JSON 修改了 API,将 JSON.stringify()JSON.parse() 两个要领都注入到了 Javascript 的内建对象里面,前者变成了 Object.toJSONString(),而后者变成了 String.parseJSON()。如果提示找不到toJSONString()parseJSON()要领,则说明您的json包版本太低。

Using the ASP.NET MVC 3 Logon returnUrl Parameter

razor:

@{
  ViewBag.Title = "登陆";
  Layout = "~/Views/Shared/_LoginLayout.cshtml";
  string retUrl = "";
  if (Request["ReturnUrl"] != null)
  {
    retUrl = ViewContext.HttpContext.Request["ReturnUrl"];
  }
}
@using (Html.BeginForm("Logon", "Account", new { model = this.Model, ReturnUrl = retUrl }))
{
//form
}

controller:

[HttpPost]
public ActionResult LogOn(LogOnModel model, string ReturnUrl)
{
  ViewBag.UserLogOut = true;
  if (!ModelState.IsValid)
    return View("Logon");
  if (ModelState.IsValid)
  {
    try
    {
      //login
    }
    catch (Exception e)
    {
      ModelState.AddModelError("", e.Message);
      return View(model);
    }
  }
  if (!string.IsNullOrEmpty(ReturnUrl))
    return Redirect(ReturnUrl);//return
  return RedirectToAction("Index", "Product");
}

UserSessionAuthorizeAttribute:

public class UserSessionAuthorizeAttribute : AuthorizeAttribute
{
  public override void OnAuthorization(AuthorizationContext  filterContext)
  {
    base.OnAuthorization(filterContext);
    if(//check session)
    {
      filterContext.Result = new RedirectToRouteResult(
        new System.Web.Routing.RouteValueDictionary
            {
              { "controller", "Account" },
              { "action", "LogOn" },
              { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
            });
    }
  }
}

深入浅出单实例Singleton设计模式

长时间没有用java单实例模式,现在想起来有点忘了,发些东西大家一起熟悉下。
单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了,这可能也是面试中问得最多的一个设计模式了。这个设计模式主要目的是想在整个系统中只能出现一个类的实例。这样做当然是有必然的,比如你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等。你希望这个类在整个系统中只能出现一个实例。当然,作为一个技术负责人的你,你当然有权利通过使用非技术的手段来达到你的目的。比如:你在团队内部明文规定,“XX类只能有一个全局实例,如果某人使用两次以上,那么该人将被处于2000元的罚款!”(呵呵),你当然有权这么做。但是如果你的设计的是东西是一个类库,或是一个需要提供给用户使用的API,恐怕你的这项规定将会失效。因为,你无权要求别人会那么做。所以,这就是为什么,我们希望通过使用技术的手段来达成这样一个目的的原因。
本文会带着你深入整个Singleton的世界,当然,我会放弃使用C++语言而改用Java语言,因为使用Java这个语言可能更容易让我说明一些事情。
Singleton的教学版本
这里,我将直接给出一个Singleton的简单实现,因为我相信你已经有这方面的一些基础了。我们姑且把这具版本叫做1.0版

// version 1.0
public class Singleton
{
    private static final Singleton singleton = null;
    private Singleton()    {    }
    public static Singleton getInstance()
    {
        if (singleton == null)
        {
            singleton = new Singleton();
        }
        return singleton;
    }
}

在上面的实例中,我想说明下面几个Singleton的特点:(下面这些东西可能是尽人皆知的,没有什么新鲜的)
1. 私有(private)的构造函数,表明这个类是不可能形成实例了。这主要是怕这个类会有多个实例。
2. 即然这个类是不可能形成实例,那么,我们需要一个静态的方式让其形成实例:getInstance()。注意这个方法是在new自己,因为其可以访问私有的构造函数,所以他是可以保证实例被创建出来的。
3. 在getInstance()中,先做判断是否已形成实例,如果已形成则直接返回,否则创建实例。
4. 所形成的实例保存在自己类中的私有成员中。
5. 我们取实例时,只需要使用Singleton.getInstance()就行了。
当然,如果你觉得知道了上面这些事情后就学成了,那我给你当头棒喝一下了,事情远远没有那么简单。
Singleton的实际版本
上面的这个程序存在比较严重的问题,因为是全局性的实例,所以,在多线程情况下,所有的全局共享的东西都会变得非常的危险,这个也一样,在多线程情况下,如果多个线程同时调用getInstance()的话,那么,可能会有多个进程同时通过 (singleton== null)的条件检查,于是,多个实例就创建出来,并且很可能造成内存泄露问题。嗯,熟悉多线程的你一定会说——“我们需要线程互斥或同步”,没错,我们需要这个事情,于是我们的Singleton升级成1.1版,如下所示:

// version 1.1
public class Singleton
{
    private static final Singleton singleton = null;
    private Singleton()
    {
    }
    public static Singleton getInstance()
    {
        if (singleton == null)
        {
            synchronized (Singleton.class)
            {
                singleton = new Singleton();
            }
        }
        return singleton;
    }
}

嗯,使用了Java的synchronized方法,看起来不错哦。应该没有问题了吧?!错!这还是有问题!为什么呢?前面已经说过,如果有多个线程同时通过(singleton== null)的条件检查(因为他们并行运行),虽然我们的synchronized方法会帮助我们同步所有的线程,让我们并行线程变成串行的一个一个去 new,那不还是一样的吗?同样会出现很多实例。嗯,确实如此!看来,还得把那个判断(singleton== null)条件也同步起来。于是,我们的Singleton再次升级成1.2版本,如下所示:

// version 1.2
public class Singleton
{
    private static final Singleton singleton = null;
    private Singleton()
    {
    }
    public static Singleton getInstance()
    {
        synchronized (Singleton.class)
        {
            if (singleton == null)
            {
                singleton = new Singleton();
            }
        }
        return singleton;
    }
}

不错不错,看似很不错了。在多线程下应该没有什么问题了,不是吗?的确是这样的,1.2版的Singleton在多线程下的确没有问题了,因为我们同步了所有的线程。只不过嘛……,什么?!还不行?!是的,还是有点小问题,我们本来只是想让new这个操作并行就可以了,现在,只要是进入 getInstance()的线程都得同步啊,注意,创建对象的动作只有一次,后面的动作全是读取那个成员变量,这些读取的动作不需要线程同步啊。这样的作法感觉非常极端啊,为了一个初始化的创建动作,居然让我们达上了所有的读操作,严重影响后续的性能啊!
还得改!嗯,看来,在线程同步前还得加一个(singleton== null)的条件判断,如果对象已经创建了,那么就不需要线程的同步了。OK,下面是1.3版的Singleton。

// version 1.3
public class Singleton
{
    private static final Singleton singleton = null;
    private Singleton()
    {
    }
    public static Singleton getInstance()
    {
        if (singleton == null)
        {
            synchronized (Singleton.class)
            {
                if (singleton == null)
                {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

感觉代码开始变得有点罗嗦和复杂了,不过,这可能是最不错的一个版本了,这个版本又叫“双重检查”Double-Check。下面是说明:
1. 第一个条件是说,如果实例创建了,那就不需要同步了,直接返回就好了。
2. 不然,我们就开始同步线程。
3. 第二个条件是说,如果被同步的线程中,有一个线程创建了对象,那么别的线程就不用再创建了。
相当不错啊,干得非常漂亮!请大家为我们的1.3版起立鼓掌!

js提交表单

1.document.forms.from.submit();
document.form.sumbit();
document.form.submit.click();
this.form.submit();
以上几种形式的js表单提交在firefox浏览器下是不起作用的
2.必须遵循w3c标准:
1).获得form时应使用getElementById()方法
2).用.submit()方法提交表单
3).button的name/id绝对不能命名为”submit”
4).form中所有的组件(按钮,文本框等)的name/id也不能命名为”submit”

【更新32/64位简体中文iso】Windows8 客户预览版正式公布

Windows8 客户预览版32/64位简体中文镜像,是iso的哦,走起,少年们!
http://iso.esd.microsoft.com/WCPDL/BD1B8A49393E30CC9C4E5C88457D73E964F1F3B18/Windows8-ConsumerPreview-64bit-ChineseSimplified.iso
http://iso.esd.microsoft.com/WCPDL/BD1B8A49393E30CC9C4E5C88457D73E964F1F3B18/Windows8-ConsumerPreview-32bit-ChineseSimplified.iso
更多语言版本请登录微软官方下载页面:http://windows.microsoft.com/zh-cn/windows-8/iso
ISO 映像
ISO 映像必须转换为可存储在 DVD 或 USB 闪存驱动器上的安装媒体。 本页上提供了相关说明。Windows 开发人员中心提供开发人员工具下载.
英语
64 位 (x64) 下载 (3.1 GB) Sha 1 哈希 – 1288519C5035BCAC83CBFA23A33038CCF5522749
32 位 (x86) 下载 (2.3 GB) Sha 1 哈希 – E91ED665B01A46F4344C36D9D88C8BF78E9A1B39
产品密钥: DNJXJ-7XBW8-2378T-X22TX-BKG7J
中文(简体)
64 位 (x64) 下载 (3.1 GB) Sha 1 哈希 – DF69B851F9A81DECBB16648CC452461894416EB0
32 位 (x86) 下载 (2.3 GB) Sha 1 哈希 – E29A2072745A48C14A1C2E5A61F5230841BEDB45
产品密钥: DNJXJ-7XBW8-2378T-X22TX-BKG7J
法语
64 位 (x64) 下载 (3.1 GB) Sha 1 哈希 – A9358E6799ABEEF29EDBA054AD34849C02C7F51F
32 位 (x86) 下载 (2.3 GB) Sha 1 哈希 – 2EF8013B9F50B93AEAC8068F4827E2C1DC0DC0B1
产品密钥: DNJXJ-7XBW8-2378T-X22TX-BKG7J
德语
64 位 (x64) 下载 (3.1 GB) Sha 1 哈希 – DB1003A47C266697B3832BE2A23319988EE34495
32 位 (x86) 下载 (2.3 GB) Sha 1 哈希 – 91075AEA665C5D6F42A24714B3A3390762C94457
产品密钥: DNJXJ-7XBW8-2378T-X22TX-BKG7J
日语
64 位 (x64) 下载 (3.1 GB) Sha 1 哈希 – A8F0DB12CAECEA0BE8B27EA124F2234212D9103A
32 位 (x86) 下载 (2.3 GB) Sha 1 哈希 – C8A322ED86058086207CAAECD46B4DDACF9E247A
产品密钥: DNJXJ-7XBW8-2378T-X22TX-BKG7J

系统要求

Windows 8 Consumer Preview 能够在支持 Windows Vista 和 Windows 7 的硬件上平稳运行:

  • 处理器: 1 GHz 或更快
  • RAM: 1 GB RAM(32 位)或 2 GB RAM(64 位)
  • 硬盘空间: 16 GB(32 位)或 20 GB(64 位)
  • 图形卡: Microsoft DirectX 9 图形设备或更高版本

若要使用某些特定功能,还需要满足以下附加要求:

  • 若要使用触控,你需要支持多点触控的平板电脑或显示器
  • 要访问 Windows 商店以下载和运行程序,你需要有效的 Internet 连接及至少 1024 x 768 的屏幕分辨率
  • 若要拖拽程序,你需要至少 1366 x 768 的屏幕分辨率

如何从 ISO 映像安装 Windows 8 Consumer Preview

在 Windows 7 中将 ISO 文件转换为 DVD 的最简单方法是使用Windows 光盘映像刻录机. 在运行Windows XP 或 Windows Vista 的电脑上,则需要第三方程序才能将 ISO 文件转换为可安装媒体 – DVD 刻录软件通常提供此功能。 一个选择是 USB/DVD 下载工具(由 Microsoft 商店提供)。 还可以下载Windows 8 Consumer Preview 安装程序,该程序包含的工具可用于从 ISO 文件制作 DVD 或 USB 闪存驱动器(需要 Windows Vista 或 Windows 7)。
 
32 bit
http://ak.or.esd.microsoft.com/pr/WCPDL/8A9D4FDFF736C5B1DBF956B89D6C8FDFD925DACD2/Windows8-ConsumerPreview-32bit-English-x1794225.esd
64 bit
http://ak.or.esd.microsoft.com/pr/WCPDL/8A9D4FDFF736C5B1DBF956B89D6C8FDFD925DACD2/Windows8-ConsumerPreview-64bit-English-x1794226.esd
esd 是 web-installer 下載版本