bcoder

2月 242015
 

一、安装svn

# yum install httpd
# yum install httpd-devel
# yum install subversion
# yum install mod_dav_svn
# yum install mod_auth_mysql

验证是否安装成功,输入命令:
# svnserve –version

输出上面的信息后证明安装成功

 二、创建代码库

首先创建一个目录用于存放svn的各个项目

# mkdir /opt/svn

使用svnadmin创建一个代码库

# svnadmin create /opt/svn/repo1

这样第一个项目的代码库就创建完成了,进入到repo1目录中,可以看到conf, db,format,hooks, locks, README.txt等文件,说明代码库建立成功

三、配置代码库

进入到/opt/svn/repo1/conf目录中,可以看到三个文件authz, passwd, svnserve.conf,其中authz是用于配置用户组和用户的文件,passwd是用于设置用户名和密码的文件,svnserve.conf是用于配置服务器的文件

1. 配置passwd

输入下面命令编辑passwd文件

# vi /opt/svn/repo1/conf/passwd

在[users]节点下面以下面格式输入“用户名 = 密码”,如:bcoder = 123456

2. 配置authz

输入下面命令编辑authz文件

# vi /opt/svn/repo1/conf/authz

[groups]节点下面是用于配置用户组的,可在每行输入”组名 = 用户1,用户2,用户3……”,如:” grpdeveloper = dev1, dev2, dev3 ”
[代码库路径]用于配置用户或者组对该代码库的权限,可在每行输入“用户名=rw”,r是读权限,rw是读写权限。如果对用户组则需要在用户组名前面加上 “@”,如:“@grpdeveloper”

这里我们简单的设置如下:

 3. 配置svnserve.conf

输入下面的命令编辑svnserve.conf

# vi /opt/svn/repo1/conf/svnserve.conf

anon-access用于设置匿名用户的权限,read为只读,write为读写,none为不能访问,通常设置为none
auth-access用于设置登录用户的权限,read为只读,write为读写,none为不能访问,通常设置为none
password-db用于指定存储用户名密码的文件,即/opt/svn/repo1/conf/中的passwd文件,默认password-db = passwd即可
authz-db用于指定用户权限的文件,即/opt/svn/repo1/conf/中的authz文件,默认authz-db=authz即可

四、启动svn服务器

输入下面的命令启动svn服务器

# svnserve -d -r -/opt/svn/repo1

五、使用客户端checkout代码库

在客户端使用下面地址checkout,svn://你的IP地址/

六、停止svn服务器

输入下面的命令停止svn服务器

# killall svnserve

七、启动多个代码库

假设我们在/opt/svn/下面建立了多个代码库,如

# svnadmin create /opt/svn/repo1
# svnadmin create /opt/svn/repo2
# svnadmin create /opt/svn/repo3

那么如果我们想使用多个代码库,在启动svn服务器的时候使用如下命令

# svnserve -d -r /opt/svn/

即使用多个代码库的上一级目录启动svn服务器,现在在客户端checkout的时候就要输入代码库的名字了,如:svn://你的IP地址/repo1

2月 102015
 

uses RichEdit;

1. 设置RichEdit的行间距,代码如下

2. 为RichEdit设置行号,代码如下:

3. 根据鼠标位置定位光标的方法。

当RichEdit为可用状态时,是不用代码控制此操作的,TRichEdit本身就可以定位光标。但是当RichEdit开始不可用时,则此方法就可能用到了。本例中RichEdit1开始时是不可用的,当在ApplicationEvents1中接收到RichEdit1被双击时则设置RichEdit1的Enable := true;并且定位光标。

4. 使Richedit中的链接可以点击

 

 

1月 062015
 

  在Delphi开发中,如果我们想让一个窗口始终置顶显示,则我们只需要把窗口FormStyle属性设置为fsStayOnTop就可以了,但是如果这个窗口不是主窗口,而是子窗口,那就有些麻烦了,设置FormStyle为fsStayOnTop后也无效。解决办法就是在子窗口中重载CreateParams函数,并将WndParent设置为0即可,具体代码如下:

 Delphi如何使子窗口显示在任务栏中

 

 Posted by on 2015-01-06
12月 312014
 

方法一:

  定时调用GetForegroundWindow获取最前端的窗口句柄,然后判断该窗口宽度高度是否等于屏幕的宽度高度。代码如下,大家参考:

  这种方法真是弱啊弱,看看第二种方法吧

方法二:

  第二种方法是通过SHAppBarMessage函数给系统发送一个监听消息,用于监听一些关于AppBar的信息,该消息的第二个参数里有一个属性是用于指定回调消息的,程序中定义一个消息码用于监听。当传回的消息的wParam是ABN_FULLSCREENAPP 时判断lParam为真假来判断是进入全屏还是退出全屏。

 

12月 252014
 

  SharedPreferences貌似很简单的一个类,却也存在着陷阱,如下面,我们写了几行简单的保存配置的代码,但却隐含着bug

  那么为什么这段代码不能保存runcount的数据呢,因为prefs.edit()每次返回一个新的Editor对象,所以执行两次prefs.edit()其实调用的是两个Editor对象,如下adnroid源码中的解释

  因此,我们应该先将prefs.edit()赋值给一个Editor对象,然后由该对象进行存值和提交操作,如下:

 

12月 212014
 

  出现此问题的原因是你的项目使用到的android的appcompat支持库,但你目前的开发环境中并没有引用此支持库。下面图文介绍如何下载并引用该类库。

  1、首先需要在android sdk manager中下载Android Support Library,在Eclipse中打开菜单Window->Android SDK Manager,在sdk manager窗口中看你是否已经下载了Android Support Library,在最下面的Extras的节点中有此项,如果没有则选中此项并下载,如下图

Download Android Support Library

  类库将会下载到你的sdk子目录中,路径为<sdk目录>extrasandroidsupport。如果你使用的Android Studio开发环境,则需要下载Android Support Respository。

  2、将类库项目导入到开发环境中。在Eclipse菜单中打开File->New->Project,选择Android Project From Existing Code

Create Project From Existing Code

  3、点击”Browser…”按钮选择appcompat所在的路径,<sdk目录>extrasandroidsupportv7appcompat,勾选Copy projects into workspace,最后点击“Finish”按钮,导入项目成功。

Import android v7 appcompat

  4、将appcompat库引用到你的项目中。在你的项目上右键选择属性菜单,在左侧的导航列表中选择“Android”,在右侧内容最下的Library区域点击“Add”按钮,将导入的类库项目添加进来就完成了。

Add android v7 appcompat reference

  5、重新Clean你的项目。点击Eclipse的菜单Project->Clean…,在弹出的窗口中选择你要清除的项目,点击ok,清除结束后上述问题应该就可以解决了。

  关于Android支持库的其他特性可以点击这里查询。

 

12月 012014
 

  在有些APP中我们需要实现一个悬浮按钮,比如图片浏览应用左右翻页功能,比如左侧悬浮功能按钮。我们要实现此功能时,最开始想到的就是用FrameLayout来实现,但是如果把按钮简单的放到FrameLayout中,按钮只能在布局的左上角,并不能达到我们的要求。

  那么如何才能让按钮放到布局的左侧中间位置呢,开始时想把按钮高度设置成match_parent,然后图片垂直居中,但是这样整个最左侧的部分都是按钮了,显然会影响其他功能的使用,后来想哪个组件才能自由的让子控件放到想放的位置呢,这个得是RelativeLayout了吧。于是在FrameLayout中放了一个RelavtiveLayout中,然后把按钮放到里面,Layout Parameters中的Align Parent Left设置成true,Center Vertical设置成true,再看一下,一个居中的悬浮按钮就弄好了。

  同样的方式可以设置其他需要的悬浮按钮了。

 

 Posted by on 2014-12-01
11月 142014
 

  做了一个小的app,其中用到了tab形式的actionBar和多个fragment,后来因为需求需要在某两个fragment中加入context menu,加入后添加onContextItemSelected事件响应菜单按下的效果,一开始运行正常,在两个fragment中打开context menu正常,两个fragment中的菜单响应事件也正常,后来改动了一些代码后突然发现菜单响应的不正确了,只有一个fragment中的菜单有响应,另外一个没响应。经过一番修改后,发现是onContextItemSelected的返回值影响到了菜单点击事件的执行。

  我们先来看一下onContextItemSelected的官方描述:

  我们主要看这个返回值部分,返回为了一布尔型变量,当返回false值时由系统去决定此菜单事件的响应流程,返回true则表示菜单响应到此为止,停止后面的流程。

  本人没做深入研究,猜想大概流程是这样的,因为在fragment中调用context menu中通过如下方式

  是通过父activity来填充这个弹出菜单,所以首先是父activity先接收到onContextItemSelected事件,如果父activity中不做处理,则activity会把这个事件分发到各个fragment中去,本人在此次犯的错误就是在子fragment中的onContextItemSelected事件中返回了true值,所以只在一个fragment中响应了事件,另外一个没有响应。

  既然在所有的fragment中都会响应onContextItemSelected这个事件,那么我们在每个fragment中处理该事件的时候就需要做一些判断,以避免多个fragment同时执行这个事件,这个是非常重要的,因为不做判断很可能出现一些莫名奇妙的而且不好测试的问题。如下例子:

 

11月 012014
 

  ContextMenu相当于windows中的右键弹出菜单,在android中一般要长按某个view才会激活这个弹出菜单,但是有些情况下我们想单击就可以打开这个菜单,以提高用户的使用体验。那么如何才能单击就能打开这个菜单呢,其实很简单,我们在view的onClick事件中调用openContextMenu()即可打开这个弹出菜单了。下面是一个代码片断:

  imgcapture是一个ImageView,此代码执行后,单击imgcapture即可触发onCreateContextMenu事件,然后弹出菜单。另外,必须要调用registerForContextMenu注册这个菜单,否则单击和长按都无法弹出这个菜单。

  如果要弹出比较复杂的菜单的话就用使用Dialog来实现了。

10月 292014
 

  对于获取数据库中的记录数量的方法,其实应该是很简单的问题,之所以发文把此方法写出来,是因为有一些需要地方需要注意,避免其他人再在此问题上浪费时间。

方法一:

  这是一个很普通的方法,通过sql语句获取数量并赋给一个sql别名字段,然后通过这个别名来获取记录的数量,但是需要注意的是必须要有cursor.moveToFirst(),这个函数,因为rawQuery执行完成后返回的Cursor不是定位到第一条记录的,而是定位到第一条记录之前,所以必须要moveToFirst让记录定位一下才能读取数据,同样地获取其他的数据的时候也要在其之前调用此函数。

  如果是读取多条记录的时候我们一般会用

方法二:

  此方法需要注意的是,sql语句select的时候最好不要select *这样会把所有字段的数据都读出来,浪费内存,效率低。