Snip-It Pro 1.0.1.9

一个比较有意思的保存代码片断的东西。启动后位于桌面的一侧的sidebar,可以作用于任何编辑器。比如你在Visual studio写东西,可以从这里面将常用的一些代码方便的拉入vs中。官方网站在http://www.snipitpro.com/。下载的试用版本有30天试用期。

目前snipit pro工作于dotnet 2.0,除了dotfuscator保护关键代码外,还使用了一个的license保护组件(来自Interactive Studio Inc.)。license组件包括QlmLicenseLib.dll和IsLicense30.dll,后者是一个c++ native PE,前者由于调用后者,ildasm出来的il代码编译后无法通过ilasm使用。

然而问题是,snipit pro是保护十分脆弱,尽管dotfuscator使得reflector反编译后的代码无法编译,比如它将类里的方法名和变量名命名为一样,而c#编译器不允许这样。然后这种情况ilasm是可以编译的。反编译snipitpro.exe,可以看到以下类似代码:

        public aa(SnipItConfig A_0)
        {
            this.a = new QlmLicense();
            this.a.DefineProduct(1, "Snip-It Pro", 1, 0, "SkunkyFo78!", "{24EAA3C1-3DD7-40E0-AEA3-D20AA17A6005}");

            bool flag = false;
            string licenseKey = A_0.LicenseKey;
            this.a.ValidateLicense(licenseKey);
            int status = (int)this.a.GetStatus();
            if ((this.a(status, 8) || this.a(status, 0x10)) || ((this.a(status, 0x20)
                || this.a(status, 0x100)) || this.a(status, 0x80)))
            {
                flag = false;
                this.a(r.d);
            }
            else if (this.a(status, 4))
            {
                if (this.a(status, 0x40))
                {
                    this.a(r.b);
                    flag = false;
                }
                else
                {
                    this.a(r.a);
                    flag = true;
                }
            }
            else if (this.a(status, 2))
            {
                this.a(r.c);
                flag = true;
            }
            this.a(flag);
        }

关键在于status的判断,无论license key是如何被保护,只要status被设置为2,保护即被解除。

int status = (int) this.a.GetStatus();  对应的MSIL代码是,

IL_0045:  ldarg.0
IL_0046:  ldfld      class [QlmLicenseLib/*23000007*/]InteractiveStudios.QlmLicenseLib.QlmLicense/*010000F0*/ aa/*02000022*/::a /* 0400013B */
IL_004b:  callvirt   instance valuetype [QlmLicenseLib/*23000007*/]InteractiveStudios.QlmLicenseLib.ELicenseStatus/*010000F1*/ [QlmLicenseLib/*23000007*/]InteractiveStudios.QlmLicenseLib.QlmLicense/*010000F0*/::GetStatus() /* 0A000266 */
IL_0050:  stloc.2

我们注释掉 IL_0045~IL004b,在IL_004f处添加 ldc.i4.2,即达到以上status设置为2的效果。为了保证文件大小一致,0045~004e IL用nop来填充。修改后的MSIL代码如下,

    //IL_0045:  ldarg.0
    //IL_0046:  ldfld      class [QlmLicenseLib/*23000007*/]InteractiveStudios.QlmLicenseLib.QlmLicense/*010000F0*/ aa/*02000022*/::a /* 0400013B */
    //IL_004b:  callvirt   instance valuetype [QlmLicenseLib/*23000007*/]InteractiveStudios.QlmLicenseLib.ELicenseStatus/*010000F1*/ [QlmLicenseLib/*23000007*/]InteractiveStudios.QlmLicenseLib.QlmLicense/*010000F0*/::GetStatus() /* 0A000266 */
    IL_0045: nop
    IL_0046: nop
    IL_0047: nop
    IL_0048: nop
    IL_0049: nop
    IL_004a: nop
    IL_004b: nop
    IL_004c: nop
    IL_004d: nop
    IL_004e: nop
    IL_004f:    ldc.i4.2
    IL_0050:  stloc.2

Patch后的snip-it pro 1.0.1.9保护成功解除。在原SnipItpro.exe文件的0x0000d5b1开始的027b3b0100046f6602000a,代替成027b3b0100046f66020018,保存。

讨厌的垃圾评论

space上已经数度被恶意加了很多的垃圾评论,以前有几十条的,自己辛苦一点给删除掉。而今天发现上面被加了上百条的垃圾评论。明显是机器所为,而且评论内容不一,是随机增加到某些blog条目下(看来是专门针对space本身提供的打勾选择删除而设置的),目前好像在网上没有找到很好的批量删除的方法。微软space团队也是垃圾,没有任何过滤删除的功能。等有时间了我写个东西看看能不能根据条件删除。先让它们搁着吧。

 image

Qt 4.4 + msvc2005 下安装Eric 4, a python IDE

下载了Qt 4.4.0开源,指定msvc2005 spec,编译了大概2小时完成。
*一定要shared DLL
*一定要开源版,如果是商业的Qt 4与开源的PyQt等协议有冲突

下载python 2.5.2 msi安装。下载SIP v4.7.6,根据readme.txt安装,指定-p win32-msvc2005。下载QScintilla-gpl-2.2.zip,根据readme.txt安装,安装for Qt4。

下载PyQt v4.4.2,运行c:python25python configure.py时,提示fromAscii_helper@QString@@CAPAUData@1@PBH@Z could not be loacated in the dynamic link library QtCore4.dll,原因是在path环境变量里,在c:qt-4.4.0bin前还有个路径C:Program FilesMATLABR2007bbin有老版本的QtCore4.dll。将c:qt-4.4.0bin移到MATLAB前解决此问题。

安装QScintilla2 for Python binding(在源文件Python下),见dochtml-Qt4index.html。此步骤须在安装PyQt后,否则提示找不到PyQt v4。

将qscintilla2.dll从%QTDIR%lib拷贝到%QTDIR%bin目录下。

下载eric4-4.1.5,c:python25python install.py,安装之。

涉及到较多的开源包,一般安装步骤都是:

c:python25python configure.py
nmake
nmake install

注:

QScintilla-gpl-2.2的python binding生成的Makefile好像有问题,产生link error,可能原因是没有定义-DQSCINTILLA_DLL。可以打开configure后产生的Makefile,在CPPFLAGS里增加此定义。

可以下载QScintilla-gpl-2.2.1-snapshot-20080610,此问题已经更正。

好一阵折腾呀!

Vista x64下使用ODBC 32位 Text Driver

目前Vista x64下没有可用的ODBC Text Driver。为了使得已有的32位程序使用32位的ODBC Text Driver,需要对原程序的编译选项进行修改。将默认的Any CPU设置为x86,然后编译后。放到x64下将自动寻找32位的驱动。

费了我好多时间来figure out此问题。

ArcGIS Identity command “Number of shapes does not match the number of table records” error

When I run Identity_analysis in ArcGIS command windows against geodatabase, a message of something like "Number of shapes does not match the number of table records" popups. The error continues even if you reinstall the ArcGIS whenever using the Identify command.

Solution: go to c:documents and settingsyournamelocal settingstemp and delete all the files (some files might be denied to access, just skip them).

硕导院士

以前听说过西宁科学院某研究所有类似的情况,一位老研究员干活踏实,但在单位里不得志,分不着房子,儿子也不争气,报了几次院士没上,领导们想再报也没戏了,更不给面子,老研究员那个日子难受。结果没想着某年再试,上了,于是单位给分了大房子,给他儿子解决工作,他的学术水平就一下子得到大家的公认了。

最后,贵大一朋友讲起来他们学校土建院的事,居然惊人的类似。贵州省唯一的工程院院士马院士(我朋友十分佩服马院士,为人做学问没得说)目前仍是硕导,此前以73高龄中了07年院士增选。想来没上院士前的日子过的大家想也能想得着。只是可笑的是,贵大这么多的博导们没上院士,居然让一个退休的硕导上了,博导们岂非很没有面子。当然,贵州大学为了表彰马院士作出的卓越成就,专门给成立了个空间结构研究所,让马院士做所长。其它的收益自然更多,只是我朋友没讲,我只能结合我了解的想像一翻,但却不能为大家说。

大师?

一个北京的好朋友,聪明能干,事业有成,文化素质高,很谈得来。但就是很信一个大师的预言。而且跟我讲,很准,预言都应了,而且以前的事,大师能了如指掌。据说京城富人权贵都很信奉那位大师,上至胡温家人都有求过他。神乎,而且据称有朋友诋毁过他,结果就很倒霉。所以我在这里写这个是冒着倒霉的危险。

凡是人智力体力各方面可能有区别,但现代生物和解剖医学早表明,被称为人的就这么样的一种动物,不具备超自然的能力,更不要提具备预知以后的能力。也许世上有人1吨还碾不碎,但100吨除了superman没有哪种还敢叫人的能不被压成肉酱。如果真有预知能力,可能是另种但不能被称为人的生物了。

中国之大,有自称掌握预知能力的人不少,但都被一一揭穿,原来也只是普通人一个。其中奥妙并不难懂,有些甚至十分拙劣。为了证明他有预知能力,都会告诉你以前发生过的事,而这些事是他已经掌握的(比如一些大团伙会专门组织一班人打听消息),然后预言的都是似是而非的东西,概率很大的东西。而每个人都是这样,每天都有顺利和不顺利的事,再加个心理暗示(越是相信心理暗示越大),这些顺利或者不顺利的事便被放大,从而迷信于大师们的话。大师是不允许质疑的,需要建立在大家的心诚之上。大师的网络比想像中要复杂广泛的多,他知道的信息也出乎意料的多,但他知道的其实没有奇怪的。

李教主在倒台前也是这么多的信徒,规模只在大师之上。如果李教主真有传说的这么大的能力,岂会被中国政府赶出中国。大师真有预知能力,为什么不预言一下汶川地震,以显示他的慈悲为怀。为什么不预言一下明天的股市变化,还需要这么辛苦去当大师。如果不稀罕钱不想为福大众,宁愿死了这么多人也不预言,却只会舔权贵富人屁股,那么即使真有也请带进坟墓吧,我们也不需要它。

推荐看新语丝(http://www.xys.org)相关神棍主题。

好像laptop的电池坏了

插着电池的时候,就弹出一个对话框提示说,无法对电池进行充电,让按“确定”计算机进入休眠。此前电池大概也只能支持10来分钟模样,所以基本上是因为电池到寿命了。不过这机器好像还没用多长时间。

又是一笔不少的支出,只有看看网上去买块新的了。

ArcGIS栅格向Surfer Grid的格式转化 (Convert ArcGIS raster to Surfer GIS)

Zhuotong Nan ([email protected])

以下简单的代码实现了ArcGIS支持的栅格向Golden software的Surfer ASCII grid的格式转化。需要注意的是,ArcGIS的栅格左上为坐标原点,向下向右为正。而Surfer grid是左下是坐标原点,向上向右为正。

Here I will show a class that implements the major functionality to convert any Raster file supported by ArcGIS to Surfer ASCII grid format. The resulting Surfer grid can be read by Surfer with version 6 or higher. One point we need to keep in mind, ArcGIS raster stores data in row-major order, right and downwards being positive, while Surfer grid takes lower left corner as the original, right and upwards being positive.

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;

namespace RasterToSurferGrid
{
/// <summary>
/// A wrapper class for Surfer ASCII grid file
/// </summary>
class SurferGrid
{
string id = “DSAA”;
int nx;//columns
int ny; //rows
double xlo; //the minimum X value of the grid
double xhi; //xhi is the maximum X value of the grid
double ylo;
double yhi;
double zlo;
double zhi;
List<double> data; //the grid is stored in row-major order, with the lowest row (minimum Y) first

public SurferGrid(string rasterPath)
{
data = new List<double>(nx * ny);

IWorkspaceFactory wf = new RasterWorkspaceFactoryClass();
IRasterWorkspace wk=(IRasterWorkspace)wf.OpenFromFile(System.IO.Path.GetDirectoryName(rasterPath), 0);
IRasterDataset ird = wk.OpenRasterDataset(System.IO.Path.GetFileName(rasterPath));
IRaster raster=ird.CreateDefaultRaster();

IRasterProps props = (IRasterProps)raster;
nx = props.Width;
ny = props.Height;
IEnvelope env = props.Extent;
xlo = env.XMin;
xhi = env.XMax;
ylo = env.YMin;
yhi = env.YMax;
//zlo = env.ZMin;
//zhi = env.ZMax;

//populate data
PntClass extent=new PntClass();
extent.X=nx;
extent.Y=ny;
IPixelBlock datablock=raster.CreatePixelBlock(extent);
PntClass orig = new PntClass();
orig.X = 0;
orig.Y = 0;
raster.Read(orig, datablock);

for (int y = ny – 1; y >= 0; y–)
//for (int x = 0; x < nx; x++)
{
for (int x = 0; x < nx; x++)
{
data.Add((float)datablock.GetVal(0,x,y));
}
}

//get the max, and min
double max, min;
max = data[0]; min = data[0];
for (int i = 0; i < data.Count; i++)
{
max = max > data[i] ? max : data[i];
min = min < data[i] ? min : data[i];
}

zlo = min;
zhi = max;
}

public void WriteToFile(string outPath)
{
//StringWriter sw = new StringWriter();
StreamWriter sw = new StreamWriter(outPath);
sw.WriteLine(id);
sw.WriteLine(“{0} {1}”, nx, ny);
sw.WriteLine(“{0} {1}”, xlo, xhi);
sw.WriteLine(“{0} {1}”, ylo, yhi);
sw.WriteLine(“{0} {1}”, zlo, zhi);
StringBuilder sb=new StringBuilder();
for (int i = 0; i < ny; i++)
{
for (int j = 0; j < nx; j++)
{
sb.AppendFormat(“{0} “, data[i*nx+j]);
}
sb.Remove(sb.Length – 1, 1);
sb.AppendLine();

}
sw.Write(sb.ToString());
sw.Close();
}

}

}

附件是源代码。工具的运行需要dotnet framework 2.0和ArcView以上的License运行。编译后在命令行敲入RasterToSurferGrid有使用提示。

The attached please find necessary source codes which can be compiled on your own platform. Dotnet framework 2.0 and a valid ArcView license or higher are both required to run this tool. Besides, ArcGIS assemblies for dotnet framework are required. After successful compilation, typing RasterToSurferGrid following the command prompt shows you its usage information.
RasterToSurferGrid.zip

饮尿自救

汶川地震幸存者屡有报道说靠饮尿自救的例子。在缺水的情况下,饮尿在短期是利大于弊。尿95%是水,5%是有害物质,包括不可吸收的酒精、氮、钾等,如果事先有吃药,尿也有可能包含药里的一些物质。这些有害物质累积到一定程度就会严重影响健康。喝进自己的尿后,也会加重肾的负担。一般来讲,喝进排出重复几天后,尿里就变得富集这些有毒害物质,人会产生类似肾衰竭的症状,肾功能停止工作,这是致命的。

而人的水分散失,除了尿,还有大概1/8水分是通过汗水和呼吸出去的。而且尿里的有毒物质在身体的富集有研究表明会增加脱水速度。

美国部队野外手册将尿列在与海水、血一样的不能喝的位置上,类似的野外生存指南也提到绝不能(Never drink)喝尿自救。尤其是有伤口的情况下,磷和钾会进入血循环系统,很快就会导致正常的肾出问题。不过在地震的特殊情况下,再无其它途径获取饮用水,前期可以通过饮尿来减少水分的散失,同时最低限度减少运动量,但一般2-3天后再不能饮尿,那只会加速死亡。

Reference:
http://en.wikipedia.org/wiki/Survival_skills
http://slate.msn.com/id/2191909/
Army field manual (PDF)
http://www.adventuresportsonline.com/5basic.htm