2014年05月26日 5:18 下午 fisher 分类: Open, 微信, 社会化媒体

目前官方没有正式发布的iPad版微信,但是据传说。。。

2014年04月14日 8:36 下午 i新传 分类: 后端

PingBack失效的原因已了解: http://iamfisher.net/fisher/?p=512 从WordPress 2.7开始就有用户反映Pingback功能有时无法正常工作。 WordPress用请求函数wp-includes/cron.php (注意:请不要混淆wp-includes/cron.php函数与wp-cron.php函数)来运行Pingback,操作有0.01秒的时限,在某些环境下这个时间可能有点短。 大多数配置都能在这个时限下正常运行,因此WordPress开发人员没有特意改变时限,参见Trac ticket 8923。 但到了WordPress 2.8,在某些安装环境下,Pingback问题仍然存在。 用户可以选择把时限从0.01改成1,之后Pingback就可以恢复正常了。 如果不想更改时限,那么只好保佑2.8.1版本能够修正这个问题了。

WordPress 2.8中的原始代码 $cron_url = get_option( ‘siteurl’ ) . ‘/wp-cron.php?doing_wp_cron’; wp_remote_post( $cron_url, array(‘timeout’ => 0.01, ‘blocking’ => false, ‘sslverify’ => apply_filters(‘https_local_ssl_verify’, true)) ); 改变时限值后的代码 $cron_url = get_option( ‘siteurl’ ) . ‘/wp-cron.php?doing_wp_cron’; wp_remote_post( $cron_url, array(‘timeout’ => 1, ‘blocking’ => false, ‘sslverify’ => apply_filters(‘https_local_ssl_verify’, true)) );

2014年04月14日 8:15 下午 i新传 分类: 后端
2014年03月3日 10:34 上午 i新传 分类: 后端, 技术, 管理

PingBack:IIII 一种是绝对禁止远程维护,安排人员机房值班维护。优点是安全可控,杜绝外部黑客攻击。 另外一种是允许经过授权的远程维护。优点是响应快,机房维护成本低。缺点是安全性可虞。 PingBack:Test  TrackBack:VP

2013年10月20日 3:47 下午 fisher 分类: Open, 后端, 技术, 社会化媒体

一、PHP全角标点转为半角

< ?php
$str = "0123ABCDFWS\",.?<>{}[]*&^%#@!~()+-|:;";
echo "$str";
echo "
";
$str = preg_replace('/\xa3([\xa1-\xfe])/e', 'chr(ord(\1)-0x80)', $str);
echo $str;

这是网上看来的代码,所有的中文标点的第二个字节减去0X80(即128)所得的数字就是半角所得的数字了。而/e模式表达的是:如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

在非UTF-8模式下这个函数是可行的,但是UTF-8下 这个方法就似乎无效,求能满足UTF-8模式下的这个功能的实现…

二、如果文件是utf8的,那么可以通过
$str = iconv(‘utf-8’, ‘gbk’, $str); 转换编码后,再
preg_replace(‘/\xa3([\xa1-\xfe])/e’, ‘chr(ord(\1)-0x80)’, $str);

有些字符在utf-8中可以表示,而在gbk中无法表示,那么你将utf-8转成gbk不会导致字符丢失吗?可以使用IGNORE:
$str = iconv(‘utf-8’, ‘gbk//IGNORE’, $str);

下边是不同编码对应的正则匹配编码的范围:
UTF8: [\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}
UTF16: [\x00-\xd7][\xe0-\xff]|[\xd8-\xdf][\x00-\xff]{2}
Big5: [\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|[\xa1-\xfe])
GBK :[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]
GB2312汉字: [\xb0-\xf7][\xa0-\xfe]
GB2312半角标点符号及特殊符号: \xa1[\xa2-\xfe]
GB2312罗马数组及项目序号: \xa2([\xa1-\xaa]|[\xb1-\xbf]|[\xc0-\xdf]|[\xe0-\xe2]|[\xe5-\xee]|[\xf1-\xfc])
GB2312全角标点及全角字母: \xa3[\xa1-\xfe]
GB2312日文平假名: \xa4[\xa1-\xf3]
GB2312日文片假名:\xa5[\xa1-\xf6]
GB18030: [\x00-\x7f]|[\x81-\xfe][\x40-\xfe]|[\x81-\xfe][\x30-\x39][\x81-\xfe][\x30-\x39]

JIS [\x20-\x7e]|[\x21-\x5f]|[\x21-\x7e]{2}
SJIS [\x20-\x7e]|[\xa1-\xdf]|([\x81-\x9f]|[\xe0-\xef])([\x40-\x7e]|[\x80-\xfc])
SJIS全角空格 (?:\x81\x81)
SJIS全角数字 (?:\x82[\x4f-\x58])
SJIS全角大写英文 (?:\x82[\x60-\x79])
SJIS全角小写英文 (?:\x82[\x81-\x9a])
SJIS全角平假名 (?:\x82[\x9f-\xf1])
SJIS全角平假名扩展 (?:\x82[\x9f-\xf1]|\x81[\x4a\x4b\x54\x55])
SJIS全角片假名 (?:\x83[\x40-\x96])
SJIS全角片假名扩展 (?:\x83[\x40-\x96]|\x81[\x45\x5b\x52\x53])

EUC_JP [\x20-\x7e]|\x81[\xa1-\xdf]|[\xa1-\xfe][\xa1-\xfe]|\x8f[\xa1-\xfe]{2}
EUC_JP标点符号及特殊字符 [\xa1-\xa2][\xa0-\xfe]
EUC_JP全角数字 \xa3[\xb0-\xb9]
EUC_JP全角大写英文 \xa3[\xc1-\xda]
EUC_JP全角小写英文 \xa3[\xe1-\xfa]
EUC_JP全角平假名 \xa4[\xa1-\xf3]
EUC_JP全角片假名 \xa3[\xb0-\xb9]|\xa3[\xc1-\xda]|\xa5[\xa1-\xf6][\xa3][\xb0-\xfa]|[\xa1][\xbc-\xbe]|[\xa1][\xdd]
EUC_JP全角汉字 [\xb0-\xcf][\xa0-\xd3]|[\xd0-\xf4][\xa0-\xfe]|[\xB0-\xF3][\xA1-\xFE]|[\xF4][\xA1-\xA6]|[\xA4][\xA1-\xF3]|[\xA5][\xA1-\xF6]|[\xA1][\xBC-\xBE]
EUC_JP全角空格 (?:\xa1\xa1)

EUC半角片假名 (?:\x8e[\xa6-\xdf])
日文半角空格 \x20

三、我觉得没必要那么麻烦,直接写个方法替换就完了,而且正则的效率还低,我就是这么弄的:
/**
* 字符串半角和全角间相互转换
* @param string $str 待转换的字符串
* @param int $type TODBC:转换为半角;TOSBC,转换为全角
* @return string 返回转换后的字符串
*/
function convertStrType($str, $type) {

$dbc = array(
‘0’ , ‘1’ , ‘2’ , ‘3’ , ‘4’ ,
‘5’ , ‘6’ , ‘7’ , ‘8’ , ‘9’ ,
‘A’ , ‘B’ , ‘C’ , ‘D’ , ‘E’ ,
‘F’ , ‘G’ , ‘H’ , ‘I’ , ‘J’ ,
‘K’ , ‘L’ , ‘M’ , ‘N’ , ‘O’ ,
‘P’ , ‘Q’ , ‘R’ , ‘S’ , ‘T’ ,
‘U’ , ‘V’ , ‘W’ , ‘X’ , ‘Y’ ,
‘Z’ , ‘a’ , ‘b’ , ‘c’ , ‘d’ ,
‘e’ , ‘f’ , ‘g’ , ‘h’ , ‘i’ ,
‘j’ , ‘k’ , ‘l’ , ‘m’ , ‘n’ ,
‘o’ , ‘p’ , ‘q’ , ‘r’ , ‘s’ ,
‘t’ , ‘u’ , ‘v’ , ‘w’ , ‘x’ ,
‘y’ , ‘z’ , ‘-’ , ‘ ’ , ‘:’ ,
‘.’ , ‘,’ , ‘/’ , ‘%’ , ‘#’ ,
‘!’ , ‘@’ , ‘&’ , ‘(’ , ‘)’ ,
‘<’ , ‘>’ , ‘"’ , ‘'’ , ‘?’ ,
‘[’ , ‘]’ , ‘{’ , ‘}’ , ‘\’ ,
‘|’ , ‘+’ , ‘=’ , ‘_’ , ‘^’ ,
‘¥’ , ‘ ̄’ , ‘`’

);

$sbc = array( //半角
‘0’, ‘1’, ‘2’, ‘3’, ‘4’,
‘5’, ‘6’, ‘7’, ‘8’, ‘9’,
‘A’, ‘B’, ‘C’, ‘D’, ‘E’,
‘F’, ‘G’, ‘H’, ‘I’, ‘J’,
‘K’, ‘L’, ‘M’, ‘N’, ‘O’,
‘P’, ‘Q’, ‘R’, ‘S’, ‘T’,
‘U’, ‘V’, ‘W’, ‘X’, ‘Y’,
‘Z’, ‘a’, ‘b’, ‘c’, ‘d’,
‘e’, ‘f’, ‘g’, ‘h’, ‘i’,
‘j’, ‘k’, ‘l’, ‘m’, ‘n’,
‘o’, ‘p’, ‘q’, ‘r’, ‘s’,
‘t’, ‘u’, ‘v’, ‘w’, ‘x’,
‘y’, ‘z’, ‘-‘, ‘ ‘, ‘:’,
‘.’, ‘,’, ‘/’, ‘%’, ‘ #’,
‘!’, ‘@’, ‘&’, ‘(‘, ‘)’,
‘< ‘, ‘>’, ‘”‘, ‘\”,’?’,
‘[‘, ‘]’, ‘{‘, ‘}’, ‘\\’,
‘|’, ‘+’, ‘=’, ‘_’, ‘^’,
‘¥’,’~’, ‘`’

);
if($type == ‘TODBC’){
return str_replace( $sbc, $dbc, $str ); //半角到全角
}elseif($type == ‘TOSBC’){
return str_replace( $dbc, $sbc, $str ); //全角到半角
}else{
return $str;
}
}

2013年09月24日 11:17 上午 fisher 分类: Open, 微信, 新传, 社会化媒体

腾讯微博XCSTWX绑定mb新传学院

wechat-国际版

2013年04月14日 12:35 下午 i新传 分类: 电商

今天有一家主机服务商,大概是因为阿里云已经成为其竞争对手且整合支付宝,所以只能用其他支付网关,原先的首信电子商城网关、支付宝网关就下线了。然后,就只能走银行自身平台。

IE果然是落后生产力寄生的地方。早前我对交通银行免activex插件的支付方式是赞赏有加。今天再看,原来只是手机客户端暂时摆脱噩梦般的 acticex,PC端不管是不是用IE你都没法摆脱。本来银行卡支付密码+手机动态短信就足够了吧?非得要加一个activex插件。插件就插件吧,在 没有任何安全软件的情形下,插件让IE8无数次崩溃,说是非正常使用方式。微软哪一天不淘汰该死的activex落后的安全管理模式,哪一天就站不起来。

支付宝垄断恐惧,在电商、支付领域,比之于腾讯有过之无不及。

IE糟糕的多版本分支,与如今安卓系统糟糕的版本分支,如出一辙。

有时,简单就是美。

____________

首发:我i南通

2013年04月7日 6:00 下午 fisher 分类: Open, 微信
公众号名称: 新传学院
类型: 普通公众帐号
微信号: xcstwx
功能介绍: 传播新传资讯,聚合科技信息。微信号: xcstwx
微信:xcstwx

微信:xcstwx

2013年03月12日 12:03 上午 fisher 分类: Open, 后端, 技术, 知识原野

  8     元字符
  9         代码    说明
10         .        匹配除换行符以外的任意字符
11         \d        匹配数字 [表示数字 0-9]
12         \D        匹配除数字意外的任意字符 [\d的反义]
13         \w        匹配字母或数字或下划线或汉字 [表示数字、字母、下划线、汉字 0-9 a-z A-Z]
14         \s        匹配任意的空白符 [表示任意的空白符:空格 ,制表符\t,换行符\n,回车\r,分页\f,垂直制表\v,中文全角空格等]
15         \S        匹配所有的非空白字符 [\s的反义]
16         \b        匹配单词的开始或结束 [匹配单个单词]
17         ^        匹配字符串的开始 [用来匹配要查找字符串的开头 所有的字符都用于比较]
18         $        匹配字符串的结束 [和\b、^ 类似,区别在于 $ 为结尾处 所有的字符都用于比较]
19     正则 模式修正符
20         特点:多个模式修正符可以放在一块使用
21         m    整个字符串按多行来进行匹配。可以理解为将字符串里符合的内容全部匹配出来
22         i    不区分大小写模式的匹配
23         x    忽略掉匹配表达式里[正则表达式]的空格
24         U    匹配最近的字符串,禁止贪婪匹配
25         A    强制从^字符串开始算起,必须配合^使用
26         D    只匹配到$符号的位置处 设置了m就没用了
27         e    把替换字符串当成一个表达式使用。类似eval()函数
28    
29     限定字符
30         代码    说明
31         *        重复零次或多次 [任意次数]
32         +        重复一次或多次 [至少会出现一次]
33         ?        重复零次或一次 [可能会出现一次]
34         {n}        重复 n 次
35         {n, }    重复 n 次或者更多次 [重复n次以上:包括n次] {TIP:貌似达不到预期}
36         {n,m}    重复 n 到 m 次
37    
38     分歧条件
39         |        或 [从左往右检测。如果左边的规则符合,右边的规则将不会去匹配]
40    
41     分组
42        
43 
44     后向引用:
45          捕获:
46              (exp)    匹配exp字符串,并自动分配组号
47              (?<name>exp)    匹配exp字符串,并分配到组号为name的分组里
48              (?:exp)    不匹配exp字符串,并且也不分配组号
49          零宽断言(字符串分割匹配?):
50              (?=exp)        匹配以exp结尾的字符,匹配结果不包括exp
51              (?<=exp)    匹配一exp开头的字符,匹配结果同样不包括exp
52          负向零宽断言(可以看做 ‘[^exp]’ 的反义)
53              (?!exp)        某字符串后边不是exp的
54              (?<!exp)    某字符串前边不是exp的
55          注释:(?#comment)    注释,给人看的
56     
57      贪婪与懒惰:
58          贪婪可以理解为尽可能多的匹配重复的字符
59          懒惰可以理解为尽可能少的匹配重复的字符(尽可能少?搞不明白)
60              示例语法:
61                  *?、+?、??、{n,m}?、{n,}?
62                 
63     EXP:
64         \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 匹配简单IP

2013年02月20日 8:05 下午 fisher 分类: Open, 技术

    XSLT是一种将XML文档转换为其他文本文档的语言,是建立在XML和XPath之上的国际标准,内容比较多,功能强大。

    对于编程人员来说,XSLT可以看作以前序遍历的方式专门处理XML树状结构的标记语言。以前编程根据XML文档输出纯文本数据时需要写代码以前序遍历方式的方式遍历XML文档对象组成的树状结构,对于每一个特定名称或特定层次的XML节点而输出不同的内容,这个过程比较复杂,代码量大,需用进行很多的状态判断。而XSLT则使用一种简洁明了的标记语言实现了相同的逻辑。因此XSLT从程序逻辑的角度看类似支持递归的编程语言,而且是专门处理XML文档的。

    XSLT转换过程会涉及到三个文本文档,一个是要处理的原始XML文档,第二个就是XSLT样式表文档,该文档包含了XSLT代码,XSLT代码本身就是XML格式,但使用了XML的名称空间。第三个就是XSLT处理输出的文本文档,注意,此处输出的是纯文本文档,这个文档具体是什么格式完全靠XSLT代码来决定,可以是另外一个XML文档,HTML文档,SQL语句字符串或者其他任意格式的字符串数据等等,XSLT转换只能输出纯文本文档,此外就没有限制输出文档的具体格式。

    数据XML文档是一个很简单的XML文档,此处不加说明了。重点说说XSLT样式表文档,XSLT样式表文档本身是一个XML文档。它采用XML的树状结构来描述递归处理过程,也比较好理解。

    在样式表文档中,根元素为 xsl:stylesheet,里面定义了一个名为xsl的名称空间,这个根节点及其属性值都是固定的。

xsl:output元素是可选的,它的method属性用于指定输出文档的格式,可以设置为xml,html或text值。此处使用xml输出样式,说明输出的文档是XML格式的,XSLT转换会尽量生成XML文档,但不作保证,因此仍然有可能生成不合格的XML文档。

    xsl:template用于定义一个XSLT模板,模板类似编程语言中的函数,可实现XSLT代码的重用。模板可以使用name属性定义名称,也可以使用match属性定义匹配的XPath路径,这个模板使用了match属性来匹配XML文档本身。

    然后是 html元素,由于html元素没有使用xsl的前缀,因此不属于xslt代码,因此将原样输出,跟着后面的body,table元素也是一样的。

    xsl:for-each元素类似C#中的foreach语法结果,表示循环遍历元素,它使用select属性指定一个XPath相对路径,XSLT使用这个相对路径查询所有要遍历的XML节点,此时当前节点就是XML文档本身,因此XSLT处理器会调用XmlDocument的SelectNodes函数来获得要遍历的XML节点,函数的参数就是Table/Record。于是我们开始循环遍历所有的Record元素了。

    在循环遍历Record元素时,对每一个Record元素都要输出xsl:for-each的子节点,首先是 tr元素,这不是XSLT元素,因此原样输出。这里还套嵌定义了另外一个for-each元素,于是我们又开始了一个新的循环遍历了,新的循环指定的相对XPath路径是一个星号,表示匹配所有名称的子元素,这类似DOS命令Dir中使用星号匹配所有文件。此处表示循环遍历Record元素下面所有的字段元素。

    对每一个字段元素,首先输出td元素,然后处理xsl:value-of元素,xsl:value-of表示输出指定相对路径的节点的值,这里指定的XPath是一个点号,表示当前节点本身,由于当前节点是XML元素,因此也就输出元素的文本内容,相当于输出XmlElement的InnerText属性值。

xslt文件:

<?xml version=”1.0″ encoding=”utf-8″?>
<xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/Transform
xmlns:msxsl=”urn:schemas-microsoft-com:xslt” exclude-result-prefixes=”msxsl”
>
<xsl:output method=”xml” indent=”yes” encoding=”utf-8″/>

 <xsl:template match=”/”>
<xsl:for-each select=”Category”>
<Category>
<xsl:attribute name=”Navigate”>
<xsl:value-of select=”@Navigate”/>
</xsl:attribute>
<xsl:element name=”Name”>
<xsl:value-of select=”Name”/>
</xsl:element>
<xsl:element name=”EngName”>
<xsl:value-of select=”EngName”/>
</xsl:element>
<xsl:element name=”ChtName”>
<xsl:value-of select=”ChtName”/>
</xsl:element>
<xsl:element name=”Description”>
<xsl:value-of select=”Description”/>
</xsl:element>
<xsl:element name=”EngDescription”>
<xsl:value-of select=”EngDescription”/>
</xsl:element>
<xsl:element name=”ChtDescription”>
<xsl:value-of select=”ChtDescription”/>
</xsl:element>
<xsl:element name=”Editor”>
<xsl:value-of select=”Editor”/>
</xsl:element>
<xsl:element name=”LastModified”>
<xsl:value-of select=”LastModified”/>
</xsl:element>
<xsl:element name=”Identity”>
<xsl:text>CAT_ZTF</xsl:text>
</xsl:element>
<xsl:element name=”Notes”>
<xsl:value-of select=”Notes”/>
</xsl:element>
<xsl:element name=”TotalCount”>
<xsl:text>{0}</xsl:text>
</xsl:element>
<xsl:for-each select=”Content”>
<xsl:for-each select=”CatItem”>
<xsl:element name=”CatItem”>
<xsl:attribute name=”Name”>
<xsl:value-of select=”@Name”/>
</xsl:attribute>
<xsl:attribute name=”Code”>
<xsl:value-of select=”@Code”/>
</xsl:attribute>
<xsl:attribute name=”ParentCode”>
<xsl:value-of select=”@ParentCode”/>
</xsl:attribute>
<xsl:attribute name=”CategoryType”>
<xsl:text>CAT_ZTF</xsl:text>
</xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</Category>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

XML文件:

<?xml version=”1.0″ encoding=”GB2312″?>
<Category Navigate=”1″>
<Name>专用分类</Name>
<EngName>New</EngName>
<ChtName>專用分類</ChtName>
<Description/>
<EngDescription/>
<ChtDescription/>
<Editor>Liangying</Editor>
<LastModified>2010-5-31</LastModified>
<Identity>CAT_XXXX</Identity>
<Notes>专用分类</Notes>
<Content Count=”97″>

<CatItem Name=”文艺” Description=”” EngDescription=”” ChtDescription=”” Code=”001″ ParentCode=”” Nav=”tttt?={0}”/>
<CatItem Name=”小说” Description=”” EngDescription=”” ChtDescription=”” Code=”001001″ ParentCode=”001″ Nav=”tttt?={0}”/>
<CatItem Name=”文学” Description=”” EngDescription=”” ChtDescription=”” Code=”001002″ ParentCode=”001″ Nav=”tttt?={0}”/>
<CatItem Name=”散文” Description=”” EngDescription=”” ChtDescription=”” Code=”001003″ ParentCode=”001″ Nav=”tttt?={0}”/>

</Content>
</Category>

转换C#代码:

/// </summary>
/// <param name=”strXmlPath”></param>
/// <param name=”strXsltPath”></param>
/// <returns></returns>
public string TransferXmlByXSLT(string strXmlPath,string strXsltPath)
{

            MemoryStream fs = new MemoryStream();
string outputstring = string.Empty;
try
{
//判断文件是否存在
if (File.Exists(Server.MapPath(strXmlPath)) && File.Exists(Server.MapPath(strXsltPath)))
{
//加载xml文件
XPathDocument doc = new XPathDocument(strXmlPath);
XslTransform transForm = new XslTransform();
//加载xslt文件
transForm.Load(strXsltPath);
XPathNavigator nav = doc.CreateNavigator();
//转换xml
transForm.Transform(nav, null, fs);
fs.Seek(0, SeekOrigin.Begin);
StreamReader stream = new StreamReader(fs);
outputstring = stream.ReadToEnd();

                    fs.Close();
fs.Dispose();
}
else
{
return “”;
}
}
finally
{
fs.Close();
fs.Dispose();
}

            return outputstring;
}

转换后的XML:

<?xml version=”1.0″ encoding=”GB2312″?>
<Category Navigate=”1″>
<Name>专用分类</Name>
<EngName>New</EngName>
<ChtName>專用分類</ChtName>
<Description/>
<EngDescription/>
<ChtDescription/>
<Editor>Liangying</Editor>
<LastModified>2010-5-31</LastModified>
<Identity>CAT_XXXX</Identity>
<Notes>专用分类</Notes>
<TotalCount>{0}</TotalCount>

<CatItem Name=”文艺” Code=”001″ CategoryType=”CAT_ZTF” ParentCode=””  />
<CatItem Name=”小说” Code=”001001″ CategoryType=”CAT_ZTF” ParentCode=”001″  />
<CatItem Name=”文学” Code=”001002″ CategoryType=”CAT_ZTF” ParentCode=”001″  />

<CatItem Name=”散文” Code=”001003″ CategoryType=”CAT_ZTF” ParentCode=”001″  />

</Category>