我被无情秒杀的小路考

经过了1个月(4天)的小路练习后,前几天得到通知说本周五进行小路考考试,昨天去考试熟悉了一下考试环境,一切OK,没有问题。

星期五终于还是到来了,早上我4点40分就起床了,吃个早饭,打车到集合点,然后行车至驾校。时间还早,每人再练习两圈,之后7点还是来了,排除、报号、入场,考试正式开始了。首先进行的是倒装,这种小问题,怎么可能难到我呢,只要有库的,我都可以搞得定(哎。。。),短短几分钟很快就过去了,最后报“考试合格”,所以说嘛,只要有库的都是小问题。接下来进行小路考,第一个进行的是侧方停车,做好准备工作,启动了,对线、倒车,进去发现,压白线了,没了,进行补考吧,有了第一次的教训后,还是不对,因此,我就注意了,是不是没有对准,再来一次,结果还是压白线了,考试结束。我的小路就从开始处将我扼杀,它是多么的无情啊。

下来后,我反思,可我真的不知道原因出在哪里,值得一说的是,我从开始练车开始,侧方停车就没有不过的,哎。。。,这次真是的,只有等待一个月后的补考了啊。。。杯具。。。

微软SQL Server认证

部署Asp.net 应用程序至SharePoint2010步骤及相关Session问题解决步骤

最近公司做了一个Asp.net的应用程序,需要部署到SharePoint2010中,记录操作步骤如下:

注意:SharePoint2010不支持Framework4.0的应用程序,所以在编译时请选择Framework3.5

1.在Sharepoint的Layout下面建立自己应用程序对应的Folder,我的路径是:C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\,建立的Folder叫WF;

2.将应用程序发布至C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\WF下;

3.将WF下Bin里的内容部署至在Sharepoint的站点下的Bin Folder里,我是部署到我80下的Folder中,默认是C:\inetpub\wwwroot\wss\VirtualDirectories\80;

4.将WF下Web.config中的自定义配置信息部署至站点下的Web.config中,本例配置如下:

<section name=”loggingConfiguration” type=”Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
<section name=”loggingConfigurationEnable” type=”Infobase.Component.LogHelper.LoggingEnableConfigurationSection,Infobase.Component.LogHelper”/>
<section name=”localizationConfiguration” type=”Infobase.Component.CustomizeControls.LocalizationConfigurationSection,Infobase.Component.CustomizeControls”/>
<section name=”cachingConfiguration” type=”Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/>
<section name=”taskStatusConfiguration” type=”Infobase.Component.CustomizeControls.TaskStatusConfigurationSection,Infobase.Component.CustomizeControls”/>
<section name=”urgentLevelConfiguration” type=”Infobase.Component.CustomizeControls.UrgentLevelConfigurationSection,Infobase.Component.CustomizeControls”/>
<section name=”workflowStatusConfiguration” type=”Infobase.Component.CustomizeControls.WorkflowStatusConfigurationSection,Infobase.Component.CustomizeControls”/>

<section name=”loggingConfiguration” type=”Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/> <section name=”loggingConfigurationEnable” type=”Infobase.Component.LogHelper.LoggingEnableConfigurationSection,Infobase.Component.LogHelper”/> <section name=”localizationConfiguration” type=”Infobase.Component.CustomizeControls.LocalizationConfigurationSection,Infobase.Component.CustomizeControls”/> <section name=”cachingConfiguration” type=”Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″/> <section name=”taskStatusConfiguration” type=”Infobase.Component.CustomizeControls.TaskStatusConfigurationSection,Infobase.Component.CustomizeControls”/> <section name=”urgentLevelConfiguration” type=”Infobase.Component.CustomizeControls.UrgentLevelConfigurationSection,Infobase.Component.CustomizeControls”/> <section name=”workflowStatusConfiguration” type=”Infobase.Component.CustomizeControls.WorkflowStatusConfigurationSection,Infobase.Component.CustomizeControls”/>

<loggingConfiguration configSource=”ConfigFiles\\logging.config”/>

<loggingConfigurationEnable configSource=”ConfigFiles\\loggingenable.config”/>

<cachingConfiguration configSource=”ConfigFiles\\caching.config”/>

<localizationConfiguration DirectUrl=”~/Default.aspx” LocalizationString=”English|en-us,中文|zh-cn” ConnectionString=”" StoredProcedureName=”" TextField=”" ValueField=”"/>

<taskStatusConfiguration TaskStatusValues=”assigned|已指派,cancelled|已取消,completed|已完成,new|待指派,overdue|过期,Reassigned|重指派,removed|已删除” IsCaching=”true”/>

<urgentLevelConfiguration UrgentLevelValues=”紧急|Urgent,普通|Normal” IsCaching=”true”/>

<workflowStatusConfiguration WorkflowStatusValues=”进行中|Running,已取消|Cancelled,已完成|Completed” IsCaching=”true”/>

在我的部署中,有一个ConfigFiles配置文件夹,同样需要拷贝至80下

5. 将AppSetting的自定义信息拷贝拷贝至80下Web.config中对应的节中,我的需要如下:

<add key=”ServerUrl” value=”http://xw:8015/AgilePointServer”/>

<add key=”ProcessAdaptationUrl” value=”http://xw:8015/EnterpriseManager/ProcessAdaptation/LinkedTasks.aspx”/>

<add key=”HostingMechanism” value=”IIS”/>

<add key=”SystemUserDomain” value=”xw”/>

<add key=”SystemUserName” value=”Administrator”/>

<add key=”SystemUserPassword” value=”abcdef”/>

<add key=”PreApplyFolder” value=”../WFForm/”/>

<add key=”LDAPConfig” value=”LDAP://DC=infobase,DC=com”/>

<add key=”DomainName” value=”infobase”/>

6. 将ConnectionString同样拷贝至80下Web.config中对应的节中,我的需要如下:

<connectionStrings>

<add name=”ConnStr” connectionString=”Data Source=xw;Initial Catalog=AgilePoint50;User ID=sa;Password=password” providerName=”System.Data.SqlClient”/>

</connectionStrings>

7. 将Assemblies中的配置信息同样拷贝至80下Web.config中对应的节中,我的需要如下:

<add assembly=”AjaxControlToolkit, Version=3.0.30512.20315, Culture=neutral, PublicKeyToken=28F01B0E84B6D53E”/>

<!–<add assembly=”System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

<add assembly=”System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A”/>

<add assembly=”System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>–>

<add assembly=”System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

<add assembly=”System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

<add assembly=”System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>

<add assembly=”System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>

<add assembly=”System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>

<add assembly=”System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>

<add assembly=”System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>

<add assembly=”System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>

<add assembly=”System.Data.Services.Client, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>

<add assembly=”System.Data.Services.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>

<add assembly=”System.Data.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089″/>

<add assembly=”System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A”/></assemblies>

8. 将pages–>controls中的自定义控件部署至至80下Web.config中对应的节中(需要注意的是这些自定义UC也需要拷贝至80目录下),我的需要如下:

<add tagName=”menu” tagPrefix=”cuc” src=”~/UserControls/Menu.ascx”/>

<add tagName=”griduc” tagPrefix=”cuc” src=”~/UserControls/CustomizeGrid/GridUC.ascx”/>

<add namespace=”AjaxControlToolkit” assembly=”AjaxControlToolkit” tagPrefix=”ajaxToolkit”/>

<add tagName=”ApprovalHistory” tagPrefix=”cuc” src=”~/UserControls/ApprovalHistory.ascx”/>

<add tagName=”ApproveCommentUC” tagPrefix=”cuc” src=”~/UserControls/ApproveCommentUC.ascx”/>

9. 如果使用Session,还需要将session信息配置到Web.config中,配置此信息时,需要将Pages结点的enableSessionState设置为true,默认为flase;

测试过程中需要的到问题:

问题1:Session无法启用,解决方案如下:

1. 打开“管理工具”-“服务”,检查“ASP.NET状态服务”是否处于“启动”状态,如果不是,启动它;

2. 打开 SharePoint应用程序的 web.config文件(如我的建立的80端口的网站的web.config文件路径为:C:/inetpub/wwwroot/wss/VirtualDirectories/80),找到 <httpModules>节点,在<httpModules>节点里添加

<add name=”Session” type=”System.Web.SessionState.SessionStateModule” />。

再找到 <pages>节点,将enableSessionState属性设置为 true;

3. 打开 IIS7 管理器,定位到SharePoint应用程序下,双击打开“模块”,在右键菜单(或者在右侧“操作”窗口)里点击“添加托管模块”,在弹出来的窗口里,名称里输入“Session”,类型里选择“System.Web.SessionState.SessionStateModule, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”。

通过如上应该可以解决Session问题

问题2:在我的项目中使用了资源文件,但是在程序跑起后,报资源文件找不到错误,解决方案如下:

将我们程序的资源文件拷贝至80下的资源文件文件夹中

通过如上部署,应用程序部署成功,谢谢!

create index view in sql server 2008

create view vd
with scheme binding
as
select orderid from dbo.orderdetails where orderdate > ’2010-01-04′
go

create clustered index vd(orderid)
go

select * from dbo.vd
–below sentance will get date from view
select orderid from dbo.orderdetails where orderdate > ’2010-01-04′

MY SQL Server CET

 
USE AdventureWorks2008R2;
GO

SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS ‘Row Number’, SalesYTD, PostalCode
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
 
–row_number with partition
SELECT FirstName, LastName, ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS ‘Row Number’, SalesYTD, PostalCode
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
 
–rank
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,RANK() OVER
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS ‘RANK’
FROM Production.ProductInventory i
    INNER JOIN Production.Product p
        ON i.ProductID = p.ProductID
ORDER BY i.LocationID;
GO
 

–dense_rank
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity,
    DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity)     AS DENSE_RANK
FROM Production.ProductInventory i
    INNER JOIN Production.Product p
        ON i.ProductID = p.ProductID
ORDER BY Name;
–Ntile
SELECT p.FirstName, p.LastName
    ,NTILE(4) OVER(ORDER BY SalesYTD DESC) AS ‘Quartile’
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s
    INNER JOIN Person.Person p
        ON s.BusinessEntityID = p.BusinessEntityID
    INNER JOIN Person.Address a
        ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
    AND SalesYTD <> 0;
GO

–Common Table Expression: CTE

—A. Creating a simple common table expression
WITH Sales_CTE (SalesPersonID, NumberOfOrders)
AS
(
    SELECT SalesPersonID, COUNT(*)
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
    GROUP BY SalesPersonID
)
SELECT SalesPersonID, NumberOfOrders
FROM Sales_CTE
ORDER BY SalesPersonID;
use AdventureWorks
go
SELECT ManagerID, EmployeeID, Title
FROM HumanResources.Employee
where ManagerID is null
go

–Using a recursive common table expression to display multiple levels of recursion
WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS
(
    SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel
    FROM HumanResources.Employee
    WHERE ManagerID IS NULL
    UNION ALL
    SELECT e.ManagerID, e.EmployeeID, e.Title, EmployeeLevel + 1
    FROM HumanResources.Employee AS e
        INNER JOIN DirectReports AS d
        ON e.ManagerID = d.EmployeeID
)
SELECT ManagerID, EmployeeID, Title, EmployeeLevel
FROM DirectReports
ORDER BY ManagerID;
GO
–Using a recursive common table expression to display a hierarchical list

WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort)
AS (SELECT CONVERT(varchar(255), e.FirstName + ‘ ‘ + e.LastName),
        e.Title,
        e.EmployeeID,
        1,
        CONVERT(varchar(255), e.FirstName + ‘ ‘ + e.LastName)
    FROM dbo.MyEmployees AS e
    WHERE e.ManagerID IS NULL
    UNION ALL
    SELECT CONVERT(varchar(255), REPLICATE (‘|    ‘ , EmployeeLevel) +
        e.FirstName + ‘ ‘ + e.LastName),
        e.Title,
        e.EmployeeID,
        EmployeeLevel + 1,
        CONVERT (varchar(255), RTRIM(Sort) + ‘|    ‘ + FirstName + ‘ ‘ +
                 LastName)
    FROM dbo.MyEmployees AS e
    JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
    )
SELECT EmployeeID, Name, Title, EmployeeLevel
FROM DirectReports
ORDER BY Sort;
GO
–use CTE to return a subset to implement a pagenation
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS ‘RowNumber’
    FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;

create the partition table

– 1.create a partition function, split the data to group
create partition function pf_orderDatemy(Datetime)
as range right
for values(’01/01/2003′,’01/01/2004′,’01/01/2005′)
go

– 2.create the partition scheme 分区解决方案
create partition scheme ps_OrderData
as partition pf_orderDatemy
to(FG1,FG2,FG1,FG2)
go

– 3. create data table on partition slution
create table mytable
(
 id int identity(1,1),
 name varchar(50),
 [desc] varchar(50),
 modifyDate datetime
) on ps_OrderData(modifyDate)
go

insert into mytable values(‘a’,'b’,’01/01/2001′)
go

insert into mytable values(‘a’,'b’,’03/01/2003′)
go

insert into mytable values(‘a’,'b’,’03/01/2004′)
go

insert into mytable values(‘a’,'b’,’03/01/2005′)
go

insert into mytable values(‘a’,'b’,’03/01/2006′)
go
SELECT
partition = $PARTITION.pf_orderDatemy([modifyDate])
,rows      = COUNT(*)
,min    = MIN([modifyDate])
,max    = MAX([modifyDate])
FROM mytable
GROUP BY $PARTITION.pf_orderDatemy([modifyDate])
ORDER BY PARTITION

– split partition
alter partition scheme ps_OrderData
next used [fg1]
go

ALTER PARTITION FUNCTION pf_orderDatemy()
SPLIT RANGE (’06/01/2008′)
go

ASP.NET MVC3 + SQL Server 2008 RC部署悲剧历程

7月份左右的时候我开始转战上海,在上海这又一金融中心中打起了酱油,今天这篇文章是我回来的第一篇,没有想到却是那么的悲剧。

好吧,让我们来描述这一悲剧的故事吧。

时间:2011年8月4日下午

地点:世纪大道地铁站附近汤臣金融大厦内某公司

悲剧故事名称:ASP.NET MVC3 + SQL Server 2008 R2部署

在8月4日,根据和客户约好的时间,到客户方进行应用软件的部署实施工作,当时和客户确认的开发环境如下:

Windows Server 2008 + IIS7.0 + .NET Framework 4.0 + SQL Server 2008

我们的实际开发环境是:Windows Server 2008 + IIS7.0 + .NET Framework 4.o + SQL Server 2008 R2

其实与客户的环境只有一个数据库的区别,当我到客户方进行安装的时候,发现客户方的需求基本能够满足需求,于是实施安装工作。

根据我的了解,MVC3.0是不需要安装的,只需要在项目的Bin Folder下引用MVC3.0的dll就行了,但是实施过程中怎么都跑不起来,搞到路径不识别。通过了解,采取以下步骤:

1. 安装ASP.NET MVC3.o

2. 重新Regist .NET Framework 4.o

完成以上两部后依然跑不起来,此时的我已经郁闷至极啊,下午去的迟,一不小心就到下班时间了(包括代码上传,200多M的代码,客户那里代码上传很慢)。

晚上回到家中,继续奋力研究,最好确定重新启动客户的服务器,经和客户确认后,重新启动了服务器,结果MVC3.0的应用服务可以起来了,终于看到一点希望了。但接着后面又来了一个新的问题,就是MVC有目录下自动生成的一个__ViewState的文件一直报错编译出错的问题,搞得我很是郁闷,打开开发文件,发现里面什么东西都没有,其实就一空文件,并且没有用到,就是不明白到底有什么问题。

针对上面的问题,采取如下措施:

直接删除此文件,反正没有用到,并且里面什么内容也没有。

结果程序跑起来了。

但是这时需要去配置数据库了,但是令人悲剧的事情又发生了,SQL Server 2008 R2的Back up文件在SQL Server 2008中不能恢复,报版本冲突问题,无耐网上找到很久也没有找到解决方案,我同事也帮我打电话给微软人进行咨询,微软的人说,只要使用的是公共的数据类型,一般都没有问题,我看了看我定义的类型,都是公共的,哎,微软的人真扯蛋(下周要参加微软的数据库培训,到时候要好好咨询一下)。

针对上面的问题,采取的措施是:

1.  导出数据现有的数据结构,生成创建语句,然后在客户端直接创建数据结构

2. 手动增加数据

完了后终于可以跑了,哎,功夫不负有心人啊,紧接着还是悲剧。

增加进去的中文全部变成乱码了,经分析原因是数据库使用语言不同,开发环境使用的是中文,页客户方默认的English的,所以中文导入后会显示乱码,哎!

无耐,只能修改数据库语言,然后重新加载乱码的记录,最好终于修成正果。

针对这一悲剧的故事总结如下:

1. 当安装完东西后,如果不能按正常运行,首先查看服务是否起来及重新启动计算机

2. 在部署的程序中移出任何不必要的东西

3. 开发环境与部署环境尽量保持相同的版本,以及型号

附言:悲剧之人必有可悲之处,可怜之人必有可恨之处

我旅游过的地点(地图)

    项目管理系统学习--项目及项目管理的概念

    项目

    项目是为了完成特定的产品、服务或者一定的成果页进行的临时性工作,每一个项目都应该有明确的起点和终点。一个项目的终止往往是完成或者未完成项目的需求,也或者项目的需求不在有意义的情况下;项目所具有的临时性并不代表项目所生产的产品、服务或者成果的临时性。

    项目管理

    运用现有的知识、技能、工具与技术应用于项目活动过程之中,以满足项目的需求,这样的过程就是项目管理,每个项目拥有多个不同的项目管理过程。

    项目管理过程

    • 启动过程
    • 规划过程
    • 执行过程
    • 监控过程
    • 结束过程

    项目管理的主要内容

    1. 明确和控制需求范围(范围的扩大与缩小,范围的变更)
    2. 理解与明确各项目干系人的期望
    3. 平衡相互制约的项目因素(包括:范围、质量、进度、资源、成本、风险)

    新加坡乌敏岛一日游(2011年5月22日)

    这个月的14~15号去印尼玩了一趟,写了一篇《印度尼西亚民丹岛旅游记(2011年5月14~15日)》。回来的第一个周末,过完一个周六,想了想,是不是应该到新加坡本地走走呢?

    怀着这样的思索,我想新加坡这么大点的地方,大部分我都去玩过,也没有什么地方可以去。但是这里又是一个由群岛组成的共和国噢!它是对马来西亚的延伸,我本身生活在新加坡岛上工作与生活,所以想想是不是可以去其它的岛转转。

    最终我选择了新加坡的乌敏岛,它是新加坡第三大岛(第一大的就是新加坡岛,第二大的是德光岛,好像是军事基地,不知道能不能去,第四大的就圣淘沙岛,哈哈,去过很多次了啊)。它的面积大概是二十几平方公里,距离新加坡岛大概十分钟的船程。先show一张上岛的照片。

    我登岛了啊

    22日早上8点半起床,从Hougang Central Interchange坐89号到Bef Singapore Variation站下,大约耗时45分钟,然后走到Changi Point Ferry Terminal坐船,这里的船大部份都是十二座,只要做满就走,周末这里一般5分钟就可以发一班船。踏上小小的快船,再次短暂的体验漂泊于大海的体验。嘿嘿,不过这次让我第一次看到这么大的汽艇。

    汽艇船

    经过十分钟后,便到乌敏岛的码头,登上码头后,你就将看到乌敏人们对你的欢迎。

    乌敏人民欢迎我,嘿嘿

    入岛指示牌

    人们来这个岛一般会做三件事,一件就是骑自行车,第二就是可以吃海鲜,最后一件就是休闲了啊。虽然这里距离新加坡岛只有十分钟的船程,但却与繁华闹市的新加坡岛相比,这里却是彻底的农村体验,这里几乎保持了近原始的面貌(除了自行车道),到处都是茂密丛林,这也是我第一次如此的接近于自然。

    入岛后,第一件事情当然就是租一辆自行车(当然也有人不租,相信他们是不会走完全部的),在这里租车不按小时算,按天算,他们租给你的车是从早上9点开始到晚上6点结束,在这里你只需要交租车的费用和你的电话号码(不需要押金),我租了8块新币一天的,相对比较好的一种(如上第一张照片所示),接着便开始了骑车的旅行了,照片如下。

    乌敏岛风景一

    乌敏岛风景二

    乌敏岛风景三

    乌敏岛风景四

    呵呵,一日游相对来说还是不错的啊。