[转载]使用python对txt格式的小说进行处理

mikel阅读(1123)

[转载]使用python对txt格式的小说进行处理 – lifehacker – 博客园.

vim的确是神器,可惜sed与vim不完全通用。这篇文章受《 用vim对txt格式的小说重新排版》的启发,在此致谢!

经常下载txt的电子书,格式却不合心意,只好自己再处理。首要的就是处理段内换行。

原来的打算是定制一个vim模式,到时候处理小说时进入该模式,再使用各种快捷键。以此避免txt快捷键对日常编程的干扰。后来发现,vim不像emacs,可以定制自己的模式。(可能可以定制专用的vimrc解决,未经尝试)

于是转向脚本寻求解决办法。sed与awk是此中翘楚,首先试试。可惜早些日子学的sed已经忘的差不多了,找不到比较简洁清晰的解决办法。sed 与grep类似,先读入一行,删除\n,进行各种处理,最后写入文件,再添上\n。 N可以读入下一行到当前模式匹配空间再行处理。但是我需要对整个文件进行匹配,暂时未找到解决办法。

只好再次转投python。Python有自己的re模块,应该没问题。re.sub可以进行替换。费了些时间的,是对中文的匹配。在vim中,可 以用[^\x00-\xff]匹配双字节字符,然而python中却行不通。经过一番google,发现可以用[\x80-\xff]匹配汉字(perl 同此,似乎两者对中文的正则支持还是有待改进)。

至此,问题初步解决:

01 #!/usr/bin/env python
02 #encoding=utf-8
03 import re
04 from sys import argv
05
06
07 if __name__ == '__main__':
08 if len(argv) != 2:
09 print 'usage: filename'
10 else:
11 fh = open(argv[1], 'r')
12 content = fh.read()
13 out = re.sub('\n([\x80-\xff])', r'\1', content)
14 print out

规范行首:

01 #!/usr/bin/env python
02 #encoding=utf-8
03 import re
04 from sys import argv
05
06
07 if __name__ == '__main__':
08 if len(argv) != 2:
09 print 'usage: filename'
10 else:
11 fh = open(argv[1], 'r')
12 content = fh.read()
13 out = re.sub(' +([\x80-\xff])', r'     \1', content)
14 print out

当然,下载来的文档通常是GB2312,需要自己转换为utf8再行处理,可以参考我的《python 中文编码笔记》

在win下,有个优秀的文本处理工具可以利用,叫cnbook。在百度的fmddlmyy贴吧可以下载到最新版本。

[转载]不用到处找资料,2天掌握Asp.net Mvc 3

mikel阅读(1431)

[转载]不用到处找资料,2天掌握Asp.net Mvc 3 – 玄歌 – 博客园.

最快的学习方法:找到官方的教程,最好是类似Msdn演练或者冠以Step By Step的,跟着做一遍,做的过程中可以拷贝少量教程中的代码,确保每个步骤、每行代码含义都能够明白,中途随手记录一下,每个步骤完成后停下来在脑子里 回顾一下。教程做完,基本上该掌握的也就掌握了,当然,也有人简单的了解一些后就希望在小型的项目中开始使用,忽略了学习过程,这实际上更为浪费时间。先 系统的学习一下,将会大幅减少开发过程中碰到问题解决问题所需要的时间。

ASP.NET Mvc 3当然也不会例外,官网上两篇教程,看看ASP.NET MVC Music Store就行。已经有人翻译为中文版,不过建议还是看原文,翻译质量不高,原文每篇课程下都有讨论。先简单浏览一下,大体上覆盖范围比较合适,16个小时以内应能够做完。以下是我本人实作过程中的零星笔记。

第一课 创建项目 开始时间2月4日14:00 预期30分钟  14:23结束。

这一课主要讲两个问题,项目要做什么:一个音乐商店,换句话说是卖唱片之类的网上商店。功能方面,网民可以按类别或按照演员是谁来查看唱片,加入购物车, 并实现模拟的支付。管理员能够添加新的唱片。That’s all,这基本上是做典型的小型网上商店的主要需求。

创建项目的过程很简单,注意这里创建的是一个“空的”ASP.NET Mvc3的项目,创建完之后可以看看,除了Content目录下有网站的一些默认的样式和图片之外,神马都没有。之所以创建这样空的项目而不是使用项目模 版,让VS帮助我们实现基本的首页、登录、注册、注销之类的功能,大约是为了让我们从最底层了解代码和编程方式。

这里要注意的要点只有一个:Asp.net Mvc的默认目录,这些目录下即使没有任何东西,也需要创建,一个Mvc应用会在Controller目录下寻找控制器、会在Views目录下寻找 View,不需要在编程的时候写完整的路径。所以这是ASP.NET MVC开发Web应用的约定。简单的说,这些目录非有不可。

第二课 控制器 开始时间14:23 预期60分钟 15:06分结束 中断4分钟

这一课主要讲怎样为应用添加控制器、在浏览器中如何访问相应的控制器里的相关方法。

1、控制器是什么?实际上是Url,举例来说,http://localhost:1826/Home/Index,对应HomeController的Index方法,我们在浏览器中输入这个地址,则该方法会执行。看看自动生成的代码,这里一般是返回一个视图,本课则用一个返回字符串的方法取代,这样执行的时候,网页上就会显示这个字符串。当然,如果只输入http://localhost:1826/Home/,则默认的使用Index方法,如果连Home也省略掉输入http://localhost:1826,则默认的使用Home控制器。这些同样是约定,没什么道理可说,只是为了方便。

2、控制器的方法名称约定:只问方法名称,不问方法的参数和返回值。上面可以看到,系统生成的index是返回一个View,改成返回字符串的Index,运行时照样能够找到这个方法。

3、方法的参数:另外一个控制器StoreController包括三个方法,分别是Index、Browse和Detail,在浏览器中输入http://localhost:1826/Store/Browse?Genre=Disco,为StoreController的Browse方法提供了一个参数:Disco。在浏览器中输入http://localhost:1826/Store/Details/5,则为Details方法的Id提供了一个参数5.不过,你若是http://localhost:1826/Store/Browse/Disco,这样参数是不能传到的,原因见4.

4、返回字符串的时候,Browse方法使用了HttpUtility.HtmlEncode,防止js注入攻击。http://localhost:1826/Store/Browse/Disco这种情况下将不能获得参数。

string message = HttpUtility.HtmlEncode(“Store.Browse, Genre = ” + genre);

所以总结一下:控制器和Action、参数三者,是构成网站Url的三个部分,其中若不提供控制器名称,则默认的使用HomeController,不提 供方法名称则默认的使用Index方法。参数有两种形式,当接受的参数为字符串的时候,要使用HttpUtility.HtmlEncode防范Js注入 攻击。

这里,可以看看本课最后的总结。

第三课 View和ViewModels 15:15分开始 预期100分钟 16.40结束

本课讲解如何添加视图和ViewModels

1、 视图和控制器的关系:控制器一般推送一个视图给浏览器。前面的Controller中,我们每个Action返回一个字符串,浏览器显示该字符串。但我们 最终仍然还是要自行的生成Html,这就是View的任务。我们并非是在手写htm,而是夹杂着Razor脚本,用来访问服务器资源。从这个角度来说,博 客园的DUDU版主提及的没有必要使用Mvc,其理由是站不住脚的。

2、如何添加控制器:在Controller目录,右键,添加控制器即可。

3、如何添加View:我们先将Home的Index方法恢复原状,即返回ActionResult,同时Return View(),然后在这个方法的代码上,右键,添加视图。一个名为Index.cshtml的视图就会创建。

请注意,这里Return View()的View构造方法有多个重载,使用默认的构造方法,将导致该控制器在Views\Home\下面寻找与Action也就是这个方法同名的视 图,也就是我们刚刚生成的Index.cshtml。这就是前面提到的目录路径和文件名的约定,只是约定而已,目的是让我们的编程更简单些。

index.cshtml这样的文件和以前的Aspx没什么不同,是夹杂脚本的文件,服务器未来将依据其得到htm、css和js,浏览器呈现。

生成的视图代码很简单,前面的三行是Razor语法的说明,用来指定该视图在浏览器里显示时的标题。后面一行则简单的htm语法,显示一行文本。

4、 修改_Layout.cshtml ,这个是站点公用的模版。在Views\Shared目录下面。实际上要关注的是,使用@RenderBody(),来呈现各个视图。我们需要在网站的顶 部显示两个链接,一个到首页一个到Store,那么,先直接在Body这里Render之前加入

5、调整样式:直接从http://mvcmusicstore.codeplex.com下载MvcMusicStore-Assets.zip,打开压缩包,将包里的Content目录拖放到解决方案中。这里只是覆盖了site.css并加入了几个图标,样式已经由这个项目组先制作好了。现在的站点看起来像模像样的了。

6、使用Model传送信息给View:先在Model里增加两个类,Genre用来表达商品的类型,现在我们只需要一个Name属性。Album类,包括包括一个标题和它属于那个类型,两个属性。

然后,编译这个项目,让开发环境知道增加了这两个类,我们再为StoreController的三个方法增加视图。

7、最后,Store的index视图必须能够转到Browse视图,这个通过修改index的Views很容易做到。

到目前为止,我们在顶部有两个链接,其中Store的index方法包含一个类型列表,点击这个列表中的每个成员,都进入相应的Browse页面。

总结一下:如何为控制器的某个Action创建视图?如何为视图指定Models?如何在视图中呈现某个对象或某个集合?

第四课 Models和数据访问 22:08分开始 预期30分钟  23:35分结束,中断16+6+3分钟。其中数据库问题浪费了一点时间。

这一课的主题很简单,如何访问数据库。

准备工作:

1、创建数据库:当然,数据库包括示例数据,已经准备好,在我们上一课中下载的MvcMusicStore-Assets.zip文件里。我们找到Data目录下的MvcMusicStore-Create.SQL,使用它创建数据库。

2、 安装EFCodeFirst包:安装Asp.net mvc3同时也安装了Nuget,可以使用Nuget找到EFCodeFirst包,并安装。通过这个包,我们可以先写代码然后再生成数据库,当然,现在 我们使用的是已存在的数据库。另外一篇向导讲解了如何先写实体类再生成数据库。

接下来:

1、在Web.Config里添加连接字符串:这个是常规工作,和教程里不同,是用SQL server,所以连接字符串为

<configuration>
<connectionStrings>
<add name=”MusicStoreEntities”
connectionString=”Data Source=.;Initial Catalog=MvcMusicStore;Integrated Security=True”
providerName=”System.Data.SQLServer” />
</connectionStrings>

2、在Models中添加一个Context类MusicStoreEntities.cs,这个类继承于DbContext,包含两个DbSet属性分别处理前面的Albums和Genres表格。

只需要这个类无需其他配置,则我们能够正常的处理数据访问操作了。

3、修改前面的Album和Genre类,前面只是简单的描述,现在这两个类的属性要和表格对应起来。

4、然后在StoreController中增加一个成员MusicStoreEntities storeDB = new MusicStoreEntities(); 用来访问数据库

5、现在试试,修改Store的index方法,返回数据库中的Genres表格的内容:

var genres = storeDB.Genres.ToList();
return View(genres);

遇到问题:数据库访问异常。找到原因MvcMusicStore-Assets.zip中的脚本文件不对,直接附加里面的b数据库即可。

6、其它的也就简单了,修改Store的Browse、Details改从数据库获取数据,当然,也要修改Browse的视图

这样,我们现在在首页点击Store,能看到类别列表(Index)。点击任一类别,能看到该类别的所有商品了(Browse)。

总结:这一节讲解我们的Controller如何透过Modes从数据库中获取主从数据,当然,用Ado.net等方式也是相同的,和上一课没什么不同,区别是数据来源不一而已。

第五课 CRUD操作 11:08分开始 预期60分钟  13:19分结束 中断12+9分钟

本课讲解:如何增加新的记录、修改记录和删除记录

1、首先要创建一个StoreManagerController,当然,此时要勾上“为创建、更新、删除和详细信息添加操作方法”。由于详细信息这个对我们没用,可删除该方法。

2、 此时要加入唱片的“演员”信息,这包括创建一个演员类Artist,为每张唱片增加Artist属性,同时在前面的Context中增加一个Artist 的DbSet,当然我们也要为StoreController增加一个MusicStoreEntities对象用于访问数据。

数据库已经建好,所以只要Context中的DbSet名称与表格名相同、属性名称与字段名相同,我们不需要做其他的事情,根据命名约定EF会自动处理这 些。我们现在为唱片类增加了一个Genre对象、一个Artist对象,表示该唱片属于哪个类别和演员是谁,注意这两个使用Vitual修饰的属性,它不 是对应表格中实际的字段。我们也为该类增加了一个链接字段,用于存放唱片的图片的链接。

3、实现Index方法,并创建视图,这个要显示 各个唱片,所以Model选择Album类,视图要选择List,VS将帮我们生成列表的代码,注意自动的将Model设为 IEnumerable<MvcMusicStore.Models.Album>。我们修改一下,只显示唱片的标题、类别和演员,并去掉 Detail按钮。

运行一下,在浏览器地址栏输入http://localhost:1826/StoreManager,可以看到列表。

4、自己创建HtmlHelper方法,防止字段过长影响Table的布局:我们可以创建一个新目录Helper,创建一个静态类,在其中为HtmlHelpers类增加一个扩展方法。

5、如何使用扩展方法:在视图中引用命名空间即可

6、实现Edit:应该看到Controller中生成了两个Edit方法,前者是用来显示该对象的,后者是用来提交编辑结果的。我们实现了Edit的Get方法后,为其创建Edit视图。

两种方法:一种是使用添加视图由Vs自动创建,一种是使用Heml.EditorFor,我们创建好视图之后修改一下,使用后面一种方法。这样是为了这个视图可以重用于Create。

7、模版的命名约定:我们使用HtmlEditFor来编辑某个Model的时候,系统会首先在Views下面寻找EditorTemplates目录,看下面是否有与Model同名的模版,如果有则使用这个模版,否则创建默认的视图。

所以文件夹的名称和文件的名称都是有强制性的约定的。这当然是ASP.NET MVC强调约定大于配置的理念。

8、创建共享的模版:我们在Views的Shared目录下创建文件夹EditorTemplates,然后在这个文件夹添加一个名为AlBum的视图,并勾上“创建局部视图”。

将模版中的Form相关的信息删除掉,包括提交按钮等,窗体和提交由使用该模版的视图处理,这里的编辑视图仅仅处理对每个字段的编辑。

9、现在我们要修改模版,比如类别和演员,这个通过选择而非输入来处理。这就意味着我们必须使用ViewBag将所有演员的列表和所有类别的列表传入。

10、然后实现HttpPost方法,这里要注意的,是如果提交不成功,两个下拉框用的列表应重新载入。当然,实际项目开发过程中,至少应在服务端缓存这两个列表。

现在就已经能够编辑并保存数据了。

接下来:实现Create方法,这里要重用刚刚创建的编辑模版。实现Create的Get方法,添加视图、改用重用的Edit模版、实现Post方法,这些都照本宣科的做就行了。

12、处理删除:

这个过程包括Get方法,这实际上是一个确认过程。包括Post方法,这里需要一个非强类型的视图告知已经被删除。

总结一下,这一课重点是以下内容:

1、增删改的Get、Post方法和相应的视图。

2、如何创建自定义的HtmlHelpers方法,如何使用?

3、如何重用视图

4、如何处理下拉框,如何使用ViewBag传送数据?

这一课真的头昏脑胀,时间太长,签入代码的时候竟然有舒了一口气的感觉,教程内容安排太不均衡。

完成第五课

第六课 验证  13:35分开始 预期15分钟 13:43分结束

对用户的输入进行验证,包括客户端和服务端两种情形。本课内容很简单,直接在Model里定义验证规则,不用做任何其他的事情,就能解决基本验证问题。

[转载]在线个人信息管理系统的设计

mikel阅读(1081)

[转载]在线个人信息管理系统的设计 – 技术 理论 及其它 – 博客园.

在平时的工作中,常常会有一些零散的文档,一时想不起归档到哪里,就往桌面上一放,过段 时间就找不到了;或者看到一个不错的网址,想过会儿看看,但又不值得收藏,还有一些想法,想做的事情等等,如果不记下来就忘记了。记下来了之后,发现换了 一台电脑,又看不见了,很烦恼。其实纸质的笔记本是很好的工具,但是笔记本要带来带去,而且要记录网址,代码片段什么的很不方便。因此我打算自己做一个在 线系统,用来管理这些零散的信息,便于查找。不知道大家是不是也有这方面的需求,欢迎补充.

下面的图片用Pencil 工具作出,挺方便的。

系统分为两大部分:待办事务管理和备忘。

1.待办事务

待办事务一览页面: 显示各个待办事件的内容和状态,并且可以进行筛选。点击update,可以修改事务的状态。

todolist

更新事务状态页面:打开页面显示该事务的内容和其他信息,还有历次更新此事务状态的记录,以及备注(包括附件)。对于一个事务的操作可以有,更改其状态,添加备注,上传附件。

todoupdate

新增事务页面:似乎还要加上一个上传附件的功能.

todocreate

2. 备忘管理

备忘列表主要显示备忘的内容,类型,例如:备忘,网摘,暂存等。Tag是用一个或若干词汇来标记此备忘的内容,可以比分类更加详细一些,便于搜索。新建备忘的时候关键是要快速,点击Fast Create会弹出一个小框子,可以迅速输入内容并保存。

memolist

新建备忘:

memocreate

Tag管理:

tagmanagement

页面就这么多,系统本身也不复杂.不过要实现的好用,易用,快速,还是要费点功夫的. 等我慢慢来实现吧.^_^

[转载]Flex元数据标签总结

mikel阅读(1120)

[转载]Flex元数据标签总结 – enjoyInGIS-智慧点亮生活 – 博客园.

一、概述

Flex中的元数据标签用来向编译器提供有关如何编译应用程序的信息。元数据标签只在编译时发生作用。其语法形式为[Somelabel]。使用元数据标 签可以让代码变得更加简洁易读,有时我们还需要借助元数据标签来实现特定的功能,同时,让我们的代码变得更有档次。但由于Flex中的元数据标签的种类和 功能非常多,笔者特将这个元数据标签的功能和用法总结出来,便于大家和笔者自己复习和查找。

二、常用的元数据标签

序号 标签名 功能
1 ArrayElementType 指定Array元素的类型
2 Bindable 指定绑定数据源
3 DefaultProperty 指定类默认属性
4 Deprecated 元素过期标识
5 Effect 定义一个效果属性名称
6 Embed 用来向程序中嵌入JPEG、GIF、PNG、SVG等格式的图片文件及字体文件
7 Event 声明一个事件
8 Exclude 使FB的标签检查器忽略类中的某个元素。如果父类中的元素使用了这个标签,那么子类将不会继承这个元素
9 ExcludeClass 使FB标签检查器忽略类
10 IconFile 用来标自定义类指定一个图标,使组件在FB的插入面板中以该图显示。支持个是有PNG、GIF和JPEG
11 Inspectable 指定一个IDeferredinstance类型属性的可取值的类型,这个值必须包含完整的包名。
12 NonCommittingChangeEvent 用来标记一个变量,当某个特定事件发生时暂时不会派发change事件,避免这个变量发生更改
13 RemoteClass 用来设定一个AS类,使该类与一个服务器端的类实现映射,以便于数据转换,服务器端的类可以是PHP、ASP.NET、Java类或ColdFusion CFC等
14 Style 用来为组件定义样式属性
15 Transient 当一个AS对象与服务器端对象简历映射关系后,被[Transient]元数据标签标识的属性会从发送到服务器的数据中忽略掉。

三、特殊的元数据标签

这些特殊元数据标签和前面介绍的常见元数据标签相比,其差别是,特殊元数据标签在Flex帮助文档中没有出现,而仅供Flex内部使用,而这些标签中的一部分对开发者来所还是有一定的实际意义,故在本节中做个小结。

序号 标签名 功能
1 AccessibilityClass 用来再组件中实现辅助功能
2 ChangeEvent 用来定义某个属性发生变化时派发的事件
3 CollapseWhiteSpace 用来清除多余的空白字符,可以在TextInput、TextArea、Label等组件的类定义中看到这个标签
4 Frame 1、允许在时间轴上包含多个帧;

2、取得类的定义,类似于import或getDefinitionByName

5 Mixin 希望让某些代码先于其它代码执行,可以使用[Mixin]元数据标签,并创建init()方法
6 PercentProxy 使一个属性能够以百分比的形式接受数据
7 ResourceBundle 用来定义资源包,通常可以使用该标签为Flex应用程序添加多语言资源包,包含文本、图片及SWF文件等多种资源。
8 SWF 用来在AS项目中定义SWF文件的参数。它必须放在项目主类的类定义之前。

属性 类型 说明
width Number 设置SWF文件的宽度
height Number 设置SWF文件的高度
widthPercent Number 以百分比的形式设置SWF文件的宽度
heightPercent Number 以百分比的形式设置SWF文件的高度
scriptRecursionLimit Number 设置Flash Player或AIR中循环的最大深度。默认为1000
ScriptTimeLimit Number 设置超时时间,超时后Flash Player或AIR会停止处理并退出。以秒为单位,默认值为60
frameRate Number 设置帧频,默认值为24
backgroundColor Number 设置背景色
pageTitle String 设置浏览器中显示的标题

[转载]android UI进阶之可延伸的图像

mikel阅读(914)

[转载]android UI进阶之可延伸的图像 – noTice520 – 博客园.

今天就是除夕啦,抽空来写写博客。写完就去吃年夜饭啦。在这祝大家事业有成,身体健康!

今天来讲下Android UI设计中常要用到的可延伸图像。除了最基本的png,jpg与gif三种格式外,Android还有一种叫做Nine-Patch的可延伸图 像.9.png。和png格式不同的是,他会随着属性物的大小变化而改变自己的大小,从而来适应属性物的大小。这个特点,在我们平常的UI设计中是非常实 用的。最常见的一个图片做按钮背景,来适配字体大小,这时候,你会发现,这种可延伸图像非常的好用。

下面就来讲讲如何使用吧。Android SDK提供了一个工具来制造这种图像。在android sdk的tools目录下,有个draw9patch.bat的文件,就是他啦。运行它,将我们的图片拖进去,就会得到如下的样子。

左边窗口的是原始图形,你可以通过画面下的Zoom来调整大小,Pathc scale调整png图像最大可以延伸的倍率,延伸后的结果就显示在右边的窗口。在一个像素里点击,在图形边缘绘制线条来定义可延伸的部分。在这边需要注 意的是,你必须至少在图形的上边缘和左边缘画线,否则将图片导入后工程会报错。调整好以后,点击File -save,注意需要保存为*.9.png格式。在程序中的使用和普通图片完全一样,这就不讲了。

来看下例子

给出xml中的代码,其中popup为9.png格式,popup1为普通png格式

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#C5CCD4FF" > <Button android:id="@+id/small" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Small" android:textSize="10sp" android:textColor="#ffffffff" android:background="@drawable/popup1" /> <Button android:id="@+id/large" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="LargeNotFit" android:textSize="40sp" android:textColor="#ffffffff" android:background="@drawable/popup1" /> <Button android:id="@+id/largefit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="LargeFit" android:textSize="40sp" android:textColor="#ffffffff" android:background="@drawable/popup" /> </LinearLayout>

看下运行的效果

合理的使用Nine—Patch图像,在UI设计中是非常重要的。相信大家都能体会到。今天就到这啦,吃年夜饭去啦。

[转载]Silverlight 游戏开发小技巧:轨迹跟随效果

mikel阅读(1099)

[转载]Silverlight 游戏开发小技巧:轨迹跟随效果 – Silvery Night – 博客园.

我们通常在游戏中有各种各样的粒子效果,其中有一种就是跟随鼠标发生的轨迹动画,在鼠标经过的地方会产生一些特效,这种方式我们在粒子当中经常使用,本篇使用一个简单的例子再次将粒子系统改善,更加精简更加高效。

如果有兴趣的同学可以读一下以前的

Silverlight C# 游戏开发:绚丽的粒子特效-粒子效果(二)

但是这今次实现方法更加简单更加偏向于美术设计师,因为这次的编程将基本上在Blend中实现。

在继续往下看之前,你需要了解MouseMove事件,以及基本的控件、故事板的知识,只有这样在下面的操作中比较容易理解,而我们目的效果是,当鼠标经过一个地方,会出现闪烁的小星星。

首先先建立工程,然后建立一个用户控件UserControl,我们起名为FlashPoint,顾名思义这是一个闪烁的点点。

image

可能建立方式各有不同,但是我们只是需要一个没有填充色的LayoutRoot,然后在最左上为中心画一个我们想要的图形,当然了,你也可以使用图片。

1

现在创建一个故事板动画,同样动画的是怎么编排可以看各自的需求设计。

2

在下面的例子中实现一个闪烁出现的小方块然后渐隐消失掉。

3

选择需要动画的目标,添加一个关键帧,然后找到这个目标控件的变换属性(Transform),设置为0,0,这样在动画播放的最开始是完全不可见。

4

然后拖动故事板的时间线,在1秒的位置上增加另外一个关键帧,将关键帧上的XY放缩变换设置为1,1,设置位置就是第一个关键帧的地方。

5

现在选择关键帧,我们可以使用Silverlight自带的缓冲(Easing)方法,制作闪烁出现的效果,我们选择Elastic Out的方法,你可以播放一下看看感觉:)

6

好了,最后在1.5秒的位置设置新的关键帧,将不透明度设置成0%,再次播放一下,你会看到一个突然蹦出的小方块,然后消失掉的故事板动画。

9

好了,截止现在基本的粒子控件制作完毕,现在打开MainPage控件将背景设置成为灰色或者渐变色,因为上面的小方块是白色的,为了更好看,并且把LayoutRoot从Grid改成Canvas,这样可以方便我们对位置的操作,

10

下面就是Coding时间了,在这里我将弄几个小的技巧增加程序的便利性。

在FlashPoint.cs的类构造中,添加一行代码,就是故事板的开始动画,比如说:Storyboard1.Begin();

现在打开VS或者在Blend里修改.cs文件,在MainPage.cs中加入鼠标的移动事件或者重写本身的OnMouseMove方法,我用的是重写:)

Code Snippet
  1. public partial class MainPage : UserControl
  2. {
  3. public MainPage()
  4. {
  5. InitializeComponent();
  6. }
  7. protected override void OnMouseMove(MouseEventArgs e)
  8. {
  9. var pos = e.GetPosition(this);
  10. var point = new FlashPoint();
  11. LayoutRoot.Children.Add(point);
  12. Canvas.SetLeft(point,pos.X);
  13. Canvas.SetTop(point, pos.Y);
  14. base.OnMouseMove(e);
  15. }
  16. }

好了,现在运行一下看看,

11

但是现在仍有很多的问题,比如这么new出来的对象一定是非常多的,那么怎么才能正确的将控件对象移除掉呢?在我的另外一片有关于粒子文章中,使用 的方式是计时器的循环运算,然后反着来遍历,将符合条件的移除掉,这是因为粒子具有很不确定的因素,所以需要遍历处理,更何况还涉及到轨迹的计算逻辑,虽 然说我们比较明确动画的时间长度,可以使用计时器从集合中RemoveAt,而这次我们将使用一个更加简便的方法解决这个小瑕疵。请看下面的代码

Code Snippet
  1. {
  2. public FlashPoint()
  3. {
  4. InitializeComponent();
  5. Storyboard1.Completed += new EventHandler(Storyboard1_Completed);
  6. Storyboard1.Begin();
  7. }
  8. void Storyboard1_Completed(object sender, EventArgs e)
  9. {
  10. Storyboard1.Completed -= Storyboard1_Completed;
  11. var parent = this.Parent as Panel;
  12. if (parent != null)
  13. parent.Children.Remove(this);
  14. }
  15. }

这是我们自定义的控件FlashPoint的构造和事件代码,在构造函数中注册动画完成事件,然后在完成的部分实现我们的具体逻辑,我们目的是让父一级移除我们,所以先要判定是否是一个标准的Panel的容器,Panel类请参看官方Silverlight文档。

本工程的源代码下载如下:点击直接下载

实际展示效果:

获取 Microsoft Silverlight

[转载]android UI进阶之style和theme的使用

mikel阅读(1141)

[转载]android UI进阶之style和theme的使用 – noTice520 – 博客园.

今天来和大家分享一下Android中UI设计里面常会用到的style和theme。

首先,style和theme都是资源,Android提供了很多这样的默认资源。你可以来使用它们。同时你也可以自己定义style和 theme。这非常的简单,只需要在res/values/这个路径里面新建一个.xml文件,而且他的根节点必须 是<resources>.对 每一个style和theme,给<style>element增加一个全局唯一的名字,也可以选择增加一个父类属性,我们写的style和 theme就会继承这个父类的属性。style和theme的定义格式相同。不过style是针对view来说的,比如 TextView,EditText这些,而theme必须针对整个activity或者整个程序,你必须在AndroidManifest.xml中 的<application>或者<activity>中定义。

先来看看style,比如如下一段代码:

<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CodeFont" parent="@android:style/TextAppearance.Medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#00FF00</item> <item name="android:typeface">monospace</item> </style> </resources>

可以看到这个style的名字为CodeFont。 parent后面就是父类的style, CodeFont继承这个父类的属性。可以看到这个父类的style是android中默认的,你也可以继承你自定义的style,这时候不需要再写 parent属性,而是使用ContFont.red这样的方式,而且你可以继续继承,写成ContFont.red.small。 接下来每一个item定义一个属性。定义属性的最好方法就是在api文档里找到这个view的xml属性,比如在EditText中有InputType 这个属性,那么在你的style里面你就可以来定义它。

这样一个style就写好了。

使用也非常简单,我们只要在写我们的view时,加入style标签就可以了,就像这样

<TextView style="@style/CodeFont" android:text="@string/hello" />

下面讲讲主题,前面已经说了。主题需要在AndroidManifest.xml中注册。如果你想整个程序都使用这个主题,你可以这样写

<application android:theme="@style/CustomTheme">

如果你只需要在某个Activity中使用主题,那么只要在Activity标签中写入android:theme=就可以了,android有很多好的默认主题,比如

<activity android:theme="@android:style/Theme.Dialog">

这就会使你的整个Activity变成一个对话框形式,或者,如果你希望背景是透明的,可以这样写

<activity android:theme="@android:style/Theme.Translucent">

同样的我们也可以继承父类theme,写法和style一样,就不赘述了。当然,和style一样,你也可以自己定义一个theme,写个例子

代码

<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomTheme"> <item name="android:windowNoTitle">true</item> <item name="windowFrame">@drawable/screen_frame</item> <item name="windowBackground">@drawable/screen_background_white</item> <item name="panelForegroundColor">#FF000000</item> <item name="panelBackgroundColor">#FFFFFFFF</item> <item name="panelTextColor">?panelForegroundColor</item> <item name="panelTextSize">14</item> <item name="menuItemTextColor">?panelTextColor</item> <item name="menuItemTextSize">?panelTextSize</item> </style> </resources>

如果你要在java代码中加载主题的话,只要用setTheme(R.style.CustomTheme)就可以了,不过记得一定要在初始化任何view之前,比如一定要放在我们常用的setContentView()之前。通常,我们不建议这么做。

在写程序布局的时候,熟练的使用style和theme是非常必要和有益的。今天就到这里啦。有什么问题可以留言交流。大家春节快乐!

[转载]性能分析之工具篇-Fiddler简单使用

mikel阅读(1002)

[转载]性能分析之工具篇-Fiddler简单使用 – 淘宝API-.net开发-数据库优化-seo优化-技术是手艺,语言是工具,驰骋在代码的海洋中 – 博客园.

微博,2010年兴起的浪潮,打开t.qq.comt.sohu.comt.sina.com等首页,看到留言不停的滚动,哇噻,信息实时显示。我们在感慨之余,想到了他们是如何实现的,是否是用异步来实时获取信息,那样的话,服务器的压力很大,如何解决呢。

带着以上的疑问,对上述三家微博进行了简单的跟踪测试,用的不是什么新鲜工具,做开发的,特别是web开发的,一定知道Fiddler,对于Fiddler的介绍留到其他的文章中说吧,或者google下,网络中有大量关于它的介绍与使用。

好了,现在开始进行测试。

1. 腾讯微博t.qq.com

a.打开Fiddler工具

b.打开浏览器(IEfirefoxcrome都可以)

为了更好的展示,我用的是firefox

这时切换到Fiddler,如图

根据观察,t.qq.com是一次请求最多10条在页面显示,当显示到这次获取数据的最后一条时,会再次通过 /login/loginNews.php请求数据,让我们看看返回来的数据

看到右侧显示 的数据了吗,返回的是json格式的数据,在fiddler下不是很好观察,请看下firefox下的记录

2.搜狐微博 t.sohu.com

查看Fiddler,除第一次载入页面时的记录,没有任何请求消息数据的记录,同样,firefox也没有记录,那我们就用肉眼看了,在页面上看“正在发生”的滚动数据,过了数次滚动,数据开始重复。

3.新浪微博t.sina.com

和搜狐微博一样,载入后不能请求数据。

4.总结

[转载]SQL2005的XML学习笔记

mikel阅读(1289)

[转载]SQL2005的XML学习笔记 – flyfaraway – 博客园.

1、记录到XML变量
declare @cxml xml
set @cxml=(select * from zd_storeP for XML RAW(‘store’),ROOT(‘stores’))
select @cxml
2、XML到记录集
方法一:用OPENXML  90000条记录速度测试,22s,16s,16s
declare @cxml xml,@nxml int
set @cxml=(select * from zd_storeP for XML RAW(‘store’),ROOT(‘stores’)) –大概1s
select @cxml
exec sp_xml_preparedocument @nxml OUTPUT, @cxml  –大概3-4s
select ls.* from openxml(@nxml,’/stores/store’) with (nID INT,cName VARCHAR(20)) as ls
方法二:用XML的nodes属性  90000条记录速度测试,8s,8s,8s
declare @cxml xml
set @cxml=(select * from zd_storeP for XML RAW,ROOT) –默认ROOT为root,RAW为row
select ls.row.value(‘@nID[1]’,’INT’) as nID,ls.row.value(‘@cName[1]’,’varchar(50)’) as cName
from @cxml.nodes(‘/root/row’) as ls(row)
3、SQL2005存储过程中,传入XML参数
方法一:对应上面的一
CREATE PROCEDURE [dbo].[testxml1]
@cxml xml
AS
BEGIN
SET NOCOUNT ON;
declare @nxml int
exec sp_xml_preparedocument @nxml OUTPUT, @cxml
select ls.* from openxml(@nxml,’/VFPData/row’) with (nid INT,cname VARCHAR(50)) as ls
END
方法二:对应上面的二
create PROCEDURE [dbo].[testxml2]
@cxml xml
AS
BEGIN
SET NOCOUNT ON;
select ls.row.value(‘@nid[1]’,’INT’) as nID,ls.row.value(‘@cname[1]’,’varchar(50)’) as cName
from @cxml.nodes(‘/VFPData/row’) as ls(row)
END
注意:如果XML是VFP的CursorToXML生成的,需要注意:
(1)with (nid INT,cname VARCHAR(50)) 括号中列名必须用小写,因为CursorToXML生成的XML格式字段强制了小写;
(2)VFP中,CursorToXML(“cursor1″,”lcCxml”,3,16) 最后的参数必须用16,表示采用游标的代码页,否则乱码了。
下面的例子,阐述了另一种语法,它能够在XML变量中直接立即更新表。
1 CREATE PROCEDURE [dbo].[UpdateInventory2]
2 (
3    @x XML
4 )
5 AS
6
7 SET NOCOUNT ON
8
9 /*
10    This version of the stored procedure has a slightly enhanced version of the
11    TSQL code. This version updates the table directly from the XML variable,
12    rather than converting the XML data to a view.
13 */
14
15 UPDATE Inventory SET
16    stock = stock + x.item.value(‘@Qty[1]’,’INT’)
17 FROM Inventory inv
18 INNER JOIN @x.nodes(‘//items/item’) x(item) ON
19    (x.item.value(‘@ItemNumber[1]’,’varchar(20)’) = inv.ItemNumber)
20
21 RETURN
4、SQL2005存储过程返回XML,在VFP中XMLToCursor()
— =============================================
— Author: <Author,,Name>
— Create date: <Create Date,,>
— Description: <测试返回XML变量,然后在VFP中还原游标>
— =============================================
alter PROCEDURE testxml3
@cxml varchar(max) output
AS
BEGIN
SET NOCOUNT ON;
declare @cxml2 xml
set @cxml2=(select * from zd_storeP for XML RAW(‘row’),ROOT(‘VFPData’))
set @cxml=cast(@cxml2 as varchar(max))
return
END
注意:output参数不能为xml类型,而要为varchar类型,否则VFP的XMLToCursor会报错的。

[转载]Ajax为主的应用不需要ASP.NET MVC

mikel阅读(1189)

[转载]Ajax为主的应用不需要ASP.NET MVC – dudu – 博客园.

博客园在开发中至今还未使用ASP.NET MVC,似乎有点跟不上时代了,但是否采用一项技术,关键的是这个技术是否能真正解决实际问题。

这篇文章将以我们正在开发的博客园新版站内短消息功能为例,说明一下不需要ASP.NET MVC的理由。

功能简介:短消息收件箱,显示当前用户短消息列表。

用到的主要技术:Master Page, JQueryJQuery插件Templates, WCF。

Templates是由微软开发的JQuery插件,功能类似于ASP.NET的Repeater控件,Templates将被整合进jQuery 1.5成为核心组件。想更多了解Templates,推荐阅读Microsoft and jQuery

主要代码:

1. ASP.NET页面文件:

<%@ Page Title="" Language="C#" MasterPageFile="msg.master" %> <asp:Content ID="ContentMain" ContentPlaceHolderID="cphMain" Runat="Server"> <div id="msg_list"> </div> <script id="contentTmpl" type="text/x-jquery-tmpl"> <div class="msg_item"> <div class="msg_sender">${SenderName}</div> <div class="msg_title">${Subject}</div> <div class="msg_sendtime">${SendTime}</div> </div> </script> <script type="text/javascript"> GetMsgList(1, 30); </script> </asp:Content>

上面的代码通过GetMsgList方法a调用WCF获取短消息列表,然后显示在msg_list中。

这里用Master Page是为了重用HTML的公用元素,不然,只要一个html文件就够了,.aspx都不需要,为什么还要用ASP.NET MVC?对于这样的ajax应用,只要加载一个简单的html页面,接下来就交给js了,就是需要MVC,也是在js中进行,ASP.NET MVC无用武之处。

不用ASP.NET MVC,这一个理由足矣。

为了完整地介绍这个示例,继续我们的代码。

2. js代码:

a) js文件引用

<script type="text/javascript" src="http://common.cnblogs.com/script/jquery.js"></script> <script type="text/javascript" src="http://common.cnblogs.com/script/json2.js"></script> <script type="text/javascript" src="js/jquery.tmpl.min.js"></script> <script type="text/javascript" src="js/msg.js"></script>

json2.js是用于将js对象转换为json。

jQuery.tmpl.min.js是jQuery插件Templates的引用文件。

msg.js中定义了GetMsgList方法。

b) GetMsgList方法定义:

function GetMsgList(pageIndex, pageSize) { var msgQuery = {} msgQuery.PageIndex = pageIndex; msgQuery.PageSize = pageSize; $.ajaxSettings.type = 'post'; $.ajaxSettings.dataType = 'json'; $.ajaxSettings.contentType = 'application/json'; $.ajaxSettings.url = '/services/AjaxMsgService.svc/GetMsgList'; $.ajaxSettings.data = '{"msgQuery":' + JSON.stringify(msgQuery) + '}'; $.ajaxSettings.success = function (data) { $("#contentTmpl").tmpl(data.d).appendTo("#msg_list"); }; $.ajax(); }

“/services/AjaxMsgService.svc”——调用的WCF服务,jQuery如何调用WCF请参考抛弃WebService,在.NET4中用 jQuery 调用 WCF

“JSON.stringify(msgQuery)”——将msgQuery对象转换为json,WCF中对应的方法是 “GetMsgList(SiteMsgQuery msgQuery)”,达到的效果是将js对象作为参数传给了WCF方法。在之前文章的评论中有人说jQuery调用.ashx更方便,从这里的效果看, 我觉得jQuery调用WCF(或.asmx)更方便。

$(“#contentTmpl”).tmpl(data.d).appendTo(“#msg_list”);——将WCF返回的数据绑定至contentTmpl(见代码一)形成列表,并加载至msg_list,完成数据的显示。这就是Templates插件的作用。

3. WCF代码:

[ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class AjaxMsgService { [OperationContract] public SiteMsg[] GetMsgList(SiteMsgQuery msgQuery) { int spaceUserId = Util.GetCurrentUser(HttpContext.Current).SpaceUserID; msgQuery.SiteMsg = new SiteMsg() { RecipientSpaceUserId = spaceUserId }; //调用后台的WCF服务 MsgServiceClient client = new MsgServiceClient(); SiteMsg[] siteMsgList = client.GetMsgList(msgQuery); try { client.Close(); } catch { client.Abort(); } return siteMsgList; } }

这里的WCF相当于一个中转站,它又去调用后台另外一台服务器上的WCF服务,获取短消息数据,以json格式返回给客户端js。

示例介绍完毕,不足之处欢迎大家指出。

总结

随着越来越多的Web应用使用Ajax,ASP.NET MVC施展身手的空间越来越小。

现在唯一阻碍Ajax使用的是搜索引擎不能索引Ajax加载的内容,但这个情况一定会改观,Ajax是趋势,Web App是趋势。