HABIT IS POWER

习惯就是力量

0%

我遇到的问题

两个进程,用Mutex进行互斥,后起来的进程WaitForSingleObject这个Mutex来等待前一个进程退出,期望是第二个进程可以Wait时卡住,但事实是没有,不过OpenMutex却可以拿到这个Mutex。

检查代码后发现和CreateMutex的第二个参数有关系,如果设置成TRUE就可以了。

不是很明白其中的道理,于是仔细阅读了MSDN上关于这个参数的说明,得到了一些启示。

MSDN上的参数说明:

1
2
3
4
bInitialOwner [in]
If this value is TRUE and the caller created the mutex, the calling thread obtains initial ownership of
the mutex object. Otherwise, the calling thread does not obtain ownership of the mutex. To determine
if the caller created the mutex, see the Return Values section.

看完之后还不是很明白这个参数的具体意义,于是接着往下看,这段就说的比较清楚了:

1
2
3
4
5
6
The state of a mutex object is signaled when it is not owned by any thread. The creating thread can use 
the bInitialOwner flag to request immediate ownership of the mutex. Otherwise, a thread must use one of
the wait functions to request ownership. When the mutex's state is signaled, one waiting thread is granted ownership, the mutex's state changes to nonsignaled, and the wait function returns. Only one thread can own a mutex at any given time. The owning thread uses the ReleaseMutex function to release its ownership.

The thread that owns a mutex can specify the same mutex in repeated wait function calls without blocking
its execution. Typically, you would not wait repeatedly for the same mutex, but this mechanism prevents a thread from deadlocking itself while waiting for a mutex that it already owns. However, to release its ownership, the thread must call ReleaseMutex once for each time that the mutex satisfied a wait.

英文不好,第一次看是没太留意,后面发现了一个bug后才知道自己用错了。

  1. 如果bInitialOwner参数是FALSE的话那么默认是signaled,也就是谁都可以Wait到(比如有第二个进程WaitForSingleObject了这个Mutex,那么会直接过去)
  2. 如果不想第二个进程Wait时直接过去,有两个方法:
    2.1 bInitialOwner设置为TRUE
    2.2 bInitialOwner设置为FALSE,第一个进程在CreateMutex后主动WaitForSingleObject一次,我是这么干的,有用

WaitForSingleObject(hMutex, 0);

两个的区别是什么:

1
2
3
Two or more processes can call CreateMutex to create the same named mutex. The first process actually 
creates the mutex, and subsequent processes with sufficient access rights simply open a handle to the
existing mutex. This enables multiple processes to get handles of the same mutex, while relieving the user of the responsibility of ensuring that the creating process is started first. When using this technique, you should set the bInitialOwner flag to FALSE; otherwise, it can be difficult to be certain which process has initial ownership.

我最终使用的解决方法是2.2的方法:

bInitialOwner设置为FALSE,第一个进程在CreateMutex后主动WaitForSingleObject一次,我是这么干的,有用

参考:

MSDN上的CreateMutex function

由于某种不可抗拒的力量,我必须把一个Oracle XXX系统跑起来,按正常来说只是跑起来这应该很简单,又不需要自己写一个,但是我在Oracle上确实遇到了麻烦,这东西很不人性化,是我接触的数据库中最难上手的一个。

1、安装问题

我的机器安装的是Win7,在Oracle官网下载了最不同的10g Express版本,安装过程和使用过程中一堆莫名其妙的错误,后面试试感觉应该也问题不大,但整个流程让人很不放心无法放心使用。在我的一番尝试下(10g Express, 10g 企业版,10g for vista, 11g),结论是:Win7下还是10g for vista版本最靠谱。

2、添加用户

新建数据库后,Oracle会在开始菜单为你提供一个管理网页的链接,我原本以为这个网页应该会累死phpAdmin那样方便,结果大失所望,一堆功能的麻木堆砌,不是一般的难用。

最后我还是采用了SQL Plus的命令行方式进行添加用户,找到命令行一下子找回了数据库的感觉。

3、导入数据

Oracle的导入导出数据是有专门的命令:exp和imp,需要注意的是这两个命令不是在SQL Plus下使用,而是在普通的CMD命令行下执行,具体命令行使用可以参考这个:

Oracle exp/imp导出导入工具的使用

简单描述下我的导入数据步骤,因为我在这地方卡住了,╭(╯^╰)╮

001、为要导入的数据专门新建一个用户,在SQL Plus下进行(我新建了个用户:linyehui 密码:password):

1
2
3
4
5
6
7
--创建用户
create user linyehui identified by password
default tablespace users
temporary tablespace temp
quota 10m on users;

grant create session,resource to linyehui;

002、在cmd命令行下:

$ imp linyehui/password file = all.dmp full=y

你应该可以得到类似的提示,如果你的数据是正确的话:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Import: Release 10.2.0.3.0 - Production on 星期六 1月 8 14:30:40 2011


Copyright (c) 1982, 2005, Oracle. All rights reserved.




连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options


经由常规路径由 EXPORT:V09.02.00 创建的导出文件
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 ************************
. . 正在导入表 "TABLE1"导入了 4 行
. . 正在导入表 "TABLE2"导入了 7 行
. . 正在导入表 "TABLE3"导入了 12 行
成功终止导入, 没有出现警告。

结语

好了,数据库方面的问题已经搞定了,剩下的就是调用的问题了,http://twitter.com/#!/linyehui/status/23642782056841216 Y(^o^)Y

  1. ClearCase Find Checkout时的默认窗口大小是保存在注册表中的,如果这个默认大小你不喜欢,你可以删除注册表中的键值,这样就会还原回默认的大小。

HKEY_CURRENT_USER\Software\Atria\ClearCase\CurrentVersion\FindCheckouts\Settings

Window Rect

需求描述

自己在Windows上用VisualSVN搭了个服务器,默认提交代码是可以不填任何信息,这可不是我所期望的,于是找到了下面的解决方案:

在VisualSVN的管理控制台中可以设置这些规则,这些规则在特定的时机触发,其中Commit代码之前检查是否填写了log信息,我们可以在pre-commit时进行。

设置方法:

  1. 打开VisualSVN管理控制台
  2. 右键你要设置的代码仓库
  3. 所有任务-》Manage Hooks……
  4. 编辑“Pre-commit hook”

其实这个编辑对应的是在你的代码仓库目录下的Hook子目录生成了一个. cmd的文件,我们自己修改这个文件就可以了,不需要通过界面修改。

在hook目录有一些模板,但模板用的是linux的命令,把模板的后缀名修改成cmd并不能正确执行,所以我们需要符合Windows的Hook脚本,我测试了两个,一个是纯DOS命令,一个是需要perl,都测试OK,还有一个pytyon的版本我就没有测试了,具体可以参考我最后列出来的参考文档。

1、纯Windows DOS命令

只需要一个文件就可以:pre-commit.cmd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@echo off
::
:: Stops commits that have empty log messages.
::

@echo off

setlocal

rem Subversion sends through the path to the repository and transaction id
set REPOS=%1
set TXN=%2

rem check for an empty log message
svnlook log %REPOS% -t %TXN% | findstr . > nul
if %errorlevel% gtr 0 (goto err) else exit 0

:err
echo. 1>&2
echo Your commit has been blocked because you didn't give any log message 1>&2
echo Please write a log message describing the purpose of your changes and 1>&2
echo then try committing again. -- Thank you 1>&2
exit 1

需要注意的是svnlook这个是在VisualSVN安装目录下的bin下面,你可以用全路径来替换或者设置系统环境变量

2、CMD配合perl实现,还可以判断Log信息的最小长度,比较灵活,需要两个文件

pre-commit.cmd:

1
2
3
set REPOS=%1 
set REV=%2
"C:\Perl\bin\perl.exe" "E:\Repositories\woodpecker\hooks\custom-pre-commit.pl" %REPOS% %REV%

custom-pre-commit.pl:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

# config section
$minchars = 4;
$svnlook = '"D:\Program Files\VisualSVN Server\bin\svnlook.exe"';

#--------------------------------------------
$repos = $ARGV[0];
$txn = $ARGV[1];
$comment = `$svnlook log -t "$txn" "$repos"`;
chomp($comment);

if ( length($comment) == 0 ) {
print STDERR "A comment is required!";
exit(1);
}
elsif ( length($comment) < $minchars ) {
print STDERR "Comment must be at least $minchars characters.";
exit(1);
}

exit(0);

当然第二个是需要你按照perl的

第一个方便点,第二个灵活点

参考文献:

Perl pre-commit hook

Require subversion comments – a perl pre-commit hook

VisualSVN pre-commit rule

VisualSVN 提交时必须输入消息设置

9f35e42344b24d9eb628c8c0d3ff43bd.png

令人欣慰的是,M8在哪的1.0.6版本赶在圣诞之前(2010/12/24)上架了。

点击这里围观

1.0.6版本添加了2个功能:

  1. 地图多点触摸
  2. 支持发送到新浪微博
  3. 修正了之前的一些小BUG

这个版本其实从2010-12-12号左右就提交了上架申请,但可能是M9即将发售的原因,拖了这么久才上架(之前的版本都是一周以内,赞下魅族的效率)。

这个版本本可以更早的发布,但由于我的笔记本和我本人的身体接连罢工,才拖到了现在,不好意思了大家。

这将是M8在哪的最后一个版本,感谢大家的支持。之后的业余时间我会转战iOS开发。

1、网站的Sitemap:**/admin:sitemap**

我的sitemap: sitemap

这个非常有用,可以帮你列出网站的所有页面,包括各种配置页面和导航页面,初次使用Wikidot的同学看了这个就能明白很多东西

2、文章的排序可以使用创建时间,默认的例子使用的是按最后更新时间排序。

参考文献

用这个:

order="created_at desc"

不要用这个:

order="updated_at desc"

3、默认的导航页面的连接:/nav:top和/nav:side

这个页面路径还可以在/admin:manage页面中的Appearance下的Navigation elements中修改

这是我的Git入门笔记,讲述我在Windows 7上的Git初体验。

整个过程主要参考:http://lab.mzr.jp/progit/progit.zh.html.gz

1、Windows上安装Git

有个叫做 msysGit 的项目提供了git的Windows安装包,可以从 Google Code 的页面上下载安装文件(.exe):
http://code.google.com/p/msysgit

我下载的是这个:“Full installer for official Git 1.7.3.1”

Tips:

  • a、安装时推荐只使用Git Bash,因为我试过了在Win7下在命令行下直接使用Git会有各种各样奇怪的问题
  • b、Win7上打开Git Bash切记要“以管理员权限打开”
    这个非常重要,不这么做会出现类似的提示:

    error: Failed connect to github.com:443; No error while accessing

2、路径使用注意

使用Git Bash时的目录切换采用类似的命令行:cd /e/github/zaina,而不是Windows那样的cd E:然后cd:github/zaina

3、你可能需要设置代理,那么设置两个环境变量

参考文献

http_proxy = “http://proxy1.somecompany.com:8080"
https_proxy = “http://proxy1.somecompany.com:8080"

4、遇到“fatal: write error: Broken pipe”怎么办?

参考文献

用这个命令行解决:git config http.postBuffer 104857600

5、不小心把obj文件入库了怎么删除

删除文件及索引用命令:git rm -f xxx.obj

删除目录及对应的索引用命令:git rm -r -f obj

6、github的README文件想要显示中文的话要记得保存成UTF编码

7、.gitconfig的路径问题

.gitconfig的配置不支持”D:\Program Files"这样的带空格的路径,如果你非要放在这样的目录下,建议你加个环境变量

8、CopSSH激活系统用户作为ssh用户时卡很久

用CopSSH在Windows上搭建git服务器时,安装后需要激活系统的用户作为ssh的用户,执行这一步时如果你所在的域有很多用户(比如公司环境),那么这个地方会卡住很久,有个小技巧:断开网络后再执行这个操作

9、TortoiseGit

TortoiseGit非常好用,习惯TortoiseSVN 的话能很快上手

TortoiseGit下载地址

还有使用教程

m9fun1.jpg

作为M8的使用者,关注M9的发布

实在是再正常不过了,但是我自己却不会为自己购买M9。

从M9的评测文章来看,可以流畅播放1080P的MOV这一点就足以说明这款手机的娱乐功能就像M8一样出类拔萃。从性价比来说M9虽然没有M8那么高,但也算是不错,然而现在的手机想要达到iPhone的高度光有硬件是不够的,真正的难点在于App Store,这也是我为什么不看好Android系统的原因,更而况是中国大陆阉割版的Android系统。

就算M9卖疯了,但如果魅族商店没有做成,那么M9最多也就是一代代街机中的“之一”。

ClearCase本身就是个古老的东西,他自带的Diff工具更是难用的要死,所以我不得不想办法给他替换掉,改成我自己惯用的BeyondCompare。

在CC的界面上找了好久,就是找不到修改比较工具的位置,CC你能再难用点吗?!!

于是我下意识的想到:有没有配置文件可以修改?

用ClearCase Check in是能够发现他的Diff工具是个独立进程,于是我就用ProceXP查看了进程路径,在ClearCase的目录下用TotalCommand进行文字搜索,一下在就找到他的配置文件:

C:\Program Files\IBM\RationalSDLC\ClearCase\lib\mgrs\map

修改这个配置文件,重新再ClearCase Check in窗口双击,哈哈,弹出来的比较工具已经变成了BeyondCompare

当您看到这封信的时候,我们刚刚作出了一个非常艰难的决定。我要跟大家谈谈Google Static Maps API那点事。

Google Static Maps API V2 开发人员指南

http://code.google.com/intl/zh-CN/apis/maps/documentation/staticmaps/

这个API非常好用,因为一个URL就对应着一个图片,这样的API不仅可以在Web程序中使用个,也可以很方便的在App中使用。

BaiduMap也提供了类似的API,但只有JS的调用,没有见到直接的URL使用方式,这样的话就不好在客户端程序中使用。

这套API其实也很简单,大部分东西都在开发指南中提到了,这里我只介绍下我在做【在哪】时遇到的一个开发指南中没有提到的东西:

地图移动的偏移量

如果地图的Level不变的话,每次移动的偏移量其实是很容易试出来的,但地图在放大和缩小之后难道每个缩放等级都要去试出来吗?

从0-21都试一次的话还是比较麻烦。

我自己试了下,发现了规律:2倍。

是的,放大之后的偏移量是之前的2倍,缩小之后的偏移量是之前的1/2,实验之后基本差不多。