RVM安装ruby 1.9.3时候错误

 

因为动态库位置的变动,之前编译的ruby 1.9.3版本运行不起了,然后不想 ln -s 一下,所以需要重新编译ruby 1.9.3。

rvm reinstall 1.9.3 后在编译过程中报错 :

1
2
regparse.c:582:15: error: implicit conversion loses integer precision: 'st_index_t' (aka 'unsigned long') to 'int' [-Werror,-Wshorten-64-to-32]
    return t->num_entries;

-Werror,-Wshorten-64-to-32 编译参数和错误提示倒是很明确,不过因为是通过rvm安装的,又不能直接去修改Makefile。

Github上解决方法是 CC=gcc rvm install 1.9.3

这样也可以,不过适合于xcode5之前的版本,如果安装的是xcode5,因为xcode5里并没有包含llvm-gcc,所以这样是不行的。

在安装了xcode5情况下,gcc还是clang,所以需要手动安装gcc4.2.

通过homebrew可以快速安装: brew install apple-gcc42

然后CC=/usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/gcc-4.2 rvm install 1.9.3 后就等着rvm帮忙安装1.9.3了。

ffmpeg编译iOS静态库教程

 

今天面试了一个iOS开发工程师,问到做过项目碰到最困难的事情是什么,得到的回答居然是为iOS编译ffmpeg静态库,最后还是没编译成功.

好吧,听到这个回答我和我的小伙伴们都惊呆了.回来想了下,反正也闲着,所以虽然网上这样的教程一大堆,我还是写个教程吧.

本文大部分内容参考于此篇文章:How to Prepare Your Mac for iOS Development with FFmpeg Libraries , 然后针对最新情况做了一些修改。

1. 首先,准备编译环境

1. 安装Xcode和Command Line Tools
2. 下载和安装 gas-preprocessor
3. 安装 pkg-config

关于gas-preprocessor,安装方式是直接copy文件 gas-preprocessor.pl/usr/bin ,记得修改权限可执行.

原文给出的下载地址是 gas-preprocessor , 不过这里的版本比较老 , 因为在编译ffmpeg的时候,gas-preprocessor版本必须和ffmpeg配合,所以如果你下载的ffmpeg源码是最新的,那么建议去 libav网站 下载最新的 gas-preprocessor.

如果之后在编译时候遇到类似这样的错误

unknown register alias 'TCOS_D0_HEAD'

那么可以尝试更换 gas-preprocessor版本来解决.

然后 pkg-config, 可以直接通过MacPorts来安装

sudo port install pkgconfig

2. 下载ffmpeg的源码

git clone git://source.ffmpeg.org/ffmpeg.git

3. 编译armv7的支持

configure参数如下

1
./configure --prefix=armv7 --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --enable-avresample --enable-cross-compile --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk" --target-os=darwin --cc="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc" --extra-cflags="-arch armv7 -mfpu=neon -miphoneos-version-min=5.1" --extra-ldflags="-arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -miphoneos-version-min=5.1" --arch=arm --cpu=cortex-a9 --enable-pic

编译和安装到armv7目录下

1
make clean && make && make install

4. 编译armv7s的支持

configure参数如下

1
./configure --prefix=armv7s --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --enable-avresample --enable-cross-compile --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk" --target-os=darwin --cc="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc" --extra-cflags="-arch armv7s -mfpu=neon -miphoneos-version-min=5.1" --extra-ldflags="-arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -miphoneos-version-min=5.1" --arch=arm --cpu=cortex-a9 --enable-pic

编译和安装到armv7s目录下

1
make clean && make && make install

5. 编译i386的支持

configure参数如下

1
./configure --prefix=i386 --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --enable-avresample --enable-cross-compile --sysroot="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk" --target-os=darwin --cc="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc" --extra-cflags="-arch i386" --extra-ldflags="-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk" --arch=i386 --cpu=i386 --enable-pic --disable-asm

编译和安装到i386目录下

1
make clean && make && make install

如果一切顺利,那么ffmpeg目录下会分别生成 armv7、armv7s、i386几个目录,里面lib文件下就是我们需要的静态库了.

6. 最后,我们合并armv7、armv7s、i386库在一起.

1.建立universal/lib/目录.

2.新建bash脚本,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
#! /bin/sh

cd armv7/lib

for file in *.a
do
cd ../..
xcrun -sdk iphoneos lipo -output universal/lib/$file  -create -arch armv7 armv7/lib/$file -arch armv7s armv7s/lib/$file -arch i386 i386/lib/$file
echo "Universal $file created."
cd -
done
cd ../..

3.执行这个脚本,稍等完成后在universal/lib/下就是我们需要的静态库了。

以上这么简单的步骤就是编译ffmpeg为iOS静态库的方法,其他各种库编译方式也都大同小异.是不是很简单呢?

然后关于configure的参数,大家可以参考ffmepg官网解释。

一些Xcode的插件

 

xcode的插件不算多,找遍了网络也就大猫小猫而三只.不过虽然不多,但是大部分的插件都非常有用.以下5歀插件是我几台机器上都安装了并且经常使用的.

1. MiniXcode

MiniXcode的作用主要是在Xcode隐藏了Toolbar过后显示Schema选择菜单,并且可以显示编译进度的一个插件。

这个插件可以说是我最喜欢的一个插件了,虽说作者开发这款插件的意图是让小屏幕更好的使用Xcode,但是我觉得不管是大屏幕还是小屏幕都是非常适合使用这款插件的,我的iMac + 24寸双显示器 和Macbook Pro下都使用着。

主要是我非常不喜欢Xcode的toolbar,觉得太影响美观了,所以一直都是把Toolbar给隐藏着的,但是隐藏之后麻烦的就是选择Schema的时候非常痛苦.MiniXcode就弥补了这个缺陷.

强烈推荐使用小屏幕或者和我一样讨厌Xcode的Toolbar的开发者使用。

2. CocoaPods

这个不用多说,用Xcode开发者应该都知道.

3. VVDocumenter-Xcode

注释这东西,虽然我不怎么爱写,不过改写的还是要写的!注释呢规范化还是挺重要的,特别是当你需要通过注释来生成文档.

VVDocumenter-Xcode就是用于生成规范化注释的插件,输入 /// 触发,然后你要做的就是填写剩余的信息了.

4. KSImageNamed-Xcode

做iOS或者Mac上的App,和一大堆图片打交道是不可避免的.然后如果你也和我一样喜欢在代码中对界面进行布局,那么当要使用一张图片的时候,也许你的步骤和我是一样的:

在Xcode中找到这张图,按回车进入改名操作,然后command + a 全选,然后command + c 复制,然后在切换到代码中用command + v 粘贴

如果也是这样的,那么你应该和我一样对这么繁琐抵消的操作感觉非常厌烦了吧.如果是,强烈推荐试下 KSImageNamed , 它可以在使用 [UIImage/NSImage imageNamed:]的时候弹出图片选择列表,非常方便.

5. HOStringSense-for-Xcode

这个不需要多介绍,看作者给出的图就一目了然了.

6. 其他的不是经常用的一些,提供给参考.

Accessorizer : 这个真心好,不过收费的,还好价格不贵,$4.99 还可以接受。

BBUncrustifyPlugin-Xcode : Xcode plugin to uncrustify code in Xcode.

ColorSense-for-Xcode : ColorSense is an Xcode plugin that makes working with UIColor (and NSColor) more visual.

关于这次的封闭开发

 

先说说为什么想写这个

大约二十天前,公司的一个项目决定封闭开发.当管理层决定了这件事后就是找需要去进行封闭开发的人谈话,当时我是比较抵触封闭开发的.

抵触并不是抵触封闭开发这件事,而是我认为当时项目的整体勤快并不是一个月的封闭开发能就能解决的 和 对公司这种做出一个对员工影响较大的决定之前没有任何询问过员工的意见这种做法.

现在封闭开发已经过去20天了.我不知道管理层有没有后悔,但是我真的没看到这次封闭的意义.我看到的是很多员工对公司怨言正在成几何倍数的增长和项目依然进展缓慢。

之前我其实也做过封闭开发,虽然时间很短.在我理解的封闭开发,那是应该在整个项目确定了目标和设计,项目组大部分成员的技术能较好的完成自己的工作,封闭的目的主要是让开发人员能比较心无旁驽的做一件事情.然后还应该有着不错的休息和办公环境,能让员工工作号休息好.有着不错的封闭开发补贴,能让员工心甘情愿的努力工作。

但是,这次项目组的封闭开发,在我看来没有满足任何一点。

整个项目的目标和设计

  • 目标倒是有,但是就如那句著名的 简单易用界面好,稳定高效花钱少.立马就要! 我就只能 呵呵 了.
  • 然后说说设计,公司有个坏习惯.做产品不爱做详细设计,做出的东西全是决策层拍脑袋拍出来的然后加上一小部分具体实现人员的自我发挥,然后做出来的东西就是不停的改不停的改、然后永无修止的加班.
  • 同时整个项目没做过技术上的架构设计,从终端到WEB再到服务器,各种实现各种糟糕…..

项目组大部分成员的技术能较好的完成自己的工作

呵呵呵

封闭的目的主要是让开发人员能比较心无旁驽的做一件事情

我能说这次封闭中有只乌鸦飞过去飞过来的让人很厌烦么?然后还能说因为这次封闭心里有点憋得没办法集中十二分精神么?然后还能继续说其实这并不是我一个人的状态么?

然后是后面的待遇工作环境神马的

呵呵呵,想太多了,想想做出封闭开发的决定之前公司没征求任何人的意见,那么你后面的事情就可想而知了,封闭的环境相当差,我的第一晚上直接被臭醒来的.是的,我很严肃的说:我是被臭醒的.安排的工作时间表,不多说,除去吃饭睡觉的时间,有14.5个小时的工作时间!最后在抗议下,呵呵呵呵呵,13.5小时.

待遇?没人给我说过任何待遇问题,我倒是提出过..那也只是提出过而已.

结果

胳膊拎不过大腿,虽然百般不情愿,我还是去封闭了,20天过去了.现在整个项目的进度看不出来和正常上班状态下有什么大的进展.员工怨言很大!是真的很大!

整个项目的技术架构上没任何变化,还是按照之前demo版本架构在进行着.这种技术架构,当玩具还是可以的!

封闭之前,老板和我谈话过,说希望我能多提出自己的意见.OK,我有说过之前很多东西我都有提出过意见,可是没人理我,然后同样的东西后来又有人提出来,额,让人去所谓的预研下.

封闭中,碍于当前的特殊状态,很多东西都不好提,只有等封闭目标先完成后再说.不过一些改动不大或者压根不需要改变,只是一些还没有的东西确定的时候,我提出的意见依然荡不起一丝波澜,于是几次过后,干脆不提了.

期望

如果按照计划,这次的封闭已经在走入收尾阶段了,期望能早日完成吧.

和同事有聊过为什么我提出的意见不被重视,同事的的意思是因为我每次提出都是很浅的提了一句,没详细的说明和坚持自己的意见。知道了原因,改变也比较容易,希望能不呵呵呵了.

然后其实我对公司的这个项目很看好的,虽然各种不满意,不过还是期望封闭过后能有时间对整个项目从技术角度上好好梳理下.让从终端到WEB再到服务器,不再那么糟糕…

POSIX规定的非线程安全函数列表

 
asctime ecvt gethostent getutxline putc_unlocked
basename encrypt getlogin gmtime putchar_unlocked
catgets endgrent getnetbyaddr hcreate putenv
crypt endpwent getnetbyname hdestroy pututxline
ctime endutxent getopt hsearch rand
dbm_clearerr fcvt getprotobyname inet_ntoa readdir
dbm_close ftw getprotobynumber L64a setenv
dbm_delete getcvt getprotobynumber lgamma setgrent
dbm_error getc_unlocked getprotoent lgammaf setkey
dbm_fetch getchar_unlocked getpwent lgammal setpwent
dbm_firstkey getdate getpwnam localeconv setutxent
dbm_nextkey getenv getpwuid lrand48 strerror
dbm_open getgrent getservbyname mrand48 strtok
dbm_store getgrgid getservbyport nftw ttyname
dirname getgrnam getservent nl_langinfo unsetenv
dlerror gethostbyaddr getutxent ptsname wcstombs
drand48 gethostbyname getutxid ptsname ectomb