Month: February 2012

linux加载windows ntfs分区时设置目录的拥有者

映射ntfs分区 /dev/sda5  到 /home/kent/diskD后,如果没做什么设置, /home/kent/diskD的owner就是root 如果你希望/home/kent/diskD的owner是kent, 并且文件夹的权限是777,那就得这样:   1. 查得kent这个用户的uid和gid。可以kent登录,输入 $id   2. 在mount时设置参数uid=1000,gid=1000,umask=0 0 0 (注意,顺序不能搞错) 比如, #vi /etc/fstab /dev/sda5      /home/kent/diskD  ntfs  defaults,iocharset=utf8,uid=1000,gid=1000,umask=0 0 0  

如何做出一个OutOfMemoryError并使它产生dump文件?

注:这篇文章只是一个手册,用来供你做实验时照抄。没有任何原理性的东西,没有干货。 如何做出一个OutOfMemoryError并获取dump文件? 第一步: 设置jvm参数    -XX:+HeapDumpOnOutOfMemoryError   -XX:HeapDumpPath=/home/kent/temp/jvm-oom.prof 第二步:使代码产生jvm异常   1. 经验表明,显式地throw new OutOfMemoryError()不会产生dump文件   2. 简单的做法:通过String的串接 String s = "abc"; while(true) s += s;   3. 因String导致OOM的情况在实际上并不常发生。可以用自定义对象搞出OOM,然后用visual vm打开dump文件,以加深感性认识: public static void main(String[] args) { List<ScapeGoat> goats = new ArrayList<ScapeGoat>(); goats.add(new ScapeGoat()); // 让ScopeGoat对象数呈指数级增长(2的n次方) while (true) { int goatsNum = goats.size(); for (int i = 0; …

如何做出一个OutOfMemoryError并使它产生dump文件? Read More »

用mvndebug在eclipse里跟踪调试maven的执行

如何在eclipse里跟踪调试maven的执行? 见Stackoverflow上一个人的回答: 回答者:Jean Hominal If you want to debug Maven execution in eclipse, here is how I did it, with mostly command-line tools (no Eclipse plugin used) (may be off at some points, I haven’t done that for 6 months):     * Run, from the command line, mvndebug in place of the mvn command. Maven will …

用mvndebug在eclipse里跟踪调试maven的执行 Read More »

适合结对的工作和不适合结对的工作

Pair Programming的适用性不能盲目肯定,也不能一棍子打死 按我的体会,有的事情适合Pair,有些不适合 适合结对的工作:    1. 列出所有XXX,以免遗漏。这种事情一个人做很容易遗漏,两个人会好很多。 不适合结对的工作:    1. 创新、探索性工作,比如设计出一个完备的业务流程。这种事情需要集中精力、独立思考,两个人一起做,效率反而更低。 (待续)

mysql jbdc driver的字符集问题 — 研究笔记

问题: server端的charset设置如何影响程序的正确性? jdbc url里的characterEncoding呢?  研究方法: 执行一条带有中文字面量的查询语句,并断点跟踪mysql jdbc driver的源码,重点关注字符集的设定、字节与字符之间的互转 研究工具:    1.打开driver的sql日志功能: jdbc:mysql://…/…? profileSQL=true,以查看c/s之间的所有sql    2.使用wireshark抓取c/s之间的通讯数据包 软件版本:mysql server: 5.1, jdbc driver: connector/j 5.1.8   测试数据及程序:    1. 数据库的character_set_server = gbk, 但character_set_client = utf8, character_set_results = utf8, character_set_connection = utf8    2. 数据库有一张表,这张表里有一个字段name, name字段采用与服务器同样的编码(即gbk),且表里有一条记录,它的name值为汉字“一“    3. 程序伪码:        DriverManager.getConnection(…);  //建立连接        String name = executeQuery("select * from … where name …

mysql jbdc driver的字符集问题 — 研究笔记 Read More »

MySql: charset 和 collation的设置

charset 和 collation 有多个级别的设置:服务器级、数据库级、表级、列级和连接级 1.服务器级   查看设置:show global variables like ‘character_set_server’; 和 show global variables like ‘collation_server’;   修改设置:在OPTION FILE (/etc/mysql/my.cnf)里设置:    [mysqld]     character_set_server=utf8     collation_server=utf8_general_ci 2. 数据库级    查看设置:select * from information_schema.schemata where schema_name = ‘cookbook’;    设置:      1.若没有显式设置,则自动使用服务器级的配置      2.显式设置:在创建库时指定        create database playUtf8  DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; 3.表级 …

MySql: charset 和 collation的设置 Read More »

反省:不必追求100%的系统精确性

    去年我看了一部很烂的电影:《变形金刚3》。这部电影真的很烂很烂,但其中有一类镜头引发了我的思考:机器人的一条腿被打断后,它仍然用身体的其他部件进行战斗,虽然动作严重变形,但并没有放弃战斗。     我当时就想,断了一条腿,相当于分布式架构中当了一个子系统;这种异常不是业务异常,而是技术异常,应声明为RuntimeException,在它抛出后不但要中止当前腿的动作,而且要中止接下来的其他手足的动作; 否则,可能导致系统的行为进入一个不可知的状态,轻则“动作严重变形”,重则一脚踏空、高空坠落,造成灾难性的后果。     很显然,我那时的想法是不切实际的。作为战斗者,变形金刚的高可用性远远比它的“精确性”来得重要。对应到互联网的开发中,就是“网站看上去很健康”比“每笔交易无误”来得重要。当然,对敏感的系统比如支付系统、动车调度系统,还是后者更重要;但对普通的电子商务,“动作变形”比“拒绝服务”要友好的多。   这里不妨总结一下严格追求精确性的常见的实践:         1.技术异常统统定义成或包装成RuntimeException,并且不捕捉,让用户看到类似于“暂时无法为您提供服务”的提示     2.数据库里严格使用事务,以避免单边数据     3.数据库里使用各种约束,如外键、check constraint,以保证数据的完整性        替代的“宽大处理”方案是:        1. UI层调用业务层、或者一个系统调用另一个系统时,可以考虑捕捉RuntimeException,遇到RuntimeException时使用一个“最合适”的值作为调用的结果,并继续执行当前的流程。 例如,获取商品的折扣失败时,就认定优惠为0,以原价把商品卖给消费者。不过,最好要有配套的动作:        a.给系统配备实时监控功能,当发生这种事时,运维人员能马上收到通知,解决问题        b.发生这种事时,应记录日志,供未来审计和业务修正。     2. 事务最好还是要有的。但如果某些场景下实现事务很难,比如分布式事务,那就让它去吧     3. 不干净的数据输入最好能通过校验来阻拦掉。如果校验不够充分,数据通过了应用要进入数据库,而且中止当前SQL运行会导致后续SQL都无法执行,那就可以考虑让DBMS容忍这种错误,使用一个“最佳”的数据插入进去。MySql就可以做这种事情。

mysql技巧杂烩 (三)

1. Sequence     a.可以把列定义为自增键。这跟Sql Server类似,跟Oracle不同。       create table person(         id int unsigned not null auto_increment,         primary key(id)         …       )       和sql server一样,插入数据时不必指定自增键的值     b.id最大的记录删除后,重新插入的数据的id是多少? 这个答案跟mysql的存储引擎有关。      i.  对于bdb引擎,新的id = 现有id的最大值 + 1; 如果刚删除的最大id=8, 当前的id最大值=7,  则新的id = 7 + 1 =8 ! 也就是说,id =8 被重复使用了!      ii. 对于MyISAM和InnoDB引擎,则可以保证id不会被重用        …

mysql技巧杂烩 (三) Read More »