[转载]如何處理jquery不同版本之間的衝突 | Javascript

mikel阅读(1199)

[转载]如何處理jquery不同版本之間的衝突 | Javascript.

眾所周知,JQuery版本很多,而且有些版本的衝突也非常明顯,有一些網上流傳的很實用的插件是用A版本寫的,但是要實現另個功能又必須用B版本。所以實現版本之間的和平相處很重要。這裡介紹一個函數,可以很順利,很簡單的解決這個問題。

使用實例:

<script type=”text/JavaScript” src=”JQuery.js”></script>
<script type=”text/JavaScript”>
var j = JQuery.noConflict(true);
</script>
<script type=”text/javascript” src=”jQuery-1.7.js”></script>
<script type=”text/javascript”>
$(“document”).ready(function(){
alert(“faf”);
})
j(“document”).ready(function(){
alert(“faf”);
})

</script>

運行這個函數把$的使用權讓渡給另一個jQuery庫,這樣就能避免不同jQuery版本之間的$對象之間的衝突。(經試驗,如上試驗驗證可以輸出兩個彈出框,可以解決不同版本之間的衝突。)

在運行這個函數之後,就只能用j訪問第一個jquery庫。例如,在要用到$(“div p”)的地方,就必须换成j(“div p”)。另一個jquery庫,正常使用$訪問。

注意:這個函數必須在導入jQuery文件之后,並且在導入另一個jquery庫之前運行。(如上例運行位置。)

[转载]开发者必备的10类工具 - 白砂糖的博客 - eoe移动开发者社区

mikel阅读(1637)

[转载]开发者必备的10类工具 – 白砂糖的博客 – eoe移动开发者社区.

作为一个软件开发者,你不可避免地需要用到各种工具来设计、理解、编辑任何程序,本文作者按类型总结了10类开发者须知的工具。

免责声明:“最好”的软件工具通常属于主观看法,也许你并不同意我的观点,但是也可以从中获取所需。

1. 版本控制工具

无论你是在100人的团队,还是一个人做设计、开发,版本控制工具都能让你从中获益。

通过版本控制工具,你可以保留同一文件中在不同时期的版本,这对图表和二进制文件都适用,尤其适合文本类型文件。

主流版本控制工具可以分为两种:集中式和分布式。集中式版本控制工具需要一个服务器存储仓库,你可以在合适的时候把代码提交到服务器上。而分布式版 本控制工具(DVCS)则不需要中心服务器:每个仓库的使用者都有自己的本地缓存,将更新从一个本地仓库传递到另一个的过程非常简单只需要从源系统 push或者从目标系统pull即可。

目前最流行的开源版本控制工具要数Subvision(SVN)、Git以及Mercurial(hg)了,其中SVN是集中式版本控制工具,Git和Mercurial则是分布式的。

值得注意的是,有很多知名网站提供仓库托管服务,比如bitbucket.org、SourceForge、GoogleCode以及Github等等,这些网站都提供免费托管服务,但在具体服务支持与收费上各不相同。

2. 文件比较工具

无论你是想要与版本控制系统合并代码,还是仅仅想要比较两个文件的不同,文件比较工具都是非常有用的。其中diff是一个非常有名的命令行比较工具,我也喜欢Beyond Compare这款图形界面比较工具——可惜它并非免费,但是并不贵而且简单、强大。除此之外,常见文件比较工具还有SourceGearDiffMerge(免费、跨平台=Windows/OS X/Linux),Compare It!(收费、仅支持Windows),DeltaWalker(较贵、仅支持OSX)以及UltraCompare(较贵、跨平台)。

3. 编辑器

处理文本文件的难以取决于你使用的软件。重量级的编辑器,如Eclipse、NetBeans、Visual Studio都属于是IDE(integrateddevelopment environment,集成开发环境),如果你需要做特定的工作,他们都非常强大。但有时候你仅仅想要简单、快速地编辑文件,系统自带的编辑器 (Windows下的Notepad和Machine下的TextEdit)虽然轻量但是不够强大。这里介绍几个中量级的编辑器:Windows平台的Notepad++、Mac平台的TextWrangler都是不错的免费编辑器,还有GNUemacs、Vim这样强大、可扩展的自由软件。

4. 构建工具

如果你使用IDE进行开发,仅仅单击“Build”即可以为你编译程序的源代码。但是注意:编译软件时常常有很多细节的编译选项,而使用IDE时常常被深藏在复杂的菜单中。我认为,专业的程序员应该使用可定义的构建工具,选择正确的编译选项达到最优效果。

5. 脚本工具

有时候你需要快速整合多个软件以达到某个目的,这时很难选择C或者C++这样需要编译的编程语言,因为它们在执行前需要先编译成可执行的文件。此时,更好的解决方案是脚本语言,它们通常集成在操作系统中,编写一个脚本甚至可以在多台计算机中运行。

常见现代脚本语言有Python、Ruby、Groovy、awk、Perl等等。不论你更喜欢那种,我建议你选择其中一款。我很喜欢Python,不仅因为它简单、鼓励好的编程规范,而且拥有强大的调试工具——基于Eclipse的PyDev。借助PyDev,你可以设置断点、并端部执行你的脚本。

6. 数值分析工具

除非你打算做一些及其简单的项目,或者为嵌入式系统进行逻辑编程,你常常会需要对数据有一个直观地了解——图表、或者曲线图,又或者仅仅想要解一个方程,这时候你会需要数据分析工具,比如MATLABMathematicaMathCAD,它们都非免费,甚至价格昂贵,但是价格强大。

如果你的需求简单,SciLabOctavePyLab这些MATLAB的免费“克隆”版本也提供了某些MATLAB的基本功能,语法也与MATLAB相近或相同。其中PyLab用Python实现,如果你懂Python,或许可以将其利用到科学计算领域。

7. 文档工具

工程环境中,你常常需要和他人分享想法,很多软件都可以做到这点,比如使用微软的Visio可以提供流程图、表,Word来编辑文档,PowerPoint来做演示。但它们都非免费,有时候你更需要免费或者更特化的文档工具。

  • 图形可视化工具——我常用的是基于命令行的graphviz,以及拥有交互界面的yEd
  • 流程图——使用图形表达思路。Quick Sequence Diagram Editor很基本,但是足以帮助你达到绘制这些图形的目的。
  • 排版工具——你可以使用WYSIWYG工具,也可以选择非WYSIWYG软件,又或者TeX、LaTeX,随个人喜好。
  • 代码自文档工具——Doxygen很常见,可以将代码中的注释转化成文档,JavaDoc则是转为Java设计的文档工具。

8. 终端以及通信工具

有时候你会需要通过串口进行通信,这时你就需要终端工具了,在Web浏览器出现之前,这更为常见。曾经与Windows绑定的HyperTerminal不够强大,不建议使用,而且微软在Vista之后也不再集成它。我个人更喜欢PuTTYtelTeraTermPro。其它通信工具如FTP及其安全变种SFTP、SCP方面我最喜欢Cyberduck,现在支持Mac和Windows。

9. 软件QA(质量保障)工具

对于开发者来说,为避免bug你肯定需要QA工具。我不是很清楚这方面,但是知道大概可以分以下几类:

  • 静态分析工具。它是一种分析软件的工具,既可以分析软件源代码,也可以分析编译后的文件。最出名的莫过于面向C语言的lint,lint会像老是一样在你代码的错误之处标出红线,标出你的错误。Java语言有FindBugs对应,能够帮助衡量代码复杂度——通常好的程序设计函数比较小,如果某个函数超过20-30行代码,你可以考虑将其分解了,这样也更便于设计和调试。
  • 单元测试和代码覆盖率。大型软件测试通常极难,这是公认的;但是使用“单元测试”测试更小的软件模块却简 单得多。但是单元测试同样也有不擅长的领域,比如嵌入式系统,虽然可以通过交叉编译在PC上寻找bug,但并不能保证在嵌入式机器上效果一致。单元测试也 有一定的技巧,比如可以编写可重复利用的测试脚本。代码覆盖工具我仅见过同事使用Cantata++,但并不便宜。
  • 代码“美化器”。如果你和同事使用相同的编码风格,更容易寻找出简单的语法错误。通常我们都有各自的编程习惯,但是可以通过软件达到统一编程风格的效果——比如自动缩进、tab空格转换等等。我使用过Uncrustify,以及其GUI工具UniversalIndentGU

10. 基本命令行工具

虽然GUI对于计算机交互是革命性的改进,但还有很多事用命令行做起来更加简单,比如使用脚本能够轻易组合多个程序。如果你使用OS X或者Linux,那计算机上一般已经预装了UNIX命令行工具,Windows用户可以下载相应的二进制文件

其它,诸如7zipCPU-ZSystem Explorer之类的软件虽然没有放在这个列表中,但也都是非常实用的工具。

原文链接:EmbeddedRelated.com

via:csdn

[转载]GitHub上最火的40个Android开源项目(二) - 白砂糖的博客 - eoe移动开发者社区

mikel阅读(856)

[转载]GitHub上最火的40个Android开源项目(二) – 白砂糖的博客 – eoe移动开发者社区.

在《GitHub上最火的40个Android开源项目(一)》中,我们详细地介绍了GitHub上最受欢迎的TOP20 Android开源项目,引起了许多读者的热议,作为开发者,你最常用的是哪些开源项目?使用起来是否能让你得心应手?今天,我们将介绍另外20 Android开源项目,在这些项目中,你又用到了哪些呢?

21.drag-sort-listview

DragSortListView(DSLV)是Android ListView的一个扩展,支持拖拽排序和左右滑动删除功能。重写了TouchInterceptor(TI)类来提供更加优美的拖拽动画效果。

 

DSLV主要特性:

  • 完美的拖拽支持;
  • 在拖动时提供更平滑的滚动列表滚动;
  • 支持每个ListItem高度的多样性
  • 公开startDrag()和stopDrag()方法;
  • 有公开的接口可以自定义拖动的View。

DragSortListView适用于带有任何优先级的列表:收藏夹、播放列表及清单等,算得上是目前Android开源实现拖动排序操作最完美的方案。

22. c-geo-opensource

c:geo是Android设备上一个简单而又强大的非官方地理寻宝客户端。与其他类似应用不同的是,c:geo不需要Web浏览器,也不需要文件输出。你可以在毫无准备的情况下,毫无后顾之忧地带上你的智能手机去进行地理寻宝。当然,你也不需要付钱,因为它是免费的。

c-geo-opensource包含了c:geo所有开源代码。

详情请参考:c:geo

23. NineOldAndroids

自Android 3.0以上的版本,SDK新增了一个android.animation包,里面的类都是跟动画效果实现相关的,通过Honeycomb API,能够实现非常复杂的动画效果。但如果开发者想在3.0以下的版本中也能使用到这套API,那么Nine Old Androids就会是你最好的选择,该API和Honeycomb API完全一样,只是改变了你使用com.nineoldandroids.XXX的入口。

该项目包含两个工程,一个是Library,即为动画效果的实现库,另一个则是Sample,是对如何使用该API的演示。开发者可以直接登陆Google Play下载安装Nine Old Androids Sample,查看演示。

详情请参考:Nine Old Androids

24. ppsspp

PPSSPP是由GC/Wii模拟器Dolphin联 合创始人之一Henrik Rydgård开发的一款免费的跨平台开源模拟器,支持Windows、Linux、Mac、Android、iOS、BlackBerry 10等主流计算机与移动操作系统,可直接工作在x86、x64、ARM等CPU平台上,以GNU GPLv2许可协议发布,主要使用C++编写以提高效率和可移植性。

只要支持OpenGL ES 2.0,PPSSPP就可以在相当低规格的硬件设备上运行,包括基于ARM的手机及平板电脑。

详情请参考:PPSSPP

25. androidquery

Android-Query(AQuery)是一个轻量级的开发包,用于实现Android上的异步任务和操作UI元素,可让Android应用开发更简单、更容易,也更有趣。

26. droid-fu

Droid-Fu是一个开源的通用Android应用库,其主要目的是为了让Android开发更容易,包含有许多工具类,还有非常易用的Android组件。

Droid-Fu提供支持的领域包括:

  • Android应用的生命周期帮助
  • 支持处理Intents和diagnostics类
  • 后台任务支持
  • HTTP消息处理
  • 对象、HTTP响应及远程图像高速缓存
  • 定制各种Adapter及View

Droid-Fu最大的优势在于它的应用生命周期帮助类,如果你正在开发一款Android应用,而它的主要任务是运行后台任务,比如从Web上抓取数据,那么,你一定会使用到Droid-Fu,不过,目前该项目在GitHub上已经停止更新维护。

详情请参考:droid-fu

27. TextSecure

TextSecure是Whisper Systems团队开发的一个Android上的加密信息客户端,旨在增强用户和企业通信的安全性,其源代码于2011年被Twitter发布在GitHub开源数据库中。

该软件允许用户将在Android设备上所有发送和接收的短信内容进行加密,还可以将加密信息发送给另一个TextSecure用户。

28. XobotOS

XobotOS是Xamarin的一个研究项目,用于将Android 4.0从Java/Dalvik移植到C#,并对移植后的性能及内存占用情况进行检测。

29. ignition

在编写Android应用时,通过提供即用组件和包含许多样板文件的实用类,ignition可以让你的Android应用快速起步。ignition涵盖的区域包括:

  • Widget、Adapter、Dialog等UI组件;
  • 允许编写简单却强大的网络代码的HTTP Wrapper库;
  • 加载远程Web图像并进行缓存的类;
  • 简单但有效的缓存框架(将对所有对象树做出响应的HTTP缓存到内存或硬盘中);
  • Intents、diagnostics等几个能让API级别更容易向后兼容的帮助类;
  • 更友好、更强大的AsyncTask实现。

ignition包括三个子项目:

  • ignition-core——是一个可以直接编译到App中的Android库项目。
  • ignition-support——一个标准的Java库项目,被部署为一个普通的JAR,包含了大部分实用工具类。开发者可以独立使用该工程的核心模块。
  • ignition-location——一个可以直接编译到应用程序中的Android AspectJ库项目。能够让定位应用在不需要Activity位置更新处理的情况下获取到最新的位置信息。

详情请参考:ignition Sample
applications

30.android_page_curl

android_page_curl是一个在Android上使用OpenGL ES实现类似书本翻页效果的示例程序。(点击链接查看视频演示

31. asmack

说到aSmack,自然要先提提Smack。Smack API是一个完整的实现了XMPP协议的开源API库,而aSmack则是Smack在Android上的构建版本,于2013年2月初迁移到 GitHub上,该资源库并不包含太多的代码,只是一个构建环境。开发者可以利用该API进行基于XMPP协议的即时消息应用程序开发

详情请参考:asmack

32.AndroidBillingLibrary

In-app Billing是一项Google Play服务,能够让你在应用内进行数字内容销售,可销售的数字内容范围非常广,包括媒体文件、照片等下载内容,还包括游戏级别、药剂、增值服务和功能等 虚拟内容。Android Billing Library可以实现In-app Billing的所有规范,并提供更高级的类来进行使用。

Google于2012年底正式发布了v3版Android In-app Billing,但截至目前,GitHub上的Android Billing Library还只能支持到v2版,据悉Google将于2013年初对它进行更新。

详情请参考:Google Play In-app Billing

33. Crouton

Crouton是Android上的一个可以让开发者对环境中的Toast进行替换的类,以一个应用程序窗口的方式显示,而其显示位置则由开发者自己决定。

开发者可以直接登陆Google Play下载安装Crouton Demo,查看应用演示。

34. cwac-endless

CommonsWare Android Components(CWAC)是一个开源的Android组件库,用来解决Android开发中各个方面的常见问题,每个 CWAC组件打包成一个独立的jar文件,其中就包含cwac-endless。

cwac-endless提供一个EndlessAdapter,这是一个自动分页的List,当用户浏览到List最后一行时自动请求新的数据。

详情请参考:Commons Ware

35. DiskLruCache

在Android应用开发中,为了提高UI的流畅性、响应速度,提供更高的用户体验,开发者常常会绞尽脑汁地思考如何实现高效加载图片,而 DiskLruCache实现正是开发者常用的图片缓存技术之一。Disk LRU Cache,顾名思义,硬件缓存,就是一个在文件系统中使用有限空间进行高速缓存。每个缓存项都有一个字符串键和一个固定大小的值。

点击链接下载该库项目。

36. Android-SlideExpandableListView

如果你对Android提供的Android ExpandableListView并不满意,一心想要实现诸如Spotify应用那般的效果,那么SlideExpandableListView绝 对是你最好的选择。该库允许你自定义每个列表项目中的ListView,一旦用户点击某个按钮,即可实现该列表项目区域滑动。

37. gauges-android

Gaug.es for Android是由gaug.es推出的一款在Android设备上对网站流量数据进行实时统计的应用。gauges-android包含了该应用的源代码,开发者可以直接登陆Google Play下载安装该应用。

38. acra

ACRA是一个能够让Android应用自动将崩溃报告以谷歌文档电子表的形式进行发送的库,旨在当应用发生崩溃或出现错误行为时,开发者可以获取到相关数据。

39. roboguice

RoboGuice是Android平台上基于Google Guice开发的一个库,可以大大简化Android应用开发的代码及一些繁琐重复的代码。给Android带来了简单、易用的依赖注入,如果你使用过 Spring或Guice的话,你就会知道这种编程方式是多么的便捷。

40. otto

Otto是由Square发布的一个着重于Android支持的基于Guava的强大的事件总线,在对应用程序不同部分进行解耦之后,仍然允许它们进行有效的沟通。

详情请参考:Otto

文章来源:http://www.csdn.net/article/2013-05-06/2815145-Android-open-source-projects-two

[转载]GitHub上最火的74个Android开源项目(三) - 白砂糖的博客 - eoe移动开发者社区

mikel阅读(798)

[转载]GitHub上最火的74个Android开源项目(三) – 白砂糖的博客 – eoe移动开发者社区.

此前,推出的GitHub平台上“最受欢迎的开源项目”系列文章引发了许多读者的热议,在“GitHub上最火的40个Android开源项目(一)(二)中, 我们也相继盘点了40个GitHub上最受欢迎的Android开源项目。对于GitHub上如此众多的项目,有人不断Mark,有人分享自己的经验,有 人心生“看得眼花缭乱,果然是需要终身学习的时代”的感慨,不管怎么样,如果能让你真的有所学习有所收获,我们的目的也就达到了。

今天我们将继续介绍GitHub上另外34个非常受欢迎的Android开源项目,在这些项目中,你又在用或用过哪些呢?

41.android-swipelistview

SwipeListView是一个Android List View实现,实现了自定义ListView单元格,可通过滑动来显示扩展面板。开发者可直接登陆Google Play下载安装其Demo应用

42. greenDAO

greenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储、更新、删除和查询。

greenDAO的主要设计目标:

  • 最大性能(最快的Android ORM)
  • 易于使用API
  • 高度优化
  • 最小内存消耗

详情请参考:greendao-orm

43. FFMpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库 libavcodec。FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。可以轻易地实现多种视频格式 之间的相互转换。

而FFmpeg for Android则是可通过Android NDK直接在Android源码环境下编译的FFmpeg库。该库项目即是FFmpeg for Android的入口,开发者只需直接选择需要转换的视频文件,并设置参数,即可进行转换,发起人havlenapetr表示在未来将为其开发 Android库,能够实现自动转换视频文件。

44. TweetLanes

Tweet Lanes是一个在Android4.0及更高版本的Android设备上运行的功能全面的Twitter客户端(开发者可以直接登陆Google Play下载该应用)。

该开源项目包含以下所有源代码:

  • Tweet Lanes客户端应用;
  • 连接Twitter和App.net APIs的SocialNetLib项目;
  • 所有源,尤其是LOGO和Play Store列表;
  • 用于tweetlanes.com的The App Engine项目。

45.gesture-imageview

这是一个简单的支持多指缩放图片的Android View类。在Android2.1及其更高版本的设备上,当你想要实现同时进行缩放操作时,可以将其作为一个标准的ImageView来使用。

46.android-satellite-menu

使用过Path的人都应该知道,在Path主界面的左下方有一个非常有意思的菜单。菜单由一个主按钮组成,当用户点击该按钮时,就会有一连串的按钮弹出,而Satellite Menu正是该菜单的一个开源版本。

对于Satellite Menu,其项目发起人siyamed表示,这种菜单结构就像是一个星球四周围绕着许多卫星,而这也就是他为何会以Satellite Menu命名该项目的原因。

47. VitamioBundle

Vitamio是一款Android平台上的全能多媒体开发框架,凭借着其简洁易用的API接口,Vitamio赢得了全球众多开发者的青睐。目 前,有许多公司的开源Vitamio项目都托管在GitHub上,而Vitamio的核心插件VitamioBundle正是其中之一。

VitamioBundle是一个独立的Android库,用于促进多媒体的使用,开发者可以很方便地将其集成到自己的项目当中。

48.android-ffmpeg-x264

android-ffmpeg-x264是能够让提取和构建运行在Android上、使用Android NDK最新的FFmpeg和libx264变得非常简单的一个存储库。不同于大多数其他的NDK FFmpeg构建包,它通过配置构建库,只需一个非常小的Android.mk文件即可将其包装进入一个共享库。目前,该库项目已不再更新,但在 GitHub上还有着非常多的FFmpeg库,除了前面的FFmpeg,接下来我们还会继续介绍到其他FFmpeg库。

49. ArcMenu

ArcMenu是一个类似于iOS版Path 2.0菜单的Android自定义视图项目,和我们前面介绍的Satellite Menu项目类似。

对于这个项目,其发起人daCapricorn表示,iOS版Path 2.0上的用户体验非常奇妙,但其Android版本却差太多。因此,他就尝试着在Android上做出像iOS版本那样的效果,而事实也的确如此。

50. DataDroid

DataDroid是Android平台上的一个开发库,用于简化Android应用当中的数据管理,基于Android的RESTful封装发展而来。

详情请参考:datadroidlib

51.android-adt-templates

android-adt-templates是集成了Android开发过程中使用到的许多常用的模板,用来帮助开发者快速构建一些普通的Activity和UI模型。

当然,要想使用这些模板,还必须是Eclipse和ADT 21及其以上版本,此外还需注意的一点就是,ADT模板不管理官方支持库以外的外部依赖关系。

52.android-ffmpeg

FFmpeg有许多不同的库,也总是会让人容易混淆,因此该项目发起人n8fr8对android-ffmpeg项目进行了全新的改变,该项目中包含着一个清晰、容易改变、静态的Android FFmpeg Creator。

53.
StaggeredGridView

该项目是基于Google Android StaggeredGridView进行修改的一个库项目,允许开发者创建一个类似于Pinterest的交错排列的GridView。开发者只需在自己的项目中将其作为一个库项目添加到workspace中即可直接使用。

54. robospice

RoboSpice是Repo的开源Android库,能够让编写异步网络请求变得非常简单。它专门用于网络请求,通过使用Spring Android或者Google Http
Client
等扩展模块可支持REST请求。

如果想要了解更多,不妨点击链接查看RoboSpice大图,让你30秒即可完全了解RoboSpice。如果想要立即使用,则可以直接进入WiKiRoboSpice-samples页面。

55. EventBus

当一个Android应用功能越来越多的时候,保证应用的各个部分之间高效的通信将变得越来越困难。如何优雅地解决这个问题?这时候,就需要使用到EventBus。

EventBus是GreenRobot出品的Android系统的一个Event Bus类库,使用起来和之前我们所介绍的Square的Otto差不多,都是用来简化应用组件之间的通信。

延伸阅读:EventBus和Otto使用介绍

56. commandergenius

commandergenius是SDL库的端口,在project/jni/application目录下还包含有几个个人游戏的源代码或补丁。

57. android-rss

Android RSS是Android平台上RSS 2.0阅读软件的一个轻量级Android库。

详情请参考:Code.Google

58. OpenCV-Android

OpenCV-Android是一个将OpenCV移到Android手机平台的开源项目,该项目使用OpenCV最新的一个分支并利用一个改良过的Android
NDK进行构建。

如果想要使用OpenCV-Android,必须先下载并安装Android SDK
1.6(或其更高版本)和NDK r5,除此之外,还必须具备:

  • Android手机(可能需要与其他手机相连);
  • QuickTime Java库(如果想要使用QTWebcamBroadcaster就必须具备)。

59. RESTProvider

RESTProvider旨在让访问REST服务(或任何主要的HTTP调用的网络数据格式)更容易,并将其缓存到本地的一个SQLite数据库中,允许脱机使用。可自动解析RESTful API,并将其响应到Android的一个Provider中。

60.
ImageFilterForAndroid

在开源ImageFilterForAndroid中拥有许多丰富的图片效果,是由来自国内的代震军发起的一个开源项目。除了Android平台,还有Windows Phone和iOS移动平台,三个平台源码同步。

ImageFilter库图片效果对比:

详情请参考:代震军BLOG

61.
Android-Image-Cache

Android-Image-Cache是一个能够自动判断从内存还是网络获取图片、缓存可以自动回收、自动判断如何有效地生成并检索各种尺寸缩略图的图像download-and-cacher。

主要特点如下:

  • 只需提供一个适配器即可从光标读取本地、网络URL;
  • 基于一个已下载的图像自动生成并缓存多种尺寸图像;
  • 同时提供磁盘缓存和内存缓存;
  • 自动磁盘缓存管理;不需进行设置,但如果需要的话,参数可进行调整;
  • 根据现有设置进行运作;
  • 光标适配器支持一个ImageView中多个图像字段;当是null或为空时自动跳过;
  • 当加载光标时,光标适配器会有一个自动进度提示条。

62. FFmpeg-Android

为Android neon、armv7、vfp、armv6及用于Android的VPlayer构建FFmpeg。

63.
roman10-android-tutorial

roman10-android-tutorial包含了android tutorial的所有源代码。

64. tape

Tape是Square推出的Android和Java的一组队列关系类。

详情请参考:**Square.GitHub**

65.
AndroidSideMenu

AndroidSideMenu能够让你轻而易举地创建侧滑菜单。需要注意的是,该项目自身并不提供任何创建菜单的工具,因此,开发者可以自由创建内部菜单。

66. Android-AppMsg

Android-AppMsg是基于Toast消息提示和Cyril
Mottier的“The making of Prixing #4: in-layout
notifications
”而来的一个布局内通知实现。

开发者可以直接登陆Google Play下载其示例应用

67. proxydroid

ProxyDroid是Android上的一个全局代理应用,遵循GPLv3协议,可以帮助你设置Android设备上的代理。proxydroid项目包含了ProxyDroid所有开放源代码。

68. bypass

Bypass可以跳过HTML,直接在Android和iOS上使用Markdown并进行渲染。Markdown是一种轻量级的标记语言,可以实现文本到HTML的转换。

69. OnionKit

OnionKit是一个可以通过提供多种路径来提高移动应用网络安全的Android库项目。

该库具体提供:

  • StrongTrustManager:TLS/SSL证书校验的一个强大实现,任何认证中心都可以进行定制;
  • Proxied Connection Support:通过Apache HTTPClient库的特定配置来支持HTTP和HTTPS流量的HTTP和SOCKS代理连接;
  • OrbotHelper:一个支持Orbot:Tor for Android应用集成的工具类。

70. android-ffmpeg

如果想要实现Android FFmpeg编译,必须下载安装Android NDK,在开始编译之前,还必须更新FFmpeg库。

71.
AndroidUsbCamera

Android Usb Camera是一款可以在Linux电脑上将Android手机直接当摄像头使用的客户端软件。先在手机上安装USB驱动,再安装该客户端软件,然后再在 手机上安装usbwebcam.apk程序,打开USB调试模式并运行usbwebcam,通过USB线将电脑和手机相连接即可在PC上直接使用 Android手机充当摄像头。

72. Droidex

Droidex可以将开发者附加的Android设备的屏幕内容复制到你的开发设备屏幕上。通常,如果你使用DroidEx来进行演示可谓是事半功 倍,因为你可以直接将一台Android设备与笔记本或投影仪相连,而客户也可以通过这些设备来查看Android设备上的内容。

 

此外,Droidex还可以用来演示那些不方便通过模拟器演示的内容,比如GPS或加速器。

73. andmake

andmake是Android的CMake工具链文件。CMake是一个开源的跨平台自动化构建系统,可以编译源代码、制作程序库、产生适配器,还可以用任意的顺序构建可执行文件。

74. ScreenCap

ScreenCap是Android原生自带的截屏工具,通过调用底层,采取后台截屏的方式实现截屏。

GitHub上受开发者欢迎的Android开源项目并不仅仅止于此,还有很多,并且还有许多同类开源项目,如果你感兴趣的话,可以直接登陆GitHub进行更加深入的学习了解。至此,GitHub上最受欢迎的Android开源项目盘点就全部结束了。

转自:csdn

[转载]GitHub上最火的40个Android开源项目(一) - 白砂糖的博客 - eoe移动开发者社区

mikel阅读(772)

转载GitHub上最火的40个Android开源项目(一) – 白砂糖的博客 – eoe移动开发者社区.

GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上。更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

下面,就让我们一起来看看,在GitHub平台上,究竟有哪些Android开源项目最火,也最受开发者欢迎。

1.ActionBarSherlock

ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所有版本的Android动作栏的设计模式。

对于Android
4.0及更高版本,ActionBarSherlock可以自动使用本地ActionBar实现,而对于之前没有ActionBar功能的版本,基于Ice
Cream
Sandwich的自定义动作栏实现将自动围绕布局。能够让开发者轻松开发一款带动作栏(Action
bar)的应用,并且适用于Android 2.x及其以上所有版本。

详情请参考:ActionBarSherlock

2.facebook-android-sdk

Facebook SDK for Android是一个开源库,允许开发者将Facebook集成到所开发的Android应用中。

如果想要获取更多关于示例、文档、将SDK集成到App中、源代码等信息,可直接登陆Facebook Developers查看。

3.SlidingMenuSlidingMenu
Demos

SlidingMenu是一个开源的Android库,能够让开发者轻松开发一款应用,实现类似于Google+、Youtube和Facebook应用中非常流行的滑动式菜单。

  

使用SlidingMenu的Android应用:

4. cocos2d-x

在移动开发领域,将Cocos2D-X用于主流iOS/Android游戏开发的公司、开发团队多不胜数。cocos2d-x是一个开源的支持多平 台的2D游戏框架,使用C++开发,基于cocos2d-iphone,在MIT许可证下发布。主分支在GitHub上使用OpenGL
ES 2.0渲染,而旧版gles11分支则使用OpenGL ES 1.1渲染。

支持iOS、Android、Windows Phone
8、Bada、BlackBerry、Marmalade、Windows、Linux等多个平台。支持C++、Lua、JavaScript编程语言。

5. android
GitHub Android App是 GitHub开源的Android客户端,支持Issues、Gists,并集成了新闻Feed,能够让你及时跟进组织及关注的开发者、库等。同时,该应 用还提供了一个用户快速访问你所创建、监控及发布issue的面板,可查看并将问题加入到收藏夹,可对标签、里程碑和任务进行过滤配置。

android资源库包含了GitHub Android App的所有源代码。

6.Android-ViewPagerIndicator

ViewPager指针项目,在使用ViewPager的时候能够指示ViewPager所在的位置,就像Google
Play中切换的效果一样,还能使用在应用初始化的介绍页面。

兼容Android支持库的ViewPager及ActionBarSherlock,最初是基于Patrik
Åkerfeldt的ViewFlow,开发者可以直接登陆Google
Play
下载该项目的演示应用。

7. MonoGame

MonoGame是一个Microsoft XNA 4.x
Framework的开源跨平台实现。用于让XNA开发者将他们在Xbox 360、Windows &
Windows Phone上开发的游戏移植到iOS、Android、Mac OS X、Linux及Windows 8
Metro上,目前,PlayStation Mobile & Raspberry PI的开发正在进行中。

详情请参考:**MonoGame**

8.Android-PullToRefresh

该项目用于为Android提供一个可重用的下拉刷新部件。它最初来源于Johan
Nilsson的库
(主要是图形、字符串和动画),但这些后来都已被取代。

9. android-async-http

android-async-http是Android上的一个异步、基于回调的HTTP客户端开发包,建立在Apache的HttpClient库上。

10.Android-Universal-Image-Loader

Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。

Universal Image Loader for
Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor
Vlasov的项目
,且自此之后,经过大规模的重构和改进。

11. GreenDroid

GreenDroid最初是由Cyril
Mottier发起,是一个Android的UI开发类库,能够让UI开发更加简便,并且在应用中始终保持一致。

详情请参考:Cyril Mottier’s
Blog

12. Anki-Android

AnkiDroid是一个免费、开源的Android的闪存应用,可直接从Google
Play进行下载。

详情请参考:ankidroid

13.android-actionbar

Action
bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的情况下,当开发者需要突出展现用户行为或在全局导航的activity中使用action
bar,因为action
bar能够使应用程序给用户提供一致的界面,且系统能够很好地根据不同的屏幕配置来适应操作栏的外观。

Action bar的主要目的:

  • 提供一个用于识别应用程序的标示和用户的位置的专用空间。
  • 在不同的应用程序之间提供一致的导航和视觉体验。
  • 突出Activity的关键操作,并且在可预见的方法内给用户提供快捷的访问。

14.android-viewflow

android-viewflow是Android平台上的一个视图切换的效果库,ViewFlow相当于Android
UI部件提供水平滚动的ViewGroup,使用Adapter进行条目绑定。

 

15.android-mapviewballoons

当使用Android地图外部库(com.google.android.maps)时,android-mapviewballoons会提供一个简单的方式来对地图覆盖进行标注,就是一个简单的信息气泡。

它由BalloonOverlayView组成,是一个代表显示你的MapView及BalloonItemizedOverlay的气泡的视图,BalloonItemizedOverlay是ItemizedOverlay的一个抽象扩展。

16.PushSharp

一个向iOS(iPhone/iPad APNS)、Android(C2DM和GCM)、Windows
Phone和Windows 8设备发送推送通知的服务器端库。

17.androidannotations

Android Annotations是一个开源的框架,用于加速
Android应用的开发,可以让你把重点放在功能的实现上,简化了代码,提升了可维护性。

18.HockeyKit

Hockey是一个iOS Ad-Hoc自动更新框架。苹果App
Store中的所有App都可以使用它,它能够显著地提高Beta测试的整个过程,分为两部分:服务器和客户端框架。服务器组件需要所有脚本,但在没有客 户端库的情况下,也可以单独工作。它提供一个Web接口,Beta测试者可以使用它来安装最新的AdHoc配置文件,也可以直接在设备上通过Safari 安装最新的Beta版本。

  • 只需在服务器上安装一次服务端,就可以处理包标识符不同的多个应用程序(有开发者强烈建议对Debug、AdHoc Beta和AppStore发布版使用不同的包标识符)。
  • 默认当App启动或唤醒时,客户端会从服务器检测更新,用户可以在设置对话框中进行修改:一天一次或手动检查更新。
  • 除了支持iOS,HokeyKit也支持Android平台,不过Android版还处在Alpha阶段,支持OTA及应用内更新。
  • 为HockeyKit用户提供服务器托管服务。

19.android-menudrawer

Android上的菜单展示风格各异,其中用得最多且体验最好的莫过于左右滑动来显示隐藏的菜单,android-menudrawer是一个滑动 式菜单实现,允许用户在应用当中实现无缝导航。该项目具有多种菜单展示效果,其中最常见的就是通过屏幕边缘拖动或点击动作栏的“向上”按钮显示。

 

实现功能:

  • 菜单可以沿着四个边放置。
  • 支持附加一个始终可见、不可拖动的菜单。
  • 菜单的内容和整个窗口都可以隐藏。
  • 可用于XML布局。
  • 显示当前可见屏幕的指示器。

20. android-flip

Aphid FlipView是一个能够实现Flipboard翻页效果的UI组件。

以上为GitHub上最受欢迎的Android开源项目TOP20,敬请期待“GitHub上最受欢迎的Android开源项目(二)”。

原文转自csdn:http://www.csdn.net/article/2013-05-03/2815127-Android-open-source-projects

[转载]使用队列和线程对现有asp.net动态页处理进行资源控制 - smark - 博客园

mikel阅读(1135)

[转载]使用队列和线程对现有asp.net动态页处理进行资源控制 – smark – 博客园.

IIS可以对ASP.NET站 点进行一个资源控制,包括使用的CPU,处理进程数等.但如果想对某些动态页面进行一个资源限制,只允许固定线程数量来处理某些动态请求,而不至于在某些 情况个别的动态请求把整个站的资源都占光了.对于这么小的粒度控制显然不适合由IIS来做,这个时候就可以通过ASP.NET提供 IHttpAsyncHandler来解决这种事情.

处理结构

由于Asp.net提供了异步处理Handler,所以可以在Handler的Begin处理方法中把具体对象存放到队列中,然后根据实际业务的需要来配置1-N个线程来处理相关请求.

IHttpAsyncHandler

1
2
3
4
5
6
7
8
9
10
11
12
public interface IHttpAsyncHandler : IHttpHandler
    {
        /// <summary>Initiates an asynchronous call to the HTTP handler.</summary>
        /// <returns>An <see cref="T:System.IAsyncResult" /> that contains information about the status of the process.</returns>
        /// <param name="context">An <see cref="T:System.Web.HttpContext" /> object that provides references to intrinsic server objects (for example, Request, Response, Session, and Server) used to service HTTP requests. </param>
        /// <param name="cb">The <see cref="T:System.AsyncCallback" /> to call when the asynchronous method call is complete. If <paramref name="cb" /> is null, the delegate is not called. </param>
        /// <param name="extraData">Any extra data needed to process the request. </param>
        IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData);
        /// <summary>Provides an asynchronous process End method when the process ends.</summary>
        /// <param name="result">An <see cref="T:System.IAsyncResult" /> that contains information about the status of the process. </param>
        void EndProcessRequest(IAsyncResult result);
    }

从代码来看IHttpAsyncHandler也是从IHttpHandler派生下来,并提供了Begin和End相关方法.

对已有页面进行异步封装

如果经常用IHttpHandler的朋友应该比较清楚这东西用于描述一个页面请求的,包 括我们的aspx,而aspx默认处理的则是一个IHttpHandlerFactory实现 System.Web.UI.PageHandlerFactory.通简单地继承System.Web.UI.PageHandlerFactory就 可以让原来的aspx请求返回对应的异步的HttpHandler.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class CustomPageFactory : System.Web.UI.PageHandlerFactory
    {
        static CustomPageFactory()
        {
           
        }
       
        public override IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path)
        {
            AspxAsyncHandler handler = new AspxAsyncHandler(base.GetHandler(context, requestType, virtualPath, path));
            return handler;
        }
    }

PageFactory实现后只需要简单地配置一个web.config文件就可以让现有的aspx处理由异步Handler来处理.

1
2
3
<handlers>
   <add name="custompage" verb="*" path="*.aspx" type="WebApp.Code.CustomPageFactory,WebApp"/>
</handlers>

队列化处理

制定队列的目的非常简单就是有序可控地去处理一些工作,可以通过BeginProcessRequest的执行把请求先存放到了列中

1
2
3
4
5
6
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            AspxAsyncResult result = new AspxAsyncResult(context, mHandler, cb);
            G_TaskQueue.Add(result);
            return result;
        }

制定线程处理

可以根据实际情况开启1-N个线程来处理队列中的工作.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void OnRun(object state)
        {
                while (true)
                {
                    AspxAsyncResult asyncResult = Pop();
                    if (asyncResult != null)
                    {
                        asyncResult.Execute();
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(10);
                    }
                }
        }

以上是固定线程去进行处理,但这样的设计不好的地方就是没有请求的时候线程会不停地做sleep工作,其实可以根据实际情况使用线程池来完成,具体就看情况来设计了.

总结

通过以上设计就可以轻易地对某些页面请求进行一个资源控制.如果比较关心具体实现的朋友可以查看

http://blog.henryfan.net/post/2012/11/21/%E5%AE%9E%E7%8E%B0%E5%AF%B9%E7%8E%B0%E6%9C%89%E7%9A%84aspx%E8%AF%B7%E6%B1%82%E8%BF%9B%E8%A1%8C%E5%BC%82%E6%AD%A5%E9%98%9F%E5%88%97%E6%8E%A7%E5%88%B6%E5%A4%84%E7%90%86.aspx

[转载]ASP.NET MVC通过OAuth调用Google API获取用户信息 - dudu - 博客园

mikel阅读(1024)

[转载]ASP.NET MVC通过OAuth调用Google API获取用户信息 – dudu – 博客园.

一边享受着乡村的宁静,一边写着博客,也是一种惬意。

喜欢解决问题后写一篇博客。通过文字表达出来,会加深自己的理解,还经常会有新的收获,甚至会找到更好的解决方法。同时,还能分享给别人。一举多得,何乐而不为呢?

这次要解决的问题是如何在用户注册时验证用户的邮箱?

通常的解决方法是给用户的邮箱发一封激活邮件。但这个方法有以下几个问题:

  • 从发出邮件至收到邮件,可能会有延时。
  • 邮件可能会被当作垃圾邮件处理
  • 用户可能会填错了邮箱,更糟糕的情况是用户不知道自己填错了邮箱。

这次要解决的问题的更具体的场景是如何验证用户的gmail邮箱?

我们采用的解决方法是通过OAuth调用Google API获取用户的gmail地址

于是,问题就变为如何在ASP.NET MVC中通过OAuth调用Google API

必看的两个文档:

Using OAuth 2.0 to Access Google APIs

Using OAuth 2.0 for Web Server Applications

我们的OAuth应用场景是Web Server Applications,对应的序列图如下:

简单描述一下整个流程:

  1. 你在网站上提供一个Google OAuth登录的链接
  2. 用户点击这个链接进入Google登录页面进行登录
  3. 用户登录成功后,会显示授权页面。
  4. 用户授权成功后,Google会自动重定向至你的网站页面,并传递authorization code给你。
  5. 通过这个authorization code,向Google OAuth服务器请求access_token。
  6. 拿到access_token之后,调用Google API获取用户信息。

下面是具体的实现步骤:

1. 进入Google APIs Console,创建一个Project,并创建Client ID,如下图:

得到这些信息 —— Client ID, Email address, Client secret, Redirect URIs

2. 创建一个空的ASP.NET MVC项目

3. 在web.config中添加相应的appSetting保存第1步得到的Client ID相关信息

复制代码
<appSettings>
    <add key="ClientID" value=""/>
    <add key="EmailAddress" value=""/>
    <add key="ClientSecret" value=""/>        
    <add key="RedirectURI" value=""/>      
</appSettings>
复制代码

4. 创建MVC控制器OAuthController,并添加名为GoogleLogin的Action,用于重定向至Google页面进行登录。代码如下:

复制代码
public class OAuthController : Controller { public ActionResult GoogleLogin() { var url = "https://accounts.google.com/o/oauth2/auth?"+
            "scope={0}&state={1}&redirect_uri={2}&response_type=code&client_id={3}&approval_prompt=force"; //userinfo.email表示获取用户的email
        var scope = HttpUtility.UrlEncode("https://www.googleapis.com/auth/userinfo.email"); //对应于userinfo.email
        var state = "email"; var redirectUri = HttpUtility.UrlEncode(ConfigurationManager.AppSettings["RedirectURI"]); var cilentId = HttpUtility.UrlEncode(ConfigurationManager.AppSettings["ClientID"]); return Redirect(string.Format(url, scope, state, redirectUri, cilentId)); } }
复制代码

编译后,通过浏览器访问,假设域名是passport.cnblogs.cc,访问网址就是passport.cnblogs.cc/oauth/googlelogin,访问后,如果你的google帐户已经处于登录状态,则直接显示授权页面,如下图:

点击”Allow access”之后,页面会被重定向回你的网站,我们这里重定向过来的网址是 passport.cnblogs.cc/oauth2callback?state=email&code=4 /BSCUqsaY6S5GYk9tFR-45-_UhL4-,查询参数code的值就是authorization code,接下来就是对这个重定向网址passport.cnblogs.cc/oauth2callback的处理(这个网址就是第1步中得到的 Redirect URIs)。

5. 在Global.asax.cs中添加路由规则,代码如下:

routes.MapRoute( "oauth2callback", "oauth2callback", new { controller = "OAuth", action = "GoogleCallback", id = UrlParameter.Optional } );

6. 在OAuthController中添加名为GoogleCallback的Action

public class OAuthController : Controller { public ActionResult GoogleCallback() { } }

接下来的操作都在GoogleCallback()中完成。

7.  这一步是关键的地方,主要完成两个操作:

a) 通过authorization code,向Google OAuth服务器请求access_token(访问令牌,每次调用Google API都需要这个)。
b) 拿到access_token之后,调用Google API获取用户信息(这里是email)。

主要参考文档:https://developers.google.com/accounts/docs/OAuth2WebServer

7.1 根据authorization code获取access_token的代码流程是:

  • 向https://accounts.google.com/o/oauth2/token发送HTTP POST请求,并传递相应的参数。
  • 获取服务器的响应,响应内容的格式时json格式。
  • 将json反序列化为匿名类型的实例,并获取access_token。

代码如下:

复制代码
//由于是https,这里必须要转换为HttpWebRequest
var webRequest = WebRequest.Create("https://accounts.google.com/o/oauth2/token") as HttpWebRequest; webRequest.Method = "POST"; webRequest.ContentType = "application/x-www-form-urlencoded"; //参考https://developers.google.com/accounts/docs/OAuth2WebServer
var postData = string.Format("code={0}&client_id={1}&client_secret={2}&redirect_uri={3}" +
    "&grant_type=authorization_code", Request.QueryString["code"], ConfigurationManager.AppSettings["ClientID"], ConfigurationManager.AppSettings["ClientSecret"], ConfigurationManager.AppSettings["RedirectURI"]); //在HTTP POST请求中传递参数
using (var sw = new StreamWriter(webRequest.GetRequestStream())) { sw.Write(postData); } //发送请求,并获取服务器响应
var resonseJson = ""; using (var response = webRequest.GetResponse()) { using (var sr = new StreamReader(response.GetResponseStream())) { resonseJson = sr.ReadToEnd(); } } //通过Json.NET对服务器返回的json字符串进行反序列化,得到access_token
var accessToken = JsonConvert.DeserializeAnonymousType(resonseJson, new { access_token = "" }).access_token;
复制代码

7.2 根据access_token读取用户信息的代码流程是:

  • 向https://www.googleapis.com/oauth2/v1/userinfo发送HTTP GET请求,在请求头中包含access_token信息。
  • 获取服务器的json格式的响应内容,并从中读取用户的email信息。

代码如下:

复制代码
webRequest = WebRequest.Create("https://www.googleapis.com/oauth2/v1/userinfo") as HttpWebRequest; webRequest.Method = "GET"; webRequest.Headers.Add("Authorization", "Bearer " + accessToken); using (var response = webRequest.GetResponse()) { using (var sr = new StreamReader(response.GetResponseStream())) { return Content(JsonConvert.DeserializeAnonymousType(sr.ReadToEnd(), new { Email = "" }).Email); } }
复制代码

完整代码下载

http://files.cnblogs.com/dudu/CNBlogsDemoMvcOAuth.rar

[转载]淘宝API应用开发小试 - 莱布尼茨 - 博客园

mikel阅读(857)

[转载]淘宝API应用开发小试 – 莱布尼茨 – 博客园.

无力吐槽淘宝开发平台相关文档的表述清晰度、错误率、各种费解的概念、让人头晕目眩的导航等等。至少能够在几年前就开放众多的API供第三方调用,算得上是有前瞻性的一次重要举措。闲来无事,咱也费心研究了下,有错莫怪我,要怪就怪淘宝文档太不给力。

大致是这么个流程:创建应用——开发应用——提交审核——上线使用。

在创建应用前,还得支付宝实名认证。像咱这种基本不网购的人,支付宝的账号密码绑定手机号是啥早忘了。于是用我表妹账号,特别开心的是,表妹已经开 了家网点,没几个月,据说小丫头片子已经能月入2K了(利润)。哎,我又想转行了。。。我用我表妹账号,能订阅已经上线的卖家服务,发现很多都是免费而且 做的不错的,也有淘宝自己开发的应用,比如量子恒道。

我特地研究了下这个应用,发现单凭现在开放出来的TOPAPI,基本上不能获取该应用所需的数据,比如实时客户访问。结论:第三方只能在较小范围内 做做简单业务处理和数据分析,能赚到钱,但想要赚大钱,精致程度如淘宝本土应用,我认为几乎是不可能的事,除非淘宝真的打算将这块蛋糕完全奉献出来。

废话少说,开始创建应用,换句话说就是填写基本信息。

应用分web应用和客户端应用。貌似客户端应用发布后,是通过web下载安装的,而且资质要求很高,我等屌丝只能不关心略过。web应用有个回调URL,其实就是你的web服务站点地址,在沙箱环境管理下,我们可以将回调URL设为localhost以便本机开发测试。

授权协议:若要获取私密数据,需要得到用户授权。默认是OAuth2.0协议。要求先获取授权码,然后通过授权码获取访问凭证和刷新凭证,应用可以 通过访问凭证获取用户私密数据,当访问凭证过期时,可以尝试使用刷新凭证重新获取访问凭证,当然刷新凭证也有有效期,过期只能让用户重新授权。

原本使用HttpWebRequest获取凭证,可参看dudu的ASP.NET MVC通过OAuth调用Google API获取用户信息。后来想说学学新概念,改为用httpclient获取,当然过程很坑爹。

复制代码
 1 async Task<string> GetToken(string code)  2 {  3     WebRequestHandler webRequestHandler = new WebRequestHandler();  4     webRequestHandler.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RemoteCertificateValidate);  5     HttpClient client = new HttpClient(webRequestHandler);  6     var httpContent = new FormUrlEncodedContent(new Dictionary<string, string>()  7  {  8         {"grant_type", "authorization_code"},  9         {"code", code}, 10         {"client_id", "1021489060"}, 11         {"client_secret", "sandboxccbc898dce7e6525cca1b1f1c"}, 12         {"redirect_uri", "http://localhost:9198"} 13  }); 14     string uri = "https://oauth.tbsandbox.com/token"; 15     var response = await client.PostAsync(uri, httpContent); 16     return response.Content.ReadAsStringAsync().Result; 17 }
复制代码

由于淘宝沙箱的证书无 效,webRequestHandler.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RemoteCertificateValidate);忽略证书验证,否则 得不到期望的结果,可能会抛异常。await client.PostAsync(uri, httpContent);这句折磨我很久,具体细节可以看我的上一篇博文:async、await在ASP.NET[ MVC]中之线程死锁的故事

下面开始调用API。我们可以直接通过访问WebApi获取Json格式的数据,不过还要转换成实体类神马的太过麻烦,幸好淘宝为几种流行的语言提供了SDK工具包,我屁颠屁颠地下了.net版本,开用。

获取店铺信息:

复制代码
1 private Shop GetShopInfo(string nick) 2 { 3     ITopClient client = new DefaultTopClient("http://gw.api.tbsandbox.com/router/rest", "1021489060", "sandboxccbc898dce7e6525cca1b1f1c");//实例化ITopClient类
4     ShopGetRequest req = new ShopGetRequest(); //实例化具体API对应的Request类
5     req.Fields = "sid,cid,nick,title"; 6     req.Nick = nick; 7     ShopGetResponse rsp = client.Execute(req);//执行API请求并将该类转换为response对象
8     return rsp.Shop; 9 }
复制代码

DefaultTopClient构造函数的三个参数分别为沙箱API地址(上 线使用时请改为正式地址),APPKEY,APPSecret,这两个东西是在创建应用时给到我们的,也有沙箱和正式环境两个版本。 Request.Fields表示请求的字段(不同字段访问级别可能不一样,这方面我没去研究),其余属性一般为请求参数,不同API的参数要求请参看对 应的文档说明。当Response返回时,会将数据转化成实体类,方便.NET程序访问。

我们也可以将TopApi封装为自己的WebApi供JS请求(猜测未验证:由于众所周知的跨域问题,JS应该不能直接请求TopApi,或者说相当麻烦。不过善良的淘宝也同样提供了JSSDK工具包,具体如何应用请有兴趣的同学研究好告诉我:))。

获取商品列表:

复制代码
 1 public class ItemController : ApiController  2 {  3     public IEnumerable<Item> GetItemsInventory(string sessionKey)  4  {  5         ITopClient client = new DefaultTopClient("http://gw.api.tbsandbox.com/router/rest", "1021489060", "sandboxccbc898dce7e6525cca1b1f1c");  6         ItemsInventoryGetRequest req = new ItemsInventoryGetRequest();  7         req.Fields = "approve_status,num_iid,title,nick,type,cid,pic_url,num,props,valid_thru,list_time,price,has_discount,has_invoice,has_warranty,has_showcase,modified,delist_time,postage_id,seller_cids,outer_id";  8         ItemsInventoryGetResponse rsp = client.Execute(req, sessionKey);  9         return rsp.Items; 10  } 11 }
复制代码

前台JS就可以如是调用:

复制代码
 1 $.ajax({  2     url: '/apis/Item/GetItemsInventory?sessionKey=@ViewData["SessionKey"]',  3     type: "get",  4     dataType: "json",  5     success: function (data) {  6  ConstructData(data);  7         $("#grid").kendoGrid({  8  dataSource: {  9  data: data, 10                 pageSize: 15
11  }, 12             height:530, 13             scrollable: true, 14             sortable: true, 15             filterable: true, 16  pageable: { 17                 input: true, 18                 numeric: false
19  }, 20  columns: [ 21                 { field: "Title", title: "商品名称" }, 22                 { field: "Price", title: "售价", format: "{0:c}", width: "130px" }, 23                 { field: "Num", title: "库存", width: "130px" }, 24                 { field: "ListTime", title: "上架时间" }, 25                 { field: "DelistTime", title: "下架时间" } 26  ] 27  }); 28  } 29 });
复制代码

这里需要注意,返回的data并不能直接拿过来用。因为淘宝SDK中的.NET 实体类加了Serializable特性且属性为自动属性,序列化为Json对象属性名称XXX将变 为<XXX>k__BackingField,对这种名称的属性JS只能通过中括号的形式访问,点形式读取属性将读不到,造成有些组件(比如 KendoUI的Grid)数据无法绑定。更详细信息可参看C#对 Json的序列化和反序列化会出现“k_BackingField”。

运行程序:

首先会跳到授权界面(如果你的应用不涉及到私密数据的访问,那么可以不考虑这个步骤)。

在大部分浏览器中,由于沙箱地址的证书无效,会导致这一界面显示异常。在Chorme中,可以事先使用用户账号登录mini.taobao(沙箱使用,模拟真实环境),在IE10中干脆就无解。淘宝文档中对这一情况作了一定说明。

授权成功后,转到应用界面:

转载请注明本文出处:http://www.cnblogs.com/newton/archive/2013/05/14/3078788.html

[转载]Android Studio v0.1尝鲜 - 史蒂芬.王 - 博客园

mikel阅读(1020)

[转载]Android Studio v0.1尝鲜 – 史蒂芬.王 – 博客园.

昨天Google I/O开发者大会上宣布,Android Studio 0.1的前瞻版发布了,今早马上下载尝下鲜。

下载地址如下:

https://developer.Android.com/sdk/installing/studio.html

很显然的IntelliJ IDEA的样貌,下面是一些截图:

选择了“New Project”

给工程和包起个名字

创建自定义图标

选择工程类型

给工程定个名字

开始创建。

向导基本上和Eclipse差不多。不过这个创建过程可比Eclipse上长的多。主要是因为从gradle上下载。

 

工程的结构和Eclipse上的不同,src下分为java和res

可以直接选择ADT中配置好的Emulators

运行还是在已有的Emulator上。

 

下面是导入的界面:

选择一个工程

然后是询问从哪里导入

然后是设定名字和路径

选择库

选择工程模块

选择库

java的

Android

但是有两个jar文件没找到——前瞻版里没有这个文件,只好找以前安装的包里的同名文件

询问AndroidManifest.xml文件

询问是否加入Git

工程结构,和Eclipse上的一样。

模拟器半天没起来,用Eclipse启动了模拟器,Android Studio的DDMS又找不到设备,

然后重新尝试,又起来了。DDMS的样子,和Eclipse上的一样。

 

发布仍然不成功:下面是控制台Log。

Waiting for device.
“/Applications/Android Studio.app/sdk/tools/emulator” -avd Nexus -netspeed full -netdelay none

WARNING: Data partition already in use. Changes will not persist!
WARNING: SD Card image already in use: /Users/stephenwang/.android/avd/Nexus.avd/sdcard.img
WARNING: Cache partition already in use. Changes will not persist!
emulator: emulator window was out of view and was recentered

Device connected: emulator-5556
Device is online: emulator-5556
Target device: emulator-5556 (Nexus)
Uploading file
local path: /development/workspace/KingOfAir/out/production/KingOfAir/KingOfAir.apk
remote path: /data/local/tmp/com.octrois.koa
Installing com.octrois.koa
DEVICE SHELL COMMAND: pm install -r “/data/local/tmp/com.octrois.koa”
Device is not ready. Waiting for 20 sec.
DEVICE SHELL COMMAND: pm install -r “/data/local/tmp/com.octrois.koa”
Device is not ready. Waiting for 20 sec.

终于起来了,就是一个字:慢!

—————————————————————– 现为独立咨询师。为软件企业或者其他企业的软件采购部门提供咨询,帮助改进软件开发流程,员工技术能力提升,以帮助企业在质量成本交货期三方面得到改善。

[转载]使用jcrop进行头像剪切 - 树上月 - 博客园

mikel阅读(1220)

[转载]使用jcrop进行头像剪切 – 树上月 – 博客园.

        项目需要做一个头像截取的功能,类似于QQ头像截取功能。在网上搜了下,最后使用JQuery插件jcrop来截取,

在后台来进行图片切割。

        头像截取的原理:在前台使用jcrop获取切面的x轴坐标、y轴坐标、切面高度、切面宽度,然后将这四个值传给后

台。在后台要进行放大处理:将切面放大N倍,N=原图/前台展示的头像。即X = X*原图宽/前图宽,Y = Y*原图高/

图高,W = W*原图宽/前图宽,H = H*原图高/前图高。

        实例:

        JSP:

<div id="cutImage" style="display: none;">
<div class="bigImg" style="float: left;"><img id="srcImg" alt="" width="400px" height="270px" /></div>
<div id="preview_box" class="previewImg"><img id="previewImg" alt="" width="120px" /></div>
&lt;div &gt;<form id="crop_form" action="" method="post"><input id="bigImage" type="hidden" name="bigImage" />
<input id="x" type="hidden" name="x" />
<input id="y" type="hidden" name="y" />
<input id="w" type="hidden" name="w" />
<input id="h" type="hidden" name="h" /><input id="crop_submit" type="button" value="确认" />

</form></div>

样式:大图、小图展示都需要固定高度、宽度,因为后台需要进行放大处理。即:

然后是使用jcrop了。在使用jcrop前我们需要下载jcrop:http://deepliquid.com/content/Jcrop.html

将下载的压缩包解压后可以看到三个文件夹及一个index.html文件,/ css下放置的是Jcorp的样式文件,/demo下放置的是几个简单的例子(index.html中引用的链接就是放置在这个文件夹下),/js下放置的是Jcorp中最重要的脚本文件。我们只需要使用三个文件即可:JQuery.Jcrop.css、jQuery.Jcrop.js、jQuery.js

使用方法:

//裁剪图像
function cutImage(){
$("#srcImg").Jcrop( {
aspectRatio : 1,
onChange : showCoords,
onSelect : showCoords,
minSize :[200,200]
});
//简单的事件处理程序,响应自onChange,onSelect事件,按照上面的Jcrop调用
function showCoords(obj) {
$("#x").val(obj.x);
$("#y").val(obj.y);
$("#w").val(obj.w);
$("#h").val(obj.h);
if (parseInt(obj.w) &gt; 0) {
//计算预览区域图片缩放的比例,通过计算显示区域的宽度(与高度)与剪裁的宽度(与高度)之比得到
var rx = $("#preview_box").width() / obj.w;
var ry = $("#preview_box").height() / obj.h;
//通过比例值控制图片的样式与显示
$("#previewImg").css( {
width : Math.round(rx * $("#srcImg").width()) + "px", //预览图片宽度为计算比例值与原图片宽度的乘积
height : Math.round(rx * $("#srcImg").height()) + "px", //预览图片高度为计算比例值与原图片高度的乘积
marginLeft : "-" + Math.round(rx * obj.x) + "px",
marginTop : "-" + Math.round(ry * obj.y) + "px"
});
}
}
}

在使用jcrop前一定要先将$(“”).jcrop();进行预初始化,否则没有效果。

还有一种调用的方法,

var api = $.Jcrop('#cropbox',{
onChange: showPreview,
onSelect: showPreview,
aspectRatio: 1
});

这种方法是将Jcrop生成的对象赋给一个全局变量,这样操作就会比较方便。

通过上面的js,就将X轴坐标、Y轴坐标、高度H、宽度W这个四个值传递给后台了,后台就只需要根据这四个值

进行放大处理,然后切割即可。

Action

/**
* 裁剪头像
*/
public String cutImage(){
/*
* 获取参数
* x,y,w,h,bigImage
*/
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
int x = Integer.valueOf(request.getParameter("x"));
int y = Integer.valueOf(request.getParameter("y"));
int w = Integer.valueOf(request.getParameter("w"));
int h = Integer.valueOf(request.getParameter("h"));
String bigImage = request.getParameter("bigImage");

//获取文件真实路径
//获取文件名
String[] imageNameS = bigImage.split("/");
String imageName = imageNameS[imageNameS.length-1];
//文件正式路径
String imagePath = getSavePath()+"\\"+imageName;

//切割图片
ImageCut imageCut = new ImageCut();
imageCut.cutImage(imagePath, x, y, w, h);

//头像裁剪完成后,将图片路径保存到用户
UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
userBean.setUserPhoto(bigImage);
//保存头像
UserCenterService centerService = new UserCenterService();
centerService.updatePhoto(userBean);
//将修改后的用户保存到session中
request.getSession().setAttribute("userBean", userBean);

return "updatePhoto";
}
}

裁剪图片工具类:ImageCut.java

public class ImageCut {

/**
* 图片切割
* @param imagePath 原图地址
* @param x 目标切片坐标 X轴起点
* @param y 目标切片坐标 Y轴起点
* @param w 目标切片 宽度
* @param h 目标切片 高度
*/
public void cutImage(String imagePath, int x ,int y ,int w,int h){
try {
Image img;
ImageFilter cropFilter;
// 读取源图像
BufferedImage bi = ImageIO.read(new File(imagePath));
int srcWidth = bi.getWidth(); // 源图宽度
int srcHeight = bi.getHeight(); // 源图高度

//若原图大小大于切片大小,则进行切割
if (srcWidth >= w && srcHeight >= h) {
Image image = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);

int x1 = x*srcWidth/400;
int y1 = y*srcHeight/270;
int w1 = w*srcWidth/400;
int h1 = h*srcHeight/270;

cropFilter = new CropImageFilter(x1, y1, w1, h1);
img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
BufferedImage tag = new BufferedImage(w1, h1,BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(img, 0, 0, null); // 绘制缩小后的图
g.dispose();
// 输出为文件
ImageIO.write(tag, “JPEG”, new File(imagePath));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
[/js]

    效果图:

        点击确认后,就会在指定路径下生成相应的图片:

        OVER!!

每一个不曾起舞的日子,都是对未来的一种辜负.