[iOS]一句话Tip之redefinition of class

编译工程发现报redefinition of classXXX的错,但是确实是采用#import而不是#include包含头文件的时候,请从Finder里看看整个工程目录下是不是有两个同名的头文件…有的话这就是罪魁祸首,删之。 为了这问题折腾了好半天,当时多么希望能搜到一点提示… redefinition错误指编译器发现重复定义的类或者结构,用objective-C的时候建议全部采用#import,可以避免一个头文件被包含多次。 当然遇到坑爹的IDE又是另外一回事了…

[Tip]iOS上的OpenGLES无显示问题

最近的项目用到了OpenGLES。 两个很容易出问题的地方,容易造成很难找到的Bug。 一个是EAGLLayer的大小,必须是32的倍数。否则用OpenGL画出来的东西,统统不会被显示。 Apple的文档:In iOS 4.2 and later, the performance of Core Animation rotations of renderbuffers have been significantly improved, and are now the preferred way to rotate content between landscape and portrait mode. For best performance, ensure the renderbuffer’s height and width are each a multiple of 32 pixels. Apple Document 另一个是纹理的大小,必须是2的次方。 也就是说,如果使用一张图片来生成纹理,那么图片的长和宽的长度都必须是2的次方,否则加载纹理失败。

[Ruby]debian上更新gem

用Rails的时候需要配环境,配环境的大头是安装gem,安装gem的时候就会遇到各种令人崩溃的问题…Orz… 环境是Debian,需要安装refinerycms,出现了gem版本过低的错误。 比较通用的做法是 $gem update –system 但是可能会遇到这个错误 ERROR: While executing gem … (RuntimeError) gem update –system is disabled on Debian. RubyGems can be updated using the official Debian repositories by aptitude or apt-get. 这种情况下就需要自己动手。 这里需要安装的是gem 1.3.6的版本。 先得到rubygems-update-1.3.6.gem,可以直接下载得到 $wget http://gems.rubyforge.org/gems/rubygems-update-1.3.6.gem 然后安装这个叫作rubygems-update的gem $sudo gem install rubygems-update-1.3.6.gem 也可以 $sudo gem install rubygems-update -v=1.3.6 然后执行update_rubygems这个脚本 这个文件的位置由之前gem的设定而定。 $which update_rubygems /home/XXX/.gem/bin/update_rubygems […]

PlistBuddy

最近由于工作需要,发现了这么一个小工具。 PlistBuddy是一个Mac里的命令行下读写plist文件的工具。 位于/usr/libexec/下,由于这个路径不在默认的PATH里,需要通过绝对路径/usr/libexec/PlistBuddy引用。 使用起来很简单,功能也很丰富。 举几个例子: A.plist内容如下 B.plist内容如下 通过命令打印出plist的内容 /usr/libexec/PlistBuddy -c “print” A.plist 得到结果 Dict { KeyA = ValueA KeyC = ValueC KeyB = ValueB } 通过命令得到一个entry的值 $ /usr/libexec/PlistBuddy -c “print KeyA” A.plist 输出 ValueA 这些都是简单的功能。PlistBuddy最好用的一个功能应该算是merge了。 merge命令可以合并两个plist文件,一个认为是源文件,一个作为目标文件。 比如命令 /usr/libexec/PlistBuddy -c “merge A.plist” B.plist PlistBuddy把A.plist中的条目逐个插入到B.plist中,如果B.plist中已经有相同Key的条目就跳过此条目。 如上面的命令,得到结果 $ /usr/libexec/PlistBuddy -c “merge A.plist” B.plist Duplicate Entry Was Skipped: KeyA […]

贝塞尔曲线拟合

接上一篇Blog,这里用贝塞尔曲线来平滑多个点。 和样条插值不同,在多个点上作贝塞尔曲线的时候,曲线只穿过首尾两个点,中间的点都是作为控制点。 移动控制点,曲线也随之形变,可以造成一种拉扯的效果。在各种作图工具中,经常使用贝塞尔曲线来画曲线。一般的操作都是先画一条线段,然后可以通过拖动一个控制点来调整线段的弯曲程度。 作多点贝塞尔曲线只需要一个公式。所有的点的X值,被归一化到[0,1]区间内。 具体理论,可以参考这个页面Bézier curves。89年创建的,可有年头了。 这里还是贴代码吧。 首先需要得到X区间的总长度。 CGPoint startPt = [[_points objectAtIndex:0] CGPointValue]; CGPoint endPt = [[_points objectAtIndex:(self.pointCount – 1)] CGPointValue]; float amount = endPt.x – startPt.x; 然后就是曲线方程了,这个比样条插值要简单不少。 rank是指总的阶数,也就是实际的点数。这个函数表示n个点的贝塞尔曲线在x处的值。 这里的ux属于区间[0,1] float (^bezierSpline)(int rank, float ux) = ^(int rank, float ux) { float p = 0.0f; for (int i = 0; i < rank; i++) […]