解惑

解己之惑,解人之惑

2007年3月 (第3页共4页)

BT是柄双刃剑

相信很多人都在用BT,但是自从网络运营商对它采取各种限制措施后,我们就用得不是那么的舒服了,但是如果网络运营商不采取限制,那么运营商的带宽可能就严重不足了,采取这些限制以后,在试用BT工具的时候我们的其它网络服务可能就不能正常工作了,例如浏览网页,我想这个就是为什么我的这篇日志有那么多访问量的原因,可惜的是,cFosSpeed并没用能够很好的解决这个问题,当然,不排除我没用完全把握这个工具的可能性,也不排除我是太急躁了。
使用BT的本质问题其实是TCP连接数限制的问题(我认为使用BT之所以导致问题,是因为网络运营商限制了一个地址的TCP连接数,而BT要访问很多可能已经关机的机器,这样就导致了太多的临时的TCP连接,同时导致网络的较大浪费),如果我的这个判断正确的话,那么解决这个问题其实并不是很困难,办法就是提供一些服务器,保存这些PC的状态以及基本信息,PC启动或者关闭的时候连接到这些服务器更新自己的状态,而BT软件在连接这些PC资源的时候,先去服务器批量查询这些PC的状态,如果是关闭状态的,就不要做无谓的连接尝试了。
由于我对P2P技术不是很清楚,所以这个也只是一个简单的猜测,可能P2P技术中需要的PC信息都是动态的,记录没有意义,但是既然PC和PC之间能够访问,那么总归是有些信息可以共享的,我们需要缓存的就是这个信息,另外这个信息的更新可能是海量的,需要有服务商提供服务器做这件事,如何盈利是另外的事情了。

更新:
搜了下,发现TCP连接数的限制不是网络运营商搞的,而是微软搞的,XP的SP2里面把TCP连接数限制到50了,网上有些解决方法,主要就是下载破解补丁修改这个TCP连接数的限制到一个比较高的值,但是我好像也装过这个补丁,把TCP连接数提高到500,好像没有什么用。

2007年3月10日更新:
回家确认了下,安装脱兔的时候就有那个可以修改TCP连接数的东西,修改为500没有任何作用。

更换服务器

前两天一个朋友问我关于虚拟主机的事情,他也想建一个Blog,后来他看到一个服务商并推荐给我,看了下价钱,很便宜,一年的虚拟主机才100块钱,速度也还行,管理功能比较完善,提供的功能也很多,考虑到JR的服务器一直不太稳定,就换过去了。
过程还比较顺利,就是数据库空间比较大,把那些访问记录都去掉了,就OK了,现在还有大把的空间,呵呵,以后上传文件要小心点了,原来经常往JR的服务器上上传几十M的文件,回家再下载,这个服务器不行了,空间不够,而且还有流量限制(一个月7G),还是少用为妙。昨天晚上切换了IP后,今天看了下流量统计,只有12M,还好,平均来算,每天有240M的流量,现在还远远不到。这个虚拟主机另外的好处就是可以单独买流量,也不太贵,8.4元/G。

WP-ShortStat是数据库空间杀手

一直很奇怪数据库空间为什么一直在快速增加,今天备份数据库的时候发现数据库已经到35M了,把备份文件看了下,发现wp_ss_stats表几乎占据了整个数据库的使用量,删除这个表的数据后,数据库空间下降到只有1M多一点,呵呵,果断的停用了这个插件,还是使用外部的访问统计好了。我想WP-ShortStat可能只适用与每天只有几个点击量的Blog?我的这个Blog的访问量也不是很大,每天的点击数最多300(Google Analytics统计数据),三个多月的数据量就有35M,要是一天的点击量上千,那还不是早暴了?

动态排序

这个是刚刚提出的一个需求,我开始以为不能实现,但是是可以的,虽然比较麻烦。
Crystal Report Designer中可以选择用来排序的字段可以是数据库字段,也可以是Fomula字段,不能是参数字段,所以一个可行的方法就是创建一个Fomula字段,这个Fomula的任务很简单,就是根据参数的值选择字段:

if {?sortcolumn} =’ID’ then totext({DEVICEGROUPCONFIG.DG_ID},’0000000000000′)
else
{DEVICEGROUPCONFIG.DG_NAME}

需要注意的就是那个totext的使用,Fomula是没有类型的,但是要求其返回值的类型要一致,不能一会是字符串一会是数字,所以我使用了totext把数字转换为字符串,如果有日期类型,也要类似的实现。

取得参数的缺省值列表

我们要求报表可以根据用户的选择来动态进行排序,但是每个报表所显示的列肯定不一样,所以每个报表在实现这个功能的时候,参数提示的时候必然要提供可选的值,到了Java里面,如何从Crystal Report Server上读取这些信息呢?
    public static ValueObjList getReportParameters(int reportID) throws Exception
    {
        String query = "Select SI_PROCESSINFO.SI_PROMPTS From CI_INFOOBJECTS Where si_progid = ‘crystalenterprise.report’ and SI_ID = "
                + reportID;
        IInfoObjects results = query(query);
        ValueObjList result = new ValueObjList();
        if (results == null)
        {
            return result;
        }
        IInfoObject report = (IInfoObject) results.get(0);
        List allParameters = ((IReport) report).getReportParameters();
        IReportParameter reportParameter = null;
        //Fix THRX2282, this maybe crystal report’s bug
        Set parameterNames = new HashSet();
        for (int j = 0; j < allParameters.size(); j++)
        {
            reportParameter = (IReportParameter) allParameters.get(j);
            if (!reportParameter.isInUse())
            {
                continue;
            }
            CrystalReportParamConfigValueObj paramvo = new CrystalReportParamConfigValueObj();
            String name = reportParameter.getParameterName();
            if (name.equals("sortcolumn"))
            {
                IReportParameterValues defaultValues = reportParameter.getDefaultValues();
                Values values = defaultValues.getValues(reportParameter.getValueType());
                for (int m = 0; m < values.size(); m++)
                {
                    ParameterFieldDiscreteValue value = (ParameterFieldDiscreteValue) values.get(m);
                    System.out.println(value.displayText(Locale.ENGLISH));
                }
            }
            if (parameterNames.contains(name))
            {
                continue;
            }
            else
            {
                parameterNames.add(name);
                paramvo.setAttribute(CrystalReportParamConfigAttributes.name, name);
                paramvo.setAttribute(CrystalReportParamConfigAttributes.type, new Integer(reportParameter
                        .getValueType()));
                result.add(paramvo);
            }
        }
        return result;

    }

注意蓝色的代码,特别是defaultValues.getValues(reportParameter.getValueType()),这样我们就可以从服务器上读取到报表随带的参数值列表。

喜欢萨莉亚

上周我们搞了一个Team Building,和美国的同事一起玩的,就是在虹桥的那个真人CS镭射激光战,完了以后就去吃萨莉亚,感觉我们就像灾民一样,人和多,闹哄哄的,点了很多菜,但是开始他们上菜的速度太慢,我们人又多,又饿,我们基本上是在抢东西吃,把菜单上的东西点了个遍(反正是公司出钱),感觉还不错,特别是东西的种类比较多,而且比必胜客便宜很多。我吃的时候没有那么急,都是一样尝一点。今天上午房子过户,搞到12点多,老婆回单位吃饭了,刚好公司对面就有个萨莉亚,就跑去吃了个金枪鱼面的套餐,才14块钱。现在想想过年前吃了三次必胜客宅急送的面(都是28块一份),真的是心疼啊。
回来和老婆讲了下,她也想去试试了,正大广场有一家,但是好像人比较多,不知道能不能吃上。
我感觉不错的一些东西:

  • 肉酱千层面
  • 特色烤鸡翅
  • 烤香肠
  • 焗蜗牛
  • 蒜泥鸡排
  • 牛肉炖土豆

PS:那天玩激光战的时候我弄伤了一个同事,我和一个同事包抄一个敌方同事,他被另外一个“击毙”了,他躲在角落里面没有看到我,冲出来逃命的时候正好撞到正准备合围他的我的枪口,把眼睛下面弄开了一个口子(大约1.5厘米),还好现在的医学比较发达了,可以弄胶水而不用缝针,这样就不会留下伤疤了,等他好了请他吃饭吧。

为什么要使用Pluto?

这两天一直在看Pluto的东西,给我的感觉一直都不是很好,随着了解的深入,这种感觉越来越明显,其实也不是别的,就是它的要求太高了,它所声明的一些东西它又没有真正做到(例如可以运行在JDK1.4下,可以在Tomcat5.0下运行),但是同时它又不是一个完善的Portal框架,因为它所提供的功能实在是太少了,它只是提供了一个JSR168规范的参考实现。我到现在都不明白美国那边的架构师为何要选择它,在我们研究后说它不能在JDK1.4下运行时,他们竟然一再质疑我们的结论。在我今天成功的发布到Tomcat5.0.28后,我想将它集成到我们的产品中,结果又出问题,原因也很简单,就是要把应用配置为crossContext的,但是我不知道如何设置,因为我们的产品使用的是Jboss+tomcat,那个pluto.xml文件是自动生成的,我手工修改也没有用。后来再研究了下,可能要修改jboss-web.xml文件,到了下班的时间就回来了,明天再试试了。不过明天我会和美国的架构师讨论下,我考虑使用Light Portal,因为它提供的功能更丰富,可以大大减少我们的工作量(包括AJAX的拖放式配置效果)。

将Pluto1.1发布到Tomcat5.0

上次也已经提到了很难将Pluto1.1发布到Tomcat5.0,经过另外几个小时的艰苦努力,总算是成功了。
第一是因为它使用了一个JDK1.5的API,解决方法是修改org.apache.pluto.core.ContainerInvocation,将CONTAINERS.remove();注释掉。(可能有潜在的问题,猜测可能是会有内存泄漏)
第二是它提供的参考实现的war包的配置使用了testsuite那个应用,必须修改pluto-portal-driver-config.xml,删除其中对testsuite应用的portlet的引用:
<?xml version="1.0" encoding="UTF-8"?>

<pluto-portal-driver
    xmlns="http://portals.apache.org/pluto/xsd/pluto-portal-driver-config.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://portals.apache.org/pluto/xsd/pluto-portal-driver-config.xsd
                        http://portals.apache.org/pluto/xsd/pluto-portal-driver-config.xsd"
    version="1.1">

    <portal-name>pluto-portal-driver</portal-name>
    <portal-version>1.1.0</portal-version>
    <container-name>Pluto Portal Driver</container-name>

    <supports>
        <portlet-mode>view</portlet-mode>
        <portlet-mode>edit</portlet-mode>
        <portlet-mode>help</portlet-mode>
        <portlet-mode>config</portlet-mode>

        <window-state>normal</window-state>
        <window-state>maximized</window-state>
        <window-state>minimized</window-state>
    </supports>

    <!– Render configuration which defines the portal pages. –>
    <render-config default="About Pluto">
        <page name="About Pluto"
            uri="/WEB-INF/themes/pluto-default-theme.jsp">
            <portlet context="/pluto" name="AboutPortlet" />
        </page>
        <page name="Pluto Admin"
            uri="/WEB-INF/themes/pluto-default-theme.jsp">
            <portlet context="/pluto" name="PlutoPageAdmin" />
            <portlet context="/pluto" name="AboutPortlet" />
        </page>
    </render-config>

</pluto-portal-driver>

阅读全文

结婚三部曲

我和老婆结婚的进程可能是所有的中国人中最慢的了,我们前年春节领的结婚证,去年春节照的婚纱照(也就是几天前),计划今年春节回家办酒席,老婆连日子都选好了,情人节(2008年2月14日),农历正月初八。想来我们也挺不容易的,两边的家境都不好,家里把我们供出来读书已经很不容易了,我们结婚买房什么的就不能给我们任何资助了,每年还得孝敬一下两边的父母和爷爷奶奶,不过好在我们也挺过来了,而且把房子也买了(虽然借了很多钱,另外还贷了很多钱),这两件大事弄完,我们也就可以喘口气了,不过也只有一小口,因为还要考虑小孩的事情。刚好早上看读者的时候看到一个关于中国人的精神状态的调查报告,看到我们这个年龄段和学历的人的满意度是最低的,这个也情有可原吧,但是我们两个好像比那个调查的结果情况要好一点,因为我们已经看到了希望。

痛苦的Pluto使用经历

项目中要使用到Pluto,今天研究了一下,但是经历着实痛苦。
我们的tomcat使用的是古老的jboss带的版本,我就用我自己安装的tomcat5.0.28做了下试验,结果不成功,后来下载了一个bundle版本,其实就是已经包含了tomcat的版本,但是它带的版本是5.5.20,我就对照了下,把我能看出来的不同都对应的在tomcat5.0.28下做了修改,应用是可以跑起来了,但是登录进首页的时候出了一个NullPointerException,原因不明也没有那么多时间去研究,后来就下载了老版本的1.0.1试验,结果应用都不能起来。没有办法,只能从原代码编译试试,又去下载maven,结果使用JDK1.4无法编译,它的代码中使用了一个JDK1.5才有的方法,手工修改源代码,编译通过了,但是在安装的时候又出了问题,报告pluto的一个plugin不存在。然后又下载pluto的1.0.1版本的原代码,又下载maven1.0.2版本编译,依然不成功,原因是不能解析project.xml文件,彻底无语了。

更新:
回家后又弄了一下,终于在tomcat5.0.28下成功手工发布了pluto1.1,问题是我依然要使用JDK1.5才能看到结果运行正常,使用JDK1.4时会出现编译pluto1.1时遇到的那个问题的运行期版本。步骤为将bundle版本下的文件拷贝到tomcat5.0.28的对应目录:

  • conf\Catalina\localhost\pluto.xml
  • \shared\lib
  • \PlutoDomain\pluto-portal-1.1.0.war
  • 编辑tomcat-users.xml文件,增加pluto用户

要解决JDK版本问题,可能的办法就是修改源代码(pluto-1.1.0-src\pluto-container\src\main\java\org\apache\pluto\core\ContainerInvocation.java,把64行注释掉就行)后在JDK1.4下编译,然后把那个有问题的类替换掉,当然可能会有其他的问题。

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑