Liudroid的博客 Posts

2016年7月11日,微信公众号“小道消息”发起了一个调查:你在工作中最不想用最讨厌的工具是哪一个?

我的答复是IBM Lotus Notes(简称Notes)、金山WPS系列、版本管理工具Firefly还有数据库Sybase。

Notes估计确实可以称作太古时期的软件了,不是因为有着27年的悠久历史,而是因为其“复古”范的UI,仿佛停留在上世纪90年代,让人很怀旧。登录界面你们感受一下:

notes_login

当然,界面什么的都是浮云,功能和使用感受重新吐槽如下。第一,占用内存大,动不动就几百兆内存没了,打开特别慢,老电脑都得等半天。第二,软件臃肿,功能太多太全,最常用的就是收发邮件和SameTime即时通信。其他功能我没用过,比如会议、日历、博客神马的。第三、Sametime经常出问题,比如不能输入文字,或者看不到发的图片,截图还不能截跟别人的聊天记录。没有聊天人的详细信息。第四,邮件那个列表标题我从来没有调整正确过,另外,收件人框里总是莫名其妙的多一些逗号。

再稍微吐槽一下WPS,爱国小将不要找我,我是支持国产软件的,但是你三天两头给我崩溃,然后安慰我说“已基本恢复现场”,我一看,编辑了半天的东西全都没了。另外,我咋就觉得有些功能MS OFFICE里有的,到了WPS里就找不到呢。。

其实,我觉得企业版WPS还是有潜力的。第一,政府支持,很多企业必须买,盈利可能没有问题。第二,虽然现在稳定性和功能还不能和MS OFFICE相比,但已经在缩小差距了,UI基本上已经持平了。最终WPS能不能成为和MS OFFICE项提名论的办公软件,就看WPS开发内部管理者对软件的战略规划,重视程度和质量要求了。

但是个人版的WPS,我只能呵呵了。我觉得,WPS个人版,你要么收费,要么真正免费,你搞的不时蹦出几个广告,还有启动特别慢,我就忍不了了。软件是一个以知识和时间为成本的东西,卖出一套就是赚钱的,卖给大众用户便宜点,现在很多人也都可以买。中国这么大市场,收到的钱应该不比广告费少吧。退一步讲,就政府和国企购买的WPS收入,还不够么?那也是纳税人间接花出去的钱啊。

版本管理工具Firefly估计大多数人都没听说过吧。和SVN有点像,但是操作感觉特别扭,不能建空的文件夹,文件夹也不能做版本管理,好像给文件改个名字也很麻烦。另外这个太经常卡死了。好像也不怎么更新了,官网也是上个世纪的样子,遇到问题都不知道找谁。

数据库Sybase不知道有人用过没,要是你用Sybase,出点问题,或者想做优化,你可真从网上搜不到解决方案。能搜到的帖子都可以追溯到上个世纪。还好,偶然从论坛下了一份官方的文档,大体读了一遍,遇到问题起码能去文档里找了。

作者Fenng收到了1000条留言,因为作者放出的留言也够多(从来没见哪篇文章的留言放出来这么多,还是可以设置某文章留言都是可见的?)我也能略见一二。

基本上分两大类,一类是国际大型IT公司的产品,像IBM,SAP等。一类是企业内部各种管理系统。而与此形成鲜明对比,受到大家喜爱的是各种互联网公司产品、MAC OS上的软件。后者以简洁、优美、具有良好的交互著称。

个人感觉可能企业软件之所以“难用”有如下几个方面吧。

  • 复杂度高

互联网产品的复杂度普遍比较低,多得是小而美的东西。像为知笔记、奇妙清单、各种互联网邮箱等。功能专一,通用性强,复杂度不高,可以慢慢打磨,仔细研究用户交互习惯等。

企业软件恰恰相反,功能点非常多,业务逻辑不但复杂,而且多不太通用。以我所在的国有大型商业银行为例,有几百个系统。以我所负责的系统为例,相关用户有:办理业务的普通公民、网点柜员、网点主管、分行业务管理员、分行系统管理员、分行运营管理部人员,分行专业人员,总行运营管理部人员。开发语言包含C、C#、Java。展现方式涉及Winform(WPF)客户端软件、Web系统、后台调度。而我们的这个系统,也仅仅只是冰山一角。

像teambition这种互联网产品,可能复杂度还是有的,复杂度比较高的,可能像阿里云那样的吧。但即使阿里云相关的所有系统,和世界500强企业的内部系统比,可能也不够复杂。我们只能感受到阿里云对客户的一个管理平台,阿里云对内部的产品,不知道是不是好用。。

Notes应该是有两把刷子的,比如对于二次开发的支持,对工作流的支持,对会务的支持,SameTime可支持分散在全球100个国家10万以上员工实时通信,还可以与邮箱地址关联。

  • 使用方式不同

互联网产品的使用,是产品提供什么功能,我就用什么功能。用户需要的功能没有,就不用这家的,换其他家的。因为我有选择的权利。听音乐我可以选网易云音乐,也可以是虾米音乐,还可以是QQ音乐、百度音乐。

企业产品不可选啊,都是做完了才知道好不好用。你医院一套HIS,厂家给你做完了,你嫌难用,换其他家?对不起,客官不可以。就是能换,又得花好几个月重新做不是?再说了,哪个企业系统不是个一期、二期、三期。你还能找别人做二期、三期咋地?

Notes这样的软件,我不知道全球还有几种,可能只此一家也不可知。你也可以说,我用网易邮箱和QQ也很好啊,要是公司规模达到1000人以上,会疯吧。就算不疯,也有一定的安全隐患,邮件、聊天记录都在别人的手里,稍有不慎可能公司名誉也会受损。所以,那些不能上互联网,只能在内网处理工作的企业,也用不了。

毕竟,企业其实最关心的还是功能有没有实现,这是核心。对于更高层次的要求,有更好,没有可以忍。

  • 盈利模式不同

互联网产品你得做好了才能卖出去啊。你得提前知道用户有哪些需求,找到用户“痛点”。另外你得做的好看,赏心悦目。你的交互方式得友好,因为你不友好,你的客户就回去寻找更友好的产品。

但是你不一定要提供售后服务,很多产品根本没有售后。这是与企业软件很大的不同。

企业产品:中标了、做完了、验收了,钱到手了。客官您说哪里不好用?这是按照您的要求做的。客官您说哪里不好用?您有更好的方案吗。客官您说哪里不好用?工期太紧,把功能做出来就不错了。客官您说哪里不好用?二期我们给您改。一个系统开发出来,可能需要1年,将这个系统做成精品,可能需要10年,早就不用了吧。

企业软件售后和维保是很重要。要说你做的东西宕机了,出BUG了,你马上过来改,1天改不完就扣掉多少钱。1周改不完尾款就没了。Notes不能用了,IBM高级工程师得马不停蹄的过来解决。

我们所接触的互联网产品,大多数还是针对个人的产品,针对企业的互联网产品,就少的多。针对特大型、超大型企业的互联网产品,我没听说过。像我们这种企业网和互联网严格物理隔离的企业来说。互联网产品和服务在企业办公中根本没法用。

生活随笔

本文翻译自比尔·盖茨的博客:gatesnotes

原文地址:https://www.gatesnotes.com/About-Bill-Gates/25-Years-of-Learning-and-Laughter?WT.mc_id=20160705180125_25-Years-of-Learning-and-Laughter_BG-FB&WT.tsrc=BGFB&linkId=26235361

原标题:25 Years of Learning and Laughter

以下是正文翻译:

对于大多数朋友,我记不起我第一次见到他们的准确日期,但是我记得和沃伦·巴菲特第一次见面的时间。那是25年前的今天:1991年7月5日。

我想这个日期在我脑海里如此清晰的原因是它同时也是一个新的意外的关系的标志,在我和梅琳达之间。这个女人用所有可能的方法使我们的生活变得更好。(译者注:应该是指梅琳达·盖茨,比尔·盖茨的妻子)

沃伦帮我们做了两件这辈子怎么做都不够的事:不断学习、不断快乐。

在过去的四分之一个世纪里,我们俩一起学了很多、收获很多欢乐。梅琳达和我经常感受到沃伦分享给我们的智慧的精华,又或是当我们想起他做的有趣的事或说过的有趣的话我们就会笑。

盖茨的博客之VR

这是一个虚拟现实(VR)的短片,如果你在观看它的时候带着VR头盔效果会最好。把这个超链接通过电子邮件发送到你的手机上。(学习如何在比尔·盖茨的博客上体验VR)当然你也可以通过单机下面的箭头,在浏览器上360度观看短片。

(有个短片我弄不过来啊,想看的可以去源地址观看,放个静态照片吧,是关于盖茨和巴菲特见面的视频,360度的,可以用VR眼睛观看)

Gates and Warron
Gates and Warron

 

一个尴尬的开始:乍看上去,我和沃伦不太搭:我是一个科技极客,他是一个从不用电子邮件的投资者。事实上,我从来没想到过我们会成为朋友。

1991年,当我的妈妈让我在胡德海峡的度假屋和包括沃伦在内的一些朋友见面时,我是拒绝的。我跟妈妈说我工作太忙了。她坚持说沃伦应该是是一个有趣的人。显然我不这么认为,“你看,他只是买卖一些纸片而已,并没有什么增加实际的价值,我想我们不是一路人”我跟她说。但最后我还是被她说服去了,我答应她在回微软工作前可以停留不超过两个小时的时间。

然后我就跟沃伦见了面。他一开始问了我几个有关软件的商业问题。还有为什么像微软这样的小公司能和IBM竞争,我们的优势和定价如何。这些精彩的问题从来没有人问过我。我们很快就陷入了长时间的交谈,忘记了时间飞逝。他给人的印象不像是一名投资者。他用这种谦逊的态度告诉别人他是做什么的。他很有趣,但是最让我印象深刻的是他是如此清晰地思考世界。经过我们的第一次谈话,我们就有了不错的朋友关系。

奥利奥早餐:一件让我很惊讶的关于沃伦的事是他从六岁开始就一直坚持吃自己喜欢吃的东西。当然他不吃婴儿食品,但是他经常吃汉堡、冰淇淋和可乐。(这就是为什么跟他出去吃饭跟有意思的原因。)我记得他第一次住在我们家就打开了一包奥利奥作为早餐。我的孩子们马上表示他们也要吃。沃伦也许对年轻人作了一个不好的榜样,但这就是对他起作用的食品。

“沃伦,我们喜欢你的餐厅,哈哈”。当沃伦第一次邀请我和梅琳达去他在奥马哈市的房子的时候,他带领我们参观了一下。当我们进入他家的餐厅的时候,发现餐厅的椅子都不带座。沃伦也很惊讶。他边说边去检查椅子。最后,他想起来了,在重装椅面之前几个月,坐垫就被拿走了,但是他丝毫没有察觉。(他以前一定是在厨房里吃的奥利奥和冰淇淋)。从此这个场面就一直被我们笑话。

要想得到世界级的建议,请拨2:在我的办公室里,只有两个速拨号码,我家里的和沃伦的。如果沃伦有空接听我的电话,我这一周就精彩了。我源源不断地从他身上学习。我们喜欢谈论公司、政治、世界时事和创新。从具有不同背景的人那里学习是令人兴奋的。对于同一件事,他从经济投资角度出发,我更多的从科技角度出发。作为我们基金的受托人,沃伦是我和梅琳达杰出的思想伙伴。当我们面对困难的时候,我们就问自己“这时候沃伦会怎么做”。这种方法往往可使我得到最好的答案。沃伦和我基本上属于同辈,但是他比我有智慧太多,他就像父亲那样指导着我。

感情投资:由于他在商界精明的投资,沃伦得到了“奥马哈市先知”的称号。但是对于人们的投资,他有着同样的回报。我经常惊讶于他是怎么让人们在一起,让他们乐于向自己学习的呢?虽然他有着忙碌的行程单,沃伦总能找到时间同我认识的几个朋友培养友谊。他拿起电话跟我们说你好。他通常给我们推荐他在邮件里看到的文章,他觉得我和梅琳达有可能会对这些文章感兴趣。

过去的25年我从沃伦身上学到很到,但是最重要的是我们的友谊。这关乎你希望你的朋友是什么样子,你就要做到什么样子。能拥有像沃伦这样睿智和谦虚的朋友,是每个人的幸运。他用自己的方式使人们感到快乐,并且分享他生活的乐趣。

直到今天,每次我去奥马哈市(当我能去的时候我都尽量去)沃伦总是亲自去机场接我。

这是一个小小的动作,但是对我来说却是整个世界。我总是很耐心的等待飞机门打开,因为我知道沃伦在等我听他讲新的故事和有趣的事,然后我就又能快乐的向他学习。

谢谢你,沃伦,这是精彩的25年,我期待着在以后的日子里能和你有更多美好的回忆。

我的翻译

计算机和互联网行业的新名词、新概念、新技术真是层出不穷。作为一名金融机构软件开发人员,最近听的最多的就是“区块链”技术。稍微了解了一下,技术细节也不是很明白,简单说一下我对区块链的理解吧,不对的地方请不吝赐教。

比特币(Bitcoin)大家应该都听说过,是全球互联网最有名的一种数字货币。其具有货币的若干属性,比如匿名性、防伪性、具有一定发行量等。互联网上有一些商家支持比特币付款,甚至有一些大的比特币支付网站(例如BitPay),甚至PayPal也宣布支持比特币支付。国内也有一些比特币支付网站。我亲身经历的例子是著名的VPS提供商vultr.com也支持比特币支付购买VPS。

区块链技术(Blockchain)是比特币的支持技术,诞生自比特币,但是现在看来应用要火于比特币。本文主要谈论的比特币中的区块链概念,可以被称为区块链1.0概念,最近大火的区块链应用前景较多,可以算作区块链2.0吧。

区块链技术的核心思想是分布式账本(Distributed ledger)。即网络上的每一个节点,都保存一个完整账本。一个完整账本记录这个交易系统所有发生的交易明细。以比特币交易系统为例,每一个节点保存比特币从开始出现到现在每个参与人每一笔的交易记录。是的,这是一个大账本。每一个节点保存的完整账本内容都是一模一样的,账本中已经存在的记录是不允许修改的,只能增加记录。

bc-network

区块链技术顾名思义,是有一个一个“区块(Block)”组成的链式数据结构。区块的大体结构如下:

BC-Block

简单来说,一个区块包含指向上一个区块的“指针”,还包括若干条交易记录。一个区块链代表上一段所说的一个账本。

BC-Chain

这样,因为交易记录不允许删除,只要顺着区块链从后往前找,所有的交易都有据可查。又因为总帐本是公开,且每个节点都有一份的,所以交易双方都无法抵赖,甚至无法撤销。区块链技术是记账的基础,也是交易的基础。

比特币交易规则:

交易发起人将一条交易记录发送给交易接收人,同时广播给若干网络上的节点(矿工)。打个比方,张三要给李四500块钱买李四的一头驴,除了跟李四说:“我要给你500块钱买你一头驴”之外,还要跟周围的人大喊:“我要给李四500块钱买他一头驴,大家给我作证啊”。于是张三、李四、周围所有人都会掏出账本,把这笔账记上,从此张三少了500块钱,李四多了500块钱。过后,李四如果跟大家说,张三没有给过我钱,拿出大家的账本来看看就行了,所有人都记录了这笔账,无法赖账啊。

当然,真实的情况要复杂的多,要验证付款人的真实性、验证付款人余额是否足够能问题。当然还有军工级加密机制做保证。

矿工与挖矿:

比特币交易能够被确认有效,区块链能够正确的组成,全靠矿工的工作了。可以把矿工理解为图1种的一个节点。或者上面例子中除了张三、李四之外的一个人。这个人除了自己买卖东西外,还有挖矿这个辛苦的工作。这个人会听到张三的喊话,把账本翻到最后一页(最后一个Block),记录下这笔交易,然后做一个很变态的事。就是根据账本最后这页的内容,算出一个特别难算出来的数,基本上就是算很久加上碰运气才能算出来的数。

同时有很多人会听到张三的喊话,他们都是矿工,都会记账和算那个变态数。谁先算出来,那就牛逼了,比方说王五算出来了,大喊一声,我算出来啦!然后把最后一页账单复印给大家看,大家只能放下手头的工作去看,大家一看你算的对,内容也没有问题。就把这页账单作为自己账本的最后一页,表明承认这页账(BlockChain中加入一个Block)。然后系统奖励给王五50个比特币作为工作酬劳。我们说,王五挖到矿了。

比特币也不是完美的

1、总帐本越来越大,下载和存储要求越来越高。现在有机制压缩账本,并且可以对账本进行分割,甚至可以下载部分账本。如果账本的增长速度快于硬件的发展速度,那么这个问题会越来越严峻,如果不如硬件发展速度,对于未及时更新的硬件也是一个挑战。

2、交易确认时间长。一笔交易要写入区块并得到确认,一般都需要10分钟以上。

虽然比特币不是完美的,但是好不影响其颠覆性创新的性质,作为一种新型数字货币,能做到如此完备已经相当值得学习了。

参考:

http://blog.codinglabs.org/articles/bitcoin-mechanism-make-easy.html

https://www.gitbook.com/book/yeasy/blockchain_guide/details

http://www.jianshu.com/p/4cf6776fbb30

https://www.zhihu.com/question/37290469

http://blockchaindev.org/article/introduce_blockchain.html

https://en.bitcoin.it/wiki/Block

技术杂谈

一觉醒来,下午的阳光伴随着稀疏的树影照进朝南的大主卧,脑袋昏昏沉沉的,温度暖暖的,我半睁着眼睛,慵懒的在大床上翻了个身,享受这这难得的什么都不用担心,无比安心的时光。

这种感觉何其的熟悉又遥远,仿佛时间又回到了十多年前,那个周末的下午,同样的我在同样的地方,一觉醒来,满满的幸福。

这是我的家,我的老家,一个20年的家。这个房子所在的小区现在已经破旧不堪,小区是县城里最早的四层小楼,父亲单位的家属楼,没有围墙,粉红色的外墙颜色已经脱落,门口道路两旁长满了杂草。家里已经10年的装修也快撑不住了,木板都已经开胶。不过,这一切都是温馨的。这是一个快30岁的人的感觉,15岁的时候我敢肯定是没有这样的感觉的,因为有了15年的经历,也有了记忆的铺垫。

那时候的爸妈还年轻漂亮,那时候的奶奶身体不错,他们是我的整个世界。我真想这一觉我穿越回去了。

我想这就是家的感觉吧,这就是在家里最好的感觉,是家给你的别的特殊的感觉。即使我在北京买了自己的房子,也从来没有过这样的感觉,因为总怕一觉睡的太多,因为有太多的事情等着我去做,因为时间不太够用。周一到周五是工作时间,周末是各种琐碎的事情。仿佛事情从来就是无止无休的,旧的没完,新的又来。很多时候,我都定义生活就是累着、活着。

直到回到家,我才认识到,谁不累呢,爸妈这个年纪了,更累。

直到回到家,我才感觉到,不累,怎么发现的了,这个家的美好。

生活随笔

首先感谢姜同学给我推荐的此书《遥远的救世主》,我也向大家推荐此书。

这本书我连续读了两整遍。

第一遍是快速阅读,书中很多地方没看懂,而且也没记住多少。只是感觉看完了有一种难以名状的震撼。

第二遍看的稍微仔细了一点,虽然依旧有很多地方不太懂,但是心情稍微平静了些许。

这本书的主题很宏大,大到一个民族的“文化属性”,一个社会的意识形态,一个国家的道德、法律、经济。但是这本书又从一个村子、十几个人的工作生活讲起。故事引人入胜又发人深省,我想这就是一本好书的标准吧。

之前我从来没有思考过这样宏大的问题,也没有能力从这么高的高度去思考问题。如果不是看这本书,可能我永远不会有这个机会去知道这样的问题对亿万人的影响有多么大,也就不能深刻理解民族层面的文化和国家层面的经济与普通民众之间是怎么发生关系的。

就像书里比喻的,我就像是一只井底的蛙,偶然的机会,爬到了井边,看了一眼外面的世界。

 

一点杂乱的想法,供大家批评指正:

1、丁元英如此奇才的人,全书也只有小丹才能有同样的高度。他们两个的思想高度,周围的人需要高山仰止。元英犹如冷峻的雪山,高耸挺拔,令人望而却步。小丹犹如开满绿树的高山,巍峨雄壮,滋养万物而不动摇。两个人在交往的过程中,都是相互促进,相互影响,相互提高的,我甚至觉得,可能元英因为小丹得到的更多。

2、小丹要的礼物,元英给的礼物,这可是大礼物,怪不得韩总在五台山倒吸一口凉气。与其说这个礼物是给小丹的,不如说这个礼物是给这个国家的、给这个民族的、给这个社会的。

3、肖亚文是最大的赢家,有能力有魄力,但是总是感觉这个配角太配角了,有点精明,不太像是一个有血有肉的女人。而且最开始她这么说我不太理解:是魔、是鬼都可以,就是不是人。他跟人的思维颠倒了,不是人的思维。一旦动了心就算把地狱之门打开了。以肖亚文看透事物本质的能力,不该说出这样的话,不是作者有意吸引读者,就是作者塑造的肖亚文这个形象是变化的。

4、谁能跟我说一下,一个人精通儒道释和基督经典,是怎样一种体验。我是理解不了书中如此多的关于儒道释神的内容,不敢妄加评论。如果作者真的有如此高的成就,那我就更佩服了。

5、其实丁元英的神话,一点都不容易做到,作者拿格律诗这个例子稍微有点牵强,小丹觉得丁元英只不过是按照规律办事,感叹让人做到实事求是很难。其实,换做任何一个人都做不到,只有丁元英能做到。为什么?因为丁元英的智商、丁元英的眼界、丁元英的经验、丁元英的奋斗、丁元英的机遇、丁元英的人脉,别人没有,这是他三十年的积累,才能想出来的点子。别人想做到“按规律办事”都难,即使知道了规律是什么,没有以上种种也成不了神话。举个例子,冯世杰,假使他会时间倒流,没有丁元英,冯即使经历过一遍历史,也未必能重新演绎。

但是我是不反对本书的主旨的。(主旨是不是:从来没有什么救世主,全靠我们自己^_^)

 

凌乱的书摘:

1、《自嘲》

本是后山人,
偶坐前堂客;
醉舞经阁半卷书,
坐井说天阔。

大志戏功名,
海斗量福祸。
论到囊中羞涩时,
怒指乾坤错。

2、丁元英说:“如果是骆驼穿针的天堂,我敬仰他们,因为我做不到”

3、一个民族最强调道德的时候,正是这个民族道德最沦丧的时候。

生活随笔

先说编码(encode)

所谓的汉字编码,就是将一个个汉字,翻译成一个个字节(byte),进一步讲,是将一个字符串(String、char),转换成字节数组(byte[])。字节数组其实在各种编程语言中,用的地方还挺多,主要用在I/O方面。我们常说的二进制数据,在Java中,基本上可以等同于字节数组。所以,不论是序列化、文件操作、网络传输二进制流、输入输出二进制流,都会用到字节数组。

再通俗一点讲,汉字编码就是将一个汉字字符翻译成机器能识别的二进制数据。(非汉字同理)

主流的编码方式如下:

  • ASCII 码

学过计算机的人都知道 ASCII 码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等;32~126 是打印字符,可以通过键盘输入并且能够显示出来。

  • ISO-8859-1

128 个字符显然是不够用的,于是 ISO 组织在 ASCII 码基础上又制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1~ISO-8859-15,其中 ISO-8859-1 涵盖了大多数西欧语言字符,所有应用的最广泛。ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。

  • GB2312

它的全称是《信息交换用汉字编码字符集 基本集》,它是双字节编码,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。

  • GBK

全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。

  • GB18030

全称是《信息交换用汉字编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与 GB2312 编码兼容,这个虽然是国家标准,但是实际应用系统中使用的并不广泛。

  • UTF-16

说到 UTF 必须要提到 Unicode(Universal Code 统一码),ISO 试图想创建一个全新的超语言字典,世界上所有的语言都可以通过这本字典来相互翻译。可想而知这个字典是多么的复杂,关于 Unicode 的详细规范可以参考相应文档。Unicode 是 Java 和 XML 的基础,下面详细介绍 Unicode 在计算机中的存储形式。

UTF-16 具体定义了 Unicode 字符在计算机中存取方法。UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。UTF-16 表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java 以 UTF-16 作为内存的字符存储格式的一个很重要的原因。(只能说绝大多数情况下是这样,后面有说明)

  • UTF-8

UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。而 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。

UTF-8 有以下编码规则:

  1. 如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 – 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
  2. 如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
  3. 如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节

 

要了解Unicode就要了解UCS-2/UCS-4,还要了解BOM(Byte Order Mark)和BE/LE(Big Endian/Little Endian)。详细内容可读(http://blog.charlee.li/unicode-intro/)我这里只说一下结论吧:Unicode和UCS-2/UCS-4只是规定了字符用那些字节表示。UTF-8/UTF-16以及BOM才决定了字符在内存中真正的存储方式,真正的用什么样的字节存储,当然真正存储的时候,是需要根据UCS-2或UCS-4计算出的。

严格来说:UTF-16和UTF-8都是变长的,UTF-32才是定长的,UTF-16并不总是两个字节表示一个字符,UTF-16还可以表示UCS-4标准的字符,那个时候占用4字节,但是这一点基本上在开发中被忽略了,基本也可以被忽略。UTF-32之所以是4字节定长,是因为它完全用来表示UCS-4。

小插曲:四个“龍”字以田字形布局组成的一个汉字大家都没见过吧,但是确实在Unicode中有这个字,他用UTF-16存储就是4个字节。

我们常用的汉字,UTF-8是三字节,常用的英文字符,UTF-8是一字节。我们常用的汉字和英文字符,UTF-16都是双字节。所以UTF-8不一定比UTF-16省空间和流量,UTF-8比UTF-16更适合于网络传输的原因是,当丢失单个字节时,不会引起连锁的解码错误,而UTF-16丢失一个字节后,丢失位之后的所有字节解码都会出错。但是UTF-16占用空间更少,易于处理,所以UTF-16一般作为内存存储的编码方式。

 

再讲解码(decode)

解码是编码的反操作。如果说编码是将地球文字翻译成太阳文字,解码就是将太阳文字翻译成地球文字。

实际上,解码是将字节数组(byte[])按照源编码格式,翻译成汉字,或者翻译成另外一种编码格式的过程。

 

1、在编辑器中,如果你正在写一个.java文件,你点了保存或者Ctrl+S,这个内存中的java文件就要落地到磁盘上,这时候,系统必须要以一种编码格式对这个.java文件中的所有字符进行编码,才能翻译成二进制保存到磁盘上。

咱们编程都是英文编的,一般用任何编码方式都没什么问题。但如果你有一个变量String s=”一段中文”,这四个中文字符的存在,对文件编码格式提出了要求,可能会引起乱码。

默认情况下,保存是以操作系统的默认编码保存,一般中文操作系统是GBK。

(像notepad,可以保存成UTF-8,但是一定要保存成无BOM格式。)

理论上,java源文件,可以保存成任何编码格式,当然,如果有中文,这种格式必须支持中文,比如保存成GB2312\GBK\UTF-8\UTF-16都没有问题。

2、编译的时候。

用javac编译,是将.java文件的内容取出来,编译成.class文件。所以编译的时候,编译器得知道我之前.java文件是用那种编码方式进行的编码,如果不知道,取(解码)的时候,可就乱套了。我们可以运行一下javac -help命令,其中有一个参数-encoding就是干这件事的,官方解释是:指定源文件使用的字符编码。

如果不指定,则默认使用操作系统编码,一般中文操作系统是GBK。现在我们一般编程的时候,都会指定源码为UTF-8格式,用javac直接编译就会报错,错误提示一般是“编码GBK不可映射字符”或者“未结束的字符串面值”。那为什么我们一般很少遇到这种情况的,因为eclipse中,编译时的编码格式与文件格式一致,所以不会出现问题。这就是IDE为我们做的工作。

按照指定的源字符编码对二进制数据进行解码,这里解码后,不是用来输出,是马上用Unicode编码进行编码。Java编译的字节码文件,也就是.class文件中,所有的字符都是Unicode编码(实际是UTF-8)。这样,所有字节码文件就有了统一的,可支持全球语言的文件。

3、内存中

JVM加载.class文件的时候,就以Unicode编码方式加载就好了,汉字在内存里也是unicode方式存储的。这里实际是用UTF-16,估计是因为Java中的char数据类型都是双字节的吧。

实际上,char数据类型,在JVM中的标准就是UTF-16(无BOM)。String类型的实际存储是UTF-16BE。

4、使用时

无论我们是读取磁盘上的文件,还是读取网络传过来的数据流,我们必须知道他们正确的格式。并给我们的程序指定具体的解码类型。比如我有一个GB2312保存的本地文件,我用JAVA程序去读取里面的内容,起码我就得知道我应该用GB2312去解码,然后JVM会将解码后的字符串,转换成Unicode(UTF-16)。

当我们不知道源文件或源字符编码格式时,最好不要手动解码再编码,很有可能这个过程再也不可逆了。乱码了再也退不回的情况,我们在保存文件的时候经常遇到。(撤销操作另外,这里指再保存回原来格式的文本文件,乱码依然存在或者更严重)

5、JavaWeb开发时

说了这么多基础的知识,真到JavaWeb开发的时候,用到的可能性不大,除非是真的解决不了的编码问题,可以思考原理。

JavaWeb开发中一般需要注意的地方有这么几个:

  • 所有的Java、JSP、XML等源文件都用UTF-8格式保存。
  • XML文件头行设置<?xml version=”1.0″ encoding=”UTF-8″>
  • JSP设置编码格式<%@page contentType=”text\html; charset=UTF-8″%>
  • HTML中加入<meta HTTP-equiv=”Content-Type” content=”text/html; charset=UTF-8″/>
  • 用框架的话设置框架的编码方式为UTF-8
  • 获取表单参数之前调用request.setCharacterEncoding(“UTF-8”)
  • 设置中间件(如Tomcat)Connector的URIEncoding=”UTF-8″

一般设置前四项都不会有问题。

参考:

http://lukejin.iteye.com/blog/586088

http://www.zhihu.com/question/30945431/answer/50046808?group_id=590118722086309888

http://www.zhihu.com/question/23374078

http://blog.csdn.net/scyatcs/article/details/31356823

http://cnn237111.blog.51cto.com/2359144/1080628

http://blog.sina.com.cn/s/blog_63597c6901012oyf.html

http://stackoverflow.com/questions/2164804/from-compilation-to-runtime-how-does-java-string-encoding-really-work

https://zh.wikipedia.org/wiki/UTF-16

https://zh.wikipedia.org/wiki/UTF-8

http://blog.charlee.li/unicode-intro/

Java

跟绝大多数人一样,我喜欢听歌。

跟一部分人一样,我特别喜欢听老歌,特别是八九十年代的歌曲。

有人说,不是我们喜欢听老歌,是我们喜欢听的歌老了。

有人说,喜欢听老歌,是因为我们接受新事物的能力下降了。

也有人说,是因为那些歌曲优秀的本质,使得他们能被流传。

他们说的都有道理,也可能都是我现在越来越喜欢老歌的理由之一。

但是对于我来说,最重要的是,她们的旋律一响起,我总能响起我的童年。我父亲是他们那一辈的长子,我出生的较早,我小时候,姑姑叔叔都很年轻,也都很宠着我。到现在也是都很让着我。所以我的童年很美好。那时候,他们听的,就是这些现在的经典歌曲,我也是跟着听过来的。

童年我住在镇上,家里开了个小饭馆,包间里面有类似现在KTV的唱歌功能,一个电视,两个音箱,还有功放、CD机,歌曲是通过放CD唱片播放的,吃着饭,喝着酒,唱着歌。现在没有这样的了,这就是那时候的时尚。一听老歌,我就想起小时候的小饭馆,想起那些天天听的歌曲。想起我的最爱:焖饼。想起我一个小孩吃比一个大人吃的多的焖饼时,父母和奶奶也不管我,只是疼爱的说我两句的场景。没过多久,我就跟吹气球似的变成了一个小胖墩。还好现在瘦下来了。

还有一点,听老歌,不仅是听,仿佛我还能闻到老歌的味道,感受老歌的灵魂,那些歌听起来感情是那么的饱满。那些歌,或甜蜜、或悲伤、或愉快就仿佛在跟我们将故事。声音也特别的干净。也不全是爱啊、情啊什么的。像走四方、鲁冰花、冰糖葫芦、中华民谣等老歌。书记每次去KTV都唱的《不能这样活》我也很喜欢。情歌也特别好:弯弯的月亮、潮湿的心等太多了不说了。我最喜欢的还是含笑老师唱的《飞天》。

飞天

作词:席时俊

作曲:万军

原唱:含笑

如果沧海枯了,还有一滴泪

那也是为你空等的 一千个轮回

蓦然回首中 斩不断的牵牵绊绊

你所有的骄傲 只能在画里飞

大漠那落日下 吹萧的人是谁

任岁月剥去红装 无奈伤痕累累

荒凉的古堡中 谁在反弹着琵琶

只等我来去匆匆 今生的相会

烟花 烟花 漫天飞 你为谁妩媚

不过是醉眼看花 花也醉

流沙 流沙 漫天飞 谁为你憔悴

不过是缘来缘散 缘如水

烟花 烟花 漫天飞 你为谁妩媚

不过是醉眼看花 花也醉

流沙 流沙 漫天飞 谁为你憔悴

不过是缘来缘散 缘如水

大漠那落日下 吹萧的人是谁

任岁月剥去红装 无奈伤痕累累

荒凉的古堡中 谁在反弹着琵琶

只等我来去匆匆 今生的相会

烟花 烟花 漫天飞 你为谁妩媚

不过是醉眼看花 花也醉

流沙 流沙 漫天飞 谁为你憔悴

不过是缘来缘散 缘如水

烟花 烟花 漫天飞 你为谁妩媚

不过是醉眼看花 花也醉

流沙 流沙 漫天飞 谁为你憔悴

不过是缘来缘散 缘如水

烟花 烟花 漫天飞 你为谁妩媚

不过是醉眼看花 花也醉

流沙 流沙 漫天飞 谁为你憔悴

不过是缘来缘散 缘如水

最近几年创作的歌曲,真的很少有能让我有类似的感觉。但是我不会评论不好,再过多少年,他们也会变成很多人耳朵里的“经典老歌”。

老歌,百听不厌。

生活随笔

一般情况下,我们访问一个Action,返回一个success,展示一个JSP页面。用的方法是:

<result name=”success”>/WEB-INF/pages/login.jsp</result>

这里result标签的type属性默认是dispatcher。正如官网所说:

If a type attribute is not specified, the framework will use the default dispatcher type, which forwards to another web resource. If the resource is a JavaServer Page, then the container will render it, using its JSP engine.

其实<result>标签有很多配置项可配置,如果我们想实现某个功能,或者解决某个问题,很有可能struts2已经想到了。

我有一个需求:一个Action当返回结果是error时,跳转到另一个Action(1、改变URL。2、为了SiteMesh对两个Action有不同的装饰需求),并且还传一个message进去。按照网友一般的办法,这样是极好的,并且没有乱码的:

<result name=”error” type=”redirect-action”>

<paramname=”actionName”>login.action</param>

<paramname=”message”>${message}</param>

</result>

但是不知道为啥,我的message接受过来,始终是乱码。后来经过一番查找和实验,发现Tomcat默认编码方式不是我的UTF-8,是ISO-8859-1。这样修改一下:

<Connector port=”8080″ protocol=”HTTP/1.1″
maxThreads=”150″ connectionTimeout=”20000″
redirectPort=”8443″ URIEncoding=”UTF-8″/>

问题解决。

当然,常规的避免乱码的方式都得有。网上一大堆,就不介绍了。

推荐:

https://struts.apache.org/docs/result-types.html

http://www.cnblogs.com/justbeginning/archive/2013/06/02/3113843.html

Java

用尽各种办法,最管用的还是下面这一种。

优点:

1、404、500都能正确跳转。包括找不到Action、找不到ActionMethod、throw Exception、Throwable。

2、500可输出错误信息。

3、与sitemesh整合没有问题。

4、可替换Struts2和Tomcat的错误页面。做到真正自定义。

配置:

Web.xml

<error-page>

<error-code>404</error-code>

<location>/error404.jsp</location>

</error-page>

<error-page>

<exception-type>java.lang.Throwable</exception-type>

<location>/error.jsp</location>

</error-page>

 

404页面可为静态的页面,没有错误信息,可自定义。

500页面如下:

<%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%>

<%@ page isErrorPage=”true” import=”java.io.*”%>

<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>

<%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt” prefix=”fmt” %>

<%@ taglib prefix=”s” uri=”/struts-tags”%>

Message:

<%=exception.getMessage()%>

StackTrace:

<%

StringWriter stringWriter = new StringWriter();

PrintWriter printWriter = new PrintWriter(stringWriter);

exception.printStackTrace(printWriter);

out.println(stringWriter);

printWriter.close();

stringWriter.close();

%>

以上页面都可以自己美化。

———————–

自己还试过的方法有:

1、struts2的声明式错误处理。

2、通过default-action-ref的作用来检测找不到的action,从而跳转到404页面。

以上两种方法都不好。第一种方式比较繁琐,而且有些错误捕获不到。第二种只能用于action,其他资源不能用。

<package name=”default” extends=”struts-default”>

<default-action-refname=”notFound”/>

 

<global-results>

<resultname=”error500″>/WEB-INF/pages/error500.jsp</result>

</global-results>

<global-exception-mappings>

<exception-mappingresult=”error500″exception=”java.lang.Exception”></exception-mapping>

</global-exception-mappings>

<actionname=”notFound”>

<result name=”success” type=”redirect”>

<param name=”location”>error404.jsp</param>

</result>

</action>

</package>

 

PS:多次事实证明,要解决技术问题,度娘还是不给力。

推荐几个网址:

http://www.avajava.com/tutorials/lessons/how-do-i-create-a-jsp-error-page-to-handle-exceptions.html?page=1

http://www.avajava.com/tutorials/lessons/how-do-i-create-a-jsp-error-page-to-handle-particular-error-codes.html?page=1

https://struts.apache.org/docs/home.html

Java

我其实脾气不怎么好,爱冲动,生气来的快,去的也快,典型的白羊座男生。但是以前控制的还不错,不知道什么原因,最近脾气有点大,气来的特别快,去的特别慢。这跟以前的我,也就是2个月之前的我大不一样,我自己是能感觉到的。为了不影响与同事、朋友的感情,我进行了自省。

这次自省我认识最深刻的,就是思考了“严以律己,宽以待人”这个成语,在现实生活中的应用。严以律己,宽以待人,多么简单明了的一句话,是那么的精炼。可是精炼意味着内涵丰富,意味着如果只背过这一句话,或者总是把他们挂嘴边,写到作文里,那是最这句话最不负责任的应用。而以前的我,恰恰在不负责任的用着这些经历了时间考验的成语。以前,我总以为,我是个很宽容的人,我对自己要求高,我对别人要求低。事实证明,我错了。工作之前,我没有生活压力,父母对我是无条件的爱,我的社会经验为零。工作之后,我才发现,“严以律己,宽以待人”和我很不搭边。

我是怎么这么深刻的认识到这个问题的呢?换位思考。有一天我在工作的时候,因为一些小事,我突然感觉很生气,过了一会,我平静下来,仔细想了想为什么生气。更重要的是,我想了想如果是别人,如果是我的领导遇到和我一样的事,他们会怎么做,他们会生气吗?我发现他们不会生气,他们一般会开玩笑般的提一下而已。或者把某些别人做的不好的地方开个玩笑。

现在我觉得,不管是生活中,还是工作中,沟通不顺,价值观差异,男女差别,家庭等各个环节的不同,都会对某件事产生一些误解、信息延迟。人无完人,每个人都会犯错误,每个人也都有优点。别人如果犯了一个错误,甚至经常犯某些错误,我们都应该明白,如果能原谅,并用友好愉快的方法去提醒,那是极好的。更何况,我们都这么大了,身边的人,有些东西可能这辈子都无法改变。

但这不是为自己的错误开脱的理由。江山易改,本性难移,但是可以移,哪怕移的慢一点。有些我们不经意的动作,不经意的话都会给别人带来不愉快,给别人带来不愉快就是给自己带来不愉快。

生活中,我们能发现一些人宽以律己,宽以待人,他们往往幸福指数比较高,人缘较好。我们也能发现一些人严以律己,严以待人,这种人做事认真负责,领导器重。我们还可以发现一些人,宽以律己,严以待人。当然,最珍贵的人,是严以律己,宽以待人的人。往往最后一种人,是情商较高的人。

有一些职业的人,在运用这个成语时,得看情形用。他们是:军官、教师、领导。军官在训练士兵时、教师在教导学生知识时,领导在对待下属工作时,严以待人能帮助人。在生活中,或者工作时间私下里,再宽以待人,想必效果更好。

生活随笔