敏捷开发简述

1、敏捷开发简介

“敏捷”一词,解释为灵敏迅速、灵活。敏捷开发(Agile Programming)是时下流行的软件开发方法。

传统的软件开发模型,主要包含两种“瀑布型”、“螺旋型”。敏捷开发本身属于“螺旋型”的开发模型,并辅之以必要的实施过程。敏捷开发有两个重要模型,极限编程(eXtreme Programming、XP)、Scrum模型。XP模型,与其他模型的不同在于“结对编程”(即两个人在一个机器上同时开发程序),这在国内是几乎不可能的,没有听说过XP模型的案例。Scrum模型的一个显著特点就是响应变化,它能够尽快地响应变化,是比较常用的方式,案例是比较多。

敏捷开发宣言:

个体和交互 胜过   过程和工具

可以工作的软件 胜过   面面俱到的文档

客户合作 胜过   合同谈判

相应变化 胜过   遵循计划

虽然右项也具有价值,但我们认为左项具有更大的价值

2Scrum过程讲解

Scrum 将软件开发团队比拟成橄榄球队,有明确的最高目标,熟悉开发流程中所需具备的最佳典范与技术,具有高度自主权,紧密地沟通合作,以高度弹性解决各种挑战, 确保每天、每个阶段都朝向目标有明确的推进。

Scrum 开发流程通常以 30 天(或者更短的一段时间)为一个阶段,由客户提供新产品的需求规格开始,开发团队与客户于每一个阶段开始时挑选该完成的规格部分,开发团队必须尽力于 30 天后交付成果,团队每天用 15 分钟开会检查每个成员的进度与计划,了解所遭遇的困难并设法排除。

2.1、有关Scrum的几个名词

Backlog: 可以预知的所有任务,包括功能性的和非功能性的所有任务。

Sprint:一次跌代开发的时间周期,一般最多以30天为一个周期.在这段时间内,开发团队需要完成一个制定的Backlog,并且最终成果是一个增量的,可以交付的产品。

Sprint Backlog:一个Sprint周期内所需要完成的任务。

Scrum Master: 负责监督整个Scrum进程,修订计划的一个团队成员。

Tme-box: 一个用于开会时间段。比如每个Daily Scrum Meeting的Time-box为15分钟。

Sprint Planning Meeting: 在启动每个Sprint前召开。一般为一天时间(8小时)。该会议需要制定的任务是:产品Owner和团队成员将Backlog分解成小的功能模块, 决定在即将进行的Sprint里需要完成多少小功能模块,确定好这个Product Backlog的任务优先级。另外,该会议还需详细地讨论如何能够按照需求完成这些小功能模块。制定的这些模块的工作量以小时计算。

Daily Scrum Meeting:开发团队成员召开,一般为15分钟。每个开发成员需要向Scrum Master汇报三个项目:今天完成了什么?是否遇到了障碍?即将要做什么?通过该会议,团队成员可以相互了解项目进度。

Sprint Review Meeting:在每个Sprint结束后,这个Team将这个Sprint的工作成果演示给Product Owner和其他相关的人员。一般该会议为4小时。

Sprint Rtrospective Meeting:对刚结束的Sprint进行总结。会议的参与人员为团队开发的内部人员。一般该会议为3小时。

2.2、实施Scrum的过程简单介绍

1) 将整个产品的Backlog分解成Sprint Backlog,这个Sprint Backlog是按照目前的人力物力条件可以完成的。

2) 召开Sprint Planning Meeting,划分,确定这个Sprint内需要完成的任务,标注任务的优先级并分配给每个成员。注意这里的任务是以小时计算的,并不是按人天计算。

3) 进入Sprint开发周期,在这个周期内,每天需要召开Daily Scrum Meeting。

4) 整个Sprint周期结束,召开Sprint Review Meeting,将成果演示给Product Owner.

5) 团队成员最后召开Sprint Retrospective Meeting,总结问题和经验。

6) 这样周而复始,按照同样的步骤进行下一次Sprint.

3、敏捷开发一些看法

1)敏捷开发以人为核心,直接以用户需求作为驱动,易于接受需求的变化。以小的开发粒度来应对需求的变更,最小成本的满足与用户的互动。

2)敏捷开发的过程是不断改进的,敏捷团队可以根据具体情况构建自己的敏捷开发过程。

3)敏捷开发并不要求“精英个体”而是致力于构建“精英团队”。足够粒度的分解开发任务,用以保证人员的临时变化。倡导开发个体能够熟悉整个产品的开发方面,以避免人员流动造成技术缺失。

4)敏捷开发的开发者是一个不断学习的个体,需要掌握必要的开发技巧,如:移除重复代码、注释转换、去除代码异味、保持代码简洁、慎用继承、正确处理引用、分离数据库访问/UI/域逻辑、单元测试、测试驱动编程等。



《中国开源软件推进联盟》中国开源的毒瘤

所谓的《中国开源软件推进联盟》,其组建过程与宗旨可以从其网站上获取。这里我不谈《联盟》的历史,只谈现在他存在的问题,以问题的影响性。所有对《联盟》的质疑声,源自于RedOffice落选核高基。

其实RedOffice的落选没有什么,但是胡才勇的离职,就让整个事情变得“耐人寻味”了。RedOffice落选之后,应胡才勇之邀,《上书言事》。上书的内容并没有公示,但基本内容无外乎:本着“拿来”精神“认定”RedOffice为“国产”,以避免国外的“技术垄断”而实现“技术自主”。其避免 “技术垄断”的理由,是正确的,但是其素材却是错误的。使用“别人垄断”开源软件,自己改改就算“技术自主”,者未免“让人所不耻”。如果自己有实力,为什么不重新开发一套真正自主的呢?“避免重造轮子”,这个理由在已经被公认的“开源协议”面前,不值得一驳。进核高基为什么?为钱!改改开源软件,就拿核高基的资金,而套以“国产”的牌子,就是我们的《联盟》所要达到的目标?错误的事情,总源自于模糊的动机;从这件事情来看《联盟》的初衷和宗旨非常的模糊,其成立太过于仓促了,而逐渐沦落于为RedOffice这样的“假国产”呐喊甚至《上书言事》。

为什么称《联盟》为毒瘤?爱之越深,恨之越深。RedOffice已经通过“落选”这件事情所明确的原因,而《联盟》却一再的为其“国产”言论鼓吹,更有甚者出现只为“会员服务”的言论。所有这一切,让我们看到了一个不承认任何错误的《联盟》,一个通过歪曲开源协议粉饰错误的《联盟》。此外,《联盟》更大的问题在于不存在“讨论、辩论”的环境,与其“主流”思想相违背的就被坚决的“清洗”出来,使《联盟》变成“一言堂”,比较突出的就是袁萌因为OOXML 的事情被清洗。我们都知道“真理越辩越明”,而《联盟》给了我们“一记耳光”,让我们知道了“中国开源我说了算”的“领导力”。

我对开源的关注,始于我使用的SCM(版本控制工具)Git,它是Linux Kernel所使用的SCM。通过Git我发现一个以maillist+patch所构建的开源软件开发方式是多么的神圣:你可以提交patch,别人对你的patch也会提出修改意见,修改好的patch会被接受。这样的社区方式,让我们看到了“提出”、“质疑”、“接受”的一个基本轮廓。而《联盟》让我们看到了什么?“质疑”的人被清洗了,“质疑”的言论被“压制”。清洗过老袁,压制了老袁blog上的评论,这就是我们所看到的《联盟》。

对于老袁,我的态度有一个转变过程。从Google上搜索“中国开源”,发现博文《从开源领袖到头号叛徒——袁萌100天变身实录》,我就上老袁的 blog上,看到有人一直在骂他。甚至有人跟我说过“我通常上袁萌blog上只看评论,看看就开心”,我也这样想过,而且也对其“U盘”挺反感的。但仔细想想“U盘”的目标用户针对的是小学生、非IT从业人员的话,“U盘”就显得没那么“幼稚”了。可能是去年,我听说老袁被《联盟》开了,没有仔细想过,因为之前我知道OOXML事件。但是这次老袁直接质疑RedOffice而力挺“Linux打假”,才让我真正的看清了《联盟》“一言堂”和“挺假”的本质,从而对老袁的态度有了一定的改观。

《联盟》的初衷是好的,过去也好过,但是发展到现在还“好”吗?对“质疑”的压制,对“假国产”的力挺,让我们闻到了利益腐蚀下的“腐臭”。他的所作所为给我们展示了一个国内开源利益链条,修改开源软件=》包装为国产=》申请国家资金。这样的链条,让我们心痛、心寒、愤怒。这一切并不源自于《联盟》,但是他至少是帮凶;这样的帮凶行径就是中国开源的“毒瘤”。让中国开源真正的走向健康,这样的毒瘤必须要铲除,否则只能是无休止的“打假”而“假不绝”的惨象。

我的“开源打假”观 – 2

1)有人谈到的“输-血”问题的确值得我们深思,难道国家不“输-血” 支持国内开源公司,国内就无人用开源了吗?不是的,国内对于开源的使用那是历史悠久的,因为国人喜欢“免费”的东西,况且嵌入式开发基本上围绕Linux 的商业企业越来越多,这和国内开源公司的努力一点关系都没有,那是因为“价格”因素使然。Linux的引进,是一些学者的“功劳”(例如、袁陆这批人-)和国内开源公司更一点关系也没有(虽然有些学者最后进入这些公司)。
2)国内开源的支持不在于“使用”,而在于“贡献”。“使用” 就没什么好说的。“贡献”就在于提交代码,而不仅仅局限在’汉化’这个层面。我曾看过一些开源项目的代码提交者列表,国人的名字是有的,但通过邮箱来看,基本上都是大公司的雇员。也有一些零散的“个人”提交者的代码,但“形只影单”。况且国内这种“35岁”即面临转行的行业环境,更难出现“长期“的“贡献者”出现。
3)综上。国家扶持开源产业;向国内所谓“开源”公司输血是走了弯路,因为他们不能为开源“贡献”什么,而“使用”早已被“价格”因素被国内的人广泛“参与”了。国家真正该做的就是使软件产业更“健康”、“长久”,使年龄从“劣势”转变为“优势”,同时也就促进了“开源”的“贡献”方向的“参与”。

我的”开源打假“观

1)许多人,将”打假”认定为老袁的“恶意搅水”,进行了一些谩骂。更有甚者也对我本人进行了谩骂。我一直认为“谩骂是理屈者最后的武器”。
2)我认为老袁的“搅水”对“假”是“恶意”的,但对中国的开源是“善意”的、“无私”的–因为他早就想到会被“既得利益”者及其追随者和被蒙蔽者的“穷追猛打”和“恶意谩骂”。
3)中国的开源怎么发展,要首先跳出对“国家资金”的追逐游戏,才能够走上健康发展之路。虽然我本人对“哲思社区”和对“徐继哲”保留态度,但他那种SNS式的开源推广方式,也算是一种有效的手段。
4)这里的网友,能够在“打假“与”打假打假“的氛围中充分的讨论、揭露;说明我们这些人都希望中国的开源能够健康的发展。”发展“中难免有问题,有问题就要改正;一个”刚愎自用“不接收批评的”联盟“,能够给”中国开源“带来健康之路吗?翻翻历史我们总能够找到答案,比如”崇祯“。
5)部分人听信了一些”片面“的信息,就下了”全局“的结论。要明白”错误“总会出现的道理(比如BUG),有问题就要解决问题。这次老袁的”打假“就是解决”利益至上 “的开源”错误“,我们凭什么要容忍”错误“不被解决呢?难道继希望于一个能够自我”修正“的”联盟“?这些天联盟的表态,没有让我们看到这一点。这样的”联盟“我们要彻底的”打假“,让它不要再为了”自己“和”自己成员“的利益来歪曲开源这条信念了。

红旗Linux的下载数字上的猫腻

一组数字:(http://www.redflag-linux.com/d/iso/ 2010-07-28 08:37)
红旗 inMini 2009 下载1352990次
红旗Linux 6.0 SP3 下载0次
红旗Linux桌面7.0 2009/07/30 iso更新 下载5603205次
红旗linux 桌面版 6.0 sp2 完整版 DVD ISO 下载9404255次
一些说明:
1)Redhat分支的Linux都采用yum进行软件的更新,从不会发布SP2\SP3这样的包,说明红旗Linux并没有引入Redhat9之后的这些新特性,更新速度太慢。
2)这些下载数字存在虚假可能。SP2下载了940万次而SP3下载了0次,940万人中就没有一个对SP3有兴趣?如果是自己刷数字,为什么不刷SP3的数字呢?工作这么不认真。

跟进数字:(http://www.redflag-linux.com/d/iso/ 2010-07-28 09:21)
红旗 inMini 2009 下载1353008次
红旗Linux 6.0 SP3 下载0次
红旗Linux桌面7.0 2009/07/30 iso更新 下载5603223次
红旗linux 桌面版 6.0 sp2 完整版 DVD ISO 下载9404260次
跟进说明:
数字刷新的太快了,仅仅44分钟,inMini2009增加下载18次,桌面7.0增加下载18次,SP2增加下载5次。这个速度,其中有2个18次,这太让人寻味了.要知道,这是在8点-9点这段刚刚的上班时间里面,难道国外对红旗Linux很推崇?国内红旗已经有近千万的Linux的桌面用户了嘛?耐人寻味,刷数机器人我曾经玩过。

再次跟进:(http://www.redflag-linux.com/d/iso/ 2010-07-28 09:32)
红旗 inMini 2009 下载1353011次
红旗Linux 6.0 SP3 下载0次
红旗Linux桌面7.0 2009/07/30 iso更新 下载5603234次
红旗linux 桌面版 6.0 sp2 完整版 DVD ISO 下载9404261次
跟进说明:
无语!

再次跟进:(http://www.redflag-linux.com/d/iso/ 2010-07-28 18:05)
红旗 inMini 2009 下载1358439次
再次跟进:(http://www.redflag-linux.com/d/iso/ 2010-07-28 18:06)
红旗 inMini 2009 下载1358477次
再次跟进:(http://www.redflag-linux.com/d/iso/ 2010-07-28 18:06)
红旗 inMini 2009 下载1358500次
再次跟进:(http://www.redflag-linux.com/d/iso/ 2010-07-28 18:07)
红旗 inMini 2009 下载1358533次
跟进说明:
铁证如山,每次刷新那个页面 inMini 2009都在很迅速的增长,咳,太疯狂了。

再次跟进:(http://www.redflag-linux.com/d/iso/ 2010-07-29 08:59)
红旗 inMini 2009 下载1369701次
跟进说明:
不再继续跟进了,一个晚上增加了10000多次,咳,无耻!

My God! ARM-LINUX-GCC-GNUEABI 成功了!

#!/bin/sh

# path macro
SRC=${0%%/*}
if [ "${SRC}" == "." ]; then
	SRC=${PWD}
fi
PARALLEL="-j 3"

# target macro
unset AR AS CC CFLAGS CXX CXXFLAGS LD RANLIB STRIP
export ARCH=arm
export TARGET=${ARCH}-linux-gnueabi
export TARGET_GCC="--with-arch=armv4t --with-abi=aapcs-linux --with-float=soft"
export CROSS_COMPILE=${TARGET}-
export PREFIX=${HOME}/.devel/${ARCH}
export LANGUAGE=C
export LC_ALL=C

# path init
mkdir -p ${PREFIX}
if [ ! -d ${PREFIX} ]; then
	echo "Not create path: ${PREFIX}"
	exit
fi

# path & file
linux_path=linux-2.6.33.5
linux_file=${linux_path}.tar.bz2
binutils_path=binutils-2.20.1
binutils_file=${binutils_path}.tar.bz2
gcc_path=gcc-4.5.0
gcc_file=${gcc_path}.tar.bz2
glibc_path=glibc-2.11.2
glibc_file=${glibc_path}.tar.bz2
glibc_ports_path=glibc-ports-2.11
glibc_ports_file=${glibc_ports_path}.tar.bz2

# linux headers
cd ${SRC}
if [ ! -e ${linux_file} ]; then
	echo "Not found file: ${linux_file}"
	exit
fi
if [ ! -d ${linux_path} ]; then
	tar xjf ${linux_file}
fi
if [ ! -d build/${linux_path}-headers ]; then
	mkdir -p build/${linux_path}-headers
	cd ${linux_path}
	make ARCH=${ARCH} INSTALL_HDR_PATH=${PREFIX}/${TARGET}/usr headers_install
	find ${PREFIX}/${TARGET}/usr/include -name .install -or -name ..install.cmd | xargs rm -fv
fi

# compile binutils
cd ${SRC}
if [ ! -e ${binutils_file} ]; then
	echo "Not found file: ${binutils_file}"
	exit
fi
if [ ! -d ${binutils_path} ]; then
	tar xjf ${binutils_file}
fi
if [ ! -d build/${binutils_path} ]; then
	mkdir -p build/${binutils_path}
	cd build/${binutils_path}
	../../${binutils_path}/configure \
		--prefix=${PREFIX} \
		--target=${TARGET} \
		--disable-nls \
		--disable-multilib
	make $PARALLEL && make install
fi

# compile gcc-stage1
cd ${SRC}
if [ ! -e ${gcc_file} ]; then
	echo "Not found file: ${gcc_file}"
	exit
fi
if [ ! -d ${gcc_path} ]; then
	tar xjf ${gcc_file}
fi
if [ ! -d build/${gcc_path}-stage1 ]; then
	mkdir -p build/${gcc_path}-stage1
	cd build/${gcc_path}-stage1
	../../${gcc_path}/configure ${TARGET_GCC} \
		--target=${TARGET} \
		--prefix=${PREFIX} \
		--disable-nls \
		--disable-shared \
		--disable-mutilib \
		--disable-decimal-float \
		--disable-threads \
		--disable-libmudflap \
		--disable-libssp \
		--disable-libgomp \
		--without-headers \
		--enable-language=c \
		--with-newlib
	make $PARALLEL all-gcc all-target-libgcc && make install-gcc install-target-libgcc
fi

# compile glibc
cd ${SRC}
if [ ! -e ${glibc_file} ]; then
	echo "Not found file: ${glibc_file}"
	exit
fi
if [ ! -d ${glibc_path} ]; then
	tar xjf ${glibc_file}
	cd ${glibc_path}
	sed -i 's/gnulib := -lgcc \$(libgcc_eh)/gnulib := -lgcc/' Makeconfig
	sed -i 's/static-gnulib := -lgcc -lgcc_eh \$(libunwind)/static-gnulib := -lgcc/' Makeconfig
	cd ..
fi
if [ ! -e ${glibc_ports_file} ]; then
	echo "Not found file: ${glibc_ports_file}"
	exit
fi
if [ ! -d ${glibc_path}/ports ]; then
	cd ${glibc_path}
	tar xjf ../${glibc_ports_file}
	mv ${glibc_ports_path} ports
	cd ..
fi
if [ ! -d build/${glibc_path} ]; then
	mkdir -p build/${glibc_path}
	cd build/${glibc_path}
	CC=${PREFIX}/bin/${CROSS_COMPILE}gcc \
	AR=${PREFIX}/bin/${CROSS_COMPILE}ar \
	RANLIB=${PREFIX}/bin/${CROSS_COMPILE}ranlib \
	../../${glibc_path}/configure \
		--host=${TARGET} \
		--build=$(../../${glibc_path}/scripts/config.guess) \
		--prefix=/usr \
		--includedir=/usr/include \
		--with-headers=${PREFIX}/${TARGET}/usr/include \
		--with-binutils=${PREFIX}/${TARGET}/bin \
		--disable-profile \
		--enable-add-ons \
		libc_cv_forced_unwind=yes \
		libc_cv_c_cleanup=yes
	make $PARALLEL && make install_root=${PREFIX}/${TARGET} prefix="" install
	sed -i 's/\/lib\///g' ${PREFIX}/${TARGET}/lib/libc.so
	sed -i 's/\/lib\///g' ${PREFIX}/${TARGET}/lib/libpthread.so
fi

# compile gcc-stage2
cd ${SRC}
if [ ! -e ${gcc_file} ]; then
	echo "Not found file: ${gcc_file}"
	exit
fi
if [ ! -d ${gcc_path} ]; then
	tar xjf ${gcc_file}
fi
if [ ! -d build/${gcc_path}-stage2 ]; then
	mkdir -p build/${gcc_path}-stage2
	cd build/${gcc_path}-stage2
	../../${gcc_path}/configure ${TARGET_GCC} \
		--host=$(../../${gcc_path}/config.guess) \
		--build=$(../../${gcc_path}/config.guess) \
		--target=${TARGET} \
		--prefix=${PREFIX} \
		--with-headers=${PREFIX}/${TARGET}/usr/include \
		--enable-languages=c,c++ \
		--disable-nls \
		--enable-shared \
		--disable-multilib \
		--disable-libgomp \
		--enable-threads=posix
	make $PARALLEL && make install
fi

# clean & strip
if [ ! -d build/clean-strip ]; then
	mkdir -p build/clean-strip
	rm -fr ${PREFIX}/${TARGET}/usr
	find ${PREFIX}/${TARGET}/lib | xargs ${PREFIX}/bin/${CROSS_COMPILE}strip  --strip-debug
fi

My God! ARM-LINUX-GCC 成功了!

#!/bin/sh

# path macro
SRC=${0%%/*}
if [ "${SRC}" == "." ]; then
	SRC=${PWD}
fi
PARALLEL="-j 2"

# target macro
unset AR AS CC CFLAGS CXX CXXFLAGS LD RANLIB STRIP
export ARCH=arm
export TARGET=${ARCH}-linux
export PREFIX=/opt/vxwo/${ARCH}
export LANGUAGE=C
export LC_ALL=C

# path & file
linux_path=linux-2.6.33.5
linux_file=${linux_path}.tar.bz2
binutils_path=binutils-2.20.1
binutils_file=${binutils_path}.tar.bz2
gcc_path=gcc-4.5.0
gcc_file=${gcc_path}.tar.bz2
glibc_path=glibc-2.11.2
glibc_file=${glibc_path}.tar.bz2
glibc_ports_path=glibc-ports-2.11
glibc_ports_file=${glibc_ports_path}.tar.bz2

# linux headers
cd ${SRC}
if [ ! -e ${linux_file} ]; then
	echo "Not found file: ${linux_file}"
	exit
fi
if [ ! -d ${linux_path} ]; then
	tar xjf ${linux_file}
fi
if [ ! -d build/${linux_path}-headers ]; then
	mkdir -p build/${linux_path}-headers
	cd ${linux_path}
	make ARCH=${ARCH} INSTALL_HDR_PATH=${PREFIX}/${TARGET}/usr headers_install
	find ${PREFIX}/${TARGET}/usr/include -name .install -or -name ..install.cmd | xargs rm -fv
fi

# compile binutils
cd ${SRC}
if [ ! -e ${binutils_file} ]; then
	echo "Not found file: ${binutils_file}"
	exit
fi
if [ ! -d ${binutils_path} ]; then
	tar xjf ${binutils_file}
fi
if [ ! -d build/${binutils_path} ]; then
	mkdir -p build/${binutils_path}
	cd build/${binutils_path}
	../../${binutils_path}/configure \
		--prefix=${PREFIX} \
		--target=${TARGET} \
		--disable-nls \
		--disable-multilib
	make $PARALLEL && make install
fi

# compile gcc-stage1
cd ${SRC}
if [ ! -e ${gcc_file} ]; then
	echo "Not found file: ${gcc_file}"
	exit
fi
if [ ! -d ${gcc_path} ]; then
	tar xjf ${gcc_file}
fi
if [ ! -d build/${gcc_path}-stage1 ]; then
	mkdir -p build/${gcc_path}-stage1
	cd build/${gcc_path}-stage1
	../../${gcc_path}/configure \
		--target=${TARGET} \
		--prefix=${PREFIX} \
		--disable-nls \
		--disable-shared \
		--disable-mutilib \
		--disable-decimal-float \
		--disable-threads \
		--disable-libmudflap \
		--disable-libssp \
		--disable-libgomp \
		--without-headers \
		--enable-language=c \
		--with-newlib
	make $PARALLEL all-gcc all-target-libgcc && make install-gcc install-target-libgcc
fi

# compile glibc
cd ${SRC}
if [ ! -e ${glibc_file} ]; then
	echo "Not found file: ${glibc_file}"
	exit
fi
if [ ! -d ${glibc_path} ]; then
	tar xjf ${glibc_file}
	cd ${glibc_path}
	sed -i 's/gnulib := -lgcc \$(libgcc_eh)/gnulib := -lgcc/' Makeconfig
	sed -i 's/static-gnulib := -lgcc -lgcc_eh \$(libunwind)/static-gnulib := -lgcc/' Makeconfig
	cd ..
fi
if [ ! -e ${glibc_ports_file} ]; then
	echo "Not found file: ${glibc_ports_file}"
	exit
fi
if [ ! -d ${glibc_path}/ports ]; then
	cd ${glibc_path}
	tar xjf ../${glibc_ports_file}
	mv ${glibc_ports_path} ports
	cd ..
fi
if [ ! -d build/${glibc_path} ]; then
	mkdir -p build/${glibc_path}
	cd build/${glibc_path}
	CC=${PREFIX}/bin/${TARGET}-gcc \
	../../${glibc_path}/configure \
		--host=${TARGET} \
		--build=$(../../${glibc_path}/scripts/config.guess) \
		--prefix=/usr/ \
		--includedir=/usr/include \
		--with-headers=${PREFIX}/${TARGET}/usr/include \
		--with-binutils=${PREFIX}/${TARGET}/bin \
		--disable-profile \
		--enable-add-ons \
		libc_cv_forced_unwind=yes \
		libc_cv_c_cleanup=yes
	make $PARALLEL && make install_root=${PREFIX}/${TARGET} prefix="" install
	sed -i 's/\/lib\///g' ${PREFIX}/${TARGET}/lib/libc.so
	sed -i 's/\/lib\///g' ${PREFIX}/${TARGET}/lib/libpthread.so
fi

# compile gcc-stage2
cd ${SRC}
if [ ! -e ${gcc_file} ]; then
	echo "Not found file: ${gcc_file}"
	exit
fi
if [ ! -d ${gcc_path} ]; then
	tar xjf ${gcc_file}
fi
if [ ! -d build/${gcc_path}-stage2 ]; then
	mkdir -p build/${gcc_path}-stage2
	cd build/${gcc_path}-stage2
	../../${gcc_path}/configure \
		--host=$(../../${gcc_path}/config.guess) \
		--build=$(../../${gcc_path}/config.guess) \
		--target=${TARGET} \
		--prefix=${PREFIX} \
		--with-headers=${PREFIX}/${TARGET}/usr/include \
		--enable-languages=c,c++ \
		--disable-nls \
		--disable-multilib \
		--disable-libgomp
	make $PARALLEL && make install
fi

咳,编译ARM-LINUX-GCC难

1. 版本依赖比较严重,而且每个版本都需要打补丁,否则不能完成编译

2. 编译时间太长,修正一个错误或者尝试一个编译选项需要较长的编译时间

3. 网上资料很多,但是基本没什么用,原因在于每个人的开发环境不尽相同、所用版本不同。

4. 利用周末两天的时间都没有编译成功一套工具链,最终决定暂停。

始终保持健康的职业观

先看一下旧闻:2003年,成龙以“孩子大了要自己去找饭碗”为由辞退了在身边十几年的段伟伦。这里面所包含的信息足以来支撑本文的标题。老板辞退员工,那是“天经地义”的,也并不需要什么特殊的理由。但是以“孩子大了要自己去找饭碗”这样的语言来作为辞退理由,说明老板之前已经故意的误导了员工的“职业观”。

什么是“职业”?就是挣钱养家的方式。什么是“老板”?就是在职业里实现自身利益最大化的人。什么是“员工”?就是在职业里自身利益最小化的人。资源是固定的,老板想要自身利益最大化,就需要员工的利益最小化。“铁打的营盘,流水的兵”,老板是营盘,员工是“流水的兵”。在一个公司里,不要相信老板的“许诺”,要追求“现世现报”。老板的许诺?只有一个原因:公司“现在”需要你;注意是“现在”,而不是“将来”,等到“现在”变成“过去”了,老板是绝对不会兑现曾经的许诺的。

对于老板来说,公司的发展最重要。公司的发展体现在员工上,需要两个方面:1、靠自身建设稳定的团队,2、靠不断补充“适合”的人进入团队以“代替”过时的人。总会有“过时”的人的。

对于员工来说,个人的发展与利益最重要。个人的发展主要是指“职位的提升”,利益主要是“薪金”,统一起来就是“薪金”。员工个体只是为了自身而工作,而公司只是将工作变成成“薪金”的“转换器”。为了将工作转换成更多的“薪金”,在公司内努力的工作将是一个“必要”条件。如果一个公司内“薪金”的诉求被一些“许诺”所压制,那只是老板的“缓兵之计”而已。

“职业观”正确与否的评定,唯一的标准:自身利益的多少。少了,就是“错误的职业观”;多了就是“优秀的职业观”;正好也算“健康的价值观”。职业观的评定需要自身的积极主动、需要自身的不屑努力,完全取决于自己而并不取决于公司。

人类的末日源于强制控制

昨天晚上做了一个梦,奇怪、可怕、可怜、不可思议。

场景是这样的:中日的战争进行中,类似于4几年的状态。我不知什么原因DIY方式清除了身上的一个机器部件,就能够在两国之间的一个小河中通过,而其他人不能;因为我清除的部件就是放在心脏旁边的,如果出了限制圈就爆炸的电子控制器。关键的是,中国人和日本人身上都有;谁没有呢?不知道。

如果如果世界最重变得那样,给人们安装那个的是谁?人类变成了什么?统治者是谁?人类?外形人?但无论怎样,那已是人类的末日了。