MyBatis 缓存机制深度解剖

MyBatis 缓存机制深度解剖
MyBatis 缓存机制深度解剖

缓存概述

?正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持;

?一级缓存基于PerpetualCache的 HashMap 本地缓存,其存储作用域为Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。

?二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自

定义存储源,如 Ehcache、Hazelcast等。

?对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的

缓存将被clear。

?MyBatis 的缓存采用了delegate机制及装饰器模式设计,当put、get、remove时,其中会经过多层 delegate cache 处理,其Cache类别有:

BaseCache(基础缓存)、EvictionCache(排除算法缓存) 、

DecoratorCache(装饰器缓存):

BaseCache :为缓存数据最终存储的处理类,默认为 PerpetualCache,

基于Map存储;可自定义存储处理,如基于EhCache、Memcached等;

EvictionCache :当缓存数量达到一定大小后,将通过算法对缓存数据进

行清除。默认采用 Lru 算法(LruCache),提供有 fifo 算法(FifoCache)

等;

DecoratorCache:缓存put/get处理前后的装饰器,如使用 LoggingCache 输出缓存命中日志信息、使用 SerializedCache 对 Cache的数据 put

或get 进行序列化及反序列化处理、当设置flushInterval(默认1/h)后,则使用 ScheduledCache 对缓存数据进行定时刷新等。

?一般缓存框架的数据结构基本上都是 Key-Value 方式存储,MyBatis 对于其 Key 的生成采取规则为:[hashcode : checksum : mappedStementId : offset : limit : executeSql : queryParams]。

?对于并发 Read/Write 时缓存数据的同步问题,MyBatis 默认基于JDK/concurrent中的ReadWriteLock,使用ReentrantReadWriteLock的

实现,从而通过 Lock 机制防止在并发 Write Cache 过程中线程安全问

题。

源码剖解

接下来将结合 MyBatis 序列图进行源码分析。在分析其Cache前,先看看其整个处理过程。

执行过程:

① 通常情况下,我们需要在 Service 层调用 Mapper Interface 中的方法实现对数据库的操作,上述根据产品 ID 获取 Product 对象。

② 当调用 ProductMapper 时中的方法时,其实这里所调用的是MapperProxy 中的方法,并且 MapperProxy已经将将所有方法拦截,其具体原理及分析,参考MyBatis+Spring基于接口编程的原理分析,其 invoke 方法代码为:

Java代码

1.//当调用 Mapper 所有的方法时,将都交由Proxy 中的 invoke 处理:

2.public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

3.try {

4.if (!OBJECT_METHODS.contains(method.getName())) {

5.final Class declaringInterface = findDeclaringInterface(proxy,

method);

6.// 最终交由 MapperMethod 类处理数据库操作,初始化 MapperMethod

对象

7.final MapperMethod mapperMethod = new

MapperMethod(declaringInterface, method, sqlSession);

8.// 执行 mapper method,返回执行结果

9.final Object result = mapperMethod.execute(args);

10.....

11.return result;

12.}

13.} catch (SQLException e) {

14.e.printStackTrace();

15.}

16.return null;

17.}

③其中的 mapperMethod 中的 execute 方法代码如下:

Java代码

1.public Object execute(Object[] args) throws SQLException {

2.Object result;

3.// 根据不同的操作类别,调用 DefaultSqlSession 中的执行处理

4.if (SqlCommandType.INSERT == type) {

5.Object param = getParam(args);

6.result = sqlSession.insert(commandName, param);

7.} else if (SqlCommandType.UPDATE == type) {

8.Object param = getParam(args);

9.result = sqlSession.update(commandName, param);

10.} else if (SqlCommandType.DELETE == type) {

11.Object param = getParam(args);

12.result = sqlSession.delete(commandName, param);

13.} else if (SqlCommandType.SELECT == type) {

14.if (returnsList) {

15.result = executeForList(args);

16.} else {

17.Object param = getParam(args);

18.result = sqlSession.selectOne(commandName, param);

19.}

20.} else {

21.throw new BindingException("Unkown execution method for: " +

commandName);

22.}

23.return result;

24.}

由于这里是根据 ID 进行查询,所以最终调用为 sqlSession.selectOne函数。也就是接下来的的 DefaultSqlSession.selectOne 执行;

④ ⑤ 可以在DefaultSqlSession看到,其 selectOne 调用了 selectList 方法:

Java代码

1.public Object selectOne(String statement, Object parameter) {

2.List list = selectList(statement, parameter);

3.if (list.size() == 1) {

4.return list.get(0);

5.}

6....

7.}

8.

9.public List selectList(String statement, Object parameter,

RowBounds rowBounds) {

10.try {

11.MappedStatement ms =

configuration.getMappedStatement(statement);

12.// 如果启动用了Cache 才调用 CachingExecutor.query,反之则使用

BaseExcutor.query 进行数据库查询

13.return executor.query(ms, wrapCollection(parameter), rowBounds,

Executor.NO_RESULT_HANDLER);

14.} catch (Exception e) {

15.throw ExceptionFactory.wrapException("Error querying database.

Cause: " + e, e);

16.} finally {

17.ErrorContext.instance().reset();

18.}

19.}

⑥到这里,已经执行到具体数据查询的流程,在分析 CachingExcutor.query 前,先看看 MyBatis 中 Executor 的结构及构建过程。

执行器(Executor):

Executor: 执行器接口。也是最终执行数据获取及更新的实例。其类结构如下:

BaseExecutor: 基础执行器抽象类。实现一些通用方法,如createCacheKey 之类。并且采用模板模式将具体的数据库操作逻辑(doUpdate、doQuery)交由子类实现。另外,可以看到变量localCache: PerpetualCache,在该类采用PerpetualCache 实现基于 Map 存储的一级缓存,其 query 方法如下:

Java代码

1.public List query(MappedStatement ms, Object parameter, RowBounds

rowBounds, ResultHandler resultHandler) throws SQLException {

2.ErrorContext.instance().resource(ms.getResource()).activity("ex

ecuting a query").object(ms.getId());

3.// 执行器已关闭

4.if (closed) throw new ExecutorException("Executor was closed.");

5.List list;

6.try {

7.queryStack++;

8.// 创建缓存Key

9.CacheKey key = createCacheKey(ms, parameter, rowBounds);

10.// 从本地缓存在中获取该 key 所对应的结果集

11.final List cachedList = (List) localCache.getObject(key);

12.// 在缓存中找到数据

13.if (cachedList != null) {

14.list = cachedList;

15.} else { // 未从本地缓存中找到数据,开始调用数据库查询

16.//为该 key 添加一个占位标记

17.localCache.putObject(key, EXECUTION_PLACEHOLDER);

18.try {

19.// 执行子类所实现的数据库查询操作

20.list = doQuery(ms, parameter, rowBounds, resultHandler);

21.} finally {

22.// 删除该 key 的占位标记

23.localCache.removeObject(key);

24.}

25.// 将db中的数据添加至本地缓存中

26.localCache.putObject(key, list);

27.}

28.} finally {

29.queryStack--;

30.}

31.// 刷新当前队列中的所有 DeferredLoad实例,更新 MateObject

32.if (queryStack == 0) {

33.for (DeferredLoad deferredLoad : deferredLoads) {

34.deferredLoad.load();

35.}

36.}

37.return list;

38.}

BatchExcutor、ReuseExcutor、 SimpleExcutor: 这几个就没什么好说的了,继承了 BaseExcutor 的实现其 doQuery、doUpdate 等方法,同样都是采用 JDBC 对数据库进行操作;三者区别在于,批量执行、重用 Statement 执行、普通方式执行。具体应用及场景在Mybatis 的文档上都有详细说明。

CachingExecutor: 二级缓存执行器。个人觉得这里设计的不错,灵活地使用delegate机制。其委托执行的类是 BaseExcutor。当无法从二级缓存获取数据时,同样需要从 DB 中进行查询,于是在这里可以直接委托给 BaseExcutor 进行查询。其大概流程为:

流程为:从二级缓存中进行查询 -> [如果缓存中没有,委托给 BaseExecutor] -> 进入一级缓存中查询 -> [如果也没有] -> 则执行 JDBC 查询,其 query 代码如下:

Java代码

1.public List query(MappedStatement ms, Object parameterObject,

RowBounds rowBounds, ResultHandler resultHandler) throws

SQLException {

2.if (ms != null) {

3.// 获取二级缓存实例

4.Cache cache = ms.getCache();

5.if (cache != null) {

6.flushCacheIfRequired(ms);

7.// 获取读锁( Read锁可由多个Read线程同时保持)

8.cache.getReadWriteLock().readLock().lock();

9.try {

10.// 当前 Statement 是否启用了二级缓存

11.if (ms.isUseCache()) {

12.// 将创建 cache key 委托给 BaseExecutor 创建

13.CacheKey key = createCacheKey(ms, parameterObject, rowBounds);

14.final List cachedList = (List) cache.getObject(key);

15.// 从二级缓存中找到缓存数据

16.if (cachedList != null) {

17.return cachedList;

18.} else {

19.// 未找到缓存,很委托给 BaseExecutor 执行查询

20.List list = delegate.query(ms, parameterObject, rowBounds,

resultHandler);

21.tcm.putObject(cache, key, list);

22.return list;

23.}

24.} else { // 没有启动用二级缓存,直接委托给 BaseExecutor 执行查询

25.return delegate.query(ms, parameterObject, rowBounds,

resultHandler);

26.}

27.} finally {

28.// 当前线程释放 Read 锁

29.cache.getReadWriteLock().readLock().unlock();

30.}

31.}

32.}

33.return delegate.query(ms, parameterObject, rowBounds,

resultHandler);

34.}

至此,已经完完了整个缓存执行器的整个流程分析,接下来是对缓存的缓存数据管理实例进行分析,也就是其 Cache 接口,用于对缓存数据 put 、get及remove的实例对象。

Cache 委托链构建:

正如最开始的缓存概述所描述道,其缓存类的设计采用装饰模式,基于委托的调用机制。

缓存实例构建:

缓存实例的构建,Mybatis 在解析其 Mapper 配置文件时就已经将该实现初始化,在 org.apache.ibatis.builder.xml.XMLMapperBuilder 类中可以看到:

Java代码

1.private void cacheElement(XNode context) throws Exception {

2.if (context != null) {

3.// 基础缓存类型

4.String type = context.getStringAttribute("type", "PERPETUAL");

5.Class typeClass = typeAliasRegistry.resolveAlias(type);

6.// 排除算法缓存类型

7.String eviction = context.getStringAttribute("eviction", "LRU");

8.Class evictionClass = typeAliasRegistry.resolveAlias(eviction);

9.// 缓存自动刷新时间

10.Long flushInterval = context.getLongAttribute("flushInterval");

11.// 缓存存储实例引用的大小

12.Integer size = context.getIntAttribute("size");

13.// 是否是只读缓存

14.boolean readWrite = !context.getBooleanAttribute("readOnly",

false);

15.Properties props = context.getChildrenAsProperties();

16.// 初始化缓存实现

https://www.360docs.net/doc/308887949.html,eNewCache(typeClass, evictionClass,

flushInterval, size, readWrite, props);

18.}

19.}

以下是 useNewCache 方法实现:

Java代码

1.public Cache useNewCache(Class typeClass,

2.Class evictionClass,

3.Long flushInterval,

4.Integer size,

5.boolean readWrite,

6.Properties props) {

7.typeClass = valueOrDefault(typeClass, PerpetualCache.class);

8.evictionClass = valueOrDefault(evictionClass, LruCache.class);

9.// 这里构建 Cache 实例采用 Builder 模式,每一个 Namespace 生成一

个 Cache 实例

10.Cache cache = new CacheBuilder(currentNamespace)

11.// Builder 前设置一些从XML中解析过来的参数

12..implementation(typeClass)

13..addDecorator(evictionClass)

14..clearInterval(flushInterval)

15..size(size)

16..readWrite(readWrite)

17..properties(props)

18.// 再看下面的 build 方法实现

19..build();

20.configuration.addCache(cache);

21.currentCache = cache;

22.return cache;

23.}

24.

25.public Cache build() {

26.setDefaultImplementations();

27.// 创建基础缓存实例

28.Cache cache = newBaseCacheInstance(implementation, id);

29.setCacheProperties(cache);

30.// 缓存排除算法初始化,并将其委托至基础缓存中

31.for (Class decorator : decorators) {

32.cache = newCacheDecoratorInstance(decorator, cache);

33.setCacheProperties(cache);

34.}

35.// 标准装饰器缓存设置,如LoggingCache之类,同样将其委托至基础缓

存中

36.cache = setStandardDecorators(cache);

37.// 返回最终缓存的责任链对象

38.return cache;

39.}

最终生成后的缓存实例对象结构:

可见,所有构建的缓存实例已经通过责任链方式将其串连在一起,各 Cache 各负其责、依次调用,直到缓存数据被 Put 至基础缓存实例中存储。

Cache 实例解剖:

实例类:SynchronizedCache

说明:用于控制 ReadWriteLock,避免并发时所产生的线程安全问题。

解剖:

对于 Lock 机制来说,其分为 Read 和 Write 锁,其 Read 锁允许多个线程同时持有,而 Write 锁,一次能被一个线程持有,如果当 Write 锁没有释放,其它需要 Write 的线程只能等待其释放才能去持有。

其代码实现:

Java代码

1.public void putObject(Object key, Object object) {

2.acquireWriteLock(); // 获取 Write 锁

3.try {

4.delegate.putObject(key, object); // 委托给下一个 Cache 执行 put

操作

5.} finally {

6.releaseWriteLock(); // 释放 Write 锁

7.}

8.}

对于 Read 数据来说,也是如此,不同的是 Read 锁允许多线程同时持有 : Java代码

1.public Object getObject(Object key) {

2.acquireReadLock();

3.try {

4.return delegate.getObject(key);

5.} finally {

6.releaseReadLock();

7.}

8.}

其具体原理可以看看 jdk concurrent 中的 ReadWriteLock 实现。

实例类:LoggingCache

说明:用于日志记录处理,主要输出缓存命中率信息。

解剖:

说到缓存命中信息的统计,只有在 get 的时候才需要统计命中率:

Java代码

1.public Object getObject(Object key) {

2.requests++; // 每调用一次该方法,则获取次数+1

3.final Object value = delegate.getObject(key);

4.if (value != null) { // 命中!命中+1

5.hits++;

6.}

7.if (log.isDebugEnabled()) {

8.// 输出命中率。计算方法为: hits / requets 则为命中率

9.log.debug("Cache Hit Ratio [" + getId() + "]: " + getHitRatio());

10.}

11.return value;

12.}

实例类:SerializedCache

说明:向缓存中 put 或 get 数据时的序列化及反序列化处理。

解剖:

序列化在Java里面已经是最基础的东西了,这里也没有什么特殊之处:

Java代码

1.public void putObject(Object key, Object object) {

2.// PO 类需要实现 Serializable 接口

3.if (object == null || object instanceof Serializable) {

4.delegate.putObject(key, serialize((Serializable) object));

5.} else {

6.throw new CacheException("SharedCache failed to make a copy of a

non-serializable object: " + object);

7.}

8.}

9.

10.public Object getObject(Object key) {

11.Object object = delegate.getObject(key);

12.// 获取数据时对 byte数据进行反序列化

13.return object == null ? null : deserialize((byte[]) object);

14.}

其 serialize 及 deserialize 代码就不必要贴了。

实例类:LruCache

说明:最近最少使用的:移除最长时间不被使用的对象,基于LRU算法。

解剖:

这里的 LRU 算法基于 LinkedHashMap 覆盖其 removeEldestEntry 方法实现。好象之前看过 XMemcached 的 LRU 算法也是这样实现的。

初始化 LinkedHashMap,默认为大小为 1024 个元素:

Java代码

1.public LruCache(Cache delegate) {

2.this.delegate = delegate;

3.setSize(1024); // 设置 map 默认大小

4.}

5.public void setSize(final int size) {

6.// 设置其 capacity 为size, 其 factor 为.75F

7.keyMap = new LinkedHashMap(size, .75F, true) {

8.// 覆盖该方法,当每次往该map 中put 时数据时,如该方法返回 True,

便移除该map中使用最少的Entry

9.// 其参数 eldest 为当前最老的 Entry

10.protected boolean removeEldestEntry(Map.Entry eldest) {

11.boolean tooBig = size() > size;

12.if (tooBig) {

13.eldestKey = eldest.getKey(); //记录当前最老的缓存数据的 Key 值,

因为要委托给下一个 Cache 实现删除

14.}

15.return tooBig;

16.}

17.};

18.}

19.

20.public void putObject(Object key, Object value) {

21.delegate.putObject(key, value);

22.cycleKeyList(key); // 每次 put 后,调用移除最老的 key

23.}

24.// 看看当前实现是否有 eldestKey, 有的话就调用 removeObject ,将

该key从cache中移除

25.private void cycleKeyList(Object key) {

26.keyMap.put(key, key); // 存储当前 put 到cache中的 key 值

27.if (eldestKey != null) {

28.delegate.removeObject(eldestKey);

29.eldestKey = null;

30.}

31.}

32.

33.public Object getObject(Object key) {

34.keyMap.get(key); // 便于该 Map 统计 get该key的次数

35.return delegate.getObject(key);

36.}

实例类:PerpetualCache

说明:这个比较简单,直接通过一个 HashMap 来存储缓存数据。所以没什么说的,直接看下面的 MemcachedCache 吧。

自定义二级缓存/Memcached

其自定义二级缓存也较为简单,它本身默认提供了对 Ehcache 及 Hazelcast 的

缓存支持:Mybatis-Cache,我这里参考它们的实现,自定义了针对 Memcached 的缓存支持,其代码如下:

Java代码

1.package com.xx.core.plugin.mybatis;

2.

3.import java.util.LinkedList;

4.import java.util.concurrent.locks.ReadWriteLock;

5.import java.util.concurrent.locks.ReentrantReadWriteLock;

6.

7.import org.apache.ibatis.cache.Cache;

8.import org.slf4j.Logger;

9.import org.slf4j.LoggerFactory;

10.

11.import com.xx.core.memcached.JMemcachedClientAdapter;

12.import com.xx.core.memcached.service.CacheService;

13.import com.xx.core.memcached.service.MemcachedService;

14.

15./**

16.* Cache adapter for Memcached.

17.*

18.* @author denger

19.*/

20.public class MemcachedCache implements Cache {

21.

22.// Sf4j logger reference

23.private static Logger logger =

LoggerFactory.getLogger(MemcachedCache.class);

24.

25./** The cache service reference. */

26.protected static final CacheService CACHE_SERVICE =

createMemcachedService();

27.

28./** The ReadWriteLock. */

29.private final ReadWriteLock readWriteLock = new

ReentrantReadWriteLock();

30.

31.private String id;

32.private LinkedList cacheKeys = new LinkedList();

33.

34.public MemcachedCache(String id) {

35.this.id = id;

36.}

37.// 创建缓存服务类,基于java-memcached-client

38.protected static CacheService createMemcachedService() {

39.JMemcachedClientAdapter memcachedAdapter;

40.

41.try {

42.memcachedAdapter = new JMemcachedClientAdapter();

43.} catch (Exception e) {

44.String msg = "Initial the JMmemcachedClientAdapter Error.";

45.logger.error(msg, e);

46.throw new RuntimeException(msg);

47.}

48.return new MemcachedService(memcachedAdapter);

49.}

50.

51.@Override

52.public String getId() {

53.return this.id;

54.}

55.

56.// 根据 key 从缓存中获取数据

57.@Override

58.public Object getObject(Object key) {

59.String cacheKey = String.valueOf(key.hashCode());

60.Object value = CACHE_SERVICE.get(cacheKey);

61.if (!cacheKeys.contains(cacheKey)){

62.cacheKeys.add(cacheKey);

63.}

64.return value;

65.}

66.

67.@Override

68.public ReadWriteLock getReadWriteLock() {

69.return this.readWriteLock;

70.}

71.

72.// 设置数据至缓存中

73.@Override

74.public void putObject(Object key, Object value) {

75.String cacheKey = String.valueOf(key.hashCode());

76.

77.if (!cacheKeys.contains(cacheKey)){

78.cacheKeys.add(cacheKey);

79.}

80.CACHE_SERVICE.put(cacheKey, value);

81.}

82.// 从缓存中删除指定 key 数据

83.@Override

84.public Object removeObject(Object key) {

85.String cacheKey = String.valueOf(key.hashCode());

86.

87.cacheKeys.remove(cacheKey);

88.return CACHE_SERVICE.delete(cacheKey);

89.}

90.//清空当前 Cache 实例中的所有缓存数据

91.@Override

92.public void clear() {

93.for (int i = 0; i < cacheKeys.size(); i++){

94.String cacheKey = cacheKeys.get(i);

95.CACHE_SERVICE.delete(cacheKey);

96.}

97.cacheKeys.clear();

98.}

99.

100.@Override

101.public int getSize() {

102.return cacheKeys.size();

103.}

104.}

在 ProductMapper 中增加配置:

Xml代码

1.

type="com.xx.core.plugin.mybatis.MemcachedCache" /> 启动Memcached:

Shell代码

1.memcached -c 2000 -p 11211 -vv -U 0 -l 19

2.168.1.2 -v 执行Mapper 中的查询、修改等操作,Test:

Java代码

1.@Test

2.public void testSelectById() {

3.Long pid = 100L;

4.

5.Product dbProduct = productMapper.selectByID(pid);

6.Assert.assertNotNull(dbProduct);

7.

8.Product cacheProduct = productMapper.selectByID(pid);

9.Assert.assertNotNull(cacheProduct);

10.

11.productMapper.updateName("IPad", pid);

12.

13.Product product = productMapper.selectByID(pid);

14.Assert.assertEquals(product.getName(), "IPad");

15.}

Memcached Loging:

看上去没什么问题~ OK了。

顺丰物流之“嘿客”业务分析

毕业设计 题目:顺丰物流之“嘿客”业务分析系部(院):信息物流系 专业: 学号: 姓名: 指导教师:

“嘿客”是一个资源整合的平台,在O2O实践中其作用将更加明显。既要整合顺丰内部的资源,也要逐步对外放开资源,在这一过程中,电商和快递业务是全部业务的基础,必须把“嘿客”作为电商商品展示、购买、体验、包裹收发等基本功能做扎实,让其承担足够的业务,增加店面对顺丰优选产品的推广,针对“嘿客”收发的包裹给予一定的优惠,以提升用户黏性。 O2O有不同的模式,其产业链涉及线上和线下。顺丰嘿客是O2O模式的一种,为虚拟便利店。文章在实地考察顺丰嘿客经营现状的基础上,分析了其目前经营不佳的原因,从经营管理和消费者心理等方面,为尚处于发展阶段的顺丰嘿客提出改进措施。 关键词:O2O模式顺丰嘿客虚拟便利店 \

一、引言 (4) 二、顺丰“嘿客”的简介 (4) 三、顺风“嘿客”店体系及具体业务操作流程 (6) (一)六大服务体系 (6) (二)具体业务操作流程 (6) 四、顺丰“嘿客”的市场定位与SWAT分析 (7) (一)市场定位 (7) (二)SWOT分析 (7) 五、需要解决的问题及方法 (10) (一)从O2O角度来看存在的问题 (10) (二)从顾客消费体验方面来看存在的问题 (11) (三)解决的方法 (11) 六、结论 (12) 参考文献 (13)

一、引言 无论是解决最后一公里还是打通最后100米,取得了020的线下入口,都不意味着最后的胜利。顺丰铺好了这条叫嘿客的路,究竟会有多少人踏上去,能多大程度上改变网购人群的消费习惯,又能发掘多少非网购群体,都将决定着顺丰的成败,而在020这条被热捧的路上,又吸引着京东、天猫等巨头和资本,但国内尚未有真正成功的案例。 目前,国内零售行业的020模式主要分为三种形式:第一种以天虹商场、银泰为代表,通过微信、微店、电商等多种渠道引导消费的020;第二种为万达的会员化管理模式,把020的运用服务到所有会员,做放大的会员管理;第三种称为反向020,京东、天猫等电商企业向线下实体渠道延伸;而顺丰“嘿客”开业后,其可以称为第四种020模式。 相比其他电商先做线上再扩展物流,需要投入大规模的资金,顺丰依靠本身的物流网络、客户网络比较成熟,而且其服务理念比较好的优势,这种由物流切入零售终端的020模式,显得更加从容。在嘿客店购物体验时,店内主推顺丰优选的优质荔枝,产地直送,但是其他水果均不能送达到,说明生鲜冷链配送尚未真正打通,尚未发挥出顺丰物流链的真正能量。虽然相关配套还有待完善,但嘿客背后所展现出的顺丰“物流链接生活”的大构想已见雏形。 二、顺丰“嘿客”的简介 快递巨头顺丰速运2014年05月18日已正式在全国铺开名为“嘿客”的便利店,首批共518家,从而大举杀入国内火热的O2O(从线上到线下)市场,这一模式将对国内电商格局产生较大影响。 嘿客是顺丰旗下网购服务社区店,通过整合渠道资源,为顾客提供更灵活、更便捷、更智能化的线下社区服务体验。顺丰方面称,网上售卖的商品,很多都需要用户进行实际体验,其中最典型的就是家电、3C、生鲜、服装衣帽等高体验度品类。针对电商无法通过技术手段解决的触觉、味觉和嗅觉,“嘿客”门店提供预售、试穿等服务。商品在店内不设库存,在消费者选择购买后,通过既有的

对照课程标准、考纲,如何把握复习中各知识点的深度和广度.

对照课程标准、考纲,如何把握复习中各知识点的深度和广度 必修3部分 1、P5对内稳态中pH的调节的处理: 需结合实例展开讲解,建议此部分可结合原教材复习。 2、P16反射的种类及其比较: 增加反射的种类及其区别:非条件反射、条件反射,从建立时间(先天、后天)、参与的神经中枢(大脑皮层及其以下区域、大脑皮层)、刺激种类(直接刺激、信号刺激)等加以区别。 3、P19神经递质的种类和作用(兴奋、抑制): 建议介绍教材P19相关信息,并就兴奋性递质和抑制性递质做适当补充。 兴奋性递质:乙酰胆碱(对心肌是抑制性递质),谷氨酸,多巴胺,肾上腺素,去甲肾上腺素,ATP;抑制性递质:5-羟色胺,甘氨酸,γ-氨基丁酸。 4、P20人脑的功能: 适当介绍各种功能区(躯体感觉中枢、躯体运动中枢、各种语言中枢),让学生了解感觉、运动、语言、思维、记忆各功能是如何与结构相适应的。 5、P25血糖调节、P32水盐调节、体温调节的处理: 降低平衡的要求(简单介绍来源去路作为铺垫),侧重调节。其中血糖调节需重新整理调节网络,将胰岛素、胰高血糖素、肾上腺素对血糖浓度的作用都显示上,同时显示拮抗作用和协同作用,具体的可借鉴选修全一册教材。 6、P23动物激素的调节和动物激素在生产中的应用部分的处理: 此部分应该在教材的通过激素的调节部分体现,但此部分教材过于简单,因此需要补充。动物激素的调节部分应有:各种内分泌腺分泌激素的种类和作用、激素的调节、内分泌异常引起的病症及其治疗方法;动物激素在生产中的应用:催肥、促进产卵等的介绍及对人类生产生活的影响。 7、P35人体免疫系统在维持稳态中的作用的处理: 应从免疫系统的组成、免疫系统的功能两大方面展开。免疫系统的功能从防卫、监控、清除几方面加以展开,其中防卫功能又分为正常防卫(教材中介绍的非特异性免疫和重点介绍的两种特异性免疫)和异常防卫(防卫过当——自身免疫病和防卫不足——免疫缺陷病),此部分建议按照原教材进行整理。在免疫缺陷病部分,详细介绍艾滋病的发病机理、症状、传播途径及预防措施,并结合所学的知识引导周围的人远离艾滋病。 8、P50生长素的生理作用的处理: 教材对此部分的介绍过于简单,此处需要补充:促进果实发育(无子果实的产生)(可按照原必修第一册教材补充介绍)。

图的深度优先遍历算法课程设计报告

合肥学院 计算机科学与技术系 课程设计报告 2013~2014学年第二学期 课程数据结构与算法 课程设计名称图的深度优先遍历算法的实现 学生姓名陈琳 学号1204091022 专业班级软件工程 指导教师何立新 2014 年9 月 一:问题分析和任务定义 涉及到数据结构遍会涉及到对应存储方法的遍历问题。本次程序采用邻接表的存储方法,并且以深度优先实现遍历的过程得到其遍历序列。

深度优先遍历图的方法是,从图中某顶点v 出发: (1)访问顶点v ; (2)依次从v 的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v 有路径相通的顶点都被访问; (3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 二:数据结构的选择和概要设计 设计流程如图: 图1 设计流程 利用一维数组创建邻接表,同时还需要一个一维数组来存储顶点信息。之后利用创建的邻接表来创建图,最后用深度优先的方法来实现遍历。 图 2 原始图 1.从0开始,首先找到0的关联顶点3 2.由3出发,找到1;由1出发,没有关联的顶点。 3.回到3,从3出发,找到2;由2出发,没有关联的顶点。 4.回到4,出4出发,找到1,因为1已经被访问过了,所以不访问。

所以最后顺序是0,3,1,2,4 三:详细设计和编码 1.创建邻接表和图 void CreateALGraph (ALGraph* G) //建立邻接表函数. { int i,j,k,s; char y; EdgeNode* p; //工作指针. printf("请输入图的顶点数n与边数e(以逗号做分隔符):\n"); scanf("%d,%d",&(G->n),&(G->e)); scanf("%c",&y); //用y来接收回车符. for(s=0;sn;s++) { printf("请输入下标为%d的顶点的元素:\n",s); scanf("%c",&(G->adjlist[s].vertex)); scanf("%c",&y); //用y来接收回车符.当后面要输入的是和单个字符有关的数据时候要存贮回车符,以免回车符被误接收。 G->adjlist[s].firstedge=NULL; } printf("请分别输入该图的%d条弧\n",G->e); for(k=0;ke;k++) { printf("请输入第%d条弧的起点和终点(起点下标,终点下标):\n",(k+1)); scanf("%d,%d",&i,&j); p=(EdgeNode*)malloc(sizeof(EdgeNode)); p->adjvex=j; p->next=G->adjlist[i].firstedge; G->adjlist[i].firstedge=p; } } 2.深度优先遍历 void DFS(ALGraph* G,int v) //深度优先遍历 { EdgeNode* p;

计算机图形学

《计算机图形学》综合复习资料 一、单选题 1.计算机图形显示器一般使用什么颜色模型?( ) A、RGB; B、CMY; C、HSV; D、HLS 2.分辨率为1024*1024的真彩色显示器,至少需要的帧缓存容量为() A、 8MB; B、1MB; C、2MB; D、3MB 3.二维坐标(3,4)的标准齐次坐标是() A、(3,4); B、(3,4,1); C、(6,8,2); D、(3,4,0) 4.以下关于图形变换的论述,错误的是() A、平移变换不改变图形大小和形状,只改变图形位置; B、比例变换改变了图形的大小,但不改变图形各个顶点离原点的距离; C、复杂的几何变换可以分解成若干基本的几何变换组合,称为级联变换; D、旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变5.下列不是计算机图形学应用的是() A、计算机辅助设计(CAD); B、科学计算可视化; C、人事信息管理系统; D、地理信息系统(GIS) 6.下列关于三维图形绘制的内容,错误的是( ) A、在屏幕上显示三维图形,采用的直角坐标系通常是左手坐标系; B、图形绘制中,除世界坐标系外,还要屏幕坐标系; C、图形绘制中,局部坐标系和成像面坐标系是必须要设置的; D、三维空间中的对象要在二维的屏幕或图纸上表示出来,必须要通过投影 7.对于由P0P1P2P3四点所决定的三次Bezier曲线,下列叙述中错误的是 A、起始点位于P0; B、终止点位于P3; C、起始点的切矢为:3(P1-P0); D、终止点的切矢为:(P3-P2) 8.在多边形的逐边裁剪法中,对于某条多边形的边(方向为从端点S到端点P)与某条裁剪线(窗口的某一边)的比较结果共有以下四种情况,分别需输出一些顶点.请问哪种情况下输出的顶点是错误的? ( ) A、S和P均在可见的一侧,则输出S和P; B、S和P均在不可见的一侧,则输出0个顶点; C、S在可见一侧,P在不可见一侧,则输出线段SP与裁剪线的交点;

深度剖析——学习中如何进行基础知识深度掌握

深度剖析——学习中如何进行基础知识深度掌握 但凡成绩优异者,问其经验,都会说:狠抓基础。但是 对基础一词,如何去理解?大多数学生对于基础的认知仅仅停留在课本上或者辅材上的黑体加重部分。确实这一部分的知识是重点不假,但是对于这些重点如何掌握,也是判定基础是否扎实的标准。 有的学生认为记住了,就说明掌握了;有的学生认为会用了,就说明掌握了。正是因为这种对基础模棱两可的判断标准,就导致了学生对于基础掌握无法做出科学理性的判定。 现象分析 我们来分析这样一种现象:基础知识自己能够记住,基础知识自己也能够理解,但是一旦将基础进行到了实际应用中 做题)的时候,就会发现用不起来、用起来很别扭、用起来特别容易出错。 很多学生认为:这是做题少的缘故。 确实,练习能够有效的缓解难用的现象,但是仅仅靠练习,是不能让自己有信心从容地面对所涉及知识点的应用的。 究其根本,学生需要对基础知识是否有深度的理解。 举个例子:在初中和高中都会讲到立体几何,随便问问周边的10 个同学,就有那么三两个同学明确的告诉你,立体几

何很简单。但是还是有大部分同学对此感觉非常吃力。 眼光重点关注在什么地方,就决定了学生对于此知识的理解深度。一维的线关注点;二维的面关注线;三维的体关注面。 所以对点线面的重点观察,则是学好立体几何的关键。 基于这样的思想,在立体几何中,三视图和直观图,以及点线面的位置关系,就变成了极其简单的知识点。 直观图T三视图或者三视图T直观图无非就是关注核心的点,关键的线,重要的面。基于点知道了大概结构;基于线知道了它的具体形状;基于面知道了它的特殊性具体的就语音讲吧,“福聿学习之道辅导”平台里有,喜马 拉雅里也有,写还不知道也写多少字。 其实举这样一个例子,无非就是告诉大家, 在学基础的时候, 不仅仅是做表面文章,还需要对知识进行深度理解。 由概念衍生出知识点,这是学习的过程; 将知识点融入概念,这是一个掌握过程; 根据知识点总结应用方向这是熟练过程; 由知识点衍生掌握和应用技巧,这是创新的过程。 而这一系列的过程都属于基础知识的范畴。 举例过程,还是得借助录音,要不然文字阐述就过于啰嗦了。 所以但凡老师都是将基础看得特别重,因为老师的成长经历和教学经验让老师都有这样的感悟:没有基础,没有高分。 学生对于基础的轻视,在于学生对“什么是基础”的理解不够透彻。老师

图的深度遍历

#include #include #define n 4 //图的顶点数 #define e 5 //图的边数 typedef struct node { int adjvex; struct node *next; } edgenode;//边表节点 typedef struct { char vertex; edgenode *link; }vexnode;//顶点表节点 vexnode ga[n]; int visited[n]; void Creatadjlist(vexnode ga[])//建立无向图的邻接表{ int i,j,k; edgenode *s; printf("请输入各个顶点:"); for(i=0;iadjvex=j; s->next=ga[i].link; ga[i].link=s; s=malloc(sizeof(edgenode)); s->adjvex=i; s->next=ga[j].link; ga[j].link=s; } } void Dfsl(int i)//邻接表的深度遍历 {

edgenode *p; printf("node:%c\n",ga[i].vertex); visited[i]=1; p=ga[i].link; while(p!=NULL) { if(!visited[p->adjvex]) { Dfsl(p->adjvex); } p=p->next; } } void main() { int i; Creatadjlist( ga); printf("请输入需要遍历的顶点:\n"); scanf("%d",&i); Dfsl(i); }

危险军团 个人对五步陷阱技术精神的体会和理解感悟

https://www.360docs.net/doc/308887949.html, 危险军团个人对五步陷阱技术精神的体会和理解感悟 在我写五步这个帖子的之前,大家先回答一下约会学的核心是什么,总结一句话核心就是获得女人心,寻找到自己的可以相守一生一世的真爱也叫真命。那问题就有出现了,如何获得女人心,俗话说女人心海底真,围绕着如何获取女人心,古今中外围着中这一话题展开了喋喋不休的讨论,有一派认为获得女人心首先获得女人身体,这一派为迷男为代表后来引进国内后衍生成了自然流代表人物 PUA 墨菲斯等这些,另一派认为或得女人身体首先获得女人心这就就是根基在国内独立的学派由死囚大神创建的也是今天我主要讲的五步陷阱技术,因为他的独特性,被圈内人称为邪术,邪术不邪术我们先不评论。 先说说本人,我下面要讲的也是很多出学约会学的都兄弟经历过,我是受到一段失败的感情经历后才走上约会学的这段路的,学五步前本就是一个屌丝一个挫男,本人虽无缘见到祖师死囚,但是我有幸师承危险大神,经过了一段对五步时间的学习,我对五步有了全新的审视,下面我就给大家带来我的认知和体会。 通过学习五步通过不断的实战我感觉五步陷阱技术把他想像一场电影,你就是导演兼演员,你在自编自导一部电影,设计电影中的每个情节,这里我要引用一个大家熟悉的词汇-布局,提到布局大家并不陌生,很有PUA嘴里说的社交软件你的展示面,诸如高大上的感觉,布局这样定义也不完全不对,但是缩小了布局的外延,今天我要讲的布局不仅限如此,在说布局大家可否知道布局的本质核心是什么,本质核心就是通过一切可操控的资源展示营造出虚拟的高价值。所以说人生也是一精心预谋的布局,是不是你一出生你的父母就开始给你布局你上小学-中学-大学-这背后的目的就是什么呢是不是让你达到出人头地有个好的工作好的人生。我们分析开看前面的设计都是为了后面的获得后面的预期,是不是。好了,现在我们回到约会学上来通过布局展示目的是获得女孩对你的关注预期就是大家理解的女孩对你的吸引,这就是暗线也就是你要达成的目的,通过布局营造出虚拟高价值来达到吸引女孩的目的。都是通过展示虚拟高价值吸引女性,五步都是创建3大人偶模型展示出虚拟高价值,现在我们来分析这两种的异同,一个是通过展示你的高价值诸如你的车房子等等这些一个是通过创建人偶展示但是两者的目的也就是暗线都是让女人注意你吸引女人。本质是一样的只是方

如何与妹子愉快的互动聊天

如何与妹子愉快的互动聊天 为什么有的时候互动的很好目标的服从性还是不高 为什么有的时候明明给出一个很好的话题又不能让目标给出好的回应从技术层面分析对话一共有三个构成 1.互动中的框架 2.对话的需求 3.互动的节奏 联系感只能代表联系的紧密程度和互动的掌控无关 舒适感是互动的阶段 为什么互动的是时候很好联系感却建立不起来是不是带入好奇不够 这是对话需求的问题,你没能抓住对方需求 摇摆猫对框架做出了完美的诠释 框架是对话的潜在含义

给大家举两个不同的例子一起比对分析 挫男和女人的互动就是超低框架 所有互动内容都围绕一个主题 “我想P你”“我想C你” 挫男是很难把到妹的哪怕是个很有价值的挫男 低框架的人会对高框架的人服从或是有需求 假设这时候出现一个和挫男价值对等的男人 摆出强框架“我是奖品”“我坚信我有价值”“你要对我服从 他和目标的互动一定占尽优势 为什么同等价值的两个人框架不同互动的差距却这么大 我给大家解释下原因 挫男框架的潜在含义是我想C你 强框架的潜在含义是我是奖品你要努力表现才能获得奖励 这告诉我们,在任何时候都不要让自己在互动中处于弱势。这会让人觉得你有意图 这是自然规律,弱势的人像强势的人获取价值 我们再来讲框架太强为什么会把不到妞 灵魂认为,框架和价值是对应的 你的框架强代表你价值高。如果你没有价值,却在一个比你价值高的目标面前展示强框架这会让人觉得你自大 如果你在同等价值的目标面前展示过强的框架会让人觉得有压力 特别是你想要拥有对方的价值却摆出比对方更高的框架只要对方察觉到你的意图 你已经被拉入黑名单了 框架的内容比较抽象如果不能理解我给大家几个实际的例子

深度学习基础地的知识整理

深度学习基础知识整理 Without deviation from the norm,progress is not possible(不偏离常规,就无法取得进步-Frank Zappa)

第一课:数学分析与概率论 Taylor展式及其应用、凸函数、jensen不等式、常见分布与共轭分布 第二课:数理统计与参数估计 Chebyshev不等式、大数定理、小数定理、中心极值定理、矩阵计算、最大似然估计 第三课:矩阵和线性代数 从马尔克夫模型看矩阵、特征向量、对称矩阵、线性方程 第四课:凸优化 凸函数、共轭函数、凸优化、Lagrange对偶函数 第五课:回归 高斯分布、Logistic回归、梯度下降、特征选择与过拟合欠拟合关系 应用方向:线性回归、Logistic回归实现和分析 第六课:梯度下降与拟牛顿法

梯度下降算法、自适应学习率、拟牛顿、LBFGS 应用方向:自适应学习率代码实现和参数调试分析 第七课:最大熵模型 熵、相对熵、信息增益、最大熵模型、Softmax回归 应用方向:独立成分分析ICA求解盲源分离BBS问题 第八课:决策树和随机森林(蒙特卡罗)ID3、C4.5、CART、Bagging 研究方向:使用随机森林进行数据分类(蒙特卡洛) 第九课:SVM 线性可分支持向量机、软间隔、核函数、SMO 研究方向:使用SVM进行数据分类 第十课:聚类 K-means/K-Medoids、密度聚类、谱聚类、 应用方向:K-means、谱聚类代码实现和参数调试分析

第十一课:推荐系统 相似度量方案、协同过滤(User-based/ltem-based)、PCA/SVD、随机游走 应用方向:协同过滤用于商品推荐、SVD隐变量的推荐 第十二课:提升 梯度提升决策树GBDT、Adaboost、前向分步算法 应用方向:Adaboost与随机森林(蒙特卡洛)结合、用于数据分类 第十三课:EM算法和GMM EMM算法、GMM、主题模型pLSA 应用方向:分解部分观测数据的男女身高、图像分解 第十四课:普斯贝叶斯和贝叶斯网络初步 有向分离、(隐)马尔科夫模型HMM 第十五课:主题模型用EM算法计算pLSA、Dirichiet分布、LDA、Gibbs采样

深度优先遍历(邻接矩阵)

上机实验报告 学院:计算机与信息技术学院 专业:计算机科学与技术(师范)课程名称:数据结构 实验题目:深度优先遍历(邻接矩阵)班级序号:师范1班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号

一、实验目的: 1﹒掌握图的基本概念和邻接矩阵存储结构。 2﹒掌握图的邻接矩阵存储结构的算法实现。 3﹒掌握图在邻接矩阵存储结构上遍历算法的实现。 二、实验环境: Windows 8.1 Microsoft Visual c++ 6.0 二、实验内容及要求: 编写图的深度优先遍历邻接矩阵算法。建立图的存储结构,能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。 四、概要设计: 深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。假设初始状态是图中所有的顶点未曾被访问,则深度优先遍历可从图的某个顶点V出发,访问此顶点,然后依次从V的未被访问的邻接点出发深度优先遍历图,直至图中所有和V有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中的一个未被访问的顶点,重复上述过程,直至图中所有顶点都被访问到为止。 以图中无向图G4为例,深度优先遍历图的过程如图所示。假设从顶点V1出发进行搜索,在访问了顶点V1后,选择邻接点V2。因为V2未曾访问,则从V2出发进行搜索。依次类推,接着从V4,V8,V5出发进行搜索。在访问了V5之后,由于V5的邻接点已都被访问,则搜索回到V8。由于同样的理由,搜索继续回到V4,V2直至V1,此时由于V1的另一个邻接点为被访问,则搜索又从V1到V3,再继续进行下去。由此得到顶点的访问序列为: V1 V2 V4 V8 V5 V3 V6 V7 五、代码 #include #include #define n 8 #define e 9 typedef char vextype; typedef float adjtype; int visited[n]; //定义结构体

Removed_如何将自己的「故事」,变成对女生充满吸引力的「谈资」48

如何将自己的「故事」,变成对女生充满吸引力的 「谈资」 这是秘密把妹组织内部教案的第二课。 人与人之间的互相吸引,在现在的我看起来,是饱含「宿命」的奇妙仪式。我们的喜好、偏见,及至性癖,都与所处环境、社会形态息息相关,所以你喜欢什么样的女孩子、什么样的女孩子会喜欢你,构成的原因也非常复杂。有一本书叫《是高跟鞋还是高尔夫修改了我的大脑》,大概就说明了这一点。这样联想起来,两个完全没有瓜葛的男女,突然之间互相产生了好感,这件事情简直如同神创世人一样神秘。 所以最初回顾这个主题的时候,说实话还真是汗颜。我不敢大言不惭地说「哎哟用了这些话术什么妞都能手到擒来」,真的提心吊胆、战战兢兢。但仔细听当时的录音时,我发现一件很有趣的事:之前讲怎么穿衣打扮,很多的成员都快要睡着;而一讲到「话术」,这些人就马上打了鸡血一样,甚至很多其他跑过来客串的听众也欢呼雀跃,恨不得从电脑那边钻过网线跳出来跟我击掌庆祝。归结其原因,也许还是因为大家对自己的为人处事太不自信,所以会对「话术」抱有很高的期望吧!反正好多大肚腩大叔都跟我说他觉得自己形象挺好的,就是「不大会讲讨人喜欢的话」。 所以这么一说,「话术」倒是大家更感兴趣的事情了。 于是在开篇我得事先提醒一下各位,所谓话术,有一位叫冷爱的健身魔人倒是经常告诫我:和女生聊天,重要的不是说什么,而是怎么说。 虽然有点以偏概全,但是他这个观点很好地指出了一个核心:沟通时的状态,是产生两性吸引的核心。在沟通时,你展现出来的特质,是否符合她潜意识里的择偶倾向或启发性欲机制,决定了你们之间最初的吸引。如何展现这些特质我们下文会提到。 我们先聊回「话术」。我对话术的感情非常复杂,究其原因,就很像写小说,一般没有扎扎实实地锻炼过语句、结构、节奏,很难写出真正精彩的小说,但你练笔时写的那些东西真的就是一坨屎。「话术」也是一样,没有一套一套地背书,很难知道女孩子对哪些话题感冒,什么样的女孩子对什么样的话题会做出什么样的反应。这不仅仅是对阿宅而言,就算你像我一样伶牙俐齿,一定也出现过乱说话乱表达伤害到别人感情,或者被人误解的情况吧。归根结底,还是缺乏历练产生的直觉,而导致满嘴跑火车乱说话的缘故。但背书的感觉,是非常糟糕的,甚至会觉得自己像个做作的牛蒡男;而两人的吸引,又是那么宿命性。归根结底,谋事在人,成事在天。话术只能算谋事的一条支线,别把宝全压在上面。 但无论如何技多了都不压身,为了彪悍的人生,我们还是拼一拼吧。 「好奇话术」

顺丰优选营销策略研究

顺丰优选营销策略研究 发表时间:2016-03-24T15:52:46.627Z 来源:《基层建设》2015年24期供稿作者:周华英毛可进 [导读] 浙江中医药大学滨江学院随着电子商务的不断发展,有不少快递企业开始涉足电商行业,希望在广阔的网购市场获取更为理想的利润. 浙江中医药大学滨江学院浙江杭州 310053 摘要:随着电子商务的不断发展,有不少快递企业开始涉足电商行业,希望在广阔的网购市场获取更为理想的利润,一个物流领域与电商行业的跨界经营时代已然到来。本文基于对顺丰速运旗下的顺丰优选的发展情况的了解,对顺丰优选的发展现状进行分析,针对这些,提出一些完善其营销推广策略的建议,使得顺风优选在竞争激烈的市场中更具竞争力,也可以为其他物流企业发展电子商务提供一些参考。 关键词:顺丰优选;电商;营销策略;营销 一、顺丰优选的发展现状 顺丰优选于2012年5月31日正式上线,是顺丰速运旗下的一家以全球优质安全美食为主的网购商城,定位于中高端食品市场。目前,顺丰优选平台大体分为优选商城、优选生鲜、优选海淘以及企业专区(商业人士专业礼品服务等)这四个板块,商品数量超过一万余种,主要覆盖生鲜食品、母婴食品、保健品、粮油食品、酒水饮料、休闲零食、饼干点心、冲调茶饮、美食用具以及产地直采蔬果,另外,也已经开始涉及除美食外的一些产品,如家用电器、手机数码、箱包服饰等。顺丰速运的营业网点覆盖中国大陆31个省、自治区和直辖市,300多个大中城市及1900多个县级市或县区,是实现顺丰优选优质物流服务的强大支持。据了解,自2014年8月11日起,顺丰优选的冷链配送城市从11个拓展到了48个,使得顺丰优选在生鲜食品领域得以更好的发展。2014年5月18日,顺丰速运集团为发展顺丰优选线下能力,实现O2O战略,网购社区服务店“嘿客”正式开业,除青海、西藏外,在全国各省、自治区均有覆盖。遗憾的是,3000多家“嘿客”的发展不尽人意。 二、顺丰优选发展存在的问题 1.营销宣传力度不够,知名度不高。顺丰集团目前仍然是因为其物流业而出名,知晓顺丰优选的受众范围不广,层次不深。除去相关新闻报道以及少量的宣传片,基本上不能够引起消费者高度的关注,也不能很好的了解顺丰优选。前段时间顺丰大力投入的“嘿店”本该是一个不错的宣传手段,深入社区,让消费者进行更多的线下体验,但是没有切实地把握消费者需求,没有起到很好的效果。另外,每逢节假日顺丰必推出某些产品,但是消费者也不能及时地掌握这些信息,没有做到积极地与消费者的互动。 2.市场占有率不高,竞争能力不够理想。顺丰优选在2015年一年度的中国电子商务排行榜上仅仅排到了第二十名,在2014年电商实力排行榜上也没有挤进前十。相比于京东、淘宝,顺丰优选可能确实是在物流方面做得不错,但物流领域和电商领域也确实不同,所以还是需要一定的时间、人力的投入,以及一些基本的大众的业务展示。 3.产品质量保障,食品安全还是需要很大的投入。顺丰优选主要是以食品为主,入口的东西消费者向来是比较谨慎的。而生鲜产品不同于其他产品,它没有标准化,质量控制难度大。顺丰优选需要有更多的行动去注重消费者所关心的食品安全问题。 4.冷链还不够发达。生鲜食品的市场需求非常大,但是生鲜食品在电商交易中所占比例很低,很大的一部分原因是冷链覆盖范围还是有限的,在我国冷链还不发达的大背景下,光靠顺丰的投入怕是有限,也是需要很长时间的建设期。冷链不够发达会直接影响消费者网购生鲜食品的消费习惯,担心生鲜食品在途变质或是配送范围在冷链覆盖范围外。 5.我国网购中高端市场还不成熟。顺丰优选的定位是明确的中高端食品市场,那它的目标客户是有一定消费能力的网购消费者。但是,大部分的网购消费者网购的目的是获得物美价廉的商品,若是以中高端价格去网购大部分消费者会选择实体商店消费。这也是为什么淘宝、蘑菇街等可以迅速发展的原因。 6.跨界经营必要的管理经营改革。虽然说物流业进军电商领域是水到渠成的事,但毕竟是不同的行业,原有的高层在制定战略计划时考虑的会更多更有难度。如何整合企业资源,要发展怎样的一个运营模式,以及培养更为专业的人才都是顺风集团要考虑的问题。 三、顺丰优选的营销策略及建议 与其他同行相比较,顺丰优选虽然可能比较年轻,但从顺丰由物流进军电商、从试水常温高端食品到生鲜、从一线城市扩张到二三线城市、从线上平台到试水线下的“嘿客”这些看来,它在战略部署方面还是比较稳扎实干、一步步推进的。要在众多电商中成为一支领军队伍,那么,采取一些快速渗透消费者、实效精确的营销策略是非常必要的。 1.体验式营销。第一种,体验健康、食品安全。消费者对于网购食品最看重的就是食品安全问题了,组织消费者亲自去原产地采摘的体验方式肯定是花费巨大且受众范围小,只能限于原产地附近消费者进行体验。但是,顺丰优选可以以模拟情景的方式随时随刻发布原产地的食品生产、加工的正式情况来代替产地参观,让消费者移动鼠标就可以体验到一种绿色环保的生产过程。第二种,体验整个购物流程的后台工作。可以制作一个宣传片,从顾客售前咨询到最后的售后,展示顺丰集团员工为一份份的订单所付出的努力,给消费者一个安心购物的心理体验。第三种,体验顺丰优选的文化。可以从员工开始,欢迎员工家属参加公司的活动,展现公司的核心文化,也是一种可以由员工家属向社会宣传的一种自身体验。 2.口碑营销。树立一个良好的口碑是打造一个良好的品牌形象的必然要素,消费者对于一次糟糕的消费体验往往是忍不住向周围人吐槽,但同样一次感觉良好的消费体验也会不吝推荐给别人。可以创建一个消费者口碑平台,让商家与消费者、消费者与消费者之间进行积极的互动,也起到一个监督商家的作用。需要注意的是,要做好杜绝虚假口碑的工作,让消费者的意见真实的反映出来。另外,顺丰优选可以多做些有正能量的事情,展现一个企业该有的社会责任,比方说某些公益活动、倡导绿色生产、保护环境的志愿活动等,在社会上树立一个好的形象,获得一个好的公众口碑。 3.植入式营销。在这个冠名“中国好声音”、赞助“爸爸去哪儿”、鸡尾酒占据电视剧镜头等等的大时代里,显然,消费者对于植入式营销的接受能力还是可以的饿,只要选对目标客户喜爱的、认可度高的节目,其实是会被接受并且消化的。除此之外,还可以适当地投放网页

知识的深度与广度

你感兴趣的东西越多,你能够深入的就越少。你钻研的越深入,你有发现感兴趣的东西越多。有点绕,不过有感而发。我想到这句话的时候其核心仍然是想表达知识的深度和广度直接的关系问题,或者说其学习的先后关系和顺序问题。 首先任何一个知识广度的扩展都需要有一个专业性方向的深度的积累,而且这个积累经过了自我的实践,通过实践转化为了知识的经验和方法。如果我们感兴趣的东西太多,而这些方面的内容我们都没有办法进行实践性领悟,那么所有你感兴趣的知识领域你都无法深入去理解和领悟。还是这句话,理论不通过实践很难转化为自我的经验并指导后续的行动。你会发现很多领域你都知道,就是不清楚具体为何得出某些结论?你想深入学习又很难,很多东西你没有实践机会。 人的精力有限,感兴趣的东西越多,每个知识域上分到的时间自然很少,同时由于很多知识由于没有实践的机会,很多时候学完后很快就会忘记,不会带来太大的机制。只有真正实践后的经验是最不容易遗忘的。根据我原来谈到过的,知识的广度往往并不会产生直接的自我增值,知识广度本身是附着在某一个专业深度上的。 所以刚工作的时候,还是以某个专业领域的发展为主,很多东西可以关注,但是不用花太多的时间,一定要将时间用到专业技能的提高上面。工作前面2-3年的学习力最旺盛,只要有足够的兴趣,就有精力刨根究底深入学习,而且这个学习过程是和实践和工作完全结合的,那么学习后就很容易转化我自我经验。如果刚开始工作的时间就挑三拣四或者说换岗太快,沉迷到各种新鲜的工具,语言和技术上面,那么很可能将基础打深入的时间就荒废了。 前面几年过了后,你会发现你钻研的越深入,你有发现感兴趣的东西越多。这是完全正常的情况,任何知识领域在深入到一定的阶段后,必须要有更加广度的知识来支撑。知识本身无边界,很多时候专业性的工作也需要更加复合型的知识结构。这个时候你再去拓展知识的广度就属于完全合理的,这个时候一方面是有知识深入做积累,一方面是在拓展深度过程中遇到的问题来目标驱动广度知识的学习,更加有针对性。在广度知识学习中,你会发现很多内容跟你原来的实践总结很容易触类旁通,容易把原有疑惑的多个离散知识点融合起来。个人认为到了这个阶段最大的成果就是你会发现学习任何新知识都相当容易,基本不会遇到太多太大的困难和障碍。 在学校更偏知识广度,刚工作阶段则需要在某个专业领域深度上扩展,后续则从深度积累上转到广度的拓展和知识的融合,这是我考虑的一个学习顺序和思路。一开始就感兴趣东西太多,往往错过了自我核心专业技能,也丧失了后续专业深入的机会;后续如果在专业深入遇到瓶颈的时候,又不能想到拓展知识面和视野,往往又在自我能力上举步不前,这是我思考该问题的一个大原因。

计算机图形学总复习

计算机图形总复习 题型及分值 一、单项选择题(10*2=20%) 二、填空题(10*2=20%) 三、判断题(10*1=10%) 四、简答题(4*5=20%) 五、综合题(3*10=30%) 一、单项选择题 1、在下列叙述语句中,正确的为() A、一个计算机图形系统至少应具有计算、存储、输入、输出四个方面的基本功能 B、在图形系统中,图形处理速度取决于CPU的性能 C、在图形系统中,存储容量指的是计算机的内存 D、在图形系统中,图形处理精度主要是指图形采集输入质量和显示输出质量 2、如果一幅512×512像素的图像,每一像素用4位表示,那么存储此图像至少需要的容量为() A、512KB B、1MB C、2MB D、3MB 3、如果一个长方形使用右边二维图形变换矩阵: ? ? ? ? ? ? ? ? ? ? = 1 5 5 5 T ,将产生变换的结果为() A、图形放大5倍;同时沿X坐标轴方向移动5个绘图单位 B、图形放大25倍,同时沿X坐标轴方向移动5个绘图单位 C、图形放大5倍,同时沿Y坐标轴方向移动5个绘图单位 D、图形放大25倍,同时沿Y坐标轴方向移动5个绘图单位 4、下列有关Bezier曲线性质的叙述语句中,错误的为() A、 Bezier曲线可用其特征多边形来定义 B、 Bezier曲线必须通过其特征多边形的各个顶点 C、Bezier曲线两端点处的切线方向必须与其特征多边形的相应两端线段走向一致 D、Bezier曲线具有凸包性 5、下列有关二维几何变换的叙述语句中,正确的为() A、几何变换就是把一个图形从一个位置移到别的位置 B、几何变换后图形连线次序发生改变 C、一个正方体经几何变换后可能会变成长方体 D、几何变换使图形都产生了变形 6、下列关于B样条的叙述正确的是()

【风之轩】五步流程解析

终极境界:手中有妞心中无妞呼吸吐纳皆高潮 一,心态 泡妞什么最重要,当然心态,没有心态你泡JB妞。强大的心态可以让你更好的学习五步,让你很会演。就像演员一样,演好每一场戏。而我们就是这次戏的猪脚,而女人就是这场戏你戏配角。 其实把一个妖兽级的极品丑女心态的控制要比把一个超级模特难掌控的多 不仅是心态丑女那该死的自卑会唤起她们超强的戒备你越是优秀自信遇到的麻烦就越多。

我们要做到要面对车祸现场的女尸也心如止水,自然地上去说一句hi 如果你还能起来说话,我其实很想认识你。 死囚的这句话固然很经典,但是说真的,我目前还没有遇见过车祸现场的女尸。如果遇见了我肯定认为是大妈。怎么锻炼心态,那就得实战,去街搭,去受枪。 死囚推出来的联盟十枪其实不单单对联盟的人的,要不死囚怎么可能故意泄露呢?他这个十枪也是为了大家,锻炼心态也可以玩这个十枪,还有办法就是装成乞丐去你那城市人最多的地方乞讨,先慢

慢试着乞讨,然后乞讨到美女身上,然后对美女进行死缠烂打的乞讨。怎么样你能有这个心态么?说实话我以前也去过乞讨,但是没有乞讨到美女身上。 二,女性开放度评判 A级——放荡女诱惑者女性玩家这类女人往往你搞不懂是谁把了谁看到很多AFC睡了一个浪女还沾沾自喜发帖炫耀以为高明真是让人哭笑不得 B级——寂寞女人期待被诱惑这类女也不需太多技术但要给她找到一个合适的道德出口 C级——被动型大多人眼中所

谓的好女号孩需要用详细计划的步骤和手段去引导卸下防备更重要还得让她感觉到“爱” D级——传统型烈女和CN 这类女人不多我这辈子只睡过一个CN 用的是持久战循序渐进开了5次房建立信任最后禽兽(其实说我可不相信死囚只睡过一个CN) 三,浪女信号评判 1.女性社交认可低 (浪女在女性社交圈一般是被边缘化的角色~~~ 除了一两个臭味相投但貌合神离的浪女玩伴~~

思想的深度,知识的广度,能力的高度

思想的深度,知识的广度,能力的高度 2012-01-05 14:12:54| 分类:默认分类| 标签:|字号大中小订阅 我与“课内比教学”征文 思想的深度,知识的广度,能力的高度 西流河一中吴中华 经过学校多次开会宣传,本学期由省教育厅发起,在全省范围开展的“课内比教学,课外访万家”的活动于十月份在我校拉开了序幕,进入了实施阶段。“课内比教学”分为三个阶段,分别是宣传、讲课、小结阶段。作为学校中年老师,我既参加了教学练兵的讲课,也参加了教学比武阶段的讲课。这次讲课又让自己经历了一次历练,收获了一些心得。 一、挖掘资源,准备充分。 在教学练兵中,我讲的课文是:人民教育出版社出版的八年级语文上册第二单元第七课朱自清写的《背影》,这是一篇写父子亲情的散文;在教学比武中,我讲的课文是:第三单元第十一课茅以升写的《中国石拱桥》,这是一篇介绍中国石拱桥知识的事物说明文。 为了上好课,我每次都认真的钻研教材,教案,教师教学用书,真正把课文的教学目标熟练地掌握在自己的心中。还要搞清楚课文的内容、结构、作者的写作思想、情感,课文的重点难点,教学时的切

入点,如何导入,如何设置问题,以及课堂上可能出现的哪些问题我都进行了预设。甚至还上网查找同类文章教学的课件。这样经过精心的准备后,再去给学生上课,一则心中有数一些了,二则能很好的掌控课堂。 除此以外,我还在下课的间隙时间里和同学们一起聊天,从而了解他们的一些思想特点,从和他们交流的过程中掌握一些信息,好在课堂上随时作为引用的材料。 根据我收集到的资源和材料,我分别把这两课制作成了可以教学的课件,这样就已经为说课和讲课作好了准备。 二、说课精练,注重过程。 在说课阶段,我从四个方面进行了说明。第一、说教材。主要是说说这一篇课文在本册书中所占的地位和在这个单元中讲这一课要注意的一些问题。至于教学的目标、重难点、突破点等,那也是在说课的范围之内的了。第二、说教法。也就是我在讲这一课时的构想,以及如何引导学生学习的方法,这个过程要说得详细点。第三、说学情。学生学这篇课文的基础、学生个人情感、经历等,老师都要事先了解一些,正所谓“知己知彼”吧!这样上起课来会更游刃有余一些。第四、说学法。即如何引导学生学习这一课,在课堂教学过程中要运用哪些方法。 课说完了以后,老师们分别提出了一些修改意见,我再进一步的进行完善,这样就可以进入下一个环节——讲课了。

计算机图形学 复习题

计算机图形学复习题 基本知识点 1、在图形文件系统中,点、线、圆等图形元素通常都用其几何特征参数来描述,在图形系统中,图形处理运算的精度不取决于显示器的分辨率,在彩色图形显示器中,使用RGB颜色模型。计算机图形学以计算几何为理论基础。 2、深度缓存算法并不需要开辟一个与图像大小相等的深度缓存数组,深度缓存算法能并行实现,深度缓存算法中没有对多边形进行排序。 3、计算机图形处理中,除了应用到各种算法外,还经常会处理大量的图形方面的数据,因而必须应用到数据库技术,图形数据库设计的子库层次是一个简单的、具有普遍存储规则的许多物体的集合,图形数据库的设计一般有物体和子库两个层次。 4、投影线从视点出发,主灭点最多有3个,任何一束不平行于投影面的平行线的透视投影将汇成一点。在平面几何投影中,若投影中心移到距离投影面无穷远处,则成为平行投影。 5、实体模型和曲面造型是CAD系统中常用的主要造型方法,曲面造型是用参数曲面描述来表示一个复杂的物体,从描述复杂性和形状灵活性考虑,最常用的参数曲面是3次有理多项式的曲面,在曲线和曲面定义时,使用的基函数应有两个重要性质:凸包性和仿射不变性。 6、简单光反射模型,又称为Phong模型,它模拟物体表面对光的反射作用,简单光反射模型主要考虑物体表面对直射光照的反射作用,在简单光反射模型中,对物体间的光反射作用,只用一个环境光变量做近似处理。 7、定义了物体的边界也就唯一的定义了物体的几何形状边界,物体的边界上的面是有界的,而且,面的边界应是闭合的,物体的边界上的边可以是曲线,但在两端之间不允许曲线自相交。 8、透视投影的投影线从视点出发,主灭点最多有3个,任何一束不平行于投影面的平行线的透视投影将汇成一点。 9、图形数据按照目的不同一般可以分为图形的表示数据和图形的显示数据。 10、双线性法向插值法(Phong Shading)的优点是高光域准确。 11、画圆弧的算法有角度DDA 法、逐点比较法、终点判断法、Bresenham画圆法四种。 12、Z缓冲器消隐算法是最简单的消除隐藏面算法之一。 13、若要对某点进行比例、旋转变换,首先需要将坐标原点平移至该点,在新的坐标系下做比例或旋转变换,然后再将原点平移回去。 14、在种子填充算法中所提到的八向连通区域算法同时可填充四向连通区。 15、多边形被两条扫描线分割成许多梯形,梯形的底边在扫描线上,腰在多边形的边上,并且相间排列,多边形与某扫描线相交得到偶数个交点,这些交点间构成的线段分别在多边形内、外,并且相间排列,边的连贯性告诉我们,多边形的某条边与当前扫描线相交时,很可能与下一条扫描线相交。 16、透视投影又可分为一点透视、二点透视、三点透视,斜投影又可分为斜等测、斜二测,正视图又可分为主视图、侧视图、俯视图。 17、Bezier曲线不一定通过其特征多边形的各个顶点,Bezier曲线两端点处的切线方向必须与起特征折线集(多边形)的相应两端线段走向一致,Bezier曲线可用其特征多边形来定义。 18、扫描线算法对每个象素只访问一次,主要缺点是对各种表的维持和排序的耗费较大,边填充算法基本思想是对于每一条扫描线与多边形的交点,将其右方象素取补,边填充算法较适合于帧缓冲存储器的图形系统。 19、深度缓冲器算法最简单常用的面向应用的用户接口形式:子程序库、专用语言和交互命令。图形用户界面的基本元素有窗口、图标、菜单、指点装置。在计算机图形学中,被裁剪的对象可以是线段、多边形和字符三种形式。 20、扫描仪最重要的参数是光学精度和扫描精度。

相关文档
最新文档