第一篇:关于在美拓的简短的总结与体会
关于在美拓的简短的总结与体会
概要:
这仅仅是个人的一点心得体会与总结,本登不得大雅之堂,然而我作为一个对于手机开发完全的零起点对于其中的艰难与痛苦有着切肤的体会,这一切促使我不敢身藏浅陋将一些零星琐碎公之于众,即作为自己在美拓的简短人生经历的一个总结,如果能给后来者提供一点点地借鉴也心满意足了。
1. 关于编译环境的认识体会
首先面对程序员的就是相对复杂的编译环境及其繁琐的配置工作。高通平台分为仿真和实际的arm编译两个截然不同的编译环境,其中有些相同有些不兼容。
a)仿真编译
仿真完全使用vc6的编译机制,高通的例子是把一个个小applet编译成为dll动态库,我们的工程应该是把brew的模拟器作为静态库链接到meta的工程里面,模拟器的配置在win32/bin/brew_emu.dat中,在其中可以指定外观即devicepack配置文件,以及applet运行的文件系统路径,及其相应的mif文件所在路径。PhoneFile=H:CDMAL200Win32DevicePack1L200DevicePack1.dpk
AppletDir=H:CDMAL600-newResourceFileSystem
MIFDir=H:CDMAL600-newResourceFileSystem
Vc6能够自动解析源文件的相应的依赖关系省却了程序员写makefile的痛苦,但是如何创建vc6的工程文件是一个很繁琐的工作。
美拓的代码统统使用cfg文件管理机制可以很方便地依靠gendsp.cmd工具加入工程组,也就是说每个源代码模块都定义了一个.cfg文件,里面列明了模块的头文件.h,源文件.c/.cpp,以及链接库.lib/.a。
[IncludeFiles]
$(METAMMI)/apps/Java/jblendia_jvm/include/settings/Meta_Java_Settings.h
[SourceFiles]
$(METAMMI)/apps/Java/jblendia_jvm/port/amsui/Meta_AmsUI.c
[LinkFiles]
!ifeq($(META_TARGET),Arm)
$(METAMMI)/3Parts/JBlend/library/ajsc/ajsc_arm_ads.a
!else
$(METAMMI)/3Parts/JBlend/library/ajsc/ajsc_win32_msvc.lib
以上就是.cfg文件的格式,于是,运行win32/build目录下的gendsp.cmd就会运行一个perl的脚本gencfgmin.pl来读取metammi.cfg文件,这个文件列表了所有工程要包含的meta的模块cfg文件,然后通过这些cfg文件列明的.h,.c,.lib文件就被加入了工程,也就是加入了simulator.dsp的vc6的工程文件。
但是代码里面的include头文件是一个很麻烦的事情,首先,有些工程人员喜欢把其中的头文件名前面加上相对的路径,但是这个对于编译确实很麻烦的事情,因为编译器寻找这些路径是从一个运行的相对路径开始,然后按照编译设定的搜索路径和系统环境变量比如/include项下的路径搜索,一旦工程文件位置变动就有可能搜索不到,同时过多的设定搜索路径会减慢编译速度,因为编译器会不停在各个路径下搜索,而在系统环境变量中设置弊端更多因为有可能把不同项目的同名头文件包含进来,这才是程序员的噩梦。因此
美拓的做法是include统统使用双引号并且不带路径,并在遍历.cfg的时候把这些相应的头文件都拷贝到win32/build/include目录下,所以,你在vc6的工程里面看到的头文件在编译器看来却是在使用另外一个在build/include目录下的同名头文件,你要改动必须修改工程原路径下的重新编译才能更新拷贝,否则修改build/include下的拷贝都被覆盖掉了。
cfg机制对于非高通的meta的代码很方便,但是高通是采用一个min文件的方式来建立makefile的,添加到vc6工程就没有那么方便了,幸好不是很经常修改高通代码,因此,我们可以在simulator.dsp的源头template.dsp里面修改,就是把需要应用的高通的.c文件加到template.dsp文件里面,运行gendsp.cmd就更新了simlator.dsp。但是头文件是不能拷贝进来的,只能使用vc6的头文件搜索路径添加:ADD BASE CPP /nologo /MD /W3 /GX /O2 /I “....binstore”
这里的/I就是搜索头文件的路径,头文件的名字自然是在代码里面的了。
链接的链接库也是类似的使用# ADD LINK32 libjpeg_win32_msvc.lib /LIBPATH:“....SourceMeta3PartsJBlendlibrarylibjpeglib”
其中的/LIBPATH就是指示编译器搜索库的路径。
因此,如果要添加一个新的代码文件模块或者链接库,使用高通的方式很麻繁,不如使用meta的办法在cfg里面定义,同时这个方式是仿真和arm通用的,不需要再手动修改template.dsp。(即便是高通的代码我们也可以使用cfg方式,只不过高通自己有一套编译顺序我们不应该干扰他。)
我们要添加定义的宏怎么办呢?原本meta的设计是在一系列的custXX.h文件里面作,这个cust头文件在source/qualcomm/build/ms目录下主要是定义了一系列的所谓feature的开关,其中的XX原本被设计成项目代号,这样就可以在不同项目打开不同的所谓feature开关编译,但是我对这个方法是有保留意见的,因为他的宏定义有一个小问题,他的所谓FEATURE_OFF/FEATURE_ON被定义为了0/1,在代码中的宏判断是#if(FEATURE_STATUSBAR_ONLYIDLE == FEATURE_OFF)可是使用宏最危险的就是它有可能因为编译顺序或遗漏include还没有定义,如果FEATURE_OFF还没有定义,默认也是0,所以这个宏就可能被误读。还有一个仿真添加宏定义比如至关重要的META_EDIT宏的定义,这个也可以放在template.dsp里面# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D “FEATURE_BREW_DOWNLOAD” 其中的/D就是宏定义的开关。
搜索template.dsp有如下
# Begin Custom Build-Checking all include files...InputPath=.resSimulator.ico
“copy.log” : $(SOURCE)“$(INTDIR)” “$(OUTDIR)”
call....SourceQualcommbuildmsads12.batmake-f gendsp.mak copyincfile
# End Custom Build
这里就是以上提及的copy include代码到我们的build/include目录的地方,这是利用了vc6的custom-build的机制,在编译前调用perl脚本。
这里要顺便提一下ads12.bat的重要性,因为高通的编译机制大量地使用perl脚本因此如何初始化perl的运行环境至关重要,因此在所有调用perl脚本前都要先调用这个批命令。同时perl运行于linux/unix环境依靠cygwin才得以运行于windows环境,所以也需要初始化cygwin的环境变量,然而linux/window毕竟有很大区别,比如文件系统就还是有区别,如果你在运行arm编译看到类似于什么as.exe不能正确执行的错误即便你的ads12.bat已经正确运行了很有可能是因为你没有把as.exe的文件属性加上system,比如attrib +s as.exe
b)arm编译
arm编译和仿真编译有着巨大的差别,要复杂的多。首先要从编译资源做起。资源包括图片,文字存放在resource/meta下的image,string,theme目录下,给每个资源编写资源id是一件很繁琐的事情,这里也是依靠了工具运行ImageResConv.bat把image下的所有图片都编篡相应的资源id,比如一个图片文件input_123.png最后就在MetaImg.brh里面变成了
#define IDI_PNG_INPUT_123 8145
命名的原则就是IDI_TYPE_FILENAME,其中type应该是文件类型即扩展名,8145是程序顺序产生无关紧要。这样程序员在代码中按照这个命名原则就省却了更新命名资源id的烦恼了。这个metaImg.brh最终被放在source/meta/res/project目录下,其中project未当前的项目代号,这个必须要在build_res.bat里面设定了比如 @set PROJECT=0803_L201。最终这个metaimg.brh成为metammi.cfg的一栏。文字和图片稍有不同,就是把中文字串资源“T_Yes是”和英文资源“T_YesYes”进行统一编号为metaStr.brh里的“#define T_Yes 3”而相应的实际资源文件则是#define CHINESE_RES_FILE “Chinese.bar”变成了高通的资源文件。
这一切的编译工作都是在一个resource/meta/Build_Res.bat下完成的。
需要提醒注意的是,image路径下任何文件都回被搜罗当作资源图片文件,因此如果使用svn需要删除svn文件或者把图片拷贝出来编译。
编译完资源后就可以开始编译了,但是首先要做的还是设置好ads12.bat,这个的重要性前面已经讲过了,每个人都有可能不同要根据自己的安装路径来设置。运行arm/prj_code.bat其中prj_code代表当前的项目代号,因此相应的在/source/qualcomm/build/ms目录下你要有相同项目代号的prj_code.cmd, prj_code.mak,cust_prj_code.h,同时在/source/meta/res/prj_code/下要有相应的资源文件以便链接。正是编译同样使用meta的收集cfg的方式生成实际的makefile,高通的编译器是支持c++编译的,比如tcpp.exe就是c++编译器,在dmss_rules.min里面有perl脚本根据代码文件扩展名自动选择编译器的规则,因此你也完全可以写c++代码只要你使用.cpp文件扩展名。
高通使用min文件来定义每个小模块包含的源文件,其中还包含了.s文件,这个是一个对大多数pc程序员的巨大的surprise,这里要从程序运行谈起。因为pc的程序的运行地址一般都是relocable的,也就是说运行起在哪里是不需要关心的,是由操作系统的loader加载同时修改代码的偏移地址完成在任意物理地址运行的,但是手机程序的静态加载模块地址却是定死的,当然各个模块的地址可以依靠.scl的文件来调整,这个是linker的一个配置文件,它规定了各个模块的boot内存地址的相对关系,比如以/source/qualcomm/build/ms/q60x0a_rom.scl为例,BB_RAM +0x0
{
dloadarm.o(+RW)
dloadusb.o(+RW)
}
/////////////////////////////////////////////
// added by nick for jvm
//Add liaohs.amoi.com.cn for JAVA
JBLEND_RAM +0x0
{
jblend_*.o(+RW)
}
//End liaohs for JAVA
// added by nick for jvm
/////////////////////////////////////////////
这里实际上规定了dloadarm.o和dloadusb.o的模块的相对位置,同时也隐含着输出了一个地址symbol BB_RAM,同样的java虚拟机的起始地址JBLEND_RAM会在回编码里编成两个symbol: Image$$JBLEND_RAM$$Base和Image$$JBLEND_RAM$$Length,注意这里使用的$$符号是arm编译器内部使用的,和普通的c程序变量名不兼容,为了能够让c程序在链接时候引用这两个地址相关的变量名,需要一个所谓的.s文件来转换。在source/qualcomm/driver/boot目录下的bootmem.c里面可以使用extern来声明
extern byte *Image__ JBLEND_RAM __Base;
extern byte *Image__ JBLEND_RAM __Length;
在boot_data.s文件里面把这些变量名从汇编码的”$“形式转换为”_”:
IMPORT |Image$$JBLEND_RAM$$Base|
IMPORT |Image$$JBLEND_RAM$$Length|
EXPORT Load__JBLEND_RAM__Base
EXPORT Image__JBLEND_RAM__Length
他们的定义是这样子的:
Image__JBLEND_RAM__Base
Image__JBLEND_RAM__Length
而这个所谓的.s文件是在相应的boot.min文件里包含了。这种机制的核心就是为了能够让java虚拟机在起始运行阶段记录相应的内存地址,而这一切都是由于静态加载的地址在编译器就决定了。
b)关于组键编程
高通的组键模型编程基本上和微软的COM机制类似,只不过搞通为了方便嵌入式程序员大多不熟悉c++语法以及某些效率的考虑才使用纯c语法模拟实现,但是微软的COM机制博大精深,高通仅仅借用了其中内存资源释放管理与组建创建的很小一部分。
任何一个组键一定要实现最基本的三个接口方法,即AddRef,Release,QueryInterface,这三个方法看似简单,但是meta的代码的写法似乎都有不妥之处。
第一,这三个方法都应该是完全对外调用的不应该随随便便当作内部方法来使用,比如有的人在组件的constructor,也就是所谓component_new方法里面不设定nRef计数为1,却调用QueryInterface来
增加引用计数,虽然效果看上去一样,实际却是有令人混淆的嫌疑,我以为在constructor里面直
接设定引用计数为1是最自然的,因为逻辑上一个组件的创建者也就是它的拥有者当然应该增加
计数为1。
第二,queryInterface另一个被滥用的例子是meta的程序组件不论classid为何都一律最后返回SUCCESS,这个从原理上肯定是不对的,原本一个组件有可能支持多个接口方法,取决于传进来的classid是
有可能不支持而返回失败的。这些都为将来的可能的扩展埋下了隐患。
DCD |Image$$JBLEND_RAM$$Length|DCD |Image$$JBLEND_RAM$$Base|
高通的组件机制提供的内存资源管理还是一种非强制的模式,也就时说这个机制需要程序员自觉遵守,一旦有人违反了这个规则那么资源就不能被自动回收,比如,你在调用了queryinterface或者通过createinstance获得了这个接口指针,但是忘记调用release,或者别的模块传递给你一个参数你调用了addref却没有在结束调用release,那么这个资源就再也不会被释放。
有鉴于此,高通还有一套类似于java的垃圾回收机制强制资源的回收,这个应该是在IModule里面的一个实现,也就是说在一个module创建的时候就建立了某种上下文(AEEAppContext,按照高通的代码说明就是所谓的一个不透明的32位长整数,我们可以想象很可能就是module的起始地址,当然这个纯属猜测无关紧要。)于是在这个所谓上下文中所有调用内存分配函数malloc都会在内存的起始处被加上这么一个上下文标志,于是在这个module结束的时候,brew会强制把所有在heap里有这个标志的内存回收,这个就是所谓的垃圾回收机制。这个本来是好事可以让程序员不用操心资源回收有缺漏,比如象上边提到的组建的引用计数错误,忘记release的情况,但是对于一些跨模块使用的资源却有可能是一个灾难。
案例1:一个组件作为参数从模块A传递到了模块B,模块B的程序也正确的addref表明他还要继续使用这个对象。但是当模块A结束的时候,在组建的destructor里面的release方法检查到了引用计数不为0也正确的不做释放内存的调用,看上去挺好,但是brew的垃圾回收机制却是无条件执行的,他不管三七二十一会把所有模块A上下文的内存统统释放。于是模块B虽然进行了正确的addref以为组件还存在继续调用结果访问的却是错误的内容,因为很有可能brew把回收的内存已经分配给了新生成的组件或者模块。针对这个情形要求程序员对于可能跨模块使用的对象的内存分配使用所谓的系统上下文,也就是调用AEEEnterAppContext的时候使用NULL参数,然后再分配内存,随后在AeeLeaveAppContext,这个方法要保证的一个前提是该组件在所有的内存分配时候都要采用这种系统上下文。一旦在初始化之外也有分配内存的做法或者使用别的函数分配的内存也还有可能有问题。比如笔者在使用sqlite的组件中的一个所谓DBManager接口时就遇到这个问题,当时考虑把这个manager接口做成singleton以便节省资源,这就要求这个对象独立于创建的模块始终存在于系统中,于是在他的初始化在系统上下文内进行,但是没有想到随后每次当创建的模块关闭后再打开新的模块调用这个manager接口都会发生访问错误,后来分析高通很有可能为了加快初始化manager的进度不把所有的内存分配一次性地在初始化做完,而是在实际产生新的database实例的时候分配了一些内存,而这个时候没有在系统上下文处理,属于当前的模块上下文,于是当前模块解体其中的内存自然变成非法了。
案例2:一个组件注册了一个timer的回调事件,但随后就再回调发生之前结束运行被释放了。
Timer的event注册要两个参数都匹配才行,也就是说一个是回调函数指针还有一个是用户自定义的数据指针,所以你要canceltimerevent的时候必须把两个参数都传递正确才行,笔者对于这一点已开始比较吃惊,因为这个和PC上的一些习惯不一致。后来注意到了高通的说明就是你可以把回调函数指针传递null,这个CancelTimerEvent就把所有绑定这个数据结构的event都取消了,所以,鉴于此,我觉得不如自行规定所有的setTimerEvent都把当前的组件指针作为用户数据传递,因为所有的数据都是定义在实现结构里面的,那么在组建的destructor里面无条件调用AEECancelTimerEvent(NULL,pThis)确保取消一切的事件。
案例3:笔者在撰写sqlite的组件时候,需求要求用户可以注册一个eventNotifier以便通知数据库数据的变化,这个要求关心者注册一个回调函数以便在数据表数据变化的时候回调来处理。因为数据库组件很有可能是跨模块使用,比如媒体播放其播放的mp3列表在被资源浏览器删除了文件之后得到通知以便修订播放列表。但是在这个回调函数里面笔者已开始并没有意识到也需要切换到不同的模块上下文,这因为当初设计回调通知机制的时候要求注册信息包括三个要素:感兴趣者的模块上下文,感兴趣的数据表,以及使用的数据库接口指针。那么在数据库组件注意到数据变化调用通知的回调函数的时候是在谁的上下文呢?这里我们没有使用异步通知,而是所谓的同步通知就是说数据已修改立刻通知,因此现在的代码是在数据修
改者的模块上下文,他的通知函数里面的参数调用的数据却很有可能是被通知者的上下文产生的,一旦回调函数有分配内存的动作并且保存到了被通知模块内,就意味着通知者上下文下的内存被保存在了通知者的模块中,将来程序crash也就不足为奇了。
组件的创建以来与所谓的createInstance机制,在windows,这个是紧密以来与GUID和windows的注册表来共同实现的,GUID保证了组建的唯一性,注册表则记录了组件的相关信息帮助系统实例化组件。高通的机制与此类似,使用了一个所谓的以组件模型开发的一个重要原因是仰仗于c++在代码实现上的继承性,而纯c语法仅仅能够模仿c++的某些语法却不能够完全替代。而高通在这个方面也做得不是很严格,但最起码还是有遵守基本的原则,不过amoi的程序员却不是很有意识这样做,以UTKForm与由此继承而来的UTKListForm为例,后者从前者继承而来,大部分的方法都是一样的,可是后者不仅仅是把这些臃瘀的代码拷贝了一遍,而且增加了今后扩展的难度。比如,笔者在设计一个对于所有form都通用的特效方法时候需要找到一个所有form的共性,即在其处于topvisible的时候进行某种特效处理,假如所有的form对于通用的方法比如show,没有特别的实现都调用自己继承而来的实现(比如都应该调用IForm的show方法,因为并没有什么特别的做法,都不过时拷贝了高通的实现),那么可以很容易的在IForm一级做一个处理,可是由于很多从UtkForm“继承”而来的各式各样的form有都把相同的方法的相同的实现都拷贝了一遍,变成我需要把我的修改再一级级的修改。
第二篇:161教师体会-美与残酷
美与残酷
去年我过生日的那天,正忙着报一份材料,忙得晕头晕脑的,在办公室的那面书架有些蒙尘的档案袋里翻找有效的证件,抬头的瞬间就看到了抱着一束百合花在校园甬路走得摇曳多姿的漂亮女子。她的头发在早春的风里飘呀飘,修长的双腿每一步都是节奏韵律弹性,甚至是阳光。
我一眼就认出了她:“关荔荔!”“荔荔,2005年毕业的关荔荔。”
她那自信得甚至有几分任性的那份独特的气质感染了那一路的绿,一树的花。
她满面春风地闯进了我的办公室,就好像我们昨天刚刚分别,就好像我们从未分离。
“生日快乐!”她和她的花一起问候了我。
“把这丝巾戴上,我挑选了好久才令我满意,你必须喜欢。”荔荔的笑眼就像星星。我以为只有这个比喻是恰当的,星星般地明亮高远纯净甚至有点浩渺。
“你怎么知道我今天过生日?”
“我想知道就知道呗!”
“还是那个样子,不见老,挺好!”她打量着我,并给予温和的鼓励。
“荔荔,两年前我做了一个手术。荔荔,我好像不太健康,算是残疾人吗?”我充满期待又好像在等待她的安慰。
“太不算什么了.美丽就是残酷的。这你都不知道啊?对啦,老师,我去年刚刚又生了一个宝宝,是个男孩,又是剖腹产。”你看我还好吧!”
“当然啦!当然啦!”看着苗条而又充满青春气息的荔荔.我说,“你完全可充美少女并蒙混过关。”
“我女儿都四岁了。”荔荔不无得意,“其实有点儿小伤小病的真的没有什么?反倒会让我们更美丽。”
“怎么会?”我在心里想。
荔荔说:“其实你肯定猜不到,我也刚刚做了一个手术,甲状腺肿瘤,恶性的。”
“什么?!”我以为我是听错了。她小小的年纪,她一脸的青春与阳光。“别怕,别怕,不是说天妒红颜吗?像你我这么漂亮的人,患点儿小病挨上一刀,真的不算什么,只能让我们更美丽,不是相由心生吗?我们的气质里会多一份勇敢和淡定。”
“来,让我再仔细地看看我,这不是吗?你的手术部分地起到了外科美容手术的作用。看,抬头纹淡了,川字纹没有了,年轻了嘛!你再看看我。”说着,她优雅地转了一个圈。是呵,她的美丽中是多了一份说不出的迷人的风韵,那是她这个年龄的人所没有的。
我曾经以为自己很达观,我也被亲友赞叹为坚强勇敢,却不及眼前这个只有二十几岁的荔荔,她让我再一次审视我的病痛甚至生命。
“你还记得我们上中学的时候,你给我们讲的澳大利亚女作家考林
麦卡洛的小说《荆棘鸟》吗?我们都记得那个开头的寓言故事:
有一个传说,说的是有那么一只鸟儿,它一生只唱一次,那歌声比世上所有一切生灵的歌声都更加优美动听,从离开巢窝的那一刻起,它就在寻找着荆棘,直到如愿以偿,才歇息下来,然后,它把自己的身体扎进最长最尖的荆棘上,便在荒蛮的枝条之间放开了喉咙,在奄奄一息的时刻,它超脱了自身的痛苦,而那歌声竟然使云雀和夜莺都黯然失色„„上帝也在苍穹中微笑,因为最美好的东西只能用最深痛的巨创来换取。”
年轻的时候读《荆棘鸟》一定都为这美丽而残酷的寓言而打动,所惊艳,所震撼。
是呵,那句多么富有哲理的话却被我遗忘,遗忘在岁月里,遗忘在匆匆的步履和红尘的琐事中,所有的经典都是用生命写就的:
“最美好的东西只能用最深痛的巨创来换取。”
那天很戏剧很传奇,一个年轻人,一个我曾经的学生结结实实地给我上了一课。改变了我对病痛甚至活着的态度。
去年冬天去台湾,听导游讲宋美龄。竟意外地得知,这个美丽智慧优雅的第一夫人晚年竟得了令人痛苦难言的免疫系统疾病,严重的荨麻疹纠缠了她后半生。
总以为宋氏姐妹宛如仙女,集聪慧美貌财富权力长寿于一身,抗战时期蒋夫人在美国的极具煽动性的演讲震动了世界。宋美龄活了整整106岁,直到生命的最后一刻,仍画精致的妆容,梳理及腰的长发。
宋美龄寿高106岁,横跨三个世纪,在中国近代女性中极为少见,历经三个世纪并且永远保持优雅。
而据过去曾经陪同宋美龄到白宫做客的孔令侃透露:“宋美龄到白宫做客,随身还带着丝绸床单,因为宋美龄患有荨麻疹与带状疱疹,会对棉织品过敏。”孔令侃还曾经以“痒起来的时候,一百只手抓都来不及。”
这种痛苦真的是难以想象,更令人难以想象的是宋美龄居然有这样的病史病历:
1905年在上海汉口路马克谛耶女子教会小学读书的时候得过一场很重的肺病甚至因体弱而辍学。
抗战时期在重庆就患上了严重的荨麻疹。
1974年宋美龄在美国被诊断出患有乳腺癌,次年做了乳房切割手术,在躺在病榻上的蒋介石问宋美龄为什么不像往常一样每天探望他两次,他被告知,她去美国进行了一次简短的旅行。
不可想象的是如此优雅的女人做过两次乳腺癌切除手术。
在台北的士林官邸,我们看宋美龄的花园西式的,宁静的,宗教情结浓郁的,据说她吸烟,熬夜,喝浓咖啡,还有重大的众多的社交与应酬。
有着106岁高寿的宋美龄并非健康顺遂。
同样是在她80多岁时,阳明山的一场车祸,外科和骨科医生为她在受伤的头骨上加了钢钉和钢片,并且膝关节留下严重的疾病,终身疼痛难忍。
宋美龄跨越三个世纪的美丽的后面有着这样常人难以忍受的残酷。
而也许对于宋美龄来说最大的残酷是蒋介石去世后,与蒋经国的不睦使得她无法在台湾立足,孤身在美国地生活了十一年。
十一年,宋庆龄始终保持着她惯有的精神状态,乐观安静。
也许生命只有遇见险滩暗礁的时候才会绽放出迷人的美丽,也许生命只有跨越过险滩暗礁才会变得如此强大和美丽。
民国时期的宋史三姐妹,以她们的美丽智慧学养绚烂成神话和传说。而苦难病痛孤独„„人生诸多残酷又使得宋美龄的生命独特而芬芳。
看过冰凌花,开在冰雪中,以为它是硕大而强势的,而冰凌花却是以一抹娇艳的黄,含羞的笑,征服了冰雪,瞬间映照了万丈冰天。
美丽与残酷交映。
生老病死是人生无奈的缘与结。无忧无惧无喜地面对,要知道,这是我们的必答题。而保持生命的美丽是我们今生的责任。
第三篇:拓客总结与心得
拓客总结与心得
一、项目如何设定合理的拓客目标?
拓客目标的设立:
1、项目开始阶段的营销目标,倒推认筹目标、蓄客目标等,根据蓄客目标设定拓客计划,摸底建立作战地图,建立项目营销团队的组织架构及PK激励计划,打有准备之仗;一般在设立总目标后,分配给各个团队,各个团队再分配到个人,进而细化到前期蓄客期、强拓期等阶段。
2、制定目标及分解目标的过程会验证合理性;同时每周每日进行盘点时调整指标。
二、拓客区域一般怎么划分?
每个项目一般都会有营销策略及拓客策略,整盘的项目属性及客户定位决定了我们的客户在哪里,项目组制定策略及样板验证后安排各个小组按战区进行作战指导。甚至针对核心战区的商超等人流旺的场所,可以要求各分队进行拍卖,按指标最高者拍得主要客户点,更高的完成拓客目标。指标与费用挂钩,优势资源倾斜化,争取做到整体平衡。
因此,有组织、有计划、有指标、有PK竞争淘汰的拓客,才是有序的。
三、目前看来什么样的拓客方式最有效果?
碧桂园习惯于线下拓客,有八大拓客方式:派单、电营、展点、竞品截流、大客户拜访、圈层营销、组织看房团、编外经纪人(一二手联动)。
如何平衡一二手联动?建议一碗水端平,效果付费,当然2个月以后的评判,效果更好的可以资源倾斜。
四、拓客收网是什么形式,散客随到随收,还是集中在一起通过活动优惠杀定? 8大拓客方式是拓客的形式,通常组织收客我要求按节点进行。三部曲:白天拓客,晚上收客;工作日拓客,周末集中收客;最后按集中的大节点组织大活动进行大规模收客。拓客、收客的关键词:礼品+活动。
第一步,白天带项目各种礼品出动拜访,晚上集中约访客户及回访客户,确定拓客指标下的有效客户有多少;
第二步,周末组织暖场活动(客户需要的活动),约访本周客户参加,二次盘点有多少有效客户;
第三步,大型节日,项目重大节点等组织大型活动进行办卡认筹等锁定客户。总之,通过不断的互动加深客户粘度并不断洗客,组织合理货源并做到开盘必胜。
五、在互联网思维下,线上如何配合线下拓客?
互动。同一个项目营销策略,同一份节点计划,线上线下一定是组合拳。比如项目实景展示区开放,组织一个游园活动,同时线下还邀请了当地的婚纱摄影店、法拉利车展(都是免费赞助),这时可以在线上推广上进行客户互动。
六、拓客费用是单独列支还是算营销费用,比例有限制吗?
所有营销发生的费用都算营销费用,然后再分为推广费用、销售管理费用(包括拓客费用)、营销设施费用等。每个大项根据项目情况营销总进行分配。
七、拓客需要高激励,高淘汰,这个前提条件是有充足的后备人员,对于项目不多,人才储备不足的小公司来说,又如何去做?
对于小型公司两种办法:
1、组件外拓小蜜蜂团队,为了专业,可以固定一些大学生兼职,长期培训,按效果付费,每天来访指标下100元,有效来访一组奖励多少,成交奖励多少。
2、适度超配人员,每月固定淘汰比如10-20%,同时不停招人,保持良性循环,效果付佣。成交才会付佣金,整盘计算好固定的佣金比例,适当从营销费用中出,何乐不为。对于拓客人员有没有保底?如果是学生,已经有每天的80-100元,够生活了,记住别让他们太饱。如果是自己的团队,我们的习惯是外拓设立指标,当天外拓人员完成指标可以有补助,要考核的,好的奖励,差的惩罚。
代理公司要业绩,拿钱出业绩是他们该做的,如果粮饷充足的情况下,那是他们自己的问题,我们只要结果;但如果本身项目难卖,佣金点又不高,为了代理的积极性,适当给些激励补贴是可以的。
营销团队跟军队一样,目标性的物质刺激可以刺激到他们。
八、企业拜访开拓,应该注意哪些细节?
企业拓客,关键在于人脉及资源。我的习惯每到一个城市,首先利用身边的资源进行渗透。供应商、政府各部门、银行、员工亲朋等,你总能从自己公司的部门找到他们关联的客户,所以全员营销就来了。
企业可以从当地管委会及各大工会,员工亲属在企业任职等进行先期渗透。我的经验通过政府公益性活动组织(政府主办我协办)及企业需要的活动组织最有效。
比如政府消防知识展,与政府企业组织员工交流舞会、街舞大赛、园区好声音等,有了这样的活动以后,一来可以提升企业美誉度,二来可以提高项目知名度。这样可以进行第二步,企业大客户拜访(PPT)及驻点(比如食堂加餐),最主要的是线下的大规模圈层活动,以点爆面。有些企业引进城市搞关系往往只是重视开发报建,没有把客户拓展重视起来。建议可以把各部门的对外联络组织起来。
九、针对乡镇如何拓客,因为乡镇比较分散特别是乡?
目前的三四线城市项目,主要的客群除了县城,大约有40-60%的客户来自目标乡镇,拓客是可行的。我们根据前期的客户地图,分出城市及乡镇的主要一二级战区,按客户密集度进行有效的阶段性拓客。
大部分乡镇客户关注进城结婚(户口)、教育学区、价格等关键点,我们拿一个目标乡镇分析。
线上线下的配合来举例,首先是到达项目的主要道口户外等资源,其次是镇上的超市、政府、银行、主流餐饮等人流集中地的广告植入(横幅、台签、展点等),同时启动当地政府商会办公室主任等的人脉圈层开拓,这里可以用编外经纪人。
销售团队有调集40号人以上的项目可以利用周末3天打乡镇,先线上广告轰炸近一个月,然后镇上主要点的全镇派单2天,晚上再进行集中的活动进行收客,一次搞定,一个月可以打4个重点乡镇。
十、拓客中发展了经纪人,其资源充足,但佣金高于置业顾问3倍以上,在合作中,如何防止置业顾问将客户转移到经纪人处,损害公司利益?
跳单主要靠监控和惩罚。如果是非中介做的编外经纪人,先订立游戏规则,对编外约定必须是他的渠道找来的客户成交,否则不付佣金甚至追偿(协议中体现,具体沟通还是以调动积极性为主)。而防范通常从内部入手,日防夜防家贼难防,内部的红线所有人要清楚,一旦发现扣罚佣金并开除,没有余地。
第四篇:素拓委员工作计划与总结
教育科学系12级小学教育三班素拓委员2012-2013学年
第二学期工作总结
回想2012第二学期的点点滴滴,所有的事情还历历在目,仿佛发生在昨天。从一名懵懂的大一新生到初涉工作本质的团支部委员,从稚嫩到成熟,从一无所知到明明白白,在这两年的时间里,也许丢失了一些东西,但学到的经验道理远远超过了这些丢失,这将成为我一生的宝藏。
做为我们班的素拓委员,我本着求实、创新、积极、灵活的工作态度做好了我的本职工作。工作是忙碌而又充实的,通过历次活动,我与其他班干部间的联系加强了,关系更加融洽了。在常规工作方面,首先,我能够以认真的态度对待与完成学校团委,系里布置的工作任务,每项工作都尽最大努力完成。
在完成中心一些工作的过程中,由于刚开始对工作的不熟悉,我有时候会遇到很多困难,但每次当我遇到困难的时候,我都会鼓励自己,有时候也会去请教别人,尽力去完成每项工作。工作是枯燥的,但每次想到自己加入班委会正是为了服务同学,磨练自己和锻炼自己,我都会把一切阻力化为动力,尽力地圆满完成每次工作。
在个人思想方面,个人对班委的宗旨“让优秀成为一种习惯”这句话有了更深的理解,在这学期的工作中,我学会了更好更合理地安排班委的活动与自己的学习时间,变被动学习为主动学习;学会了冷静地思考问题,能正确的认识自己的不足,弥补过失,同时也在参与各项工作中增强了自己的团队协作能力,使自己更优秀,更努力让优秀成为自己的一种习惯。
回顾过去是为了更好的展望未来,不是停留在过去,而是要给自己施加压力,让自己更加有动力,这一学期中,总的说来,时间有限,能力有限,条件有限,成绩有限,但是班级的每个成员都努力付出了时间和汗水,这是值得肯定的。
教育科学系12级小学教育三班团支部
2013年6月18日
教育科学系12级小学教育三班素拓委员2013-2014学年
第一学期工作计划
新学期伊始,作为素拓部委员,为新学年的工作展开一番构想,做了一份新学年工作计划,促进本班同学素质的提高,具体活动日再做详细安排。
一、明确目标服从安排
我班始终围绕团委工作目标,完善“学生综合素质考核体系”以综合素质培养主线,引各班素拓委员从思想道德文化素质、综合阅历等方面开展工作。坚决服从上级组织安排,认真完成院团委及系团总支安排各项工作。举科学旗帜,提倡科学民主开展科技创新活动工作做有特色活动。
二、做好本份工作
组织策划“素质拓展知识竞赛”活动,完善素质拓展认证体系。每月组织一项活动,比如接下来的三加二篮球赛,„齐心协力向前冲‟,„心连心‟活动等,利用这些活动来提高同学们的班级荣誉感和责任心,以及培养同学们互帮互助的团结意识,融洽同学们的关系。
三、促进班级成员感情
适时开展一些户外活动,如唱歌,野炊,登山等,通过娱乐的形式,轻松的氛围在无形中增进班级同学之间,班级与班级成员之间的沟通与交流,为今后的开展工作奠定良好的工作基础。
对于本学期制定的一些活动工作,我们会尽力做得更好,同时我们不断吸取别人宝贵意见建议,虚心学习、认真工作,共同把各项工作开展得更出色!你的心,我的心,万众一心;你的力,我的力,千钧之力。我相信只要我们同心协力就一定能够把班级素拓建的更好。
教育科学系12级小学教育三班团支部
2013年10月11日
教育科学系12级小学教育三班素拓委员2013-2014学年
第一学期工作总结
光阴似箭,岁月如梭,转眼间大二的生活已经过了一半,回顾自己在这半学期的素拓委员任职,很多的体会浮现在眼前。
首先,从思想上来说,这半年工作中,我的思想得到了很大的提高,看着很多班级活动搞得有声有色,看到那些学弟学妹的激情与才华,我深深的感受到其实大学是一个一切皆有可能的地方,只要自己勤奋,只要自己敢于动手,很多机会就会向你说可以。
其次,在工作方面,半年的任职,我体会到,其实作为素拓委员是比较累的,很多事情要在班上宣传,有的时候为了鼓励班上同学积极参加相关活动,还得各个击破,一个一个的去做思想工作。在生活方面,通过一年的工作,我逐步发现自己和班上的很多同学关系变好了,这充分说明了作为班上的一个小干部,做事虽然是很累的,但其中还是有很多好处的,其实不仅如此,而且,在工作中,我逐步认清楚了自己,发现了自己的不足,这也为自己扬长避短,以后更好工作着了很好的铺垫。
时间是挤出来的,半年的工作,半年的学习,不仅没有影响我的学习,而且给我学习增添了很多动力,我开始学会了正确处理学习和工作二者之间的关系,在工作中扩宽自己的视野,在学习中提高自己的文化水平。
当然,自己还有很多缺点和不足,比如说,今年没有很好的把有的小活动给班上的同学宣传,不过我一定会正视自己的不足,明年更加积极的工作,为开展好班上同学素质拓展工作而尽心尽力的。
教育科学系12级小学教育三班团支部
2014年1月4日
教育科学系12级小学教育三班素拓委员2013-2014学年
第二学期工作计划
在这个生机勃勃的夏天,我们踏进了大二下学期的生活。回想大二一学期的学习和工作的点点滴滴,我们不知不觉的成熟了很多,对生活和工作都有了新的看法和态度。新的学年,新的开始,正像这个夏天一样,一切都是崭新的,充满了希望和生机。新学期伊始,做了一份新学期工作计划。
一、明确目标服从安排
始终围绕团委工作目标,完善“学生综合素质考核体系”以综合素质培养主线,引班级同学从思想道德文化素质、综合阅历等方面开展工作,坚决服从上级组织安排,认真完成班级团总支安排各项工作高举科学旗帜,提倡科学民主开展科技创新活动工作做有特色活动。
二、做好本份工作
组织策划组织活动,“齐心协力向前冲”,”心连心”活动等,利用这些活动来提高同学们的班级荣誉感和责任心,以及培养同学们互帮互助的团结意识,融洽同学们的关系。
三、促进同学感情
适时开展一些户外活动,如唱歌,野炊,登山等,通过娱乐的形式,轻松的氛围在无形中增进本同学之间的沟通与交流,为今后的开展工作奠定良好的工作基础。
对于本学期制定的一些活动工作,我们会尽力做得更好,同时我们不断吸取别人宝贵意见建议,逐步完善学生会制度体系,虚心学习、认真工作,共同把各项工作开展得更出色。你的心,我的心,万众一心;你的力,我的力,千钧之力。相信能把班级活动建设得很好。
教育科学系12级小学教育三班团支部
2014年3月6日
第五篇:素拓总结
华南理工大学广州学院招生宣传服务中心 人力资源部第一次破冰素拓活动总结
2014年 04 月 18日,我们部门组织策划了第一次破冰素拓活动,经过大家的努力与积极配合,此次活动圆满结束并取得了很好的效果。这也为我们中心以后工作的正常有序进行奠定了良好基础。素质拓展活动的目的在于培养中心成员的团结精神和集体荣誉感,增强勇气和自信心,消除心理上的隔阂和障碍。显然,我们做的不错,多数人都玩开了。
本次活动有以下成功之处:
1、学习到团结合作的重要性。
2、认识到,世界上的一些事是需要开动脑筋,集合大家的智慧才能完成的。
3、认识到,男生和女生是需要互补合作的,这样才能更好的完成任务。
4、培养集体荣誉感是十分重要的。
5、每个人都很认真完成自己的工作。
虽然活动取得了圆满成功,但活动过程中仍存在着许多不足:
1、由于活动时间多次变动,且选定的时间和参与人员的空闲时间不符,出 现到场人员比原定人数少的情况。
2、由于本次活动地点的确认上出现偏差,导致错失最佳的活动时间。
3、前期准备时间很长,但效率很低,开了多次会议但没有成效。
4、多数工作人员没有时间紧凑感,工作效率低。
5、设置游戏时思想不够开放,出来的游戏一半易冷场。
6、规则变动多次而复杂,多数工作人员不清楚规则。
从本次活动中得到的经验教训:
1、应提前做好活动规划,做好各种准备工作,保证活动有始有终。
2、应依据中心成员的特点,对活动细则进行更改,适当放松对他们的要求,使活动顺利进行。
3、在活动出现意外情况时,要学会变通,积极应对。
4、注意活动与时间的合理安排。
5、提高工作效率,完善细节,更多创新。
6、正式活动前,应把整个流程演练一遍,找出问题,进行完善。
感叹:思维创新与细节完善两难全,想的与做的很大差别。
素质拓展活动带给了我们快乐,更多的是新的收获。这些经验、教训对我们以后工作,是一笔不小的财富。我们要吸取经验教训,也要更加的努力,争取把我们的活动越办越好。
凌茜
2014年 4 月 24 日