虽然美国苹果零售店员工以美国正在制裁伊朗为由,拒绝向波斯语人士出售产品,但一。  这位名叫侯赛因(Hossein)的经销商透露,他接受采访的前一天刚刚卖了 40 部 iPhone,而且伊朗的 iPhone 价格也只比美国贵 50 到 60 美元。  侯赛因称,贸易公司很容易绕过海关检查,苹果的产品都是通过伊拉克走私到伊朗的。他还指出,德黑兰几乎人手一部 iOS 设备,很多零售商的装修甚至与苹果官方零售店很相似。  尽管伊朗经销商号称可以轻易买到苹果产品,但仍有很多人质疑苹果的做法,认为向波斯语人士禁售产品的行为带有种族歧视色彩。  美国国务院发言人随后也澄清,没有任何法律和政策禁止苹果在美国本土向任何人出售产品,包括伊朗裔人士或伊朗公民。但如果要将高科技产品带去伊朗,的确需要获得许可。然而,对于伊朗经销商而言,这种所谓的许可也不过是个笑话而已。

  英文原文:  无论你是否喜欢把它想成技术债务或是对冲期权(unhedged call option),在我们的周围都充斥着糟糕的代码,糟糕的决定,它们影响着我们每天的生活。(值得我们思考的是)这些决定所带来的长期影响是什么?我们真的做了明智的选择吗?Martin Fowler 谈论了技术债务的四种类型:从不计后果的(reckless)、故意的(deliberate)到无意的(inadvertent)、谨慎的(prudent)。    故意不计后果的技术债务就是这样的:开发者(或者他们的经理)会允许那些只可能带来坏结果不可能带来好结果的决定被通过,例如,放弃 TDD 或者不用任何设计。无论从什么角度来看,这种做法都是非常不专业的。如果开发人员不能做出正确的选择,那么管理者就应该介入,并带入一些能够做明智选择的人进来。Michael Norton 将这称为“令人讨厌的行为,而不是技术债务”。如果我们不能从中受益,并且只是简单地完成任务,写一些糟糕代码,那么这根本不是技术债务,这是垃圾。    不易察觉的技术债务比较有趣。如果我们不知道有更好的东西,我们又怎么会去做一些改变呢?工业标准和最佳的实践都在不断发展。我确定曾经某段时间 EJB 被认为是很好的组件模型,但现在它绝对被认为是不折不扣技术债务。当前的最佳实践方式很容易就变成未来的垃圾代码。  当开始时,如果我们就已经有了这个领域的知识,或者可能我们从未在这个领域工作过,没有这个领域的知识,可能设计出来的东西会不太相同。有些时候技术债务是不可避免和必然发生的。    接下来是谨慎而有意的技术债务,这种情况下,我们会有意做一个决定来增加技术债务。这里就有一个再普通不过的决定:  “不管怎样,我们要达到这个季度的目标利润。  我们的市场工作已经开始,所以我们必须在短的时间内抢占市场。  我们已经承诺了交货日期,所以没有太多时间给我们去犯错误。”  有时,我们必须做一些妥协:通过降低工作成果的品质,我们可以更快的完成工作,但我们会稍晚时候付出代价。  不同于其它的技术债务,这是一种特殊的技术妥协。我们故意做决定让代码质量比我们能够达到的质量要差。我们知道这会在以后让我们慢下来;我们知道我们需要回来重做,在所谓的“二期工程”里完善它;但是为了在规定的时间内完成任务,我们接受妥协。    1、  妥协在短期来看更快,但在长期来看其实更慢  在我们现在就需要的东西与后续可能产生的不明的债务之间做选择时—显而易见,我们始终都会选择妥协。  2、每个妥协都看似渺小,但它们积累起来却非常庞大  不管有多少人都经历过“欠债”,技术债务都会积累起来。我们所做的每次妥协都会增加已有债务的代价。这意味着,每次妥协的代价可能很小,但积累起来后它们会产生巨大的影响。  一开始,我决定不一些代码。下一轮时,由于没有很好的重构,很难测试代码,所以我跳过了一些单元测试。第三轮时,我的测试覆盖率非常低,所以我没有信心进行扩展性重构。现在,这段程序真的变得很难测试也很难修改。我的代码在一点一点地,越来越快地恶化。每个妥协都堆积在以前的妥协之上,而且将它们放大。每次妥协看似影响很小,但它们累加起来却让人大伤脑筋。  3、  长期的代价很难被量化  当我们同意不重构一段代码时,当我们同意留下一些半成品时,当我们同意为了急于通过测试而采用最小测试项时:这真的很难去估计长期的代价。当然,我们能够估算如何做是正确的—我们知道什么是“真理”。但是,我们如何去估计成本的支出?特别是当它们积累起来时。  我怎么能估计为了解决复杂问题而浪费的时间?时间的损失有可能是因为一个非常难以追查的 bug。额外花费的时间可能是因为下一次我无法很容易地重构代码;或者是因为下一次我不敢重构代码,但额外的债务使我不得不这样去做。我怎么可能去量化这个问题?  在 ,他们发现他们:  “至少低估了一个量级的技术债务的长期代价”    这里有一些很明显的例子,它们都在产生技术债务;或者至少做得有些不称职。如果你想在客户面前展示一个新特性以判断其是否有价值,那么它不需要很完美,它只需要迅速地出现在那里就行。如果新特性对客户没用,那么你将其删除。你节省了将其做“完美”的成本,并迅速获得了你所需要的信息。这显然是符合成本控制的,是一种管理开发过程的简易方式。  但是,如果展示的这个特性获得成功了呢?那么,你需要制定一个计划清理它,重构它,确保它产生足够的文档并被充分的测试。这就是。只要你有一个删除它的计划,无论这个特性是有用或无用—那么这是一个完美而有效的方式。但如果不是这样,那么这个半成品特性可能需要数年时间去构建代码。  不同的是,我们会有一个计划来消除债务。多久我们就会接受一个模糊的承诺“我们会回过头来修复它”,或者,“我们会在第二阶段完善它”。我的墓志铭应该是“现在开始第二阶段的工作”。  在代码中留下债务,且没有任何消除债务的计划,就像一个家伙用一张信用的钱去还另一张信用卡的钱。你让债务产生,而不去处理它。没有偿还债务的计划,你最终将走向破产。    也许技术债务最大的危害是它代表的风险。技术债务使得我们的代码更加脆弱,不太容易修改。当我们最近讨论这个问题时,正如 所说:  “技术债务会使代码变得僵化”  在我们代码上堆积的债务越多,代码就越难改变。这种僵化会带来最大的风险:我们无法足够快速地改变代码。如果竞争环境和监管环境突然变化?如果一个新的竞争对手出现,彻底改变了我们的行业,我们需要多久才能赶上?如果我们只有一个僵化的代码库,在我们花2、3或 4 年时间赶上竞争对手时,我们又能得到什么呢?  当然这是指的最坏的情况,这种灵活性的缺失(缺乏创新)会一点一点地损害公司。一旦一个革命性的公司变成老古板,无法作出反应,并只释放衍生产品。当公司发现自己无法创新,跟不上不断变化的局势—它们就会变得无关紧要。这也就是技术债务真实的代价。  没有一个偿还技术债务的计划,没有可靠的办法来估计它所带来的长期成本,我们真的可能做出谨慎而故意的决定吗?这种轻易就能增加技术债务的决定做得是否太草率了呢?  原文:    编译:

谷歌眼镜颇有科幻风格右侧镜架上有一个摄像头和一个按钮这款产品是谷歌最引人关注的项目之一除首段拍摄视频外,谷歌还公布了一系列谷歌眼镜拍摄样张中间的谷歌员工佩戴了谷歌眼镜跑步者影子接球小巷报纸雨伞婴儿婴儿佩戴谷歌眼镜的人越来越多了,但它距离上市仍很遥远   北京时间 5 月 28 日上午消息,谷歌上周发布了利用“谷歌眼镜”(该项目的内部名称为“Project Glass”)拍摄的首段视频,效果颇为出色。  这段视频由谷歌员工佩戴眼镜在玩蹦床时拍摄,长度为 15 秒,分辨率为 720p。遗憾的是,视频没有声音,这可能是谷歌眼镜尚待改进的问题之一。  谷歌还公布了这款眼镜的高清照片,可以看到一个按钮和一个摄像头。此外还放出了一系列拍照样张,效果几乎可与卡片机媲美。  Project Glass 是谷歌最引人注目的研究项目之一。谷歌计划打造一款基于“虚拟现实”技术的智能眼镜,在小型镜片上整合搜索、拍摄、短信、社交及其他功能。谷歌联合创始人塞吉·布林(Sergey Brin)曾多次佩戴谷歌眼镜的原型产品公开露面,但他也指出,这款产品距离上市遥遥无期。

  每年的春分和秋季,鸟儿们就会沿着相对固定的线路,在繁殖地与越冬地之间,进行长距离的往返。它们这么做,并不是了为了崇高的理想,也没有浪漫的情怀,仅仅是为了获得一个更加适合的生存环境。  在《迁徙的鸟》这部电影中,曾有过这样一句话,穿越云层,迎着暴风雨,飞翔对鸟来说不是人们想象的什么乐趣,而是为了生存而拼搏。经历着迁徙的,不仅仅是候鸟,也有散落在各处的 ITer。  或许你,也刚刚经历着一次迁徙?    L 大学毕业之后,就来到位于东莞的某品牌手机厂商工作,从事交互设计方面的工作。2010 年初,她所在的部门迁移到深圳,当时工作地点的迁移并没有给 L 的生活带来多大的困扰,因为 L 的男朋友也是就职于该公司,很凑巧两人所在的部门都迁移到了深圳。比起东莞,深圳的生活虽然节奏快,生活上也没有在东莞工业园那么规律和安逸,但是深圳强烈的都市气息还是让两人对未来的生活充满了期待。  在今年的 5 月 4 日这天,L 和男朋友选择两人相恋两周年的日子领取了结婚证, 而在这之前 L 已经主动辞去了工作,离开了自己毕业之后就一直就职的公司,因为公司有规定,员工若是结婚,就必须有一个人要离开。  辞去工作之后,L 马上就开始找工作。由于有了在这家行业内还算知名的手机公司的工作经验,L 一度觉着短期内找到合适的工作并不困难,可是随着时间推移,L 发现实际情况要比自己预想的糟糕,今年行业内的公司都选择了人员精简的策略,而且相对于北上广,深圳可提供的相关就业岗位本来就不多,一般中小公司提供的职位,对她来说,也没有什么吸引力。  经过一番努力,L 终于得到了国内一家知名互联网公司的 offer,薪水待遇也不错,但是工作地点却在北京。一边是两人刚刚修成成果的婚姻关系,一边是发展和待遇都非常有吸引力的工作,面对这样的选择,L 跟新婚不久的老公商量后,还是选择了接受 offer,只身前往北京,开始了北漂一族的生活。  对于这个选择,L 有自己的看法,她说:“我还年轻,应重视自己的工作和事业,而深圳暂时没有合适的机会;现在的这次工作经历将很好的提升我的个人能力和个人价值,现在的这家公司在深圳有分公司,我一定有再回来的机会”。    Nancy 目前在深圳工作,从事猎头工作三年了,曾经帮助过不少的 ITer 进行过“迁徙”。有意思的时候,Nancy 本人原本是在北京的工作,2011年的 6 月份才来到了深圳,算起来她也经历一次工作地点的迁移。  Nancy 目前最大的客户在杭州,现在主要是运作深圳这边的 ITer 去杭州工作,因为碰到过不少 ITer 面对工作地点发生变化时的艰难抉择对此,Nancy 自己也有想法,她说:“根据 ITer 的情况不同,可以分为三类来看,一类是自己就想的比较清晰,比较事业型的,不介意工作地点,更多的是看对于自己的提升;一类是犹豫不决,没有想太清楚,但是也不是很拒绝,这个时候就要把思路给他理清楚,看他是适合变更地点的,还是不适合的,然后再去做适合的推荐;最后一类就是对于外界的事情拒绝了解,也不想多了解,当然其中原因有本身思路不是很 Open,也有对于猎头的认可度不高等等原因导致。不过,第三类人,我们也会分情况分析,因为从职场的角度上看,潜力好的人或者能走的远的人真不是他个人能力强到多夸张的程度,实际上再强的人也需要去看看外部的环境以及吸收外面的东西,所以有时候我们虽可以可以去推动,方式上可以寻找对方易于接受的,但是如果他本身比较求安逸,或者说不是很诉求职场上更好的发展,我们也只能放弃了”。  看到 Nancy 这么说,你觉得你可能是这三类人的中哪一类?    身为 ITer 的你,如果正谋划着从北上广深迁徙,可以关注以下面的新(旧)闻:  2012 年 2 月,搜狐公司正式宣布在武汉投资建设搜狐武汉研发中心,并与华中科技大学合作成立“搜狐-华科联合实验室”,力图在武汉这一中部核心、未来的高端人才基地落下一子。  2012 年 4 月 25 日,猫扑网方面宣布将从北京迁址南宁,但不会进行裁员。  2012 年 5 月 7 日上午消息,联想集团宣布,未来 5 年将在武汉投资 50 亿元成立联想武汉产业基地,主要研发、生产和销售智能手机、平板电脑等移动互联产品。  2011 年 6 月 15 日,国内最大的互联网公司腾讯与武汉市政府共同宣布,在湖北省武汉市江夏经济开发区建设腾讯无线互联网技术研发中心,为将来在无线互联网上的发展进行战略布局,第一期将至少投资 10 亿元人民币,同时腾讯华中网络媒体中心也将落户武汉。  希望每次的迁徙都能给你们带来好运,无论这选择是主动或是被动。

  开发 apk 的时候当然要考虑保护好自己的代码, 环境就提供了 来进行代码混淆,确实是一个非常有用的工具,但用起来也确实够折腾的。    eclipse 下建立 android 工程,就会生成 proguard.cfg 和 project.properties,在后面的文件追加 proguard.config=proguard.cfg 即可让前面的配置文件在 export 时生效。默认的那个文件有一些内容,这里给一个更通用点的。##—————Begin: proguard configuration common for all Android apps ———--optimizationpasses 5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-dontskipnonpubliclibraryclassmembers-dontpreverify-verbose-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*-keepattributes *Annotation*-renamesourcefileattribute SourceFile-keepattributes SourceFile,LineNumberTable# 以下两个命令配合让类的路径给删除了-allowaccessmodification-repackageclasses ”# 记录生成的日志数据,在 proguard 目录下-dump class_files.txt-printseeds seeds.txt-printusage unused.txt-printmapping mapping.txt# 异常都可以忽略就打开#-dontwarn-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends android.app.backup.BackupAgentHelper-keep public class * extends android.preference.Preference-keep public class com.android.vending.licensing.ILicensingService-dontnote com.android.vending.licensing.ILicensingService-keepnames class * implements java.io.Serializable# Explicitly preserve all serialization members. The Serializable interface# is only a marker interface, so it wouldn’t save them.-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;private void writeObject (java.io.ObjectOutputStream);private void readObject (java.io.ObjectInputStream);java.lang.Object writeReplace ();java.lang.Object readResolve ();}# Preserve all native method names and the names of their classes.-keepclasseswithmembernames class * {native ;}-keepclasseswithmembernames class * {public (android.content.Context, android.util.AttributeSet);}-keepclasseswithmembernames class * {public (android.content.Context, android.util.AttributeSet, int);}# Preserve static fields of inner classes of R classes that might be accessed# through introspection.-keepclassmembers class **.R$* {public static ;}# Preserve the special static methods that are required in all enumeration classes.-keepclassmembers enum * {public static **[] values ();public static ** valueOf (java.lang.String);}-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;}# 如果你的工程是对外提供方法调用就打开#-keep public class * {# public protected *;#}##—————End: proguard configuration common for all Android apps ———-    这个时候 export 提示“conversion to Dalvik format failed with error 1”错误,网上说法有好多种,最后我还是把 proguard 从4.4升级到4.8就解决了。官方地址是 http://proguard.sourceforge.net。上面的配置文件参数可以在这里查阅。  升级办法很简单,就是把 android sdk 目录下的 tool/proguard 目录覆盖一下即可。    一旦打包出来,就不能用 eclipse 的 logcat 去看了,这里可以用 android sdk 中 ddms.bat 的 tool 来看,一用就发现和 logcat 其实还是一个东西,就是多了个设备的选择。    当 Gson 用到了泛型就会有报错,这个真给郁闷了半天,提示“Missing type parameter”。最后找到一个资料给了一个解决办法,参考:http://stackoverflow.com/questions/8129040/proguard-missing-type-parameter。  另外我又用到了 JsonObject,提交的 Object 里面的 members 居然被改成了a。所以上面给的东西还不够,还要加上# 用到自己拼接的 JsonObject-keep class com.google.gson.JsonObject { *; }  我个人建议减少这些依赖包混淆带来的麻烦,干脆都全部保留不混淆。例如-keep class com.badlogic.** { *; }-keep class * implements com.badlogic.gdx.utils.Json*-keep class com.google.** { *; }    参考 http://code.google.com/p/libgdx-users/wiki/Ant    我是利用了 apktool 的反编译工具,把打包文件又解压了看了一下,如果包路径、类名、变量名、方法名这些变化和你期望一致,那就 OK 了。命令:apktool.bat d xxx.apk destdir    这个东西用起来也不是很简单,特别是你程序用到的高级特性多,就更容易出问题。另外 proguard 的参数看起来确实也有点不好理解,打包过程慢,测试也比较浪费时间。东西虽好,但真不是那么容易上手。

分类:兴趣

时间:2016-11-12 06:11:07