Phibricator是Facebook开源的一体化项目管理、代码review工具,主要特点是集成度高、界面漂亮。根据搭建的经验看,确实做的非常完善,各种细节用起来像是商业产品,不会像其他的开源产品那么难以配置。这里把配置过程根据回忆写一下:

官方给出过一个一键安装的脚本,但是下载的时候感觉有点问题吧,下载完不是sh而是网页,而且我只有一台机器,环境都已经预先有了,也不想再搭一套LAMP。这里我们以centos5为例:

首先安装httpd + mysql + php,由于centos5的版本太低,yum源里的mysql和php均低于phibricator要求的版本,我们需要先升级yum源,参见参考文献, 不过好像安装的时候没有php53u,而是直接php53

之后把对应的扩展也装了:

yum install php53-mbstring
yum install php53-mysql

项目地址: https://github.com/chenxiaohui/resume

说明

通过文本文件生成简历tex的generator。最终生成pdf还是要靠Latex+Moderncv,环境请自行配置。

模板配置

config.tex 定义了公共头文件,包括包含的宏包,版面的布置和字体语言。

xxtemplate.tex定义了模板。模板语法比较简单,不给出严谨的语法定义了,主要如下两点:

  1. %xxx% 表示一个变量,将来会从cv文件中查找对应名字的变量,找到之后替换这个%xxx%
  2. %for=>xx% %endfor%表示一个循环,xx是section的name,将来会从cv文件中找到对应的section,然后parse section下的每个单独的项目,用结果替换for循环中的内容

    1. for循环中{0}{1}..表示一个for循环变量,cv中section下的条目会被分割成多个变量,顺序依次是0,1,2..,渲染的时候会对应的替换上述{0}{1}变量。如果数量不匹配会报错。
  3. 如上语法部分关键字可以配置,在config.py中。可以酌情修改。

xx.cv包含了简历内容,格式上参考了ini文件格式,但是略有不同。

  1. [section name]顶一个了一个section,对应简历中一个部分。section name的显示名称是在template里面写好的。这里的name只是给程序使用的,可以跟显示名称一致也可以不同。
  2. 不包含在某个section下的条目通过 key = value的方式定义。不能跨行,程序parse的时候只找第一个等号,后面有空格等符号都不影响。
  3. section下的条目每条可以包含多个字段,字段之间默认用竖线(|)分割(可修改)。字段的数量需要跟模板中对应section下for循环体中变量的数量一致。

程序中给出了几个实例,分别是英文、中文简历的template和cv文件,供参考。

使用

写好对应的cv和模板之后,make就行。open命令可能在mac之外的系统不能使用,建议注掉。

make distclean清空所有文件包括pdf

make again 是为了生成页码,xelatex跑第一遍的时候页码是乱码。

gen.py 文件格式如下:

./gen.py <template-file> <cvfile> <output-file>

参考文献:

[1] http moderncv 的笔记(支持中文), http://www.xiangsun.org/tex/notes-on-moderncv

名词解释:

SeviceConfig:

一个服务的所有配置存在一个目录下

BucketConfig:

 Bucket的配置存在一个单独的子目录中

配置项类型:

  • Integer
  • Long
  • Short
  • Float
  • Double
  • Byte[]
  • Boolean
  • String
  • 自定义配置项 ConfigObject

使用说明:

POM:

<dependency>
  <groupId>com.sohu.adrd</groupId>
  <artifactId>sohu-zk-client</artifactId>
  <version>1.0.1</version>
</dependency>

初始化

ServiceConfig.Instance().init(“ConnectString”, “serviceName”);//如果做测试可以用10.16.3.61:2181

ServiceConfig.Instance().init(“serviceName”); 默认使用肖永磊的zk地址

配置项使用

先给默认值

private static long exploitDiscardTimespan = 7 * 86400L;

可以保存个Instance()的引用

private ServiceConfig serviceConfig = ServiceConfig.Instance();

所有引用到的地方,通过如下方式取配置项(这是默认config):

serviceConfig.getLong(“exploitDiscardTimespan”, exploitDiscardTimespan)

如果是BucketConfig(bucketConfig会在zookeeper上根目录下再增加一个Node,名字是bucket的名字,在此之下存储config)

serviceConfig.Bucket(“bucketName”).getLong(“exploitDiscardTimespan”, exploitDiscardTimespan)

这样server端更新配置的时候,serviceConfig会根据通知刷新自己的配置缓存,下次使用getLong的时候就得到了新的配置。

上述getLong的过程包含了:

  1. 如果是Bucket配置,从Bucket中获取,如果找不到,从Service的配置获取,如果还是没有,返回默认值。

  2. 对于返回默认值的情况,写回Zookeeper。

  3. 如果Zookeeper端有修改,Zkclient会收到消息,重新update本地配置项的缓存。

  4. 如果定义了handler调用handler,如下所述:

如果需要根据配置修改的通知来做出响应(这是默认事件,node_data_change):

ServiceConfig.Instance().addEventListener("task_period", new IEventHandler() {
  @Override
  public void process(ZkEvent event) {
    logger.info("update task period.");
    setDeclaredField(TimerTask.class, ServerTasks.this, "period", ServiceConfig.Instance().getLong("task_period", period));  
  }
});

如果需要删除的通知:

  ServiceConfig.Instance().addEventListener("task_period", EventType.NodeDeleted, new IEventHandler() {
  @Override
  public void process(ZkEvent event) {
    logger.info("update task period.");
    setDeclaredField(TimerTask.class, ServerTasks.this, "period", ServiceConfig.Instance().getLong("task_period", period));  
  }
});

结合SpringFramework:

基本不变,只不过SpringFramework会先填充InitializingBean的域,这些值只有在出默认值的时候才会被采用。
  1. 生成一个重复列表可以通过如下语句:

     [i] * n #这比[ i for _ in range(0,n) ]简洁太多
     同样可以"i" * n来生成字符串
    
  2. map函数。

    可以用来分类函数和其调用参数,对于线程池比较有用。比如

     import urllib2 
     from multiprocessing.dummy import Pool as ThreadPool 
    
     urls = [
             'http://www.python.org', 
             # etc.. 
             ]
    
     pool = ThreadPool(4) 
     results = pool.map(urllib2.urlopen, urls)
     pool.close() 
     pool.join() 
    

建立了一个远程分支,提交到origin上之后,发现之前有一个同样的远程Repository存在,而且名字一样,这就比较D疼了,git branch -a 显示的分支里面的分支提交到了另一个Repository,但是这个Repository已经改名字了,虽然地址一样。

搞来搞去之后发现git checkout远程分支的时候报不存在的问题,删除这个分支的时候同样有这个问题:

unable to delete 'refactor': remote ref does not exist

导致这个分支就这么存在着删不掉了。查stackoverflow有人给出如下的方案

git fetch -p origin

问题是能解决了,但是不太理解为什么。

mac下使用多屏幕的话,经常需要把一个窗口移动到另一个窗口,windows下有快捷键win+shift+左右,linux下貌似可以通过xdotool实现,绑定一个快捷键,xdotool帮助你移动窗口到一个绝对位置。如下:

xdotool getactivewindow windowmove 0 y windowactivate windowfocus
xdotool getactivewindow windowmove 1280 y windowactivate windowfocus

mac下没有找到对应的系统快捷键,虽然可以设定一个zoom键来完成窗口最适化,但是没有快捷键来完成窗口的移动。这里我们通过Moom实现。

Moom是一个窗口管理工具,安装之后只有一个配置页面,但是你会发现鼠标移动到左上角窗口最适化的按钮上的时候会弹出一个窗口管理的提示框。如下:

然后我们配置窗口移动的功能,首先需要一个全局快捷键:

之后可以设置按下全局快捷键之后上下左右键的功能。有移动窗口,半最大化窗口,缩小放大和移动窗口到一个屏幕。

这样就可以先按下全局快捷键,如下:

再通过你定义的快捷键来移动窗口了。

首先介绍一下Jenkins,如果你熟悉自动化构建的话,那么肯定听说过hudson。Jenkins是hudson的开发者跟Oracle撕bi之后,另立门户的一个hudson分支。当然这么说似乎不太靠谱,目前hudson已经不维护了毕竟,而Jenkins的开发社区还是很活跃的,各种插件层出不穷。总的来说,如果你不是已经习惯了hudson并且有一个能用的副本,都应该迁移到Jenkins。

下面说一下如何配置。

Jenkins的安装非常简单,只需要从Jenkins的主页上下载最新的jenkins.war文件然后运行 java -jar jenkins.war。如果需要配置运行参数可以如下设置一些环境变量。

JENKINS_ROOT=/home/harrychen/share/jenkins
export JENKINS_HOME=$JENKINS_ROOT/jenkins_home
java -jar $JENKINS_ROOT/jenkins.war --httpPort=8080 >>output.log 2>&1 &

打开对应url可以看到如下界面

回想一些事情的时候感觉印象最深刻的往往不是一段时间,而是一些瞬间。比如大学毕业晚会的那个晚上,大家喝的一塌糊涂,早晨醒来,看依然灿烂的阳光,那种孤独感是能镌刻很久的。再比如在北航的时候,那时候习惯晚上看书,安静,一个人在三号楼前的空地走走,听学院路上的川流不息的车声。事情已经远去,感觉依然清晰。每个片段好像人生路上的benchmark,只不过留下最深印象的,往往不是所得,而是所感。

windows下post-review遇到一个问题(不是我,不用windows)。python会报错:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position xxx: ordinal not in range(128)     

又是编码的问题啊,我不想去看post-review的源码,所以还是改默认环境的源码好了。找到rbtools\utils\process.py,import sys后面加两行:

reload(sys)
sys.setdefaultencoding("utf-8") 

Ok.

首先这里的partition算法指的是快速排序中把数据分区的算法,算法接受一个数列和一个值,返回一个位置,这个位置之前的元素都小于等于输入值,之后的元素都大于等于输入值。

算法如下:

还有一种常见的形式:

这里我们讨论下落点的情况,如果partition算法可以传入任何的value,而不是快排中那样从序列中随机获得一个值,那么结果就会有多重情况了。

今天迁移工程到mac上,准备以后用mac作为主开发工具。迁移maven的时候发现,maven download会停在那里,如下:

解决如下:

  1. 怀疑http_proxy问题,去掉系统环境变量。无效
  2. 怀疑shadowsocks问题,关掉,无效。
  3. maven配置问题,对比了默认配置,没什么错误的地方。
  4. 怀疑服务器问题,换成开源中国的maven源,ok,就是慢点。
  5. 继续等待,几分钟后报错: java.net.SocketException: Malformed reply from SOCKS server,似乎还是代理的问题。
  6. 查阅发现java还有自己的代理配置,见参考文献,去掉代理。貌似还是无效。
  7. 索性重启,搞定。

还是reviewboard的事情,我们需要一个自己的邮件服务器来发通知邮件。sendmail是一个比较好的选择,搭建的方式很简单,安装sendmail,修改配置文件,修改local_host_name就行。如果不需要登陆验证,这样也就直接能用了。现在的问题是reviewboard是必须登陆验证的。至少看报错上是这样。

SMTPException: SMTP AUTH extension not supported by server. reviewboard

具体代码没细看,但是应该默认都有认证,只是认证方式不一样。我们telnet到25端口,执行

ehlo localhost


/usr/sbin/testsaslauthd -u username -p sohutest

mail -s "test" xxx@xxx.com <content.txt

主要两种方式:

  1. 不grep自己。

     -v, --invert-match
         Invert the sense of matching, to select non-matching lines.
     所以:
         ps xuf|grep python|grep -v grep
    
  2. awk 略去最后一行。

     ps xuf|grep python|awk 'NR>1{print p}{p=$2}'
    

    解释下:第一行的时候,NR=1不打印,但是把pid存在p中,下一行打印,最后一行的时候,打印的是上一行的pid。

    awk博大精深…

Postreview 客户端配置

reviewboard是群众喜闻乐见的代码review工具。本文主要涉及客户端配置和review流程,server端配置见文档1

首先安装python(必须的),之后安装post-review插件:

pip:
    pip install --allow-external RBTools --allow-unverified RBTools RBTools
easy_install:
    easy_install -U RBTools
LinuxRPM:
    sudo yum install RBTools
直接安装:
    git clone git://github.com/reviewboard/rbtools.git
    cd rbtools
    python setup.py

旧版的post-review有一个post-review的命令,新的只有rbt了,命令格式不太一样。

post - Posts changes to Review Board
diff - Displays the diff that will be sent to Review Board
land - Lands a change in a local branch or on a review request
patch - Patches your tree with a change on a review request
setup-repo - Sets up RBTools to talk to your repository

首先配置review board,HOME目录下简历.reviewboardrc如下:

REVIEWBOARD_URL = 'http://10.16.10.74/'
  REPOSITORY = 'adrd-service'

或者在代码目录执行rbt setup-repo,会生成上述文件。REPOSITORY原则上不配置也行。

PostReview流程。

 原则上git commit 之后,git push之前要提交post-review,保证代码修改相关人都知悉并ship修改才能提交。基本流程是:

git add xx
git commit -m "message"
rbt post

对同一个更改post之后如果要再次修改,可以:

rbt post -r <post_id>

post-id是每个post的url/r/后面的数字。post-review标题原则上按照如下规范:

[repository_name][branch_name][NewFeature|BugFix|Refactor|Log] post-review title

groups/people添加的人员原则上包括:

1. 技术主管[mentor]
2. 合作者[partner]
2. 其他需要知悉修改的人[related]

post-review旧版和svn的整合见文档2。 post-review在svn和git同时托管的情况下处理冲突的方法见文档3。 一个post-review的vim插件见文档4

Bibliography:

[1] Reviewboard的安装, http://cxh.me/2015/03/28/review-board-setup/

[2] Svn Vim 整合方案, http://cxh.me/2013/10/15/svn-vim-integration/

[3] Post-review在svn和git共同存在下的冲突问题, http://cxh.me/2013/10/11/post-review-conflict-under-git-svn/

[4] Post-review插件, http://cxh.me/2014/06/21/ppost-review-plugin/

reviewboard是群众喜闻乐见的代码review工具。安装过程详见文档1文档2。这些写一些遇到的问题:

  1. 默认支持版本是django 1.6,最新的django1.7不支持。所以最好用virtualenv独立出一个环境来。

  2. 官方文档的apache不知道是怎样的目录结构,反正我自己安装的apache和yum install的都跟官方的目录结构不太一样。

    1. copy或者link apache-wsgi.conf到conf.d目录,etc/httpd结构如下

    2. 配置下PythonHome

      WSGIPythonHome /opt/harrychen/rb #WSGIPythonPath /var/www/reviewboard:/opt/harrychen/rb/lib/python2.7/site-packages

    3. WSGIPythonPath 文档里说最好还是配置一下,但是有PythonHome貌似就行了

    4. 按提示给一些目录加权限。

    5. rb-site install,建议直接放到var下,reviewboard的结构跟apache的默认/var/www下类似的。

对于一个简单的开发环境,能实现tags的定位跳转,以及查询就够用了。这种情况下,vim + 一些插件完全能够满足要求,尤其对于python这样的脚本语言开发,vim比IDE更简洁。这里我们尝试把vim配置成一个精简的IDE。

首先升级你的ctags,换成exuberantCtags,后者功能更强大,且对c++等语言的支持更好。

ubuntu下可以直接:
    apt-get install exuberant-ctags
centos下:
    yum install ctags
mac下:
    brew install ctags-exuberant
windows下:
    什么是windows?

cscope如果系统没有默认安装的话也装一下。

之后安装tags插件,相对taglist.vim其实我们更推荐tagbar.vim,因其对面向对象特性支持的更好。

关于安装目录:

dist-packages instead of site-packages. Third party Python software installed from Debian packages goes into dist-packages, not site-packages. This is to reduce conflict between the system Python, and any from-source Python build you might install manually.

dist-packages取代了site-packages。从Debian安装包安装的第三方的Python软件 被 安装到 dist-packages,不是 site-packages.这是为了减少,系统自带python 和 你手动安装的python 之间的冲突。

不过我感觉都在site-packages下...

删除包:

pip uninstall packageName
#自动删除
easy_install -mxN packageName
#手动删除

显示安装的包:

pip list
easy_install只能去安装目录看了。实际上是共享的。

另外需要注意的就是不同的Python版本下会有不同的easy_install和pip,比如easy_install3/pip3等。

pip -V 可以显示当前pip是针对哪个Python版本的

可以用virtualenv来分离不同的环境。

今天想在gnome下运行一个自动关机前的提示,发现crontab根本不起作用啊。以为是路径和root权限的问题,但是路径没问题,而且root的crontab必须要sudo crontab -e的,也就是说crontab还是执行在当前用户下。

后来发现对图形界面程序来讲,crontab的进程需要指定输出到哪个显示的,也就是

export DISPLAY=:0 #:0指第一个显示终端,ctrl+alt+f7那个
/usr/bin/notify-send "亲,该去运动了!!一分钟后关机,请保存所有未保存的Job."
sudo shutdown -h 1

或者直接在crontab -e中指定环境变量:

DISPLAY=:0
30 20 * * * /home/cxh/repo/scripts/shutdown.sh

可以顺便制定一下其他变量

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=cxh #如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/home/cxh #使用者运行的路径,这里是根目录

crontab出错的信息会发邮件到对应用户,mail或者cat /var/mail/$USER查看。d *清理。

python2中需要区分另种不同形式的string,字符串和字节串(严格意义上讲,string就是字符串,字节串是bytes)。默认情况下,直接输入字符串格式为str,编码由文件编码指定,可以理解为ascii存储的某种形式,编码由编码方式决定。而python字符串是unicode内码的字符流,无论采用什么编码,长度都是由字符个数决定的,字符是最基本的操作对象。

转换上,最终字符”xx”的编码由文件编码决定,u”xx”统一被转成unicode字符,对于某种编码的bytes,decode或者unicode函数把编码转成字符,对于unicode的字符,encode把字符编码为字节。

命令行打印上看,字符直接打印的时候,程序会按照sys.defaultencoding编码输出字符,如果打印字节,需要保证编码跟terminal/IDE的默认编码一致。输入的时候应该不存在这个问题,terminal会按照编码sys.defaultencoding把输入转成unicode字符。

python3中不存在这两种不同的编码形式了。string统一变成了unicode。略浪费。

详见参考文献

eclipse导入Intellij的maven工程的时候经常会出现如下的情况:

目录结构太深了,解决方法也很简单,alt+f5 refresh maven project , 目录结构会被收起:

源码安装的一些NOTE:

  1. 首先./configure —helps是可以看到所有编译选项的。
  2. centos下,yum install xx.rpm,可以安装依赖,ubuntu下:apt-get build-dep xx
  3. zsh下,./configure tab是会提示所有的编译选项的。
  4. Makefile如果没有uninstall选项,更合理的办法似乎是:

    1. 先install到一个单独目录:

      find . -exec rm 安装目录/{} \;

    文件夹自然会失败。

apache经典的项目,java下有log4j,c++下的实现是log4cxx,安装见参考文献.

主要有个编译问题,大概是C库和C++库的问题,把出错的地方的头文件都补上就行了。

  1. console.cpp : #include <string.h> #include <stdio.h>
  2. socketoutputstream.cpp : #include <string.h>
  3. inputstreamreader.cpp: #include <string.h>

Bibliography:

[1] [原创] log4cxx在Linux下的安装、使用, http://www.codelast.com/?p=3211

先安装能通过yum直接安装的

yum install autoconf automake gcc gcc-c++ git libtool make nasm pkgconfig wget zlib-devel
yum install yasm SDL SDL-devel dirac dirac-devel gsm gsm-devel libvpx libvpx-devel gnutls gnutls-devel freetype freetype-devel openjpeg openjpeg-devel opus opus-devel

剩下lame lame-devel libvpxlame-devel xvidcore xvidcore-devel faac faac-devel opencore-amr opencore-amr-devel faad2 a52dec libfaac 手动安装

关于登陆/非登录/交互/非交互shell的问题见参考文献1。今天遇到的问题是su/sudo的时候环境变量到底是怎么样的,执行了什么rc文件。

  1. sudo命令是以root的身份执行command命令,但是环境变量还是当前用户的,执行目录也仍然是当前目录 即环境变量和执行目录都不会切换到root
  2. su – 命令是切换到另一个用户,环境变量会切换到username,执行目录会切换到目标用户username的家目录
  3. su 命令仅切换用户身份,例如从A切换到B,执行whoami命令,显示的是用户B,但当前目录不会切换, 环境变量也仍未切换,仍为A用户的环境变量
  4. sudo su 只是用sudo的权限来执行su命令,跟su本身一样。
  5. visudo可以配置sudo的继承环境变量

    Defaults env_keep = “COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS JAVA_HOME PATH”

Bibliography:

[1] bash 深入理解:交互式shell和非交互式shell、登录shell和非登录shell的区别, http://blog.csdn.net/trochiluses/article/details/13767669

跑hadoop的时候总遇到这个问题,不影响但是比较烦:

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable   

大概原因是说为hadoop native library是32位系统编译的,在64位系统上会有这个提示,需要下载hadoop的源码重新编译。如下:

  1. 安装maven.
  2. 配置好MAVEN_HOME/PATH
  3. 下载 hadoop-2.4.0-src.tar.gz。
  4. 安装protobuf2.5.0。
  5. 安装cmake.
  6. 安装openssl-devel
  7. 安装ant
  8. 安装zlib-devel
  9. mvn package -Pdist,native -DskipTests -Dtar
  10. 配置hadoop 环境变量

     export HADOOP_COMMON_LIB_NATIVE_DIR="~/hadoop/lib/"
     export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=~/hadoop/lib/"
    

遇到一个问题,openjdk好像没有tools.jar,所以需要安装sun的jdk,重新设置JAVA_HOME

把一个公钥上传到服务器配置了免密登陆,ok之后再配置几台服务器之间的免密,发现不成功。尝试了如下几种定位方法:

  1. ssh目录权限。修改成.ssh 700,下面文件600。解决了一个的问题。其他几台还是不行。
  2. 查看sshd_config是否允许公钥登陆。看来不是这个问题。
  3. ssh -v 看调试信息,发现尝试过publickey但是验证未通过。手动比对ssh 公钥发现无误。
  4. 搜索错误信息:Offering public key: /root/.ssh/id_rsa,有人说是因为.ssh目录没有ssh_home_t标签, 通过这个命令查看文件夹或文件的标签

    [root@localhost ~]# ls -laZ
    

    通过

    restorecon -r -vv /root/.ssh
    

    来重置标签,但是没起作用。

  5. 设想可能是手动建立.ssh目录的问题,删除.ssh,通过ssh-keygen本地生成密钥并建立目录。问题解决。

补充一点细节。bash下似乎单行的function必须以分号结尾,我说怎么server登陆总报error end line xxx..

首先,virtual server的概念是说一个apache实例可以模拟出多个server,这些server通过不同的标识来区分(网卡IP/ServerName/端口/ServerPath),每个虚拟的server最终对应到一个DocumentRoot。

我们期望如下配置

    80   -> /           网站
            /mysite     子网站mysite
    8080 -> /           网站news_auth

配置如下:

sudo的时候不会加载.bashrc什么的,今天就遇到了一个比较扯的问题。在home下安装了高版本的vim,bashrc里面PATH是home高于/bin的,但sudo vi的时候会调用系统的。尝试如下方式:

  1. 修改其他配置如.profile什么的。比较麻烦。
  2. 修改sudoers里面env_keep,发现还是不起作用。
  3. 修改sudoers里面secure_path,如下:

    Defaults    secure_path = /root/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
    

OK。

偶然看到这个链接,一个识别图像并标注的,还蛮有意思。代码直接用示例里面的就可以, 需要注意两个问题:

  1. 注册一个项目。ResponseType选择Product。
  2. 必须上传网络链接,不能使用文件。

测试几个效果(多次返回结果不一定一样):

  1. 百度首页,识别为”百度标志”
  2. 陈吉宁校长的头像,识别为”男人的黑色西装外套” 或 “男人的蓝色西装”
  3. 我博客一张背景图,识别为”女性的黑色T恤” 或 “红色的通勤自行车”

让我突然对这个tag算法很感兴趣。

基本步骤可以看这个,说两个问题:

  1. brew的formulae没有celt这个包。忽略了算了。

  2. libaacplus安装的时候,

    1. 首先这个地址http://217.20.164.161/~tipok/aacplus/libaacplus-2.0.2.tar.gz已经失效了,从网上下载的话,这个版本还是有问题,configure的时候会卡住,一些patch丢失了好像。建议直接fork github上的
    2. 这个branch也有问题,frontend链接的时候会提示ld: symbol(s) not found for architecture x86_64,直接从Makefile.am里面把frontend去掉算了。
  3. 可以通过brew直接安装:

     brew install ffmpeg --with-fdk-aac --with-ffplay --with-freetype --with-frei0r --with-libass --with-libvo-aacenc --with-libvorbis --with-libvpx --with-opencore-amr --with-openjpeg --with-opus --with-rtmpdump --with-schroedinger --with-speex --with-theora --with-tools
    
  4. libav10.5之后没有avserver的安装了,虽然enable-avserver的选项还在,所以不同版本安装的卸载时候会有些残留文件。我的安装选项是:

      --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvorbis --enable-avserver --enable-libvpx --enable-shared --enable-libx264 --enable-gpl --enable-nonfree --enable-version3 --enable-openssl --enable-gnutls --enable-zlib
    
  5. Besides, 我发现brew可以列出configure选项,如下:

     brew options xxx
    

手动安装的话,可以通过./configure —help来查看。