UML课检讨

尊敬的李老师:
    非常抱歉,由于我个人的失误,给您的工作带来麻烦。    
    事情简单描述如下:因我平时在课外精力投入较多,一时没有把握好课外活动与UML课程的平衡。老师您多次在课堂上让没及时在教务系统上选课的同学去您那补报,而我却不在,导致到期末才发现我并未选修此门课程。
    我写这封检讨书,希望能够以此检讨自己的行为,并对这件事情进行深入的分析。
    先从我自身开始分析。第一,我这个人做事情目的性比较强,是个目的驱动型的人。对于类似UML、软件工程这类理论性比较强的课,我有自己的看法和我自己的处理方式。我很清楚这类知识我现在应该学到什么程度,将来到了什么时候又会重新开始真正理解或者真正使用。现在软院的专业课,一看课表真的觉得开得很齐全,但是教了真正有效果的,很少,这点我随便看看大家做上机题、写大作业的情况就能知道。所以让人有种感觉,这只是在为了称得上是“软院”而开这些课。有多少课让人觉得只是形式。作为一个课外活动本来就局限于专业相关技术方面的人,我很轻易地比其他人更知道这门课讲得到底是个啥,知道这个东西在“软件”领域里处在哪个位置——而不是跟大多数人一样,只要会做考试题就行了。我从很小的时候就是一个目的驱动的人,从我选择了软件专业开始,我就已经为自己将来确立了目标,而我现在所做的,都是为了达成这个目标。所以,我花更多的时间在课外,在我认为我现在更需要学习的东西上。在这里,我想我没有必要论述类似“UML或者软件工程跟其他东西哪个更有用更有价值”的观点,我只是暂时无法被说服为什么我必须用它。这些本身是为了解决软件危机的事物确实是很难被没有经历过他的人所理解。也许我现在写的东西规模还不到使用它的程度,我可不想维护一堆文档而使得我的项目变得头重较轻。当然,这一切并不能成为我不学UML、不参加UML课的理由。事实上,我现在比大多数人按时上课的人更理解UML,同时也去了几次课。
    第二,考虑为什么我没在课后“听说”老师叫同学去补报的事情。我觉得是我平时在课外投入太多精力了,这里不完全指“时间”,更指“精神”,或者可以说是“专注”。过于专注在自己的事情,对外界一概不闻不问,或者说轻视外界的一切变化、事情的发生。整个人进入一个混沌的状态。事实上这个状态不好,非常不好。假设,一个人旷课久了,课没上是小时,但是影响的是他整个人的精神状态。就算他是在做竞赛也好,项目也好,但是他脱离群体了,他会开始觉得他可以跟大家不一样,别人做什么,他可以不做,因为他本来就在做自己的事情。这是一种非常可怕的自我暗示,长时间下去,会失去积极向上的精神状态,时常熬夜,别人去上课,自己在睡觉,作息混乱,恶性循环。这种状态下,无从“听说”老师,想必也很正常吧。
    第三,自己总抱有侥幸心理。体现于翘课不怕点名等等方面。另外,我不爱跟老师打交道,一些看起来特别有师德的除外。这可能是由于小时候对于老师是假想敌的想法已经根深蒂固。但是我想,只要双方都相互尊重,问题不是很大。
    再分析外界因素。首先,学校的教务系统有严重问题。烂,太烂。摆明了要选的课它还必须让所有学生去系统上自行选一遍,关键是其可承受的并发量完全不足以满足全校甚至是一个学院的学生,往往在高峰期会处于拒绝访问状态。对于这种会被人工DDoS、功能不完善、界面丑陋的教务系统我只能表示无奈。
    其次,学校课程的安排也有问题,它把UML排成任选课,但是事实上每个人都要选。再加上是考察课,上课时间在周五,很多人就会选择翘课了,就算为了点名而去上课的那也是没认真学的,这是学生的整体状态,不容否认。没人在意的课自然也很难有人给我“通风报信”,确认我是否在名单上了。我们“伟大的”班长也有问题,别人没注意他应该要注意的。为什么他没在其他课上通知下同学让没选课的去老师那补报?事实上,对于知识产权这门课他是这样做的。这要么是他的失职,要么是他自己也没去上课。课代表也有问题,他为什么没在交第一次作业的时候因为统计上交的情况而发现我没在名单上?要么是没统计,那“做得好加分”这一说从何而来?我还依稀记得当时我交完作业后么过多久就被课代表在群上共享了……全班这么多人COPY过我的作业而我却没在老师名单上?多么讽刺。
    至此,本检讨就两个方向六个小点对“为什么会造成到现在还未选课”这样一个情况进行了分析。还恳请老师您网开一面。

    此致
敬礼!

Xcode 4.5.1 免iDP开发/部署/在线调试/生成ipa

本文是结合自己测试的情况,对 这篇教程 的整理,针对 xcode 4.5.1。

1. 修改 SDKSettings.plist

1
2
3
4
5
6
7
8
9
cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk

sudo cp SDKSettings.plist SDKSettings.plist.orig

sudo cp SDKSettings.plist /tmp/SDK.plist

sudo chmod 777 /tmp/SDK.plist

sudo /Applications/Xcode.app/Contents/MacOS/Xcode /tmp/SDK.plist

展开DefaultProperties分支,将下面的 CODE_SIGNING_REQUIRED、ENTITLEMENTS_REQUIRED 两个属性改为NO

1
sudo cp /tmp/SDK.plist SDKSettings.plist

2. 修改 Info.plist

1
2
3
4
5
6
7
8
9
cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform

sudo cp Info.plist Info.plist.orig

sudo cp Info.plist /tmp/Info.plist

sudo chmod 777 /tmp/Info.plist

sudo /Applications/Xcode.app/Contents/MacOS/Xcode /tmp/Info.plist

将 DefaultProperties、RuntimeRequirements、OverrideProperties分支下 的 XCiPhoneOSCodeSignContext 修改成 XCCodeSignContext。

1
sudo cp /tmp/Info.plist Info.plist

3. 执行脚本

1
2
3
4
5
6
7
#!/bin/bash
cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
printf "xc3x26x00x00" >> working
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support

正常的话应该输出(具体的数字可能有差别)

1
2
3
231+1 records in
231+1 records out
115904 bytes transferred in 0.001738 secs (66694555 bytes/sec)

4. 获取 gen_entitlements.py

需要连网执行

1
2
3
4
5
mkdir /Applications/Xcode.app/Contents/Developer/iphoneentitlements
cd /Applications/Xcode.app/Contents/Developer/iphoneentitlements
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py

5. 禁用Xcode自动的签名操作

这个似乎不做也行

将工程配置中所有的Code Signing选项全部设为Don’t Code Sign,如图。可能需要先点击“All”让这个选项显示出来

6. 添加自定义的生成后脚本

在Build Phases中添加一个Phase,右下角的Add Build Phase,然后单击Add Run Script,输入以下脚本

1
2
3
4
5
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ] || [ "${PLATFORM_NAME}" == "ipados" ]; then
/Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi

旁门左道生成IPA文件

如果我的程序调试好了,怎么才能发给别人用呢?正常情况下IPA文件是从Xcode的Organizer中输出的,但是我们没有证书,这样输出会产生错误。我们只能用个小trick来完成这个操作了。

先将代码生成为Release目标,然后打开工程的输出文件夹,通常情况下这个目录是 /Users/你的用户名/Library/Developer/Xcode/DerivedData/以工程名打头的文件夹/Build/Products/Release-iphoneos

很纠结吧~这个目录下有个.app的文件,就是生成的程序了。把这个.app拖到iTunes中,它会出现在应用程序那个列表中,然后再把它从iTunes的那个列表中拖出来(比如拖到桌面),发生了什么?哈哈,它就这样变成.ipa了!

PS.

我的 ipad 还是 ios5.1 的,好像运行有点错误。不知道是不是应该用5.1的SDK。

Homebrew Symlink Error

用homebrew的时候经常遇到symlinks出错,

1
2
3
4
Linking /usr/local/Cellar/libpng/1.5.13... Warning: Could not link libpng. Unlinking...

Error: Could not symlink file: /usr/local/Cellar/libpng/1.5.13/share/man/man5/png.5
/usr/local/share/man/man5 is not writable. You should change its permissions.

需要修改目录拥有者,

1
sudo chown -R `whoami` /usr/local/share/man/man5

Vim学习笔记(二)

查找(Find)


查找字符

f[char]查找光标后面的char,F[char]查找光标前面的char。

查找光标所在的词

* - 找下一个

# - 找上一个

跳转(GoTo)


括号匹配

%

行首行末

0 - 行首

$ - 行末

转到行

gg - 跳到整个文件首部

G - 跳到整个文件末尾

[number]G - 跳到第number行首部

Vim学习笔记(一)

从今天开始再好好学下Vim吧,其实也没这么难上手,多用用就好了。 先跟这个tutorial学下。

模式


Vim有Insert mode跟Command mode,按i进入insert mode,按ESC进入command mode。

光标移动(Movement)


上下左右(Basic movement)

hjkl。

字移动(Word movement)

w - next word

e - end of the word

b - beginning of the word

重复移动(Number powered movement)

3w - same as w 3 times

重复插入


在command mode下先输入次数n,然后进入insert mode,正常插入一组字符,然后按ESC就会自动重复n-1组字符。

微软与谷歌盈利模式对比分析

初看题目,觉得其实就盈利来说,Microsoft跟Google真的没有太大可比性。一个是围绕OS卖软件的,一个是靠搜索引擎卖广告的。Google卖广告,不是说他找不到合适的盈利模式才靠广告赚钱,恰恰相反,它是开创了“免费+广告”的盈利模式。所以说,Google最终能变现的途径确实只有广告,但是这靠的是它提供的一系列免费的网络服务。

Microsoft盈利模式

先来说说Microsoft的盈利模式。

如上图所示,依据盈利能力的大小排序,Microsoft主要的盈利来源如下:

  1. 商业部门
  2. 服务器及工具
  3. Windows系统、Windows live系列服务
  4. 娱乐及娱乐设备
  5. 在线服务
  6. 未知收入

数据是2012年初的,微软商业部的盈利主要来自于Office办公软件。由下图可以看出,自2010年第三季度起,Windows业务营收所占总运营收入的比例就开始下滑,而商业部门一段时间的迅速增长后又趋于平稳。

微软商业部门,除了传统的Office Suite(Word、Excel、PowerPoint),还包括Exchange、Sharepoint、Lync、Office 365等,以及一些CRM、ERP软件。

服务器及工具,包括Microsoft SQL Server、Visual Studio、Azure等。其中,一半的利润来自与其他企业公司达成的大量授权方案,其他的利润来自租赁服务、授权交易以及企业服务。

Windows及Windows Live,在这个分类中,大约四分之三的利润来自Windows操作系统的销售。而另外四分之一的利润来自于一些硬件产品(鼠标、键盘)的销售以及在Windows Live服务上的广告收入。

娱乐及娱乐设备(主管Xbox和Windows Phone的部门),这是Microsoft除了Windows操作系统之外另外一个针对消费者的服务。包括Xbox 游戏机、Xbox Live服务、Kinect、所有的Xbox游戏、Windows Phone手机操作系统以及花费85亿获得的Skype业务。

在线服务,例如MSN和Bing,大部分盈利来自广告收入。

Google盈利模式

正如文章开头所说的,Google绝大部分收入来自于广告,约占96%,这种情况已经持续了好几年。

当然Google不是一个广告公司,事实上,它免费为用户提供一系列网络服务,从而聚集起一个庞大的用户群。而广告商,就会为了享受这些用户资源而付费。

免费网络服务

那我们就先来细数下Google有哪些免费的网络服务。

搜索引擎,世界最大,没有之一。围绕搜索引擎,它还提供一系列网站上的服务,如新闻、翻译、图片、博客搜索、学术搜索(Google Scholar)等。

还有许多其他的网络服务,如文档(Google Docs)、网上论坛(邮件列表)、Google Maps、Gmail、Gtalk、Google Code、Google+、协作平台(Google Apps),以及收购来的Blogger、Youtube。

在其他方面,Google以WebKit排版引擎开发的开源的Chrome浏览器,针对移动设备的操作系统Android,基于Linux的操作系统Chrome OS等。

广告系统

Google的广告系统由两个部分组成,通过第三方网站来放置。

Google收购DoubleClick后获取技术,得以获取用户兴趣和确定广告目标,实现精准投放。Google Adwords为广告客户提供在网络中展示广告的服务,按点击或显示收费。AdWords的姊妹项目AdSense,允许网站站长在自己的网页中提供广告展示的位置,并参与分成。Google Analytics可以让网站站长们查看并追踪访问者在何时,以何种方式访问自己的网站,如检查某一页面上所有链接的点击等。

其它

其实据我了解Google还是有其他盈利途径的,主要是增值服务,如Google App Engine的Pro用户能够获得更高资源配额,类似的还有Google Apps。只不过这些收入相对广告来说只是目前还只是皮毛罢了。

两者盈利模式对比

Google跟Microsoft从来都是死对头,就目前来看,体现在以下几个方面:

  1. 搜索

    看全球最有机会和实力挑战 Google 搜索的,目前还只有 Bing,况且 Bing 现在已经驱动 Yahoo! 搜索和 Facebook 搜索,Bing 也独家整合了 Facebook“赞”数据。Google 目前的感觉肯定是不好受的,搜索将直接影响广告收益。

  2. 企业生产力

    Google Apps 和 微软 SharePoint、Exchange、Office 一系列的生产力产品始终是敌对,加上微软去年已经将这些产品的云服务版本打包成了 Office 365(清晰目标是 Google Apps),两家竞争关系更加明显。

    Google Apps已经迫使微软推出了免费的Office应用。目前,一些大企业已经放弃了微软Office,转投Google Apps。如果这种趋势持续下去,微软的这一大收入源将面临巨大压力。

  3. 操作系统和移动终端

    根据未来云计算的趋势Google推出Chrome OS,顺应移动互联的趋势Google推出Android,以操作系统起家的Microsoft应该是受到极大威胁的。所以,微软推出Windows Phone、Windows 8积极应对。把Windows 8做成半个平板系统也是想在平板领域抢回点市场。

  4. 其他

    还有许多处于竞争关系的产品,如Google Chrome 对 IE,App Engine 对 Azure,Gmail 对 Hotmail,Gtalk 对 MSN等。

总结来说,Microsoft主要盈利来自于Windows、Office Suite、Server产品,方式是卖软件或者卖服务。而Google主要盈利来自于提供搜索、办公等网络服务,方式是卖广告。

Use Octpress

繁杂的生活中让人更加萌生追求极简的欲望,心血来潮就打算那拿octopress再搭个博客(希望这个博客能够让我心宁静)。

以下皆为回忆,可能由于某种原因记错,仅供参考…

但是这东西还真是超出我预期的让我折腾了很久,我的OSX默认是ruby是1.8的,octopress需要1.9.3,于是去安装rvm。

安装rvm
1
curl -L https://get.rvm.io | sudo bash -s stable

装完还挺快的,接着就去装ruby 1.9.3,

1
rvm install 1.9.3

然后直接跳出一个说明(vim),说我gcc是lvvm-based的…不支持…要重装(= =!),它提供了两个途径,然后我用brew装了gcc-4.2

貌似是这样
1
brew install gcc-4.2

再去装ruby貌似就正常了, 等了半小时没反应…就根据这篇用了淘宝的镜像,不过要注意OSX的rvm路径不一样。然后速度就很快了…但是装到rubygem的时候,停在94%不动了…于是待机睡觉… 第二天看看还是停在94%…强制结束掉,然后重启reinstall,这次ok了。

然后,设置默认ruby版本为1.9.3

1
rvm 1.9.3 --default

之后又折腾了几次octopress,主要是参考了以下几篇经验,

  • http://voodeng.com/blog/2012/09/02/octopress-on-github/
  • http://mrzhang.me/blog/blog-equals-github-plus-octopress.html

搞了几次,rake generate 有报错,参考这篇后,发现是我博文名字的问题,我取得是”Hello Octopress!”…然后把\!删了就好了。 之后把博客绑定到了oct.tclh123.com上,

1
echo 'oct.tclh123.com' >> source/CNAME

然后去DNS那加个oct到tclh123.github.com的CNAME。 至此,基本搞定。