发博文
个人资料
archangel
archangel
  • 博客等级:
  • 博客积分:251
  • 博客访问:5,086
  • 关注人气:1
访客
加载中…
评论
加载中…
留言
加载中…
友情链接
暂无内容
好友
加载中…
博文
标签:

it

分类: IPhone
inline int saturate_to_255 (int a)
{
 
int y;
 
asm ("usat %0, #8, %1\n\t" : "=r"(y) : "r"(a));
 
return y;
}

should be equivalent to:

inline int saturate_to_255 (int a)
{
 
if (a < 0) a =0;
 
if (a > 255) a = 255;
 
return a;
}
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

嗯,另外有个小小的提示,某些VPS提供商的系统真的是非常非常的干净啊~连wget和unzip都没有,所以需要先安装下,
另外,更新下系统也是必要的哦

apt-get -y install wget unzip
apt-get -y update

好吧,Let’s Go~ (我说: mac下用port, sudo port install wget )

安装Redmine依赖组件

Redmine是一个基于RoR的软件~所以安装Redmine之前先要把Ruby同学招来~~
在这里我使用了性能更好的REE(Ruby Enterprise Edition)来代替Ruby原生的解释器

cd /tmp
wget http://rubyforge.org/frs/download.php/71098/ruby-enterprise_1.8.7-2010.02_amd64_ubuntu10.04.deb
deb -i ruby-enterprise_1.8.7-2010.02_amd64_ubuntu10.04.deb
rm -f ruby-enterprise_1.8.7-2010.02_amd64_ubuntu10.04.deb

接着安装Rails和Rack

gem install rails -v=2.3.5
gem install rack -v=1.0.1
gem install mysql

安装MySQL数据库

这一步其实不是必要的~因为…因为咱的数据库服务器和Redmine用的不是同一台~
好吧,不废话~

apt-get install mysql-server

安装过程中会要求输入root密码,请记住哦~等下要用到呢;

下载&配置 Redmine

在这里我将Redmine安装到/var/redmine下,你也可以根据个人喜好修改

wget http://rubyforge.org/frs/download.php/72627/redmine-1.0.2.tar.gz
tar zxvf redmine-1.0.2.tar.gz
mv redmine-1.0.2 /var/redmine
cd /var/redmine

接下来先配置下数据库~

mysql -ppassword
create database redmine character set utf8;
create user ‘redmine’@'localhost’ identified by ‘password‘;
grant all privileges on redmine.* to ‘redmine’@'localhost’;

复制配置文件

cd config
mv database.yml.example database.yml

找个喜欢的编辑器打开database.yml,修改配置

# MySQL (default setup).

production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: password
  encoding: utf8

development:
  adapter: mysql
  database: redmine
  host: hocalhost
  username: redmine
  password: password
  encoding: utf8

接下来生成一个Session Store Secret

rake generate_session_store

创建数据库~~然后插入默认设置

RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data

如果没有啥错误提示的话~~那就是装完了

安装&配置 Lighttpd

无敌的apt-get啊。。。果然是超级牛力

apt-get install lighttpd

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2010-10-09 13:46)
标签:

it

http://www.macports.org/install.php
到macports上去下载最新的包,安装,默认是安装到/opt/local/bin下面,所以要把这些路径加到 /etc/profile里面去:
/opt/local/bin和/opt/local/sbin

升级本地库(相当于apt-get update):
sudo port selfupdate

搜索索引中的软件
port search app_name

安装新软件
sudo port install app_name

卸载软件
sudo port uninstall app_name

查看outdated的软件以及版本
port outdated

升级outdated的软件
sudo port upgrade outdated

-----------

vim /etc/profile 加入这个: export PATH=$PATH:/opt/local/bin:/opt/local/sbin
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

分类: technology
一,构建ant环境

要使用ant首先要构建一个ant环境,步骤很简单:
1),安装jdk,设置JAVA_HOME ,PATH ,CLASS_PATH(这些应该是看这篇文章的人应该知道的)
2),下载ant 地址www.apache.org找一个你喜欢的版本,或者干脆最新的版本
3),解压ant 你得到的是一个压缩包,解压缩它,并把它放在一个尽量简单的目录,例如D:\ant-1.6虽然你不一 定要这么做,但这么做是有好处的。
4),设置ANT_HOME PATH中添加ANT_HOME目录下的bin目录
5),测试一下你的设置,开始-->运行-->cmd进入命令行-->键入 ant 回车,如果看到
Buildfile: build.xml does not exist!
Build failed
那么恭喜你你已经完成ant的设置
二,体验ant
就像每个语言都有HelloWorld一样,一个最简单的应用能让人感受一下Ant
1,首先你要知道你要干什么,我现在想做的事情是:
编写一些程序
编译它们
把它打包成jar包
把他们放在应该放置的地方
运行它们
这里为了简单起见只写一个程序,就是HelloWorld.java程序代码如下:
package test.ant;
public class HelloWorld{
 public static void main(String[] args){
  System.out.println("Hello world1");
 }
};

2,为了达到上边的目的,你可以手动的用javac 、copy 、jar、java来完成,但是考虑一下如果你有成百上千个类,在多次调试,部署的时候,一次次的javac 、copy、jar、java那将是一份辛苦的工作。现在看看ant怎么优雅的完成它们。

要运行ant需要有一个build.xml虽然不一定要叫这个名字,但是建议你这么做
下边就是一个完整的build.xml,然后我们来详细的解释每一句
<?xml version="1.0" encoding="UTF-8" ?>
<project name="HelloWorld" default="run" basedir=".">
 <property name="src" value="src"/>
 <property name="dest" value="classes"/>
 <property name="hello_jar" value="hello1.jar"/>
 <target name="init">
  <mkdir dir="${dest}"/>
 </target>
 <target name="compile" depends="init">
  <javac srcdir="${src}" destdir="${dest}"/>
 </target>
 <target name="build" depends="compile">
  <jar jarfile="${hello_jar}" basedir="${dest}"/>
 </target>
 <target name="run" depends="build">
  <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
 </target>
 <target name="clean">
  <delete dir="${dest}" />
  <delete file="${hello_jar}" />
 </target>
 <target name="rerun" depends="clean,run">
  <ant target="clean" />
  <ant target="run" />
 </target>
</project>

解释:
<?xml version="1.0" encoding="UTF-8" ?>
build.xml中的第一句话,没有实际的意义

<project name="HelloWorld" default="run" basedir=".">
</project>
ant的所有内容必须包含在这个里边,name是你给它取的名字,basedir故名思意就是工作的根目录 .代表当前目录。default代表默认要做的事情。

<property name="src" value="src"/>
类似程序中的变量,为什么这么做想一下变量的作用

<target name="compile" depends="init">
  <javac srcdir="${src}" destdir="${dest}"/>
</target>
把你想做的每一件事情写成一个target ,它有一个名字,depends是它所依赖的target,在执行这个target 例如这里的compile之前ant会先检查init是否曾经被执行过,如果执行过则直接直接执行compile,如果没有则会先执行它依赖的 target例如这里的init,然后在执行这个target

如我们的计划
编译:
<target name="compile" depends="init">
 <javac srcdir="${src}" destdir="${dest}"/>
</target>

做jar包:
<target name="build" depends="compile">
 <jar jarfile="${hello_jar}" basedir="${dest}"/>
</target>
运行:
<target name="run" depends="build">
 <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
</target>
为了不用拷贝,我们可以在最开始定义好目标文件夹,这样ant直接把结果就放在目标文件夹中了
新建文件夹:
<target name="init">
 <mkdir dir="${dest}"/>
</target>
为了更多一点的功能体现,又加入了两个target
删除生成的文件
<target name="clean">
 <delete dir="${dest}" />
 <delete file="${hello_jar}" />
</target>
再次运行,这里显示了如何在一个target里边调用其他的target
<target name="rerun" depends="clean,run">
 <ant target="clean" />
 <ant target="run" />
</target>

好了,解释完成了,下边检验一下你的ant吧
新建一个src的文件夹,然后把HelloWorld.java按照包目录放进去
做好build.xml文件
在命令行下键入ant ,你会发现一个个任务都完成了。每次更改完代码只需要再次键入ant

有的时候我们可能并不想运行程序,只想执行这些步骤中的某一两个步骤,例如我只想重新部署而不想运行,键入
ant build

ant中的每一个任务都可以这样调用ant + target name
好了,这样一个简单的ant任务完成了。
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

Scrum工具大比拼---流行Scrum工具一网打尽


 

早就想写这个总结了,因为SCRUM很好, 工具却难找,但一直没有出台,是想等自己都试用过后,这样才更有发言权。可有些工具真的是很难搭起一个环境,这样只好摘录一些网友们的评论了! ---敏捷精灵

白板

最直接的方式,用于每天的tracking,还是非常不错的,但是对Product Backlog支持明显不够

Excel

我们最初也用过,主要是成员多的情况下,修改时会相互冲突,不好同步。。可以参考我写的这个文章[scrum工具]用excel表格工具实现Scrum

ScrumWiki

这个也用过,一开始感觉还不错。但当你的需求变多变复杂的情况下,就不容易用了。后台脚本使用Perl写的,我们的一个外国同事还对他专门进行了修改,增加了好多feature,这样才好用起来。作为免费的软件,目前已经没有人支持和维护。

Scarab

Java server 平台, 支持灵活定制,免费

Double Chocco Latte

基于PHP , 支持Apache 或IIS, MySQL or SQL Server , web 客户端,免费

VersionOne

商业化产品!没什么好说的,业界老大!

从 功能上看,的确非常新颖,贯彻了敏捷中的User Story为先的原则,和VSTS类似,将Issues、Defect、Task合并概念成为Task(在VSTS中更加优雅,叫做WorkItem), 并且必须挂在UserStory下,这个工具值得看看,有试用版可以下载,或者可以使用他们在线提供的试验平台

基于ASP.NET and IIS和 SQL。

团队可以使用“V1:敏捷团队”来管理产品和sprint backlog,通过交互式的“任务板(taskboards)“和"测试板(testboards)" 进行每日开发活动,藉由报表和燃烧图查看进度,以及其他活动。

通过这些功能,“V1:敏捷团队”的用户可以做到:

  • 从电子表格中快速导入故事与缺陷,管理合并后的产品backlog。
  • 利用简单的多条目拖放操作,方便地完成计划制定、对故事划分优先级。
  • 使用电子白板界面同时制定多个版本的发布计划,提高效率。
  • 通过交互式的任务板(Taskboard)、测试板(Testboard)、每日Scrum dashboard来对版本和sprint进行可视化追踪。
  • 针对版本和sprints的关键敏捷度量数据生成图表,如Burndown、Velocity、Estimate trends、Cumulative Flow Reports。

唯一的问题就是提供的选择过多,对于寻求简单明了工具的人,并不是一个好产品!.

GNATS

GNATS 传统来讲,属于缺陷跟踪工具, 但根据Jeff Sutherland, 已经支持 Scrum. 免费

Select Scope Manager

商业化产品,有试用版可下载。定制性比较差.

XP Plan-it

仅仅支持把你的数据放在他的server上,你通过下载的客户端更新和查看数据。。 好像对大多数人来讲意义不大

XPWeb

另一个基于web的分布式方案。免费!

使用PHP+MySql可运行于Linux, Windows, or Mac.但其演示在IE7下工作不怎么样,没法详细测试.

XPlanner

最牛的祖父级的开源工具,完全免费,业界使用率排名第四,真的是穷人的项目管理工具!

作为一个基于Web的XP团队计划和跟踪工具,要求 Apace Tomcat。

XP 独特的开发概念如iteration、user stories等,XPlanner都提供了相对应的的管理工具,XPlanner支持XP开发流程,并解决利用XP思想来开发项目所碰到的问题。 XPlanner特点包括:简单的模型规划,虚拟笔记卡(Virtual note cards),iterations、user stories与工作记录的追踪,未完成stories将自动迭代,工作时间追踪,生成团队效率,个人工时报表,SOAP界面支持。.

ScrumWorks

个人认为对Scrum个方面支持最好的商业产品,市场排名第三位,我们一直在用。可支持不同的Team工作于不同的项目上,非常灵活。既有简单的web客户端,也有强大的java客户端。

有免费使用版,且无时间限制,我用的就是。

支持对Bugzilla和Jira的集成,带有主题过滤功能的burndown图表,以及其他辅助了解项目状况和走势的功能,还有众多别的特性。

ScrumWorks Pro与Bugzilla和Jira的集成,体现在它可以导入两者中的条目作为backlog条目,并且可以像对其他backlog条目一样,对这些条目 进行操作。可以使用搜索来选择感兴趣的条目,并进行单独或多项导入操作。Infoq与Danube科技的JD Aspinall进行了交流,讨论了这个特性的本质,以及如何与ScrumWorks Pro一起使用Bugzilla和Jira。

我想提出这个特性请求的用户们都希望同时使用这两个工具。

产品的许多用户将他们全部的bug作为Product Backlog条目录入到ScrumWorks Pro中并进行跟踪。不过也有很多其他用户,由于其他种种原因,使用不同的工具来跟踪问题,并且只选择导入某些特定的缺陷到ScrumWorks Pro中。

Burndown图表现在可以按照主题 进行分组。将backlog按照主题进行组织后(类似于web 2.0中使用标签),你可以高亮或是过滤这些backlog,并且能够使用同样的主题针对burndown图进行过滤。

ProjectCards

ProjectCards 维持项目管理的索引卡片,精确的具体内容,一个项目控制盘,搜寻和过滤能力和拖放反复计划。六十日免费的试用。

基于 Client/Server结构,支持plug-in for Eclipse.

TargetProcess

是一个敏捷项目管理与Bug跟踪系统。企业版提供很多定制的功能,包括Pre-paid 20 hours of development by TargetProcess stuff和提供开发指南与API参考的全部源代码。

这个工具挺适合小项目团队的。

这儿有个 Demo 帮助读者理解这个产品,内容是通过创建一个新的项目,在迭代计划时给开发人员指派故事(Story)。

他们的价格模式包括“按站点 / On Site”(需要安装)和“按需 / On Demand”(Web版),并提供折扣。

ExtremePlanner

一个基于web的工具,它的功能几乎与ProjectCards完全一样,但是它添加了在任务级别进行评估的功能,这一改进非常棒。由于是基于web的, 所以它的界面可能不够漂亮,但是由于基于浏览器,它获得了一些灵活性(例如,当项目成员想在线查看状态报告时,如果是使用ExtremePlanner,就无需安装任何东西。)

我还在进一步考察这个工具,但是它看起来相当不错。

要求Windows, Linux, or MacOSX平台 (with Java 1.4.2 or higher and Apache Tomcat 4.1 or higher)

Rally

商业软件用户使用率排名第二位!支持用户需求的筛选、扩展的筛选标准、改进版本剩余时间表、新的通知规则(notification rules),以及用于Eclipse和CruiseControl.NET的连接器。

有免费在线试用体验版本.

Mingle

Mingle在ThoughtWorks官方站点可以免费下载,且5个用户以下的可以永久免费使用。Mingle是用纯Ruby打造的且运行在JRuby上 的一个产品,由于ruby是一门脚本语言,所以其移植性就很好,用其编写的程序安装起来也甚是容易,在Windows、Mac和Unix多种主流平台上跑 都是没有问题的;但也正是由于采用ruby编写,Mingle对硬件的要求也甚高,在我这台512M内存的机器上跑是超慢的、让人闹心的,建议还是放到性 能好的、单独的服务器上,内存容量官方建议是2G。还遇到了好几次ie错误,只好放弃了。

Mingle后台存储采用数据库方式,目前仅支持mysql和Postgres两种数据库版本,这个比 较遗憾,我无法使用现成的Oracle数据库了。

简单用了一下,发现如下很好的Features:

  • 支持建立"个性化"项目模板,便于复用;
  • 附带项目wiki,便于"项目知识积累和管理";
  • 丰富的card properties,使需求驱动的管理流程更加清晰;
  • 支持card和源代码之间的link;.

TRICHORD

这个名为“TRICHORD”的敏捷项目管理工具,是基于精益思想的,对Scrum也适用。TRI指的是三种视角(时间、任务和团队),CHORD则是和谐的意思。

它作为全团队分享项目状态的一个工作空间来运作,里面提供三种层次的看板图——特性看板(发布—特性)、故事看板(故事—迭代)和任务看板(工作日—任务)。特性看板用停车场图来归纳,故事和任务看板用延烧图来归纳。

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2010-08-26 08:51)
标签:

it

1、飞机的星形发动机,如初教五
http://jandan.net/
2、椭圆规
http://jandan.net/
3、缝纫机
http://jandan.net/
4、马耳他十字机芯——用于控制时钟的秒针运动
http://jandan.net/
5、汽车变档机制
http://jandan.net/
6、汽车等速万向节,我终于明白为啥前轮驱动的骑车的轮子还能转
http://jandan.net/
7、舰炮弹药装填系统,原来推进药跟战斗部是分着的啊
http://jandan.net/
8、转子发动机——内燃机的一种,把热能转为旋转运动而非活塞运动,如马自达RX8
http://jandan.net/
http://jandan.net/
# via World Of Technology。附从博闻网看到的三个汽车发动机原理图:
1、直列式发动机——它的汽缸肩并肩地排成一排,L4发动机,一般的车都用
http://jandan.net/
2、V 型发动机 ——汽缸排列在成一定角度的两个平面上,V6发动机
http://jandan.net/
3、水平对置式发动机 ——汽缸排列在发动机相对的两个平面上,保时捷911用的是这种的6缸
http://jandan.net/
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

vc

it

分类: technology
Posted in Finance 与VC谈判 at 7:11 pm
前几篇谈到过优先清算权(Liquidation Preference),但都是一笔带过,这次来仔细谈谈。大家先来做一道数学题。以下是一个比较典型的创业融资过程:

第一年:公司成立,天使投资50万美元,融资后估值200万美元。

第二年:A轮融资,VC投资400万美元,融资后估值1200万美元。并且,拥有1倍的优先清算权,Non-participating(下文会解释),8%的年股息。同时,成立了期权池15%,以后每轮融资都保证期权池占总股本的比例15%不变。

第三年:B轮融资,VC投资800万美元,融资后估值4000万美元,2倍的优先清算权,Participating(下文会解释),10%的年股息。

第四年:C轮融资,VC投资2000万美元,融资后估值8000万美元,3倍的优先清算权,Participating,10%的年股息。

第五年:公司以1.5亿美元的价格卖掉,创业者获利多少?请选择以下最接近的答案,并请大家在继续阅读下文之前猜猜答案。
A)    5000万美元;B) 3000万美元;C) 2000万美元;D) 1500万美元

首先,这是一家比较成功的公司,从A轮到C轮,公司价值每一次都有可观的升值,而且1.5亿美元也是一个不错的价钱。创业者拿到三分之一总有吧?能有5000万美元?

我们简单算一下每一轮的稀释,就会发现创业者在公司卖掉的时候,有30%的股份。每一轮的稀释比例如下(以万美元为单位):

天使投资稀释 = 150/200 = 75%
A轮稀释 = 800/1200 = 66.7%
B轮稀释 = 3200/4000 = 80%
C轮稀释 = 6000/8000 = 75%
这样的话,总共的稀释比例是 = 75% × 66.7% × 80% × 75% = 30%

这样看来,选择A选项5000万美元应该差不多。

但是,不要忘记减去15%的期权池!所以,创业者最终是15%,也就是2250万美元,所以C选项2000万美元是比较接近的答案。但是又错了!因为你忘记了优先清算权。这是融资文件中对创业者退出时的经济回报影响最大的一个,这里需要好好解释一下。

首先,“Liquidation”一般是指公司被卖掉或者被清算;“Preference”指优先股在清算的时候有优先权把他们的钱先拿出来。

优先清算权分两大类:Non-participating与Participating。先说Non-participating,这是比较无害的,代表投资者在公司卖掉或清算的时候,可以拿走以下两者中的一个:第一,他们投资的本金;第二,他们所占股份的价值。也就是说当每股价格在清算时比投资者投资时的价格高,优先清算权是不起作用的,因为投资者一定不会选择拿回本金。这里A轮的投资者就拥有这项权利,这是比较合理的。

在B轮投资的时候,情况就不一样了。A轮的融资后估值是1200万美元,B轮的融资后估值是3200万美元,一年之内翻了2倍多。可能是因为估值水平给得比较高,B轮投资者就要了比较有利的优先清算权,这次是Participating,并且是2倍。什么意思?如果公司
卖掉,投资者先拿800万美元的2倍即1600万美元,加上8%的利息,然后,他们还要在剩下的钱里按照股份比例分。“Participating”的结果是投资者鱼和熊掌兼得。

B轮的投资者有了这个权利,C轮的投资者更要有。这一点也是要特别注意的,因为开了个坏头之后,以后只会更糟。每个后来的VC都会要和之前的VC至少一样好的条款,而更普遍的情况是后来者的条款会对投资者越来越有利、对创业者越来越不利。

现在我们来算一下1.5亿美元的退出,创业者最终能拿到多少?

首先,C轮投资者拿走:1000 × 3 + 1000 × 10% × 1 = 3010万美元

B轮投资者拿走:800 × 2 + 800 × 10% × 2 = 1616万美元

剩下的1亿多美元,一定比A轮的投资价格高,于是A轮的优先清算权不起作用。创业者最终的利益为:(15000 – 3010 – 1616) × 15% = 1556万美元。这笔钱差不多是成交金额1.5亿美元的10%多一点。因此,我们的数学题答案是D。

因为有优先清算权,造成创业者的获利从成交金额的15%下降到了成交金额的10%,下降了三分之一左右。

值得提出的是这个公司是比较成功的,成交金额1.5亿美元是个不错的价钱。如果公司卖掉的价格是1亿的话,创业者的获利会因为Participating Liquidation Preference的存在而降一半。如果成交金额是5000万美元的话,创业者基本上拿不到什么钱了。这
个读者们可以自己下来算一算。

大部分创业者在同VC谈判的时候只注意公司估值,不注意别的条款,从这一个例子来看,创业者如果在B轮和C轮的时候适当降低估值,但同时不给投资者Participating Liquidation Preference的话,最后的收益要大得多。

还有一个因素要考虑的是,如果投资者有Participating Liquidation Preference的话,他们会比较有冲动把公司以一个较低的价格卖掉,而创业者的利益只有在高价时才能体现所以会更想冒风险。双方利益初始不一样,一定会造成董事会上的不合,互相猜忌,给公司长久的发展带来问题。

修正:C轮投资者拿走:2000 × 3 + 2000 × 10% × 1 = 6020万美元。所以创业者最后拿到一千四百万都不到。
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2010-08-11 14:54)
标签:

it

分类: IPhone
// The selection layer will pulse continuously.
// This is accomplished by setting a bloom filter on the layer
// create the filter and set its default values CIFilter *filter = [CIFilter filterWithName:@"CIBloom"]; [filter setDefaults]; [filter setValue:[NSNumber numberWithFloat:5.0] forKey:@"inputRadius"];
// name the filter so we can use the keypath to animate the inputIntensity // attribute of the filter [filter setName:@"pulseFilter"];
// set the filter to the selection layer's filters [selectionLayer setFilters:[NSArray arrayWithObject:filter]];
// create the animation that will handle the pulsing. CABasicAnimation* pulseAnimation = [CABasicAnimation animation];
// the attribute we want to animate is the inputIntensity // of the pulseFilter pulseAnimation.keyPath = @"filters.pulseFilter.inputIntensity";
// we want it to animate from the value 0 to 1 pulseAnimation.fromValue = [NSNumber numberWithFloat: 0.0]; pulseAnimation.toValue = [NSNumber numberWithFloat: 1.5];
// over a one second duration, and run an infinite // number of times pulseAnimation.duration = 1.0; pulseAnimation.repeatCount = 1e100f;
// we want it to fade on, and fade off, so it needs to // automatically autoreverse.. this causes the intensity // input to go from 0 to 1 to 0 pulseAnimation.autoreverses = YES;
// use a timing curve of easy in, easy out.. pulseAnimation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
// add the animation to the selection layer. This causes // it to begin animating. We'll use pulseAnimation as the // animation key name [selectionLayer addAnimation:pulseAnimation forKey:@"pulseAnimation"];
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

iphone

block

it

分类: IPhone

关于

block,如果你是懂Ruby的(比如我),那这个概念,就太自然不过了,你无需看后面了.

前言:
你是否有时候写程序,想
- (void)foo
{
     ...
     int age(char *name)
     {
          return 25;
     }
     for(int i = 0; i < 10; i++)
     {
          printf("%d age is %s\n", i, age(names[i]));
     }
     ...
     ...
}呢?你想临时定一个方法,甚至想定一个方法种的方法。
虽然是临是方法,可有的时候,甚至还想在别的文件里使用。。。

block,就为你的这个臆想应运而生的,...

正文:

Block object

Prerequisite Articles

(None)

Related Articles

Block objects are a C-level syntactic and runtime feature that allow you to compose function expression_rs that can be passed as arguments, optionally stored, and used by multiple threads. The function expression_r can reference and can preserve access to local variables. In other languages and environments, a block object is sometimes also called a closure or a lambda. You use a block when you want to create units of work (that is, code segments) that can be passed around as though they are values. Blocks offer more flexible programming and more power. You might use them, for example, to write callbacks or to perform an operation on all the items in a collection.

Declaring a Block

In many situations, you use blocks inline so you don’t need to declare them. The declaration syntax, however, is similar to the standard syntax for function pointers, except that you use a caret (^) instead of an asterisk pointer (*). For example, the following declares a variable aBlock that references a block that requires three parameters and returns a float value:

float (^aBlock)(const int*, int, float);

Creating a Block

You use the caret (^) operator to indicate the beginning, and a semicolon to indicate the end of a block expression_r. The following example declares a simple block and assigns it to a previously declared block variable (oneFrom):

int (^oneFrom)(int);
 

oneFrom = ^(int anInt) {
    return anInt - 1;
};

The closing semicolon is required as a standard C end-of-line marker.

If you don’t explicitly declare the return value of a block expression_r, it can be automatically inferred from the contents of the block.

Block-Mutable Variables

You can use the __block storage modifier with variables declared locally to the enclosing lexical scope to denote that such variables should be provided by reference in a block and so are mutable. Any changes are reflected in the enclosing lexical scope, including any other blocks defined within the same enclosing lexical scope.

Using Blocks

If you declare a block as a variable, you can use it as you would a function. The following example prints 9 as output.

printf("%d\n", oneFrom(10));

Typically, however, you pass a block as the argument to a function or a method. In these cases, you often create a block inline.

The following example determines whether an NSSet object contains a word specified by a local variable and sets the value of another local variable (found) to YES (and stops the search) if it does. In this example, found is declared as a __block variable.

__block BOOL found = NO;
NSSet *aSet = [NSSet setWithObjects: @"Alpha", @"Beta", @"Gamma", @"X", nil];
NSString *string = @"gamma";
 

[aSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
    if ([obj localizedCaseInsensitiveCompare:string] == NSOrderedSame) {
        *stop = YES;
        found = YES;
    }
}];
 

// At this point, found == YES

In this example, the block is contained within the method’s argument list. The block also makes use of a stack local variable.

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

it

1. 假设当前目录为/data/

2. 建立文件夹:
    mkdir repos

3. 创建仓库:
    (1) cd /data/repos/
    (2) svnadmin create myproj

4. 启动svn server:
    svnserve -d -r /data/repos/

5. 这样客户端就可以check out了:
    svn co svn://192.168.1.2/myproj/


如果出现下面的错误:
Can't open file '/Code/SVN/repos/db/txn-current-lock': Permission denied

下面是 解决方案:

这个主要原因:在svnadmin create时是root身份,所以,mod_dav_svn就没有write权限等。

 

解决办法:

写道
sudo chown -R wwwrun.www /Code/SVN/repos
sudo chmod -R 755 /Code/SVN/repos

 再试就ok~

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有