Shuhai Shen

You may find more about me @ http://leonax.net/about/

 

在运行脚本的时候,有时候需要通过脚本文件所在位置的相对路径来做一些事,比如执行另一个脚本。以前在CMD时代,可以通过%~dp0来获取脚本所在的文件夹,那在PowerShell中要怎么做呢?

很简单,通过内置的$MyInvocation变量:

1
$x = $MyInvocation.MyCommand.Definition

此时$x的值是当前运行中的脚本的绝对路径,再用Split-Path取它的父路径就可以了:

1
$x = Split-Path -Parent $MyInvocation.MyCommand.Definition

这样$x的值就是脚本所在的文件夹了……

 

原本以为是一部美女题材的动作片,没想到一开头就看蒙了。

开头阴暗柔美的风格让我想起了《罪恶之城》,看上去女主角很嫩(被称为Baby doll,洋娃娃),不像是会打架的样子,很快就被冤枉地关进了孤儿院。

然后没过多久,场景就换到了一家夜总会,看上去像是孤儿院的老板强迫这些小女孩干不法勾当。新来的女孩要学跳舞,洋娃娃把每一次跳舞视作一次战斗,战斗场面非常华丽,从古老的寺庙、二战、一直打到未来战士,相信游戏宅男们会非常享受。

至于这些战斗和夜总会有什么联系,我一时半会也没看懂,只知道每次洋娃想逃出夜总会,需要跳舞来让同伴有机会去偷一些东西,每次跳舞的时候,就是开启战斗模式,战斗的成败决定了同伴能不能偷到东西。前几场都完胜,后来有一场失败导致3名同伴(在现实中)被枪杀,最后真正实施逃脱的时候,洋娃娃自己没有逃出去,她的一名同伴成功地逃走了。

当影片进入了一段无聊的讲大道理的情节时,我以为故事就到此结束了,没想到场景突然一转,回到了孤儿院。

原来整个夜总会是洋娃娃幻想出来的,一起策划逃跑的5个人,实际上都是洋娃娃分裂出来的人格,成功“越狱”的那个人格“实现”了洋娃娃从孤儿院逃走了梦想。看到这里,或许一开始洋娃娃并没有被冤枉,她只是认为她不应该受到这种待遇……或许……这样的剧情是不是很像《禁闭岛》呢?

这是一部很经典的人格分裂的影片,虽然比起《Identity》来差了一大截,不过它的表现方式很吸引人……

 

最近 开始研究国内访问的解决方案。

可行的方法无非有两种,一是使用第三方的DNS服务器,比如DNSPod,一个国内的免费DNS服务器,提供免费的DNS解析、流量监测等服务,通过简单的6步设置,就可以把域名的DNS解析放到DNSPod上,解析速度一般<100ms(免费版)。

不过即使有了国内的DNS解析,博客的内容依然是在国外的服务器上,访问速度依然慢 。于是就有了第二种解决方案,CDN。CDN的全称是Content delivery network,工作原理大致是把网站的内容缓存到一些网络节点上,终端用户只需访问离他最近的节点即可,大大地减少了数据包传输的物理距离,从而提升网站的实际访问速度。

听上去CDN很美好,但是实际上多数CDN服务都是要收费的,而且动辄就是成千上万的年费,个人博客实在负担不起。不过最近貌似有免费的CDN服务出来了,比如Webluker,是一家国内的CDN服务商,提供免费的CDN、DNS解析等服务。兴冲冲地去试了一把, 于是就放弃了。据说还有一家CoCDN的,现在连主页都打不开了,情何以堪-_- 国外也有免费的CDN, 它家最近的节点在日本,而GoDaddy的服务器在新加坡,从网速上差不了多少 ,还是不用了吧。

于是目前可行的方案就是在DNSPod上注册了一个解析服务,其它什么事情也干不了@@

 

随着WWDC的召开和iPhone发布日期的日益临近,关于iPhone5的各种传言也趋于一致。那么,对于iPhone 5,我们可以期待些什么?

  1. 更快的处理器:由于iPad 2中已经使用了新的Apple A5处理器,iPhone 5的处理器至少会使用A5,或者再下一代的处理器。A5包含了ARM Cortex-A9 (双核 1G Hz)和一款双核的图形处理芯片,相较于iPhone 4所使用的Cortex-A8(单核 800M Hz)和单核图形芯片已有很大的提高。对于像我这种喜欢用手机看准高清片子,又懒得转格式的人来说,A5带来的体验好了很多。至于iPhone 5会不会使用比iPad2更好的处理器,有报道说一些厂商并不急于开发四核的处理器,iPhone 5能用上4核的可能性并不大。
  2. 更好的摄像头:现在主流的观点是iPhone 5会带一个800万像素的摄像头,比iPhone 4的500万在像素上略好一点,不过我更希望Apple能直接上1200万……
  3. 支持电子钱包(NFC):NFC技术可以减化顾客在商店购物付款时的流程,只需拿出手机即可完成付款,这样有效减少的出门所带的东西的数量,也提高了安全性。
  4. 支持HSPA+:联通已经开始部署HSPA+,它的下载速度(理论上限42Mbps)比起传统的HSDPA(14.4Mbps)快了不少,尽管对于手机来说,14.4Mbps差不多够用了,但是能更快一点,何乐而不为呢。
  5. 更小的体积:iPad 2不可思议地比iPad 1小了很多,并且续航时间不变,相信这种技术会继续使用在iPhone 5上。
  6. 廉价版的iPhone:有传言说Apple会给iPod Touch加上3G功能,使它成为一个能打电话的设备,这样就有了低端版本的iPhone了。不过我对此兴趣一般……
一些不太可能升级的部件:
  1. 显示屏:iPhone 4的Retina显示屏已经相当强大了,它的分辩率已经超出了肉眼的识别能力,除非iPhone 5的屏幕尺寸变大,要不然显示屏没有必要变得更好。3D功能?3D需要有大屏幕才能体现出效果,相信即使iPhone支持3D显示也会是个很鸡肋的功能。
  2. 双Sim卡槽:看上去实用性并不大,Apple不太可能照顾小众用户的。
  3. 支持4G (LTE)网络:LTE网络在美国也只处于试点阶段,看iPhone每年一个新产品的规律,放到iPhone 6去支持也不算晚。
至于iPhone 5的发布时间嘛,按惯例是会在9月份,然后估计10月份会全面上市,希望联通这一次动作能快一点,年底之前国内可以开卖……
 

据说倒桩是四个考试项目里最难的,因为它要学4个星期,而剩下的小路和大路各只需要2个星期。

倒桩的难度在于,刚开始学车,向前开都不怎么会,有些人甚至一脚油门都没有踩过,就可以开始向后开。一半以上的距离要通过两个外后视镜(或者叫侧视镜)来判断,对于形象思维不好的同学来说,的确相当困难。

不过上有政策,下有对策。驾校的师傅为了提高通过率,都有一套简单易学的方法来完成倒桩的考试。基本上,只要找准了开始打方向盘的点(俗称“起把点”),记住每个位置需要打几圈方向,考试完全没有压力。一般来说,训练场的尺寸会比真正的考试场略小,只要在训练时做到不碰边线,在考试时就可以完全无视边线了。

至于倒桩练习的实际意义,貌似并不大。在实际的停车过程中,除非你非常有闲心,一般人都是直接一头栽进停车位的,因为倒出来的时候,空间比较大,比倒进去方便很多。某些大型停车场根本不需要倒出来,车少的时候直接往前开出去就好了……平时还可以观察一下驾校师傅的停车方式,至少我是没看到过有倒进停车位的……

 

低成本的经典影片。95分钟的时间几乎全部被男主角占据,他自带着一些工具(荧光棒、小刀、电筒等),用手机和外界通讯,以及一些出现不超过2分钟的配角(被杀的女人质、一条小蛇)构成了完整的故事情节。不得不佩服编剧的能力,让一个男人躺要木箱里表演90分钟,就能让观众看得津津有味。

影片讲述的是一个男人醒来的时候,发现自己被关在一个木箱子里,大概是一口棺材,身边有一个手机和一些工具,于是就开始求救。求救过程中, 机构拖沓的办事效率、 关心媒体报导胜于解救人质的心态被表现地淋漓尽致。

尽管整体的剧情在往好的方向发展,结局的峰回路转还是在情理之中的,有一点超出想象,如果能加上手机最终电力耗尽的一幕,就更完美了……

 

这部美剧的情节和《我知道你去年夏天干了什么》(I Know What You Did Last Summer)如出一辙,讲的都是某年夏天死了一个人,到了第二年,一些诡异的事情就接连发生了…… 《我知道…》系列是一部经典的惊悚片,有人说它比《电锯惊魂》系列还要好看,(不过我不那么赞同)。

言归正传。故事从一个女高生(Alison)在与四个好友的聚会中失踪开始,之后的一年里,Alison一直都下落不明,直到第二年夏天,Alison的尸体被从自家院子里挖掘出来,快被淡忘的Alison和她的四个好朋友又重新引起关注,并且还出现了一个神秘人,他匿名为“A”并把那四个好友搞得团团转。A像是Alison一样知晓她们之间的所有秘密,但由于Alison已死,A的身份一直未明,一直持续到了第二季……

和大多数美剧一样,《美少女的谎言》的第一季很精彩,情节很紧凑。不过从第二季开始,编剧的能力就受到了挑战,由于该被怀疑的人,在第一季中都被调查过一遍,但是为了吸引观众,剧情必须比第一季更出彩。很多剧情连续的剧集,发展到第三、四季就没什么看头了,比如《越狱》。

希望这次编剧不会让大家失望……

 

切西瓜又切了一个高分,哦耶~~

上次的Zen模式不同,这次是Arcade模式,1128分:

和Zen模式相比,Arcade模式的难点在于有炸弹,而且有连击加成,即连续的连击可以获得更多的分数。但是由于有炸弹的存在,连击并不那么容易,一旦切到炸弹,加成效果就消失了,损失很大;但是不经常打出连击的话,加成效果也会渐渐消失。所以在Zen模式精准的基础上,还要加上一点点的反应。至于有特效的香蕉嘛,就只能拼人品了,香蕉的出现数量和次序不一样,可以导致最终分数相差400分以上。

祝大家好运……

 

周末和小R两个人闲着无聊,想玩三国杀,但传统的两人对战模式太无聊了,于是就想出了一种新的两人玩法,用来消磨时光……

新规则的大意是:

1. 对战发生在一个地图上,初始时每方有3×3的领地(如右图);

2. 每方可选一个阵营,即魏、蜀、吴、群雄,并从中挑选出9名武将进行布阵;

3. 每方需指定一名主公,初始位置可为领地内任意位置,主公血量+1(和正常玩法一样);

4. 人物之间的距离按照物理距离来算,如图中刘备和诸葛亮的距离为1、刘备和黄忠距离为2、关羽和夏侯渊的距离也是2,人物死亡并不能减少余下人物之间的距离;

5. 初始时每位玩家各有4张手牌;

6. 每位武将均可装备武器+防具+两马,物品在装备之后即绑定给武将,不可交换(使用顺手牵羊除外);

7. 同一阵营内所有武将共享手牌;

8. 每回合,玩家可选择自己阵营的两名武将逐一进行活动,活动包含判定、摸牌、出牌、弃牌四阶段(和正常玩法一样);

9. 在出牌阶段,武将可弃两张手牌移动一格,只能按照图中划线的方向进行移动;

10. 回合结束后,换对方玩家开始新的回合;

11. 杀死对方的主公即为胜利;

12. 未详述的步骤和现有的三国杀步骤一样。

 

对技能、功能牌的修改:

  1. 桃园结义仅对本方武将有效;
  2. 对方阵营有任何一名武将在顺手牵羊的使用范围内时,即可向对方玩家的手牌使用顺手牵羊
  3. 由于群杀技能过于强大,将南蛮入侵的攻击范围修改为“某一格及其上下左右各一格”,万箭齐发的攻击范围修改为“某一格及其右、下、右下的三格”,如果使用范围有一部分在地图边界外,则超出部分不起作用,受到群杀技能攻击的武将按从左上到右下的顺序逐行逐个出牌;
  4. 闪电判定失败后,可由本方玩家指定对方的一名武将接收闪电
  5. 五谷丰登的目标武将是所有活着的武将,即最多情况需要一次翻出18张牌。
  6. 司马懿张角的置换判定牌的顺序,由需要判定的一方先开始。
一些说明:
  1. 标准版的《三国杀》(不含林扩展)中,群雄只有5人,选择群雄的玩家只能使用这五人进行游戏,且离对方最近的一行中必须放置(至少一名)武将。
  2. 目前对于不含林扩展和军争扩展的三国杀进行了测试,未发现严重问题。
  3. 群杀技能的效果图如下,在一般情况下,南蛮入侵可攻击到5名武将,万箭齐发可攻击到4名武将,极限情况下都可只攻击一名武将。

 

 

 

 

 

 

 

 

 

 

 

 

希望大家玩得开心……

 

在64位Windows中运行32位应用程序的时候,Windows会使用WoW(Windows on Windows)模式来运行它。简单来说,WoW模式是一个运行在64位Windows中的32位Windows的虚拟机,对于32位应用程序来说,它仍然会以为自己运行在32位的Windows当中,它所加载的系统文件、所访问的注册表,也都是32位的版本。不过在64位Windows中,提供了一种方法,可以让32位的应用程序,访问64位的注册表。

.Net Framework 4及以后版本

在.Net 4中,我们可以使用RegistryView枚举来指定打开的64位的注册表,还是32位的注册表。比如下面的C#代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
string value64 = string.Empty;
string value32 = string.Empty;

RegistryKey localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey != null) {
    value64 = localKey.GetValue("RegisteredOrganization").ToString();
}

RegistryKey localKey32 = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
localKey32 = localKey32.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey32 != null) {
    value32 = localKey32.GetValue("RegisteredOrganization").ToString();
}

不难发现,当OpenBaseKey的时候,传入RegistryView.Registry64即可以访问64位的注册表。需要注意的是,在纯32位的Windows中,由于没有64位注册表,这个参数将不起作用,最终打开的还是32位注册表。由于RegistryView和OpenBaseKey是.Net中的新增API,所以C#、VB.Net、PowerShell都可以用这种方式来访问。

Windows API

在Windows API中,可以通过调用RegOpenKeyEx并传入KEY_WOW64_64KEY来达到相同的效果。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public enum RegSAM {
    QueryValue = 0x0001,
    SetValue = 0x0002,
    CreateSubKey = 0x0004,
    EnumerateSubKeys = 0x0008,
    Notify = 0x0010,
    CreateLink = 0x0020,
    WOW64_32Key = 0x0200,
    WOW64_64Key = 0x0100,
    WOW64_Res = 0x0300,
    Read = 0x00020019,
    Write = 0x00020006,
    Execute = 0x00020019,
    AllAccess = 0x000f003f
}

public static class RegHive {
    public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
    public static UIntPtr HKEY_CURRENT_USER = new UIntPtr(0x80000001u);
}

public static class RegistryWOW6432 {

    [DllImport("Advapi32.dll")]
    static extern uint RegOpenKeyEx(
        UIntPtr hKey,
        string lpSubKey,
        uint ulOptions,
        int samDesired,
        out int phkResult);

    [DllImport("Advapi32.dll")]
    static extern uint RegCloseKey(int hKey);

    [DllImport("advapi32.dll", EntryPoint = "RegQueryValueEx")]
    public static extern int RegQueryValueEx(
        int hKey, string lpValueName,
        int lpReserved,
        ref uint lpType,
        System.Text.StringBuilder lpData,
        ref uint lpcbData);

    static public string GetRegKey64(UIntPtr inHive, String inKeyName, String inPropertyName) {
        return GetRegKey64(inHive, inKeyName, RegSAM.WOW64_64Key, inPropertyName);
    }

    static public string GetRegKey32(UIntPtr inHive, String inKeyName, String inPropertyName) {
        return GetRegKey64(inHive, inKeyName, RegSAM.WOW64_32Key, inPropertyName);
    }

    static public string GetRegKey64(UIntPtr inHive, String inKeyName, RegSAM in32or64key, String inPropertyName) {
        //UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)0x80000002;
        int hkey = 0;

        try {
            uint lResult = RegOpenKeyEx(RegHive.HKEY_LOCAL_MACHINE, inKeyName, 0, (int)RegSAM.QueryValue | (int)in32or64key, out hkey);
            if (0 != lResult) return null;
            uint lpType = 0;
            uint lpcbData = 1024;
            StringBuilder AgeBuffer = new StringBuilder(1024);
            RegQueryValueEx(hkey, inPropertyName, 0, ref lpType, AgeBuffer, ref lpcbData);
            string Age = AgeBuffer.ToString();
            return Age;
        }
        finally
        {
            if (0 != hkey) RegCloseKey(hkey);
        }
    }
}
1
2
string value64 = RegistryWOW6432.GetRegKey64(RegHive.HKEY_LOCAL_MACHINE, @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization");
string value32 = RegistryWOW6432.GetRegKey32(RegHive.HKEY_LOCAL_MACHINE, @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization");

上述代码是在C#中通过P/Invoke来调用Windows API,适用于.Net 3.5及之前版本,C++中的调用方法类似。

Windows Management Instrumentation (WMI)

WMI是一种标准化的Windows资源的访问方式,使用WMI也可以访问注册表。可以使用__ProviderArchitecture参数指定所需要的平台:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
strComputer = "."
Const HKLM = &h80000002
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
objCtx.Add "__RequiredArchitecture", TRUE
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")

' Use ExecMethod to call the GetStringValue method
Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
Inparams.Svaluename = "RegisteredOrganization"
set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)

'Show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to  " & Outparams.SValue

WMI可以被多数语言使用,如VBScript、C++,C#也是可以的。

于是,几乎使用任何语言写出来的32位应用程序,都可以在64位Windows上访问64位的注册表了。

© 2004 - 2011 Leona+Suffusion theme by Sayontan Sinha