tag:blogger.com,1999:blog-14522460188525421142024-03-26T12:32:17.157+08:00貉之丘我在寻找一丘之貉,是你吗?superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.comBlogger215125tag:blogger.com,1999:blog-1452246018852542114.post-14920069426935894542024-03-06T18:35:00.002+08:002024-03-06T18:35:28.269+08:00wallhere上那个同名账号跟我没关系<p>特此声明。</p><p>不知道是哪位大神跟我用一样的ID?</p>superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-76435033707136989082024-02-29T17:09:00.005+08:002024-02-29T17:21:29.444+08:00叫网约车叫到了奔驰<p>上周一晚上下班,上海有点飞毛毛雨,于是叫了网约车回家。<br />很快就来了一个车,我一看车型,吓了一跳——「奔驰GLC」。<br />我也就是选的最普通的「经济型」而已,看到车型我还特地再去确认了一下,没有勾选错类型。等车来了后定睛一看,还真是一辆黑色的奔驰SUV。</p><p>上车以后,我小心翼翼地问司机大哥为什么用这个车来跑网约车。司机是个斯斯文文的中年人,轻轻叹了口气,说开酒店因为疫情而破产了。<br />我一开始还有点拎不清,说用这车跑网约车成本有点高啊。司机大哥又补充说,他开网约车并不是出来赚钱,是因为呆在家里抑郁下去怕出事,出来开车转转散心。网约车只是顺便。今天刚注册的账号,我这一单是他生涯第五单。<br />这个时候我才回过神来,也想明白了。话说人能从抑郁状态下走出来也是挺不容易。大哥车开得很稳,开口欲望不低,感觉他挺需要跟人聊聊,于是后来我就陪着他聊了 一路。</p><p>司机大哥说他来上海十几年了,以前在高青路恒大水产市场那边做批发生意,赚了一笔钱。恒大水产市场关闭了以后,他也不愿意跟着其它摊位搬迁,于是就自己出来开酒店,又赚了一笔。后来2019年他一口气在上海各处开了五家酒店,最大的有九百平方米,还包括一座六百平方米的「会所」。用他自己的话来说「步子迈太大了」,再后来发生的事情大家应该都知道了……</p><p>我一开始以为他说的「酒店」是「Hotel」,后来想想可能是「Restaurant」。毕竟他一开始做水产批发,接着去做下游的餐饮行业就很顺理成章。<br />大哥说他的店面现在都盘出去了,只剩黄埔区一处因为地块在拆迁而没人接手,还砸在手里。他现在欠了银行一笔钱,我估计起码上百万。所幸没有欠亲朋好友的钱,我觉得这算不幸中的万幸。遇到银行那边来催债,他就实话实说我现在已经破产了无法偿还。银行那边今年开始也不怎么落井下石了,催得也不紧。<br />作为曾经的老板,他说他现在挺羡慕打工人。他还特别说明他羡慕的是企业里的打工人,不是公务员那种。我估计他自由惯了受不了那种生活。他说现在遇到朋友提议「去哪儿玩」都不敢搭话,心知没钱回请。也有曾经朋友躲着他走,落难的时候挺能见人心的。</p><p>听他的口气,他还在「等一个机会」想要翻身。说实话,在眼下这个时局,我对他这个心态还真不是很看好。不过好在他起码走出来了第一步,还算积极。希望他能如愿吧。<br />我下车的时候,他请我「帮忙给个好评」。我说这个自然,心中在想,上次听到这种请求好像Uber还在中国……</p>superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com1中国上海市31.230416 121.4737012.9201821638211563 86.317451 59.540649836178844 156.629951tag:blogger.com,1999:blog-1452246018852542114.post-34816970533561974122023-06-06T14:21:00.001+08:002023-06-06T14:21:06.587+08:00似曾相识的「歧视」<p>国泰航空的「歧视」风波,眼下也快要平息了,差不多到了可以说几句的时候了。<br />我没有看过所谓的现场视频或录音,听说是「偷录」的,不过因为并不是私密场合,所以似乎并不是重点。毕福剑可能有不同看法。<br />这件事,让我想起上次的宝马冰淇淋事件。上一次的舆论场,有一些不一样。</p><p>所以说啊,人是很奇怪的动物。明明脑袋是司令部,但是它又听屁股的指挥。两件事情之所以出现了舆论上的差别,在我看来,主要是还是跟站队有关。<br />我也觉得去拿免费冰淇淋丢人,所以我不觉得这个事件与我有关系,那么我同情宝马。<br />我也可能是飞机上的乘客,而且我的某外语也可能不够好,所以我觉得自己完全有可能被迫成为当事人,于是我怒斥国泰。<br />在我看来,最主要的差别,就是这个。历来如此。比如温州动车追尾……</p><p>这种想法也不奇怪,反而很正常,很自然。它出于人类率真的天性,我觉得没有必要去批判。人嘛,重要的能力就是共情。要能共情,首先就要有代入。冷血石头心,但又能够正确处世的,那是AI,不是人。<br />不过呢,最近这些事情的问题之处就在于:该XX的时候不XX,不该XX的时候死命XX。<br />我还记得我小学的时候,大约也就三、四年级。一天早上,因为说了脏话,被家长一通教训,心中颇是不痛快。到了学校,上早自习,老师还没来。有人开灯,有人关灯,乱搞一通。于是我跟着其他人一起破口大骂,也不知道骂的谁。场面闹哄哄,压根没人听清我骂了什么,所以没有任何受害者。但总之一舒心中积郁,那畅快无比的感觉,记了三十多年。</p><p>要问我的意见?依我看,把这种事情录下来也就罢了,发到别人手机上,试图拉来些网络暴民来达到出气的目的,这种做法本身是很卑劣的行为,我反正是做不出来。在我看来,这种行为与被欺负了的小学生找社会上的大哥「扎起」,然后去对方学校门口等放学逮人一样幼稚。<br />我要是在现场,要么选择「关我鸟事睡觉去」,要么义正词严地指出问题来,不会有第三种做法。你们要是没有惹到我,那就是关我屁事。背着我咒我死的人多了去了,可能有八千万减一那么多,我管不过来。你们要是惹到我了,我就会明确地让你知道我的不爽,管你下周一来不来我单位找我。也许当场骂两句根本没用,但你还真以为现在这样就有用?</p><p>话说回来,现在国泰道歉了开人了,该不会有人天真地以为事态会变好吧?应该不会有人这么蠢吧?<br />「歧视」就是一种现象,原因是什么?逼我删帖的人心中不会没点逼数。因为心理上没有得到平衡,才会产生歧视。如果不是为了在自己心中觉得高人一等,何必非要去故意踩人一头?本来就是公平的环境被打破后的结局,而如此操作,只会形成更大的不忿。或许始作俑者现在也并不想如此,但自作孽不可活,操弄了天大的风浪,眼下还是祈祷更管用。算了,不多说了,各位自己开心,随意就好。<br />对了,如果我儿子骂脏话,我把他胖揍一顿,以后说不定能偷录到更精彩的脱口秀。 </p>superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-18846553755369428692023-05-12T16:58:00.002+08:002023-06-06T14:23:16.301+08:00你至少可以选择<p>首先声明,这不算是一篇正经的Blog。不过因为始作俑者选择了类似「骂并拉黑」的这种看似主张自己的合法权益实则抢占道德制高点的鸡贼做法,所以我也要以彼之道还施彼身。</p><p>原始的文章参见这里: <a data-cke-saved-href="https://huangxin.dev/partly-technical/in-response-to-jsdelivr-icp-license-revokement" href="https://huangxin.dev/partly-technical/in-response-to-jsdelivr-icp-license-revokement">https://huangxin.dev/partly-technical/in-response-to-jsdelivr-icp-license-revokement</a></p><p>我其实只评论了一句:</p><p></p><blockquote>说到「滥用」,更应该谴责的是权力被滥用。痛骂弱者总是相对容易的。如果你不敢连权力一起骂,那起码可以对自己的无能为力表示一下不满和不甘。</blockquote><p></p><p>我本以为,这已经算是足够温和的批评了。<br />「更应该」、「相对容易」、「如果」、「一起」、「起码」、「可以」、「表示」……<br />这么多的委婉,甚至在我看来已经是软化了再软化的用语。<br />没想到的是,原文作者连这样一句批评,都收不下。</p><p>当然,没有几个普通人能够接纳下对自己的批评,起码怒气上冲的当下是很难接受的。<br />我一直记得dzxr的一句话:「如果他能做到XXX,那么他就不会是YYY了。」年轻的时候,难免做错事情,我也不能免俗。不过他的批评,我虽然很难受,但是我收下了,并且记到现在。</p><p>我的意思其实很简单——你不要拉偏架。胖虎揍大雄,就算各打五十大板,那也是在拉偏架。何况你连「各打五十大板」都没做到。轻描淡写一句「我们的系统的的确确有问题」 ,跟标黑加粗的「<strong>强烈谴责</strong>」,是一个意思吗?<br />在这里我也不想客气:从这个作者的一句「我们的系统」就可以看得出来,他把自己放在什么位置。<br />用一句我本来不想说的话来说:他的屁股本来就是歪的。<br />也许,他真的姓赵?也许,他本来就是既得利益人士?也许,他就是那个给墙壁开发控制台Web前端界面的堕落程序员?所以,他有这样的立场,也许完全不奇怪,甚至很可能是正常的。他站出来维护一句「我们的系统」,实属天经地义,万万没有什么可强烈谴责的。</p><p>但是,至少,你还可以选择,不是吗?<br />你说你没那个胆子,你孬种,你「在意的是个人和家庭的福祉」,「国家」甚至还成了你「赖以生存的一部分」。可是,你只敢忍气吞声的时候,你为什么又选择了「强烈谴责」呢?莫非是因为柿子只敢挑软的捏?<br />你完全可以说「对不起各位,那YOU KNOW WHO我得罪不起,所以在这篇文章中我只能骂你们」。这样的话,我起码知道你的心是正的。你的确有那个尺,那杆秤。什么是对,什么是不对,什么是错误,什么是罪恶,你心里门儿清,只是不敢说而已。你但凡说了类似这样的任何一句话,我都会欣赏你,默默地为你献上祝福,祝你好人一生平安。<br />然而,你并没有这样选择。你只是选择了站在强者一边。你选择了当一个骨川强夫,莫非你的嘴也是尖的?</p><p>在我看来,原文作者最合适的举动,就是把这篇文章好好编辑一下,去掉那些不合适的文字。老老实实地阐述事实,并提供给别人解决方案,让别人用Google搜过来的时候,能给别人提供一些帮助。很多的Web前端会由衷感激你的,只因为你在分享知识和经验,在做这样的善举。<br />而站在GFW的边上落井下石,对于Web前端开发人员没有任何好处。你的Chrome是从哪里来的?你用的Android SDK是从哪里来的?你吃饭的筷子都是人家给的,对砸你饭碗的人居然没有一丝怨恨?这样的生物我实在难以理解。不骂你,骂谁?无论是政府、国家还是「老大哥」,我也一个都不敢骂!但我至少不会去为虎作伥。</p><p>至少,我会选择——闭(上那张不会说话的)嘴。</p>superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.comtag:blogger.com,1999:blog-1452246018852542114.post-91044258424778056042018-10-09T11:07:00.001+08:002022-02-23T11:47:29.607+08:00本博客暂停更新的通知上一次更新到现在已经有10个月了。这话要是提起来也是挺惭愧的,然而:<br />
<br />
<ul>
<li>首先,Blogger平台越来越不适合写作了。不支持Markdown,虽然支持HTML,但要编辑一些版式(例如放源代码)也是相当的吃力。偏偏我近期能够往上放的内容更多地是一些技术性的文章。相比之下,在DropboxPaper上写作的效率要高很多。</li>
<li>其次,国内的自由状况愈发不堪。虽然blogger并不在墙内,但仍然是公开的“场合”。我觉得可能快到了转入地下的临界点了。与其被动地被逼,不如主动地早做准备。</li>
<li>最后,我最近的确也是缺少灵感,所以即使是生活类的Blog也写不出什么来。没有时间当然是一个理由,但要挤也是能挤出来的,主要还是自己写不出来,不能怪别人。</li>
</ul>
<br />
所以,在这里发这个通知,也告诉大家不用干等了——虽然其实没有什么人在等。也提示了以下几点:<br />
<br />
<ol>
<li>我会转移到暗网。所谓暗网,不是一定指Tor或I2P,反正是普通人找不到的就对了。</li>
<li>我会在暗网开两个Blog,一个仍然会是我的Blog,另一个别指望能把它跟我联系起来。</li>
<li>“暂停更新”,意味着原有内容仍然保留。将来是“彻底关闭”,还是恢复更新,交给上帝去安排吧。</li>
</ol>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com2tag:blogger.com,1999:blog-1452246018852542114.post-32645956472253371922018-01-17T12:54:00.002+08:002023-12-15T11:20:43.343+08:002018年,发现自己老了公司最近在赶项目,周六跟晚上都在加班。一加班,跟年轻时候的差别就出来了。到了晚上脑子都转不太动了,提不起精神,需要的睡眠时间也挺长。所幸是还睡得着,要是失眠就更惨了。年轻的时候那种越到夜深干劲越足的情况是不可能再有了,就算是玩游戏也不可能有了。<br />
<br />
说到玩游戏,忽然想起自己已经很久没有玩过了。年幼时央求父母买游戏卡带时说的那句「采蘑菇我可以玩到老」虽然是bullshit,但是像现在这样PC、游戏机、手机游戏统统没法玩的时候,在我成年以后还是罕有。用Raspberry搭建了一台FC/MD/SFC怀旧游戏机,然而却没有时间玩,我也真是醉了。<br />
<br />
手机换了一台iPhone8+,不知怎么,却也懒得再去下载游戏来玩。之前在iPhoneSE上玩过的一些游戏,最后都因为觉得「太耗时间了」,「逼我每天都要抽空玩真是烦心」,而最终被卸载。以至于我现在也不想再去玩那些手机游戏了。<br />
<br />说起来,手机上的游戏似乎特别消耗时间。它千方百计地要让你每天都去玩一下,哪怕只是签个到,也要让你点开看一眼。我实在是不喜欢这种「被东西控制」的感觉。不过也是奇怪,年轻的时候似乎并不是这样觉得。也许那个时候我的「空闲时间」很多吧。<br />
<br />
一转眼,已经是2018年了。在过去的一年里,拜年中那一段时间的爆发力所赐,总算是在Blog数量上创出了过去三年以来的新高。否则我都快觉得无颜面对竜堂家兄弟了。Chinese New Year 期间大家一起加油吧。superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com2tag:blogger.com,1999:blog-1452246018852542114.post-3448187299455621372017-12-27T10:29:00.002+08:002023-12-15T11:21:39.302+08:00Linux关机权限的特殊情况很多Linux教程都说shutdown/reboot需要root权限。其实这不是完全正确的。<br />
<br />
正常想来没错:shutdown/reboot如果可以不用root权限那还了得?然而其实至少在RHEL 7.2上并不绝对是这样子。当出现以下的特殊情况时:<br />
1.是当前唯一登录的用户;<br />
2.直接调用reboot,或shutdown带了now参数;<br />
3.登录会话来自本地物理终端。<br />
同时满足以上条件的话,就可以无需root权限以任何用户的身份关机或重启服务器。<br />
<br />
我用RHEL 7.2默认安装的「基础设施服务器」进行的测试。Debian 9没有这个问题。我想这样的做法大概思路是:「如果你都摸到物理服务器边上,急着要马上关机,并且我认为这不会影响到其他人,那么当然可以让你关机,因为就算不让你关机你也可以拔电源线对吧?」<br />
<br />
当然,这种想法应该没有考虑到服务器上运行爬虫之类的情况。我没有做更多测试,也许如果有一个别人的daemon进程就会使得结果不一样。不过我想这个事情可以提醒我们的是:Linux的事情不要想当然,也不要网上说什么都信。不要把一切都交给系统默认安全性设置,对于普通用户还是乖乖地把权限控制严格点比较好。superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-22741026173669001072017-06-22T11:40:00.000+08:002017-06-22T11:40:14.869+08:00防贼不编年史<span style="color: blue; font-size: large;">Chapter One</span><br />
很早的时候,赛博世界还只有病毒,没有贼。<br />
那时候,有的病毒还可以和人类和睦相处,称之为“良性病毒”。<br />
我有一个游戏,从别人那边复制过来的时候,就是带毒的。文件型病毒,文件体被加了密,还给搬到了隐藏扇区。不过游戏本身挺有意思,<a href="https://classicreload.com/the-incredible-machine.html" target="_blank">The Incridible Machine</a>,第一代。于是我每次就把BIOS里的硬盘给Disable掉,然后再玩。慢虽然慢点,但只要记得玩过之后重启,就不会有什么问题。<br />
<br />
<span style="color: blue; font-size: large;">Chapter Two</span><br />
尽管兜里没什么钱,但Internet时代还是到来了。<br />
网管差点把我从网吧赶了出去。因为他终于“逮到”我在用<a href="https://zh.wikipedia.org/wiki/%E8%B6%85%E7%BA%A7%E5%85%94%E5%AD%90" target="_blank">SuperRabbit</a>。他已经连续好几天都把时间花在恢复系统设置上了。我想日后<a href="https://zh.wikipedia.org/wiki/%E7%A1%AC%E7%9B%98%E4%BF%9D%E6%8A%A4%E5%8D%A1" target="_blank">硬盘还原卡</a>卖得这么好,其中应该有我一份功劳。<br />
“机器狗”真不是我放的。<br />
<br />
<span style="color: blue; font-size: large;">Chapter Three</span><br />
<a href="https://zh.wikipedia.org/zh-hans/CIH%E7%97%85%E6%AF%92" target="_blank">CIH</a>爆发了。<br />
买了刷ROM机器的人都发了笔小财。<br />
其他人:哇,没想到病毒也可以这么凶残!<br />
我倒是没什么感觉,因为我那个时候还在用着一块80486。<br />
<br />
<span style="color: blue; font-size: large;">Chapter Four</span><br />
<a href="https://en.wikipedia.org/wiki/WinChip#Winchip_C6_.280.35_.C2.B5m.29" target="_blank">IDT-C6</a>的发热好低,主频超到100MHz也不用风扇。<br />
哇,有好多同学都安装了<a href="http://download.csdn.net/detail/qq_35264117/9826140" target="_blank">冰河</a>哎!<br />
咦,这位同学在玩美少女梦工场3呢。我只有2。<br />
“同学你好,你的游戏可以也copy给我一份吗?”<br />
“哎哎,不要关机!……”<br />
<span style="color: blue; font-size: large;"><br /></span>
<span style="color: blue; font-size: large;">Chapter Five</span><br />
不知道从什么时候开始……<br />
几乎所有的IT公司,都以在你的IE上装一个插件或工具栏为荣。<br />
几乎所有的安装包,都会附带一两种“小东东”。<br />
刚开始我还真没太放在心上,甚至对某些还持欢迎态度。然后,我的机器越来越慢了。<br />
做毕业设计时,我接触到了ActiveX。<br />
<br />
<span style="color: blue; font-size: large;">Chapter Six</span><br />
工作了。从K6-2一下子跳到Pentium 4的感觉真好。<br />
“见鬼,这浏览器上什么时候多了这么些鬼东西?上网助手?中文实名?卸掉!就是它搞得我们的OCX不能用了。”<br />
“你要记得安装Windows 2000 SP4补丁,不然我们的程序用不了。”<br />
对了,有个新软件叫<a href="https://www.vmware.com/" target="_blank">VMware</a>,真好玩!<br />
<br />
<span style="color: blue; font-size: large;">Chapter Seven</span><br />
我开始小心翼翼地上网浏览,对于弹出的OCX安装提示统统点“否”,后面视情况而定。因为我知道一旦安装了之后别人能做些什么事情。然而,有些人我是注定帮不了他们:<br />
“你的IE上装这么多工具栏干什么?”——“不然我怎么上网?”<br />
“<a href="https://www.google.com/ncr" target="_blank">Google</a>的网址是三达不溜点……”——“别说了我记不住。”<br />
愿上帝保佑他们,A门。<br />
<div>
<br /></div>
<div>
<span style="color: blue; font-size: large;">Chapter Eight</span></div>
<div>
换工作了,当小头头了,总算有双核电脑用了。VMware可以有自己单独的CPU了。</div>
<div>
真不敢相信,以前在一台768MB的P4笔记本上跑了一个Oracle8i+两个Lotus Domino R5+一个Resin+Word+若干IE,去招标现场做演示的时候,机器到底是怎么撑下来的。</div>
<div>
借着新工作接触到了<a href="https://www.antirootkit.com/software/IceSword.htm" target="_blank">IceSword</a>。妖魔鬼怪你们都现出原形罢!</div>
<div>
测试人员:不好了,机房又爆发“震荡波”了。</div>
<div>
<br /></div>
<div>
<span style="color: blue; font-size: large;">Chapter Nine</span></div>
<div>
我开始仔仔细细地打补丁,开启Windows Update,总是保持自动更新。</div>
<div>
而很多同事都是直接关掉了事:“工作到一半老是跳出来叫我更新,太烦!”</div>
<div>
愿上帝保佑他们,A门。</div>
<div>
<br />
<span style="color: blue; font-size: large;">Chapter Ten</span><br />
我发现同事们总算愿意给机器打补丁了。<br />
同事:这个东西叫360,打补丁蛮快的。<br />
我:我也来试试。咦,这个<a href="https://zh.wikipedia.org/wiki/360%E5%AE%89%E5%85%A8%E6%B5%8F%E8%A7%88%E5%99%A8#.E6.BC.8F.E6.B4.9E.E7.BA.A0.E7.BA.B7" target="_blank">KB360018</a>怎么这么奇怪?<br />
<br />
<span style="color: blue; font-size: large;">Chapter Eleven</span><br />
不知道从什么时候开始,软件安装开始必须得小心了。<br />
因为一不小心你就会安装上好几个不请自来的软件,电脑上会变成软件博物馆。送来给我“修一下”的电脑无一不是如此。连我自己有时候不小心也会中招。<br />
有人建议我把家里电脑换成Linux,不过我觉得对父母吩咐到位了,一般还是没事。毕竟我有<a href="https://www.teamviewer.com/" target="_blank">TeamViewer</a>。<br />
<br />
<span style="color: blue; font-size: large;">Chapter Twelve</span><br />
不知道从什么时候开始,国产软件慢慢地不能用了。<br />
其实不是不能用,是不敢用了。因为开始流行一种东西叫做“<a href="https://zh.wikipedia.org/wiki/%E7%99%BE%E5%BA%A6%E5%85%A8%E5%AE%B6%E6%A1%B6" target="_blank">全家桶</a>”。腾讯、百度、迅雷、阿里、360、金山……。所有的这些曾经为我服务过的软件,仿佛都得了癌症。你不知道他们在背后干些什么,但是你的电脑的确越来越慢,行为越来越不正常了,而且你的hosts总是失效得很快。于是干脆就不用了。<br />
不用了,然后也并没有什么事情发生。并没有像有的人以为的那样会社会大乱,民不聊生。人民照样活得很好。</div>
<div>
<br /></div>
<span style="color: blue; font-size: large;">Chapter Thirteen</span><br />
<div>
一夜之间,我的密码就不再是“我”的密码了。</div>
<div>
许多年前,我自己写的同学录,为了避免被<a href="https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A" target="_blank">SQL injection</a>,就把服务端存储的密码改成了MD5 Hash。</div>
<div>
后来,知道了世界上有种东西叫做“<a href="https://zh.wikipedia.org/zh-hans/%E5%BD%A9%E8%99%B9%E8%A1%A8" target="_blank">彩虹表</a>”,于是我学会了<a href="https://zh.wikipedia.org/wiki/%E7%9B%90_(%E5%AF%86%E7%A0%81%E5%AD%A6)" target="_blank">salt</a>。</div>
<div>
再后来,我看到了<a href="https://zh.wikipedia.org/wiki/%E7%8E%8B%E5%B0%8F%E9%9B%B2" target="_blank">王小云教授</a>的论文,于是我Hash算法至少会是SHA256。</div>
<div>
然而,这么多年过去了,这帮狗日的居然还在服务器上存<a href="https://zh.wikipedia.org/wiki/2011%E5%B9%B4%E4%B8%AD%E5%9B%BD%E7%BD%91%E7%AB%99%E7%94%A8%E6%88%B7%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%E4%BA%8B%E4%BB%B6" target="_blank">明文密码</a>。谁要硬说这里面没有阴谋,我只能说你的心挺大。</div>
<div>
<br /></div>
<div>
<div>
<span style="color: blue; font-size: large;">Chapter Fourteen</span></div>
没想到,我的QQ也被盗了!<br />
我已经很多年没用过QQ了。但是因为我太太的手机上有游戏用我的QQ账号登录着,所以我觉得企鹅还不敢回收我的账号。<br />
突然间它就变了一个名字,列表里的好友也变成了一堆海南人。我还能再登进去,密码并没有被改。所以我一直到现在也没想通是怎么回事。<br />
我把个人状态改成了“明文密码好”,然后就把这个QQ号扔那里了,就像它从未存在过。</div>
<div>
<br /></div>
<div>
<span style="color: blue; font-size: large;">Chapter Fifteen</span></div>
<div>
那个周末,当我还在外地顶着紫外线用流量上网的时候,全世界有许多人已经<a href="https://zh.wikipedia.org/wiki/WannaCry" target="_blank">想</a><a href="https://zh.wikipedia.org/wiki/WannaCry" target="_blank">哭</a>了。</div>
<div>
贼要的是<a href="https://zh.wikipedia.org/wiki/%E6%AF%94%E7%89%B9%E5%B8%81" target="_blank">Bitcoin</a>。</div>
<div>
当第二天IT问我笔记本装没装补丁的时候,我微笑着告诉他“Linux”。<br />
不过我马上又想起来<a href="https://zh.wikipedia.org/wiki/%E5%BF%83%E8%84%8F%E5%87%BA%E8%A1%80%E6%BC%8F%E6%B4%9E" target="_blank">Heartbleed</a>的事情我还没处理,于是我又有点笑不出来了。</div>
<div>
我也想要别人的Bitcoin。</div>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-90973231594157121672017-06-13T11:50:00.000+08:002017-06-13T11:50:47.418+08:00银联钱包你真垃圾,我一点都不欢迎你5月30日一下飞机,我就在虹桥T2的廊桥里面看到了银联云闪付62折的大幅营销海报。“去看看有没有便宜可占”,当时我这样对太太说。然后我们就各忙各的,这事几乎给忘了。<br />
<div>
<br /></div>
<div>
昨天太太跟我说,超市里面银联云闪付满79减30,所以她在自己的iPhone6+上装了个银联钱包。我想起了在机场看到的东西,就也去AppStore上搜了一下。有两个东西,一个叫“银联钱包”,一个叫“云闪付”,都是“中国银联”出品的,评分还真是一样低。我有点纳闷,好吧两个都下了,反正AppStore上至少没木马。</div>
<div>
<br /></div>
<div>
安装好之后把玩了一会儿,“云闪付”一来就叫我登录,而“银联钱包”至少让我看到里面有些什么功能了,里面也有“云闪付”的功能,那么好,“云闪付”你滚蛋吧。</div>
<div>
<br /></div>
<div>
其实我知道Apple Pay本来就是所谓的“银联云闪付”,我只是想知道银联这次在玩什么花样。结合新闻我有点弄明白了:大概闪付需要芯片,很多地方只肯买扫描枪,所以银联这次也搞了个跟支付宝有点像的扫二维码支付。这就必须要App支持,光靠Apple Pay还不行。</div>
<div>
<br /></div>
<div>
好吧,我觉得至少比起阿里粑粑这种流氓公司而言,银联我还可以尝试一下。于是我准备注册了……</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgATxZiYcgAA83vOeQQYrxCRQtGcnQWa96kzxH9YhVVtGQ1BVO9_I4FDg3Efq3mswys58uxL1ltwAwdPVrp6Hh8yF35jfDdXljm4r0D1WEYGQAjTV6exyvvILWEaG2e3u-KjPTsjuMrbxQ/s1600/IMG_1688.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="640" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgATxZiYcgAA83vOeQQYrxCRQtGcnQWa96kzxH9YhVVtGQ1BVO9_I4FDg3Efq3mswys58uxL1ltwAwdPVrp6Hh8yF35jfDdXljm4r0D1WEYGQAjTV6exyvvILWEaG2e3u-KjPTsjuMrbxQ/s320/IMG_1688.PNG" width="180" /></a></div>
<div>
我真的没想把本文写成吐槽文。不过正式开始用的第一眼我就被雷到了。拜托!中国银联!这是iOS,是哪个老师教你“自己开发密码键盘会更安全”的?你说出来我们来轮他。</div>
<div>
<br /></div>
<div>
先得注册。我在界面上看到了可以用“手机号”、“邮箱”或“用户名”来注册。我并不是一个暴露狂,所以我准备以用户名来注册。点开App上的注册,发现只能用手机号注册。我不死心,换到PC上在Web下注册。一开始Web页面看起来也只能用手机号注册,不过当我F12之后,就发现还有一个DIV被display:none了。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAsHOBkZkB-OAM-D1TtNX8De8_k225qIIDyrhIHVdXZez1QyTXBILzC72TGdBpu6i7eEN-Cpv2Sh4au8G5ya40j5AACJU_RSge_gd9SpI8oCuVw1mJkZ8OhGf6sR9jiRGH1Gd6PCIKkDo/s1600/%25E9%2593%25B6%25E8%2581%2594%25E9%2592%25B1%25E5%258C%25851.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="921" data-original-width="1454" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAsHOBkZkB-OAM-D1TtNX8De8_k225qIIDyrhIHVdXZez1QyTXBILzC72TGdBpu6i7eEN-Cpv2Sh4au8G5ya40j5AACJU_RSge_gd9SpI8oCuVw1mJkZ8OhGf6sR9jiRGH1Gd6PCIKkDo/s400/%25E9%2593%25B6%25E8%2581%2594%25E9%2592%25B1%25E5%258C%25851.png" width="400" /></a></div>
<div>
呵呵,我心想:“就这也能难住老子?”</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicZn1U47wx1SZtMSm19GDbp5KMxX4An29iLiXWMxsUOWcxhxbiJBk76kaZ-g_a72iU6DS55pFngKz9IpMTrW7AS1tU-rfSkLbDv0fPIstc5-47bQTxVw6vSIyNY3ZLkbcFJVJgdxBOEQY/s1600/%25E9%2593%25B6%25E8%2581%2594%25E9%2592%25B1%25E5%258C%25852.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="789" data-original-width="817" height="386" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicZn1U47wx1SZtMSm19GDbp5KMxX4An29iLiXWMxsUOWcxhxbiJBk76kaZ-g_a72iU6DS55pFngKz9IpMTrW7AS1tU-rfSkLbDv0fPIstc5-47bQTxVw6vSIyNY3ZLkbcFJVJgdxBOEQY/s400/%25E9%2593%25B6%25E8%2581%2594%25E9%2592%25B1%25E5%258C%25852.png" width="400" /></a></div>
<div>
看来还是绕不开。</div>
<div>
<br /></div>
<div>
然后还有这个令我一看到就恶心得头皮发麻的“请点此安装”。</div>
<div>
我用的是Chrome,要我换用Edge甚至是IE我都可以接受。不过要我安装OCX那就太过分了,。有的Web页面如果用手机浏览器打开,就不会提示安装控件了。我抱着姑且试一试的态度,用手机试了一下:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsEv5W_xdO1kTeoiIMOcyhJixqigdffJ3Yn9hdHnHNSfoTU-o2hBm4ChCoTk2QI1yhyzJLWNJ4Icmk_RrexJWlE33U8-R3Uqo8I8wIfZ47gRW5GjGnwiYuoJ76nrRCW9oPpI6FuGakrlI/s1600/IMG_1692.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="640" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsEv5W_xdO1kTeoiIMOcyhJixqigdffJ3Yn9hdHnHNSfoTU-o2hBm4ChCoTk2QI1yhyzJLWNJ4Icmk_RrexJWlE33U8-R3Uqo8I8wIfZ47gRW5GjGnwiYuoJ76nrRCW9oPpI6FuGakrlI/s320/IMG_1692.PNG" width="180" /></a></div>
<div>
Chrome是这样,Safari也是这样。</div>
<div>
好吧,反正就是必须得要手机号对吧。那我还是回手机App上去注册吧。</div>
<div>
<br /></div>
<div>
在App上输入手机号码,通过短信发了验证码给我,验证通过了,接下来让我输入密码。这明显的大爷作风嘛。我很想问银联你是不是并不在乎有没有用户来注册?老子是国企多一个少一个无所谓?你们知道像美团之类的App在这一步是怎么做的吗?</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkbmmzbArK_mnd9fuQX0lL0JtAvooyCOL-CdmZSe3xU_6ojY04GXkTXNWS8gfH1daphEW36hRalbURiD_0J7XXoovfNhNNuDFbazlhFh1dG-AV_POC9-N6Ch0P8mz0X-qpxbWo9dt2duA/s1600/IMG_1689.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="640" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkbmmzbArK_mnd9fuQX0lL0JtAvooyCOL-CdmZSe3xU_6ojY04GXkTXNWS8gfH1daphEW36hRalbURiD_0J7XXoovfNhNNuDFbazlhFh1dG-AV_POC9-N6Ch0P8mz0X-qpxbWo9dt2duA/s320/IMG_1689.PNG" width="180" /></a></div>
<div>
我又要吐槽了。最低6位虽然太少,但我可以理解。最多不能超过16位是个什么意思?你们如果后台数据库里面保存的真的是密码的Hash值而不是原文,你管我密码最大有多长?你们知道Twitter允许的密码最大有多长吗?你们可以自己去试一下。</div>
<div>
<span style="color: red; font-size: large;"><b>明文密码!</b></span>我一直不厌其烦地在Twitter和Google+上强调这个事情:只要没有特别的理由就限制密码的最大长度,那后台保存明文密码的可能性就一下子变得高了起来。不要跟我讲什么16位现在还足够安全。关键是撞库!撞库!撞库!</div>
<div>
我一直是坚持“为每个服务使用独立随机密码”这个原则的。我宁愿忘掉密码,宁愿冒本地密码本被人搞走的风险,我也不会把心放在Server管理人员身上。原因很简单:<span style="color: red;">做过这行你就知道了。</span></div>
<div>
所以,我开启了密码生成器,去掉“符号”的勾,选择了长度为“16”,然后得到了一串随机密码。知道我前面为什么吐槽自己做的密码键盘吗?你既然决定了自己做密码输入控件,就很可能不会支持复制粘贴。</div>
<div>
<div>
在我比较辛苦地输入完密码之后,出来一个这个。</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpe6AvMA56aS5iP6blsXOl2Y0LjX68tp3EKOHdTubRM9Rs95gHIftx-2p38Q6Ky10BqxHHoUxkcMIYeTKcsArbO8cH5je4TY7e16rs6yH7M1lgO6v3QH-pVUDF2CASrqKhqZC8fIkGRko/s1600/IMG_1695.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="640" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpe6AvMA56aS5iP6blsXOl2Y0LjX68tp3EKOHdTubRM9Rs95gHIftx-2p38Q6Ky10BqxHHoUxkcMIYeTKcsArbO8cH5je4TY7e16rs6yH7M1lgO6v3QH-pVUDF2CASrqKhqZC8fIkGRko/s320/IMG_1695.JPG" width="180" /></a></div>
<div>
估计我以前在什么时候注册过银联的账号吧。有句<span style="color: red; font-size: x-large;"><b>妈卖批</b></span>我不知当讲不当讲?!我输入手机号码的时候你不告诉我,我输入验证码的时候你不告诉我,我输入密码的时候你不告诉我,等我把这些都搞完了你就告诉我这个?!</div>
<div>
抱着一丝希望,我点下了“是我的,立即登录”按钮,App跳回到了最开始的登录界面,输入我刚才生成的随机密码(是的我又辛苦了一遍),说我密码错。这次我真的骂人了。</div>
<div>
好吧,看来我只能选择“忘记密码”了。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMMBOSLRJR6qVmbnhyphenhyphenY80xdkK2IGWcm7ortVATX_XpypEjnPSLPfmo4QdLaOIHqrt8WyS_tUsFmDr_dbn46xXz034PujBzVpMpNs4kCy1k9xjAgDXNAoQGorFA79eybnYOnX7eoCjowU4/s1600/IMG_1696.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="640" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMMBOSLRJR6qVmbnhyphenhyphenY80xdkK2IGWcm7ortVATX_XpypEjnPSLPfmo4QdLaOIHqrt8WyS_tUsFmDr_dbn46xXz034PujBzVpMpNs4kCy1k9xjAgDXNAoQGorFA79eybnYOnX7eoCjowU4/s320/IMG_1696.JPG" width="180" /></a></div>
<div>
在又通过短信验证了一遍手机号之后,给我看的是这个界面。</div>
<div>
我曾经在Blog中讲过,<a href="https://superliufa.blogspot.com/2013/10/hackerstory3.html" target="_blank">“密保问题”并不是一个好的设计</a>。不幸的是,银联这里选的是所有密保问题中最糟糕的那几种之一。如果真的用家人生日做密保问题的答案,安全性极其脆弱,有等于无。如果用别的答案,又极容易忘记。</div>
<div>
偏偏这里不回答还不行,又没有提供“忘记答案”的选项,实际上是把这条路给堵死了。然而手机短信验证的安全级别明显比密保问题要高。取信低安全等级的验证结果而忽视高安全等级的验证结果,最后只能请求人工服务,这是极差的用户体验,也是极蠢的产品设计。</div>
<div>
<br /></div>
<div>
如果我记不起这个以前注册的账号的密码,我可能就只能打电话给银联了,而且可能这帮官腔佬最后还不肯替我解决。不过很幸运,我用一个旧密码最后成功登录了进去——看来我注册的时代还不太“古老”。</div>
<div>
然后我又被雷到了。登录成功之后,App给我看了这个:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwTJTZrxTM-yG4Yte-1IyJzYNDcOnyZTBb31NPTrNY8Cpgx3Tyoq1k9J46HeY-r9uwQyXW2LEXZBVBekwE9ZI30o0-s4ZO8EGu0zvPEKE1cGhQtdCllpZ8P8jmNfqk6n1MYo3nSNNXtDc/s1600/IMG_1693.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="640" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwTJTZrxTM-yG4Yte-1IyJzYNDcOnyZTBb31NPTrNY8Cpgx3Tyoq1k9J46HeY-r9uwQyXW2LEXZBVBekwE9ZI30o0-s4ZO8EGu0zvPEKE1cGhQtdCllpZ8P8jmNfqk6n1MYo3nSNNXtDc/s320/IMG_1693.PNG" width="180" /></a></div>
<div>
是的,没有“跳过”或者“稍后设置”的选择,这一步是必须的。</div>
<div>
设置手势密码之后才可以设置TouchID。好在根据太太的经验,登录进去了之后是可以把手势密码功能给关掉。不过问题又来了,要进入“安全设置”你必须要:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6aFJVpf0i9j4Cpa5wgE3ABGRp1ipP7S6YGoyp-A_1A9XYLdCiKMifcXlONx49TOu1A5x1aIjk2wWog2SDfYODpz4NhOnq9J14KXy3gdOElJ_BkDjOWktcO-qsd6M9eFb_qbi56jkX7L0/s1600/001" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="640" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6aFJVpf0i9j4Cpa5wgE3ABGRp1ipP7S6YGoyp-A_1A9XYLdCiKMifcXlONx49TOu1A5x1aIjk2wWog2SDfYODpz4NhOnq9J14KXy3gdOElJ_BkDjOWktcO-qsd6M9eFb_qbi56jkX7L0/s320/001" width="180" /></a></div>
<div>
到这一步,我彻底放弃了。</div>
<div>
极其差劲的技术运用,极其糟糕的用户体验。难怪AppStore上绝大多数评价都只给了一星,而近期的五星好评全像是刷出来的。我估计如果AppStore不是规定最低是一星,很多人连这一颗星都不想给。</div>
<div>
说实话,我不相信这种程度的技术能够保障我的资金和信息安全,给我天天打62折我也不敢用。算了。卸载。再见!</div>
<div>
<br /></div>
<div>
<br /></div>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-66117481313473483712017-05-31T13:30:00.002+08:002017-05-31T13:30:21.052+08:00淘宝天猫都碰不得啊<span style="font-size: large;">前言</span><br />
六一儿童节快到了,给儿子买点什么礼物好呢?虽然前不久刚买了一架UH-60和一把Glock17,但我还是想买点对儿童稍微有点教育意义的东西。思来想去,觉得地球仪不错。正好暑假也准备带家人出国去转转。若是连自己去了哪里却一点概念都没有,那岂不是很遗憾?<br />
<br />
<div>
平时工作也算得上忙,所以我就偷懒打算在网上购物。碰巧近来网购的体验还不错,正所谓好了伤疤忘了痛,我又开始在淘宝上逛了。</div>
<div>
<br />
其实以前我是很吃过几次亏的,所以也曾经痛下决心告诉自己大部分东西都不能在淘宝上买了。但前不久那次买玩具的感受实在是不错:我擦!居然有金属的Dragunov?这次<span style="font-family: "helvetica neue light" , , "helvetica" , "arial" , sans-serif;">一翻地球仪,我更是震惊了:我擦!居然还有磁悬浮的?!</span><br />
<span style="font-family: "helvetica neue light" , , "helvetica" , "arial" , sans-serif;"><br /></span></div>
<div>
<span style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);">所以说啊,人必须时刻保持冷静,才能抵挡诱惑。头脑发热之下,我真的就下单买了个所谓的“磁悬浮地球仪”。带着残存的一丝丝理智,我选了一家天猫店下单。我觉得吧,C2C的淘宝不靠谱,B2C的天猫大概好一点,至少出了问题比较好解决。事后证明,我这想法也对也不对。</span></div>
<div>
<span style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);"><br /></span>
<span style="font-size: large;">糟糕</span></div>
<div>
<span style="-webkit-text-size-adjust: auto;">等待收货的过程还是蛮引人遐想的。然而收到货一拆包装,首先心里凉了一半:包装倒没有什么特别的问题,不过产品外包装上连半个汉字都没见到,没有品名,没有厂家名称,没有商标,连个LOGO都没有。好在我是懂英文,加上有个图片,还能看出来没发错货。</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLyn1VIXwRhJ0N73F4T-L-AldQDmVaP79J4op4ssx4caaRKXoHz59dx2gLO1a7rsA5bv8sx_G_Wqx_utT2JQ2l8Fv0vpkgKI2e_6x5vuSWgk-jOyzYVpZ8oGlz7VyN4Mse4BRLh3LR1WQ/s1600/D0E7ADA0-D589-43E3-8456-4BF09642126A-COLLAGE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1024" data-original-width="1024" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLyn1VIXwRhJ0N73F4T-L-AldQDmVaP79J4op4ssx4caaRKXoHz59dx2gLO1a7rsA5bv8sx_G_Wqx_utT2JQ2l8Fv0vpkgKI2e_6x5vuSWgk-jOyzYVpZ8oGlz7VyN4Mse4BRLh3LR1WQ/s320/D0E7ADA0-D589-43E3-8456-4BF09642126A-COLLAGE.jpg" width="320" /></a></div>
<div>
<span style="-webkit-text-size-adjust: auto;">打开盒子,里面除了地球仪和一些填充物,就只有一张非常简单的“说明书”。合格证、保修卡,什么都没有。这它妈的不就是传说中的“三无产品”吗?</span></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJIHVvUutyDw3NkLERdYvlApMQfIPam-va0i1s_fZPaoqE24R3Ygwd3fIvwUbXKm59m3NVNPq0xU_yY5oqLtLs77WlUeQ7KuLaETD-wssV9nDdrMprxs9fRx__Pc5qmr7t-Lw5v2U9EyY/s1600/9AD6E0AC-FBCE-4C62-9EEF-77507E7F20C2-COLLAGE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1024" data-original-width="1024" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJIHVvUutyDw3NkLERdYvlApMQfIPam-va0i1s_fZPaoqE24R3Ygwd3fIvwUbXKm59m3NVNPq0xU_yY5oqLtLs77WlUeQ7KuLaETD-wssV9nDdrMprxs9fRx__Pc5qmr7t-Lw5v2U9EyY/s320/9AD6E0AC-FBCE-4C62-9EEF-77507E7F20C2-COLLAGE.jpg" width="320" /></a></div>
</div>
<div>
好吧,网购的东西,要求别那么高,毕竟地球仪才是主要的。我对它有着不小的期待,因此心里倒也没怎么在意那些“细枝末节”的事情。看了看说明书,通上电源,开始折腾。折腾着折腾着,汗就下来了。</div>
要完成所谓的“悬浮”,好困难啊!<br />
<span style="-webkit-text-size-adjust: auto;"><br /></span>
<span style="-webkit-text-size-adjust: auto;">虽然买之前看过一些评论,算是心里有所准备,但还是没想到这么麻烦。送的那个什么“悬浮棒”根本就不好使。还是有个评论里面说用中性笔的办法比较管用。好不容易能够比较顺利地“悬浮”上了,然而只要有一点点扰动,平衡立马就被打破,通常的结局</span>就是地球仪被“铛”的一声吸到顶上。而且就算是很小心地退开,一般也坚持不了几分钟。我发现这大概跟加工精度有关系,因为顶上的磁体是斜的,而我无法去校正。</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXhyphenhyphenGArgQd0lpZlLJmsDztteUfKpxEjlgwyljzxv9Z1s5GZNkPlk29pa2LqBPswGU3-Xk8KPvIPxtK90hbo8X-3uSUd3Ss8oy8nOynV7ts0uGHbW-AVX0FOv9-jfDmz70cdu2kJgDTKXw/s1600/IMG_1509.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXhyphenhyphenGArgQd0lpZlLJmsDztteUfKpxEjlgwyljzxv9Z1s5GZNkPlk29pa2LqBPswGU3-Xk8KPvIPxtK90hbo8X-3uSUd3Ss8oy8nOynV7ts0uGHbW-AVX0FOv9-jfDmz70cdu2kJgDTKXw/s320/IMG_1509.JPG" width="320" /></a></div>
<div>
并且,产品说明里面提到的自动旋转,似乎也无法达到。球体也就是左右来回转,每次角度也就是几十度。我定睛看着它,发现角度在越来越大,正当我满心希望它最终能转一个整圈的时候。“铛”,它又被吸到顶上去了。</div>
<br />
这它妈让人怎么用?我不可能每天都花一两个小时的时间在折腾这东西上。睡觉时还不能开着,不然保管神经衰弱。要是只能摆着或吸到顶上,那几十块的普通地球仪岂不是更好?我干嘛买个这么贵的银样蜡枪头?<br />
<b><span style="color: red;">不行,退货!</span></b><br />
<br />
<span style="font-size: large;">退货</span><br />
在淘宝上买东西,顺利的话一切都好。然而一旦买到糟糕的玩意儿需要退货,那麻烦就来了。我以前的糟糕的购物经历无一不源自于此,这次当然也不例外。当我以“质量问题”为原因要求退货时,卖家拒绝了。我对此也并不意外——反正最糟糕也就是哪样,总不可能直接投降吧。<br />
<br />
卖家拒绝的理由看起来很好笑——产品有正规工厂专利进货发票。这话好眼熟啊!对了,我以前在某个论坛上看卖家们交流心得时提到过,如果被投诉三无产品,就这样应对,只要你拿得出发票来,淘宝小二可不管它是不是真的……。呵呵,这样的发票当然可以买。有些买的发票连税务局那边都能过,何况淘宝。淘宝的处理方式很简单,C说你卖的是假货,你B有发票吗?噢,有,那C你去证明B卖的是假货……<br />
我去你妈的。<br />
<br />
这个时候我看到了一个“极速维权”的按钮。我点了一下,叫我提交证明。<br />
我能怎么证明呢?我只能把上面那两张图片传了上去。产品不能正常使用,我能怎么证明?上传一段小电影吗?搞笑。我都能想得到接下来的过程,无非就是叫C去找质监局,出具鉴定证明。普通消费者常常到了这一环节就望而却步了。较真的可能会去工商局投诉,然而一般也是了无下文。<br />
<br />
要说起来,这个环节是很给“天猫”加分的地方。我刚上传了照片不久,天猫说因为我是“信誉良好”的顾客,所以给我先行赔付了。的确也是马上就是进入到退货发物流的环节了。听明白了吧——东西真不真我不表态,但是我相信你!<br />
很多时候,事情就这么摆平了。你要认真按“假一罚N”地去索赔,那可就没这么容易了。职业打假人毕竟是少数。这一招就叫做“分化瓦解”、“团结大多数,孤立一小撮”。<br />
<br />
给东西重新装箱的时候,我又留意了一下这东西的做工,才发现其实粗糙得很,根本不值169元这个价钱。所谓专利号,搜了一下是宁波一家公司的,跟淘宝商家八竿子打不着。如果光看成本,20元都不一定有。尽管到淘宝上买东西没一个不是想贪便宜,但你一定要相信,卖家不会让你真正占到便宜的。<br />
<br />
<span style="font-size: large;">运费</span><br />
我记得,我上次在Blog上吐槽淘宝的事情,最后问题也是出在退货的运费上。这次又是“也不例外”。可见,如果那里的确有一个坑,你再走几次也还是会掉进去的。<br />
<br />
天猫很“贴心”地提供了“上门取件”服务,还可以约时间。说实话,当时我真的有点小“感动”,几乎就要拍手叫好了。<br />
<br />
取件的人来的时候,我在上班,是我太太处理的。取完件我立马就收到了退款。然而收快递的人跟我太太说,运费本来是7元,但是要收11元,因为“你的东西超宽了”。<br />
好吧。我心想,反正质量问题的退货运费是应该由卖家承担的。所以我也就没有坚持太多。收快递的人(我不想用“快递员”一词称呼他,因为我对他有意见,我觉得他不配)叫我支付宝直接付掉,我打开手机的淘宝App,的确有付款按钮。我点开看,7元。<br />
<br />
怎么回事?也许是对方还没提交新的价格。我就又做了一些手头的工作。一个小时以后再去看,还是7元。<br />
7元就7元,我心想,也许系统不觉得我的东西“超宽”。付完款没多久,太太说快递员打电话来,叫补4元运费,给了支付宝地址。<br />
妈的,现在想起来补运费了?<br />
<br />
<span style="font-size: large;">结束</span><br />
问个问题:太监下面有什么?<br />
太监下面没有了!<br />
居然什么都没有了?<br />
<br />
质量问题导致的退货,运费不是由卖家承担吗?如何承担?要我“垫付”已经是足够糟糕的体验了,然而现在是要我去找卖家聊IM来“讨”吗?<br />
我最憎恨的就是这种“干点什么都要IM”的事情。而前几次还算“愉快”的购物体验,也正因为我“不用到IM上做任何事情”。<br />
<br />
好吧,既然天猫觉得这个事情“到此为止”了,那我对你淘宝/天猫也就“到此为止”吧!<br />
其实总结下来,写了这么多,无非是想让自己记清楚这些个教训。有钱留着去国外花,别它妈犯贱去交智商税。</div>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com1tag:blogger.com,1999:blog-1452246018852542114.post-10921746394733131252017-05-25T11:49:00.000+08:002017-05-25T11:49:40.813+08:00将C++11新特性用于代码优化关于C++11的科普,在这里就不详细进行了,可以参考<a href="https://zh.wikipedia.org/zh/C%2B%2B11" target="_blank">维基百科</a>页面。即使是中文页面,我认为写得足够详细和系统了。<br />
<br />
总之,C++11对原始的C/C++作出了在我看来是不算小的改动。有一些概念,放在以前的时代是绝对真理,在C++11推出之后,可能需要重新了解一下了。VS2013对C++11的支持并不算“完美”,不过大部分“有用”的特性还是到位了。这里就以它为例,来谈谈如何把C++11的新特性应用到你的软件开发工作中来提升性能和开发效率。<br />
<br />
本文提到的C++11的这些新特性,我大致把它们分为两类:一类是可以直接提升代码的性能表现的,我列在“性能优化”部分;另一类虽然不能直接提升代码的性能,但可以提升开发效率,便于更快地开发出可维护性更好的代码,我列在“非性能优化部分”。<br />
<br />
<span style="font-size: x-small;">另外,受作者水平所限,本文并不是对C++11在这些方面的完整的参考内容,仅仅作为一个引导来阅读吧。</span><br />
<br />
<br />
<span style="font-size: x-large;">性能优化部分</span><br />
<span style="font-size: large;"><b><br />
</b></span> <span style="color: blue; font-size: large;">右值引用和move语义</span><br />
C++11引入了右值引用,支持了move语义。在我看来,这个变化的意义可能是C++11里面最大的一个。右值引用和move语义是什么,这里不展开。通俗一点地讲,这个特性使得程序员可以在必要的时候自行决定到底是深拷贝还是浅拷贝。对于大量的数据“搬运”操作,可以节省下不少时间。对于性能优化来说,意义重大。<br />
<br />
其实就算没有右值引用,在C++11之前的时代也可以做类似的优化。C++程序员只要对于自己的资源管理类显式地提供深/浅拷贝版本的函数即可。不过这样一来代码工作量会比较大,程序会变得比较复杂,并且始终不是一个规范。现在这一切都不是问题了。<br />
<br />
对于STL自己的类/容器,VS2013已经做了足够的优化。例如,你可以通过:<br />
<blockquote class="tr_bq">
string strA = std::move(strB);</blockquote>
来把strB的字符串动态内存部分直接给到strA,速度比简单的赋值要快不少。当然,strB就不再具有有意义的值了(这里例子中会变成空字符串)。当你push_back或insert一个string到容器里面的时候,如果string其实是一个临时变量,那么用move语义你也可以得到相当明显的性能提升。<br />
<br />
如果例子里面string换成一个map<string, string>,那么提升会更明显。总之,内存的分配和释放,以及memcpy操作统统被避免了。所以,理论上需要传递的东西越多,你得到的性能提升就会越显著。<br />
<br />
<span style="color: blue; font-size: large;">就地部署(emplace)</span><br />
C++11对于常见的STL容器,都提供了一种能提升性能的数据置入方法,称之为“就地部署”。通过用就地部署取代原来的push_back或insert之类的操作,不再需要先构造再传递,而是由容器直接调用目标对象的构造函数来完成数据填充。<br />
<br />
在某些情况下(T提供了对应的构造函数时),这样可以避免一次拷贝构造的开销。而最差的情况(T没有提供对应的构造函数),也最多不过就是与push_back和insert效果一模一样而已。所以我建议所有能用上就地部署的地方,都统统用上,无需太多考虑。<br />
<br />
并且,就地部署与move语义相互并不冲突,而且是互有补充。move语义解决深拷贝慢的问题,就地部署试图减少哪怕是浅拷贝的执行次数。两者配合起来效果更加完美。<br />
<br />
<span style="color: blue; font-size: large;">散列表</span><br />
在C++11里,不再需要通过第三方库来引入散列表(或者叫哈希表)了。STL正式支持了四种散列表的实现,全部都冠以“unordered_”的前缀,以便与一些第三方实现相区别。<br />
<br />
对于大多数用map/set实现的代码,只要简单替换容器就可以得到性能上的提升。map/set基于红黑树(自平衡二叉树),时间复杂度至少是log(N)。散列表版本的map/set提供常数级的时间复杂度,随着数据量的增大,无论是写入还是读取的性能都超过了红黑树版本的map/set。<br />
<br />
我个人的测试结论是:同是set<string>,即使是小数据量,散列表版读取代价也只是红黑树版的约60%;小数据量下,红黑树版写入略快,但在容器内数据量达到“万”级别的时候,散列表的写入速度也开始超越红黑树版(Release版测试结论,Debug版在“百”级别即发生超越现象)。<br />
<br />
所以我认为,只有在数据量很小,并且写入与读取的概率大致相当时,使用红黑树版map/set才在性能上可能有明显收益。其余情况,都建议采用散列表版本map/set。当然,如果T是自定义类,并且你不愿意为它写散列函数,那就算了。<br />
<br />
<br />
<span style="font-size: x-large;">非性能优化部分</span><br />
<span style="font-size: large;"><b><br />
</b></span> <span style="color: blue; font-size: large;">完美转发</span><br />
C++11中所谓“完美转发”的特性,其实是配合右值引用来使用的。如果为了支持右值引用,而不得不让自己的代码量变大一倍,那有些人可能就要望而却步了。完美转发其实是借用了模板技术,使得你可以只写一份代码,就可以兼顾(常量)左值引用与右值引用的情况。工作量更少,代码更简洁,出错的概率也就更低。<br />
<br />
不过,采用模板技术的缺点就是:编译期展开。这一方面降低了编译器的效率,另一方面会导致头文件的包含关系变得不太容易整理。除此之外,还有一种我称之为“不完美转发”的替代解决方案,本质上是在性能上作出一定程度上还算可以接受牺牲,来换取代码简洁性,取得一个还算OK的平衡。我会另外写一篇Blog来介绍一下它。<br />
<br />
<span style="color: blue; font-size: large;">类型推导</span><br />
“类型推导”也就是所谓的auto类型。这个东西使用起来基本没有门槛。很多人可能最开始接触C++11就是通过它了。<br />
<br />
这个的确是一个好东西,用来写STL的iterator类型再合适不过了。因为我们本来也不怎么关心iterator的具体类型。不过,仍然不建议滥用。如果到处都是auto,阅读你代码的人会经常性地需要回顾才能知道一个变量的类型,特别是在你没有用匈牙利命名法的时候更是如此。<br />
<br />
所以,我的建议是:当你觉得一个变量的类型写起来很麻烦,而你其实并不关心它的时候,放心地用auto。并且,auto变量的作用域不要太大,if/for/while循环内的局部变量用它是最合适的。<br />
<br />
<span style="color: blue; font-size: large;">基于范围的for循环</span><br />
很多语言早就可以这样写了。而C++11现在也可以这样写了:<br />
<blockquote class="tr_bq">
for (auto& stk : stocklist)</blockquote>
相比起:<br />
<blockquote class="tr_bq">
for (auto pIter = stocklist.begin(); pIter != stocklist.end(); ++pIter)</blockquote>
孰优孰劣一目了然。何况后者通常还需要跟一句:<br />
<blockquote class="tr_bq">
auto stk = (*pIter);</blockquote>
<div>
不过,如果是一个map,你可能经常要取pIter->first/second之类。或者你打算在循环里面对pIter做erase操作,那还是用传统方式比较好。</div>
<div>
<br /></div>
<div>
<span style="color: blue; font-size: large;">空指针</span></div>
用nullptr取代NULL。我觉得最大的好处就是nullptr的颜色没有NULL扎眼。不过,由于NULL也表示0,有的时候也表示无效句柄。我觉得对于所有指针类型的NULL,置换成nullptr可能会对阅读代码有一定帮助。<br />
<br />
<span style="color: blue; font-size: large;">角括号</span><br />
C++11的编译器现在可以识别>>到底是两个模板类的嵌套,还是>>运算符。因此写代码的时候就不特意空上一格,写多层模板类嵌套的时候就更美观一点。<br />
<br />
不过,多层模板类嵌套,本来就不可能“美观”到哪里去。起码我是不建议太多此类的代码实践的。<br />
<br />
<span style="color: blue; font-size: large;">初始化列表</span><br />
vector可用这样的方式来进行初始化:<br />
<blockquote class="tr_bq">
vector<int> vecX = { 1, 2, 3, 4 };</blockquote>
的确是比以前省事了。也就是说,C-Style数组的存在意义又少了一层。<br />
<br />
<span style="color: blue; font-size: large;">统一初始化</span><br />
struct可以被这样初始化:<br />
<pre class="prettyprint">struct C
{
int a;
int b;
int c;
};
C c{1, 2, 3};</pre>
class的public成员也可以。<br />
在某些喜欢使用各种结构体的代码中,这个特性可以让你少写一大堆构造函数。<br />
<br />
<span style="color: blue; font-size: large;">通用智能指针</span><br />
std::shared_ptr<T>,强在可以指向任意对象,缺点也由此而生:由于引用计数保存在shared_ptr中,因此对智能指针的赋值操作是线程不安全的。这个问题,<a href="https://beamnote.com/2014/is-shared-ptr-thread-safe/" target="_blank">有一篇Blog论述</a>,我觉得写得不错,就直接引用不细讲了。从原理和测试数据来看,我认为这篇Blog是靠谱的。<br />
<br />
所以,虽然shared_ptr很强大,但使用场合需要注意:单线程随便用。多线程下,赋值过程要注意。单对单没啥问题,最好不要出现左值右值交叉的情况(一个线程在A=B,另一个线程在B=C)。若因业务需求无法避免的话,要考虑当作临界资源加锁保护。实在不行,就写一个专用智能指针,把引用计数放在T里面,就不会有问题了。<br />
<br />
<span style="color: blue; font-size: large;">正则表达式</span><br />
与散列表类似,不再需要第三方实现,现在C++11也直接支持正则表达式了。我以前要找一个Unicode支持得好的Regex库真的是苦水一堆,现在有了官方支持真的是太好了。superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-13888698151861236362017-05-23T12:24:00.001+08:002023-12-18T10:08:01.429+08:00招行网银在Win10下糟糕的支付体验我这人不用QQ,不用微信,微博借王维林也成功销号。然而,支付宝因为早年上淘宝购过物,搞过那个什么实名认证,我评估后认为不用比用下去可能更不安全,所以账号勉强留了下来。不过我也给自己定下了两条规矩:<br />
<br />
<ol>
<li>不绑定银行卡的快捷支付。</li>
<li>不在里面保留超过200元人民币的余额(含余额宝)。</li>
</ol>
<br />
这两条规矩,使得我的支付宝平时基本上当作零钱包来使用,正式的支付只用在PC+网银上。这样,即使失窃,损失也很有限。再说,花钱方便是方便什么?方便你「败家」而已嘛。<br />
<br />
因为我自己定的这些规矩违反某些方面的利益,所以经常给我形成一些耐性上的挑战。昨天我就又遇到了一次,来自招行网银+Win10。<br />
没有足够的余额,又不开快捷支付的话,在支付宝上支付一笔淘宝订单就只能通过网银了。我以前一直用招行网银,虽然它对Chrome和x64很不友好,但我还是耐着性子开x86 IE来在这种j「特殊场合」将就一下。反正也就是最后一步嘛,登录Alipay集中支付一下就好。但昨天在Win10机器上我又发现了新的问题。<br />
<br />
<span style="font-size: large;">Edge不支持</span><br />
Edge登录支付宝是挺顺利的,但招行网银的页面一打开,直接说这是「使用陈旧技术的页面」,估计是因为ActiveX。要想跨Browser提交表单估计还是做不到的,所以最后还是只有在Win10下打开Internet Explorer。<br />
<br />
<span style="font-size: large;">无管理员权限登录会失败</span><br />
IE下几经折腾,可以打开招行的网银专业版了。然而插入UKey之后一登录就跳出Dialog让我输Key的密码。在确认不是钓鱼软件的情况下,连输4次后,专业版登录界面弹出提示说证书签名有问题云云。<br />
我估计这问题就是因为权限不到位,果然给了管理员权限后就能正常登录了。然而专业版登录界面是从IE页面上Call出来的,这就意味着我得给IE管理员权限才行。这样的话风险就有点高,还好可以手动做单次授权。<br />
<br />
以前我一直觉得,金融行业在IT技术应用上普遍保守,而在国内放眼看来,招行在技术方面还算是相对进取的。现在看来情况已经反转了。x64都普及多久了?IE份额离开绝对优势地位都多久了?Win10正式版都上市多久了?到现在还在用着ActiveX。招行里面搞技术的人这些年都不知道在干啥。曾经引以为傲的服务水平也许还没下滑,但也绝对不算突出了。我是不是该换一家主力银行了?superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com1tag:blogger.com,1999:blog-1452246018852542114.post-71483813197230893122017-05-22T11:36:00.001+08:002017-05-22T11:36:52.953+08:00VMware+Ubuntu声卡失效事件在公司和在家里,都用VMware各自安装了一台Ubuntu 14.04 LTS来玩。在家里的一台用得没有什么问题。在公司的那一台,周末打算加班的时候装个网易云音乐来听歌的时候,发现没有声音,才注意到VMware上有一条报错提示:<br />
<blockquote class="tr_bq">
使用的设备标识号已超出本地系统范围。 声音将中断。</blockquote>
公司电脑上没有接音箱,所以以前曾经禁用过宿主机的Windows Audio服务。我以为是这个原因,去看了一下,Windows Audio服务现在是启用中。把宿主机重启过,故障依旧。于是循例开始Google。<br />
<br />
Google上搜到的中文内容,主要分为两派。一派说把pulseaudio卸载了就好了。我半信半疑地apt-get remove pulseaudio之后,嘿,还真的可以播放出声音了。不过更大的问题来了:系统设置丢了好多图标。回想起apt-get提醒我说要卸载掉的东西有一大堆,看来依赖于pulseaudio的东西不少。这条路应该不是什么正路。真是还好VMware有快照。<br />
<br />
另一派说把宿主机上的立体声混音设备启用,故障就解决了。附和的人不少,看来有不少人都是这种办法解决的。具体页面有很多,随随便便就能搜到,我就不给出了。然而当我按照附带截图的操作指南去做的时候,问题又来了:我根本没有立体声混音设备。<br />
<br />
这是怎么回事?我这人也不习惯卖关子。要说还是英文信息有用。英文页面上也有少数几个人抱怨遇到与我同样的问题(中文页面上我没有看到过)。最后还是VMware官方社区给出了有用的<a href="https://communities.vmware.com/thread/463323" target="_blank">解答</a>。<br />
<div>
<br /></div>
<div>
要简单解释一下的话,其实就是这么一回事:我这个宿主机上的Win7当初装起来之后,偷懒没有安装Realtek官方的声卡驱动程序,而是直接Windows Update安装了微软给出的驱动。估计微软的这个驱动是个阉割版,缺一些东西,装了之后虽然使用起来没什么问题,但像我这次遇到的什么立体声混音设备,大概就是被阉割掉的内容之一。所以VMware找不到指定的设备,于是就没法让Ubuntu中的声音设备正常工作了。</div>
<div>
<br /></div>
<div>
总之,按照VMware官方解答的指引,我去Realtek官网上下载并安装了声卡驱动,现在VMware里面的Ubuntu可以欢快地播放音乐了。</div>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com1tag:blogger.com,1999:blog-1452246018852542114.post-63754555328448449612017-05-21T12:46:00.000+08:002017-05-21T12:46:12.389+08:00正确地获取Windows的版本号以前,想要获取Windows的版本号很简单,有个Win32 API函数名字叫做GetVersion,望文生义,接下来要做的事情就是去MSDN上查下用法就可以了。<br />
现在,GetVersion会被报告成“过期函数”了。也许还能用,但(据MSDN说)起码在Win10上是别指望得到预期的结果了。道理也很简单,Win10都搞定期升级了,版本号规则肯定也和之前不一样了,你还指望这么老的函数能兼容么?<br />
别痴心妄想了,GetVersionEx也一样过期。那么,眼下有什么好办法吗?<br />
<br />
一般来说,拿Windows版本号可能有两种用途:<br />
<br />
<ul><li>我想看看你Windows版本达到我要求没。</li>
<li>我就是想知道你Windows版本号是多少。</li>
</ul><br />
对于前者,微软现在在MSDN上是这样推荐的:它做了一组<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/dn424972(v=vs.85).aspx" target="_blank">Version Helper functions</a>,你如果想知道当前Windows的版本是不是某个特定的发行版,调这组函数就可以。我们来看看这组函数中三个典型:<br />
<br />
<ul><li>IsWindowsXPOrGreater</li>
<li>IsWindowsXPSP3OrGreater</li>
<li>IsWindowsServer</li>
</ul><br />
不需要更多说明,我们从名字中就可以看出,这组函数可以用于判断Windows的大版本,Service Pack的版本(结合大版本),以及能知道是不是服务器版操作系统。通常情况下,这些函数大概是够了。<br />
<br />
但是,有的时候我们并不关心版本号高低,我们只是想要一个版本号(例如记录日志时)而已。微软对此的建议是:用GetFileVersionInfo去获取一个系统DLL(例如Kernel32.dll)的文件版本号(原文看<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms724429(v=vs.85).aspx" target="_blank">这里</a>)。<br />
<br />
相关的代码虽然能找到,MSDN上也有官方例子(有点小Bug),但比起一行GetVersion来代码量实在是不能算很少。由此可见,处理“过期函数”真的没有想象中那么容易。最后我还是提供一下我从项目代码中挖出来的一个实现吧。别照抄,如果你不想引入STL的话:<br />
<pre class="prettyprint">wstring GetOSVersion(const wstring& strWinSysDir) const
{
wstring strWinSysFilePath = strWinSysDir + L"\\Kernel32.dll";
DWORD dwVerInfoSize = GetFileVersionInfoSize(strWinSysFilePath.c_str(), nullptr);
if (dwVerInfoSize)
{
vector<byte> vecVerData;
vecVerData.resize(dwVerInfoSize);
if (GetFileVersionInfo(strWinSysFilePath.c_str(), NULL, dwVerInfoSize, &vecVerData[0]))
{
LPCVOID pBlock = &vecVerData[0];
UINT cbTranslate;
TCHAR SubBlock[50];
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
// Read the list of languages and code pages.
VerQueryValue(pBlock,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate);
// Read the file version for first language and code page.
for (size_t i = 0; i < (cbTranslate / sizeof(struct LANGANDCODEPAGE)); ++i)
{
StringCchPrintf(SubBlock, sizeof(SubBlock) / sizeof(TCHAR),
L"\\StringFileInfo\\%04x%04x\\ProductVersion",
lpTranslate[i].wLanguage,
lpTranslate[i].wCodePage);
LPVOID lpBuffer = nullptr;
UINT dwBytes;
if (VerQueryValue(pBlock, SubBlock, &lpBuffer, &dwBytes) && lpBuffer)
{
wstring strOSVersion(reinterpret_cast<tchar>(lpBuffer));
return strOSVersion;
}
}
}
}
return L"";
}</pre>superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com2tag:blogger.com,1999:blog-1452246018852542114.post-5093801243910419202017-05-20T14:57:00.000+08:002017-05-20T14:57:29.108+08:00SDL检查不报错事件调查报告Visual Studio 2013 VC项目默认是启用SDL检查的。通常而言,这会使得一些“过期”函数在编译时被报告Error。比如strcpy和inet_addr之类都会遇到这个问题。<br />
<br />
理论上讲,这些过期函数的确不安全,或者说容易被不安全地调用。微软也很“贴心”地在编译器的报错信息中给出了解决方案,比如用strcpy_s和InetPton来替换,都不用你去搜解决办法了。所以按照我的习惯,一般是就地解决掉这些问题再往下走。<br />
<br />
不过呢,可能有的人性子比较急,也有的时候是从旧项目移植,想快点编译完先跑一下看看效果。改代码毕竟要时间,从strcpy改成strcpy_s可能还好,而从inet_addr改到InetPton就真的没有想象中那么轻松。所以编译器也给出了另一种建议,你可以设上几个Macro,SDL也是可以被忽略的。<br />
<br />
到此为止都还比较和谐,大家都是有商有量地做事情。然而当我腾出时间准备把过期函数扫扫干净,把同事临时加的Macro去掉之后一编译,问题来了——SDL这次怎么不报错了?<br />
<br />
再三确认过vcxproj中已经没有了相关的Macro,并且SDL的确是打开了。但这次编译就是不会报错,似乎对我面前的strcpy视而不见。为什么呢?<br />
<br />
Google上搜了一大圈也没有方向。最后还是被我排除法硬试出来的——平台工具集如果选了v120_xp,那么SDL即使打开,有些过期函数也不会报错。是不是SDL就此失效,我不清楚,因为我没法去覆盖所有的过期函数。我估计,微软是这样想的:你既然打算让这个程序跑在过期的OS上,那函数过期不过期已经不重要了。<br />
<br />
其实还有一个更重要的原因:strcpy_s还好,但要是把inet_addr真的换成了InetPton,你就会发现在WinXP下你的程序根本就跑不起来。实际上,WinXP就不支持<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/cc805844(v=vs.85).aspx" target="_blank">InetPton</a>。MSDN上的信息表明,最低也要Vista才可以。<br />
<br />
我们的程序暂时还不能抛弃WinXP用户,但若要完全不知道用了哪些过期函数我又心有不甘,于是我打算做一个#if……#else……#endif来解决这个过期OS兼容的问题。搜了一下,正确的姿势应该是:<br />
<blockquote class="tr_bq">
#if (_WIN32_WINNT >= 0x602)<br />
#else<br />
#endif</blockquote>
最后我是在Debug版本上用了平台工具集v120,在Release时还是用了v120_xp。过期函数只会局限在以上Macro范围内,有限度地使用。<br />
<br />
另外,WinXP也不支持条件变量CONDITION_VARIABLE,所以这个服役期超长的操作系统是真的应该淘汰了。我不得不说一句:<span style="color: red; font-size: large;"><b>WannaCry,干得好!</b></span>superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-66601901790586550112017-05-19T11:55:00.002+08:002017-05-19T11:55:17.816+08:00世界都在发展,而我们在翻墙Google I/O 2017,没有熬夜看,只是大致了解了一下主要内容。<br />
一转眼,Google+上线已经快六年,这六年中,热点变了好多次。SNS貌似早已过气,大家都在纷纷议论Google+到底什么时候被砍掉。曾经的热点Android现在已经变成波澜不惊的东西。Glass悄声无息已经很久。无人驾驶汽车现在好多家都在搞。Assistant,Allo,Google现在重点关注的是人工智能了。<br />
也许SkyNet真的会出现,也许Terminator很快就会到来。我倒不太在意“人类被消灭”这种事情。如果能够见证这一时刻,也是一件幸事。<br />
<br />
然而!眼看着世界都在发展,眼看着人类朝着技术奇点越走越近,我们在干什么?我们还在努力翻着墙,网络翻墙,肉体翻墙,精神翻墙,就在下下个周日。superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com5tag:blogger.com,1999:blog-1452246018852542114.post-70773927125220392332017-05-19T09:28:00.004+08:002018-01-10T10:40:26.135+08:00美团那个HR,不是歧视,只是蠢最近有个“美团招聘”事件在网上发酵。孤陋寡闻的我今天才知道。众说纷纭,我也来发表一下意见。<br />
<br />
------------------------------------------分隔线------------------------------------------<br />
<div>
<br /></div>
这位据说来自美团的HR抛出了一个“五不要”的招聘原则,被人发在了网上:<br />
<ol>
<li>不要简历丑的;</li>
<li>不要研究生博士生;</li>
<li>不要开大众的;</li>
<li>不要信中医的;</li>
<li>不要黄泛区及东北人士。</li>
</ol>
<div>
美团说已经把这个人辞退了。简单关注了一下,不少评论意见很简单:要不说这人说得有道理,要不说这人脑残搞歧视。互联网信息快餐时代,简单的意见的确比较容易表述,也比较容易挑口水,所以我觉得我还是写个Blog说一下自己的意见。<br />
<br />
HR的招聘原则,脑子能想,但不能说或写出来。一旦别人知道了,那就是“歧视”。我觉得这个没啥大问题,不过我不关注这个层面。如果原则正确合理,即使是写了出来,我也觉得没啥问题。但是这“五不要”到底有没有道理,我觉得一定要分开来一条一条地看。如果你要么全盘接受,要么全盘否定,那么有可能脑子不太好使,请去医院挂号。<br />
<br />
<b><span style="font-size: large;">不要简历丑的</span></b><br />
“丑”这个词,很主观。所以这个HR这样写出来,脑子不会太好使。主观的形容词你只能自己用,给别人讲了也无意义。你心中的“丑”跟别人心中的“丑”肯定不是同一回事。<br />
那么,这一条有没有道理呢?当然有道理。招聘的考察因素当然可以包括被招聘者的审美和美术功底,包括排版能力。就算不是相关岗位要求的技能,但“审美观”作为对一个人综合素质的要求是并没有什么问题的。这一条,道理上没问题,只是不能写出来,因为写了也没意义。<br />
<br />
<b><span style="font-size: large;">不要研究生博士生</span></b><br />
首先这一条写得有点问题,如果写成“不要研究生及其以上学历者”或“只要本科(含)以下学历者”可能更合适。不过我也不想抠这种文字上的细节。单看这一条表述的意思,一点问题也没有。招聘条件中对于学历的要求,这个能有什么问题?也许其他人觉得HR是歧视高学历者,但也可能是岗位不需要,或简单的“雇不起”。你要是看出来里面有“歧视”,那其实只说明你心里才有“歧视”。<br />
<br />
<b><span style="font-size: large;">不要开大众的</span></b><br />
我初看到这一条时感觉简直是“这人神经病”。“开大众的”怎么着你了?撞你了还是蹭你车了?上网一搜才知道所谓“神车”是啥意思。<br />
那么我们现在知道HR是什么意思了。不过,这一条问题很大。HR不想要具备某种价值观的人,这个很容易理解。但是开个大众车就一定具有某种价值观吗?可以举出反例的情况太多了。后面的分析会告诉我们,这个HR一定不是一个好的理科生,他的逻辑学连基础都没有。<br />
<br />
<b><span style="font-size: large;">不要信中医的</span></b><br />
这一条没有问题。信中医的会有什么价值观,我们还是很清楚的。HR不想要有这种价值观的人,那是他的自由,一点问题也没有。<br />
<br />
<b><span style="font-size: large;">不要黄泛区及东北人士</span></b><br />
看到这一条我又糊涂了。什么是“黄泛区”?黄皮肤泛滥?三藩还是雪梨?查了一下才知道说的是河南那片儿。不过总之“地图炮”仨字跑不掉。<br />
这一题也跟第三条一样,问题很大。你一个HR招个白领而已,要考察的无非主要就是能力和性格。这两样哪个跟地区有必然的关系?<br />
<br />
------------------------------------------分隔线------------------------------------------<br />
<br />
好了,现在我们来看看这位HR犯了什么毛病?<br />
他的问题不是“歧视”。他是脑残,<b><span style="color: red;">是逻辑没学好。</span></b>他不知道什么是充分条件,什么是必要条件。我估计他中学时平面几何的分数一定很低。<br />
<br />
招人的时候,你若是HR,一定会提一堆的条件。这些条件里面,有一些是你要求应聘者必须满足的,不具备的话就别来了,来了也没用。这种叫做“必要条件”:若要应聘我司,必须如何如何。通常这类条件都会是“白名单”形式,符合这类条件,你只是有了资格,但并不保证一定会被聘用,也不保证不会被其它条件给刷掉。<br />
还有一类条件,如果你符合了,你就别来了,不会考虑你的。排除性的,也就是上面提到的“XX不要”。这类条件,叫做“充分条件”:你只要如何如何,我就一定不要你。注意,这里一定是“黑名单”性质。除了骗子公司,没有HR会说“只要你符合XX条件,我就一定要你”。全世界都没有,不然这家公司早倒闭了。<br />
<br />
黑名单有效的前提,是该条件可以充分覆盖HR希望避免的区域。换句话说,你排除掉的,一定是你不想要的。你的条件和你要的结果,中间要有逻辑关联性。举个例子:你不喜欢染头发的员工,你就列一条“不得染发”。你要列一条“必须是黑发”,那就有问题了。因为你这个条件涉及到了那些天然非黑发者,却并没有排除掉“染成黑发”者。结果就是,从正反两个方面,你想要的效果都没有达到。我们就会说你这个条件订得有点脑残。<br />
美团这个HR的第三条和第五条就是如此。开大众的也许有价值观不符的,但也有跟价值观无关的。价值观不符合你要求的人,自然也有开其它品牌车的。“黄泛区”和东北人士可能有很多人你不喜欢,但这么多人你能确定所有人都不对你胃口?其它地区的人就都对你胃口?<br />
所以啊,列出了这两条惹口水的条件,却既不能完全排除你不想要的人,还可能“误伤”本来符合你条件的人。站在公司立场看来,这种HR完全就是在瞎鸡巴搞,本职工作显然不合格,被辞退掉完全是活该。站在我们旁观者的立场,歧视归歧视,要是歧视得有道理,比如“不招共产党员”,我们都会点头称是。你要是说“不招关注过郭文贵者”,我们都会骂你脑残欠抽。<br />
<br />
少年们,无论将来干什么工作,请先学好逻辑!</div>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-53316018252201431372017-05-18T11:59:00.000+08:002017-05-18T11:59:16.245+08:00当Win7 Windows Update 遭遇 0x80073712Windows Update一直以来都以会遇到各种Error代码而闻名。今天又遇到一例,记录一下。<br />
<br />
起因是WannaCry。我有一堆各种OS版本的虚拟机,其中一台Windows7 SP1 x86使用得很不频繁,昨天打开一看,上次Windows Update已经是2016年09月的事情了。虽然NAT挡在宿主机后面其实不会有啥问题,但是按照我的习惯,下班前还是让它去打了补丁。曾经在上一家公司的遭遇一直在提醒我:有人的虚拟机中了震荡波,然后不知情的时候被做了快照,于是每隔一段时间测试机房就会忙活一阵子(测试机为了测试程序的补丁管理功能是不打补丁的)。<br />
<br />
今天早上一来,红色儿的,4个成功2个失败。我也没太放在心上,公司网络有时候会断,说不定是下载失败。再来了一次,在下载到11%的时候又失败了。我把VPN开起来(曾经有不开VPN打补丁会下载失败的经历),上了个厕所回来,然而这次还是失败,我看了下ErrorCode:80073712。每次都是这个。好吧,开始<a href="https://www.google.com/#newwindow=1&q=windows+update+0x80073712" target="_blank">Google</a>。<br />
<br />
<a href="https://support.microsoft.com/en-us/help/957310/windows-update-error-0x80073712" target="_blank">官方网页</a>推荐的做法大概是这样的:对于Win7而言,首先请先尝试用SFC修复一下。如果还不行,那么请下载工具<a href="https://support.microsoft.com/en-us/help/947821/fix-windows-update-errors-by-using-the-dism-or-system-update-readiness-tool" target="_blank">System Update Readiness tool</a>进行修复。<br />
<br />
SFC这货其实没啥鸟用,反正我每次用都没啥好结果。这次也不例外,扫描到44%时告诉我:虽然我们发现有错,但是无法修复,你去看日志吧。<br />
<br />
试了下再次Windows Update,还是报0x80073712。好吧,只好试试看那个修复工具了。下载下来两百多MB,安装了老半天。再次Windows Update,这回进度开始超过11%了,我长舒一口气。终于OK了。<br />
<br />
顺便瞄了一眼同页面上对WinXP的问题处理建议,仅仅提到SFC。看来真的是该放弃这破烂了。superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-79482646080681312312017-03-29T17:39:00.001+08:002023-07-20T16:45:37.375+08:00对VS2013下C++11的精准转发与通用引用的一点研究在C++11中,允许用以下方式编写模板函数:<br />
<pre class="prettyprint">#include <iostream>
#include <string>
class A
{
public:
template <typename T>
void foo(T&& t)
{
T _t = std::forward<T>(t);
}
};
int main()
{
std::string s1 = "test";
A a;
a.foo(s1);
std::cout << "1:" << s1 << std::endl;
a.foo(std::move(s1));
std::cout << "2:" << s1 << std::endl;
a.foo("ok");
}</pre>
<div>以上代码在Visual Studio 2013上测试通过。输出是:</div><blockquote class="tr_bq"><pre>1:test
2:</pre></blockquote><div>可以看到,模板函数A.foo只有一个声明和实现,但既可以接受左值,也可以接受右值。并且当S1被当作右值引用传入的时候,其值是确确实实被“丢弃”了。这就是所谓的<span style="color: blue;"><b>精准转发</b></span>(把t的类型准确地传递到使用者),以及<span style="color: blue;"><b>通用引用</b></span>(用一个T&&就可以表示所有的情况)。对于要写库的程序员来说,可谓是一个福音了。</div><div>然而,对于模板类,下面的写法看上去很好,但是编译会报错的:</div><pre class="prettyprint"><span class="nocode" style="color: red;">template <typename T></span>
class A
{
T _t;
public:
void foo(T&& t)
{
_t = std::forward<T>(t);
}
};
int main()
{
std::string s1 = "test";
<span class="nocode" style="color: red;">A<std::string> a;</span>
a.foo(s1);
std::cout << "1:" << s1 << std::endl;
a.foo(std::move(s1));
std::cout << "2:" << s1 << std::endl;
a.foo("ok");
}</pre>
<div>编译后报错:</div><blockquote class="tr_bq"><pre>error C2664: “void A<std::string>::foo(T&&)”: 无法将参数 1 从“std::string”转换为“std::string&&”
with
[
T=std::string
]
无法将左值绑定到右值引用</pre></blockquote><div>这大概是因为,T的类型在A<std::string>的时候就确定了,因此编译器无法进行更多的类型推导。</div><div>那么怎么办呢?其实也不难,foo函数像下面这样写就可以了:</div><div><pre class="prettyprint">template <typename T>
class A
{
T _t;public:
<span class="nocode" style="color: red;">template <typename X></span>
void foo(<span class="nocode" style="color: red;">X</span>&& t)
{
_t = std::forward<<span class="nocode" style="color: red;">X</span>>(t);
}
};</pre><div>在函数模板中用一个新类型就可以了。如果T跟X不一致,那么编译器反正会检查出来的。不用担心。</div></div><div>还有一个问题:有的时候我们会把foo的实现写在class的外面。那这个时候怎么办呢?</div><div>我本来想抛题目给大家去做。不过都到最后了卖关子也没什么意思,还是直说吧:</div><div><pre class="prettyprint">template <typename T>
class A
{
T _t;public:
template <typename X>
void foo(X&& t);
};
<span class="nocode" style="color: red;">template <typename T></span>
<span class="nocode" style="color: red;">template <typename X></span>
void A<T>::foo(X&& t)
{
_t = std::forward<X>(t);
}</pre><div>标红的两行,只能是这个顺序。类的模板定义在上面,函数的模板定义在下面。颠倒过来,报错。要写在一行也可以,先左后右就行。但是要想把尖括号打开强行并成一句,报错。</div></div>superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-86155157691294683392017-03-06T10:39:00.000+08:002017-03-06T10:39:36.423+08:00作死的TerminateThread<div class="tr_bq">
有一天早上,我收到了一个来自同事的Dump文件。打开一调试,报错信息如下:</div>
<blockquote>
0x77B16BB9 (ntdll.dll) (XXX.dmp 中)处有未经处理的异常: 0xC0000005: 读取位置 0x1C7695E8 时发生访问冲突。</blockquote>
我一般首先会去看CallStack,因为PDB都有,所以得到的情况很清晰:<br />
<blockquote class="tr_bq">
ntdll.dll!RtlpWakeByAddress()<br />ntdll.dll!RtlpUnWaitCriticalSection()<br />ntdll.dll!_RtlLeaveCriticalSection@4()<br />XXX.dll!RecMutex::unlock()<br />XXX.dll!LockT<RecMutex>::~LockT<RecMutex>()<br />……</blockquote>
这个调用栈看得我有点糊涂。这个RecMutex来自ICE的最新版本,我从1.3.0版就开始用ICE,用到现在的3.6.3。这种基础的代码我有信心不会有问题,也不会用出问题来。何况RecMutex只是对CRITICAL_SECTION的一个简单封装,代码并不多,也并不复杂。我这次在自己项目代码中用之前恰好看过一遍,也认为这里面不会有什么问题。<br />
具体到RecMutex::unlock(),其实也就是干了这个事情:<br />
<blockquote class="tr_bq">
void RecMutex::unlock() const<br />{<br /><span class="Apple-tab-span" style="white-space: pre;"> </span>if (--_count == 0)<br /><span class="Apple-tab-span" style="white-space: pre;"> </span>{<br /><span class="Apple-tab-span" style="white-space: pre;"> </span>LeaveCriticalSection(&_mutex);<br /><span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />}</blockquote>
<div>
这个问题并不是每次都能重现。于是可以肯定跟“多线程”有关系。很显然,LeaveCriticalSection()这种级别的Win32 API调用绝对不会存在着会导致Crash的Bug,否则微软早就死翘翘了,所以问题肯定出在那个_mutex上。然而,既然if语句能进来,那么this指针一般来说是对的。因为是Release版本,优化导致了LocalVar的显示不是那么可靠,不过跟踪ESP的情况最终验证了我的猜测是对的——至少到这个时候,栈还没有坏掉。</div>
<div>
<br /></div>
<div>
这个_mutex就是一个CRITICAL_SECTION。那么我就很头大了。多线程出问题,一般是临界区被搞坏了。然而CRITICAL_SECTION本身就是用来保护临界区的。它什么情况下会被搞坏掉呢?</div>
<div>
<br /></div>
<div>
接下来的汇编代码,Debug起来就很有些难度了。我只能大致确认,在_RtlLeaveCriticalSection()中,_mutex还没有坏掉。但在RtlpWakeByAddress()中就肯定坏了。至于RtlpUnWaitCriticalSection()的情况就不是很清楚了。</div>
<div>
<br /></div>
<div>
到此时,三个小时已经过去了。正面Debug似乎走入了泥沼,现在只剩下“程序不会闹鬼,一定要查个水落石出”的精神还在支撑着我。起来上了个厕所,我换了条思路:问Google。</div>
<div>
Google果然厉害,哪怕只是简单的<a href="https://www.google.com/#newwindow=1&q=RtlpWakeByAddress&*" target="_blank">关键词搜索</a>,第一条搜素结果就<a href="http://stackoverflow.com/questions/39635817/windows-10-specific-crash-on-call-leavecriticalsection" target="_blank">直指要害</a>。</div>
<div>
<br /></div>
<div>
其实第二条搜素结果也很正确,不过Reddit毕竟还是没有StackOverflow专业。这个问题所描述的现象,跟我遇到的是一模一样。而且给我Dump文件的那个同事用的OS的确是Win10</div>
<div>
。我最感激的是这哥们问题的开头一段几乎直接就回答了我的疑惑:TerminateThread。该死的!肯定有人在做这种事情。</div>
<div>
<br /></div>
<div>
我当然是知道的。<b><span style="color: red;">TerminateThread会造成各种各样千奇百怪的问题。</span></b>正常的应用层操作的确不太可能造成CRITICAL_SECTION本身被搞坏(除了把栈写坏),然而TerminateThread这种东西是一定会干得出来的。大多数程序员都知道TerminateThread不靠谱,所以都不会去用,这个已经几乎成为常识了。于是有一个坑爹的后果就是:一旦有人真的这样干了,正常人全部懵圈,因为没人想到会是这个原因。多谢这哥们把这种问题给问了出来,否则我可能还要花更多的时间在它上面。</div>
<div>
<br /></div>
<div>
接下来的事情就很简单,找出谁在用TerminateThread。其实也没那么简单,因为我找了一圈,都没发现相关的代码。我都有点开始怀疑自己是不是碰到了别的情况。这个时候我突然想到:会不会是别人的库里面有问题呢?</div>
<div>
<br /></div>
<div>
我当然用到了一些开源第三方库,不过我相信它们不会犯这种错误。它们就算要用到TerminateThread,也肯定是作为程序退出之前的强制性措施来使用,正常运行情况下是绝对不会这样用的。</div>
<div>
<br /></div>
<div>
相比较而言,我比较不信任其它组同事写出来的“中间件”。一问之下,那个写“中间件”的同事,也用了另外一个组提供给他的一些开发库。再追着问,果然,那个开发库里面对线程的封装,在退出“超时”的情况下调用了TerminateThread。</div>
<div>
<br /></div>
<div>
至此,水落石出了。这个Dump文件的确就是在调用了那个中间件的关闭接口之后不远的地方产生的,并且产生之前确实很明显地出现了“超时”的现象——界面卡住了约5秒没有动。可想而知,由于停线程超时,于是就去调用了TerminateThread。那个开发库的编写者大概以为,这样就可以让程序继续跑下去。然而这只是他的一厢情愿。用过TerminateThread之后,系统的行为就会是undefined的了。现在可能不会Hang,但是接下来会出现各种莫名其妙的错误,到那个时候必然将会更难调试。这种“保证线程可以被停掉”的代码我宁可不要。浪费时间,不就是在浪费生命么?</div>
<div>
<br /></div>
<div>
在最后,再次警告大家:<b><span style="color: red;">珍爱生命,远离TerminateThread。</span></b></div>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com2tag:blogger.com,1999:blog-1452246018852542114.post-57123452810020802952017-02-03T17:27:00.000+08:002017-02-03T17:27:24.523+08:00折腾boost::python的一些收获<div>
最近从事了一些通过boost在C++中调用Python脚本的工作。折腾下来有一些收获,记录一下,也许也可以帮到有些人。<br />
<br />
<h4>
一、关于万能变量类型</h4>
<br />
对于习惯了Python的C++程序员而言,boost::python::object这个东西是一个巨大的诱惑。它让你几乎可以像在Python里面那样使用弱类型的变量,同时还支持数组和字典之类的复杂变量类型,并且还支持嵌套。这简直就是一个万能变量类型,有了它,常见的需求几乎都可以满足了。<br />
<br />
而且它还快,还容易用。它其实是PyObject*的一个封装,也就是说PyObject*其实功能也一样,但是没它容易使用。JsonCPP里面的Json::Value也可以“万能”,但性能与boost::python::object相差颇多。这真的是一个巨大的诱惑。<br />
<br />
但是在这里,我要给大多数C++程序员泼一盆冷水。在单线程下,这个梦想可能真的是事实:但是在多线程下,boost::python::object就是一个<span style="color: red; font-size: x-large;"><b>坑</b></span>!<br />
<br />
boost::python::object为什么快?因为它基于PyObject*,具有引用计数,所以赋值才飞快,浅拷贝嘛。但是引用计数的问题就是线程不安全。<br />
<br />
当然,光是引用计数本身不会导致线程安全性问题,导致问题的是引用计数带来的临界区对象引用问题,而归根结底,是Python C API的“并发问题不归我管”的思路。boost::python的封装机制使得对象引用不好控制,也不太可见。想法是好的:使用者不需要关心这些。但现实就很无奈了。<br />
<br />
所以,尽管很不甘心,关于万能变量类型的实现,我还是老老实实地用回了Json::Value。<br />
<br />
<h4>
二、类型转换与判断</h4>
<br />
要从boost::python::object转换成C/C++原生变量类型,一般用boost::python::extract<T>。转出来的对象调check()就可以确定是不是正确的类型。转boost::python::list或boost::python::dict也是一样。<br />
<br />
有一点需要特别注意的是:用boost::python::extract<bool>的时候,很可能得不到你预想的结果。你会发现,int也被转成bool了(check()返回true),反过来也一样。这个不是Bug,是boost::python故意这样搞的。BOOST_PYTHON_BOOL_INT_STRICT宏可以解决这个问题(必须改动boost::python源代码并重新编译,因为相关代码在cpp里面不在头文件里面),它使得int和bool将被严格区分。<br />
<br />
但是boost::python之所以把int和bool混起来用也不是没有道理的。这样使得MFC里面的那些BOOL(不是bool)类型的函数形参(和返回值)可以直通Python,封装起控件来尤其方便。如果你设了BOOST_PYTHON_BOOL_INT_STRICT,就不能这样干了,必须显式转换。左是一刀,右也是一刀。你们自己掂量吧。<br />
<br />
反正我是没有去加BOOST_PYTHON_BOOL_INT_STRICT,而是自己通过_stricmp(value.ptr()->ob_type->tp_name, "bool")搞定的。<br />
<br />
<h4>
三、清空boost::python::list</h4>
</div>
<br />
用惯STL刚开始用boost::python的人可能会头大——怎么dict有clear()但list没有?<br />
答案很简单,因为Python C API没提供,所以boost::python就没有。<br />
<br />
说到底,boost::python就是对Python C API的一个封装而已。你如果去看boost::python的源代码,甚至会发现里面不少的“成员函数”其实是跑去执行了一句Python脚本。不了解细节的C++程序员很容易在这种地方栽跟头,所以我觉得boost::python绝对不会是一个终极形态。<br />
<br />
要想清空数组,并不是完全没有办法。我找到的一个办法是boost::python::delitem(list, boost::python::slice())。并发调用时记得用本文最后一节的办法加锁。但是我是真的不建议在多线程环境下用boost::python,太多坑了。如果实在要用,在完成了Python脚本调用,把数据转换好之后,就赶紧离开boost::python区域吧。<br />
<br />
<h4>
四、boost::python::object深拷贝</h4>
<div>
<br />
boost::python::object默认的赋值操作都是作浅拷贝,极快。然而,有的时候需要深拷贝怎么办呢?<br />
<br />
简单数据类型直接extract出来就是深拷贝(传值)了。会有问题的仅仅是复杂数据结构,具体地说,list和dict。<br />
<br />
dict又是有提供copy(),理由还是——Python里面的dict有copy(),而list就没有。我尝试过最简单的办法,就是把一个list放到一个dict里面去copy()完再拿出来用。这样肯定可以达到目的。至于有没有更好的办法呢?我反正是自那之后就弃坑了,你们去研究吧。<br />
<br />
<h4>
五、多线程并发加锁</h4>
<br />
C++调Python的时候的加锁是一个不小的话题。不过这方面中文资料也算不少,有兴趣可以去搜来研究。我这里就简单地说一下跟boost::python相关的部分。<br />
<br />
加锁是用PyGILState_STATE,像这样:<br />
<blockquote class="tr_bq">
PyGILState_STATE gstate;<br />gstate = PyGILState_Ensure();<br />…… // 调用Python脚本<br />PyGILState_Release(gstate);</blockquote>
</div>
<div>
这种例子网上很多,就不细说了。</div>
<div>
关键在于,我前面也提到了,boost::python里面很多看起来是object的成员函数的东西,其实都是对Python脚本的调用,所以都得加锁。</div>
<div>
<br /></div>
<div>
<b><span style="color: blue;">事实上,只要你用到了boost::python的地方,都得加锁。</span></b>不管是module和call这种看起来就跟“调用”二字相关的,还是在对boost::python::object作数据处理,看起来人畜无害的,都得加锁,无论读/写,否则你就等着爆吧,特别是服务端程序。</div>
<div>
<br /></div>
<div>
这也就是我一再警告避免在多线程下使用boost::python的原因。当然,我这边是不得不用,只能小心翼翼,如履薄冰,然后尽量控制不要让菜鸟程序员去写这种代码。由此可见,隐藏了实现细节并非全是好事,也并非全是对新手有益。</div>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-10689454992745555382016-12-04T20:30:00.000+08:002017-05-31T12:59:44.537+08:00记一次恶劣的淘宝购物经历我现在已经基本不用淘宝了,不过老婆还是喜欢在上面逛,也因此有了这次很恶劣的购物经历。<br />
<div>
东西是一个小孩子用的书包。很便宜,29元RMB。我其实一直跟老婆在说“便宜没好货”,但是便宜的诱惑的确很大。买到手的过程很顺利,2016年11月05日下单,11月07日就物流签收。</div>
<div>
东西是帮别人买的,所以一开始没有怎么放在心上。过了几天,老婆问对方书包怎么样,别人明说:“质量不好,第一天背带就开线了。”这怎么行?赶紧联系卖家要退货。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglUDmRooRygIygeesWJ6QpA-sZGW6Hr_9CUUU8KBhKei0jSINECqf9Uxi0w8VBTpIVa696CcsOovGfcAoJTopfSJJIa-owe0WbIzvCBleDOCYQtftGJToVS_ItY88kxL9otRh9F8T3mbU/s1600/%25E8%25B4%25A8%25E9%2587%258F%25E9%2597%25AE%25E9%25A2%2598.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglUDmRooRygIygeesWJ6QpA-sZGW6Hr_9CUUU8KBhKei0jSINECqf9Uxi0w8VBTpIVa696CcsOovGfcAoJTopfSJJIa-owe0WbIzvCBleDOCYQtftGJToVS_ItY88kxL9otRh9F8T3mbU/s400/%25E8%25B4%25A8%25E9%2587%258F%25E9%2597%25AE%25E9%25A2%2598.jpg" width="300" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
看到图片我其实并不奇怪。29块钱的东西质量能好到哪里去?卖家还说去修,然而这种质量我觉得还是直接退掉麻烦比较少。在我看来其实当初就不应该买这个东西。卖家倒也爽快,因为是质量问题,图片显示得也很清楚,退就退吧。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsgaCnKiuRskhWQsrh5rvjKJPCEbn9AUEgBR4WS7vT63Vlp94-YK4UugaFoc04d-elHl_SbBzwQEcu5GBvFhpsMZqIdlXT5XwEze_TmHZ_igocYA1RooMcyBNVn8uofrL0l_6i5Ovx5V8/s1600/%25E8%25AE%25B0%25E5%25BD%25951.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsgaCnKiuRskhWQsrh5rvjKJPCEbn9AUEgBR4WS7vT63Vlp94-YK4UugaFoc04d-elHl_SbBzwQEcu5GBvFhpsMZqIdlXT5XwEze_TmHZ_igocYA1RooMcyBNVn8uofrL0l_6i5Ovx5V8/s320/%25E8%25AE%25B0%25E5%25BD%25951.jpg" width="179" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_1ne4iB819VFUTQ6TVKu98s6nK04ygAeCvpAB6mfnK67n6jP2FgX0hFQxi5wXy_qXMyhGp-6DUITiPQshxLlGry1nO2Pr_Ce_cJXq5JVwJokNpNV2Yipe56IPZtupoRcs4jdVc6Pb6KU/s1600/%25E8%25AE%25B0%25E5%25BD%25952.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_1ne4iB819VFUTQ6TVKu98s6nK04ygAeCvpAB6mfnK67n6jP2FgX0hFQxi5wXy_qXMyhGp-6DUITiPQshxLlGry1nO2Pr_Ce_cJXq5JVwJokNpNV2Yipe56IPZtupoRcs4jdVc6Pb6KU/s320/%25E8%25AE%25B0%25E5%25BD%25952.jpg" width="180" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPZzBtROVKsqtqLgD-iyy8TFScDBehop03meeQS6khXGupARAggLMsnhXZdiVTtT39Rxob8rrF0nMSfha7SrVZ5W7XDiVTZNFM8_vbiaFk055tKO90KAJuWKjWb9PSPWlPKtZFNBBeCU0/s1600/%25E8%25AE%25B0%25E5%25BD%25953.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPZzBtROVKsqtqLgD-iyy8TFScDBehop03meeQS6khXGupARAggLMsnhXZdiVTtT39Rxob8rrF0nMSfha7SrVZ5W7XDiVTZNFM8_vbiaFk055tKO90KAJuWKjWb9PSPWlPKtZFNBBeCU0/s320/%25E8%25AE%25B0%25E5%25BD%25953.jpg" width="180" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
到这里都还好,不过两个麻烦事情已经露出端倪了:</div>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<ol>
<li>卖家要求买家“包装好”,这个本身不算不正常,但我知道会有后招。</li>
<li>卖家言明退货只负担10元运费。</li>
</ol>
<br />
<div class="separator" style="clear: both; text-align: justify;">
这两件事情,注定会导致买家的不快。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieMsLjP2ap01oIJDfVX0jJm7ZNShszDS9gTNXL8DyJRNyWIvwFJvAk1tKk92pyuL37WPYeU7ln6nu7yYp9RL2lKvRta6KqFaXn2PZVGein0I7Y7xZe2XjR4hjmzxe6h1kvcxb4pLVaDeo/s1600/%25E8%25AE%25B0%25E5%25BD%25954.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieMsLjP2ap01oIJDfVX0jJm7ZNShszDS9gTNXL8DyJRNyWIvwFJvAk1tKk92pyuL37WPYeU7ln6nu7yYp9RL2lKvRta6KqFaXn2PZVGein0I7Y7xZe2XjR4hjmzxe6h1kvcxb4pLVaDeo/s320/%25E8%25AE%25B0%25E5%25BD%25954.jpg" width="180" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
“脏了就拒收”,这种话大概也只有淘宝卖家讲得出来。如果你这个产品有严重的质量问题,一用就碎成渣了,那是不是就不能退货了呢?</div>
<div class="separator" style="clear: both; text-align: justify;">
事实上,卖家想要让商品能够二次销售,对于买家而言这是个可以理解的事情。但是用这种方式讲出来,买家会有什么感受大家都很清楚。之前只是觉得你东西不好,现在就觉得你人不好了。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1EA4CyM57SieuPHCGxkZtLfXIpOf7uzjcEaRL9R3cs7EnDbvbo1zVYgZKvVZ6YP-GpSvI3GN-IeaVZ4xCmWJtrpSCK5QGksuN4yd6IuINDhEDrq7BUdBrn-KgGX6iv1v5-uWXwL6E2Y8/s1600/%25E8%25AE%25B0%25E5%25BD%25955.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1EA4CyM57SieuPHCGxkZtLfXIpOf7uzjcEaRL9R3cs7EnDbvbo1zVYgZKvVZ6YP-GpSvI3GN-IeaVZ4xCmWJtrpSCK5QGksuN4yd6IuINDhEDrq7BUdBrn-KgGX6iv1v5-uWXwL6E2Y8/s320/%25E8%25AE%25B0%25E5%25BD%25955.jpg" width="180" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
对于退货的时候产生的运费问题,淘宝的政策是“建议卖家和买家协商解决”。也许有的人觉得这很合理,毕竟每个个案的情况都各不相同嘛。然而,我对淘宝最大的厌恶之处,就在于这个“在淘宝上买点什么都要开‘汪汪’协商”。明知退货运费这种事情卖家和买家是一定会有矛盾,还要他们“协商解决”,其实就是自己不想解决嘛。</div>
<div class="separator" style="clear: both; text-align: justify;">
按照淘宝的说法,以及一般人的常识理解,因为质量问题导致的退货,运费肯定是应该由卖家负担的。我也不太清楚这个卖家理直气壮的原因,也许是“业界潜规则”,也许是“小本经营”。具体原因也许都可以商量讨论,但是买家会有什么感受,大家仍然会很清楚。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcM0svkbT0pH2Zne9NhzLrU_oOJ6ekaZyVoAUas8FTzaJaIPaXp9UTZFemXzl57I5PgQFdQGOFhFfYM_Q531L_2i875XsEl8hF6saNlHkmy4x6SMJjd3G65hRLGYBfgBM-d8AzNaWstOQ/s1600/%25E8%25AE%25B0%25E5%25BD%25956.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcM0svkbT0pH2Zne9NhzLrU_oOJ6ekaZyVoAUas8FTzaJaIPaXp9UTZFemXzl57I5PgQFdQGOFhFfYM_Q531L_2i875XsEl8hF6saNlHkmy4x6SMJjd3G65hRLGYBfgBM-d8AzNaWstOQ/s320/%25E8%25AE%25B0%25E5%25BD%25956.jpg" width="180" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibJhEOPzFjrwz-eLaszsRmezyCPPBytlfJq1TCrll-lCM2GRgUlZuY6aQGmPvcIN0zQ2amCPPdkiv29t3WtiGesUkRFbu9Dw_kEtoTQemZeU7ZXwHxJ6z6ugHuESESiNRwUvLyJ5Aw7-c/s1600/%25E8%25AE%25B0%25E5%25BD%25957.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibJhEOPzFjrwz-eLaszsRmezyCPPBytlfJq1TCrll-lCM2GRgUlZuY6aQGmPvcIN0zQ2amCPPdkiv29t3WtiGesUkRFbu9Dw_kEtoTQemZeU7ZXwHxJ6z6ugHuESESiNRwUvLyJ5Aw7-c/s320/%25E8%25AE%25B0%25E5%25BD%25957.jpg" width="180" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhGBYxlowuwFDuyry_GMyS0vG5pK9mJdYOjvo-6PC4cIGJFnWeXfulqBLwaHo1XiX12FIwtPqSuo3MR3BioIwd3dKApdZeUK0kvx3gSJdMrUvEGj3-IWbR9g79UbTzWcAdBJXWfgxe_SY/s1600/%25E8%25AE%25B0%25E5%25BD%25958.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhGBYxlowuwFDuyry_GMyS0vG5pK9mJdYOjvo-6PC4cIGJFnWeXfulqBLwaHo1XiX12FIwtPqSuo3MR3BioIwd3dKApdZeUK0kvx3gSJdMrUvEGj3-IWbR9g79UbTzWcAdBJXWfgxe_SY/s320/%25E8%25AE%25B0%25E5%25BD%25958.jpg" width="180" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
然后高潮就来了,卖家开始耍流氓了。自从淘宝上的退货流程走完之后,直接不理睬买家。也不拖黑,也不对骂,就是不出声。这个时候淘宝的另一个坑跳出来了。</div>
<div class="separator" style="clear: both; text-align: justify;">
对不起,你不能投诉卖家,因为已经过了时间。</div>
<div class="separator" style="clear: both; text-align: justify;">
淘宝规定,“交易成功”15天以后,就不能再投诉卖家了。我也搞不清楚这个15天到底合理不合理,但是显然,卖家只要把时间拖过这15天,谁都拿它没办法了。偏偏我和我太太之前都不知道这个“15天”的事情。</div>
<div class="separator" style="clear: both; text-align: justify;">
而且,我太太之前刚收到货时已经手快把好评先给了。</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
事情呢,我大概已经说完了。淘宝既然不提供渠道,我个人要救济自然是很困难。除了去追加一个评论,上传几张图片,以及写这篇部落格,我还能做的最多是去工商局闹腾。这方面我完全不抱什么希望。</div>
<div class="separator" style="clear: both; text-align: justify;">
至于这个淘宝卖家呢?情感上我当然希望它倒闭关张大吉。不过,淘宝上也有好卖家,这个也是事实。林子大了什么鸟都有,不可能人人都是垃圾。我自然是不会忍气吞声。该做的事情,我已经做了,这也是为什么我不会对图片打码的原因。该付的代价,我们也已经付了。至于剩下的事情,就让它顺其自然吧。15块钱差不多够买一盒感冒药的。</div>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-28561967847526277882016-09-13T13:37:00.001+08:002021-07-16T11:38:42.348+08:00自定义域名又回来啦本来以为,自定义域名以后就跟我的Blog没什么关系了。但今天想起来,GoDaddy不是west263。共产党可以不准国内的ISP提供URL转发功能,但毕竟还奈何不了GoDaddy。自定义域名的事情,用URL转发就可以解决嘛。<br />
<br />
于是,本来的自定义域名,从CNAME+VirtualHost变成了URL Forward。虽然据说在搜索引擎的打分上会有“惩罚”,但这些不是我关心的。有总比没有好。而且,URL Forward可以把HTTP的流量导到HTTPS上。这对于目前这个全局SSL的时代本来就是必然的趋势。这样一来,反倒是比之前的效果还要好了。<br />
<br />
反正都要翻墙,对吧?<b><span style="color: red;">这年头干啥不得翻墙?</span></b>superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0tag:blogger.com,1999:blog-1452246018852542114.post-16448032720900486512016-08-24T16:25:00.000+08:002016-08-24T16:25:08.513+08:00与自定义域名说再见了很长一段时间以内,我都把我托管在Blogger上的这个blog,绑定上了自定义域名blog.superliufa.com。这样做的好处很明显——可以实现免翻墙。通过非官方的GHS,即使用HTTP也不会被GFW阻挡。<br />
只可惜我上一个blog“歇业”太久,所以即使绑上了自定义域名,也已经不能为我带来多少“老”的流量。并且,随着时间的推移,自定义域名的缺点越来越明显:用了自定义域名,就不能享受Google提供的HTTPS待遇。<br />
而所谓的“免翻墙”好处,对于有一些来自Blogger/Google的公用资源还是无能为力。比如有的读者就反映,说页面要等好久才能打开,而且布局有问题。这些其实都是GFW捣的鬼。<br />
<br />
我现在也不想去跟GFW玩“捉猫猫”的游戏了。反正不翻墙的人我一不指望二也不希望他们看到我的blog,索性就扔掉自定义域名,用blogspot.com的域名直接来访问我的托管blog吧。愿意装睡的,就算你扇它耳光也不会醒,愿意当个人的,你拿枪指着他还是不会征服他的心。<br />
<br />
那么,就让一切都回归它的本来面目吧。superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com3tag:blogger.com,1999:blog-1452246018852542114.post-53084710043819281192015-12-13T22:01:00.001+08:002015-12-13T22:01:34.587+08:00最近看过的书,简评几则<br />
<ul>
<li>《战争史》(基根):没有想象中的宏大,是更为学术性的书。主要针对战争本身进行研究,阅读起来略微有一些无趣。作者跟克劳塞维茨算是杠上了。</li>
<li>《毛毛星球》(约翰.斯卡尔齐):一本小品式的“科幻”。介绍上说是硬科幻,但里面的法律内容比科学和幻想加起来还要多。就像很多读者说的那样,作者的确“很会讲故事”,是很“温情”的故事,我喜欢。只可惜有“毛毛”死去,看到最后虽然正义感得到了满足,但还是轻松不起来。</li>
<li>《锁定目标》(汤姆.克兰西):一开篇就是火爆的动作场面,后面也是高潮不断。人基本上还是那班人,但比《虎牙》刺激多了。一本不错的克兰西作品。</li>
<li>《悖论:破解科学史上最复杂的9大谜团》(吉姆.艾尔.哈利利):还算不错的入门级科普,看过之后应该能对物理学上的一些重难点有所了解,而且又不至于被吓倒。留给儿子以后看吧。</li>
<li>《羊毛战记》(休.豪伊):不错的反乌托邦科幻,和Fallout系列的感觉很接近。我觉得用Fallout1/2的引擎很容易就能根据这书的剧情改编出一个游戏来。144层的Vault,想想也很大。不过从后期透露的信息看来,虽然深度很大,但每层的面积并不是很大。作者用了一种舞台剧一样的写法,情节冲突也是一波一波地。这种写法我不是太喜欢,不过还是很期待下一部的续集《尘埃记》。</li>
<li>《虎牙》(汤姆.克兰西):比起《锁定目标》来,这本的节奏就太过平稳了。个人认为唯一称得上动作戏的,就只有Mall里面那场枪战而已。不过这本书主要是为了交待“校园”的来历,大概是过渡性的作品吧。</li>
<li>《虚无的十字架》(东野圭吾):本以为是本格派的作品,结果读完却几乎以为是松本清张写的。我对他了解还不是太深。据说是14年的作品,难道东野圭吾在转型成社会派?作为日式推理小说并不是太好看,看起来被亚马逊放进特价书目里面并不是毫无理由。线索太散乱,布局感又太明显,立意很高,但显然对这个话题又无力下定论。何况是个很沉重的故事,看起来实在是太不轻松了。</li>
</ul>
superliufahttp://www.blogger.com/profile/07018478385158082589noreply@blogger.com0