Git

一. 配置用户信息
[crayon lang=”sh”]
$git config –global user.name “Yuzifu”
$git config –global user.email “yuzifu@mycompanydomain.com”[/crayon]

二. 创建仓库
[crayon lang=”sh”]
$git init
$git add -A
$git commit -m “Initial work space.”[/crayon]

三. 恢复到之前提交的版本
1. 临时恢复
[crayon lang=”sh”]
$git checkout [VersionNO] [FileName/DirectoryName][/crayon]

如果没有指定 VersionNO , git 会恢复到最后一个提交的版本.
VersionNO 不一定要写全, 只要能识别, 可以是VersionNO的前 N 个字符.
VersionNO 可以是 “HEAD” , 表示当前 branch 的最后一个提交的版本, “HEAD^” 表示父版本, “HEAD^^” 表示祖父版本, “HEAD~4″ 表示祖父之祖父版本.

如果指定了文件名或目录名, git 会只恢复指定的内容, 并且是以静默的方式覆盖原有内容.

如果这时编辑并提交, git 会创建另一个 branch .
要回到原来的版本, 恢复默认 branch 即可.
[crayon lang=”sh”]
$git checkout master[/crayon]

2. 永久恢复
[crayon lang=”sh”]
$git reset –hard [VersionNO][/crayon]

如果没有指定 VersionNO , git 会恢复到最后一个提交的版本.
VersionNO 不一定要写全, 只要能识别, 可以是 VersionNO 的前 N 个字符.
VersionNO 可以是 “HEAD” , 表示当前 branch 的最后一个提交的版本, “HEAD^” 表示父版本, “HEAD^^” 表示祖父版本, “HEAD~4” 表示祖父之祖父版本.

如果 git 里包含有比指定 VersionNO 更新的版本, 则在执行此动作后, 更新的版本都会永久删除.

四. 查看
1. 查看日志
[crayon lang=”sh”]
$git log[/crayon]

2. 查看状态
[crayon lang=”sh”]
$git status[/crayon]

3. 查看差异
[crayon lang=”sh”]
git diff[/crayon]

五. Remote
1. 创建远程仓库
远程仓库位于 windows 共享
[crayon lang=”sh”]
$pushd ///PathToRepo/
$git init –bare
$git popd[/crayon]

2. 添加远程仓库
[crayon lang=”sh”]
$git remote add [/crayon]

3. 显示远程仓库
[crayon lang=”sh”]
$git remote show [RemoteName][/crayon]

4. 从远程仓库获取更新
[crayon lang=”sh”]
$git fetch [/crayon]

5. 合并远程仓库的更新
[crayon lang=”sh”]
$git checkout master
$git merge /[/crayon]


[crayon lang=”sh”]
$git pull [/crayon]

6. 推送本地更新到远程仓库
[crayon lang=”sh”]
$git push [/crayon]

Javascript

最近接的一个项目里需要修改 Javascript , 于是花了 3 个礼拜去写 Javascript , 发现了一些值得记录的东西.

一. 作用
Javascript 最终要实现的目标是控制 HTML 元素的显示, 所以它可以根据需求来更改 HTML 元素的显示样式和数据. 样式和数据可以是事先定义好或者从别的地方获取.

二. 语法
Javascript 会从头到尾顺序执行, 如果 Javascript 里控制的元素/样式/数据是在执行的语句的后面被定义, 则元素/样式/数据在这个时候会是 undefined 或 null . 也就是说它不会事先检查语句, 有错误只有在执行的时候才会发现.

Javascript 的变量有 Boolean/Number/String/Undefined/Null 和 Array/Object 这一些数据类型, 但是它们声明的时候全都使用 var 关键字, 变量里存储的数据的类型会随赋值而改变.

三. DOM
Javascript 控制元素/样式/数据时需要用到 DOM . 在 DOM 里 window 对象表示当前浏览器窗口, windows.document 表示当前窗口显示页面的 DOM 对象, window.parent.document 表示当前页面的上一层页面 DOM 对象, window.top.document 表示当前浏览器窗口最外层页面的 DOM 对象.

要从 DOM 获取元素, 可以使用 document.getElementById(“[ElementID]”)/document.getElementsByName(“[ElementName]”)/document.[FormName].[ElementName] 等几种方法, 需要注意的是, 当存在相同 Name 的元素时, 后两种方法得到的是一个 Array .

四. jQuery
jQuery 是使用 Javascript 开发的一个框架, 使用它可以简化开发工作.

我在项目里使用了基于 jQuery 的 jQuery UI 框架, 为的是实现 Modal Dialog , 我发现它的定义语句会在所有页面解析完后才执行, 这一点与上面第二点提到的按顺序执行不相同.

另外不管是 jQuery UI 里的 Dialog 还是 另一个 Javascript Modal Dialog 框架 Boxy , 在 Frameset 方式的页面里都弹不出来.

五. 兼容
IE10/IE9/IE8/IE7/IE6/Chrome/Firefox/Safari/Opear 这些浏览器对于支持的 HTML 标准都不尽相同, 所以就会遇到写好的语句会在不同的浏览器呈现不同的样式. 要解决这个问题只能是尽量遵行所有浏览器都支持的写法, 或都干脆针对不同的浏览器使用不同的写法. 但不管是哪种方式, 都搞的头都大了, 这太让人痛苦了, 前端的活真不是人做的!

Windows 8使用感受

自从MSDN发布之后,我就安装了Windows 8,使用的时间不长,才一个礼拜。我使用的用途也很简单,家用电脑上个网,娱乐什么的,连第三方游戏也没安装。所以可以说这是第一感受。

一、欢迎屏幕
Win8的“欢迎屏幕”使用起来感觉很新鲜,但是这种感觉很快就被不便替代了。比如说你要找程序,你只能通过“搜索”功能或者是磁贴和快捷方式的来解决,这种操作方式对于根深蒂固的“开始菜单”来说,太不方便了。所以没有“开始菜单”就不知道怎么玩了,并且我也没觉的“欢迎屏幕”有多易用,这对不管是新手还是熟手来说都不会是一个受欢迎的改变。

二、Metro
Metro纯粹是为触摸屏而生的UI,在PC上使用除是浪费屏幕空间还总是显的那么的格格不入。所以像图片音乐视频等文件有自带查看器的,我都改成了桌面程序来打开了,因为我不想总是看个图或者听几首歌什么的还要全屏。

三、窗口风格
Win8的窗口风格乍一看起来巨丑,没Aero也没Shadow。可是使用一段时间后还是发现了它的优点,MS说的没错,这种风格不会分散你的注意力。只是有一点可能它们也没考虑到:当把窗口设为暗色时,非激活窗口的文字还是黑色,这会造成什么后果,试了就知道了。

四、开关机
快!真的非常快。即使关闭“快速开机”,也一样的快,如果我用的是SSD,我估计还会更快。这种愉乐的心情即使被MS脑残式的关机步骤设计冲击也没减少几分,是的没错,关机功能被隐藏的很深,这让人很郁闷。
另外需要特别留意的是,”快速开机”有一个严重的Bug,触发条件是使用双硬盘。

五、方便的功能
在实用性方面,Win8有几个地方值的称赞。一是截屏,使用Alt+Print Screen快捷键就可以把屏幕截下来自动保存在图片库里。二是资源管理器的Ribbon工具,操作方便多了。三是虚拟光驱,现在可以直接加载iso格式的文件,挂在虚拟光驱里。四是资源管理器非常棒,各种信息一目了然。五是Win To Go,真是移动办公的好帮手啊!

六、不兼容性
我的文字输入方式是五笔,在桌面程序下大多数五笔输入法都能用,可是在Metro界面通通失灵了,这个问题是很影响情绪。另外我在支付财付通的时候,发现财付通的居然显示不正常,这很让人无语,当然我知道这个问题其实跟IE10没什么关系。

Linux Work Enviroment Build Record

1, Install Debian Squeeze
select standard system tools category only

2, Switch distribute to Wheezy
a, edit /etc/apt/sources.list, the contect is follow
[crayon lang=”sh”]deb http://mirrors.ustc.edu.cn/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free[/crayon]

b, fetch package list
execute follow command in root console
[crayon lang=”sh”]#aptitdu update[/crayon]

c, update system to Wheezy
execute follow command in root console
[crayon lang=”sh”]#aptitude dist-upgrade[/crayon]

d, reboot system after update process is complete.

3, Configure system
a, locales
execute follow command in root console
[crayon lang=”sh”]#dpkg-reconfigure locales[/crayon]

select all en_US/zh_CN/zh_TW locale, the default locale is en_US.UTF-8

b, console resolution
execute hwinfo –framebuffer will display your graphic card support resolution
edit /etc/default/grub, add the line as follow
[crayon lang=”sh”]GRUB_GFXMODE=1920x1080x32[/crayon]

edit /etc/grub.d/00_header, add follow line after 132 line
[crayon lang=”sh”]set gfxpayload=keep[/crayon]
if grub2 not display corrent with this resolution, it’s can change keep to corrent resolution.

general /boot/grub/grub/cfg, execute follow command in root console
[crayon lang=”sh”]#grub-mkconfig -o /boot/grub/grub.cfg[/crayon]

c, timezone
edit /etc/default/rcS, change UTC=yes to UTC=no

4, Install package from network
execute follow command in root console
[crayon lang=”sh”]#aptitude install sudo unzip unrar vim emacs rcconf build-essential hwinfo git xorg iceweasel ibus ibus-table-wubi xfonts-wqy ttf-wqy-zenhei ttf-wqy-microhei fonts-droid feh scrot alsa-base alsa-utils[/crayon]

5, Install Google Chrome
create text file /etc/apt/sources.list.d/google-chrome.list with follow contect
[crayon lang=”sh”]deb http://dl.google.com/linux/chrome/deb/ stand main[/crayon]

then update package list and install package, the command as follow
[crayon lang=”sh”]#aptitude update
#aptitude install google-chrome-stable[/crayon]

6, Compile Window Manager
download dmenu source code from it’s homepage
then execute follow command in root console
[crayon lang=”sh”]#tar zxvf dmenu-x.x.tar.gz
#cd dmenu-x.x
#make clean install[/crayon]

dmenu will install to /usr/local/bin/ directory

create script file dmenu_path in /usr/local/bin/ with follow contect, mode is 0755
[crayon lang=”sh”]#!/bin/sh

CACHE=$HOME/.dmenu_cache
IFS=:

uptodate() {
test -f “$CACHE” &&
for dir in $PATH
do
test ! $dir -nt “$CACHE” || return 1
done
}

if ! uptodate
then
for dir in $PATH
do
cd “$dir” &&
for file in *
do
test -x “$file” && echo “$file”
done
done | sort | uniq > “$CACHE”.$$ &&
mv “$CACHE”.$$ “$CACHE”
fi

cat “$CACHE”[/crayon]

download Musca source code from it’s homepage
then exectue follow command in root console
[crayon lang=”sh”]#tar zxvf musca-x.x.x.tar.gz
#cd musca-x.x.x
#make
#cp apis /usr/local/bin/
#cp musca /usr/local/bin/
#cp xlisten /usr/local/bin[/crayon]

7, Configure X
a,Xorg
the X server xorg haven’t configure by manual, it’s work well by itself.

b,musca
create musca config file ~/.musca_start with follow contect
[crayon lang=”sh”] set window_open_frame empty
set border_width 0
border off
pad 0 0 0 0
hook on ^add pad 0 0 0 0
name Management
add Programming
add Internet
add Multimedia
use 0
bind on Mod4+e exec emacs
bind on Mod4+b exec google-chrome
bind on Mod4+0 use 0
bind on Mod4+1 use 1
bind on Mod4+2 use 2
bind on Mod4+3 use 3[/crayon]

c,xinit
create X lunchar file ~/.xinitrc with follow contect
[crayon lang=”sh”] export XMODIFIERS=”@im=ibus”
export XIM=ibus
export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus
exec ibus-daemon &
exec musca[/crayon]

d,XTerm
default, XTerm english font is too small, and can’t display chinese, so change the default font
XTerm config is build-in ~/.Xdefault, the contect as follow
[crayon lang=”sh”] Xft.dpi: 96
Xft.antialias: true
XTerm*locale: true
XTerm*utf8: true
XTerm*utf8Title: true
XTerm*renderFont: true
XTerm*preeditType: Root
XTerm*xftAntialias: true
XTerm*fontMenu*fontdefault*Label: Default
XTerm*faceName: Droid Sans Mono:antialias=true:pixelsize=13
XTerm*faceNameDoublesize: WenQuanYi Zen Hei:antialias=true:pixelsize=13
XTerm*cjkWidth: false
XTerm*background: black
XTerm*foreground: white
XTerm*SaveLines: 3000
XTerm*VT100.Translations: #override \
Ctrl V: insert-selection(CLIPBOARD,PRIMARY,CUT_BUFFER0) \n\
: select-end(CLIPBOARD,PRIMARY,CUT_BUFFER0) \n\
Ctrl P: print() \n[/crayon]

Hackintosh

一、硬件
主板:MSI G41TM-E43

详细信息
芯片:Intel G41 + ICH7
显示:GF6600LE
网卡:Realtek 8111DL
声卡:Realtek ALC888S / ALC889

二、软件
Mac OSX Snow Leopard 10.6.3
MD5:A83CEC287B4AB2F0EF11264C580C4E2D
http://bbs.pcbeta.com/viewthread-724423-1-1.html

MBR安装补丁
OSInstall + OSInstall.mpkg
http://bbs.pcbeta.com/viewthread-731391-1-1.html

引导程序
BootThink 2.4.6
http://www.rayfile.com/zh-cn/files/73e974f0-98c2-11e0-8a01-0015c55db73d/

显卡驱动
Natit + NVinject(任选一个)
http://www.kexts.com/view/170-videocards_(nvidia)_10.6_(86-64).html

声卡驱动
VoodooHDA 0.2.1
http://bbs.pcbeta.com/forum-viewthread-tid-763627-highlight-voodoohda.html

网卡驱动
RTGMac 2.0.6
http://bbs.pcbeta.com/forum-viewthread-tid-884669-highlight-8111.html

HFS Explorer 0.21
http://bbs.pcbeta.com/forum-viewthread-tid-640909-highlight-HFS%2BExplorer.html

TransMac 9.1
http://bbs.pcbeta.com/forum-viewthread-tid-613089-highlight-transmac.html

Leopard硬盘安装助手 0.3
http://bbs.pcbeta.com/forum-viewthread-tid-881248-highlight-%D3%B2%C5%CC%B0%B2%D7%B0%D6%FA%CA%D6.html

DiskGenius 3.5.0
http://www.diskgenius.cn/

三、安装
指导资料
http://bbs.pcbeta.com/viewthread-763656-1-1.html

四、状况
除了未开启QE/CI,其它均正常。

五、备注
1,声卡驱动若使用VoodooHDA 0.2.72,则有轻微的沙沙响,后改用0.2.1则正常
2,显示驱动使用Natit或NVinject后可更改分辨率,但不能开启QE/CI
3,除网卡驱动是在启动到OS X系统里安装外,其它驱动均放至BootThink目录

应用程序分类

做通用型软件没有出路,所以现在选择的是走按需订做的路子,这种方式的特点是归纳业务模式难、需求变化大、造价高。看在最后一点的面子上,不管想什么办法也得把合同签下。

程序分类的标准有很大,对于企业MIS来说,数据库是少不了的,根据企业的部署结构,分为本地和联网型:
一,本地型
此种类型指的是程序和数据库在同一台PC或者同一局域网(VPN也算),程序直接连接数据库,对数据库进行操作。
有些程序会允许多个客户端连接同一数据库,但一般情况各客户端对数据库的操作不会破坏数据完整性。

二,联网型
当本地型应用不能满足业务需求时,就要考虑联网型应用了。
1)纯在线型
此部署结构一般是指B/S结构,现阶段主流是Web应用。
它最大的特点是不需安装客户端,但同时也存在不能充分利用客户端PC资源的缺点。
编写此类型程序时,程序和数据库都处于服务器端。与本地型程序不同的是,它需要考虑并发状况。
另外需要特别指出的WPF的XBAP类型应用是一种伪在线型程序,它本质上还是本地型应用程序。

2)瘦客户端型
这种类型的应用程序可以弥补前两种类型的不足,这也意味着它更复杂、更高级。
一般来说,客户端只是对某一服务发出请求,并对结果进行呈现。服务端里封装了几乎所有的数据操作,并且对外提供服务。数据库一般都与服务端处于同一服务器或同一局域网。

C#导入导出Office文档

为了减少对其它商业软件的依赖,对于像导入导出Office文档这样的功能,可以不使用PIA程序集,而像下面这样:
[crayon lang=”c#”]string strConn = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source='” + path.Trim() + “‘;Extended Properties=’Excel 8.0;HDR=Yes;IMEX=1′”;
OleDbConnection OleConn = new OleDbConnection(strConn);
OleConn.Open();
string strExcel = “Select * From [Sheet1$]”;
OleDbDataAdapter OleDA = new OleDbDataAdapter(strExcel, strConn);
DataTable table = new DataTable();
OleDA.Fill(table);[/crayon]
这样客户端不需要安装Office就可以读取Excel里的数据,其中连接字符串里的IMEX=1是指定混合类型的数据列均按文本来读取,据说可以解决数据列里有多个类型的数据时某些数据读取不出的问题。可惜的是,尝试后发现不起作用。

后来在某处看到一个新的解决方法:
[crayon lang=”c#”]修改HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Excel的TypeGuessRows值为0,预设是8
其原理是Office会先读取每一列的前8行来决定每一个数据列的类型,所以如果前8行的资料都是数字,到了第9行以后出现的文字资料都会变成null,设为0即表示事先决定数据列的类型。[/crayon]
问题虽然解决了,但显示这不是一个好办法,这要求每个客户端都必须修改注册表,比起Office的装机量,使用PIA来读取Office文件或许是个更明智的选择:
[crayon]excel = new Excel.Application();
excel.Application.Workbooks.Open(path, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing);
Excel.Workbook wb = excel.Workbooks[1];

Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[“Sheet1”];
DataTable table = new DataTable();
for (int i = 0; i < ws.UsedRange.Columns.Count; i++) { DataColumn dc = new DataColumn(); dc.ColumnName = ((Excel.Range)ws.Cells[1, i + 1]).Value; table.Columns.Add(dc); } DataRow dr; for (int n = 1; n < ws.UsedRange.Rows.Count; n++) { dr = table.NewRow(); for (int m = 0; m < ws.UsedRange.Columns.Count; m++) { dr[m] = ((Excel.Range)ws.Cells[n + 1, m + 1]).Value; } table.Rows.Add(dr); }[/crayon]

Web连接被无规律断开

背景:
一个虚拟主机,独立IP: 1.1.1.1,为域名a.b.c提供web服务。a.b.c域名在国内注册,DNS记录由afraid.org管理。

道具:
PC1: win7(电信2M adsl/dns:8.8.4.4、208.67.222.222)+IE8+Chrome11
PC2: win7(电信4M adsl/dns:8.8.4.4、208.67.222.222)+IE8+Chrome9
Laptop: win7(dns:8.8.4.4、208.67.222.222)+IE8+Chrome9
Server1: win2k3(电信IDC 100M共享/dns:8.8.4.4、208.67.222.222)+IE8

本市另一个区的一台PC3:XP(电信接入,其它参数不详)+IE7
本市另一区的一台PC4:win7(铁通2M adsl/dns:8.8.4.4、208.67.222.222)+IE8
本省另一市的一台PC5:Win(参数不详)
另一省的一台PC6:XP(电信2M adsl,其它参数不详)+IE7

现象:
2011.02.20晚上开始从PC1访问a.b.c会随机出现以下三种情况之一:
1,正常打开。
2,能显示部分页面内容,但格式不正确。
3,打不开,Chrome里显示”错误 101 (net::ERR_CONNECTION_RESET):The connection was reset.”

在上面三种情况之一刷新页面,会随机出现上面的三种情况之一。
使用Fiddler进行侦测,发现第2、3种情况时Fiddler会提示若干”远程主机强迫关闭了一个现有的连接。”

PC2访问a.b.c时出现PC1相同的现象,Laptop在PC1、PC2网络环境下访问a.b.c时亦出现相同现象,Server1访问a.b.c时正常,PC3、PC4、PC5、PC6访问a.b.c时均正常。

处理:
1,Server1、PC3、PC4、PC5、PC6均能正常访问说明Web服务器没问题,Web服务器IP也没有被GFW加入黑名单。
2,PC1、PC2、Laptop能正常访问其它网站,说明PC1、PC2、Laptop配置正常,本地网络也正常。
3,那么问题只能是出在本区的电信设备上。

于是开始找证据支持这个观点。在PC1打开Fiddler放在左边,打开Chrome放到右上,打开IE放在右下,然后一边不停地打开Chrome/IE、输入a.b.c、刷新、关闭,一边查看Fiddler的结果。

非正常显示和打不开时,Fiddler不停地显示”远程主机强迫关闭了一个现有的连接。” 这样进行了半个多小时后,突然发现,正常打开a.b.c后转变成非正常显示或者打不开之前,总是会关闭一个含有/twip/路径的连接,也就是说在关闭这个连接之后,访问a.b.c就会出现异常。

twip是a.b.c空间里安装的一个twitter应用,PC1、PC2、Laptop均安装了Chrowety,并通过它来连接twitter。之前Chrowety一直正常使用。难道会是它被GFW墙了,连累了访问a.b.c?

于是卸载了Chrowety,这时连接a.b.c正常,使用Laptop访问a.b.c也正常。为了确认这个原因,我再次安装Chrowety并设置好,访问a.b.c时故障现象重现。

GFW很强大,升级后的GFW更强大。

在Windows上安装PostgreSQL

之前我记录了一篇手工在Windows上安装PostgreSQL的文章,刚才在安装PostgreSQL 9.0.3时发现了另一种方法,可以比手工安装更快速些。

,下载PostgreSQL安装包
下载的文件的名称为postgresql-9.0.3-1-windows.exe

,安装PostgreSQL程序
要注意的是,PostgreSQL必须要安装在NTFS格式的分区里。

特别要注意,locale不可以选择Default,如果为了省事,在这里可以选择“新加坡”,这样安装后可以直接使用,无需进行后续的步骤。在这里我选择“新加坡”,但是我还是会进行后续的步骤。

,更改Windows帐号postgres的密码
在安装过程中把locale选择“新加坡”后,可以正常安装。安装过程会给Windows添加一个名为postgres的帐号,为了安全,先修改这个帐号的密码。

,停止PostgreSQL服务
在管理工具的服务项里找到PostgreSQL服务,把它停止。并把此服务登录的身份帐号密码修改为第三步修改后的新密码。

,删除PostgreSQL程序目录下的data目录

,在控制台切换到postgres用户
C:\>runas /noprofile /env /user:postgres "cmd"

因为PostgreSQL安装程序在Windows里注册PostgreSQL服务时指定的是使用postgres这个Windows帐号作为登录身份,所以初始化数据库时必须也是这个帐号,否则PostgreSQL服务将无法启动。

其实不切换到postgres用户,PostgreSQL也能正常初始化数据库,但基于上面提到的原因,如果PostgreSQL服务指定的登录身份帐号与初始化数据库时所用的帐号不一致时,PostgreSQL服务将无法启动。

,初始化数据库
这里假设PostgreSQL程序安装在D:\PostgreSQL目录下。在第六步新弹出的窗口里执行以下命令:
D:\PostgreSQL>bin\initdb.exe -D "D:\PostgreSQL\data" -E UTF-8 --locale=chs -A md5 -U admin -W

如果不加-U admin -W,则PostgreSQL数据库的超级用户是执行初始化命令时的当前Windows帐号。因为是切换到postgres这个Windows帐号里进行初始化数据库操作的,所以这时PostgreSQL的超级用户将是postgres。

,在管理工具的服务项里启动PostgreSQL服务