幻影坦克图片制作方法

所谓“幻影坦克”就是指带透明度的PNG图片可以在白色和黑色背景下呈现不同的图案,名字来源于知名RTS游戏《红色警戒》中的某奇葩兵种。其中一种实现方案是把两张图片隔行交错放在一起,然后利用透明度在黑底和白底下分别显示奇数和偶数行。网络上有很多幻影坦克的Photoshop教程,本文主要说一下叠加型幻影坦克的具体工作原理和程序实现。

首先来说一下透明度叠加的原理。对于RGB的某一个通道,设M为通道值的上限,待叠加像素处的背景色通道值为b∈[0,M],要叠加的前景像素的通道值为v∈[0,M],透明度为a∈[0,M],叠加后的值为r∈[0,M],则叠加结果为
r=va/M+b(M-a)/M
其中透明度a可以理解为前景和背景混合的权值,a越大则前景“贡献”越大。对RGB三个通道分别进行叠加过程即可完成彩色图片的叠加。

而在幻影坦克中,通常是把彩色图像转换为灰阶图像,也就是只对亮度进行处理。人眼对亮度的感觉和物理亮度之间并非线性,Gamma定义了它们之间的映射。在不同的颜色系统、不同的Gamma下转换的经验公式也不同。我推荐使用以下语句进行转换(24位RGB,>>运算符表示右移位)

制作幻影坦克的关键就在于调整输出图像中每个像素的亮度v和透明度a,使得该像素与纯黑、纯白背景叠加时分别显示为期望的亮度。设x1为希望在白色背景下显示的亮度值,x2为暗色背景下的亮度值,则由叠加公式得到一个关于v和a的二元方程组
x1=va/M+M-a
x2=va/M
当x2≥x1时解得
v=Mx2/(x2-x1+M)
a=x2-x1+M
输出像素的ARGB值即为(a,v,v,v)

从上式可以看出,黑背景用图必须在每个像素上不亮于白背景用图才能实现混合(否则解得的值会大于M,这是不允许的),这对输入图像的要求很高。简单的处理方法是将[0,M]分为两个区间,将两幅图片的亮度分别线性映射到两个区间。调整区间的分法即可调整图像的显示效果。

下面附一个本人制作的简易幻影坦克生成工具(https://azurefx.name/download/miragetank),需要.net Framework 4环境。关于这篇文章如果想和我交流,可以写邮件至i@azurefx.name。

将文件封装成WAV

针对最简的WAV格式,可以用来做一些奇葩的实验(比如某无损编码器是否正常工作)。上面的程序是按照16bit 44.1kHz输出的,所以文件大小必须能被2整除。
用法是:
打包
Data2Wav.exe -p 文件路径
拆包
Data2Wav.exe -u 文件路径

东方非想天则 HP显示工具

自制的小工具,能够显示双方的HP数值。自适应1.10和1.10a,在原版上测试通过。
用法是先运行游戏,再运行这个工具;或者先运行工具,再运行游戏,输入游戏进程的PID和版本。
如果提示Error opening process,请尝试以管理员权限运行。有些网络对战平台中启动的游戏程序,自身是管理员权限,因此该工具也需要管理员权限。

http://azurefx.name/download/HstsHPD

Windows下文件散列值的计算

在Windows平台下可以不借助第三方工具计算一个文件的散列值。

按Win+R调出“运行”对话框,输入powershell,启动Windows PowerShell。输入以下命令:

 

例如:Get-FileHash “C:\Users\Azure\Desktop\foo.apk” -Algorithm MD5
这将计算文件的MD5值。还可以使用SHA1、SHA256等算法。
当然 输入完Get-FileHash+一个空格之后,可以直接把文件拖进窗口内,会变成文件路径。

use-powershell-to-calc-md5

可以使用的算法参数有:

  • SHA1
  • SHA256
  • SHA384
  • SHA512
  • MACTripleDES
  • MD5
  • RIPEMD160

如果省略-Algorithm参数,则默认SHA256算法。

StartCom代码签名证书的坑

StartCom针对个人开发者的Class 2 “StartSSL™ Identity Validation”看上去很便宜,并且提供Object Code Signing和Time-Stamping,实际上是有问题的。

代码签名证书OID中有1.3.6.1.4.1.311.10.3.13 (szOID_KP_LIFETIME_SIGNING)。和字面意思不同的是,有这个标记意味着:即使有时间戳,在证书本体过期后,用该证书签名过的目标代码将不会被系统信任(例如,在UAC提权对话框中显示“未知的发布者”和黄色警告标记)。

我们来看一下微软Authenticode文档中的说明(Windows Authenticode Portable Executable Signature Format – 14):

Timestamp Processing

By default, timestamping an Authenticode signature extends the lifetime of the signature indefinitely, as long as that signature was timestamped, both:

  • During the validity period of the signing certificate.
  • Before the certificate revocation date, if applicable.

 

The signature lifetime is not extended if the “lifetime signer OID” (szOID_KP_LIFETIME_SIGNING) is present in the signing certificate or if WTD_LIFETIME_SIGNING_FLAG is set in the WINTRUST_DATA structure when calling WinVerifyTrust. For details, see “Timestamp Processing with Lifetime Signing Semantics.”

The certificates associated with the timestamp are in the PKCS #7 SignedData structure’s certificates field.

Timestamp chains are compared against the following criteria:

  • The certificate chain is built to a trusted root certificate by using X.509 chain-building rules.

The trusted root certificate is configured in the Trusted Root Certification Authorities certificate store. For more information on certificate stores, see “Certificates Stores.”

  • The TSA certificate that is used to sign the timestamp contains the following EKU:

szOID_PKIX_KP_TIMESTAMP_SIGNING 1.3.6.1.5.5.7.3.8

 

  • The signing certificate must not be in the Untrusted Certificates certificate store.

Note: If the certificate that is used to sign the timestamp is in the Untrusted Certificates certificate store, then the signature is not verified even if the software publisher certificate is still within its validity period.

  • Revocation checking is turned off by default for checking the validity of the timestamping certificate.

Timestamp Processing with Lifetime Signing Semantics

Applications or certification authorities that do not want timestamped signatures to verify successfully for an indefinite period of time have two options:

  • Set the lifetime signer OID in the publisher’s signing certificate.

If the publisher’s signing certificate contains the lifetime signer OID in addition to the PKIX code signing OID, the signature becomes invalid when the publisher’s signing certificate expires, even if the signature is timestamped. The lifetime signer OID is defined as follows:

szOID_KP_LIFETIME_SIGNING 1.3.6.1.4.1.311.10.3.13

 

  • Set the WTD_LIFETIME_SIGNING_FLAG in the WINTRUST_DATA structure when calling WinVerifyTrust.

If a WinVerifyTrust caller sets WTD_LIFETIME_SIGNING_FLAG in the WINTRUST_DATA structure and the publisher’s signing certificate has expired, WinVerifyTrust reports the signature as invalid even if the signature is timestamped.

至于为什么会这样,我在某个没有域名的页面找到了如下说法:

As I understand it, the Lifetime Signing OID is present in StartCom code signing certificates because Microsoft required promises about the availability of OCSP and CRLs that StartCom did not think were reasonable to make. The compromise was that Microsoft allowed the StartSSL root into their certificate store, but required the Lifetime Signing OID to be present in StartSSL code-signing certificates.

是真是假无从考证,不过想考虑StartCom的代码签名证书的话还是掂量一下吧。

C++实现快速排序算法

 

解决IIS+WordPress伪静态404问题

中文系统下IIS URLRewrite将URI作为GBK编码传入,当PHP+WP使用UTF-8时会导致无法访问链接
解决方案是修改wp-includes/class-wp.php
因版本而异,大约在160行左右,parse_request函数中访问$_SERVER[‘REQUEST_URI’]时在外面包一层编码转换即可
mb_convert_encoding($_SERVER[‘REQUEST_URI’],’UTF-8′,’GBK’)

正则表达式简易教程

不死鸟之翼@Celestial Garden 未经授权禁止转载
在这放一篇正则表达式的简单入门教程,力求清晰易懂
在阅读本文之前建议自备一个正则表达式测试器,推荐deerchao写的

0 什么是正则表达式
简单地说,正则表达式是用于文本处理的一种工具,编写一种“模式”来匹配和修改字符串

输入文本是【My name is AzureFx.】,我希望测试其中是否包含【chibimiku】或者【AzureFx】,那么编写如下正则
chibimiku|AzureFx
运行匹配,得到结果如下

0
AzureFx

再来一个复杂点儿的
WAP页面的图片会变成一个[查看图片]的链接,我希望变成img标签。
输入文本是【<a href=”http://foo.com/foo.png” target=”_blank”>[查看图片]</a>】,这次用正则【<a href=”(\S*)” target=”_blank”>\[查看图片\]</a>】进行替换,替换目标为【<img src=”$1″/>
运行替换,得到结果如下
<img src=”http://foo.com/foo.png”/>
1 元字符
正则表达式的元字符很多,不同的语言和库也支持自己的扩展功能。元字符指具有特定功能的字符,概念类似Windows的“通配符”*和?,但远比这个复杂。有的元字符代表某个实体字符,有的代表某个位置

. 匹配一个任意字符
\S 匹配一个可见字符
\s 匹配一个不可见字符
^ 匹配字符串的开始
$ 匹配字符串的结尾
反斜杠加上某个有功能的字符可以转义。例如\.就是点这个字符本身
可以指定字符的集合
[0123456789]
或者写成
[0-9]
例如【re.e..e】可以匹配【reserve】或【reverse
2 量词
量词可以重复发挥一个字符的匹配作用。
常见的量词有
* 匹配0次或以上
? 匹配0次或1次
+ 匹配1次或以上
{m} 匹配m次
{m,n}匹配m次至n次(闭区间)
{m,}匹配m次或以上
例如【uid=[0-9]+】可以匹配【hhhhhuid=1112128hhhhh
默认量词的作用是贪婪的,即尽可能多地匹配字符
量词后加【?】可改为非贪婪的,即尽可能少地匹配字符
3 捕获
正则可以用于提取出特定的信息,称为捕获,用一对圆括号【()】实现
上面的例子可以改写为【uid=([0-9]+)】,可以捕获等号后面的uid数字。再次运行匹配,输出如下

0 1
uid=1112128 1112128

第一行代表捕获组的编号,0代表被匹配的全部字符串,从1开始是捕获组的序号
让我们回到开头的例子
<a href=”(\S*)” target=”_blank”>\[查看图片\]</a>
这里用圆括号包裹了“任意个可见字符”,也就是说我们想捕获href属性的字符串内容。(注意,【[】【】方括号要转义)
有的时候我们需要用括号组合一些内容,但又不想将其加入捕获,可以使用非获取匹配【(?:   )
例如【chibi(?:miku|luka)】可以匹配【chibimiku】或者【chibiluka】,但不会将【miku】或【luka】加入捕获。这是【chibimiku|chibiluka】的简便写法。
4 替换
用正则进行替换时 用【$X】引用捕获的内容,X为组号。还是开头的例子,【<img src=”$1″/>】中的【$1】引用了href属性的链接内容,完成a标签到img标签的自动转换

看到这你大概会用正则处理问题了吧?其实元字符和语法还有很多,实在忘了的话去百度查个表也是没问题的
合理使用正则可以大幅度提高工作效率,即使日常中使用也有特效哦

IIS+WordPress HTTP 500错误及乱码解决方法

最近尝试把站点搬到了Windows上,结果出现了各种各样的问题:先是安装Wordpress时无缘无故出现HTTP 500,之后带有中文固定链接的文章又全部404,上传文件和安装主题等操作时也会引发HTTP 500,经过好一番折腾之后终于搞定了。

首先,去微软官网下载安装IIS用的URL Rewrite组件,重启IIS后可以设置URL重写规则。Apache的htaccess重写规则可以直接导入,但是不支持RewriteBase等指令。

然后确认一下PHP.ini的配置项
default_charset设置为UTF-8,其他encoding参数留空或者设置为UTF-8
mbstring.encoding_translation关闭

然后找到网站目录,在安全选项卡中赋予IUSR写入权限,否则Wordpress不能安装。

安装好之后如果希望固定链接能正常工作,需要修改wp-includes/class-wp.php,将parse_request函数中的

修改为

如图所示

接下来Wordpress页面应该能正常工作了。
但是会发现仍然不能上传文件,以及安装主题、插件等,均提示HTTP 500错误。原因是PHP默认的上传临时目录为TEMP文件夹,而IUSR对这个目录没有写入权限。我建议直接修改PHP的上传临时目录,在wwwroot下新建一个temp文件夹即可。

此时偶尔还是会在安装主题、插件时出现偶发的HTTP 500错误,其实这些都是虚假的警告。CGI程序在标准错误输出中写入内容时会被IIS判定为执行失败,返回500页面,实际上这些都是PHP输出的警告信息。我们需要修改IIS的CGI设置。


将标准错误模式设置为IgnoreAndReturn200即可。

我还遇到过一个问题,访问网站的PHP页面时出现类似下面的提示:

HTTP 错误 500.19 – Internal Server Error
无法访问请求的页面,因为该页的相关配置数据无效。
通知 ExecuteRequestHandler
处理程序 StaticFile
错误代码 0x800700b7
配置错误在唯一密钥属性“value”设置为“index.php”时,无法添加类型为“add”的重复集合项
原因是webconfig配置冲突,IIS中的配置有主机-网站-目录三个层次,在配置CGI程序和其他全局设置的时候应该在主机层级上设置,这样可以避免配置文件冲突的问题。

关于字符编码的问题,中文系统下URL Rewrite模块重写后的编码会变为GBK,我曾经尝试过打开mbstring.encoding_translation,将http_input设置为GBK,但是发布文章等场合的内容也全部变成了乱码。其实只要在class-wp中利用iconv转换一下就可以了。

 

使用环境:
Windows Server 2012 R2 Datacenter (64-bit)
Internet Information Services 8.5
PHP 5.6.7 (32-bit)
Wordpress 4.1.0