这是程序自动创建的分类。
Windows RDP远程桌面全屏后显示菜单栏方法/退出全屏方法
[| 2021/11/23 22:33]
Windows远程桌面有个很实用的功能,就是全屏时不显示菜单栏,这样鼠标在顶部操作时(常用比如切换网页tab),不会频繁唤出烦人的菜单栏。
但是这样有个问题,就是全屏如果想要退出来,Ctrl+Tab是不行的,会被识别为远程切窗口。
需要按Ctrl+Alt+Break退出全屏。或者Ctrl+Alt+Del打开主机的锁屏页,然后打开任务管理器的方式间接切出来。但是后者明显要麻烦很多。
现在越来越多的键盘并没有设置Break键了。我尝试了一下网上推荐的Ctrl+Alt+Fn+B和Ctrl+Alt+Fn+P,均没有任何作用。杂牌键鼠和tp键盘均无效。
偶然发现按Ctrl+Alt+Home键是可以唤出菜单栏的,这时候点击菜单栏上的最小化/退出全屏按钮就ok了,很方便。
但是这样有个问题,就是全屏如果想要退出来,Ctrl+Tab是不行的,会被识别为远程切窗口。
需要按Ctrl+Alt+Break退出全屏。或者Ctrl+Alt+Del打开主机的锁屏页,然后打开任务管理器的方式间接切出来。但是后者明显要麻烦很多。
现在越来越多的键盘并没有设置Break键了。我尝试了一下网上推荐的Ctrl+Alt+Fn+B和Ctrl+Alt+Fn+P,均没有任何作用。杂牌键鼠和tp键盘均无效。
偶然发现按Ctrl+Alt+Home键是可以唤出菜单栏的,这时候点击菜单栏上的最小化/退出全屏按钮就ok了,很方便。
gitlab使用samba/cifs作为存储
[| 2021/09/17 02:14]
gitlab默认是无法直接使用cifs挂载作为数据存储目录的,不过经过一些小小的移植,可以实现正常运行。
1,关注.ssh/authorzed_keys,由于cifs挂载默认使用同样的权限,而.ssh/authorized_keys分别要求目录是700,文件是600权限,所以默认会导致推送代码时公钥认证失败,一般对.ssh目录额外进行一个挂载即可,挂载参数添加file_mode=0600,dir_mode=0700。另外该目录所有人需要是gitlab-shell指定的用户,默认为git,需要查询git在/etc/passwd内的uid,/etc/group中的gid,指定uid=xxx,gid=yyy。(同样适用于docker内)。
2,关注repositories,默认迁移后会发现一个诡异的问题,就是提交代码可以成功,代码库也可以看到新代码,但是push events没有更新。其实是因为gitlab的hooks默认是软链,迁移至samba后,被屏蔽掉了,这里推荐gitlab自带的check工具(scripts目录下),可以检查每个仓库的hooks是否正常安装了。如果提示hooks有问题,那么直接ln -s是不行的,需要在挂载参数里添加mfsymlinks,启用软链支持,然后需要在samba server上将原有软链删除掉(如果不删除,则client端既看不到软链,但创建时又提示存在),再使用ln -s重新修复hook即可,此时可以看到,samba server是使用一个特殊文件来存储软链信息的。理论上对于所有的软链,迁移至samba后都要进行这个修复。
修复后,就可以使用了。
1,关注.ssh/authorzed_keys,由于cifs挂载默认使用同样的权限,而.ssh/authorized_keys分别要求目录是700,文件是600权限,所以默认会导致推送代码时公钥认证失败,一般对.ssh目录额外进行一个挂载即可,挂载参数添加file_mode=0600,dir_mode=0700。另外该目录所有人需要是gitlab-shell指定的用户,默认为git,需要查询git在/etc/passwd内的uid,/etc/group中的gid,指定uid=xxx,gid=yyy。(同样适用于docker内)。
2,关注repositories,默认迁移后会发现一个诡异的问题,就是提交代码可以成功,代码库也可以看到新代码,但是push events没有更新。其实是因为gitlab的hooks默认是软链,迁移至samba后,被屏蔽掉了,这里推荐gitlab自带的check工具(scripts目录下),可以检查每个仓库的hooks是否正常安装了。如果提示hooks有问题,那么直接ln -s是不行的,需要在挂载参数里添加mfsymlinks,启用软链支持,然后需要在samba server上将原有软链删除掉(如果不删除,则client端既看不到软链,但创建时又提示存在),再使用ln -s重新修复hook即可,此时可以看到,samba server是使用一个特殊文件来存储软链信息的。理论上对于所有的软链,迁移至samba后都要进行这个修复。
修复后,就可以使用了。
Gpu Passthrough实践-Windows7/10
[| 2021/09/09 21:56]
Passthrough技术在虚拟化场景运用的比较成熟了,最早落地的像网卡SR-IOV技术,可以将网卡直通到虚机内,提升网络吞吐性能。像Gpu Passthrough技术,最近几年随着深度学习的快速发展,也得到了大规模的运用,不过线上用的一般都是计算卡直接跑计算任务,对于家用场景,则是另外一种玩法。现在多合一越来越流行起来,NAS,软路由,下载机,steam多合一可以更好的节省空间,避免了塞爆弱电箱。
本着学习的态度,调研了一下kvm下Gpu Passthrough的落地,发现有如下几个要点
1,SeaBIOS兼容性更好,OVMF使用比较复杂,Windows10用SeaBIOS也可以直通的。
2,i440fx在Windows10下运行通过,Q35在Windows7下运行通过,互换没有测试,大概率是ok的。
3,如果启用了hyper-v支持,里面的vendor_id属性一定要去掉,否则会黑屏。网上有教程说vendor_id是用来绕过n卡43错误的,但随着今年n卡放开虚拟化场景下使用,直接安装21年4月后的n卡驱动就没有43问题了,不需要vendor_id(用21年8月的30版本驱动跑通)
4,存量系统也可以直通的,第一显卡设vnc,第二显卡设要直通的显卡,进系统后打好驱动,这时候物理显卡应该会报12错误,没问题,第一显卡设置成透传显卡,然后启动,rdp远程登陆,进去后查看显卡状态是否正常,有可能会报43等其他的错误,卸掉驱动后重新安装/禁用重新启用,一般会解决。之所以要先vnc那一步,主要是排查一下是否有其他影响启动的因素(如强制关机导致的默认进修复模式/开机蓝屏等,此时rdp无法登陆,vnc就很重要),实测物理机上的windows7迁移到kvm内直通成功。
综上,win7,存量系统,老硬件(Ivy Bridge)均可以直通,放心实践。显卡直通技术可以解决一机多人使用(同时使用需多套键鼠+多显卡)问题。
本着学习的态度,调研了一下kvm下Gpu Passthrough的落地,发现有如下几个要点
1,SeaBIOS兼容性更好,OVMF使用比较复杂,Windows10用SeaBIOS也可以直通的。
2,i440fx在Windows10下运行通过,Q35在Windows7下运行通过,互换没有测试,大概率是ok的。
3,如果启用了hyper-v支持,里面的vendor_id属性一定要去掉,否则会黑屏。网上有教程说vendor_id是用来绕过n卡43错误的,但随着今年n卡放开虚拟化场景下使用,直接安装21年4月后的n卡驱动就没有43问题了,不需要vendor_id(用21年8月的30版本驱动跑通)
4,存量系统也可以直通的,第一显卡设vnc,第二显卡设要直通的显卡,进系统后打好驱动,这时候物理显卡应该会报12错误,没问题,第一显卡设置成透传显卡,然后启动,rdp远程登陆,进去后查看显卡状态是否正常,有可能会报43等其他的错误,卸掉驱动后重新安装/禁用重新启用,一般会解决。之所以要先vnc那一步,主要是排查一下是否有其他影响启动的因素(如强制关机导致的默认进修复模式/开机蓝屏等,此时rdp无法登陆,vnc就很重要),实测物理机上的windows7迁移到kvm内直通成功。
综上,win7,存量系统,老硬件(Ivy Bridge)均可以直通,放心实践。显卡直通技术可以解决一机多人使用(同时使用需多套键鼠+多显卡)问题。
一个C++的坑-unorderedmap之顺序问题
[| 2021/07/21 20:34]
最近遇到一个bug,定位了非常久,感觉有必要分享出来。。。避免后人掉坑。
前段时间发现了一个raft主从间内存不一致的场景,导致切主后数据异常。。当时费了很大的力气排除掉其他模块逻辑问题。后来问题缩小到raft state machine里。由于raft高度依赖state machine幂等性(重启、切主都会导致状态机重做,如果逻辑不是严格幂等,就会出现状态不一致问题),一般要求日志中必须记录绝对操作,尽量不记相对操作。但有一个round-robin分配资源的场景,还是依赖了一下资源节点的排序问题。
最早是使用std::map来存,使用迭代器遍历。由于map本身是有序的,所以三副本之间是一致的。
后来有不熟悉的同学为了优化map的lg(n)性能,改用了基于哈希的unorderedmap,那么问题就来了。逻辑上map和unorderedmap都支持迭代器遍历。所以只修改数据类型,不修改逻辑是可以兼容的。简单执行也没有问题。
已知unorderedmap肯定不能保证遍历结果的有序,但是目前场景也并不要求结果有序,只要每次遍历结果顺序不变就行,那么unorderedmap能否保证遍历顺序幂等性?目前看答案是“不能”。
简单来想,hash表就是对元素做哈希,然后选定桶,对于桶内的元素就串到list上。那么只要按同样的顺序插入,似乎也是可以保序的。因为unorderedmap内部存在自动rehash过程。。一旦rehash,节点的遍历顺序就会变化。。。
所以一定要重视“unordered”关键字。。。任何情况下unorderedmap都不保证任何顺序。。。。
前段时间发现了一个raft主从间内存不一致的场景,导致切主后数据异常。。当时费了很大的力气排除掉其他模块逻辑问题。后来问题缩小到raft state machine里。由于raft高度依赖state machine幂等性(重启、切主都会导致状态机重做,如果逻辑不是严格幂等,就会出现状态不一致问题),一般要求日志中必须记录绝对操作,尽量不记相对操作。但有一个round-robin分配资源的场景,还是依赖了一下资源节点的排序问题。
最早是使用std::map来存,使用迭代器遍历。由于map本身是有序的,所以三副本之间是一致的。
后来有不熟悉的同学为了优化map的lg(n)性能,改用了基于哈希的unorderedmap,那么问题就来了。逻辑上map和unorderedmap都支持迭代器遍历。所以只修改数据类型,不修改逻辑是可以兼容的。简单执行也没有问题。
已知unorderedmap肯定不能保证遍历结果的有序,但是目前场景也并不要求结果有序,只要每次遍历结果顺序不变就行,那么unorderedmap能否保证遍历顺序幂等性?目前看答案是“不能”。
简单来想,hash表就是对元素做哈希,然后选定桶,对于桶内的元素就串到list上。那么只要按同样的顺序插入,似乎也是可以保序的。因为unorderedmap内部存在自动rehash过程。。一旦rehash,节点的遍历顺序就会变化。。。
所以一定要重视“unordered”关键字。。。任何情况下unorderedmap都不保证任何顺序。。。。
iptables规则延迟生效/不生效问题-conntrack
[| 2021/07/21 20:04]
生产环境线上一般是不允许开启conntrack的,因为默认的连接跟踪表也就万级别,不小心打满后,容易导致很难排查的网络问题。(iptables -t nat只查看也会不知不觉启用conntrack)所以很多团队是规定禁止线上运行iptables的。 但是某些设备上,conntrack是必备的一项功能,比如网关,用来做防火墙、包转发等。 今天就遇到了一个很特殊的场景。。表现特征是iptables配的MASQUERADE看起来并不生效。有时不知怎么回事生效以后,删掉规则居然仍然能转发。。明明删除了规则,居然还能ping通,新增了规则,居然还转发到老的地方。。
后来研究了一下,发现原来对于iptables的nat表来讲,只有连接新建时,才会查表进行一次匹配。当连接被conntrack后,就不再走nat表匹配了。
对于icmp来讲,默认conntrack会保留30s,所以如果添加规则前30s如果ping了一下。那么添加完并不会生效已有的。。。。反之亦然。
可以使用conntrack -E作为验证手段。该命令会打印conntrack模块对连接的跟踪情况。
如果想手动移除映射关系,可以使用conntrack -D
后来研究了一下,发现原来对于iptables的nat表来讲,只有连接新建时,才会查表进行一次匹配。当连接被conntrack后,就不再走nat表匹配了。
对于icmp来讲,默认conntrack会保留30s,所以如果添加规则前30s如果ping了一下。那么添加完并不会生效已有的。。。。反之亦然。
可以使用conntrack -E作为验证手段。该命令会打印conntrack模块对连接的跟踪情况。
如果想手动移除映射关系,可以使用conntrack -D
Thinkpad X200拆机及清灰
[| 2012/05/05 15:59]
又到夏天了,电脑底面的温度直线上升,准备清一下灰尘,之前清过一次,用清洁气吹了下,但没有合适的工具,拧不开风扇,只能从散热器外侧向内侧吹,效果不好,吹过一次后还变响了,这次有了全套螺丝刀,准备彻底清洁一下。
底面的螺丝很顺利,很快都拧开了,取下键盘和掌托,然后把屏幕的螺丝拧开,把屏幕下的u型塑料拿下来,开始准备拆主板,主板弄不下来,被无线网卡压住了,于是就开始拆无线网卡,结果悲剧发生了,拧下第一个螺丝后,第二个螺丝拧了几下没拧下来,因为选的十字螺丝刀头的尺寸大了点,又拧了几下,结果拧花了,鸭梨很大,搞了半天搞不下来,只能先将旁边的声卡/sd模块拆下来,腾出地方,捣鼓了半天搞不定,于是决定先搞个小刀把螺丝划出一个沟再拧,找不到小刀,去小区门口5角钱买了个,回来发现螺丝拧起来跟豆腐一样,用小刀划起来还挺硬,把小刀刀头都划平了,勉强在右边划了一个小沟,左边划了几个痕迹,螺丝刀还是吃不上力气,到了吃饭的日子,于是先吃了饭,吃完饭想起来指甲刀,指甲刀一般比较厉害,用指甲刀剪了几下左边,果然剪出一个凹槽,还是不好用力,但指甲刀也无能为力了,蛋疼,期间还试过用核桃夹夹住螺丝刀拧、用螺丝刀顶着侧边的凹槽用核桃夹敲等方法,都纹丝不动。搞了很久耐心快到极限了,之前屏幕还和主板上的无线网卡有信号线连接,现在把信号线拔掉,屏幕取下,然后换了一个稍小一点的一字螺丝刀大力拧了几下,期待奇迹的发生,结果发现螺丝真的动了。赶紧又拧了几下,终于拧下来了。
主板取下后直接就开始拆散热器了,发现cpu上的三个大螺丝是用弹簧压的,估计防止力度过大把cpu压坏,之前以为铜散热器下有空间,里面是很多灰尘,结果拆下来后发现铜散热器直接是整个和cpu/gpu接触的,没有缝隙,cpu上是导热硅脂,gpu上是导热海绵(不知道是不是这么叫,不过样子挺像),由于手头没有新的,所以不能重涂了,怕灰尘进去,急忙又把散热器拧上了。
然后拧风扇和散热器之间的三个螺丝,上次就是在拧三个螺丝中的一个的时候拧不下来放弃的,这次有了合适的螺丝刀,很快拧下来了,把风扇和散热器分离后,散热器内侧的景象展现在眼前,怪不得之前吹的没效果,原来散热器和风扇之间的那个界面上覆盖了一层黑乎乎毛毛的东西,把散热器的缝隙塞住了一半,急忙把脏东西清理出来,用清洁气吹了一下,干净了。
然后开始拧螺丝,比较顺利,无线网卡右侧那个螺丝用旁边预留槽的螺丝替换了,发现那个位置的四个螺丝都跟豆腐一样,稍微一拧就花了,别的地方都还好,看来thinkpad也开始偷工减料了,我的还是08年的tp,现在出的估计更没法用了。
拧好后用鲁大师看了看,貌似效果不错,不过压力压一会后还是比较烫,但平时使用时底座温度降下来了,爽。
底面的螺丝很顺利,很快都拧开了,取下键盘和掌托,然后把屏幕的螺丝拧开,把屏幕下的u型塑料拿下来,开始准备拆主板,主板弄不下来,被无线网卡压住了,于是就开始拆无线网卡,结果悲剧发生了,拧下第一个螺丝后,第二个螺丝拧了几下没拧下来,因为选的十字螺丝刀头的尺寸大了点,又拧了几下,结果拧花了,鸭梨很大,搞了半天搞不下来,只能先将旁边的声卡/sd模块拆下来,腾出地方,捣鼓了半天搞不定,于是决定先搞个小刀把螺丝划出一个沟再拧,找不到小刀,去小区门口5角钱买了个,回来发现螺丝拧起来跟豆腐一样,用小刀划起来还挺硬,把小刀刀头都划平了,勉强在右边划了一个小沟,左边划了几个痕迹,螺丝刀还是吃不上力气,到了吃饭的日子,于是先吃了饭,吃完饭想起来指甲刀,指甲刀一般比较厉害,用指甲刀剪了几下左边,果然剪出一个凹槽,还是不好用力,但指甲刀也无能为力了,蛋疼,期间还试过用核桃夹夹住螺丝刀拧、用螺丝刀顶着侧边的凹槽用核桃夹敲等方法,都纹丝不动。搞了很久耐心快到极限了,之前屏幕还和主板上的无线网卡有信号线连接,现在把信号线拔掉,屏幕取下,然后换了一个稍小一点的一字螺丝刀大力拧了几下,期待奇迹的发生,结果发现螺丝真的动了。赶紧又拧了几下,终于拧下来了。
主板取下后直接就开始拆散热器了,发现cpu上的三个大螺丝是用弹簧压的,估计防止力度过大把cpu压坏,之前以为铜散热器下有空间,里面是很多灰尘,结果拆下来后发现铜散热器直接是整个和cpu/gpu接触的,没有缝隙,cpu上是导热硅脂,gpu上是导热海绵(不知道是不是这么叫,不过样子挺像),由于手头没有新的,所以不能重涂了,怕灰尘进去,急忙又把散热器拧上了。
然后拧风扇和散热器之间的三个螺丝,上次就是在拧三个螺丝中的一个的时候拧不下来放弃的,这次有了合适的螺丝刀,很快拧下来了,把风扇和散热器分离后,散热器内侧的景象展现在眼前,怪不得之前吹的没效果,原来散热器和风扇之间的那个界面上覆盖了一层黑乎乎毛毛的东西,把散热器的缝隙塞住了一半,急忙把脏东西清理出来,用清洁气吹了一下,干净了。
然后开始拧螺丝,比较顺利,无线网卡右侧那个螺丝用旁边预留槽的螺丝替换了,发现那个位置的四个螺丝都跟豆腐一样,稍微一拧就花了,别的地方都还好,看来thinkpad也开始偷工减料了,我的还是08年的tp,现在出的估计更没法用了。
拧好后用鲁大师看了看,貌似效果不错,不过压力压一会后还是比较烫,但平时使用时底座温度降下来了,爽。
为blog添加ping插件-自动通知搜索引擎
[| 2012/04/13 22:13]
现在主流搜索引擎都支持ping功能了,每当网站更新时可以主动向搜索引擎发一个xml格式信息,称之为”ping“,通知搜索引擎来抓取,对于收录是非常有好处的。
之前一直懒得搞,今天弄了一下。
参照百度站长工具里提供的格式,搞了一个,试试是否好用呢。
添加了baidu和google的ping地址:
http://ping.baidu.com/ping/RPC2
http://blogsearch.google.com/ping/RPC2
之前一直懒得搞,今天弄了一下。
参照百度站长工具里提供的格式,搞了一个,试试是否好用呢。
添加了baidu和google的ping地址:
http://ping.baidu.com/ping/RPC2
http://blogsearch.google.com/ping/RPC2
nginx做反向代理proxy_pass,proxy_redirect的使用
[| 2012/03/11 01:39]
今天用nginx作为trac的反代,发现一个问题,就是登入登出跳转的时候是白页,看了下网页相应内容,发现相应的location是空的。查了一下发现是只单纯用了proxy_pass,没有使用proxy_redirect.
假设前端url是example.com。后端server域名是in.com,那么后端server在返回refresh或location的时候,host为in.com,显然这个信息直接返回给客户端是不行的,需要nginx做转换,这时可以设置:
proxy_redirect http://in.com /
nginx会将host及port部分替换成自身的server_name及listen port。不过这种配置对server_name有多个值的情况下支持不好。
我们可以用nginx内部变量来解决这一问题:
proxy_redirect http://in.com http://$host:$server_port
搞定
如果不设定的话,proxy_redirect默认是default属性,官网例子是这样介绍default的:
我试了下,location /{}规则时似乎不太正常,会导致location为空。这个有待详细考证
假设前端url是example.com。后端server域名是in.com,那么后端server在返回refresh或location的时候,host为in.com,显然这个信息直接返回给客户端是不行的,需要nginx做转换,这时可以设置:
proxy_redirect http://in.com /
nginx会将host及port部分替换成自身的server_name及listen port。不过这种配置对server_name有多个值的情况下支持不好。
我们可以用nginx内部变量来解决这一问题:
proxy_redirect http://in.com http://$host:$server_port
搞定
如果不设定的话,proxy_redirect默认是default属性,官网例子是这样介绍default的:
引用
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect default;
}
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
}
proxy_pass http://upstream:port/two/;
proxy_redirect default;
}
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
}
我试了下,location /{}规则时似乎不太正常,会导致location为空。这个有待详细考证
项目管理软件--trac安装手记
[| 2012/03/08 01:17]
之前安装了redmine,确实功能多、使用简单,但ror架构实在是吃内存,小vps根本hold不住,于是还是选用python写的trac。丰富的插件使trac只要配置得当,功能还是很强大的。
首先安装setuptools。这个可以用apt或yum安装,也是一个类似于apt的包管理器,是针对python的。安装后可使用easy_install命令
然后配置PYTHONPATH,使用easy_install默认是安装到系统路径下的。需要root权限。不推荐使用这种方式,这样会把文件放到用户不可控的位置,为以后的升级备份带来困难。所以就需要--install-dir参数(使用--prefix参数无效,不知为何),但单纯使用该参数会报指定目录不在PYTHONPATH里。这是easy_install会推荐去看一个网页,我看了下,讲的几个方法都很繁琐,也没什么理由。其实只需要export PYTHONPATH=${PYTHONPATH}:your_dir即可。在.bash_profile里设置一下,避免每次都要手动。
这里建议在.bash_profile里设置一下alias easy_install='easy_install --install-dir=your_dir',这样就不用每次安装时都手动输入一大坨地址了。
设置完后source .bash_profile生效一下。
然后开始安装,先执行:easy_install Babel==0.9.5 这个一定要装,否则安装后的trac没有中文。
然后easy_install Trac
ok,trac的安装就完成了。
现在需要建立项目,trac需要为每个项目建立一个实例。这时在your_dir里找到trac-admin,这个是用来管理项目实例的工具。
运行:trac-admin your_proj_dir initenv
会提示项目名和使用的数据源。
在数据源那里我使用官方推荐的:mysql://name:password@localhost:3306/test报错:trac TypeError: unsupported operand type(s) for /: 'int' and 'NoneType' 看了下代码,是数据库没有配成utf8字符集导致的。配了一下,ok了
建立数据库时要使用:CREATE DATABASE IF NOT EXISTS test default charset utf8 COLLATE utf8_general_ci;
建好项目后就可以登陆进行进一步设置了。
首先配置用户具有admin权限:
trac-admin your_proj_dir permission add user TRAC_ADMIN
然后指定使用web auth进行用户验证:
./tracd --port 8000 --auth="*,/your_dir/user.htdigest,trac" /your_dir
user.htdigest文件是用户名密码文件,需要自己生成,比较麻烦,反正也是临时使用,这里贴个成品:
user:trac:fb05f80adf782a74f48a5acdc71dba65
这个的文件名和密码分别是“user”,“password”
启动后进入控制台
进入管理,插件,开启TracAccountManager 0.3.2
修改trac.ini,
[components]下添加trac.web.auth.loginmodule = disabled
然后在account配置里SessionStore选一个1,(为啥不知道),但不开这个就不能注册
然后手动添加管理员账户
然后可以用./tracd --port 8000 /your_dir 启动了。
用permission add给刚才添加的用户加上管理员权限。然后ok了。可以使用web登陆了
然后添加git支持:
easy_install http://github.com/hvr/trac-git-plugin/tarball/master
暂时没找到支持远程git的方法
首先安装setuptools。这个可以用apt或yum安装,也是一个类似于apt的包管理器,是针对python的。安装后可使用easy_install命令
然后配置PYTHONPATH,使用easy_install默认是安装到系统路径下的。需要root权限。不推荐使用这种方式,这样会把文件放到用户不可控的位置,为以后的升级备份带来困难。所以就需要--install-dir参数(使用--prefix参数无效,不知为何),但单纯使用该参数会报指定目录不在PYTHONPATH里。这是easy_install会推荐去看一个网页,我看了下,讲的几个方法都很繁琐,也没什么理由。其实只需要export PYTHONPATH=${PYTHONPATH}:your_dir即可。在.bash_profile里设置一下,避免每次都要手动。
这里建议在.bash_profile里设置一下alias easy_install='easy_install --install-dir=your_dir',这样就不用每次安装时都手动输入一大坨地址了。
设置完后source .bash_profile生效一下。
然后开始安装,先执行:easy_install Babel==0.9.5 这个一定要装,否则安装后的trac没有中文。
然后easy_install Trac
ok,trac的安装就完成了。
现在需要建立项目,trac需要为每个项目建立一个实例。这时在your_dir里找到trac-admin,这个是用来管理项目实例的工具。
运行:trac-admin your_proj_dir initenv
会提示项目名和使用的数据源。
在数据源那里我使用官方推荐的:mysql://name:password@localhost:3306/test报错:trac TypeError: unsupported operand type(s) for /: 'int' and 'NoneType' 看了下代码,是数据库没有配成utf8字符集导致的。配了一下,ok了
建立数据库时要使用:CREATE DATABASE IF NOT EXISTS test default charset utf8 COLLATE utf8_general_ci;
建好项目后就可以登陆进行进一步设置了。
首先配置用户具有admin权限:
trac-admin your_proj_dir permission add user TRAC_ADMIN
然后指定使用web auth进行用户验证:
./tracd --port 8000 --auth="*,/your_dir/user.htdigest,trac" /your_dir
user.htdigest文件是用户名密码文件,需要自己生成,比较麻烦,反正也是临时使用,这里贴个成品:
user:trac:fb05f80adf782a74f48a5acdc71dba65
这个的文件名和密码分别是“user”,“password”
启动后进入控制台
进入管理,插件,开启TracAccountManager 0.3.2
修改trac.ini,
[components]下添加trac.web.auth.loginmodule = disabled
然后在account配置里SessionStore选一个1,(为啥不知道),但不开这个就不能注册
然后手动添加管理员账户
然后可以用./tracd --port 8000 /your_dir 启动了。
用permission add给刚才添加的用户加上管理员权限。然后ok了。可以使用web登陆了
然后添加git支持:
easy_install http://github.com/hvr/trac-git-plugin/tarball/master
暂时没找到支持远程git的方法
一个unsigned int(size_t)的坑
[| 2012/03/07 22:24]
前几天把一个函数的返回值由int改为size_t了。当时心想就是改个类型的问题,逻辑没啥要动的。反正都是算数。
编译器什么也没报。似乎没什么问题。
后来凑巧又改了一下另外一个程序的相同函数,结果编译的时候报了error,说试图转换-1到unsigned。一检查,果然程序中的异常分支返回了-1.急忙改了过来。
所以在返回值是size_t类型的函数中,异常处理要注意。(主要是c程序,因为没有异常)
编译器什么也没报。似乎没什么问题。
后来凑巧又改了一下另外一个程序的相同函数,结果编译的时候报了error,说试图转换-1到unsigned。一检查,果然程序中的异常分支返回了-1.急忙改了过来。
所以在返回值是size_t类型的函数中,异常处理要注意。(主要是c程序,因为没有异常)