Posts Tagged Programming
Merge Two Hg Repositories
最近在折腾手头上的小项目,发现有一个工程已经建了Hg的版本库,但是想把它给丢到现有的版本库中以方便管理。假设现在用的版本库叫A,需要被merge过来的版本库叫B,于是有:
A: hg pull –f <repo B> A: hg merge A: hg ci
关键的地方是在那个-f处,如果没有加这个参数会报两个版本库不同源而不让你这么折腾。(via)
The Capital S in Linux Permission Bitmap
昨天某人丢过来一个问题,为啥Linux下有的文件权限是-rws,有的是-rwS,当时就没想法了,后来某人被逼求助于Google顺便把结果发给了我,顺便记一下吧~
首先,这个S,不管大写还是小写都是setuid/setgid bit, 大小写的不同之处在于,大写的S表示这个文件没有x位,而小写的则是一般常见(这个只是我常见的哈,有空查查,如果大S比较常见俺会上来改的)的即是有x权限的。即在chmod中,如果是4755的话,那么它的权限就是通常的-rwsr-xr-x,如果是4655的话,就是大写的-rwSr-xr-x。就这么些东西。
最后多一句嘴,第一位的那个4其实也是bitmap,4代表setuid bit,2代表setgid bit,1代表sticky bit。下面木有了~~
Using sudo in rsh’s command
公司的产品需要配置无密码rsh,刚写了一个脚本用于重置环境,但是被系统告知sudo需要在tty的环境下用,所以只好去找把这个安全选项禁掉的方法。开始想当然的把pts加到/etc/securetty中,可惜不行,最后求助于G神才发现需要在/etc/sudoers中把下面这行注释掉
Defaults requiretty
最后说一句,最好用visudo编辑,而不要手动改~
Translate errno to error string
Posted by hzmangel in Happy coding on 2010-03-18
没几行的程序,就是输出errno数字所表示的对应含义
#include
#include
#include
int main(int argc, char* argv[])
{
if (argc == 1) {
printf ("Please give a number, Thanks~~~\n");
exit(1);
}
char tmp_str[20];
errno = atoi(argv[1]);
sprintf(tmp_str, "errno %3d", errno);
perror(tmp_str);
}
Simple Process with Mercurial Build-in Server
在putty里面用vim用够了,于是在远端机上弄了个Hg的版本库,平时在本机做开发,然后写完直接push到远端编译。不想折腾太多的东西,所以就用的是Hg自带的web服务器。首先在远端某个目录里面新建一个Hg版本库
hg init
然后就可以在远端开服务了,为了少惹麻烦,用了个3456的端口
hg serve -p3456
然后在本地就可以找个目录直接把那边的东西拷过来了
hg clone <host> <local_dir>
使用hg clone的好处是在目录的.hg/hgrc文件中已经存放有默认提交/连接的地址,以后在使用hg pull或者hg push时不需要额外提供地址了。
[paths] default = <host>:<port>
在本地做过修改后,需要check in到版本库中才能成功的被push到远端。如果不加-m参数则会弹出一个编辑器让你输入log
hg ci <-m "log message">
在push的时候需要注意一个问题。为了安全起见,在默认情况下,Hg对于push是有一些限制的,首先需要SSL,其次需要提交改动的用户有权限。不过由于是自己使用嘛,所以可以在Hg的配置文件中把这两个限制取消,即在hgrc中加入以下几行
[web] push_ssl = false allow_push = *
根据自己的需求确定这几行加的位置(全局的配置还是某项目相关的配置)。添加过后即可在本地push改动到远端了。如果那个url已经添加到hgrc文件中,则不需要指定url参数(嗯,适合我这种懒人)。
hg push <url>
在远端此时只是把改动更新到版本库中,并没有把改动真正放到代码中,所以还要在远端运行一下更新命令
hg up
然后,就能编译了,于是一次简单的流程就完鸟。如果在远端有改动,在check in到版本库后,可以在本地使用pull命令把改动同步过来。
hg pull <url>
Mask Mouse on Linux
最近折腾个东西,需要把鼠标弄掉,一是不显示,二是对点击事件没有响应。在网上找了找,用了个比较ugly的方法:
不显示
一般的发行版都能找到一个叫unclutter的软件包,这玩意的功能就是在你idle多少秒后把鼠标从屏幕上抹掉,具体效果就像mplayer放电影里让鼠标不见的那样。如果把idle设成0(unclutter –idle 0),那么鼠标就会从屏幕上消失了,不过在移动的过程中,还是能偶尔看到那熟悉的白色箭头
屏蔽响应事件
虽然鼠标不显示了,但是点击事件还是没有屏蔽掉,就是说你去点鼠标,还会是和原来的情况一样。本来想找HAL去直接禁用这个设备,但是在乱逛的过程中找到了xmodmap这个东西,然后也顺便看到了怎么用它去折腾鼠标,就用了。
这个命令可以用来把鼠标的键重新映射到新的行为上去,在它自己的man page里面,可以看到使用 xmodmap -e "pointer = 3 2 1" 可以让鼠标左右键对调,其实就是让按左键的响应从1变成3,而右键的从3变成1。执行下面这条命令
xmodmap -e "pointer = 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1"
把前面的几个按键都给映射到高位上去,这样一般的程序就不会去处理这些个大的响应事件,于是乎就算是屏蔽了事件吧。
就这两条命令,具体的没的细究,有空再看吧。
在thickbox中关掉自己
Posted by hzmangel in Happy coding on 2009-12-16
嗯,很拗口的标题吧,我也这么觉得~
最近写的东西用到了jquery,然后也就用到那个很好用的thickbox插件。不过有一个需求是我在thickbox中用Ajax.post()方式提交表单后需要把这个thickbox窗口关掉。它的close按钮调用的是tb_remove()函数,但是我在里面调怎么也不起作用,直到最后找到了这个网页,它告诉我,要这么来折腾:
于是就达成需求了…… parent.tb_remove()
Android中使用自定义Adapter
Posted by hzmangel in Happy coding on 2009-09-14
算是对这段折腾android的一次小结吧,呵呵。
一个很简单的界面,上面留块地方放logo或者banner,然后下面放个东西来显示数据。试验中上面使用的是TextView,下面是ListView。对于ListView,当然需要使用Adapter来显示数据啦,但默认的Adapter满足不了需要,因为我的那个一条需要显示的东西不是那么标准,所以折腾了几天,自己弄出来了一个fooAdapter,顺便还有这篇文章。 Read the rest of this entry »
调整Flex默认Application的长宽
Posted by hzmangel in Happy coding on 2009-06-12
Flex的ms:Application默认有一个大小,我新建的Panel要比这个大小要大,所以默认会出来滚动条,看着比较的不爽。但是如果在Application中把大小通过Height/Width设死的话,在窗口放大或者丢浏览器里面看的时候又不会居中,比较的不爽。最后终于在这找到一篇文章讲这个的,这个参数不是在mxml文件里面设定的,而是需要在编译的时候传入-default-size 800 600 参数。命令行编译的话,是需要把这个参数加在mxml文件后面的,即这样:
mxmlc.exe foobar.mxml -default-size 800 600
初用 Google App Engine
Posted by hzmangel in Happy coding on 2008-04-09
在邮件列表中看到了这个东西,感觉满好玩的,是用python的,也满合胃口的,申请了一下,然后过了一会拿到的许可。有人说是在后台有一个sleep 3000,呵呵,不知道是真的假的。反正我是有了,用着玩玩吧。
下载了SDK,没细看里面的目录结构,只是知道里面有一个脚本可以当作开发时的服务器,还有一个脚本可以用以把文件上传。网站上有一个教程,老例子,上来先是一个helloworld。它的工程中需要有一个app.yaml用以标识工程的ID,刚写的那个yaml文件如下:
application: sonic version: 1 runtime: python api_version: 1 handlers: - url: /.* script: helloworld.py
version是工程的版本,runtime version和api_version这俩目前只有一种选择,不知道以后会不会更改。然后就是写主要的部分了,handlers。首先是以减号开始,后跟url关键字,冒号后是正则的URL列表,下一行的script是标明处理这个URL的脚本,后面自己写的。如果在url字段中用了正则表达式,则将请求传入脚本时会自动将匹配的字符串作为参数。后面的那些静态文件和登录啥的没细看,看到再写。
然后就是里面的helloworld.py文件了,最简单的就是三个print,当时看到我直接喷了,真的。 简单的不能再简单的代码了。
print 'Content-Type: text/plain' print '' print 'Hello, world!'
反正就是这么简单。然后运行它的那个简单的服务器,运行时需要指明工程的目录,即包含有app.yaml文件的目录。运行后就可以通过浏览访问8080端口来测试服务了。还好第二个程序算是有点内容了,虽然也还是HelloWorld,但是它用了webapp的框架,代码量也有点多了。
import wsgiref.handlers
from google.appengine.ext import webapp
class MainPage(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')
def main():
application = webapp.WSGIApplication([('/', MainPage)], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()
在main函数中,应该是通过WSGIApplication确定了对于某些特定的请求,使用哪个类来处理,get()方法用于响应HTTP GET的请求,其它的函数还没细看。返回结果和上一个差不多,嗯。
最后需要把程序部署到google的服务器上,使用它的appcfg.py上传,需要把app.yaml中的那个application改成申请下来的id,然后上传,输入邮箱,密码啥的。然后就可以通过 http://
雁过留声