作者归档:贺 利华

关于贺 利华

正在学习编程,享受编程 热爱文学,闲来读读《读库》 有思想,没理想 正在学会专注

开通SuperMap Objects专栏

首先声明,本人确实是SuperMap Software Co., Ltd. 的一名员工,目前就职于研发中心,从事软件开发的工作。

对于SuperMap Objects有着自己的理解和认识,有自己想说的一些话,不过说得对不对就不得而知了。对于职场上的一些常识和非常识,我一概不知,我会说我想说的,说我能说的,当然我不可能透露关于工作进度的只言片语,也不可能透露关于公司产品方向的任何信息。但是,我想我会猜的,反正我也听不到什么有价值的信息,那么为何不来一些自己的猜想呢?Yes, why not?

============我是分割线=============

该专栏主要针对SuperMap Objects的新特性和可公布的新消息作出广播,并偶尔来些剧透和爆料,也许会有不错的效果哦。我想作为一个GIS的从业人员,作为一个组件开发人员,报导关于自己产品的一种心态平衡非常重要。

首先组件是公司起家的法宝,其次是公司上层服务器产品的基石,是底层类库产品的延续,可所谓处于公司产品结构的腰部。我们都知道腰对于一个人的重要性,所谓无腰者不人也,就是这么一个意思啦。然而我们平日看美女的时候,先是头后是臀,腰经常是被略过的或者只是为了衬托臀的丰满而窈窕地存在的。那么作为一个腰,我们要如何做好这个产品呢?在做产品的过程中,如何勾起众位看官的欲望呢?也许腰风就在一夜起,顿时洛阳腰贵,作为腰子的我可能也会着实火一把哦。

所以该栏目的主要内容有以下:

  • SuperMap Objects 产品的最新小道消息(绝非官方消息)
  • SuperMap Objects 产品的开发技巧
  • SuperMap Objects 产品的八八和卦卦

众位看官,看过且看过,切勿传播,一旦小站被领导发现,可能便有关闭之忧。还望各位慎重慎重谨慎谨慎。

“搜狗”——To Be 输入法巨人

记得我第一次上网是2004年6月份中旬,那时刚刚结束高考,跟同学一起去网吧上网,第一次学会使用CTRL+SHIFT切换输入法,开始知道怎么打字,当时大部分人都在使用智能ABC打字。这个输入法一直用到大二,大三的时候开始有同学使用搜狗拼音输入法,而且迅速在班级中流传开来,当时那个爽啊!直到现在,自己的电脑上也一直用的是搜狗输入法,期间试过谷歌拼音输入法和QQ拼音输入法,觉得都不错,但是毕竟使用搜狗习惯了,最终还是选择了搜狗。

我不喜欢有广告的软件(无聊的广告),更不喜欢会弹窗体的软件,那么搜狗可以算作这一类的,之前我还会尝试使用自己曾经的搜狐账号登录一下,后来发现总是有一些我并不需要的信息,遂再也不登录了。现在经常会弹出一个窗体通知我更新了一些什么网络热词,同时还会有搜狐高清视频的一些广告,当然这些广告我一直都很不喜欢,甚至讨厌。相对这个广告来说,谷歌拼音和QQ拼音纯净的界面无广告让我觉得很清爽,但是为什么还选择搜狗呢?

  1. 习惯使然,我已经使用该输入法两年多了,早已经熟悉了它的词序排列,而且它的智能组词能力确实很突出,至少在我自己的体验山上来看,比谷歌拼音和QQ拼音好了不少,虽然这三家企业都有自己的搜索引擎,其中的谷歌更是搜索巨头,在网络热词和智能组词上都不逊色,但是问题就是这些产品都是在想搜狗学习,甚至可以说是抄袭,因为你不能跟搜狗区别太大,如果太大的话,对于其他想更换输入法的用户来说成本会太高,导致用户再度流失。既然跟在人家的屁股后头走,那么自然有很多东西要慢上一个节拍,那么用户首选的肯定不会是后者了。
  2. 轻度的广告,虽然我对软件有一定的洁癖,但是还不至于到一尘不染的境界。搜狗的广告不像某些软件,只要你登录立刻给你弹出一个窗体,一大堆的标签页,各种新闻信息扑面而来了,很可能就会打断你原本启动该软件的初衷,转而去浏览其中的一些能吸引你的信息了(如网络美女和花边新闻等等)。搜狗的广告页面保持了一个低调的态度,首先它将广告区域选择了与系统托盘靠近的右下角,这个区域并不是用户的热点区域,并不会立刻将你的视线吸引过去,其次广告页面很小,而且不需要主动关闭,在几秒钟之后自行卷帘消失,在工作中的你完全可以不予理会。第三,搜狗的广告可以隐藏在当前输入面板,例如当你输入鼠标时,在你的输入面板上方(拼音输入处)显示一个第六选项,即“到淘宝找‘鼠标’:http://search8.taobao.com/browse/search_easy.htm?keyword=%CA%F3%B1%EA&catid=11&refpid=mm_14616170_2082030_8507977&isinner=06”,只要你输入6,系统将会启动你的默认浏览器,并定位到淘宝的搜索页面,关键字为鼠标。
  3. 联想功能,同刚才的淘宝广告有点类似的是,只要你输入高考两字,同样在输入板上方有一个第六选项,网址为:http://www.sogou.com/gaokao,虽然可能我们大多时候均是通过正规的搜索引擎如Google和百度来进行搜索的,但是这种方式无疑更为一体化,至少它为我们带来了一定的便利,当然这不是我选择搜狗的主要原因。
  4. 跨平台。这个特性对我来说,让我有点欣喜如狂,因为在Ubuntu下,我对智能拼音的满足度并不是很高,因为我已经非常习惯于搜狗的智能词组功能了,智能拼音对我来说有点点残废,让我打字总是一顿顿的,感觉上厕所总被人打断的不快。当我发现搜狗云输入法的时候,我很开心,以后写博客(也就写博客的时候,严重依赖中文输入法)就可以键随心走了,达到人键合一了。之前的云输入法还不是非常的成熟,需要使用收藏标签来调用一段JavaScript代码,现在搜狗更是推出了Firefox下的插件了,只要是在Firefox下,Ctrl+Space便可以启动搜狗云输入法了,真正的跨平台,当然只要你喜欢跨浏览器也不成问题的,虽然别的浏览器暂时还没有插件(相信Chrome下不久便会有了吧),但是只需要收藏一个书签,之后点击收藏便可以在当前页面启动输入法了。

我曾经一直以为输入法是一个系统必备的软件,曾经以为搜狗输入法只是一些程序员娱乐的产物,但是,逐渐发现,这是一个互联网利器,我们总是离不开浏览器,离不开手机,离不开电脑,我们总是想发出声音,所以我们总是需要一个能让我们更快更好发出我们声音的工具,那么搜狗无疑就是一个非常出色的一位。

另外,最近公司有同事闲来无事,做了一个搜狗的皮肤,觉得还不错。其实企业皮肤定制确实是一个非常不错的idea,个性化的皮肤总是一些发烧友针对自己发烧的领域发挥,有很多动漫和卡通人物的皮肤,也有一些学校和机构的皮肤,企业的皮肤倒确实是第一次听说和见识。其实如今企业在日常的办公中,逐渐开始强调CID的概念,从办公用品的定制化和鼠标键盘上的各种公司logo,甚至团队的logo,我们看到了一个巨大的企业个性化的市场,输入法不失为一个好的切入点。logo绝对不是唯一的一个切入点,输入法最让我们着迷的是它的智能词组功能和强大的词库,你有没有因为使用输入法输入公司同事名字苦恼过,absolutely,有过。那么公司员工姓名词库是不是一个非常好的idea呢?通过公司员工信息表自动生成更新词库难道不是很好吗?

也许,搜狗有一天真的会成长为一名巨人哦。

关于JTree的一些碎碎念

本博号称关注Web2.0, Ruby/Rails,Java。但是据本人所知,到目前为止还没有任何一篇关于Java方面的文章和只言片语。作为本博的博主,确实有点大言不惭的感觉,一想到这个心中就颇不宁静啊。

其实作为一名博客,写东西的欲望一定要强烈,很多的时候我们并没有很多的素材可以写,因为生活几乎每天都是Just so so,我们谁都不想书写平淡,总想语不惊人死不休。作为博客的人们可能这种感觉更为强烈,我是一名独立博客耶,我不能人云亦云啊,我得从我的文章里抒发我的思想啊。艹,你娘的思想也就大街上小摊上的胡萝卜包子一般廉价,还装。所以呢,我们还是需要不时的刺激一下自己的神经,同时呢,也给我们伟大的祖国发育不良的国联网添加一些有趣或无趣的素材资料吧,也算是为我国早日实现四个现代化添砖加瓦了。

===========我是分割线=========

public class JTree
extends JComponent
implements Scrollable, Accessible
How to Use Trees 一节。

树中特定的节点可以由 TreePath(封装节点及其所有祖先的对象)标识,或由其显示行(其中显示区域中的每一行都显示一个节点)标识。展开 节点是一个非叶节点(由返回 false 的 TreeModel.isLeaf(node) 标识),当展开 其所有祖先时,该节点将显示其子节点。折叠 节点是隐藏它们的节点。隐藏 节点是位于折叠祖先下面的节点。所有可查看 节点的父节点都是可以展开的,但是可以显示它们,也可以不显示它们。显示 节点是可查看的并且位于可以看到它的显示区域。

这是JDK 5.0非官方中文文档中的描述,我想这个描述给我们的第一个直观印象就是这个控件应该和Windows资源管理器中的树状结构的表现是一致的。确实如此,JTree确实是用来作为树形展示使用的,因为我们在很多的数据管理和业务处理上,秉承了我们自古就袭承的分类方式,所以我们有很多的业务可能用到或者说可以用到JTree。

那么JTree怎么用的呢?这个问题我曾经问过自己很多次,还做过很多相关的工作来学习JTree的使用,记得来到北京实习做的第一个学习阶段作业就是使用公司已有的组件产品做一个叠加分析的Demo。作为一个比较友好的叠加分析工具,就肯定需要一些GIS数据处理的功能,比如打开工作空间,数据源,数据集,地图,同时还应该能简单地做一些图层删除或者地图关闭之类的基础功能。这样一来,主体的工作就是基础功能模块的实现了,只是在基础功能模块的基础上,添加一个叠加分析功能模块,而在基础功能模块中的可视化显示JTree必然是首选控件。

在实现树状加载和显示工作空间,参考公司已有的桌面产品UI设计,需要再JTree的每个节点之前添加一些图标,用于标识当前节点的数据类型,例如线数据集和面数据集的图标是有明显差异的,这样对用户的友好度会提高很多。默认的JTree使用Java默认的meta风格显示文件夹(根节点)和文件(叶节点)的图标样式,那么如何添加自定义的图标显示呢?当时我就在JTree的文档中苦苦找寻,希望自己能找到一个setIcon()的方法,最终无耻的失败鸟。后来才知道之需要自己实现一个类,实现TreeCellRenderer就可以了,重写下面这个方法(Sun就是这么排版的,我觉得这样挺好的,不要怪我占太多行了)

Component getTreeCellRendererComponent(JTree tree,

                                       Object value,
                                       boolean selected,
                                       boolean expanded,
                                       boolean leaf,
                                       int row,
                                       boolean hasFocus)

在这个方法中,它的返回值为一个Component,那么我们完全可以自由发挥了,比如返回一个JLabel。当时欣喜若狂,赶紧将代码巴拉巴拉地敲好,一看效果显著啊,根据类型不同生成不同的Icon设置给将要返回的JLabel对象就OK了。

实习的工作相对简单,当时对JTree的理解也就点到为止了。那么此次项目组需要退出Objects Java的控件,其中就有一些控件需要使用到JTree来实现,功能要求相对就复杂了不少。

需要在一个节点文本前,显示多个图标,除了用于区别节点数据类型的图标外,还需要添加几个操作图标,用于可视化节点数据的操作,那么返回一个什么呢?JPanel无疑是最好的选择,轻量化容器中的万金油。在JPanel中添加几个可视化的Icon并不是难事,只是JLabel多少的问题了,通过对节点数据类型的判断分别设置便好了。问题是,如何判断用户当前点击的位置落在JPanel中的那个操作图标上呢?又如何将这些操作直接反映到实际的数据上来呢?通过JTree.getUI()方法获取当前的JTree的UI,然后调用TreeUI.getPathBounds(JTree tree, TreePath path)方法获取当前节点的绘制区域,之后通过鼠标事件MouseEvent的getX()和getY()方法获取当前鼠标的位置信息,由于控件的编写图标的大小由自己定义,所以可以确定图标的大小和JPanel的布局(我使用的是FlowLayout,并且使用setHgap()方法将水平控件间距设置为0),通过像素坐标的计算便可以得出当前用户鼠标单击事件应该响应哪个对应索引处的动作。

在实现的过程中,还需要使用到编辑节点的功能,那么如何来做呢?首选实现TreeCellEditor接口,完全自己定制,可以避免像继承自DefaultTreeCellEditor的烦恼(因为它能满足一般需求,但是会限制你拳脚)。TreeCellEditor也有一个很嚣张的方法,号称自己要接管TreeCellRenderer的方法,就是这个啦

Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row)

重写这个方法,用来自定义编辑时的节点渲染,例如我的树形控件在编辑的时候只能编辑节点名称,那么前面的图标还是要保持与未编辑时一致的,编辑时只需要将后面的文本置换为一个JTextField就可以了。然后为该JTextField注册一个键盘事件监听器,当输入Enter的时候,调用TreeCellEditor的stopEditing()方法,触发停止编辑事件。如果我们需要将编辑保存至数据模型中的话,就在stopEditing()方法中编写业务代码即可。

综上JTree这个控件实际上是一个完全遵循MVC架构的设计,甚至比MVC还抽象一些。JTree中只处理数据和显示的一些控制,例如判断当前节点是否能够被编辑的方法isPathEditable(TreePath path)等。数据模型完全可以委托为TreeModel来管理,之需要使用setModel便可以轻松地将JTree和TreeModel关联起来。而在其显示渲染上便是完全由TreeCellRenderer来接管的,只需实现一个类,该类实现TreeCellRenderer接口,重写getTreeCellRendererComponent(…)方法,便可实现完全自定义面板显示节点。抽象最高层的是,当节点为可编辑状态时,其渲染又交由TreeCellEditor接管了,在编辑节点时,TreeCellEditor的getTreeCellRendererComponent(…)方法便将完全接管节点的渲染工作,并且控制编辑时的动作,例如取消编辑和停止编辑之类的种种。这么看来,其实JTree只是提供一个壳子,通过其内部的TreeMod存储数据,外部的TreeCellRenderer和TreeCellEditor来控制其显示渲染和编辑渲染,给开发人员提供了一个可高度定制化的控件接口。

==========我还是分割线=========

本文的形成是如行云流水账一般啊,我也有点不知所云了,众位看官,能看则看,不能看则拉倒吧。JDK API文档在你家里叫你回家翻翻呢。

敢吗?

这是飞猪老师的一本设计的日记书,形式和《读库》老六倒腾的NoteBook有异曲同工的味道。是自己很喜欢的味道和风格,我们敢于向自己发问吗?我们总是在生活中跟某某人说道“我敢**,你敢吗?”,其实我们一直都很胆怯,胆怯到不敢向自己发问,如果有一天你每天向自己问一个这样的问题,你的回答不会迟疑,肯定的说“敢”。那么你确实已经很超脱了,为什么我们总是不敢这个不敢那个呢?是因为我们从小被教育成为乖乖男/女了吗?我们不敢打破别人给我们带上的紧箍咒吗?是的。

我们确实不敢,我们不敢让自己的身体受罪,不敢让自己活得有风险

  • 第52周—不忘革命本色,忆苦思甜七天,敢吗?不开空调,不开暖气,不洗热水澡,不使用电灯,不开车、不打车、不乘坐公共交通,你敢吗?我们已经习惯了目前生活中拥有的一切,我们每天上下班,乘坐公交或者出租,甚至开车,公司里头有空调和暖气,下班回家一个热水澡,再来点音乐和电影,如果有男/女朋友或者老婆/老公的童鞋们还可能有些XXOO的课外活动。生活不一定惬意,但是我们会觉得很自然,自然到我们都不曾想过要尝试去打破一些常规。一旦打破常规,我们将承受很多肉体上的不适,我们都不曾想。
  • 第49周,篡改你公司的LOGO,并将其作为邮箱的签名,你敢吗?KFC=>FCK,JUST DO IT=>JUST DID IT,CISCO=>DISCO等等,你是否曾经有过这样的想法。我想有过这样想法的人不在少数,我就曾经有过,SuperMap=>SuckerMap,记得公司入口处的LOGO牌有一次有个字母掉了下来,大家可以随意将掉下来的p随意放置在任何一个其他字母的上方,我发现每次我经过LOGO牌时,P的位置都是不同的,摆放的方式更是千奇百怪。我想大家的YY也就到此结束了,谁又曾敢将其作为自己邮箱的签名呢?
  • 第27周,给本.拉登写封信,发送到[email protected].当然这存在一定的搞怪成分在里头,可是关键的是,我们有过这样的想法吗?我没有,不过我觉得挺有意思的。

里头还有很多很多你不敢做的事情,更有你想都不敢想的事情。那么@flypig老师是想告诉我们什么呢?还是仅限于个人设计理念的体现和传播呢?我想作为一个个人色彩非常浓重的日记本确实能说明一些问题,@flypig老师肯定有想说的,博客上,twitter上,诸多活动上。我想飞猪老师可能就是想通过这个日记本告诉大家,我们其实可以更放肆一些,可以从不同的角度来看待头顶上的这片天空,我们可以看到晴雨变幻,也能看到彩虹,关键是你在什么角度去看。适时地作出改变,并且追随你作出的改变,持续52周,也许明年近日,你的想法,你的履历,你的生活,你的世界和去年可能有了一个很大的改变,不仅仅是年岁大了一轮,更多的是经历了诸多的不同。一年365天,我是活了不同的365天,抑或是活了1天+364天的copy的呢?这是一个很好的问题。

从现在开始,记录每天发生的不同,臆想中的不同,直至敢于去作出改变,突破小巷,来到十字路口,看着周遭飞快的车流,我们不能只是做一个交通指挥员,机械地摆动双臂,看人来人往演绎不同的故事。也许我们也可以投入车流,拐上一条无名小道……

又一次旅行

This is  a journey across the 2009 and 2010.

31日下午,跟公司领导聊了挺长时间,主要是关于自己的一个同学兼同事离职的事情。领导可能觉得同事的离职将会对我的情绪造成一定的不良影响,当然领导是对的,影响确实存在,而且也确实有不良的,当然也存在正面积极的作用。谈了好一会,看似达成了一致,“我暂时不会离开公司,对公司的前途看好,对自己的前途未卜,一切走着瞧”。

公司有一个不成文的规定,节假日前的工作日提前两小时下班,待我跟领导从会议室出来之时,那位待离职的同事已经等了我好一会了(目前正在办理离职手续,该童鞋与我同租一套房子,大学室友,挚友级别)。收拾完毕,与童鞋一起出公司,买了点食物和饮料,上公交,挤地铁,进站,候车。

来到北京西站之时,还只是18:00,从包中拿出最近正在读的《长尾2.0》开始这无聊但安静闲适的候车。时间到了上车,人不算多,找到地儿坐下,再次把书掏出来,继续…书读完了,没得看了。睡觉吧,遂迷迷糊糊地开始睡觉,期间醒过很多次,又重新睡着了很多次,斜对面坐着几个人,很是能侃。参与讨论的主要有,一对情侣,两个陌生女生,两名陌生男子,先是从地域聊起,因为现在是节假日,车上同行的人多是回家省亲之类的。故而绝大部分的乘客均是南昌人(Z67),这六个人之中就仅情侣中的女方是山东人。地域最大的差异一是天气,二是饮食,三是人。就这样天南海北地胡侃了很一会儿,大概侃到了凌晨1点半的样子(九点多开始侃的),而当时我手上也没有什么可以阅读的东西,移动设备就一个能接发信息和接打电话的古董手机,实在无聊之际,听听别人的闲侃也是很不错的,偶尔还能跟着乐一下呢。听着听着慢慢就犯困了,摇摇晃晃地睡了一路,快到南昌了。

窗外开始有点蒙蒙亮的感觉了,快7点了。天气阴霾,不见太阳,但是能清晰地看见铁道两旁的稻田中萌萌泛绿的油菜苗和红花苗,有些地就是这么荒着,但也多少有点水草,长势良好。顿时,感觉嘴里全是冬日田野中泥土的味道,想起小时候的这个时候正是下地里挖泥鳅的时候呢,掂个小桶,抗把锄头就出去了,弄得浑身是泥,回来的时候桶里也就一巴掌能数得清的那么几条小泥鳅,这时母亲又会开始唠叨“让你们出去闹,我都懒得给你们洗衣服”,然后一边还在数落一边已经把衣服放到水桶里头,拿出去洗了。

我喜欢南方的泥土,喜欢南方的水,更喜欢南方的雨,我的爱人在南方,我的哥们在南方,我的家在南方。我喜欢能扎根南方的感觉,喜欢能在夏日深夜,听见窗外蛙叫虫鸣,喜欢能在夏日雨天,听见老房子上雨水敲打瓦片的声音。

来到北京,实为不愿,更是无奈,如今北漂已有半年有余,不觉太累,也不觉有甚幸福,收获不小。我爱我的家乡,更爱我的家人,能跟家人生活在同一个节气中,感受同样湿度的空气和阳光,总是让我觉得很是幸福。我想我总是会离开的,北京,我不爱你。