Git

一. 配置用户信息

$git config --global user.name "Yuzifu"
$git config --global user.email "yuzifu@mycompanydomain.com"

二. 创建仓库

$git init
$git add -A
$git commit -m "Initial work space."

三. 恢复到之前提交的版本
1. 临时恢复

$git checkout [VersionNO] [FileName/DirectoryName]

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

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

如果这时编辑并提交, git 会创建另一个 branch .
要回到原来的版本, 恢复默认 branch 即可.

$git checkout master

2. 永久恢复

$git reset --hard [VersionNO]

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

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

四. 查看
1. 查看日志

$git log

2. 查看状态

$git status

3. 查看差异

git diff

五. Remote
1. 创建远程仓库
远程仓库位于 windows 共享

$pushd //<RemoteServer>/PathToRepo/
$git init --bare
$git popd

2. 添加远程仓库

$git remote add <RemoteName> <RemoteURL>

3. 显示远程仓库

$git remote show [RemoteName]

4. 从远程仓库获取更新

$git fetch <RemoteName> <BranchName>

5. 合并远程仓库的更新

$git checkout master
$git merge <RemoteName>/<BranchName>

$git pull <RemoteName> <BranchName>

6. 推送本地更新到远程仓库

$git push <RemoteName> <BranchName>

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没什么关系。

C#导入导出Office文档

为了减少对其它商业软件的依赖,对于像导入导出Office文档这样的功能,可以不使用PIA程序集,而像下面这样:

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);

这样客户端不需要安装Office就可以读取Excel里的数据,其中连接字符串里的IMEX=1是指定混合类型的数据列均按文本来读取,据说可以解决数据列里有多个类型的数据时某些数据读取不出的问题。可惜的是,尝试后发现不起作用。

后来在某处看到一个新的解决方法:

修改HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Excel的TypeGuessRows值为0,预设是8
其原理是Office会先读取每一列的前8行来决定每一个数据列的类型,所以如果前8行的资料都是数字,到了第9行以后出现的文字资料都会变成null,设为0即表示事先决定数据列的类型。

问题虽然解决了,但显示这不是一个好办法,这要求每个客户端都必须修改注册表,比起Office的装机量,使用PIA来读取Office文件或许是个更明智的选择:

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);
}

在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服务

售后调查系统

描述:
本软件提供企业售后调查记录功能。

授权:
本软件采用BSD授权。

技术:
架构采用.Net 4;
结构采用C/S;
UI采用WPF;
DAO采用NH3;
Logic层采用MVVM;
DB支持FireBird、PostgreSQL、MS SQL 2008。

截图:

扩展WPF的DataGrid如同Excel支持方向键移动焦点

WPF的DataGrid默认的移动行为如下:

(1)当前单元格不处于编辑状态时可使用方向键移动焦点。

(2)当前单元格处于编辑状态时不可使用方向键移动焦点;
按Enter键,当前单元格退出编辑状态,焦点向下移动一格;
按Ctrl+Enter键,当前单元格退出编辑状态,焦点向上移动一格;
按Tab键,当前单元格退出编辑状态,焦点向右移动一格,并进入编辑状态;
按Shift+Tab键,当前单元格退出编辑状态,焦点向左移动一格,并进入编辑状态;

“运营管理3.0″的用户普遍电脑操作水平低下,Office是它们操作的最多也是最智能的软件,它们认为所有的软件都必须是Office一样地操作,否则就给差评,所以它们要求”运营管理”的操作方式尽量与Excel相同.

为了实现WPF的DataGrid的移动方式与Excel相同,需要重写DataGrid的OnPreviewKeyDown事件:

public class ExDataGrid : DataGrid
    {
        protected override void OnPreviewKeyDown(KeyEventArgs e)
        {
            if (e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up || e.Key == Key.Down)
            {
                try
                {
                    base.CommitEdit();
                }
                catch (Exception ex)
                {
                    base.CancelEdit();

                    string mess = ex.Message;
                    if (ex.InnerException != null)
                        mess += "nn" + ex.InnerException.Message;
                    MessageBox.Show(mess);
                }
            }

            base.OnPreviewKeyDown(e);
        }
    }

然后在使用DataGrid的地方换成已重写的ExDataGrid就可以了.

手工安装PostgreSQL 9.0

题记:自8.4版本以来,使用自动安装包安装postgresql到windows时,若使用默认locale,总是会在初始化数据库的时候出错。今天9.0版本发布了,下载安装时发现存在同样的问题,于是爷怒了,去TM的自动安装包,老子以后纯手工安装,再不要什么鸟安装包了。

一、下载解压

1,下载postgresql-9.0.0-1-windows-binaries.zip

2,解压postgresql-9.0.0-1-windows-binaries.zip到D:\

二、添加用户

1,添加windows用户,用于启动PostgreSQL的windows服务
D:\pgsql>net user postgres pgsqlpw /add /expires:never /passwordchg:no

2,为保证安全,此用户不允许本地登录
D:\pgsql>net localgroup users postgres /del

3,赋于windows用户postgres访问PostgreSQL安装目录的权限
D:\pgsql>cacls . /T /E /P postgres:R

三、初始化数据库

1,切换到windows用户postgres的命令行环境
D:\pgsql>runas /noprofile /env /user:postgres "cmd"

2,初始化数据库,若不使用-U admin,则数据库里自动添加当前windows用户(即postgres)为数据库帐号
D:\pgsql>bin\initdb.exe -D "D:\pgsql\data" -E UTF-8 --locale=chs -A md5 -U admin -W

3,启动数据库
D:\pgsql>bin\pg_ctl.exe -D "D:\pgsql\data" -l logfile start

4,停止数据库
D:\pgsql>bin\pg_ctl.exe -D "D:\pgsql\data" stop

四、注册为Windows服务

1,注册为windows服务,当前windows用户(即postgres)将作为PostgreSQL服务的登录用户
D:\pgsql>bin\pg_ctl register -N PostgreSQL  -D "D:\pgsql\data"

2,启动PostgreSQL服务
D:\pgsql>sc start PostgreSQL

软件通过审核

软件名称: 运营管理系统
版         本: 3.0
开发语言: C# + WPF + SQL SERVER + .net 4.0 + NH2.1.2
运行结构: Browse Application
开发周期: 120天(coding)
总   代 码: 61000行
功        能: 商品管理
                   采购管理
                   销售管理
                   促销活动管理
                   顾客信息管理
                   现金、库存报表
                   通知管理
                   考勤打卡
                   权限管理
                   指纹验证
                   条码打印

WPF DataGrid神异的现象

一个WPF的DataGrid,绑定到一个集合List<MyClass>,模式为OneWay,从DataGrid里选择一行,传递到另个弹出页面,并绑定到TextBox等控件,模式为TwoWay,这个神异的现象是这样子的:

我添加了两条测试数据到List<MyClass>集合里,这时DataGrid显示两条记录,我选择第一条记录,传递到弹出页面显示,我在这里修改其中的任何数据,DataGrid的显示数据都不会随着修改而发生变化。

然而,当我在DataGrid里选择的是第二条记录,并传递到弹出页面显示,我在这里修改的任何数据,都会同步反映到DataGrid里。

我又尝试更换这两条记录的位置,还是编辑位于第一条的记录时不能同步。

有个页面的DataGrid,只有第三条记录能同步显示,其余记录在修改时均不能同步显示。

有两个页面的DataGrid所有记录都能同步显示。

另外,即使不能同步显示,但DataGrid里记录的值其实是修改后的值。