Profilo di YiStone-此人已死FotoBlogElenchiAltro Strumenti Guida
31 dicembre

告别2007,迎接2008

2007终于就要过去了,这一年俺毕业了,工作了,开始有稳定的收入了(以前留学送过报纸,实习也有点报酬)
2008年的目标:考过系分(两年前就想考了),换个好点的公司(现在的加班不给加班工资,大老板还是个铁公鸡),争取工资再加个3k以上。有时间争取再考个ITIL认证。多攒钱买几件TNF的衣服
27 dicembre

户外防水系列衣物的清洗和保养(转自the north face中文官网)

如何洗涤Gore-tex夹克?
所有The North Face的服装都附有洗涤说明标签。多数夹克的洗涤说明标签缝在衣服的腰部位置。洗涤不会损伤GoreTex?夹克。实际上,经常清洗夹克还有利于保护面料外部的防水(DWR)涂层,水流会在面料表面形成水珠,然后滑落,而不会被衣服吸收。洗涤夹克前,请拉上所有拉链并系好所有Velcro?扣件。请使用性能温和的粉末洗涤剂。液体洗涤剂会在夹克中残留,从而影响DWR的防水功能。可以在常规洗衣机中洗涤夹克,要用凉水,低转速。漂洗两次,确保洗净所有洗涤剂残留。可将夹克低温烘干,如果需要,使用低温熨斗熨烫。不要使用漂白剂和纤维软化剂,不能干洗,衣服没有晾干不要收起。

我购买的The North Face Gore-Tex夹克渗水,怎么办?
Gore-Tex服装的外层为尼龙纤维,它是一种层压Gore-tex薄膜。尼龙外层在工厂里已经进行了防水处理-DWR。DWR是类似于Tectron或Scotchguard的一种物质,不过使用寿命更长。Gore-Tex会防止雨水渗入,但可以散发体热。DWR磨损坏掉后,雨水就会渗入到夹克的尼龙层,但Gore-Tex薄膜会防止雨水进一步渗透到皮肤。
要恢复DWR的防水性能,需要在普通洗衣机里用热水和粉末洗涤剂(不要使用液体洗涤剂)将衣服彻底洗干净。漂洗两次,确保没有洗涤剂残留。然后用普通烘干机中温烘干。在清洗Gore-Tex夹克时,要系好所有Velcro扣件,拉上拉链。最后,用热蒸汽熨斗熨烫整个衣服外部。通过此过程可以恢复DWR性能。要获得更佳性能,可使用DWR喷剂处理衣服的涂层,如使用Tectron或Revivex等。只有当水流无法在衣服表面形成水珠时才使用此处理方法。

我的Shell Jacket容易受潮,怎么办?
所有The North Face生产的外套表层面料都经过防水处理(DWR)。经过这种处理,表层面料可以使雨水凝结成小水珠,在被面料吸收前就滑落,从而可以使表层面料防潮。此外,一些优质面料还在反面进行了防水处理(如Gore-Tex和HydroSeal),从而防止雨水渗入面料。当衣服穿用时间过长后,来自外部尘土和自身分泌物会降低这些防护层的功能。要恢复DWR的功能,需要在普通洗衣机里用热水和粉末洗涤剂(不要使用液体洗涤剂)将衣服彻底洗干净。漂洗两次,确保没有洗涤剂残留。然后用普通烘干机中温烘干。在清洗Gore-Tex夹克时,要系好所有Velcro扣件,拉上拉链。最后,用热蒸汽熨斗熨烫整个衣服外部。通过此过程可以恢复DWR性能。要获得更佳性能,可使用DWR喷剂处理衣服的涂层,如使用Tectron或Revivex等。只有当水流无法在衣服表面形成水珠时才使用此处理方法。
 
如何延长The North Face鞋子的使用寿命?
有一些小窍门可以帮助保护你的登山靴或远足鞋。
(1) 使用硅质天气防护剂,保护你的皮靴免受风霜雨雪的侵蚀。市面上有数种不同的产品出售,但我们的设计师推荐Nikwax 牌防水产品,它是行业中处理皮靴的标准用品。
(2) 鞋子穿后一定要进行清洁,因为进入面料的泥土和污垢会使纤维变质。人们常犯的错误就是机洗跑鞋,正确方法是使用热水、抹布和清洁剂来清洁跑鞋。在晾干前,在鞋内填满填塞物,然后风干,以达到最佳效果。
(3) 将鞋子放在干燥阴凉的地方,以保证其使用寿命。
26 dicembre

中国的银行准则

柜员机取出假钱--->银行无责
网上银行被盗--->储户责任
柜员机出现故障少给钱--->用户负责
柜员机出现故障多给钱--->用户盗窃,被判无期
银行多给了钱--->储户义务归还
银行少给了钱--->离开柜台概不负责  
20 dicembre

休息,休息一会儿

终于把问题解决了,如释重负,轻松了很多。测试组那儿时不时发点出错截图过来,最后发现是别的模块的问题。看来性能统计模块的另一个用途就是可以查看其他模块是否已经发生异常。幸好不是我的问题,这时候让我改代码我已经完全想不起来当时是怎么写出来的了,数据库的查询插入逻辑已经把我绕进去了。
 
帮别人测试模块,压力测试确实很麻烦,需要找个一个临界值,既能让模块稳定的跑,还要是满负荷的跑而不会把服务器的通道挂死。回头再看看以前写的平台代码,偶尔发现自己当时挖的坑,又开始想办法把这坑填上,幸好对整个平台的测试没什么影响。
 
中午吃雪菜面,对着一碗白白的面条总觉得少了点啥,但是就是没想出来少啥了,最后还是老板娘抱着雪菜盆冲过来,一个劲的说:对不起对不起,忘记放雪菜了。
浑身发软,只想着回家睡觉,休息休息一会儿吧
17 dicembre

这年头假货横行

某天在夫子庙看到一家小店摆满了columbia和the north face的冲锋服,兴奋了一下进去瞅了两眼,款式和专柜的差不多,问了下价格只要270。。。。。。挂着Gore-tex牌子的居然只要270?看看衬里,果然是头号假货,压膜质量狂差,拉链都是普通的,根本毫无防水功能。至于缝合部位,俺已经毫无语言了,一分钱一分货果然没错。
 
星期六在中央很欣喜的发现有tnf和columbia的柜台,tnf还打着全场5-7折,金鹰的专柜可是号称什么活动都不参加,什么VIP卡都不打折的,那肯定首先冲去tnf。看起来不错,在某一拍发现了俺的外套,标着7折的牌子,价格只有3700+,我看的那个心疼啊。可是仔细看了半天终于发现有点不同,袖口绣的还是老式的Gore-Tex XCR字样,防水拉链的接合部有较大缝隙,衬里压膜偏薄,所以整个手感发软。最重要的是翻遍了口袋没有发现眼镜布,这可是tnf很重要的一个标志啊,也许很多tnf里面的眼镜布被偷了,但这一款应该在袖口拉链口袋里有个眼镜布的卡子啊,我也没有能找到。我不能说中央卖的是假货,但至少也是积压很久或者是处理的,所以没有配眼镜布。
 
又去了columbia,大概看了看没发现啥疑点,接着又去了新百,也有个columbia,似乎还挺大,晃悠了下,突然注意到,基本每件ommi-tech的衣服里面防水标志都没有标明防水系数,难道是防水性能太差所以不好意思标上去了?
 
看来有空还需要去金鹰的柜台看看,做个比较,至少俺知道金鹰的tnf肯定是真的,因为俺在香港买的鞋坏了就是在那儿换了双新的。总的来说,还是去香港买既便宜又放心,服务还很周到(大陆tnf鞋保3个月,香港1年)
14 dicembre

JAVA内存溢出

搞C的人对内存溢出应该非常熟悉咯。搞java的似乎对这个问题不是很在乎,因为java提供了垃圾回收机制。只是这个垃圾回收机制实在是太垃圾了。
 
平时自己写写程序玩玩的时候不在乎内存消耗,可是真正做了产品了,需要长时间运行的时候就不得不在乎了。同事的一个模块不间断的接收消息入库,没几分钟就到了1G。我的稍微好点,用了5分钟把java虚拟机默认的64M撑爆了。
 
Netbeans的Profiles功能真的很不错,线程,内存统统都可以查看得很详细。可惜JAVA的bug太多了,一会儿发现Timer有个bug,一会儿发现LinkBlockingQueue似乎有问题,俺就发现JDBC的PreparedStatement存在比较大的问题,每个方法都有finally块执行ResultSet和PreparedStatement关闭,可惜跟踪下来的结果就是PreparedStatement在不停的增加内存消耗,不得以换了Statement,原来5分钟从30k变成3M的现在始终维持在70k以下。
 
不过始终还是有点什么在消耗内存,还需要继续寻找,对着一大串的图标,曲线,数据,有一种想砸电脑的冲动
10 dicembre

生日,加班

又老了一岁,又在忙碌的工作中渡过了一天。
即将见到胜利的曙光,我可不想去北京出差。
05 dicembre

眼睛不行了

不停的往我平台里面添加东西,模块出错了也要我去查看是哪个模块的问题,不知道怎么写模块,不知道怎么用我平台运行模块,不知道怎么看日志,告警,跟踪信息,不知道怎么设置定时器,不知道我的性能采集模块怎么使用,每个不知道的人都跑我这儿来寻求答案,
 
这么折腾了差不多一个月,我终于感觉眼睛要不行了。大脑也混沌了,一大早分配新任务,我听了半个小时愣是没弄清楚我到底该做啥,幸好得到一位高人指导,1个小时搞定了。
 
下午中兴打电话,似乎有挖墙角的意图。我找工作的时候他不鸟我,等我有工作了,我也不会鸟他的。
03 dicembre

JAVA定时器

用JAVA写了一个定时器类,此类作为一个线程运行,包含了一个队列存放定时器消息,通过比较定时器的触发时间,俺触发事件先后顺序排列队列。

import java.util.concurrent.*;
import java.util.*;

public class TimerTask implements Runnable ...{
    
/** *//**定时器事件队列*/
    PriorityBlockingQueue
<TimerSlot> queue_ =  new PriorityBlockingQueue<TimerSlot>(2048);
    
/** *//** Creates a new instance of TimerTask */
    
public TimerTask() ...{
    }

    
    
/** *//**设置定时器,并放入队列*/
    
public synchronized Object setTimer(String taskname, String eventname, int timerevent, int delay, Object param)...{
        TimerSlot slot 
= new TimerSlot();
        slot.taskname 
= taskname;
        slot.eventname 
= eventname;
        slot.timerevent 
= timerevent;
        slot.expiretime 
= System.currentTimeMillis() + delay;
        slot.param 
= param;
        
try ...{
            queue_.put(slot);
        }
 catch (Exception ex) ...{
        }

        
return 0;
    }

    
    
/** *//**去掉指定的定时器*/
    
protected synchronized int killTimer(Object timer)...{
        
if (queue_.remove(timer))...{
            
return 0;
        }

        
return -1;
    }

    
    
/** *//**关闭操作*/
    
public void close()...{
        queue_.clear();
    }

    
    
/** *//**线程运行,检查定时器是否触发*/
    
public void run()...{
        
while (true)...{
            
try...{
                TimerSlot slot 
= queue_.peek();
                    
if (slot == null...{
                        Thread.sleep(
50);
                        
continue;
                    }

                    
long now = System.currentTimeMillis();
                    
if (now < slot.expiretime) ...{
                        Thread.sleep(Math.min(slot.expiretime
-now,50));
                        
continue;
                    }

                    queue_.remove();
                    
                    TaskMsg taskmsg 
= new TaskMsg();
                    taskmsg.eventName
=slot.eventname;
                    taskmsg.eventNo 
= slot.timerevent;
                    taskmsg.msg 
= (slot.param);
                    taskmsg.sender 
= "__timer";
                    taskmsg.receiver 
= slot.taskname;
                    TaskFactory.getInstance().getTaskByName(slot.taskname).
                            putmsgtoqueue(taskmsg);
            }
catch(InterruptedException e)...{
                
return;
            }

        }

    }

    
    
class TimerSlot implements java.lang.Comparable<TimerSlot>...{
        
public String eventname;
        
public String taskname;
        
public int timerevent;
        
public long expiretime; // ms, System.current+delay
        public Object param;
        
public int compareTo(TimerSlot  other) ...{
            
return (int)(this.expiretime-other.expiretime);
        }

    }

}