xcode项目文件引用问题

被一个小问题困绕了好久。

在一个ViewController类里声明了一个函数,然后在AppDelegate中调用,xcode一直报”may not respond to“的错误,反复检查都看不出问题

偶尔在参看类定义时发现,这个ViewController类竟然存储在一个项目文件列表以外的头文件里

原来,该ViewController类之前被声明过两次,前一次生成的文件保存在classes目录下,但在项目中的引用被删除了;第二次生成的文件被保存在项目根目录下,项目中引用的是这个.结果,编译时xcode找得却是调用类所在目录下的头文件,即classes下的文件,同样的类名,当然新定义的方法是不存在的,才出现了上面的问题

最开始用xcode,总觉得它的项目文件管理使用引用的方式,使项目文件和实际目录分离,import不需要明确引用文件所在的目录,算是满新颖的方式.自然也想当然的认为import的范围应该以在项目中定义为准,没想到import采用的竟然还是优先当前目录,其次项目定义的策略,不知道是故意设计还是BUG啊

Posted in 软件技术 | Tagged , , | Leave a comment

iPhone多语言nib更新问题

使用xcode实现app的多语言非常简单,就3步:

  • 修改xib,增加不同语言版本
  • 添加.string文件,增加不同语言的xib
  • 修改代码使用NSLocalizedString调用string文件中资源

在增加了新语言版本的xib,出现一个问题,不管是在模拟器中还是真机中,界面都不会更新了。无论多少遍clean也没用。除非把应用删掉重新下载。

仔细研究发现,所以界面出现问题,是因为默认时候,nib文件会放在app的根目路下,但一增加新语言,所有的nib文件会分别复制到不同语言的目录里,但对于xcode来说,他只会复制和更新nib,但不会删除无效的nib文件。不删除并非xcode的BUG,而是iOS的安全机制导致的,自己写的程序也没办法把app目录下的nib删除掉。

所以,对界面增加新语言后,一定要把app删除重新添加,如果有些数据需要备份,可以通过xcode下载到本地,然后加入项目中,再写临时代码将复制到app根目录的文件复制到指定目录,最后删除临时代码。

Posted in 软件技术 | Tagged , , | Leave a comment

东野骗局

之前看一个电视购物卖纯银纪念币的,现在鼓吹纪念币如何稀少,然后说按现在银价15元计算,即使买一块这么重的银子都不值这个价格,再加上升值空间如何如何,说的让人心动。

可惜,我很清楚,银价很便宜,一般不会超过4元

记起最早有电话推销奥运钞,当时第一个感觉是假的,结果在网上核对了奥运钞的所有信息,发现的确是真的。幸好,有淘宝,一检索面值50元的奥运钞一张70,而他们2张卖280元。后来,才知道那版的奥运钞发行量太大,几乎没有升值空间。

电话那边还在鼓吹如何有价值如何能升值,我问,70能买到我为什么要花140?

之前看东野圭吾的小说,他最爱的手法是给一个错误的前置条件,然后在这个条件上再进行各种严谨合理的推理迷惑读者,最后把前置条件一推翻,每个读者都大吃一惊

上面的两个骗局也是如此,纯银纪念币给一个高出数倍的错误银价,然后再起上做投资推算,当然不论如何都是非常划算的;奥运钞则是在市价上做文章。

记得老鼠会是以查尔斯·旁兹的名字命名为庞氏骗局,东野运气比较差,被我借用一下命名这个为东野骗局,呵呵。不过,电话也就算了,电视购物明目张胆的不断连续播放也没人干预实在是让人不爽阿。

Posted in 骗子大全 | Tagged , , , | Leave a comment

twiproxy更新到0.4.1

前几天对twiproxy做一个次小规模得更新,要说这次更新,前前后后只能用一个词来形容,那就是,莫名其妙:)

先说初衷,最早做twiproxy就是因为GTAP不支持xAuth,所以自己折腾一下,虽然众多不完善还是凑合了,可是最近不断有人在twitter商咨询,每次都是回复不支持,还不完善之类,说到嘴软,决定更新了,这不是莫名其妙嘛

再说,更新的方案,主要是两项:

  1. 合并GTAP 0.4.1的代码,说起来对GTAP的改动还真不少,不过总体也就是个对比复制的工作,真够不用心的(难怪被某人说代码ugly)
  2. 修改twitter api的入口地址

总之改动很简单,总共花了大概半个小时,但效果就让人惊奇的莫名其妙了:

  1. 原来twitter for iphone无法显示的profile正常了
  2. 原来据说不能使用的push功能也正常了
  3. 感觉上速度变快了一点(后来证实是错觉)

于是我好不犹豫的换上了新版,在twitter上发布了一下,结果没人理我。。。。。莫名其妙

后来,当我感叹效果竟然这么好的时候,才有人发现更新了还给了个好评:),结果第二天app engine挂掉了。。。。莫名其妙

Posted in 公告通知, 生活啊生活 | Tagged , | Leave a comment

程序员的常识

之前参加了一次关于产品易用性的争论,焦点在于产品中一个文件传输过程既没有提示也没有进度,导致用户根本无法确定是否在传输。

一方认为开发组的程序员应该很容易的看到产品易用性的问题,就像传输文件的操作,有等待状态或者传输进度都是最普遍的做法,开发组竟然视而不见也没有意见反馈提出实在无法接受;另一方则认为让程序员决定这些界面实在有失偏颇,之所以出现这样的问题是由于产品经理没有将界面需求确认清楚导致的。

乍一看,很容易让人联想,这是程序员缺乏责任心或者产品经理缺乏责任心导致的。但真的只是责任心的问题吗?我认为并非那么简单,更深层的问题出在开发体制上。

最近花了不少时间研究敏捷编程,其中提到自组织,提到程序员的常识。何谓常识?水太烫要等凉了再喝,这就是常识,因为大家都是这么做的。同样在软件开发方面,传输文件一定要有进度或状态的提示,这也是常识,也是因为大家都这么做。每个程序员都是从无数软件的使用中成长起来的,这种基本常识不可能没有,那么为什么会出现这么没有常识的结果呢?

还是喝水的例子,如果你的工作要求你在拿到水的时候,必须要用温度计确认温度在20度时,才能饮用。时间久了,当你拿到一杯水手边又没有温度计的时候,恐怕你就会不知所措了。

同样的问题也在软件开发过程中,传统的瀑布式的开发模式,是由上而下的,就像工业生产,上面做好了模具,下面倒上原料就好。在这样的体系下,程序员往往只担负一部分工作,需要严格按照任务分配行事,形成了让做什么做什么的习惯,于是就慢慢忘了自己还有程序员的常识。不思考,不比照,按部就班,这在完整的瀑布式开发中没有任何的问题,但实际上,很少有公司能做到真正完整的需求,真正完整地设计,于是文章开始的扯皮就出现。

程序员缺乏常识并非只对团队有影响,从程序员自身的角度来看,会思考,会对照,会主动创新,这才是程序员的核心价值。没有常识的人如何听够体现出自己的价值,没有程序员常识的人又如何能体现出自己作为程序员的价值呢?

Posted in 七嘴八舌 | Tagged , , | Leave a comment

吴太伯事件

史记世家第一记载了吴太伯的故事。

大致是讲周太王(就是推演八卦的那个周文王的爷爷)有3个儿子,其中老三最贤,儿子又是圣子姬昌(就是周文王),老大老二想让老三即位,就跑到南方蛮荒之地装野人。后来传到武王即位,伐商得了天下,为感激当年让位的恩情,特地跑到南方找那位大伯公和二伯公的后裔,谁知这两位魅力强,竟然同化了蛮族还建立了国家,武王也不好让人家举家搬离故土,就分封其中一支在原地也就是后来的吴国(被卧薪尝胆的勾践灭掉的国家),又封另一支到北方的虞,做了公爵。而让位的大伯公也被顺便追封,史称吴太伯。

这个让贤的故事很符合儒家一贯的思想,所以也被史记列为世家第一,在姜太公周公之前。但让人感觉未免太完美,就算吴太伯想让位也实在不必那么夸张的举动,即使在400多年后,吴国仍然被视为蛮夷之地,何况那个时候?

最早看到的质疑是柏杨的说法,柏杨以一贯的阴谋论调直接说这是夺嫡阴谋,吴太伯失败后被流放到吴国,并没有什么让贤佳话。但柏杨并没有给出支持他论点的史料。

最近看杨宽的先秦十讲也提到这个事情,说法却非常有趣。

杨宽认为,吴太伯事件实际是被儒家扭曲的本末倒置。吴太伯并非吴太伯而应该是虞太公。这话怎么说呢?原来在周太王时,周就已经开始图谋商的地盘,所以派出自己的大儿子(也就是所谓的吴太伯)跑到虞地(大概在晋南)建立前进基地。这步棋走实在是卓有成效,虞的势力曾一度扩张到商王狩猎之地,甚至后来武王克商也是完全依靠虞国的后勤补给。正因为虞国有大功,所以在定鼎分封时,特别封公爵(封公爵的除了拉拢商人的微子和武王的叔叔,就是虞,姜子牙和周公旦都不是)。而吴国一支则是在后期为压制南方蛮族而特意分封的,也正因此在克商时,并未提到有吴国的助力。

180度大逆转啊,不过貌似合情合理,但历史不容编造。于是,杨宽提出自己的依据,<穆天子传>的记录。

<穆天子传>记录了西周中兴王朝周穆王巡游西方和西王母在昆仑山饮宴的故事,一直以来被作为志怪小说看待。但近年的研究发现其中的记载和金文记载相吻合,所以又被逐步重视起来。杨宽认为,穆天子传最初是北方戎族的口传的历史,最初周穆王为北伐犬戎曾亲自探视北方,而当地的蛮族接待有功被封侯,于是蛮族就将当时的事情作为祖先的荣耀口口相传,直到战国时,魏国史官在地方上采风采到才成书的,其中内容并未受到儒家的扭曲,相对可信。

那儒家为什么要编造吴太伯这样的故事呢?古<书>中有《武成》一篇曾记载牧野之战流血飘橹的景象,孟老夫子看到了,认为武王克商是以至仁伐至不仁,怎么会那么残酷,于是就把这篇给删节了,还留下一句名言,尽信《书》不如无《书》。《武成》由此失传,现在只能在其他典籍中看到只字片语。由此推想开来,一个是礼让贤侄后世追封的吴太伯,一个是积心处虑要以臣叛君的虞太公;一个是兄弟礼让的佳话,一个理智分工传贤不传长的现实,当然是前者更合儒家的胃口了。

Posted in 读书礼记 | Tagged , , , | Leave a comment

说说东野圭吾

花了2天多一点的时间,看完了东野圭吾的《嫌疑人X的献身》和《放学后》

第一个感觉是非常流畅,尤其是《放学后》事无巨细缓缓的一一展开,虽然所有的线索情节都在前面埋好了,但由于交代的细致所以没有突出任何刻意,同时又不显得拖沓,这点很难得,总感觉日本人的说都比较啰嗦的。

其次是,总有颠覆性的推理,东野惯于给读者设定一个错误前提,然后再在这个条件进行各种不同条件的推断,自然这些推断都是忽悠读者的,最后一亮底牌,发现前面的所有推断都合理的,但前提都是错的,所以所有推断都落空了。

最后是,东野的这两部书都很残酷,为了把情节做的尽量的曲折,很多地方突破了一般人的认知底线,《嫌疑人X的献身》中的无奈和痛苦,《放学后》的美善下的丑恶,实在是破坏了很多美好的东西。

所以,两部书的结局都很简单,有点像是港片,boss被干掉,大家一欢呼就结局了(一如本文,说完了就晚了:)

P.S. 回头看了看,说的都很隐晦,尽量不剧透,看过了自然就理解了,呵呵

Posted in 读书礼记 | Tagged | 2 Comments

折腾:SSH

墙越建越高,所以打算搞个SSH代理做私人网络用

据说使用虚拟主机就可以,据说Godaddy就支持SSH,据说必须要Linux服务器

于是先把服务器升级成Linux,没想到控制面板里没有这个升级项,写信给Godaddy,回复因为有SQL Server的数据库,无法迁移导致

貌似那个数据库只是测试用了一下没啥重要数据,干掉。

终于可以迁移了,N小时的等待,完成。

进入发现允许SSH,必须要再次换主机,网上说必须要先备份数据库和网站数据,不过Goddady空间和数据库采用的不同数据库,所以多次迁移也无所谓,不过多次备份总是没错的。

备份,然后开启SSH,N小时等待,完成。

据说Tunnelier比MyEnTunnel,安装Tunnelier,登录SSH没有问题。浏览器使用Chrome+Switchy,找了N多教程,其实配置很简单,完成。

一切就绪,就是SSH没法用无法连接,换用MyEnTunnel,发现是服务器拒绝的,貌似是因为服务器没有开启转发导致。

继续Google,发现Godaddy有限制,貌似没有人这样搞成功。

那没办法了,发了邮件给Godaddy,估计也很难解决,没准还要考虑换主机,这折腾的。。。。。。

Posted in 折腾, 网站建设 | Tagged , | 2 Comments

折腾:清洗笔记本键盘

趁着过节把笔记本键盘全部拆开清洗了一下。

要说thinkpad做工的确不错,按键一个一个的一掰就开,用洗涤灵加水泡一下就不久干净了,在用吹风机风干。

键盘底盘有不少油渍,头发,纤维之类的东西,用棉签一一清理,没加水或酒精什么的东西,所以并不是完全的干净,不过已经强了不少。

最后是装,这个太麻烦了。

首先是键位,本来挺熟悉的按键一放到满是键位的底盘上马上傻眼,不知所谓,幸好拆前用相机留了底。

其次是键太多了,就算对照照片也是半天的繁忙- -

开机一用,发现左右Shift键装反了,原来以为两边是对称的,实际上右边的略大一点,只好重新掰开换过来。

最后,键盘焕然一新,原来有点不太灵的键敲起来也顺畅了,总算是没白折腾

Posted in 折腾 | Tagged , | Leave a comment

twiproxy – 基于GTAP 0.4的twitter API proxy

twitter终于封杀了basic auth,为了避免被拒之墙外,在Google Appengine上装了一个GTAP 0.4的版本,貌似Twitterrific可以用了,但Twitter的官方客户端还不能使用。

说起Twitter官方,那可是很纠结的一段。

最初还是tweetie的时候,特意买了一套,谁知不久twitter被封杀,tweetie不支持代理,等啊等,听说tweetie 2支持代理了,才发现之所以叫2原来是不能升级令要付钱的,嘿嘿,有点上当的感觉啊

后来,tweetie被twitter收购,变成官方,免费的客户端,高兴啊,赶快去下载,发现下的不能用,原来又升tweetie 3了,而tweetie 3只支持xAuth,比如GTAP这样的,只支持oAuth的也不能用。

没办法,偷懒不了,自己动手吧

说起xAuth,其实是oAuth的简单模式,和Basic Auth最大的不同是,不再传递用户名和密码,而是传递access_token和自签名数据,GTAP之所以不支持,是因为没有对oauth/access_token这条指令做支持。

所以,在GTAP上做了几处修改:

  • 添加oauth/access_token这条指令的处理,将客户端发送过来的用户名/密码转换成access_token和access_token_secret
  • 当客户端发送请求时,通过客户端发送的access_token获取access_token_secret。GTAP使用用户的密码对保存的access_token和access_token_secret进行加密,导致无法直接通过access_token获取access_token_secret,这本是安全机制,不过考虑到部署者完全可以通过log方式输出用户名密码或者token,所以改为明文存储。可能还有更好的办法,这里先偷个懒吧,反正一般都是自己部署的APP
  • 增加了basic命令,按说起来,通过代理是完全可以支持原有的Basic Auth的客户端的,比如Chrome著名的插件Metrist,通过basic可以实现这个,但目前的测试结果比较奇怪,数据已经正常返回了,但Metrist只有偶尔可以获取到,不知道为什么

为了开发方便,在Google Code上重新构建了一个项目twiproxy,采用和GTAP一样的开源协议,有兴趣的可以去看看,也欢迎提供修改建议:)

最后列一下twiproxy的功能

  • 支持原有GTAP 0.4的功能
  • 支持xAuth模式,即支持twitter for iPhone登录
  • 支持原有basic auth客户端(未确认)

地址:

  • twitter.com : xxx.appspot.com/
  • api.twitter.com : xxx.appspot.com/api
  • basic auth : xxx.appspot.com/basic
Posted in 我爱开源 | Tagged , , , | 9 Comments