首页 文章 精选 留言 我的

精选列表

搜索[磐石100],共10009篇文章
优秀的个人博客,低调大师

Mozilla 拨款100万美元资助全球开源软件项目

火狐浏览器的母公司 Mozilla 昨日宣布,将拨款一百万美元用于资助全球范围内的免费开源软件项目。 Mozilla 负责人 Mitchell Baker 在 blog 上表示,他们将成立名为 Mozilla Open Source Support (MOSS) 的资助项目,一方面是回馈 Mozilla 内部使用的免费开源项目( 这些项目非常多,包括了 Ansible,Docker,Selenium,and SQLite),另一方面是利用 Mozilla 经济支援推动其它项目的发展,繁荣开源社区。 项目首期将于12月中旬之前寻找10个资助对象,未来还为在一百万美元的基础上投入更多资金。Mozilla 欢迎符合条件的开源软件申请该项目的奖金,详情请看 MOSS 的主页。 文章转载自 开源中国社区[https://www.oschina.net]

优秀的个人博客,低调大师

Docker, Java EE 7, 和 Maven with WebLogic 12.1.3 【已翻译100%】

WebLogic 12.1.3已经发布,并且对于JavaEE7的APIs在数据库支持web应用开发上也是最重要的支持。以下是在发行版本中支持的一些标准: Java Persistence API 2.1 (implemented by EclipseLink) JAX-RS 2.0 (implemented by Jersey) JSON-P 1.0 (implemented by GlassFish subproject jsonp) WebSockets 1.0 (implemented by Tyrus) 如上面你所见到的,WebLogic 以相同的实现方式捆绑使用在GlassFish 4.0上,如果你已经开始开发Java EE 7应用(Well,当然是仅限上述的APIs),并且正在寻找一个商用支持的环境,那么WebLogic 可以提供给你一个合适的应用服务。 同样Apache Maven Plugin 有许多的改进,这使得开发者的生活更简便,允许更好的自动化测试(Arquillian(一种单元测试框架)!),持续的集成和分发。那些支持基于Maven的工程的IDE同样从中受益。 这是不是使得WebLogic成为运行现代的满足RESTful原则的HTML5/Javascript网页应用程序和WebSockets服务的最好的Java EE应用服务器?如果我告诉你是不公平的,对吗?因此,为了让你有一个更好的方式去测试WebLogic,我创建了一个Dockerfile。这个Dockerfile可以使你在你自己的开发环境中创建一个WebLogic域并且去如你所想的那样去测试它。去WebLogic Community GitHub repository的weblogic-docker上下载Developer ZIP Distro Dockerfile。 开始使用WebLogic 12.1.3,Java EE 7,Maven和Docker 现在让我们开始。首先开发人员登陆Oracle.com并下载 WebLogic 12.1.3 ZIP Distro for Developers。保存该文件,供以后使用。 **安装WebLogic 12.1.3 没有Docker那么(容易)**WebLogic ZIP 非常容易就可以安装: 1.解压的内容在一个文件夹里,你要保存zip包里的wls12130文件夹,在我的linux机器上我把他放在了 /home/bruno/Work/tools/. 2.进去wls12130文件夹并运行configure.cmd(windows)或者configure.sh(unix) 创建domain的过程可能要花很长时间,此时安装过程是冻结的,如果是linux系统请确保你的配置:$ export CONFIG_JVM_ARGS=-Djava.security.egd=file:/dev/./urandom 3.当安装程序问你如果你想创建一个domain,type[Y] 4.安装程序会问你的用户名/密码。在开发环境中,我通常使用weblogic/welcome1 5.安装程序将WebLogic马上开始,你可以检查它运行在http://localhost:7001/控制台 使用Docker安装WebLogic 12.1.3(容易) 如果你的开发环境是基于Linux的,而且你现在并不熟悉Docker,那么先看What is Docker,然后试一试。长话短说:Docker是一个Linux容器;它就像个虚拟机,但又不是(例如有人在Vagrant虚拟机上运行Docker)。对我们来说最重要的是它会用虚拟的IP地址创建一个虚拟的网络接口。 我笔记本的系统是Ubuntu 14.04,所以我用Docker Installation Instruction来安装。假设你已经使用某种方式已经在你的机器上安装了Docker,阅读instructions for your own operational system. 1.下载Zip文件或者从weblogic-docker的Git仓库上检出,然后提取文件到你电脑的某个地方。我会使用$DOCKER_HOME作为文件存放位置的引用。 2.复制你先前下载的wls12130_dev.zip到$DOCKER_HOME/weblogic-docker/weblogic12c-zip/ 3.使用build.sh(以sudo身份)命令,等待Docker释放它的魔法 4.使用dockWebLogic.sh命令,观察WebLogic在Docker容器的启动和运行 它会和你主机的7001端口绑定 5.打开http://localhost:7001/console。Username/password 是 weblogic/welcome1 注意:我们不为任何环境下Docker上的WebLogic提供支持,所以在你自己的硬盘上使用它。开发者分布(ZIP)仅仅是为了开发环境,而且也不支持,因为它是不可打补丁的。如果你仍然想在Docker上运行WebLogic 12c Full Distribution,阅读here's a way to set it up. 配置本地Maven仓库 现在可以不再本地安装WebLogic就可以使用Maven了,这对CI环境(Hudson/Jenkins)很适合。你仍然需要一步安装,即设置Maven插件的初始化。你一旦为你的远程Maven仓库安装完毕并部署在一个远程服务器上,其它的开发者和CI 环境就不需要在本地进行WebLogic的安装了。对于本地开发者来说,你同样可以把WebLogic作为一个“远程”服务器。 配置Maven的步骤已经被写成文档了,地址为:Maven Synchronization Plug-in.在本地仓库上安装后,你可以调用sync goal来填充本地或远程的仓库。下面是在本地环境下填充的步骤: 1.到WebLogic安装目录的根目录下,例如:$ cd /home/bruno/Work/wls12130/ 2.进入子目录$ cd oracle_common/plugins/maven/com/oracle/maven/oracle-maven-sync/12.1.3/ 3.执行下面的命令:$ mvn install:install-file -DpomFile=oracle-maven-sync-12.1.3.pom -Dfile=oracle-maven-sync-12.1.3.jar 4.最后,调用push命令向你的仓库(在本例中是本地仓库)上传所有的Maven artifacts(插件、原型等)$ mvn com.oracle.maven:oracle-maven-sync:push -DoracleHome=/home/bruno/Work/wls12130/ 如果你想配置一个远程的仓库,参考文档Populating a Remote Repository。 WebLogic提供了一组原型的预配置Maven插件。让我们创建一个简单的Web项目使用基本WebApp Maven原型: mvn archetype:generate -DarchetypeGroupId=com.oracle.weblogic.archetype -DarchetypeArtifactId=basic-webapp -DarchetypeVersion=12.1.3-0-0 -DgroupId=org.mycompany -DartifactId=my-basic-webapp-project -Dversion=1.0-SNAPSHOT 现在你当然可以打开这个Maven项目关于NetBeans,IntelliJ IDEA,Eclipse,然后安装WebLogic IDE。或者你可以发出下面的命令来构建,包,这场战争和部署工件WebLogic服务器你计算机上运行(使用码头工人或正常安装): mvn package pre-integration-test -DoracleUsername=weblogic -DoraclePassword=welcome1 -Dupload=true 我们一定要使用-Dupload = true因为我不确定您使用的是否为Docker。如果你是,那么需要上传自容器没有访问您的本地文件系统(although possible!) 现在打开http://localhost:7001 / basicWebapp看看这个示例应用程序启动并运行!

优秀的个人博客,低调大师

如何在 Swift 中优雅地处理 JSON 【已翻译100%】

因为Swift对于类型有非常严格的控制,它在处理JSON时是挺麻烦的,因为它天生就是隐式类型。SwiftyJSON是一个能帮助我们在Swift中使用JSON的开源类库。开始之前,让我们先看一下在Swift中处理JSON是多么痛苦。 在Swift中使用JSON的问题 以Twitter API为例。使用Swift,从tweet中取得一个用户的“name”值应该非常简单。下面就是我们要处理的JSON: [ { ...... "text": "just another test", ...... "user": { "name": "OAuth Dancer", "favourites_count": 7, "entities": { "url": { "urls": [ { "expanded_url": null, "url": "http://bit.ly/oauth-dancer", "indices": [ 0, 26 ], "display_url": null } ] } ...... }, "in_reply_to_screen_name": null, }, ......] 在Swift中,你必须这样使用: let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(dataFromTwitter, options: NSJSONReadingOptions.MutableContainers, error: nil) if let statusesArray = jsonObject as? NSArray{ if let aStatus = statusesArray[0] as? NSDictionary{ if let user = aStatus["user"] as? NSDictionary{ if let userName = user["name"] as? NSDictionary{ //Finally We Got The Name } } } } 或者,你可以用另外的一个方法,但这不易于阅读: let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(dataFromTwitter, options: NSJSONReadingOptions.MutableContainers, error: nil) if let userName = (((jsonObject as? NSArray)?[0] as? NSDictionary)?["user"] as? NSDictionary)?["name"]{ //What A disaster above } 开始 下载在这儿下载SwiftyJSON,或者直接在GitHub克隆它: git clone https://github.com/lingoer/SwiftyJSON.git 基础用法 SwiftyJSON的使用十分的简单: 典型的NSURLSessionTask抓取Twitter的API将产生dataFromNetwork: NSData!: 你首先应该做的事情是初始化JSONValue: let json = JSONValue(dataFromNetwork) JSONValue是一个枚举类型表示一个典型的JSON数据结构。 你能使用subscripts检索不同的值从原始的JSONValue中,像这样: let userName:JSONValue = json[0]["user"]["name"] 注意userName仍然是一个JSONValue。那怎样得到一个字符串呢? 你能用.string属性得到JSON数据表示的真正值。 let userNameString = userName.string! 对每一种JSON类型, JSONValue都提供了一种属性检索它: var string: String? var number: NSNumber? var bool: Bool? var array: Array<JSONValue>? var object: Dictionary<String, JSONValue>? 注意每一种属性都是一个Optional值。这是因为JSON数据能包含任何它定义的有效类型。 因此,建议的方式是用Optional绑定检索值: if let name = userName.string{ //This could avoid lots of crashes caused by the unexpected data types } if let name = userName.number{ //As the value of the userName is Not a number. It won't execute. } .number属性产生一个NSNumber值,在Swift中这通常不是很有用。你能用.double或者.integer得到一个Double值或者一个Int值。 if let intValue = numberValue.integer{ count += intValue } 枚举(Enumeration)在Swift中JSONValue实际上是一个枚举: enum JSONValue { case JNumber(NSNumber) case JString(String) case JBool(Bool) case JNull case JArray(Array<JSONValue>) case JObject(Dictionary<String,JSONValue>) case JInvalid(NSError) }你可以使用一个switch子句去更有效地获取值: let json = JSONValue(jsonObject)switch json["user_id"]{case .JString(let stringValue): let id = stringValue.toInt() case .JNumber(let numberValue): let id = numberValue.integerValue default: println("ooops!!! JSON Data is Unexpected or Broken") 下标(Subscripts) 注意,在JSON中一个数组结构被包装成intoArray,它意味着数组里的每一个元素都是一个JSONValue。甚至你从JSONValue中取出一个数组,你仍然可以使用基本的属性去获取元素的值: if let array = json["key_of_array"].array{ if let string = array[0].string{ //The array[0] is still a JSONValue! } } 对象也是一样。因此,推荐的方式是访问每一个数组和对象时使用JSONValue的下标。 if let string = json["key_of_array"][0].string{ } 实际上,你可以用下标访问一个JSONValue,还不用担心运行时错误导致的崩溃: let userName = json[99999]["wrong_key"] 如果你使用推荐的方式去取数据,它是安全的: if let userName = json[99999]["wrong_key"]["name"].string{ //It's always safe } 打印 JSONValue遵守Printable协议.所以很容易在原始字符串中得到JSON数据: let json = JSONValue(dataFromNetwork)println(json)/*You can get a well printed human readable raw JSON string: { "url": { "urls": [ { "expanded_url": null, "url": "http://bit.ly/oauth-dancer", "indices": [ 0, 26 ], "display_url": null } ] } */如果你不想打印出来,你可以使用.description属性来得到上述字符串。 let printableString = json.description 调试与错误处理 要是JSON数据出错或者我们错误地检索数据,那会怎么样呢?你可以使用if语句来测试: let json = JSONValue(dataFromNetworking)["some_key"]["some_wrong_key"]["wrong_name"] if json{ //JSONValue it self conforms to Protocol "LogicValue", with JSONValue.JInvalid stands for false and others stands true } 如果我们尝试使用错误的键值或索引来访问数据,description属性会高数你KeyPath在哪里出错了. let json = JSONValue(dataFromNetworking)["some_key"]["some_wrong_key"]["wrong_name"] if json{ } else { println(json) //> JSON Keypath Error: Incorrect Keypath "some_wrong_key/wrong_name" //It always tells you where your key went wrong switch json{ case .JInvalid(let error): //An NSError containing detailed error information } } 后记 SwiftyJSON的开发将会发布在Github, 请持续关注后续版本。

优秀的个人博客,低调大师

开发原生的 Google 眼镜应用 【已翻译100%】(1/2)

与谷歌眼镜打交道时,在开发者预览版本 或 先睹为快状态版本里,谷歌有两个可用的API / SDK。第一个是谷歌眼镜的 Mirror API,这是一个基于RESTful接口,从远程服务器发送卡片到谷歌眼镜timeline的云。第二个是眼镜的开发工具包,构建在Android SDK上,用来开发直接运行在眼镜的应用程序。这些应用程序还可以利用Android NDK和原生代码协作。由于它是建立在Android SDK上,尽管原生应用程序开发时不需要它,但确实公开了一些很好的额外特性。 英巴卡迪诺科技的 Appmethod 应用开发平台 和 RAD Studio 开发工具支持Android应用程序开发,包括支持原生谷歌眼镜的应用程序。你可以用你选择的C++或Object Pascal编程语言。这种支持同时基于Android SDK和NDK。一旦谷歌眼镜的Android ADB驱动加载完毕,你可以对待它就像任何其他Android设备一样。本文使用RAD Studio开发工具来贯穿谷歌眼镜的方方面面。本文示例使用Object Pascal,也涉及到RAD Studio,但是你在这看到的所有示例,也适用于C + +,或个别的C++ Builder和Delphi的产品(用移动附加包)。同样地,这大部分示例也能在Appmethod上工作。你可以按照本文中的步骤,下载一个RAD Studio或 Appmethod 的 免费30天许可 。 谷歌眼镜说明 谷歌眼镜除是一个Android平台的设备外,还意味着更多。本质上来说,它是你穿戴在头上的小型平板。它有一个运行ARM v7 NEON指示的双核ARM Cortex-A9 CPU,一个照相机,和典型的移动设备的传感器。对亏最近的升级,它运行Android 4.4 KitKat(API 19)系统。它能够运行许多原生的Android应用程序,但这仅仅是个开始。 眼镜的主要输出是640x360显示屏,看起来出奇的好。谷歌号称相当于在8英尺处有一个25英寸的屏幕。它还有一个骨传导扬声器和可选的耳机用做放音。它有一大堆的输入传感器:麦克风,加速计,陀螺仪,磁力计(指南针),环境光感器,接近传感器和一个向前可以捕捉5百万像素照片或720p的视频的广角相机。此外,有一个右太阳穴的触摸板,还有一个传感器针对眼睛进行眨眼检测,以及“头检测”的传感器。后两者的支持仍在测试。 Google Glass并不是第一个Android 系统供电光学头戴式电脑,但它可能是最具革新性的。相比于其他Android设备上的通用输入模块:一块触摸屏或者键盘,Google Glass的主要输入设备采用的是声音和位于右侧太阳穴附近的一块非常小的触控式控制板。这块触摸板不能用于点击特定窗口小部件或应用程序,但通常会提供四个基本手势: 向前和向后导航、选择、或者后退按钮,如果没有做过其他操作,回退按钮将退出你的应用程序。 Google Glass的主要用户界面是一系列卡片组成的时间线的概念。一次轻击唤醒Google Glass。向左或向右移动可以使时间轴向前或向后移动。从首页卡上,轻击或使用声音控制可以打开已安装应用程序的列表,当启动某个已安装的应用时,通常会继续使用左侧到右侧的导航模式。 Figure 1 - Google Glass首页屏幕 安装ADB USB驱动 在windows上开发Android应用之前需要安装ADB USB驱动. 在以前,对于Google Glass这一过程更加复杂. 在 Google USB 驱动第9版出来后, Google Glass提供官方的支持. 只需要运行Android Tools工具集(和RAD Studio在一起安装的) 就会打开 Android SDK 管理界面. 在Package列表Extra的最下部安装Google USB 驱动即可. Figure 2 - Android SDK管理界面 在设备管理界面你会在Other devices看到一个以黄色三角打头的词条,这就是Glass 1.可以在Android SDK 的安装目录下找到extrasgoogleusb_driver. 下面示例为安装了 Android SDK 以及RAD Studio后默认的安装路径: C:UsersPublicDocumentsEmbarcaderoStudio14.0PlatformSDKsadt-bundle-windows-x86-20131030sdkextrasgoogleusb_driver 建立第一个原生的Glassware AppRAD Studio 可以建立跨终端的各种应用,不论Android或是iOS. 由于Glass的特殊性,这里假设你即将创建的就是该应用. 如果需要在多终端上使用,可以使用混合开发技巧. RAD Studio提供创建应用的多种模板. 先从空白应用开始, 这也是大多数Glassware的入口点, 当然了3D应用的广泛性也是不言而喻的. Figure 3 - FireMonkey Mobile Application Wizard 为谷歌眼镜设置IDE 主显示屏的实际分辨率是640x360, 而它的像素密度是1.5。这就意味着一个有效分辨率为472x240的控制布局 (实际像素除以像素密度)。 RAD Studio 包含一个针对谷歌眼镜,尺寸已经精准的设备布局器。您可以在IDE的设计图面上从下拉列表中选择它。 Figure 4 - Design Surface with Google Glass Layout 这种布局将谷歌眼镜的任一颜色都有效。同样的,您可以在设备管理中通过(Tools -> Options -> Environment Options -> Form Designer -> Device Manager)定义你自己的谷歌眼镜设备。为Android平台添加一个新的设备。您只需激活景观左方向。您将需要提供一个至少472x240像素的背景图片。如果你愿意,你可以指定状态栏的大小,但是你将通常把它隐藏在眼镜应用里 (更多关于这一点)。 声控启动支持 当运行你的应用时它会自动启动,但是一旦你关闭了应用,你将不会再菜单中找到它。这是因为谷歌眼镜和其他传统安卓应用相比,采用了不同的启动机制。不过,这个问题很容易添加支持。 一旦你第一次创建了你的应用程序,RAD Studio会创建一个AndroidManifest.template.xml文件。这个模版文件是用来为你的安卓应用生成实际使用的AndroidManifest.xml文件。 我发现添加该文件到项目中使得按需打开并编辑该文件其实非常简单。右键点击你的项目文件,选择Add...这会打开一个文件浏览对话框使得你可以选择AndroidMainfest.template.xml。这时,你可以通过Project Manager双击该文件打开编辑。 这有两个编辑操作需要保证在你的操作清单中。第一个在标签中。你需要指定你想要回应声音触发器的操作。可以通过添加下面的标签实现: <action android:name="com.google.android.glass.action.VOICE_TRIGGER" /> 然后,你需要在标签中为这个响应添加元数据: <meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/voice_trigger_start" /> 此参数指定 了XML 文件 voice_trigger_start.xml 将定义你的声音触发器。此文件可以具有任何名称, 虽然它应该在 XML 目录中,但当你添加文件时它需要和此处指定的名称匹配 关于声音触发器的需要注意一点:Google有一个核准的 voice triggers 列表,但是如果你想使用一个不同的,你只能被允许在开发中使用,并且需要在你的manifest中添加特殊的权限。直接将下面的内容添加到 <%uses-permission%> 的后面: <uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT" /> 你可以提交自己的推荐声音触发器到Google,如果被批准了将会添加到这个列表中。 现在你需要创建一个 voice_trigger_start.xml 文件。 1.右键 Project Manager 然后选择 Add New > Other > Web Documents > XML File来添加一个新的XML文件到你的项目中。 2.重命名这个XML文件为voice_trigger_start.xml 或者任何你在manifest中指定的名字. manifest不包含 .xml 后缀. 3.保存XML文件到你的项目目录下. 4.像下面这样编辑XML文件: <?xml version="1.0" encoding="UTF-8"?> <trigger keyword="Your keyword here" /> 如果你有指定的开发许可,你可以用任意你想要的短语或关键字来替换 Your keyword here。现在当你的应用被部署后,它将会与应用图片一起显示在菜单系统上。 最终, 你需要配置你的部署使得voice_trigger_start.xml 文件被放在Android应用apk包的正确位置。 可以通过部署管理器来完成这一配置,具体参看 Project > Deployment 菜单选项。简单的点击添加文件按钮(左边第二个)然后浏览并选择 voice_trigger_start.xml 文件。 添加文件后你需要编辑 res/xml的 Remote Path, 这将会将它放到apk包的正确位置。 通用Glass App配置 通常来讲,安卓应用中都会在屏幕上方放置一个状态栏。在Google Glass中,状态栏是隐藏的。在你的应用中隐藏工具栏需要进行两个步骤的处理。首先,你可以在设计阶段讲表格的BoarderStyle设置为None。接着,为了在运行阶段移除状态栏,需要依次点击Project->Options->Version Info,在最上面的下拉框中选择All configurations – Android Platform,然后将键theme的值从TitleBar修改为No TitleBar。 Figure 5 - 工程选项 - 主题无标题栏 默认的安卓主题是灰色和黑色字体配合白色背景的Halo Light。对于手机或者平板来讲,这个主题是不错的,但是在Google Glass上面,白色像素非常亮,导致黑色像素基本上是透明的一样。距离你的眼睛非常近的一块几乎全白的屏幕就像拿一个手电筒照你的眼睛,非常不舒服。幸好RAD Studio还有一款Halo Dark主题,和一款为Google Glass量身打造的一款风格主题。这款风格主题背景为黑色,字体采用淡淡的彩色并具有稍大的字号。这是一款基于推荐的Google Glass风格主题。 为了改变你的应用的风格,可以从工具面板中添加一个TStyleBook到表格中。在项目管理器中,确保Android被选为目标平台。为你的应用(空白的设计面)选择TForm,并在对象检查器中设置StyleBook属性为你刚刚放置到表格中的TStyleBook。现在双击TStyleBook然后点击加载按钮,并导航到styles文件夹下。默认情况下该文件夹可以在这个路径下被找到: C:UsersPublicDocumentsEmbarcaderoStudio14.0StylesAndroid Glass应用通常有一个能在透明背景下显示出轮廓的白色应用图标。你可以在工程选项对话框的Application选项中改变应用的启动图标。 构建你的应用 这个时候你已经准备好去为Google眼镜构建一个与Glass一体化的应用。Glass与传统的移动应用相较而言,是一种不同的使用范例,因此你需要在应用设计中投入一些思考。下面是一些有关如何与Glass的不同元素交互从而达到更好的用户体验的小技巧。

优秀的个人博客,低调大师

iOS 在 Flash 中集成消息推送服务 【已翻译100%】

在Flash平台上用ActionScript应用程序接口开发具有Push通知功能的iOS应用是非常耗时的过程,同时我们也知道时间非常珍贵。因此,这篇文章的主要目标就是让哪些使用Flash给iPhone开发具有Push功能的应用的开发人员开发过程所耗时间更短,开发的方法更容易得到理解。为了便于理解,下面我们举了一个使用App42 Action-Script应用程序接口的Push应用。我们只用了几分钟就可以把App42 PUSH通知组件集成到应用里。 所讨论的内容 1.如何在Flash iOS应用中使用App42 Action-Script应用程序接口集成Push通知组件? 2.如何使用App42 Action-Script Push通知应用程序接口发送Push通知消息? 运行例程 1.注册到App42平台 2.注册之后在快速进入页面创建应用 3.如果你已经注册过了,那么请登录到AppHQ控制台,然后点击App管理标签,通过它创建应用 4.首先你需要到iOS开发中心创建证书,然后按照安装之前设置部分所提到的步骤提交证书 5.然后下载例程项目,并把这个项目导入到FlashBuilder里。如果你打算自己创建项目,那么请点击选择移动应用标签,然后创建新的ActionScript移动项目。选择Apple iOS,提交,接着点击完成。 6.向Adobe集成运行环境(AIR)移动应用描述XML文件添加信息。这个文件是iOS特有的。(注意:创建新项目的时候可以更改这个文件) <id>Bundle ID</id> //添加在第四步看到的Apple包的ID <iPhone> <InfoAdditions> <![CDATA[ <key>UIDeviceFamily</key> <array> <string>1</string> <string>2</string> </array> <key>UIStatusBarStyle</key> <string>UIStatusBarStyleBlackOpaque</string> <key>UIRequiresPersistentWiFi</key> <string>YES</string> ]]> </InfoAdditions> <Entitlements> <![CDATA[ <key>aps-environment</key> <string>development</string> ]]> </Entitlements> <requestedDisplayResolution>high</requestedDisplayResolution> </iPhone> 7.打开例程所在项目的Constant.as文件,并做一下修改:替换你在第二步或者第三步看到的api-Key和secert-Key用你注册Push通知应用所用的用户名替换现有的user-name 8, 您能使用Flash Builder - File|Export|Release Build (在Flash Builder的输出对话框下)选项或者直接在截图中显示的位置选择Export Release Build 添加iOS包文件 a)选择项目,程序,目标平台 b)设置包设置,为在第4步中已接收的部分选择所有的数字签名集。现在,点击结束,几秒钟后将在你的项目目录中生成.ipa文件10.选择这个.ipa文件和.mobileprovision并访问iTunes。然后,安装它到你的手机中。 在AppHQ控制台测试和验证Push通知消息 1 点击Store Token按钮,保存在第7步中已通过的用户设备令牌。 2 在注册Push通知消息之后,进入AppHQ控制台并点击PushNotification。选择用户和程序 3 从已注册的用户列表中选择期望的用户并点击发送Push 4 选择发送按钮发送适当的消息给用户 使用App42 ActionScript API给用户发送Push通知消息 1.点击Store Token按钮,存储在第7步中已通过的用户设备令牌 StoreToken Integrating Push Notification in Flash With iOS public function storeDeviceToken_click(e:MouseEvent):void { outputBtn.text = ""; pushNotificationService.storeDeviceToken(Constant.userName, deviceToken, DeviceType.iOS , new app42StorePushCallBack()); } //Callback Class class app42StorePushCallBack implements App42CallBack { public function onSuccess(response:Object):void { outputBtn.appendText("\n PushNotification"); var pushNotification:PushNotification = PushNotification(response); outputBtn.appendText("\n PushNotification success is : "+pushNotification) outputBtn.appendText("\n User Name : "+pushNotification.getUserName()); outputBtn.appendText("\n DeviceToken :"+pushNotification.getDeviceToken()); outputBtn.appendText("\n Device Type : "+pushNotification .getType()); } public function onException(exception:App42Exception):void { outputBtn.appendText ( "\n Exception is : " + exception); } } 输入消息并按发送消息按钮,在输入控制台界面你将得到响应信息。 SendMessage Integrating Push Notification in Flash With iOS public function sendMessage_click(e:MouseEvent):void { outputBtn.text = ""; pushNotificationService.sendPushMessageToUser(Constant.userName, headingTextField , new app42PushCallBack()); } //Callback Class class app42PushCallBack implements App42CallBack { public function onSuccess(response:Object):void { outputBtn.appendText("\n PushNotification"); var pushNotification:PushNotification = PushNotification(response); outputBtn.appendText("\n PushNotification success is : "+pushNotification) outputBtn.appendText("\n User Name : "+pushNotification.getUserName()); outputBtn.appendText("\n Expiry is " + pushNotification.getExpiry()); outputBtn.appendText("\n Message is " + pushNotification.getMessage()); } public function onException(exception:App42Exception):void { outputBtn.appendText ( "\n Exception is : " + exception); } } 请注意:如果你的App是启动的,消息将显示在输出控制台

优秀的个人博客,低调大师

从 Objective-C 到 Swift —— Swift 糖果 【已翻译100%】

Swift带来很多确实很棒的特性,使得很难再回到Objective-C。主要的特性是安全性,不过这也被看成是一种额外副作用。 带类型接口的强型别 Swift有强型别,这意味着除非你要求,不然Swift不会为你做类型之间的转换。所以,例如你无法把Int型赋给Double型。你不得不首先转换类型: let i: Int = 42 let d: Double = Double(i) 或者你必须给Double类扩展一个方法用来转换Int型: extension Double { func __convert(i: Int) -> Double { return Double(i) } } let another_d: Double = i 强型别对于安全性是非常非常有利的。但是,如果它没有为你给类型接口添加许多类型信息的话,它也可能变成有一点令人生畏的事情,有点像是在写脚本语言。 let ary = ["Hello", "world"] // NOTE: 'ary' is of type String[] or Array<String> for s in ary { // NOTE: 's' is of type String print(s + " ") } 如果你想要创建一个包含很多类型(无共同祖先)的数组,你应该用枚举(它可以包含值,见如下)。如果你想要它能够包含所有值,你可以用Any型。如果想让它包含任何Objective-C的类型,那就用AnyObject型。 请注意类型接口不会在申明函数的时候为你添加类型。你必须明确地说明你所申明函数的类型。 Blocks Swift 中的Blocks很像Objective-C中的Blocks, 不过有两点不同: 类型推断和避免weakify dance. 对于类型推断,你不必每次写block时都包含完整类型信息: sort([2,1,3], { (a: Int, b: Int) -> Bool in return a < b }) // Using Type Inference // Using the Trailing Closures feature sort([2,1,3]) { a, b in return a < b } // Implicit 'return' for single-expression blocks sort([2,1,3]) { a,b in a<b } // Shorthand Argument Names sort([2,1,3]) { $0 < $1 } // Operators are functions, and functions are blocks too! let sorted: Int[] = sort([2,1,3], <) 访问 Closures 了解更多blocks信息。 除此之外,Objectvie-C 的weakify dance有点容易,只需在block的开始处加上 [unowned self] 或 [weak self] 即可。 class CallbackTest { var i = 5 var callback: (Int -> ())? // NOTE: The optional callback takes an Int deinit { // NOTE: This is like -dealloc in Objective-C println("Deinit") } } var obj = CallbackTest() obj.callback = { [unowned obj] // NOTE: Without this, deinit() would never be invoked! a in obj.i = a } 请注意Introduction post文章中介绍了Optional(像上面的callback)。 请参考 ARC 章节来了解更多关于Swift中ARC的信息。 强劲的Enumerations Swift中的枚举比Objective-C中的有很大提高。 **修复 Enums**Apple一直提倡显示的提供枚举类型的大小,不过被Objective-C搞乱了: // Apple recommended enum definition in Objective-C typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { UIViewAnimationCurveEaseInOut, UIViewAnimationCurveEaseIn, UIViewAnimationCurveEaseOut, UIViewAnimationCurveLinear }; // Previous Apple recommended enum definition in Objective-C. No link between // enum values and theUIViewAnimationCurve type. typedef enum { UIViewAnimationCurveEaseInOut, UIViewAnimationCurveEaseIn, UIViewAnimationCurveEaseOut, UIViewAnimationCurveLinear }; typedef NSInteger UIViewAnimationCurve; // Traditional enum definition in Objective-C. No explicit fixed size. typedef enum { UIViewAnimationCurveEaseInOut, UIViewAnimationCurveEaseIn, UIViewAnimationCurveEaseOut, UIViewAnimationCurveLinear } UIViewAnimationCurve; Swift中的修复: enum UIViewAnimationCurve : Int { case EaseInOut case EaseIn case EaseOut case Linear } 拓展Enums Enums 在Swift中更进一步,只作为一个独立的选项列表。你可以添加方法(以及计算属性): enum UIViewAnimationCurve : Int { case EaseInOut case EaseIn case EaseOut case Linear func typeName() -> String { return "UIViewAnimationCurve" } } 使用类型拓展,你可以向枚举中添加任何你想要的方法: extension UIViewAnimationCurve { func description() -> String { switch self { case EaseInOut: return "EaseInOut" case EaseIn: return "EaseIn" case EaseOut: return "EaseOut" case Linear: return "Linear" } } } 向Enums中添加值Swift中的枚举跟进一步,允许每一个独立的选项都有一个对应的值: enum Shape { case Dot case Circle(radius: Double) // Require argument name! case Square(Double) case Rectangle(width: Double, height: Double) // Require argument names! func area() -> Double { switch self { case Dot: return 0 case Circle(let r): // Assign the associated value to the constant 'r' return π*r*r case Square(let l): return l*l case Rectangle(let w, let h): return w*h } } } var shape = Shape.Dot shape = .Square(2) shape = .Rectangle(width: 3, height: 4) // Argument names required shape.area() 如果你喜欢,你可以把它当做一个安全的union类型。或者只用枚举应该做的事情。 Enumerations 文章介绍了更多关于Apple对此的看法。 Swift Switch语句 就像你看到的,Swift中switch语句有很多优化。 隐式的fall-through行为已经改为了显示的: var (i, j) = (4, -1) // Assign (and create) two variables simultaneously switch i { case 1: j = 1 case 2, 3: // The case for both 2 and 3 j = 2 case 4: j = 4 fallthrough case 5: j++ default: j = Int.max // The Swift version of INT_MAX } 就像前面看到的,Switch 语句可以访问枚举的关联值,不过它还可以做更多: var tuple: (Int, Int) // Did I mention that Swift has tuples? :-) var result: String tuple = (1,3) switch tuple { case (let x, let y) where x > y: result = "Larger" case (let x, let y) where x < y: result = "Smaller" default: result = "Same" } 甚至可以使用String: var s: String = "Cocoa" switch s { case "Java": s = "High caffeine" case "Cocoa": s = "High sugar" case "Carbon": s = "Lots of bubbles" default: () } 另外,如果你觉得他可以使你的代码更可读,你可以重载~=操作符来改变switch语句的行为。 func ~=(pattern: String, str: String) -> Bool { return str.hasPrefix(pattern) } var s = "Carbon" switch s { case "J": s = "High caffeine" case "C": s = "No caffeine" default: () } 你可以从 Conditional Statements 这篇文章中了解更多关于switch语句的知识。 类与结构体 类似于C++,Swift的类与结构体初看是一样的: class Apple { var color = "green" // Property declaration init() {} // Default initializer init(_ color: String) { // '_' means no argument name self.color = color } func description() -> String { return "apple of color \(color)" } func enripen() { color = "red" } } struct Orange { var color = "green" init() {} init(_ color: String) { self.color = color } func description() -> String { return "orange of color \(color)" } mutating func enripen() { // NOTE: 'mutating' is required color = "orange" } } var apple1 = Apple() var apple2 = apple1 // NOTE: This references the same object! apple1.enripen() apple2.description() // Result: "apple of color red" var orange1 = Orange() var orange2 = orange1 // NOTE: This makes a copy! orange1.enripen() orange2.description() // Result: "orange of color green" 主要的不同点在于类是(和块相似的)引用类型,而结构体是(和枚举相似的)数值类型。所以两个变量能够指向同一个(类的)对象,而把一个结构体赋给另外一个变量则必须做一个此结构体的(缓慢的)拷贝。关键词'mutating'告诉调用者enripen()方法不能被常结构体调用。把一个常引用mutating给一个类对象则没有问题。 Swift中大多数内建类型实际上都是结构体。甚至Int型也是。通过点击Cmd你能够看到内建类型的申明,比如Int型的Swift(或者Playground)源码。数组和词典类型也是结构体,但是数组在某些方面表现得像是引用类型:赋值数组并不拷贝每一个元素,实际上你可以更新常数组只要元素的个数保持不变。 let array1 = [1, 2, 3] let array2 = array1 // A copy, but references the same elements! array1[1] = 5 // Legal, as it doesn't modify the struct but a referenced element array2 // Result: [1, 5, 3] 在苹果的文档中,你可以读到更多关于Collection Types的内容。 对象的生命周期 另一个类与结构体的不同是类可以被子类化。 类和结构体都可以被拓展,并且实现protocol,但是只用类可以继承其他类。 class Pineapple : Apple { init(color: String) { super.init(color) } convenience init() { self.init("green") } convenience init(ripe: Bool) { self.init() if ripe { color = "yellow" } else { color = "green" } } deinit { println("Pineapple down") } override func description() -> String { return "pine" + super.description() } override func enripen() { color = "yellow" } } 就像你看到的,Swift为继承添加了一点更有趣的需要学习的东西。对于初学者来说,你需要清除你覆盖父类中某个方法的意图。如果你想阻止子类覆盖一些东西,你可以在一个单独声明或整个类的前面加上@final属性。阅读 Apple’s documentation了解更多。 初始化 Swift的对象分两步进行初始化: 首先对象必须是有效的,然后它能被替换。 class ChildShoe { var size: Double // Uninitialized properties are not allowed unless taken care of in init() init(foot_size: Double) { size = foot_size // First make the object valid addGrowthCompensation() } func addGrowthCompensation() { size++ } } 使对象有效必须要调用一个超级类指定的init()方法。类可以同时拥有指定的以及便捷的(用关键词'convenience'标记)初始化方法。便捷初始化方法调用同一个类中的其他初始化方法(最终还是一个指定的初始化方法),而指定的初始化方法调用超级类的初始化方法。 如果你给所有的超级类指定初始化方法添加初始化方法,你的类也会自动继承所有便捷初始化方法。如果没有添加任何指定的初始化方法,你的类则继承超级类的所有(指定的和便捷的)初始化方法。 深入阅读请参见Initialization。 类型转换 类之间的转换,特别是向下转换,你可以使用"is","as?"和"as"关键词: let apple: Apple = Pineapple() let exotic: Bool = apple is Pineapple let pineappleOption: Pineapple? = apple as? Pineapplelet pineapple: Pineapple = apple as Pineapple // NOTE: Throws if not! if let obj = apple as? Pineapple { // If executed, 'obj' is a Pineapple "sweet" }想了解更多这方面内容请参见Type Casting一章. 泛型 泛型是Swift的一个加分的特点。他们看起来有一点像C++里面的模板,但是有更强的型别,也更简单(更简单使用,功能稍逊)。 // Mark both Int and Double as being convertible to a Double using the '+' prefix protocol DoubleConvertible { @prefix func +(v: Self) -> Double } @prefix func +(v: Int) -> Double { return Double(v) } extension Double: DoubleConvertible {} extension Int: DoubleConvertible {} // NOTE: Repeat this for all Int*, UInt*, and the Float type // The traits of a generalized point protocol PointTraits { typealias T class var dimensions: Int { get } func getCoordinate(dimension: Int) -> T } // Generalized Pythagoras struct Pythagoras<P1: PointTraits, P2: PointTraits where P1.T: DoubleConvertible, P2.T: DoubleConvertible> { static func apply(a: P1, b: P2, dimensions: Int) -> Double { if dimensions == 0 { return 0 } let d: Double = +a.getCoordinate(dimensions-1) - +b.getCoordinate(dimensions-1) // NOTE: '+' to convert to Double return d * d + apply(a, b: b, dimensions: dimensions-1) } static func apply(a: P1, b: P2) -> Double { let dimensions = P1.dimensions assert(P2.dimensions == dimensions) return apply(a, b: b, dimensions: dimensions) } }; import func Foundation.sqrt // NOTE: You can import a typealias&shy;, struct&shy;, class&shy;, enum&shy;, protocol&shy;, var&shy;, or func only func distance<P1: PointTraits, P2: PointTraits where P1.T: DoubleConvertible, P2.T: DoubleConvertible>(a: P1, b: P2) -> Double { assert(P1.dimensions == P2.dimensions) return sqrt(Pythagoras.apply(a, b: b)); } // A generalized 2D point struct Point2D<Number> : PointTraits { static var dimensions: Int { return 2 } var x: Number, y: Number func getCoordinate(dimension: Int) -> Number { return dimension == 0 ? x : y } // NOTE: The typealias T is inferred } let a = Point2D(x: 1.0, y: 2.0) let b = Point2D(x: 5, y: 5) Pythagoras.apply(a, b: b) // NOTE: Methods require all argument names, except the first distance(a, b) // NOTE: Functions do not require argument names // UIColor extension UIColor : PointTraits { class var dimensions: Int { return 4 } func getCoordinate(dimension: Int) -> Double { var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0 getRed(&red, green: &green, blue: &blue, alpha: &alpha) switch dimension { case 0: return red case 1: return green case 2: return blue default: return alpha } } } distance(UIColor.redColor(), UIColor.orangeColor()) 以上代码是受Boost中的Design Rationale的启发.几何的C++库。Swift中的泛型功能不是那么强,但是却能使源码比C++中泛型更具阅读性。 Swift的泛型是通过类型参数化的。每个参数类型要求实现一个特定的协议或者继承自一个特定的基类。在申明参数类型后,有一个可选的"where"项目能用于给这个类型(或者是他们的内部类型,就如上面那个PointTraits协议中的别名'T')添加额外的需求。这个"where“也能要求两种类型是相等的。 苹果有更多更完整的Generics章节。 选定Swift 现在你已经准备好了去看各种各样的源码了,甚至可以自己写了 :-) 在把你自己留在一个新的大的Swift未知大陆之前,我有几个最终的建议: Apple推荐你使用Int作为所有Integer类型,即使你之前用无符号数的地方。“只有在你真的需要一个与平台原生大小想相同的无符号integer类型时再使用UInt类型.” 如果你想知道@private和al.在哪:好吧,他们还没完成呢,后续版本会加进来的。 如果你创建了一个module,你可以Cmd+单击你的module的名字来查看你的module的自动生成的Swift头。 Swift的modules其实是命名空间,因此在任何东西前加像 CF, NS, UI等的前缀。当创建第三方库是就不是那么绝对必要了。 Enjoy using Swift!

优秀的个人博客,低调大师

【已翻译100%】

在最近的GR8Conf Europe 2014期间,SpringSource/Pivotal的Groovy高级软件工程师 Cédric Champeau已经在Andriod上完成一次Groovy代码的现场pull请求的合并。 Groovy开发人员为了在Android上运行Groovy已经等待好几年了。因为各种困难,它的实现被推迟了,这包括Andriod Dalvik虚拟机的不同字节码和Groovy代码的动态特性等。官方对Android的支持可能在Groovy2.4版本。InfoQ采访了 Champeau,了解了更多的这方面的内容以及未来Groovy在Andriod系统中的发展。 InfoQ:让Groovy在Android上工作,最困难的部分是什么? 实际上有多个问题,它们结合在一起使得这个工作变得有些困难。第一个问题是Groovy是一个在运行时生成类的动态语言。问题是那些类是使用标准的JVM格式生成的,而Android使用了自己的类格式(Dalvik VM)。Dalvik VM并不意味着运行时创建类,这样就变得很困难,因为每个使用标准JVM字节码的文件都需要通过'dex'工具加载处理。甚至你能够在设备上做到这些,运行时加载类仍然是痛苦的。例如,在jar文件中写一个类,然后加载这个jar。最后,我们决定这不是Groovy运行在Android上的主要关注点,我们应该更关注用Groovy写一个完整的应用,不涉及运行时创建类。这意味着有一些限制,但是这对许多用户来说是不可见的。最后,如果你在Android上静态编译Groovy时,使用了@compileStatic,性能以及内存消耗相当于或者同Android原生应用相同。 第二个问题实际上是和系统构建相关。新的Andriod构建系统使用了Gradle和一个自定义的插件,"android",它绕过了正常的"java"和"groovy"插件提供类似于应用程序变种的功能。这需要一些工作来弄清楚我们如果插入它来添加对Groovy的支持。令人欣慰的是自从公布以后,Groovy的Gradle插件和Android已经发布,使得事情变得更容易了。最后但并非最不重要的一点,我通过编写对Groovy的支持了解了Android。这是一件好事情,因为我可以看到在哪些地方使用Groovy会让你受益,但是实际上这花费我更多的时间比适配Groovy本身! InfoQ:将来会考虑将这项工作扩展到iOS或者至少是Windows Phone来作为一中跨平台解决方案吗? 我肯定非常希望能在iOS上面看到Groovy的身影,但是我没有硬件设备去测试;)即使最近发布的Swift语言看起来与Groovy非常接近并且远远比Object-C吸引人,人们仍然可以把它作为Groovy的一种替代。但是,我们还要考虑这样一个问题:Swift是由供应商封锁的闭源软件。相比之下,Groovy则是完全开源的,如果你能在iOS和Android平台下用Groovy进行编码,举个例子来说,人们可能需要做的仅仅是重写他们应用的UI部分就可以使他们的应用更适应大部分的手机开发。至于Windows Phone,我完全不知道这是否可行。实际上对于这个平台,我了解甚少。 InfoQ: 当前有哪些不足之处? 还有哪些是不能运行的? 直到最近,仅仅@CompileStatic类能运行在Android上。但是现在也可以运行动态代码了,因此几乎所有的东西都能运行了,包括构建器。应当知道,使用动态代码应限于应用程序的非CPU密集型部分,因为它涉及到反射。这就是说,当前的限制是不能运行时实时构建类,因此一些特定的结构比如映射到类或者实时运行特征将不工作。欣慰的是有办法解决这些问题。最后,在方法描述符的数量上仍然有问题。Andriod缺省的方法总量的限制是65536,这相当的低,在无优化的情况下,Groovy将消耗8k(例如,ProGuard)。因此这意味着比通常的java应用程序更快的到达限制,即使有方法可以解决这件事情(例如用multidex选项)。 InfoQ:对将来Groovy/Android的发展有何规划? CC: 官方对Android的支持会有第一个测试版的Groovy2.4。目前,你已经可以将其应用于自己的应用程序,并且实际上在第一个示例应用程序中,这已经包含在产品中。([2])但是它仅是基于Groovy的一个快照版本。但我真的很想看看新的库或框架编写的Groovy是如何便利Android应用程序的开发。Android非常啰嗦,Groovy则可以使编码更容易。为此,我们很多社区的开发人员已经写了大量的像这样的为Java开发的库,所以Groovy的普及和发展只是时间问题。我相信一旦用户在Android上面体验到了Groovy,他们不太可能切换回Java;) [1] https://github.com/melix/groovy-android-gradle-plugin [2] https://play.google.com/store/apps/details?id=me.champeau.gr8confagenda.app

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册