[转载]Android开源组件 - vanezkw - 博客园

mikel阅读(1062)

[转载]Android开源组件 – vanezkw – 博客园.

前言

      Android自带的组件比较丑陋(个人感觉),自己写组件比较复杂,而且必须熟悉Android应用层开发的一些机制,如绘制、回调,所以非迫不得已的情况下还是不要自己写组件,因为怕考虑不周全导致譬如性能或异常方面的问题,你自己写也会耗费不少时间。个人觉得采用第三方UI是个不错的选择,尤其是你需要比较复杂的UI组件,而且又比较赶项目的时候。

优缺点

当然第三方UI组件不全是优秀的,个人总结如下:(当然远远不止这些,欢迎讨论)

优点:扩展性好,比较通用(当然也有写得比较烂的,这里不讨论),易用、开发速度快。

缺点:大多数并没有google官方的组件那么稳定,甚至有些小问题。一旦有问题调试起来非常麻烦。性能有待提高。

分享几个优秀开源第三方项目

1、GreenDroid

demos效果图:

 

 

 

使用体会

个人感觉这个项目使用起来并不方便,尤其是你用他提供的Activity的时候必须得继承GDApplication。(开始不知道这些,调试了很久)。其实UI界面也是很一般,而且里面很大部分功能都可以在其他的第三方库里面找到类似的。里面的ActionBar默认样式很一般,有待美化。

需要更多了解的话你可以到官方去看看:http://android.cyrilmottier.com/?p=240

2、ActionBarSherlock

demos效果图:

 

 

个人体会

这个项目的UI很漂亮,使用也很方便,demos中提供了很好的参考实例。能在低版本上实现ActionBar(系统的ActionBar3.0以上才有)。

需要更多了解的话你可以到官方去看看:http://actionbarsherlock.com/

3、SlidingMenu

demos效果图:

 

 

个人体会

你需要用推拉式的效果,这是个不错的项目。不过你直接用可能没法用,它是依赖于ActionBarSherlock项目的。代码中也有问题,需要把SlidingFragmentActivity 这 个类改成继承SherlockFragmentActivity(也就是ActionBarSherlock中的类),因为这个问题我也是找了很久都没有 解决(一直没有怀疑过代码问题),后来实在不行就看看代码才发现的。

需要更多了解的话你可以到官方去看看:https://github.com/jfeinstein10/SlidingMenu

注意事项

  被引用的项目必须放在和引用项目在同一个硬盘分区中,如你新建的项目Test,需要引用ActionBarSherlock,那么TestActionBarSherlock需要放在同一个分区,即同时在D盘或E盘之类的。之前也是因为这个问题花了不少时间,细节很重要啊。

总结

  当然优秀的UI开源项目远不止这几个,但是这几个非常 实用也非常有名。其他还有android-misc-widgets、QuickAction、viewbadger、viewflow…太多了。根 据个人需要去了解吧。好了到此为止,如果有需要的话也可以把刚刚说的几个UI组件整理一下。

PS:文中有不妥之处请读者指出,欢迎交流。

[原创]ASP.NET MVC异步提交表单firefox下返回json结果带pre标签的问题

mikel阅读(972)

今天为了一个小问题纠结了一天,需求如下:

1.需要异步提交表单上传图片并保存到数据库,返回json数据给前台动态处理

问题描述:提交表单后,返回的json数据无法用eval进行序列化,总是提示无效字符,用firebug查看返回数据中加了pre标签

问题原因:

jax返回的内容,居然自动添加了<pre>标签

在FF,ie,谷歌浏览器中,每个返回的都不一样:ff小写,ie大写,谷歌加style

查了一下,原来是返回的类型不对。

1,页面开头中<meta http-equiv=”Content-Type” content=”text/html ;charset=utf-8″ />

2,在action中Struts2Utils中,如果用renderText 方法,那么里面调用的是render(“text/plain “, text, headers);

这样返回的就是”text/plain”,所以自动添加了pre。修改成调用renderHtml ,就能正常使用了

对照上面的问题原因:

查找发现是上传文件时将 System.Web.HttpContext.Current.Response.ContentType = “text/plain”;修改了

导致作为文本返回了加入了pre

应该修改为“text/html”

上传完文件后,修改了ContentType=”text/html”,如下:

this.HttpContext.Response.ContentType = “text/html”;

[转载]ajax返回,自动添加pre标签 - - ITeye技术网站

mikel阅读(980)

[转载]ajax返回,自动添加pre标签 – – ITeye技术网站.

ajax返回的内容,居然自动添加了<pre>标签

在FF,ie,谷歌浏览器中,每个返回的都不一样:ff小写,ie大写,谷歌加style

查了一下,原来是返回的类型不对。

 

1,页面开头中<meta http-equiv=”Content-Type” content=”text/html ;charset=utf-8″ />

2,在action中Struts2Utils中,如果用renderText 方法,那么里面调用的是render(“text/plain “, text, headers);

这样返回的就是”text/plain”,所以自动添加了pre。修改成调用renderHtml ,就能正常使用了

[转载]Portlet概念 - zhouyaoh - ITeye技术网站

mikel阅读(1120)

[转载]Portlet概念 – zhouyaoh – ITeye技术网站.

Portlet 是可以提供对基于 Web 的内容、应用程序和其它资源访问的可重用组件。可通过 portlet 访问 Web 页面、web 服务、应用程序和成为企业组合的内容供给。公司可以创建他们自己的 portlet 或从第三方 portlet 目录中选择 portletportlet 是打算被组装成更大的门户网站页面,其中同一 portlet 的多个实例为每个用户显示不同的数据。 

从用户的角度来看,portlet 是门户网站站点中提供特定服务或信息(例如,提供日历和新闻)的窗口。从开发者的角度来看,portlet 是可插入的模块,它们被设计成在 Portal Server  portlet 容器中运行。

portlet 容器提供了一个运行时环境,在这个环境中实例化、使用和最终破坏 portletportlet 依靠门户网站基础结构来访问用户概要文件信息、参与在窗口和操作事件中、与其它 portlet 通信、访问远程内容、查找凭证以及存储持久数据。Portlet API 提供了这些功能的标准接口。portlet 容器不是一个类似于 servlet 容器的独立容器。它是以 servlet 容器上的瘦层的方式实现的,并重用 servlet 容器提供的功能。

 

下面是典型的事件流程,当用户访问portal页面的时候:

 

<!–[if !supportLists]–>²        <!–[endif]–>客户端在验证后向portalhttp请求。

<!–[if !supportLists]–>²        <!–[endif]–>portal接收请求。

<!–[if !supportLists]–>²        <!–[endif]–>portal判断是否有包含请求,并请求包含的动作指向的portlet是和这个portal页面相关联的。

<!–[if !supportLists]–>²        <!–[endif]–>如果含有动作的目标portletportal发请求给portlet容器去执行相应的portlet的动作。

<!–[if !supportLists]–>²        <!–[endif]–>portal通过portlet容器调用portlets,去获得内容片断,这个片断可以包含在portal页面中。

<!–[if !supportLists]–>²        <!–[endif]–>portal集合portlets的输出内容到1portal页面中,并把页面返回客户端。

Portlet产生标记片断。Portal通常给portlet产生的标记片断加了标题,控制按钮和其他的装饰,这个新的片断叫portlet窗口。然后portal整合portlet窗口到完整的文件,portal页面。

   <!–[if !vml]–><!–[endif]–>

Portlets 运行在portlet容器内。Portlet容器接收portlets产生的内容。典型的,portlet容器把portlet内容传到portalPortal server根据portlet产生的内容创建portal页面,并传送给客户端,由客户端显示。

<!–[if !vml]–><!–[endif]–>

 

       客户使用客户终端访问portal。在收到请求后,portal判断满足请求的portlets列表。Portal通过portlet容器,调用portletsPortalportlet产生的片断创建portal页面,同时把页面返回给用户。

<!–[if !vml]–><!–[endif]–>

用户可以根据需要通过增删Portlet的方式配置他们的页面。在Windows或者XWindows窗口程序中,窗口有最大化和最小化的窗口状态,portlet也有窗口状态。窗口状态是portal页面空间数量的指示器,它被赋值给portlet产生的内容中。当调用portlet,容器提供当前窗口状态给portletPortlet使用窗口状态决定多少信息需要renderPortlets能在处理action请求时,编程的改变他们的窗口状态。Portlet规范定义了3种窗口状态,normalmaximizedminimized

Normal窗口状态

 

Normal窗口状态表示portlet要和其他的portlet共享页面。它也表示目标设备限制了显示能力。因此,portlet限制输出的尺寸。

 

MAXIMIZED窗口状态

 

Maximized窗口状态表示portletportal页面唯一的portlet,或portlet相比与其他的portlet有更多的空间。当窗口状态是Maximized时,portlet产生更多的内容。

 

Minimized窗口状态

 

portletminimized状态,它将是最小限度的输出,或不输出。

 

 

Portlet模式指出porlet的功能。一般来说,portlet执行不同任务,依靠当前执行的任务的创建不同内容。Portlet模式告诉portlet他们执行什么任务,生产什么内容。当调用portlet,容器提供当前portlet模式给portletPortlets在处理action请求时能编程的改变他们的portlet模式。

 

Portlet有四种模式:viewedit, helpconfig

可用的模式根据用户的角色受到限制。例如,匿名用户只能使用viewhelp模式,而验证用户可以使用edit模式。

举例来说,一个用户可以定制的股票信息PortletView模式允许用户查看股票列表,Help模式提供给用户帮助手册,Edit模式允许用户定制自己关注的股票列表,而Config模式允许管理员改变股票服务的一些配置。

VIEW 模式

 

View模式期待的功能是产生标记反映当前的状态给portlet。例如,view模式的portlet包含1个或多个框,用户可以操作或交互,或组成不需要任何用户交互的的静态内容。

Portlet开发者需要通过覆盖doView方法实现view portlet模式的功能。

 

EDIT 模式

 

通过edit模式,portlet提供内容和logic让用户用户化portlet的行为。Edit模式包含一个或多个框,用户可以定位并输入他们的用户化数据。

 

典型的,edit模式,将设置或修改portlet的参数。Portlet开发者需要通过覆盖doEdit方法实现edit portlet模式的功能。

 

HELP 模式

 

当在help模式,portlet提供portlethelp信息。这个help信息将会是简单的框,用连贯的正文或上下文敏感的帮助阐明了整个portletPortlet开发者需要通过覆盖doHelp方法实现help portlet模式的功能

 

CONFIG 模式

 

当在config模式,管理员可以进行相应的操作。Portlet开发者需要通过覆盖doConfig方法实现view portlet模式的功能。

 

因为Portlet继承于Servlet,所以portlet可以打包成war文件发布到Portal容器中。管理员可以发布或者卸载portlet。在一个Portlet Web 应用中,一个portlet描述文件用来描述portlet的属性和初始化信息。一个Portlet定义包含一个application portlet和多个concrete portlet。一个Application Portletportlet容器中仅存在一个实例。一个concrete Portlet实例一个使用额外的数据实例化的portlet

 

servlet规范2.3定义如下:

servlet是基于web组件的,由容器管理的,产生动态内容的java技术。类似其他的java组件,servlets是平台独立的java类,它被编译为中间字节码,能被动态加载和运行在java激活的web server。容器,有时称为servlet引擎,是web server的扩展,它提供servlet功能。Servlets通过由容器执行的请求/返回模式和客户端交互。”

 

Portlets servlets有很多相似性:

 

 Portlets也是基于web组件的java技术

 Portlets由专门的容器管理。

 Portlets产生动态内容。

 Portlets生命周期由容器管理。

 Portlets请求/返回模式和客户端交互。

 

Portlets servlets不同的地方:

 

Portlets只产生标记片断,而不是完整的文档。Portal把这些整合到portal页面中去。

Portlets不是直接和url绑定。

web客户端通过portal系统和portlets作用。

Portlets有更精确的请求处理,action请求,render请求。

Portlets有预先定义的portlet模式和窗口状态,这些指出portlet的功能,和portal页面中实时状态的数量。

Portlets1portal页面中能存在好几次。

 

Portletsservlets不包含的功能:

 

Portlets有访问和储存持久化参数和用户化数据的方法。

Portlets能访问用户profile信息。

Portletsurl改写的功能去产生新的链接,这使得portal server可以在不知道的情况下,在页面片断中创建链接和动作。

Portlets能保存瞬时信息在不同范围的portlet session中:应用程序宽度的范围,和portlet私有的范围。

       

portlet没有而servlet有的功能:

 

设置返回字符的编码

设置返回的http

portal请求的客户端 URL

 

Spirit框架提供类内建的基于角色(Role)的的访问控制支持。Spirit使用portlet Web Application作为组。用户可能属于一个或者多个组(也就是说,用户可以访问一个或者多个Web Application)。

    Core Portlet API 提供了详细的编程接口。Portlet Service了÷框架提供了一个清晰的接口,用来产生可重用的服务。

    一个portlet的集成关系如下:

javax.servlet.http.HttpServlet
 
|__com.kuaff.spirit.portlet.Portlet 

|__com.kuaff.spirit.portlet.PortletAdapter
|__
com.kuaff.spirit.portlet.AbstractPortlet
    |__
com.samples.MyPortlet

[转载]强烈推荐:著名社交网站LinkedIn的Java架构技术 - 编程语言 - ITeye资讯

mikel阅读(895)

[转载]强烈推荐:著名社交网站LinkedIn的Java架构技术 – 编程语言 – ITeye资讯.

强烈推荐:著名社交网站LinkedIn的Java架构技术

JavaOne 2008的会议上,著名社交网站LinkedIn的开发者做了2个关于LinkedIn

网站的架构技术的演讲,目前这两个演讲的PPT已经可以下载了。下载地址如下:

需要注册才可以下载,能下载PDF版本。

可以看一下LinkedIn网站的基本情况:

1。2千2百万用户
2。每个月4百万独立用户访问
3。每天4千万page view
4。每天2百万搜索流量
5。每天25万邀请发送
6。每天1百万的回答提交
7。每天2百万的email消息发送

这是一个世界顶尖级别流量的网站了,看看LinkedIn的系统架构:

* 操作系统:Solaris (running on Sun x86 platform and Sparc)
* 应用服务器:Tomcat and Jetty as application servers
* 数据库:Oracle and MySQL as DBs
* 没有ORM,直接用JDBC No ORM (such as Hibernate); they use straight JDBC
* 用ActiveMQ在发送JMS. (It’s partitioned by type of messages. Backed by MySQL.)
* 用lucene做搜索Lucene as a foundation for search
* Spring做逻辑架构Spring as glue

下面是随着流量增加,LinkedIn的架构演化:

2003-2005
1。一个整体的web程序,
2。一个核心数据库,
3。在Cloud中缓存所有network图,Cloud是用来做缓存的独立server。
4。用lucene做搜索,也跑在Cloud中。

2006年
1。复制另外一个数据库,减少直接load核心数据库,另外一个server来管理非只读数据库的数据更新。
2。把搜索从Cloud中移出来,单独一个server跑搜索
3。增加Databus数据总线来更新数据,这是通过分布式更新的核心组件,任何组件都需要Databus

2008年
1。WebApp不再任何事情都它自己做,把业务逻辑分成很多部分,通过server群来做。WebApp仍然提供用户界面给用户,但是,通过server群来管理用户资料,小组等等。
2。每个服务有自己的域数据库
3。新的架构允许其他应用链接LinkedIn,比如增加的招聘和广告业务。

The Cloud
1。Cloud是整个架构最重要的部分,整个LinkedIn的网络图都缓存在Cloud里面
2。Cloud大小:22M nodes, 120M edges
3。需要12GB RAM
4。在生产环境要跑40个实例
5。从硬盘重建Cloud一个实例需要8个小时
6。Cloud通过databus实时更新
7。关闭时持久化到硬盘
8。缓存通过C++实现,用JNI调用,LinkedIn选择C++而不是Java有两个原因:
1)尽可能的减少RAM的使用
2)垃圾收集暂停会杀死整个系统,LinkedIn用了最新的GC程序,也就是就是说java的的垃圾搜集性能不太好
9。将所有东西放在缓存里面是一种限制,但是LinkedIn指出,分割业务图将更麻烦
10。Sun提供了2TB的RAM

Communication Architecture交流架构包括:

Communication Service

Communication Service是用来提供永久信息的,比如收件箱里面的消息和email
1。整个系统通过JMS异步通讯
2。客户端用JMS发送消息
3。消息通过路径服务器来到达相应的邮箱或者直接放到email进程中
4。消息发送:同时使用Pull主动寻求信息(如用户需要信息)和Push发送信息(如发email)
5。使用Spring和LinkedIn专业Spring插件完成,使用HTTP-RPC

Scaling Techniques
1。通过功能来划分:发送,接受,文档等。
2。通过类别来划分:用户信箱,访问者信箱等
3。等级划分:用户ID等级,Email等级等
4。所有的操作都是异步的。

 

推荐阅读:LinkedIn架构图:99%都是用Java写的

[转载]关于wBox iFrame回调关闭问题的解决方案 - 独孤雁 - 博客园

mikel阅读(842)

[转载]【转】关于wBox iFrame回调关闭问题的解决方案 – 独孤雁 – 博客园.

关于wBox的关闭问题,例如一个页面中使用wBox iframe进来一个页面,而这个页面是进行用户登录,登录成功就关闭wBox,其实实现回调关闭wBox的方法很简单,就是使用iframe的DOM操作即可,例如我们的代码这样写:

//wbox赋值出来,然后使用wbox对象的close的方法关闭
var wbox=$("#iframe").wBox({
     	requestType: "iframe",
	target:"b.html"
   });

那么我们在页面b.html中进行了用户登录验证,我们验证成功,要关闭wBox,就可以在b.html中使用parent.wbox.close()来进行关闭,就像下面的代码,只要我们验证完毕运行closewBox就可以关闭了iframe:

function closewBox(){
    parent.wbox.close() 
}

关于iframe子页面与父页面之间的DOM操作可以参考下面的文章:《使用JavaScript在IE和Firefox下进行iframe的DOM操作

[转载]使用json解析国家气象局(天气预报)接口数据 - Andye - 博客园

mikel阅读(1006)

[转载]使用json解析国家气象局(天气预报)接口数据 – Andye – 博客园.

     平时我们在开发的过程中有时会要用到天气预报的信息,国家气象局为我们提供了天气预报的接口,只需要我们去解析就行了。很方便很好用

      那么下面,我们开始吧!

 

国家气象局提供了三种数据的形式

 

网址在:

http://www.weather.com.cn/data/sk/101010100.html

http://www.weather.com.cn/data/cityinfo/101010100.html

http://m.weather.com.cn/data/101010100.html

最后一种是解析最全面的。

这里再附上中国天气网城市代码大全(百度文库里面的),把后面的城市代码换下就行了:

http://wenku.baidu.com/view/ea286102bb68a98271fefad8.html

 

数据解析格式:

第一个网址提供的json数据为:

{“weatherinfo”: {“city”:”北京”,”cityid”:”101010100″,”temp”:”-2″,”WD”:”西北风”,”WS”:”3 级”,”SD”:”241%”,”WSE”:”3″,”time”:”10:61″,”isRadar”:”1″,”Radar”:”JC_RADAR_AZ9010_JB”}}

第二个网址提供的json数据为:

{“weatherinfo”: {“city”:”北京”,”cityid”:”101010100″,”temp1″:”3℃”,”temp2″:”-8℃”,”weather”:” 晴”,”img1″:”d0.gif”,”img2″:”n0.gif”,”ptime”:”11:00″}}

第三个网址提供的json数据较为全面:

 

复制代码
{ "weatherinfo": { "city":"北京", "city_en":"beijing", "date_y":"2013年1月17日", "date":"", "week":"星期四", "fchh":"11", "cityid":"101010100", "temp1":"3℃~-8℃", "temp2":"3℃~-5℃", "temp3":"3℃~-3℃", "temp4":"1℃~-5℃", "temp5":"3℃~-6℃", "temp6":"2℃~-5℃", "tempF1":"37.4℉~17.6℉", "tempF2":"37.4℉~23℉", "tempF3":"37.4℉~26.6℉", "tempF4":"33.8℉~23℉", "tempF5":"37.4℉~21.2℉", "tempF6":"35.6℉~23℉", "weather1":"晴", "weather2":"晴", "weather3":"多云转阴", "weather4":"阴转多云", "weather5":"多云转晴", "weather6":"晴转多云", "img1":"0", "img2":"99", "img3":"0", "img4":"99", "img5":"1", "img6":"2", "img7":"2", "img8":"1", "img9":"1", "img10":"0", "img11":"0", "img12":"1", "img_single":"0", "img_title1":"晴", "img_title2":"晴", "img_title3":"晴", "img_title4":"晴", "img_title5":"多云", "img_title6":"阴", "img_title7":"阴", "img_title8":"多云", "img_title9":"多云", "img_title10":"晴", "img_title11":"晴", "img_title12":"多云", "img_title_single":"晴", "wind1":"微风", "wind2":"微风", "wind3":"微风", "wind4":"微风", "wind5":"微风", "wind6":"微风", "fx1":"微风", "fx2":"微风", "fl1":"小于3级", "fl2":"小于3级", "fl3":"小于3级", "fl4":"小于3级", "fl5":"小于3级", "fl6":"小于3级", "index":"冷", "index_d":"天气冷,建议着棉衣、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣或冬大衣。", "index48":"冷", "index48_d":"天气冷,建议着棉衣、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣或冬大衣。", "index_uv":"弱", "index48_uv":"弱", "index_xc":"适宜", "index_tr":"较适宜", "index_co":"较不舒适", "st1":"2", "st2":"-6", "st3":"2", "st4":"-3", "st5":"3", "st6":"-4", "index_cl":"适宜", "index_ls":"基本适宜", "index_ag":"极不易发" } }
复制代码

详细解析格式如下:

以json格式提供,格式如下 {“weatherinfo”:{

//基本信息;

“city”:”北京”,”city_en”:”beijing”,

“date_y”:”2013年1月17日”,”date”:”辛卯年”,”week”:”星期三”,”fchh”:”18″,”cityid”:”101010100″,

//摄氏温度

“temp1″:”24℃~33℃”,”temp2″:”24℃~32℃”,”temp3″:”25℃~31℃”,”temp4″:”23℃~30℃”,”temp5″:”22℃~30℃”,”temp6″:”21℃~32℃”,

//华氏温度;

“tempF1″:”75.2℉~91.4℉”,”tempF2″:”75.2℉~89.6℉”,”tempF3″:”77℉~87.8℉”,”tempF4″:”73.4℉~86℉”,”tempF5″:”71.6℉~86℉”,”tempF6″:”69.8℉~89.6℉”,

//天气描述;

“weather1″:”多云”,”weather2″:”晴转多云”,”weather3″:”阴”,”weather4″:”晴转阵雨”,”weather5″:”阵雨”,”weather6″:”多云”,

//天气描述图片序号

“img1″:”1″,”img2″:”99″,”img3″:”0″,”img4″:”1″,”img5″:”2″,”img6″:”99″,”img7″:”0″,”img8″:”3″,”img9″:”3″,”img10″:”99″,”img11″:”1″,”img12″:”99”,

“img_single”:”1″,

//图片名称;

“img_title1″:”多云”,”img_title2″:”多 云”,”img_title3″:”晴”,”img_title4″:”多云”,”img_title5″:”阴”,”img_title6″:” 阴”,”img_title7″:”晴”,”img_title8″:”阵雨”,”img_title9″:”阵雨”,”img_title10″:”阵 雨”,”img_title11″:”多云”,”img_title12″:”多云”,”img_title_single”:”多云”,

//风速描述

“wind1″:”微风”,”wind2″:”微风”,”wind3″:”微风”,”wind4″:”微风”,”wind5″:”微风”,”wind6″:”微风”,

//???

“fx1″:”微风”,”fx2″:”微风”,”fl1″:”小于3级”,”fl2″:”小于3级”,”fl3″:”小于3级”,”fl4″:”小于3级”,”fl5″:”小于3级”,”fl6″:”小于3级”,

//今天穿衣指数;

“index”:”炎热”,”index_d”:”天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。”,

//48小时穿衣指数

“index48″:”炎热”,”index48_d”:”天气炎热,建议着短衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫等清凉夏季服装。”

//紫外线及48小时紫外线

,”index_uv”:”中等”,”index48_uv”:”弱”,

//洗车

“index_xc”:”适宜”,

//旅游

“index_tr”:”较适宜”,

//舒适指数

“index_co”:”较不舒适”,

//

“st1″:”33″,”st2″:”24″,”st3″:”32″,”st4″:”25″,”st5″:”32″,”st6″:”24”,

//晨练

“index_cl”:”适宜”,

//晾晒

“index_ls”:”适宜”,

//过敏

“index_ag”:”极易发”}}

字段言简意赅,城市名,英文名,日期,农历日期,星期,预报时间,城市代码,6个预报温度(华氏温度,摄氏温度),6个预报天气和风力,剩下的就是一些气象指数。

 

本文基于中国大陆许可协议发布,版权归Andye拥有,欢迎转载,但是必须保留本文的署名Andye (包含链接http://www.cnblogs.com/yejiurui)。如您有任何疑问或者授权方面的协商,请给我留言。

[转载]Google 开源的JavaScript工具和库集锦 - 2012 - 博客园

mikel阅读(838)

[转载]Google 开源的JavaScript工具和库集锦 – 2012 – 博客园.

1.JavaScript代码风格

http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml

2.Closure Compiler(封闭编辑器)

https://developers.google.com/closure

Google此前曾开源了不少JavaScript工具,如Closure Compiler(用于生成紧凑且高性能代码的工具)、Closure Templates(用于动态生成HTML)、Closure Linter(JavaScript风格检查器)及Closure Stylesheets(对CSS的一套扩展)。早在去年6月,Google曾发布了GWT(另一个用于构建JavaScript应用的工具集)的一个发布候选版,但其未来还是有些不太明朗,因为Google将很多GWT开发者都转到了Dart上,后者被看作是“对GWT的一次巨大变革,可以为最终用户创建出更棒的Web应用,我们对其潜力持乐观态度”。

Closure 编译器是一个JavaScript优化器,为Web应用程序生成紧凑,高性能的JavaScript代码,它移除了不必要的代码,并经过重写和优化,保持 娇小的身材,以便在浏览器的JavaScript引擎上运行得更快,这个编译器也会检查语法,变量引用和类型,并对常见的JavaScript陷阱发出警 告,这些功能有助于你写出bug更少,更易于维护的程序。

你也可以使用Closure检查器,它是一个Firebug扩展,主要用于调试那些难以阅读的代码。

3.Closure Templates(封闭模版)

https://developers.google.com/closure

Closure模板的前身是Web模板,通过预编译以提高JavaScript效率,Closure模板有一套简单的语法,程序员很快就可以掌握, 和传统的模板系统不一样,你可以将Closure模板视为很小的组件,然后通过组装形成一个正式的Web页面,从此不再需要为每个页面设计一个大大的模板 了

4.Closure Linter(JavaScript风格检查器)

https://developers.google.com/closure

5.Closure Library

https://developers.google.com/closure

https://code.google.com/p/closure-library/wiki/GettingStartedWithClosureLibrary

Closure库是一个广泛的,经过严格测试的,模块化的,跨浏览器的JavaScript库,Web开发人员可以在他们的用户界面中直接通过拖拉进行复用。

6.Closure Stylesheets(对CSS的一套扩展)

https://code.google.com/p/closure-stylesheets/

Closure Stylesheets is an extension to CSS that adds variables, functions, conditionals, and mixins to standard CSS. The tool also supportsminification, linting, RTL flipping, and CSS class renaming.

7.JavaScript代码覆盖率工具

ScriptCover 是 Google 推出的一款 JavaScript 代码覆盖率分析工具,为 Web 页面提供实时、逐行的代码覆盖分析。Google 表示,ScriptCover 最终将应用在 Chrome 浏览器上成为它的一个扩展。

ScriptCover 的更多详细信息可以查看 Google Open Source 博客的这篇文章,以及 Google Code 上的相关文档。ScriptCover 的代码将托管于 Google Code 上,基于 Apache Lience v2。

8.检测内存泄漏的JavaScript工具

近日,Google开源了Leak Finder,这款工具可以查看JavaScript应用的堆,进而发现内存泄漏

9.基于Node.js的JavaScript测试执行器

Testacular的灵感来源于JS Test Driver,而编写另外一个测试运行器是因为“他们在使用JSTD中遇到的诸多问题”,他们希望有“一个能够稳定快速执行JavaScript测试的简单工具。这是我们使用强大的Socket.io库和Node.js的原因。”

10.Testacular JavaScript 基准测试套件 Octane

谷歌发布了新的开源 JavaScript 基准测试套件 Octane,它包含了 13 个测试,用于测量浏览器加载与执行复杂的大型 JavaScript 应用的性能,如游戏、交互、富 Web 页面和在线工具等。Octane 包含了最初的 V8基准套件提供的 8 个测试,以及新增加的 5 个测试——pdf.js,Mandreel,GB Emulator(GB 模拟器),Code Loading(代码加载),Box2DWeb——可以测量其余测试力有未逮的性能领域。

11.Google开源网页加速工具Page Speed

http://code.google.com/speed/page-speed

age Speed是运行在Firebug里的Firefox插件。该工具可以运行在Linux、Mac和Windows XP/Vista之上。Page Speed在运行时会分析一些Web服务器配置和服务器上下载下来的代码,还会创建一个结果列表,其中包括如何改进网页的建议。分析基于一个分为五类的最佳实践列表:

· 优化缓存——让你应用的数据和逻辑完全避免使用网络

· 减少回应时间——减少一连串请求-响应周期的数量

· 减小请求大小——减少上传大小

· 减小有效负荷大小——减小响应、下载和缓存页面的大小

· 优化浏览器渲染——改善浏览器的页面布局

12.在线语法高亮工具

https://code.google.com/p/google-code-prettify/

[转载]用C#实现的条形码和二维码编码解码器 - 小y - 博客园

mikel阅读(1043)

[转载]用C#实现的条形码和二维码编码解码器 – 小y – 博客园.

本篇介绍可以在C#中使用的1D/2D编码解码器。条形码的应用已经非常普遍,几乎所有超市里面的商品上面都印有条形码;二维码也开始应用到很多场 合,如火车票有二维码识别、网易的首页有二维码图标,用户只需要用手机扫描一下就可以看到手机版网易的网址,免去了输入长串字符的麻烦。

条形码的标准

条形码的标准有ENA条形码、UPC条形码、二五条形码、交叉二五条形码、库德巴条形码、三九条形码和128条形码等,而商品上最常使用的就是EAN商品条形码EAN商品条形码亦称通用商品条形码,由国际物品编码协会制定,通用于世界各地,是目前国际上使用最广泛的一种商品条形码。我国目前在国内推行使用的也是这种商品条形码。EAN商品条形码分为EAN-13(标准版)和EAN-8(缩短版)两种。

二维码的编码标准:

全球现有的二维码多达200种以上,其中常见的技术标准有PDF417(美系标准),QRCode(日系标准),Code49,Code16K,CodeOne,DM(韩系标准),GM(中国标准),CM(中国标准)等20余种。用得最多的是QRcode。

下面借助google的开源项目zxing来实现1D/2D的编码和解码,测试效果如下:

   

zxing的官方地址是:http://code.google.com/p/zxing/

zxing的功能还是很强大的,最初是用java编写,并支持Android、ios、symbian等手机操作系统。

不过不知是何原因,该官网连一个例子也没有,文档也是字典式的把所有类列出来,一点都没为读者考虑。

下面我把如果使用zxing完成上图所示例子讲解一遍,供初学者参考:

1.我们新建一个Winform测试项目;

2.从官网下载zxing开源项目,大概16m的样子,解压缩后打开zxing-2.1\csharp目录,将该目录拷贝到我们新建的Winform项目下(方便调试和看源码,并非一定要如此);

3.winform项目中添加对zxing项目的引用;

4.按上图所示例子建好控件,“生成条形码”的代码如下:

//生成条形码
        private void button1_Click(object sender, EventArgs e)
        {
            lbshow.Text = "";
            Regex rg = new Regex("^[0-9]{13}$");
            if (!rg.IsMatch(txtMsg.Text))
            {
                MessageBox.Show("本例子采用EAN_13编码,需要输入13位数字");
                return;
            }
           
            try
            {
                MultiFormatWriter mutiWriter = new com.google.zxing.MultiFormatWriter();
                ByteMatrix bm = mutiWriter.encode(txtMsg.Text, com.google.zxing.BarcodeFormat.EAN_13, 363, 150);
                Bitmap img= bm.ToBitmap();
                pictureBox1.Image =img;
                //自动保存图片到当前目录
                string filename = System.Environment.CurrentDirectory + "\\EAN_13" + DateTime.Now.Ticks.ToString() + ".jpg";
                img.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);
                lbshow.Text = "图片已保存到:" + filename;
            }
            catch(Exception ee)
            { MessageBox.Show(ee.Message); }
        }

其中需要注意BarcodeFormat参数,可以打开定义看到具体的编码方式,自己百度每种编码方式对输入的要求。

这里EAN_13编码要求是13位长度的数字,并且满足:把所有偶数序号位上的数相加求和,用求出的和乘3,再把所有奇数序号上的数相 加求和,用求出的和加上刚才偶数序号上的数,然后得出和能被10整除。(这个规则校验在UPCEANReader类的 checkStandardUPCEANChecksum方法里面,如果不需要,可以去掉)

生成二维码的代码与上面相似:

复制代码
 //生成二维码
        private void button2_Click(object sender, EventArgs e) { lbshow.Text = ""; try { MultiFormatWriter mutiWriter = new com.google.zxing.MultiFormatWriter(); ByteMatrix bm = mutiWriter.encode(txtMsg.Text, com.google.zxing.BarcodeFormat.QR_CODE, 300, 300); Bitmap img = bm.ToBitmap(); pictureBox1.Image = img; //自动保存图片到当前目录
                string filename = System.Environment.CurrentDirectory + "\\QR" + DateTime.Now.Ticks.ToString() + ".jpg"; img.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg); lbshow.Text = "图片已保存到:" + filename; } catch (Exception ee) { MessageBox.Show(ee.Message); } }
复制代码

注意编码问题,在com.google.zxing.qrcode.encoder.Encoder类中修改默认编码为utf-8,否则解码出现的是乱码。

System.String DEFAULT_BYTE_MODE_ENCODING = “UTF-8”;

此处之前是“ISO-8859-1″,之所以改成UTF-8是因为,在解码的时候程序会猜测可能的编码,如果猜测失败则默认是UTF- 8,代码在com.google.zxing.qrcode.decoder.DecodedBitStreamParser类的 guessEncoding方法中。

所以此开源项目也缺少全局性思考,连编码和解码的默认编码方式都不一致。

 

4.实现图片解码,即把条形码或二维码图片解码成其真实内容,当然在pc上应用不大,但可能只是还没发现而已,代码如下:

复制代码
     //解码操作
        private void button3_Click(object sender, EventArgs e) { MultiFormatReader mutiReader = new com.google.zxing.MultiFormatReader(); Bitmap img = (Bitmap)Bitmap.FromFile(opFilePath); if (img == null) return; LuminanceSource ls = new RGBLuminanceSource(img, img.Width, img.Height); BinaryBitmap bb = new BinaryBitmap(new com.google.zxing.common.HybridBinarizer(ls)); Result r= mutiReader.decode(bb); txtMsg.Text = r.Text; }
复制代码

opFilePath是图片路径,你可以用openFileDialog控件打开文件来得到路径。

 

下载:

Demo

[转载]easyui datagrid标题列宽度自适应 - wuwenhai - 博客园

mikel阅读(1279)

[转载]easyui datagrid标题列宽度自适应 – wuwenhai – 博客园.

最近项目中使用easyui做前端界面,相信大部分使用过easyui datagrid的朋友有这么一个疑问:如果在columns中不设置width属性能不能写个方法让datagrid的头部标题和数据主体自适应呢? 如: columns: [[{ field: ‘testName’, title: ‘测试名’, align: ‘center’ },{ field: ‘testValue’, title: ‘测试值’, align: ‘center’ }]],如果按照上面这样设置列而不做其他处理的话。绑定出来的数据将会变成:

          

如上图这样列标题和数据主体对不上号。或许有的朋友会想,直接设个固定值不就完了,但是对于一些不能确定长度的数据设固定值显然不能达到我们的要 求。带着这个问题我百度谷歌了一番 发现网络上并没有我太满意的相关资料。毛主席曾经曰过:自己动手丰衣足食。我只好听从毛主席的教导自己解决问题。By 梨洛

要设置列宽度,我们必须知道easyui datagrid在html中是怎么样的。于是乎动用chrome的开发人员工具,查看一番如图:

头部列标题为:

即我们可以用JQuery选择器 $(“.datagrid-header-inner table tr:first-child”)来取到标题列  (数据主体列也差不多我就不贴出来了)。

既然能取得到这些,只要我们判断数据主体列的宽度大还是 标题列的宽度大。相应的设置回去 那标题和数据不就对其了。来上代码:

<script type="text/javascript" language="javascript">// <![CDATA[
    $(document).ready(function () {
        $("#test").datagrid({
            url: "/Test/Test1Data",
            type: "post",
            datatype: "json",
            width: 465,
            height: 280,
            loadMsg: "数据加载中,请稍后...",
            fitCloumns: true,
            nowrap: true,
            rownumbers: false,
            pagination: true,
            singleSelect: true,
            showFooter: true,
            columns: [[
                    { field: 'testName', title: '测试名', align: 'center' },
                    { field: 'testValue', title: '测试值', align: 'center' }
                    ]],
            //bind数据成功设置列宽度
            onLoadSuccess: function (data) {
                //datagrid头部 table 的第一个tr 的td们,即columns的集合
                var headerTds = $(".datagrid-header-inner table tr:first-child").children();
                //datagrid主体 table 的第一个tr 的td们,即第一个数据行
                var bodyTds = $(".datagrid-body table tr:first-child").children();
                var totalWidth = 0; //合计宽度,用来为datagrid头部和主体设置宽度
                //循环设置宽度
                bodyTds.each(function (i, obj) {
                    var headerTd = $(headerTds.get(i));
                    var bodyTd = $(bodyTds.get(i));
                    $("div:first-child", headerTds.get(i)).css("text-align", "center");
                    var headerTdWidth = headerTd.width(); //获取第i个头部td的宽度
                    //这里加5个像素 是因为数据主体我们取的是第一行数据,不能确保第一行数据宽度最宽,预留5个像素。有兴趣的朋友可以先判断最大的td宽度都在进行设置
                    var bodyTdWidth = bodyTd.width() + 5;
                    var width = 0;
                    //如果头部列名宽度比主体数据宽度宽,则它们的宽度都设为头部的宽度。反之亦然
                    if (headerTdWidth > bodyTdWidth) {
                        width = headerTdWidth;
                        bodyTd.width(width);
                        headerTd.width(width);
                        totalWidth += width;
                    } else {
                        width = bodyTdWidth;
                        headerTd.width(width);
                        bodyTd.width(width);
                        totalWidth += width;
                    }
                });
                var headerTable = $(".datagrid-header-inner table:first-child");
                var bodyTable = $(".datagrid-body table:first-child");
                //循环完毕即能得到总得宽度设置到头部table和数据主体table中
                headerTable.width(totalWidth);
                bodyTable.width(totalWidth);
                bodyTds.each(function (i, obj) {
                    var headerTd = $(headerTds.get(i));
                    var bodyTd = $(bodyTds.get(i));
                    var headerTdWidth = headerTd.width();
                    bodyTd.width(headerTdWidth);
                });
            }
        });
        $("#test").datagrid('getPager').pagination({
            showPageList: false,
            showRefresh: false,
            beforePageText: "第",
            afterPageText: "页 <a href='javascript:void(0)' onclick='GoEnterPage()'><img src='http://www.cnblogs.com/Content/themes/icons/Go_.gif'></a>,共{pages}页",
            displayMsg: '当前{from}到{to}条,总共{total}条'
        });
    });
    function GoEnterPage() {
        var e = jQuery.Event("keydown");
        e.keyCode = 13;
        $("input.pagination-num").trigger(e);
    }
// ]]></script>

设置宽度的相关代码都已经打上注释了。测试了下 可行。无图无真相 附上效果图:

By 梨洛谢谢!