摘要:
自己写交互式命令行程序,通常都是从标准输入输出读写。运行的时候,只能敲完整一个命令,然后回车。想要按方向键移动光标,按 del 往后删除都只会出现个 ^[[A 这样的东西。要实现那些功能,得处理终端命令,这个活并不轻松。虽然有 readline 这样的库,但还是会带来很多麻烦。 好在 unix 的哲学就是一个程序干一件事情,并把它做到最好。于是就有一个 rlwrap 的程序。用这个程序启动你的工具,你的程序就立马有了那些功能。还可以按上下键翻阅历史命令,ctrl+r 来搜索历史输入等。 阅读全文
posted @ 2012-07-02 09:31
ChaunceyHao
阅读(330)
评论(0)
推荐(0)
摘要:
go 语言的一个很大的优势就是可以方便地编写并发程序。go 语言内置了 goroutine 机制。这是一种类似 coroutaine(协程) 的东西。但是又不完全相同。 比如这个例子: package main import ( "fmt"; "strconv" ) func main() { ch := make(chan int) task("A", ch) task("B", ch) fmt.Printf("begin\n") <-ch <-ch } func task(nam 阅读全文
posted @ 2012-07-02 09:31
ChaunceyHao
阅读(562)
评论(0)
推荐(0)
摘要:
编译 go 程序可以使用自带的一些 Makefile 脚本来简化编写 Makefile 。官方的文档过于简略,没提到需要指定依赖包位置的方法。翻过那几个脚本代码后,发现原来有 LDIMPORTS 和 GCIMPORTS 可以指定。 比如: include $(GOROOT)/src/Make.inc LDIMPORTS=-L ./pkg/_obj GCIMPORTS=-I ./pkg/_obj TARG=tool GOFILES=\ tool.go\ include $(GOROOT)/src/Make.cmd GCIMPORTS 指定编译阶段的参数,对 Make.cmd,Make.... 阅读全文
posted @ 2012-07-02 09:26
ChaunceyHao
阅读(445)
评论(0)
推荐(0)
摘要:
php 本身有 zip 模块,可以生产 zip 文件。但是这个 zip 模块只能使用本地文件来打包。如果需要打包输出的文件来自网络,就得先保存临时文件。在文件数量多或者文件大的时候就很杯具。另外,由 php 来输出大的打包文件会占用 php 进程大量时间,影响并发能力。 nginx 有一个第三方模块,mod_zip 。同样可以输出 zip 包。和 X-Accel-Redirect 有点类似,只需要 php 输出相应文件的路径等信息,然后给一个特殊的响应头即可。 nginx zip 模块使用的响应头是 X-Archive-Files: zip 。加上这个响应头,nginx zip 模块就会处.. 阅读全文
posted @ 2012-07-02 09:25
ChaunceyHao
阅读(296)
评论(0)
推荐(0)
摘要:
有时候需要防止一段代码在被同时执行,就需要使用锁来防止代码重入。常常见到这样的代码: if [ -f /var/lock/mylock ]; then touch /var/lock/mylock ... rm -f /var/lock/mylock fi 但实际上,这样是有问题的。如果两个进程在 test ( [ ) 和 touch 之间,另一个进程同时执行,就会出现竞争问题,最后就可能出现同时运行的情况。要避免这种情况出现,就得改一下加锁的方式。可以用 mkdir 代替 touch,这样在锁目录以及存在的时候,会直接出错; if mkdir /var/lock/myloc... 阅读全文
posted @ 2012-07-02 09:17
ChaunceyHao
阅读(312)
评论(0)
推荐(0)
摘要:
mysql binlog 记录了所有可能涉及更新的操作,可以用来作为增量备份的一种选择。为了管理 binlog ,需要读取每个 binlog 文件的准确的开始和结束时间。用 mysqlbinlog 工具可以解析 binlog 文件,所以也可以通过分析输出结果来获取。但是 mysqlbinlog 只能顺序读取记录,如果只是分析开始时间还好,要分析结束时间,就必须等它把整个 binlog 处理完。在 binlog 文件体积大的时候,代价就大了些。好在 mysql 对 binlog 文件的格式是公开的,所以我们可以直接通过解析文件自己实现。 binlog 文件的格式在 http://forge... 阅读全文
posted @ 2012-07-02 09:15
ChaunceyHao
阅读(863)
评论(0)
推荐(0)
摘要:
alias 可以对一个或一组命令起一个别名。和 bash 函数不同的是 alias 没有自己的独立进程。在有些情况下,和函数是不能相互替代的。 比如 alias shift2="shift 2" 之后就可以在脚本或函数中使用,踢掉两个参数。这样的东西用函数是不管用的。但是,alias 如果写在脚本里,运行时候会说找不到命令。因为对 bash 脚本,默认没有展开 alias 。需要先设置一下才行: shopt -s expand_aliases bash 中定义的变量可以用 export 导出,这样在子子孙孙的进程中都可以访问到。实际上,函数也是可以导出的。用 export 阅读全文
posted @ 2012-07-02 09:14
ChaunceyHao
阅读(130)
评论(0)
推荐(0)
摘要:
默认情况下,mysql 是不能给系统表,例如 mysql.user 加上触发器的。会提示 ERROR 1465 (HY000): Triggers can not be created on system tables 但是还是可以有办法绕过这个限制。 在其他 db 里另外建一个结构名字一样的表,例如 create table test.user like mysql.user 然后在那个表上建好触发器。这样会在数据库目录中生成 “表名.TRG” 文件。把这个文件拷贝到 mysql 库的目录中,确认访问权限没问题后,重启一下 mysql ,触发器就可以生效了。 阅读全文
posted @ 2012-07-02 09:10
ChaunceyHao
阅读(691)
评论(0)
推荐(0)
摘要:
今天遇到一个机器出错,日志显示是磁盘满。于是 df 一下,果然: # df Filesystem 1K-blocks Used Available Use% Mounted on ... /dev/sda2 4914492 4666144 0 100% /data Available 是 0,但是,等等,为啥 Used 要小于 1K-blocks 呢?剩下的空间到哪里去了呢? 搜索了一下,原来对 ext2/ext3 文件系统,会保留一定比例空间给 root 用户,普通用户无法使用。所以就会有这样的结果。这个比例默认... 阅读全文
posted @ 2012-07-02 09:09
ChaunceyHao
阅读(133)
评论(0)
推荐(0)
摘要:
mongodb 可以通过 readOnly 参数建立只读和可以读写的用户。但是只读用户也可以访问 db.system.user,所以可以拿到所有用户的密码的 hash 值。按照协议,只需要传递这个 hash ,而不用知道密码就能通过认证。所以,只读用户就可以由此获取可写的权限。 如: > db.system.users.find() { "_id" : ObjectId("4fd068ae34ae311cd063f9b2"), "user" : "sa", "readOnly" : fal 阅读全文
posted @ 2012-07-02 09:08
ChaunceyHao
阅读(246)
评论(0)
推荐(0)
摘要:
mysql 的权限控制功能虽然已经比较强大,但是是基于白名单规则,所以没法做到对除某某库,如 mysql 库以外的所有库分配权限,或者说单独禁用某个库的某些权限。虽然可以一个个库地分配,但是这样毕竟麻烦,尤其是在库的数量会动态变化的情况下。 对于 DDL 语句,也就是 create 、alter 、drop 之类,有一个特殊的办法可以做到。其实也很简单,去掉那个库所在的目录的写权限即可。例如: chmod a-w mysql 之后,在 mysql 库上执行任意 DDL 语句都会出错。 这方法看着挺恶心,不过也没找到更好的解决办法。 阅读全文
posted @ 2012-07-02 08:20
ChaunceyHao
阅读(310)
评论(0)
推荐(0)
摘要:
遇到一部分主机运行 php 的时候报 Bus error 错误,直接退出。 # /path/to/php Bus error 于是用 strace 跟踪了一下,看看到底是怎么回事。 # strace /path/to/php ... ... ... open("/path/to/php/lib/php/extensions/no-debug-non-zts-20090626/mongo.so", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\270\0\0\0\0 阅读全文
posted @ 2012-07-02 08:19
ChaunceyHao
阅读(851)
评论(0)
推荐(0)
摘要:
Mighty-Moose是一款面向.NET的持续构建和测试运行工具,现在它免费发放了。 那么Mightly-Moose到底是干什么的呢?当你每次在Visual Studio中编辑文件后点击保存时,它会自动构建你的解决方案并运行哪些受改动影响的测试。这非常适用于TDD,因为你不再需要手工运行测试就可以在不 离开代码编辑器的情况下获得即时反馈。同样,它还节省了花费在运行那些并没有受到改动影响的测试上的时间。 虽然该工具还有一些其他的配置(例如在首先运行完受影响的测试后运行所有测试;在每次构建后而不是每次保存后运行测试),但是上面提到的行为一般是主要使用用例。该工具还有一些其他有用的特性,你可以查. 阅读全文
posted @ 2012-07-02 08:10
ChaunceyHao
阅读(235)
评论(0)
推荐(0)
摘要:
微软开发经理Eric Knox最近发表了一篇文章,其中提供了对VS2012编辑性能所做出的内部改善的深度观点。 Knox的团队改进了他们的方法,不仅仅使用了PerfWatson,还结合使用了一种叫做即时延迟跟踪器(Immdiate Delay Tracker,IDT)的新工具。 PerfWatson收集了“迷你的堆信息,让微软可以确定在一天中的特定时间点,运行了哪些Visual Studio的代码”。 因为工程师想要基于每次击键来监控VS的性能,他们把IDT设计为“更细粒度的度量系统”,它使用了Event Tracing for Windows(ETW)。 ETW是一种操作系统提供的通用目的. 阅读全文
posted @ 2012-07-02 08:09
ChaunceyHao
阅读(202)
评论(0)
推荐(0)
摘要:
随着.NET 4.5发布日期的日益临近,微软已经开始慢慢揭开下一代开发平台的神秘面纱。关于Metro和Windows 8已经有了很多宣传,而对.NET核心特性所作出的改进会在短期内抢了它的风头,传统上那会专注于web、服务和数据开发。 ASP.NET Web Forms在.NET framework的前几次发布中保持相对稳定,很多开发者市场份额分享给了ASP.NET MVC。在.NET 4.5中,微软做了大量工作,在ASP.NET Web Forms中提供了对模型绑定的支持,从而减少这两种web开发产品之间的生产力差别。这种绑定让开发者可以在代码中跳过服务调用和绑定,直接给控件赋值。 尽管这. 阅读全文
posted @ 2012-07-02 08:09
ChaunceyHao
阅读(207)
评论(0)
推荐(0)
浙公网安备 33010602011771号