Gravatar头像被墙的解决方法
3 评论57次阅读2010.10.17 15:58 作者:Felicia
这两天Gravatar被墙,真是吐血,博客上所有的头像都不能显示了。BS抽风的GFW。
经测试,虽然%d.gravatar.com不能访问,但是gravatar.com还是可以访问的,因此解决方法也很简单:
将”wp-includes/pluggable.php”文件中的1649-1652行:
1
2
3
4 if ( !empty($email) )
$host = sprintf( "http://%d.gravatar.com", ( hexdec( $email_hash{0} ) % 2 ) );
else
$host = 'http://0.gravatar.com';
改为
1 $host = 'http://gravatar.com';
Win7下解决80端口被占用的办法
6 评论1,146次阅读2010.10.16 15:40 作者:Felicia
Win7的80端口默认是被System进程占用的。在cmd下输入
netstat -aon | findstr 80
可以发现listen 80端口的进程号(我得到的是pid=4),然后在任务管理器中,可以看到pid=4的是一个叫System的进程(点Show processes from all users)
用如下方法可以解决System进程占用80端口的问题:
- 打开RegEdit:
- 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP
- 找到一个DWORD值Start,将其改为0
- 重启电脑,System进程将不会占用80端口
C# 泛型+扩展方法
8 评论250次阅读2010.10.15 17:17 作者:Felicia
C# 3.0及以后版本提供了扩展方法这一强大工具,使得动态扩展类变得十分方便。具体使用方法是定义一个static class,然后定义static扩展方法,注意扩展方法的第一个参数必须用this关键字修饰。扩展方法能像类本身定义的方法一样被使用,而不需要修改类的代码,这样扩展原有库中的类就变得非常容易了。扩展方法同样对接口生效,更牛X的是,扩展方法中同样可以使用泛型。
下面是一个例子,展示了怎样扩展IEnumerable接口,增加一个RandomSelect的方法用于在表中随机选取元素。
public static class IEnumerableExtensions
{
public static IEnumerable<T> RandomSelect<T>(this IEnumerable<T> input, int outputSize)
{
int size = input.Count();
if (outputSize < 0)
{
outputSize = 0;
}
if (outputSize > size)
{
outputSize = size;
}
List<int> index = new List<int>();
for (int i = 0; i < size; i++)
{
index.Add(i);
}
List<T> ret = new List<T>();
Random rand = new Random();
for (int i = 0; i < outputSize; i++)
{
int r = rand.Next() % (size - i);
ret.Add(input.ElementAt(index[r]));
index[r] = index[size - i - 1];
}
return ret;
}
}
使用方法和原生方法是一样一样的:)
List sourceList = new List() {1, 2, 3, 4, 5};
IEnumerable randomSelectedList = sourceList.RandomSelect(3);
今天遇到一个在几百MB的文本文件中提取Last-Crawler-Time-History:xxxxx\r\n这样的字符串,用正则表达式的速度要慢上几百倍,根本无法接受。一开始我以为是C#的性能问题,但后来仔细分析后发现是正则的问题……最后还是用手写字符串解析去解决。
谨记!实践表明,正则表达式虽然匹配功能非常强大,但是性能不良,慎用,慎用!
C# 在沙盒中执行程序集的方法
2 评论82次阅读2010.09.24 11:52 作者:Felicia
为了实现安全动态载入程序集并执行其中的方法,我们需要创建一个沙盒 AppDomain,并在沙盒 AppDomain 中载入程序集。为了达到在宿主 AppDomain 中控制沙盒的目的,我们需要创建一个 MarshalByRefObject 对象 AppDomainCoagent 来跨越 AppDomain。
可以这样理解:AppDomainCoagent 存在于沙盒 AppDomain 内,但是却可以由宿主 AppDomain 调用,并且 AppDomainCoagent 访问 AppDomain.CurrentDomain 得到的是沙盒 AppDomain。
{
public object Call(string typeFullName, byte[] serializedObject, string methodName, object[] parameters)
{
Type type = null;
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (assembly.GetType(typeFullName) != null)
{
type = assembly.GetType(typeFullName);
break;
}
}
MemoryStream ms = new MemoryStream(serializedObject);
XmlSerializer xmlSerializer = new XmlSerializer(type);
object targetObject = xmlSerializer.Deserialize(ms);
return type.GetMethod(methodName).Invoke(targetObject, parameters);
}
public void LoadAssembly(byte[] assemblyBuffer)
{
Assembly.Load(assemblyBuffer);
}
}
AppDomainCoagent.LoadAssembly 提供了让宿主向沙盒动态注入程序集的能力。这里的实现是简单的从缓冲区读入程序集,并没有解决依赖关系,宿主程序必须处理好待注入程序集的依赖关系,先将依赖程序集注入。
AppDomainCoagent.Call 提供了让宿主执行沙盒中的程序集中方法的能力。具体做法是宿主提供一个 XML 序列化的对象(这个对象的类型必须存在于沙盒 AppDomain 中的某个 Assembly 中),对象的类型强名,待执行方法名和传入参数列表。然后 AppDomainCoagent 在沙盒内反序列化对象,再执行对应的方法。
注意:这里用 BinaryFormatter 来序列化/反序列化会遇到找不到程序集的问题,改用 XmlSerializer 就能正常工作。原因未知。
宿主可以通过如下方式创建沙盒:
AppDomainCoagent m_appDomainCoagent = m_appDomain.CreateInstanceAndUnwrap("AppDomainSample", "AppDomainSample.AppDomainCoagent") as AppDomainCoagent;
注入程序集和执行方法:
m_appDomainCoagent.Call(typeFullName, serializedObject, methodName, parameters);
