己丑年的尾巴真的就要隐去了,庚寅年就要来了。
在这个不知年味的城市中,待了快一年了,终于还是要离开,回家。
祝所有的人新年快乐,希望在新的一年里,世界和平,万家灯火!
己丑年的尾巴真的就要隐去了,庚寅年就要来了。
在这个不知年味的城市中,待了快一年了,终于还是要离开,回家。
祝所有的人新年快乐,希望在新的一年里,世界和平,万家灯火!
今天上班有个任务就是将之前产品中的示范代码有一些不规范的地方进行修改,使得能在多平台顺利运行,主要是文件名大小写的问题。由于之前示范代码编写者在跨平台上编码经验相对不足,所以编写者在写代码的时候并没有严格的大小写意识(主要原因还是因为Windows不区分大小写,而代码的测试均是在Windows下进行的),造成很多遗留问题。产品中有示范代码64个,大小写问题几乎无处不在,还有一个就是跨平台产品支持的数据引擎与Windows不一致,之前的Windows版本中有不少的示范代码使用了Windows平台特定的引擎类型,也需要进行修改。
修改的方法可以有很多,最为简单和直接的方法,应该是一个个程序运行,一个个文件检查,逐个进行修改。我想作为程序员的我们,肯定是不愿意做这么无聊而重复的工作的。那么搞定这个无聊而重复的工作呢?首先分析一下已有的示范代码的特征,虽然之前的代码存在诸多不规范的地方,但是在一些方面还是存在很多共性的,大小写出现错误的肯定是在设置数据路径的时候出现的,设置引擎类型的代码更是固定的,之需要使用几个非常简单的正则表达式就可以将其完全正确替换了。所以我们选择了读写文件的方法来完成这个任务。
在实现这个功能的时候,使用到了LineNumberReader和FileWriter两个类,每读取一行,使用replaceAll(String regx,String str)方法对该行进行替换,之后再使用FileWriter将替换后的文本写入文件:
File file = new File(sourcePath);
try {
lineNumberReader = new LineNumberReader(new FileReader(file));
String line = lineNumberReader.readLine();
fileWriter = new FileWriter(file);
while (line != null) {
line = line.replaceAll("\\.xxx", ".XXX");
fileWriter.write(line+"\r\n");
line = lineNumberReader.readLine();
fileWriter.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
lineNumberReader.close();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
执行的结果是,64个示范代码中,总会有几个会出现一些很奇怪的问题,那就是修改后的文件丢失了很多文本,导致编译不通过。那么问题在哪儿呢?经过多次分析和调试,最终发现当LineNumberReader和FileWriter指向同一个文件的时候会出现该问题,如果将源文件处理后的结果写入到一个新的文件中便不会存在这样的问题。那么究竟是哪里出了问题呢?来看一张图
在这张图中我们能看到一些信息,LineNumberReader对象中有一个cb字符数组,大小为8192=1024*8.
在我整个的调试过程中,我一直关注着最后一个字符,在整个过程中,这个位置的字符一直没有发生改变,而最终写入到文件中的最后一个字符就是该字符,这难道只是一个巧合吗?
现在让我们更换一下代码将原本使用同一个File对象的代码,改成使用另一个新文件对象的代码来重新调试一下。
先执行代码,查看结果发现,文本的内容完全被写入到新文件中,并没有出现丢失文本这样的情况,那么我们再来调试一下
,我们再次来监视cb[8191]处的值,这次我们可以发现在LineNumberReader对象lineNumber==319的时候,该值发生改变。
====我是分割线======
综合上面的两种情况,我们可以得出一个结论,当LineNumberReader和FileWriter同时指向一个文件的时候,系统在写入文件的时候并不是逐行逐行写入,而是先记录下来逐行的内容,并且是记录到LineNumberReader的cb字符数组中。该数组的大小固定为内存最小单位8K,也就是大小为8192的数组,该数组将保存初次初始化FileWriter对象时读取的文件内容,在之后的每次FileWriter写入操作均是改变该数组中存储的字符值。这样导致的结果就是,如果当前的读取的文件较大,就会存在丢失内容的问题(最多保存8192个字符,含空格和换行)。而使用一个新的文件来进行修改后内容的写入就不存在这样的问题,当FileWriter需要使用到flush()方法来将当前缓冲区中的所有内容写入文件之后,LineNumberReader中的cb数组内容也将发生改变,指针下移,读取下一个块大小为8192的内容,直到文件末尾。
所以在使用LineNumberReader和FileWriter的时候需要注意这一点,如果实在不愿意多生成一堆新文件的话,可以在写入完成之后,将原始文件删除,而将新文件更名一下就好了。
SuperMap Objects是SuperMap Software Co., Ltd. 成长的关键,最早公司创建之初公司便同时启动了两个项目,一个便是传统GIS中最为突出的桌面产品,另一个就是组件产品。
组件产品又作为桌面产品的基础,为桌面应用提供相应的功能。从SuperMap Deskpro 2000到现在的SuperMap Deskpro 6R,一直都是这么一个模式,SFC组件为SuperMap Deskpro系列产品保驾护航多年,不过近几年SFC组件逐渐进入后期维护阶段,SuperMap Deskpro也进入维护阶段,主要对功能的集成和细化进行深入挖掘,更多的是从软件可用性提升以及功能正确性,分析高效性上来提升Deskpro产品的市场认知度和用户体验。基于SFC(SuperMap Foundation Class)组件有一系列的产品,有为我们所熟知的SuperMap Deskpro、SuperMap IS .NET和eSuperMap,从桌面到服务器,再到嵌入式,甚至还有国土行业的一些深度行业应用等等。SFC已经为SuperMap带来了十年的收益,更是为SuperMap品牌提供了前期非常坚实的基础沉淀。那么为什么不继续深入SFC组件产品的研发,而是转而进入了一个后期维护阶段,目前的工作主要集中在后期缺陷的维护呢?主要原因有:
上图是SuperMap Objects Java/.NET产品的实现原理,至于细节,相信众位看官稍微了解一些关于封装机制的都一目了然了。功能性的代码完全由UGC完成,而接口的设计与实现完全由组件层来完成,组件层可以再更具自身语言平台的需求增加一些控件和相关产品的设计开发。例如.NET组件在C/S架构中应用广泛,用于对于桌面应用场景的需求较多,那么易用性高、定制性强、可设计的控件无疑会为客户带来更多的价值空间;而Java组件的优势应用在服务端,B/S架构的产品也不少,在服务端的表现可以交由iServer系列产品(基于SuperMap Objects Java开发的服务器产品),那么客户端呢?新近稍热一点的 JavaFX是Sun公司首推的RIA解决方案,也许用户的应用场景也会随着产品的升级而出现这一方面的需求。
其实组件产品分两大语言体系是一个比较科学的分类
================我是分割线==================
来到公司已经快半年了,对项目产品和架构上曾经都颇有微词,迄今依然有些怨言,以上就是我对目前SuperMap Objects Java/.NET系列产品的一些碎碎念,其中均是纯个人想法和行为,有一些猜想更多的是臆断。不过猜想也好臆断也罢,终究是我自己思考的一些沉淀,摆出来,凉一凉,晒一晒,淋雨发霉也好招来板砖也罢,纯属博主个人呓语,众看官且听且过是也。
首先声明,本人确实是SuperMap Software Co., Ltd. 的一名员工,目前就职于研发中心,从事软件开发的工作。
对于SuperMap Objects有着自己的理解和认识,有自己想说的一些话,不过说得对不对就不得而知了。对于职场上的一些常识和非常识,我一概不知,我会说我想说的,说我能说的,当然我不可能透露关于工作进度的只言片语,也不可能透露关于公司产品方向的任何信息。但是,我想我会猜的,反正我也听不到什么有价值的信息,那么为何不来一些自己的猜想呢?Yes, why not?
============我是分割线=============
该专栏主要针对SuperMap Objects的新特性和可公布的新消息作出广播,并偶尔来些剧透和爆料,也许会有不错的效果哦。我想作为一个GIS的从业人员,作为一个组件开发人员,报导关于自己产品的一种心态平衡非常重要。
首先组件是公司起家的法宝,其次是公司上层服务器产品的基石,是底层类库产品的延续,可所谓处于公司产品结构的腰部。我们都知道腰对于一个人的重要性,所谓无腰者不人也,就是这么一个意思啦。然而我们平日看美女的时候,先是头后是臀,腰经常是被略过的或者只是为了衬托臀的丰满而窈窕地存在的。那么作为一个腰,我们要如何做好这个产品呢?在做产品的过程中,如何勾起众位看官的欲望呢?也许腰风就在一夜起,顿时洛阳腰贵,作为腰子的我可能也会着实火一把哦。
所以该栏目的主要内容有以下:
众位看官,看过且看过,切勿传播,一旦小站被领导发现,可能便有关闭之忧。还望各位慎重慎重谨慎谨慎。
记得我第一次上网是2004年6月份中旬,那时刚刚结束高考,跟同学一起去网吧上网,第一次学会使用CTRL+SHIFT切换输入法,开始知道怎么打字,当时大部分人都在使用智能ABC打字。这个输入法一直用到大二,大三的时候开始有同学使用搜狗拼音输入法,而且迅速在班级中流传开来,当时那个爽啊!直到现在,自己的电脑上也一直用的是搜狗输入法,期间试过谷歌拼音输入法和QQ拼音输入法,觉得都不错,但是毕竟使用搜狗习惯了,最终还是选择了搜狗。
我不喜欢有广告的软件(无聊的广告),更不喜欢会弹窗体的软件,那么搜狗可以算作这一类的,之前我还会尝试使用自己曾经的搜狐账号登录一下,后来发现总是有一些我并不需要的信息,遂再也不登录了。现在经常会弹出一个窗体通知我更新了一些什么网络热词,同时还会有搜狐高清视频的一些广告,当然这些广告我一直都很不喜欢,甚至讨厌。相对这个广告来说,谷歌拼音和QQ拼音纯净的界面无广告让我觉得很清爽,但是为什么还选择搜狗呢?
我曾经一直以为输入法是一个系统必备的软件,曾经以为搜狗输入法只是一些程序员娱乐的产物,但是,逐渐发现,这是一个互联网利器,我们总是离不开浏览器,离不开手机,离不开电脑,我们总是想发出声音,所以我们总是需要一个能让我们更快更好发出我们声音的工具,那么搜狗无疑就是一个非常出色的一位。
另外,最近公司有同事闲来无事,做了一个搜狗的皮肤,觉得还不错。其实企业皮肤定制确实是一个非常不错的idea,个性化的皮肤总是一些发烧友针对自己发烧的领域发挥,有很多动漫和卡通人物的皮肤,也有一些学校和机构的皮肤,企业的皮肤倒确实是第一次听说和见识。其实如今企业在日常的办公中,逐渐开始强调CID的概念,从办公用品的定制化和鼠标键盘上的各种公司logo,甚至团队的logo,我们看到了一个巨大的企业个性化的市场,输入法不失为一个好的切入点。logo绝对不是唯一的一个切入点,输入法最让我们着迷的是它的智能词组功能和强大的词库,你有没有因为使用输入法输入公司同事名字苦恼过,absolutely,有过。那么公司员工姓名词库是不是一个非常好的idea呢?通过公司员工信息表自动生成更新词库难道不是很好吗?
也许,搜狗有一天真的会成长为一名巨人哦。