问题标签 [playorm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
189 浏览

playorm - 我的代码在本地运行并发出警告,但未在服务器上运行

我有一个需要使用 PlayORM 来完成插入/查询等工作的网络应用程序。我的代码在本地运行没有任何问题,但出现以下警告消息:

com.alvazan.orm.impl.meta.scan.ScannerForClass processIdFieldWorksWARN:我们避免重复扫描一个 class=class com.alvazan.orm.impl.meta.data.MetaClassSingle 一切仍然可以正常工作,但请向我们发送堆栈跟踪,以便我们可以看到为什么会发生这种情况 java.lang.RuntimeException: null at com.alvazan.orm.impl.meta.scan.ScannerForClass.processIdFieldWorks(ScannerForClass.java:234) [playorm-1.4.3.jar:1.4.3 December 13 2012]

但是当我尝试在 JSF 页面上执行该代码时,该代码不起作用。以下是错误信息:

INFO caoimpl.meta.scan.ScannerForClass - 扫描类=类 com.alvazan.orm.api.z8spi.meta.DboColumnMeta java.lang.RuntimeException: 失败扫描类(参见链式异常)=类 com.alvazan.orm.api。 z8spi.meta.DboColumnMeta

有人知道我能做些什么来解决这个问题吗?

更新:

  • 第一个堆栈跟踪 - 在本地运行良好(运行外部网站)

2013-02-13 19:20:18,173 com.alvazan.orm.impl.meta.scan.ScannerForClass processIdFieldWorksWARN:我们避免双重扫描一个类=类 com.alvazan.orm.impl.meta.data.MetaClassSingle 一切仍然有效很好,但是请向我们发送堆栈跟踪,以便我们了解为什么会发生这种情况 java.lang.RuntimeException: null at com.alvazan.orm.impl.meta.scan.ScannerForClass.processIdFieldWorks(ScannerForClass.java:234) [playorm- 1.4.3.jar:1.4.3 December 13 2012] at com.alvazan.orm.impl.meta.scan.ScannerForClass.inspectFieldImpl(ScannerForClass.java:206) [playorm-1.4.3.jar:1.4.3 December 13 2012] 在 com.alvazan.orm.impl.meta.scan.ScannerForClass.inspectField(ScannerForClass.java:193) [playorm-1.4.3.jar:1.4.3 December 13 2012] 在 com.alvazan.orm.impl。 meta.scan.ScannerForClass.scanFields(ScannerForClass.java:188) [playorm-1.4.3.jar:1.4.3 December 13 2012] at com.alvazan.orm.impl.meta.scan.ScannerForClass.scanSingle(ScannerForClass.java:111) [playorm-1.4.3.jar:1.4.3 December 13 2012] at com.alvazan.orm .impl.meta.scan.ScannerForClass.scanMultipleClasses(ScannerForClass.java:104) [playorm-1.4.3.jar:1.4.3 December 13 2012] at com.alvazan.orm.impl.meta.scan.ScannerForClass.addClass( ScannerForClass.java:64) [playorm-1.4.3.jar:1.4.3 December 13 2012] 在 com.alvazan.orm.layer0.base.MyClassAnnotationDiscoveryListener.scanClass(MyClassAnnotationDiscoveryListener.java:42) [playorm-1.4.3。 jar:1.4.3 December 13 2012] at com.alvazan.orm.layer0.base.MyClassAnnotationDiscoveryListener.discovered(MyClassAnnotationDiscoveryListener.java:34) [playorm-1.4.3.jar:1.4.3 December 13 2012] at com.impetus .annovention.Discoverer.discoverAndIntimateForClassAnnotations(Discoverer.java:197) [playorm-1.4.3.jar:1.4.3 2012 年 12 月 13 日] 在 com.impetus.annovention.Discoverer.discover(Discoverer.java:155) [playorm-1.4.3.jar:1.4.3 2012 年 12 月 13 日] at com.alvazan.orm.layer0.base.BaseEntityManagerFactoryImpl.rescan(BaseEntityManagerFactoryImpl.java:82) [playorm-1.4.3.jar:1.4.3 December 13 2012] at com.alvazan.orm.layer0.base.BaseEntityManagerFactoryImpl .setup(BaseEntityManagerFactoryImpl.java:133) [playorm-1.4.3.jar:1.4.3 December 13 2012] at com.alvazan.orm.impl.bindings.BootstrapImpl.createInstanceImpl(BootstrapImpl.java:64) [playorm-1.4 .3.jar:1.4.3 December 13 2012] at com.alvazan.orm.impl.bindings.BootstrapImpl.createInstance(BootstrapImpl.java:35) [playorm-1.4.3.jar:1.4.3 December 13 2012] at com.alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:57) [playorm-1.4.3.jar:1.4.3 December 13 2012] 在 com。alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:52) [playorm-1.4.3.jar:1.4.3 December 13 2012] at com.alvazan.orm.api.base.Bootstrap.create(Bootstrap .java:45) [playorm-1.4.3.jar:1.4.3 December 13 2012] 在 com.alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:24) [playorm-1.4.3.jar :1.4.3 December 13 2012] at com.s1mbi0se.dmp.da.dao.PlayOrmConfiguration.init(PlayOrmConfiguration.java:45) [classes/:na] at com.s1mbi0se.dmp.da.dao.PlayOrmConfiguration.getEntityManager( PlayOrmConfiguration.java:51) [classes/:na] 在 com.s1mbi0se.dmp.da.dao.AbstractDao.getEm(AbstractDao.java:10) [classes/:na] 在 com.s1mbi0se.dmp.da.dao。 UserDao.findInputPhase(UserDao.java:201) [classes/:na] 在 com.s1mbi0se.dmp.da.bean.InputPhaseStru.manageInputPhase(InputPhaseStru.java:105) [classes/:na] 在 com.s1mbi0se.dashboard。服务。DashboardService.readSolrLogFile(DashboardService.java:44) [classes/:na] at com.s1mbi0se.dashboard.service.DashboardService.main(DashboardService.java:29) [classes/:na]

  • 第二个堆栈跟踪 - 不起作用(网络环境)

19:05:54.090 [http-bio-8080-exec-3] 信息 c.alvazan.orm.logging.NoSqlRawLogger - [rawlogger] 启动 NoSQL 服务提供程序并连接 19:05:54.101 [http-bio-8080-exec- 3] INFO caolsdcColumnFamilyHelper - On keyspace=dmpExisting column family=[inputphasestru, stringindice, dbocolumnmeta, integerindice, user, dbodatabasemeta, dbotablemeta] 注意:我们将在您保存没有列族的实体时自动创建新的列族 19:05:54.101 [http-bio-8080-exec-3] INFO caolbBaseEntityManagerFactoryImpl - 使用 nosql.Persistence.class 19:05:54.102 开始扫描 jars [http-bio-8080-exec-3] INFO ciannovention.ClasspathDiscoverer - 添加 jar 文件进行扫描=jar:file:/opt/apache-tomcat-7.0.30/wtpwebapps/teste28/WEB-INF/lib/playorm-1.4.3.jar!/ 19:05:54.102 [http-bio-8080-exec-3 ] 信息annovention.ClasspathDiscoverer - 添加用于扫描的 jar 文件=jar:file:/opt/apache-tomcat-7.0.30/lib/playorm-1.4.3.jar!/ 19:05:54.102 [http-bio-8080-exec- 3] INFO ciannovention.ClasspathDiscoverer - 添加用于扫描的 jar 文件=jar:file:/opt/apache-tomcat-7.0.30/wtpwebapps/teste28/WEB-INF/lib/dmpDataAccess-0.0.1-SNAPSHOT.jar!/ 19 :05:54.119 [http-bio-8080-exec-3] 调试 caolbMyClassAnnotationDiscoveryListener - class=com.alvazan.orm.api.z8spi.meta.DboColumnMeta anno=com.alvazan.orm.api.base.anno.NoSqlEntity 19: 05:54.119 [http-bio-8080-exec-3] INFO caoimpl.meta.scan.ScannerForClass - 扫描类=类 com.alvazan.orm.api.z8spi.meta.DboColumnMeta java.lang.RuntimeException:失败扫描类(见链式异常)=com.alvazan.orm.layer0.base 的类 com.alvazan.orm.api.z8spi.meta.DboColumnMeta。MyClassAnnotationDiscoveryListener.scanClass(MyClassAnnotationDiscoveryListener.java:44) at com.alvazan.orm.layer0.base.MyClassAnnotationDiscoveryListener.discovered(MyClassAnnotationDiscoveryListener.java:34) at com.impetus.annovention.Discoverer.discoverAndIntimateForClassAnnotations(Discoverer.java:197) at com .impetus.annovention.Discoverer.discover(Discoverer.java:155) 在 com.alvazan.orm.layer0.base.BaseEntityManagerFactoryImpl.rescan(BaseEntityManagerFactoryImpl.java:82) 在 com.alvazan.orm.layer0.base.BaseEntityManagerFactoryImpl.setup (BaseEntityManagerFactoryImpl.java:133) 在 com.alvazan.orm.impl.bindings.BootstrapImpl.createInstanceImpl(BootstrapImpl.java:64) 在 com.alvazan.orm.impl.bindings.BootstrapImpl.createInstance(BootstrapImpl.java:35) 在com.alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:57) 在 com。alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:52) 在 com.alvazan.orm.api.base.Bootstrap.create(Bootstrap.java:45) 在 com.alvazan.orm.api.base。 Bootstrap.create(Bootstrap.java:24) 在 com.s1mbi0se.dmp.da.dao.PlayOrmConfiguration.init(PlayOrmConfiguration.java:45) 在 com.s1mbi0se.dmp.da.dao.PlayOrmConfiguration.getEntityManager(PlayOrmConfiguration.java: 51) 在 com.s1mbi0se.dmp.da.dao.PlayOrmConfiguration.init(PlayOrmConfiguration.java:45) 在 com.s1mbi0se.dmp.da.dao.PlayOrmConfiguration.getEntityManager(PlayOrmConfiguration.java:51) 在 com.s1mbi0se.dmp .da.dao.AbstractDao.getEm(AbstractDao.java:10) 在 com.s1mbi0se.dmp.da.dao.UserDao.findInputPhase(UserDao.java:201) 在 com.s1mbi0se.dmp.da.bean.InputPhaseStru.manageInputPhase (InputPhaseStru.java:105) 在 com.s1mbi0se.dashboard.service.DashboardService。在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 javax.el.BeanELResolver.getValue(BeanELResolver.java:87 ) 在 javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67) 在 org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:169) 在 org.apache.el.parser.AstValue。 getValue(AstValue.java:183) 在 org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) 在 org.apache.jasper.el.JspValueExpression。getValue(JspValueExpression.java:106) 在 javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:246) 在 javax.faces.component.UIOutput.getValue(UIOutput.java:67) 在 javax.faces.component.UIInput .getValue(UIInput.java:150) 在 org.apache.myfaces.shared.renderkit.RendererUtils.getValue(RendererUtils.java:505) 在 org.apache.myfaces.shared.renderkit.RendererUtils.getStringValue(RendererUtils.java:331 ) 在 org.apache.myfaces.shared.renderkit.html.HtmlTextRendererBase.renderInput(HtmlTextRendererBase.java:186) 在 org.apache.myfaces.shared.renderkit.html.HtmlTextRendererBase.renderInputBegin(HtmlTextRendererBase.java:197)。 apache.myfaces.shared.renderkit.html.HtmlTextRendererBase.encodeEnd(HtmlTextRendererBase.java:75) 在 javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:580) 在 javax。faces.component.UIComponent.encodeAll(UIComponent.java:762) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:758) at org.apache.myfaces.shared.view.JspViewDeclarationLanguageBase.actuallyRenderView(JspViewDeclarationLanguageBase.java: 362) 在 org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285) 在 org.apache.myfaces.lifecycle .RenderResponseExecutor.execute(RenderResponseExecutor.java:115) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:199) at org. org.apache.catalina.core 中的 apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)。ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 在 org .apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve .java:99) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina。 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at java.util.concurrent .ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) 原因: com.google.inject.ProvisionException:Guice 配置错误:908) 在 java.lang.Thread.run(Thread.java:662) 引起:com.google.inject.ProvisionException:Guice 提供错误:908) 在 java.lang.Thread.run(Thread.java:662) 引起:com.google.inject.ProvisionException:Guice 提供错误:

1) 注入构造函数时出错,java.lang.NoClassDefFoundError: Could not initialize class com.alvazan.orm.api.z8spi.meta.DboTableMeta at com.alvazan.orm.impl.meta.data.MetaClassInheritance.(MetaClassInheritance.java:25 ) 同时定位 com.alvazan.orm.impl.meta.data.MetaClassInheritance

在 com.alvazan.orm.impl.meta.data.MetaInfo.findOrCreate(MetaInfo.java:58) 在 com.alvazan 的 com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:987) 出现 1 个错误。 orm.impl.meta.scan.ScannerForClass.addClass(ScannerForClass.java:59) at com.alvazan.orm.layer0.base.MyClassAnnotationDiscoveryListener.scanClass(MyClassAnnotationDiscoveryListener.java:42) ... 63 更多原因:java.lang .NoClassDefFoundError:无法在 com.alvazan.orm.impl.meta.data.MetaAbstractClass.(MetaAbstractClass.java:17) 在 com.alvazan.orm.impl 初始化类 com.alvazan.orm.api.z8spi.meta.DboTableMeta .meta.data.MetaClassInheritance.(MetaClassInheritance.java:25) 在 com.alvazan.orm.impl.meta.data.MetaClassInheritance$$FastClassByGuice$$9298a112.newInstance() 在 com.google.inject.internal.cglib.reflect .$FastConstructor。newInstance(FastConstructor.java:40) 在 com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:60) 在 com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85) 在 com. google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) 在 com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978) 在 com.google.inject.internal.InjectorImpl。 callInContext(InjectorImpl.java:1024) 在 com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974) ... 66 更多inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) 在 com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978) 在 com.google.inject.internal.InjectorImpl.callInContext( InjectorImpl.java:1024) 在 com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974) ... 66 更多inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) 在 com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978) 在 com.google.inject.internal.InjectorImpl.callInContext( InjectorImpl.java:1024) 在 com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974) ... 66 更多


遵循整个堆栈跟踪...

谢谢 !

安德烈

0 投票
2 回答
977 浏览

playorm - PlayFramework 2.x 和 playorm ClassNotFoundException: play.Plugin

我尝试通过 PlayFramework 2.x 连接到 cassandra,但出现常见异常 ClassNotFoundException: play.Plugin。我已经完成了 wiki 页面https://github.com/deanhiller/playorm/wiki/PlayFramework-2.x-support上的所有内容。这是我的 maven(我使用 mvn 存储库中的 playorm.jar)项目http://code.google.com/p/cassandranosql-firebrandocm-playorm/source/browse/trunk/,如您所见,有一个测试类UserPlayormDaoImplTest,其中调用NoSql.em();抛出 ClassNotFoundException。我将 plugin2.1.jar 添加到类路径中,但是找不到该类。我不知道有什么问题。感谢帮助。

堆栈跟踪:

0 投票
2 回答
153 浏览

cassandra - PlayORM 中的二级索引是如何实现的,是否支持/处理并发更新?

对于处理并发更新的二级索引,有几种滚动您自己的策略,例如:

http://www.slideshare.net/edanuff/indexing-in-cassandra

它使用 3 个 ColumnFamilies。

我的问题是,PlayORM@NoSqlIndexed注释是如何实现的;就需要/创建哪些额外的 ColumnFamilies 而言?

此外,是否支持并发更新 - 即,两个竞争更新不可能从一个更新索引和另一个更新表?

0 投票
2 回答
157 浏览

playorm - 在 PlayFramework 2.1 中安装 PlayOrm?

我采取的步骤:

  1. 启动了一个新的 Play 应用程序。
  2. 创建了一个 lib 文件夹。
  3. 复制到lib:playOrm/output/jardist/*.jar + playorm/output/libs/playorm.jar + playorm/src/resources/play2plugin/plugin2.1jar
  4. 更改了 conf 并添加了 play.plugins.conf 根据:http ://buffalosw.com/wiki/PlayFramework-2.x-support/
  5. 在这一点上,我开始玩,并得到了 google gson 的缺失类异常。我也将它添加到库中。

现在,当我运行 play 应用程序时,我得到:

插件 [play.CorePlugin] 无法实例化。java.lang.NoSuchMethodException: play.CorePlugin.(play.Application)

我错过了什么?

更新:将我原始帖子中的文件名从 plugin.conf 更正为 play.plugins 并添加堆栈跟踪:

0 投票
1 回答
217 浏览

playorm - PlayORM 中的基本分区

假设我在 cassandra 中有一个具有以下模式的 CF:

  • 时间戳
  • 设备编号
  • 设备名称
  • 设备所有者

PKEY (TimeStamp, Device ID):这意味着分区正在发生在时间戳上。

以下是我感兴趣的查询:

Select * from schema where TimeStamp='..' Select * from schema where DeviceID='..'

第一个查询返回 500K 记录,第二个查询返回 50K 记录。对于第一个查询,瓶颈都是在单个节点上获取,所以我想将数据分布在多个节点上以获得时间戳。第二次查询的瓶颈是所有记录可能分布在不同节点的磁盘上,导致多次磁盘获取。

现在假设我想创建虚拟分区,这样特定时间戳的条目也分布在集群节点上。这在 PlayORM 中可行吗?如果是,您能否提供可以这样做的代码(或这样做的示例)?

我的另一个要求是搜索特定设备 ID 的所有记录。我可以对同一个 CF 的“设备 ID”进行虚拟分区吗?如果是,您能否提供代码/链接来说明如何操作?

如果有人能提供做这样的事情的源代码,我会很高兴,因为文档不是那么容易理解,而且仅仅通过阅读当前文档来编写代码就是一场噩梦。如果没有“完整”的代码示例,评估 PlayORM 似乎是不可能的。

0 投票
1 回答
74 浏览

playorm - PlayORM 可以利用顺序数据布局吗?

与 Cassandra 的分区相比,我想讨论 PlayORM 的虚拟分区是否始终是分区数据的最佳方式。

架构:

  • 时间戳
  • 设备ID
  • 设备名称
  • 设备所有者

对于 TimeStamp,有 500 K 行,对于特定的 Device ID,有 10 K 行

如果我想在 2 列上进行分区,请说时间戳和设备 ID。我有以下方法可以做到这一点:

  1. 使用 PlayORM 在两列上进行“虚拟”分区,这样任何列的任何虚拟分区的数据都分布在所有节点上。
  2. 使用 Cassandra 对其中一列的内置分区支持,并使用 PlayORM 的方法在其他列上创建“虚拟”分区。

如果“设备 ID”以“Cassandra”方式进行分区,则特定“设备 ID”的所有记录将存储在磁盘中的连续位置,并且可以像 playorm 那样继续使用“时间戳”的虚拟分区方法。我可能比 PlayORM 的方法更喜欢这种方法的原因是,使用 Cassandra 的分区方法,如果特定设备 ID 的所有记录位于磁盘上的物理连续位置,则可以快速获取它们,因为它们的数量较少(仅 10K)。这可能比 PlayORM 将所有分区的记录均匀分布在节点上的全部方法更好,因为这样数据将随机分布在磁盘上,导致许多磁盘寻道,显然这会减慢速度。所以即使在 PlayORM 的方法中,

以上似乎是一个有效的观点,还是我的理解有问题?

0 投票
1 回答
210 浏览

cassandra - 使用 PlayOrm 读取查询确实返回适当的结果

我刚刚开始探索 PlayOrm 并尝试运行网络上可用的基本代码来插入和读取数据。当我插入数据时,一切似乎都工作正常,但在读取相同的数据时,它返回的行数不正确。例如。如果我插入 3 条记录,有时会得到 0 条记录,有时会返回所有记录。

按照我正在使用的代码:

用于插入/读取数据的类:

使用此类的代码:

用户数据的内容:

0 投票
2 回答
198 浏览

nosql - PlayORM Cassandra 日期转换错误

我通过 Maven 设置了 PlayORM。

我的主要课程基本上是从这里的示例中复制而来的。

每件事都设置正确并且看起来很好但是我得到了某种日期转换错误。


下面的堆栈跟踪:

0 投票
1 回答
29 浏览

playorm - PlayOrm 级联实体移除

如果我使用remove实体管理器的方法,如下:

并假设 DGEntity 与其他实体有很多关联,remove 方法会仅删除实体 e 还是也会删除关联的类?

我希望我可以通过使用注释配置或向方法传递附加参数来级联删除......这可能吗?

0 投票
1 回答
75 浏览

playorm - 编译 PlayORM 示例的异常

在创建“User.java”和空白“Persistence.java”后,我得到一个编译“Example.java”的异常。以下是详细信息:

据我了解,内存数据库测试不需要安装 Cassandra。

我需要做什么?