摘要: from:http://agapple.iteye.com/blog/1005918背景    周五下班回家,在公司班车上觉得无聊,看了下btrace的源码(自己反编译)。 一些关于btrace的基本内容,可以看下我早起的一篇记录:btrace记忆    上一篇主要介绍的是btrace的一些基本使用以及api,这里我想从btrace源码本...  阅读全文
posted @ 2015-12-18 18:08 小马歌 阅读(366) | 评论 (0)编辑 收藏
 

很多时候在online的应用出现问题时,很多时候我们需要知道更多的程序的运行细节,但又不可能在开发的时候就把程序中所有的运行细节都打印到日志上,通常这个时候能采取的就是修改代码,重新部署,然后再观察,但这种方法对于online应用来说不是很好,另外一方面如果碰到不好改的代码,例如引用的其他的外部的包什么的,就很麻烦了,BTrace就是一个可以在不改代码、不重启应用的情况下,动态的查看程序运行细节的工具,其官方网站在此:http://kenai.com/projects/btrace/ ,在这篇blog中,就来看看如何用BTrace来动态的监测方法的一些运行细节状况。
BTrace通过动态的挂接用java写的代码到运行时上来获取到一些运行细节,例如典型的使用btrace的方法为:
btrace -cp [btrace的jar所在的路径,默认为btrace/build下] [pid] [需要运行的java代码]
例如一段这样的代码:
[java]
import java.util.Random;
public class Case1{

public static void main(String[] args) throws Exception{
Random random=new Random();
CaseObject object=new CaseObject();
boolean result=true;
while(result){
result=object.execute(random.nextInt(1000));
Thread.sleep(1000);
}
}

}
public class CaseObject{

private static int sleepTotalTime=0;

public boolean execute(int sleepTime) throws Exception{
System.out.println("sleep: "+sleepTime);
sleepTotalTime+=sleepTime;
Thread.sleep(sleepTime);
return true;
}

}
[/java]
如在程序运行的情况下,想知道调用CaseObject的execute方法的以下几种情况,在BTrace中可以这么做:
1、调用此方法时传入的是什么参数,返回的是什么值,当时sleepTotalTime是多少?
BTrace脚本如下:
[java]
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;

@BTrace public class TraceMethodArgsAndReturn{
@OnMethod(
clazz="CaseObject",
method="execute",
location=@Location(Kind.RETURN)
)
public static void traceExecute(@Self CaseObject instance,int sleepTime,@Return boolean result){
println("call CaseObject.execute");
println(strcat("sleepTime is:",str(sleepTime)));
println(strcat("sleepTotalTime is:",str(get(field("CaseObject","sleepTotalTime"),instance))));
println(strcat("return value is:",str(result)));
}
}
[/java]
然后直接执行btrace -cp btrace/build [pid] TraceMethodArgsAndReturn.java就可以了。
当程序中调用到caseobject的execute方法时,就会在btrace的console中输出相应的信息。
2、execute方法执行耗时是多久?
BTrace脚本如下:
[java]
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;

@BTrace public class TraceMethodExecuteTime{

@TLS static long beginTime;

@OnMethod(
clazz="CaseObject",
method="execute"
)
public static void traceExecuteBegin(){
beginTime=timeMillis();
}

@OnMethod(
clazz="CaseObject",
method="execute",
location=@Location(Kind.RETURN)
)
public static void traceExecute(int sleepTime,@Return boolean result){
println(strcat(strcat("CaseObject.execute time is:",str(timeMillis()-beginTime)),"ms"));
}
}
[/java]
3、谁调用了execute方法?
BTrace脚本如下:
[java]
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;

@BTrace public class TraceMethodCallee{
@OnMethod(
clazz="CaseObject",
method="execute"
)
public static void traceExecute(){
println("who call CaseObject.execute :");
jstack();
}
}
[/java]
4、有没有人调用CaseObject中的哪一行代码?
BTrace脚本如下:
[java]
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;

@BTrace public class TraceMethodLine{
@OnMethod(
clazz="CaseObject",
location=@Location(value=Kind.LINE,line=5)
)
public static void traceExecute(@ProbeClassName String pcn,@ProbeMethodName String pmn,int line){
println(strcat(strcat(strcat("call ",pcn),"."),pmn));
}
}
[/java]
从上面可看出,在有了BTrace后,要动态的跟踪代码的运行细节还是非常爽的,更多的细节的操作请大家查看BTrace的User Guide

posted @ 2015-12-18 14:52 小马歌 阅读(297) | 评论 (0)编辑 收藏
 
mvn install:install-file -Dfile=D:/spymemcached-2.10.3.jar -DgroupId=net.spy -DartifactId=spymemcached -Dversion=2.10.3 -Dpackaging=jar
mvn install:install-file -Dfile=D:/spymemcached-2.10.3-sources.jar -DgroupId=net.spy -DartifactId=spymemcached -Dversion=2.10.3 -Dpackaging=jar -Dclassifier=sources
mvn install:install-file -Dfile=D:/spymemcached-2.10.3-javadoc.jar -DgroupId=net.spy -DartifactId=spymemcached -Dversion=2.10.3 -Dpackaging=jar -Dclassifier=javadoc
posted @ 2015-12-17 18:58 小马歌 阅读(290) | 评论 (0)编辑 收藏
 

很荣幸,作为这样一款业界使用率和好评率出众的RPC框架的维护者,今天这个文章主要是想帮助那些热爱开源的同学,更好的来研究dubbo的源代码。

 一、Dubbo整体架构

1、Dubbo与Spring的整合
Dubbo在使用上可以做到非常简单,不管是Provider还是Consumer都可以通过Spring的配置文件进行配置,配置完之后,就可以像使用spring bean一样进行服务暴露和调用了,完全看不到dubbo api的存在。这是因为dubbo使用了spring提供的可扩展Schema自定义配置支持。在spring配置文件中,可以像、这样进行配置。META-INF下的spring.handlers文件中指定了dubbo的xml解析类:DubboNamespaceHandler。像前面的被解析成ServiceConfig,被解析成ReferenceConfig等等。
2、jdk spi扩展
由于Dubbo是开源框架,必须要提供很多的可扩展点。Dubbo是通过扩展jdk spi机制来实现可扩展的。具体来说,就是在META-INF目录下,放置文件名为接口全称,文件中为key、value键值对,value为具体实现类的全类名,key为标志值。由于dubbo使用了url总线的设计,即很多参数通过URL对象来传递,在实际中,具体要用到哪个值,可以通过url中的参数值来指定。
Dubbo对spi的扩展是通过ExtensionLoader来实现的,查看ExtensionLoader的源码,可以看到Dubbo对jdk spi做了三个方面的扩展:

(1)jdk spi仅仅通过接口类名获取所有实现,而ExtensionLoader则通过接口类名和key值获取一个实现;

(2)Adaptive实现,就是生成一个代理类,这样就可以根据实际调用时的一些参数动态决定要调用的类了。

(3)自动包装实现,这种实现的类一般是自动激活的,常用于包装类,比如Protocol的两个实现类:ProtocolFilterWrapper、ProtocolListenerWrapper。
3、url总线设计
Dubbo为了使得各层解耦,采用了url总线的设计。我们通常的设计会把层与层之间的交互参数做成Model,这样层与层之间沟通成本比较大,扩展起来也比较麻烦。因此,Dubbo把各层之间的通信都采用url的形式。比如,注册中心启动时,参数的url为:
registry://0.0.0.0:9090?codec=registry&transporter=netty
这就表示当前是注册中心,绑定到所有ip,端口是9090,解析器类型是registry,使用的底层网络通信框架是netty。

 二、Dubbo启动过程

Dubbo分为注册中心、服务提供者(provider)、服务消费者(consumer)三个部分。
1、注册中心启动过程
注册中心的启动过程,主要看两个类:RegistrySynchronizer、RegistryReceiver,两个类的初始化方法都是start。
RegistrySynchronizer的start方法:

(1)把所有配置信息load到内存;

(2)把当前注册中心信息保存到数据库;

(3)启动5个定时器。
5个定时器的功能是:
(1)AutoRedirectTask,自动重定向定时器。默认1小时运行1次。如果当前注册中心的连接数高于平均值的1.2倍,则将多出来的连接数重定向到其他注册中心上,以达到注册中心集群的连接数均衡。
(2)DirtyCheckTask,脏数据检查定时器。作用是:分别检查缓存provider、数据库provider、缓存consumer、数据库consumer的数据,清除脏数据;清理不存活的provider和consumer数据;对于缓存中的存在的provider或consumer而数据库不存在,重新注册和订阅。
(3)ChangedClearTask,changes变更表的定时清理任务。作用是读取changes表,清除过期数据。
(4)AlivedCheckTask,注册中心存活状态定时检查,会定时更新registries表的expire字段,用以判断注册中心的存活状态。如果有新的注册中心,发送同步消息,将当前所有注册中心的地址通知到所有客户端。
(5)ChangedCheckTask,变更检查定时器。检查changes表的变更,检查类型包括:参数覆盖变更、路由变更、服务消费者变更、权重变更、负载均衡变更。
RegistryReceiver的start方法:启动注册中心服务。默认使用netty框架,绑定本机的9090端口。最后启动服务的过程是在NettyServer来完成的。接收消息时,抛开dubbo协议的解码器,调用类的顺序是

NettyHandler-》NettyServer-》MultiMessageHandler-》HeartbeatHandler-》AllDispatcher-》 DecodeHandler-》HeaderExchangeHandler-》RegistryReceiver-》RegistryValidator-》RegistryFailover-》RegistryExecutor

2、provider启动过程
provider的启动过程是从ServiceConfig的export方法开始进行的,具体步骤是:
(1)进行本地jvm的暴露,不开放任何端口,以提供injvm这种形式的调用,这种调用只是本地调用,不涉及进程间通信。
(2)调用RegistryProtocol的export。
(3)调用DubboProtocol的export,默认开启20880端口,用以提供接收consumer的远程调用服务。
(4)通过新建RemoteRegistry来建立与注册中心的连接。
(5)将服务地址注册到注册中心。
(6)去注册中心订阅自己的服务。
3、consumer启动过程
consumer的启动过程是通过ReferenceConfig的get方法进行的,具体步骤是:
(1)通过新建RemoteRegistry来建立与注册中心的连接。
(2)新建RegistryDirectory并向注册中心订阅服务,RegistryDirectory用以维护注册中心获取的服务相关信息。
(3)创建代理类,发起consumer远程调用时,实际调用的是InvokerInvocationHandler。

三、实际调用过程
consumer端发起调用时,实际调用经过的类是:
1、consumer:

InvokerInvocationHandler-》MockClusterInvoker(如果配置了Mock,则直接调用本地Mock类)-》FailoverClusterInvoker(负载均衡,容错机制,默认在发生错误的情况下,进行两次重试)-》RegistryDirectory$InvokerDelegete-》ConsumerContextFilter-》FutureFilter->DubboInvoker

2、provider:

NettyServer-》MultiMessageHandler-》HeartbeatHandler-》AllDispatcher-》DecodeHandler-》HeaderExchangeHandler-》DubboProtocol.requestHandler-》EchoFilter-》ClassLoaderFilter-》GenericFilter-》ContextFilter-》ExceptionFilter-》TimeoutFilter-》MonitorFilter-》TraceFilter-》实际service

四、Dubbo使用的设计模式
1、工厂模式
ServiceConfig中有个字段,代码是这样的:

private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

Dubbo里有很多这种代码。这也是一种工厂模式,只是实现类的获取采用了jdk spi的机制。这么实现的优点是可扩展性强,想要扩展实现,只需要在classpath下增加个文件就可以了,代码零侵入。另外,像上面的Adaptive实现,可以做到调用时动态决定调用哪个实现,但是由于这种实现采用了动态代理,会造成代码调试比较麻烦,需要分析出实际调用的实现类。
2、装饰器模式
Dubbo在启动和调用阶段都大量使用了装饰器模式。以Provider提供的调用链为例,具体的调用链代码是在ProtocolFilterWrapper的buildInvokerChain完成的,具体是将注解中含有group=provider的Filter实现,按照order排序,最后的调用顺序是

EchoFilter-》ClassLoaderFilter-》GenericFilter-》ContextFilter-》ExceptionFilter-》 TimeoutFilter-》MonitorFilter-》TraceFilter

更确切地说,这里是装饰器和责任链模式的混合使用。例如,EchoFilter的作用是判断是否是回声测试请求,是的话直接返回内容,这是一种责任链的体现。而像ClassLoaderFilter则只是在主功能上添加了功能,更改当前线程的ClassLoader,这是典型的装饰器模式。
3、观察者模式
Dubbo的provider启动时,需要与注册中心交互,先注册自己的服务,再订阅自己的服务,订阅时,采用了观察者模式,开启一个listener。注册中心会每5秒定时检查是否有服务更新,如果有更新,向该服务的提供者发送一个notify消息,provider接受到notify消息后,即运行NotifyListener的notify方法,执行监听器方法。
4、动态代理模式
Dubbo扩展jdk spi的类ExtensionLoader的Adaptive实现是典型的动态代理实现。Dubbo需要灵活地控制实现类,即在调用阶段动态地根据参数决定调用哪个实现类,所以采用先生成代理类的方法,能够做到灵活的调用。生成代理类的代码是ExtensionLoader的createAdaptiveExtensionClassCode方法。代理类的主要逻辑是,获取URL参数中指定参数的值作为获取实现类的key。

 

posted @ 2015-12-15 19:25 小马歌 阅读(218) | 评论 (0)编辑 收藏
 
摘要:Google于2004年公布了MapReduce论文,为数据领域工作者开启了大数据算法之门。然而Google的大数据脚步显然不止于此,其后公布了Percolator、Pregel、Dremel、Spanner等多篇论文。没有止步的不仅是Google,很多公司也跟随其脚步开发了很多优秀的产品,虽然其中不乏模仿。

Mikio L. Braun柏林工业大学机器学习学博士后,TWIMPACT联合创始人兼首席数据科学家。在其个人博客上总结了Google近几年大数据领域的论文,并发表了自己的见解。

以下为译文:

主流的大数据基本都是MapReduce的衍生,然而把目光聚焦到实时上就会发现:MapReuce的局限性已经渐渐浮现。下面将讨论一下自大数据开始,Google公布的大数据相关技术,以及这些技术的现状。

MapReuce、Google File System以及Bigtable:大数据算法的起源

按时间算第一篇的论文应该2003年公布的 Google File System,这是一个分布式文件系统。从根本上说:文件被分割成很多块,使用冗余的方式储存于商用机器集群上;这里不得不说基本上Google每篇论文都是关于“商用机型”。

紧随其后的就是2004年被公布的 MapReduce,而今MapReuce基本上已经代表了大数据。传说中,Google使用它计算他们的搜索索引。而Mikio L. Braun认为其工作模式应该是:Google把所有抓取的页面都放置于他们的集群上,并且每天都使用MapReduce来重算。

Bigtable发布于2006年,启发了无数的NoSQL数据库,比如:Cassandra、HBase等等。Cassandra架构中有一半是模仿Bigtable,包括了数据模型、SSTables以及提前写日志(另一半是模仿Amazon的Dynamo数据库,使用点对点集群模式)。

Percolator:处理个体修改

Google并没有止步于MapReduce。事实上,随着Internet的指数增长,从零开始重算所有搜索索引变得不切实际。取而代之,Google开发了一个更有价值的系统,同样支持分布式计算。

这也是其有趣的地方,特别是在对比常见的主流大数据之后。举个例子,Percolator引入了事务,而一些NoSQL数据库仍然在强调得到高扩展性的同时你必须牺牲(或者不再需要)事务处理。

在2010年这篇 Percolator的论文中,Google展示了其网络搜索是如何保持着与时俱进。Percolator建立于已存类似Bigtable的技术,但是加入了事务以及行和表上的锁和表变化的通知。这些通知之后会被用于触发不同阶段的计算。通过这样的方式,个体的更新就可以“渗透”整个数据库。

这种方法会让人联想到类似Storm(或者是Yahoo的S4)的流处理框架(SPF),然而Percolator内在是以数据作为基础。SPF使用的一般是消息传递而不是数据共享,这样的话更容易推测出究竟是发生了什么。然而问题也随之产生:除非你手动的在某个终端上储存,否则你将无法访问计算的结果。

Pregel:可扩展的图计算

最终Google还需要挖掘图数据,比如在线社交网络的社交图谱;所以他们开发了 Pregel,并在2010年公布其论文。

Pregel内在的计算模型比MapReduce复杂的多:基本上每个节点都拥有一个工作者线程,并且对众多工作者线程进行迭代并行。在每一个所谓的“superstep”中,每一个工作者线程都可以从节点的“收件夹”中读取消息和把消息发送给其它节点,设置和读取节点相关值以及边界,或者投票停止。线程会一直运行,直到所有的节点都被投票停止。此外,还拥有Aggregator和Combiner做全局统计。

论文陈述了许多算法的实现,比如Google的PageRank、最短路径、二分图匹配等。Mikio L. Braun认为,对比MapReduce或SPF,Pregel需要更多实现的再思考。

Dremel:在线可视化

在2010年,Google还公布了 Dremel论文。一个为结构化数据设计,并拥有类SQL语言的交互式数据库。然而取代SQL数据库使用字段填补的表格,Dremel中使用的是类JSON格式数据(更准确的说,使用Google Protocol buffer格式,这将加强对允许字段的限制)。内部,数据被使用特殊格式储存,可以让数据扫描工作来的更高效。查询被送往服务器,而优秀的格式可以最大性能的输出结果。

Spanner:全球分布

最后 Spanner—— 全球分布式数据库;Google在2009年提出了Spanner远景计划,并在2012年对外公布Spanner论文。Spanner的公布可以说是Google向大数据技术中添的又一把火,Spanner具有高扩展性、多版本、全球级分布以及同步复制等特性。

跨数据中心的高扩展性及全球分布会对一致性保障提出苛刻的需求 —— 读写的外部一致性和基于时间戳的全局读一致性。为了保障这一点,Google引入了TrueTime API。TureTime API可以同步全球的时间,拥有一个TT.now()的方法,将获得一个绝对时间,同时还能得到时间误差。为了保证万无一失,TrueTime API具有GPS和原子钟双保险。也只有这样的机制才能让全球范围内的并发处理得到保障。

大数据超越MapReduce

Google并没有止步于MapReduce,他们在MapReduce不适用的地方开发新方法;当然,对于大数据领域来说这是个福音。MapReduce不是万能的;当然,你可以更深入一步,比如说将磁盘数据移入内存,然而同样还存在一些任务的内部结构并不是MapReduce可以扩展的。

在Google思路以及论文的启发下,同样涌现出一些开源项目,比如:Apache Drill、Apache Giraph、斯坦福GPS等等。

Google近年来每篇论文都有着深远的影响,同时大数据领域内有很多人必然在翘首以盼Google的下一篇论文。

原文链接: Big Data beyond MapReduce: Google's Big Data papers (编译/仲浩 审校/王旭东)

欢迎 @CSDN云计算 微博参与讨论,了解更多云信息。

posted @ 2015-12-11 11:18 小马歌 阅读(286) | 评论 (0)编辑 收藏
 
摘要:7月22日,阿里云正式对外发布了企业级互联网架构解决方案,该服务由EDAS应用框架、ONS消息队列、DRDS分布式数据库组成,能有效解决企业上云后网站过载、性能瓶颈、重复开发等问题。

7月22日,阿里云正式对外发布了企业级互联网架构解决方案,该服务由EDAS应用框架、ONS消息队列、DRDS分布式数据库组成,能有效解决企业上云后网站过载、性能瓶颈、重复开发等问题。

云栖大会武汉站,阿里云中间件团队首次解密这一企业级互联网架构解决方案。

EDAS,企业级分布式应用服务

EDAS(企业级分布式应用服务,Enterprise Distributed Application Service)是一个以阿里巴巴中间件团队的多款久经沙场的分布式产品作为核心基础组件构建的企业级云计算解决方案,其充分利用阿里云的ECS等资源,引入淘宝中间件整套成熟的分布式计算框架(包括分布式服务化、链路追踪和稳定性组件等),以应用为中心,帮助企业级客户在阿里云上轻松构建像淘宝这样的大型分布式应用服务。

具备单应用5K运维能力的一站式PaaS平台

应用全生命周期管理

EDAS能够非常方便的帮助企业级客户实现一站式的应用生命周期管理,其以“应用”为中心,从应用的创建开始,到应用的部署与扩容,真正意义上实现对大规模互联网应用在发布和运行过程中的全面管理。

单应用5K运维能力

依托于阿里巴巴多年对超大规模互联网电商系统的运维,所沉淀下来宝贵经验和大量运维工具都融入于EDAS产品之中,使得其具备对单个应用多达5000台服务器规模的快速发布能力,包括个性化的Beta和分批发布机制。

去“中心化”的高性能服务框架

EDAS所提供的分布式服务框架,源自于阿里巴巴内部使用规模最大的中间件产品——HSF。自2007年诞生以来,HSF服务框架就成为了阿里巴巴内部服务化改造的基础组件,其超高的性能、久经考验的稳定性、以及良好的用户体验,支撑了生产环境所有系统的服务化调用,日均调用量为2000~3000亿次,分钟峰值最高达到25亿次。

和传统基于企业服务总线的架构所截然不同的是,HSF服务框架采用了去“中心化”的系统架构,服务的提供者和调用者都直接相连,这样的系统架构不仅去除了中心单点的风险,还能大大提高调用效率。

鹰眼:分布式全链路跟踪系统

EDAS所提供的鹰眼跟踪系统,通过收集和分析在网络调用上的日志埋点,可以得到同一次请求上的各个系统的调用链关系,有助于梳理应用的请求入口与服务的调用来源、依赖关系,同时,也对分析系统调用瓶颈、估算链路容量、快速定位异常有很大帮助。

全面的基础和应用监控

EDAS不仅提供了CPU、内存和Load等维度的基础监控指标,还提供了针对HTTP入口、提供HSF服务的调用QPS和消费HSF服务的调用QPS等应用层面的监控指标,帮助客户更为精准全面的对自己的系统进行监控。

弹性伸缩

EDAS提供了手动和自动两种模式的弹性伸缩。通过全面的基础和应用监控,客户能够轻松的实现应用的扩容和缩容。

限流降级/容量规划:打造健全的服务化体系

千万不要以为使用一套RPC框架就算是完成服务化的工作了——这仅仅是服务化的冰山一角,尤其是针对企业级的大规模互联网应用,使用RPC框架进行系统的服务化改造后,所带来的服务治理的挑战,才是企业级系统服务化的开始。EDAS提供了一系列的服务治理工具,能够帮助企业级客户打造健全的服务化体系。

限流降级

服务的限流能够帮助客户在面对大促的时候,从容的做到核心业务与非核心业务的区别对待,最大化的在服务的可用性和用户的体验性上达到平衡。

服务的降级则能够帮助客户很好的规避由于依赖的服务不可用而引发的问题。当依赖的服务出现不可用情况,可以自定义的配置规则来确定对应的降级方案。

这些限流降级工具都已经经受了多次双十一大促的考验。

容量规划

EDAS提供了特有的容量规划功能,通过自动压测,可以测算出当前系统的容量。同时,通过容量模型(当前系统容量、希望支撑的容量和当前应用机器数等)的建立,能够持续的对系统进行容量规划,这将方便客户对未来流量增长情况下,提前科学准确的预估出应用所需要的机器数。

EDAS核心功能展示

posted @ 2015-12-10 19:46 小马歌 阅读(261) | 评论 (0)编辑 收藏
 
     摘要: 作者:Benjamin H. Sigelman, Luiz Andr´e Barroso, Mike Burrows, Pat Stephenson, Manoj Plakal, Donald Beaver, Saul Jaspan, Chandan ShanbhagView project onGitHub概述当代的互联网的服务,通常都是用复杂的、大规模分布式集群来实现的。互联网应用构...  阅读全文
posted @ 2015-12-10 19:45 小马歌 阅读(223) | 评论 (0)编辑 收藏
 

本文介绍了Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用的相关步骤,希望对大家有所帮助。


        通过远在大洋彼岸的苹果服务器下载东西,确实有够慢啊!AppStore更甚:甚至都经常提示连不上服务器,而有些软件呢,还必须从AppStore下载安装,所以没办法,谁让上了苹果的贼船呢!公司的网速更是不敢恭维,以至于基本上不下东西,除非像这次一样:手贱的把iPhone6升级到8.2.2了,然后Xcode6.1.1真机调试不成了,所以需要下个Xcode6.2。昨天刚更新的Xcode6.2,没有看国内有同胞下载下来没,一般我都是会从官网下载一个保存到百度网盘以供自己和别人使用的。但是迅雷、浏览器下载的都很慢,于是我就通过AppStore更新,貌似还有点儿小快呢(不知道是不是心理作用)!

        但是又有一个问题:AppStore安装完后会删除安装包,而且也不知道路径在哪儿,这我怎么能容忍!!!因为公司还有好多电脑要装呢!!!于是乎,就参考网络上的各种资源,找到了下载的路径~~~



废话不多说了,上步骤(前提:正在安装一个程序,例如我正在安装Xcode):

1.如图所示:从应用中打开活动监视器:

技术分享


        打开后如图所示:

技术分享


2.找到进程storedownloadd(以前的是storeagent进程,到10.10之后是storedownloadd这个进程):

技术分享


3.点击左上角第二个:查看所选进程的信息:

技术分享




4.选择第三个标签:打开的文件和端口

技术分享


5.command + F,找到以.pkg结尾的路径并且拷贝,如下图所示:


技术分享

6.在Finder中前往文件夹:

技术分享


7.粘贴复制的路径,并且回车

技术分享


8.如下图一样的pkg包就是下载的安装包

技术分享



        注意,这一点非常重要第一:不要把这个包早拷出来:因为还没有下载完成;第二:不要等安装完再拷:安装完系统会把这个包删除的。一定要抓住机会,在系统安装程序的时候以迅雷不及掩耳盗铃儿响叮当之势,把它拉出来~~~


例如下载的Xcode:

        正在下载:

技术分享

        快完了,一定要看住:

        技术分享

        我这个是下载完了的,因为我打开了Xcode,所以桌面弹出了一个警告框让我关闭,我直接拖出来了,所以还没有出现正在安装。如果没有打开正在安装的程序,这里会显示:正在安装,就是这个时候抓住这一瞬间,把pkg拖出来,完工~~~


        现在好了,整个世界平静了,下载的软件被我们揪住了,然后双击安装即可。安装完后还可以拷到其他的电脑上进行安装,省的再次下载了~~~

技术分享


        通过这种方式得到的安装包和从苹果官网下载的安装包不一样:苹果官网下载的时后缀为.dmg的镜像,里面包含.pkg的安装包,而这个直接就是pkg的包,双击安装即可~~~


        希望对大家有所帮助!!!




本文出自 “一毛” 博客,请务必保留此出处http://winann.blog.51cto.com/4424329/1619352

posted @ 2015-10-21 12:29 小马歌 阅读(257) | 评论 (0)编辑 收藏
 
org.springframework.web.util.NestedServletExceptio n: Request processing failed; nested exception is java.lang.IllegalArgumentException: Model has no value for 


@RequestMapping("/test7/{id}")
    public ModelAndView test7(ModelAndView view, @PathVariable("id") int id) {
        RedirectView redirectView = new RedirectView("/index{id}");
        redirectView.setExpandUriTemplateVariables(false);
        redirectView.setExposeModelAttributes(false);
        view.setView(redirectView);
        view.addObject("test", "test");
        return view;
    }
posted @ 2015-10-19 21:54 小马歌 阅读(588) | 评论 (0)编辑 收藏
 

from:http://blog.csdn.net/yh_bxhl/article/details/7684318

头衔: 技术总监(Chief Technology Officer)

技术总监最重要的工作职责是领导公司技术团队,执行、开发和部署公司的互联网项目,进而保证公司的商业目标得以实现。要做到这一点,技术总监必须能够参与制定公司的商业战略,带领团队实施互联网项目的开发,预知各种潜在风险及业务发展瓶颈,并为此做好相应计划准备。

职责描述之一:战略和计划

  • 与公司创始人紧密协作,对公司的互联网项目进行合理评估。评估内容包括:市场机会、风险、竞争优势、市场风险、影响商业成功的技术瓶颈等。
  • 了解技术发展趋势,发展自己的社会和职业关系,帮组和促进商业目标的成功。
  • 发现和评估各种技术、平台、框架。
  • 为技术团队的开发工作制定宏观战略目标,包括:目标制定,优先排序,路线图制定等。
  • 作为公司高层管理者之一,参与监管公司产品发展走向,确保实现公司战略目标,降低商业风险,优化并合理利用公司资源。技术总监尤其需要在如下方面承担责任:软件开发、办公室软硬件管理、网络、和公司通讯设备。
  • 协调公司各部门,评估和推荐相关技术,满足公司整体IT需求;
  • 建立完整的信息保护机制,保证公司、合作伙伴、和用户的信息安全。
  • 建立完整的信息安全机制,保护公司数据的机密、完整、以及数据服务的正常运行。
  • 建立完整的灾难恢复预案,保证公司产品或服务在遭遇任何攻击或不可预知的灾难的情况下,能够快速恢复正常服务。
  • 必要情况下,将公司的技术战略向投资人、管理者、员工、合作伙伴、顾客、和持股人进行解释说明。

职责描述之二:项目开发和部署

  • 参与公司互联网项目的域名选择,包括任何相关但不会被使用的域名,以避免未来可能的竞争和恶意钓鱼行为。管理公司注册的域名,定期续费,保证所有域名不会丢失。
  • 协调系统管理员,建立公司的企业电子邮件服务。
  • 协调系统管理员,建立软件开发的版本控制系统。
  • 选型并协调系统管理员,建立开发团队的内部沟通系统,例如,wiki、博客、即时通讯工具、项目管理工具、bug提交系统等。
  • 协调公司管理高层和潜在客户,绘制系统用例,为产品的开发形成相应的需求和规范。
  • 协调用户体验设计师和产品客户,为产品绘制原型图。
  • 协调网站设计师,根据产品原型和已建立的明确需求,为产品进行视觉设计。
  • 协调网站前端设计师,遵循相关制作标准,将设计转化成前端代码 (HTML/CSS/JavaScript)。
  • 选择和确定产品开发模式。
  • 根据需求书和用户体验设计建立测试计划。
  • 制定代码规范和文档规范。
  • 评估和选型开发框架,部署基础系统。
  • 招聘、组建、和管理产品开发团队(或选择管理外包开发团队)。
  • 监控产品开发流程,开发目标拆解、制定长、中、短期开发目标。
  • 建立质量控制体系,保证代码的高质高效。
  • 监控产品执行性能,选择和部署相关工具对开发中系统进行性能测试。
  • 管理和控制产品版本更新。
  • 评估和选择与产品有关的IDC服务商。
  • 建立产品发布过程,负责测试版本和正式版本的切换发布过程。
  • 建立产品流量监控体系。
  • 支持互联网营销和管理搜索引擎优化。
  • 建立用户反馈和支持体系,保证用户反馈可以传达到公司管理层和产品团队。建立用户帮助服务体系,保证用户使用产品过程所遇到的问题能够得到迅速解决。保证产品可用性持续提高。

职责描述之三:运营管理

  • 保持知识更新,关注行业趋势,了解最新技术,不断探索软件发展的最佳实践。
  • 参与定义、形成、宣传公司价值和文化。
  • 确保技术标准和最佳管理实践在整个组织的贯彻和执行。
  • 建立技术团队培训机制,确保知识在整个开发团队的持续增加和分享。利用各种机会将公司的技术理念、机会、和挑战传播给公司的投资人、管理高层、员工、合作伙伴、终端用户。
  • 确保公司的技术瓶颈在最短时间内,以最低投入方式得以解决。
  • 参与制定年度预算,并确保技术团队发展和项目开发在年度预算内完成。
  • 参与技术团队人才招聘,保证公司的雇佣流程和薪金制定与行业和人才市场的通用标准一致。
  • 建立技术团队各种角色的工作考察标准,根据这些标准对每个员工进行考察。
  • 建立外包团队工作审核标准,制定服务等级合同,并通过合同对外包团队进行有效管理。
posted @ 2015-10-12 08:51 小马歌 阅读(650) | 评论 (1)编辑 收藏
仅列出标题
共95页: First 上一页 8 9 10 11 12 13 14 15 16 下一页 Last