星期二, 3月 17, 2009

[tips] crc32 in python

python 2.X的crc32實作上跟一般的C實作上在整數有號無號的處理上略有不同, 所以使用python 2.X與一般C實作算出的crc32(如sfv)比對時,通常需要特別的方法,

這邊列出一個透過zlib.crc32快速得到所需要結果的方法:

import zlib

def crc32(st):
crc = zlib.crc32(st)
if crc > 0:
return "%x" % (crc)
else:
return "%x" % (~crc ^ 0xffffffff)

ex1 = "12345"
ex2 = "1kcaseztsa12345azy"

print "%x" % zlib.crc32(ex1)
print crc32(ex1)
print "%x" % zlib.crc32(ex2)
print crc32(ex2)


或如果你有ctypes的話:
import zlib
import ctypes

def crc32_c(st):
return "%x" % ctypes.c_uint32(zlib.crc32(st)).value

ex1 = "12345"
ex2 = "1kcaseztsa12345azy"

print "%x" % zlib.crc32(ex1)
print crc32_c(ex1)
print "%x" % zlib.crc32(ex2)
print crc32_c(ex2)



註: python 3.0以上沒有這個問題.

星期三, 3月 04, 2009

微軟: HideTaiwan()

http://msdn.microsoft.com/en-us/library/ms441219.aspx

SPUtility.HideTaiwan Method (Microsoft.SharePoint.Utilities)

Dim spWeb As SPWeb
Dim localeId As Integer
Dim returnValue As Boolean

returnValue = SPUtility.HideTaiwan(spWeb, localeId)

Parameters

spWeb

An SPWeb object that specifies the Web site.

localeId

A 32-bit integer that specifies a locale ID.


Return Value
true if the Taiwan calendar is hidden; otherwise, false. By default, this method returns true and the Taiwan calendar cannot be displayed for the following SPLangId values: PeoplesRepublicofChina, HongKongSAR, and MacaoSAR.

不小心逛到這個

微軟真強 連台灣都可以Hide() ...

星期一, 3月 02, 2009

不縮排就搗蛋!

louis今天跟我討論XPCOM文件上這一段應該是要很簡單的C++ snippet,

基本上我XPCOM不熟, C++尚可,

拿來文件上的Code大概長的像這樣:

NS_IMETHODIMP SampleFactory::QueryInterface(const nsIID &aIID,void **aResult)
{
if (aResult == NULL) {
return NS_ERROR_NULL_POINTER;
}
*aResult = NULL;
if (aIID.Equals(kISupportsIID)) {
*aResult = (void *) this;
}
else
if (aIID.Equals(kIFactoryIID)) {
*aResult = (void *) this;
}
if (aResult != NULL) {
return NS_ERROR_NO_INTERFACE;
}
AddRef();
return NS_OK;
}



看來看去實在是讓我皺眉頭...

哪有aResult等於NULL也return

不等於NULL也return

然後return完後面還有code的道理

反正這code看起來就是怪怪的, 但一下子卻看不出怪在哪...

因為...

...

這沒縮排又排的亂七八糟的code我是要怎麼讀啦!!!???

...

反正就是看的很難過 有股想把code拿去倒掉的衝動

後來才發現真正的文件裡長的是這樣:

NS_IMETHODIMP
SampleFactory::QueryInterface(const nsIID &aIID,
void **aResult)
{
if (aResult == NULL) {
return NS_ERROR_NULL_POINTER;
}
*aResult = NULL;
if (aIID.Equals(kISupportsIID)) {
*aResult = (void *) this;
}
else if (aIID.Equals(kIFactoryIID)) {
*aResult = (void *) this;
}

if (*aResult == NULL) {
return NS_ERROR_NO_INTERFACE;
}
AddRef();
return NS_OK;
}



我咧 這一縮排 會不會感覺差太多

連這段code snippet不用註解 要表達什麼都能看的清清楚楚.

雖然我不是很熟XPCOM, 也清楚看的出:

1. 在aIID是SupportsIID或FactoryIID的情況下

*aResult不會是NULL 而如果不是SupportsIID或FactoryIID就該回傳NS_ERROR_NO_INTERFACE;

2. 原先的code把倒數第六行if (*aResult == NULL)誤值成if (aResult == NULL) 是錯的...

跟之前不知在寫什麼時不同, 馬上就看出問題點在哪...

==

我還是常聽到有人說什麼python強制縮排怎樣怎樣的...

我只想說,

人要衣裝

佛要金裝

Code要給我排整齊啦!