posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2013年3月13日

     摘要: 原文:http://www.cnblogs.com/pifoo/archive/2011/05/28/webkit-webapp.htmlwebkit webApp 开发技术要点总结如果你是一名前端er,又想在移动设备上开发出自己的应用,那怎么实现呢?幸好,webkit内核的浏览器能帮助我们完成这一切。接触 webkit webApp的开发已经有一段时间了,现把一些技巧分享给大家 :1. view...  阅读全文

posted @ 2013-03-13 17:12 RTY 阅读(2158) | 评论 (0)编辑 收藏

2013年3月8日

Java Gossip: 國際化訊息

國際化的英文是Internationalization,因為單字中總共有18個字母,簡稱I18N,目的是讓應用程式可以應地區不同而顯示不同的訊息,最基本的就是讓不同語系的使用者可以看到屬於自己語系的訊息,像是英文語系的看到英文內容,而中文語系的可以看到中文的內容。

為了在應用程式中表示一個區域,Java提供有java.util.Locale類,一個Locale實例包括了語系資訊與區域資訊,例如說"en"表示英文語系的國家,這個字母組合是在 
ISO 639 中定義的,而區域資訊則是像"US"表示美國,這個字母組合則是在 ISO 3166 中定義的。

您可以這麼新增一個Locale的實例:
Locale locale = new Locale("zh", "TW");
 
如何將Locale用於訊息綁定呢?當您使用ResourceBundle.getBundle()方法時,預設就會自動取得電腦上的語系與區域訊息,而事實上訊息檔案的名稱由basename加上語系與地區來組成,例如:
  • basename.properties
  • basename_en.properties
  • basename_zh_TW.properties

沒有指定語言與地區的basename是預設的資源檔名稱,當沒有提供專用的語系、區域訊息檔案時,就會找尋預設的資源檔案。

如果您想要提供繁體中文的訊息,由於訊息資源檔必須是ISO-8859-1編碼,所以對於非西方語系的處理,必須先將之轉換為Java Unicode Escape格式,例如您可以先在訊息資源檔中寫下以下的內容:
  • messages_zh_TW.txt
onlyfun.caterpillar.welcome=哈囉
onlyfun.caterpillar.name=世界

然後使用JDK的工具程式native2ascii來轉換,例如:
native2ascii -encoding Big5 messages_zh_TW.txt messages_zh_TW.properties

轉換後的內容會如下:

  • messages_zh_TW.properties
onlyfun.caterpillar.welcome=\u54c8\u56c9
onlyfun.caterpillar.name=\u4e16\u754c

將這個檔案放於classpath可以存取的到的位置,您也可以提供預設的訊息檔案:
  • messages.properties
onlyfun.caterpillar.welcome=Hello
onlyfun.caterpillar.name=World

來測試一下訊息檔案,我所使用的作業系統是語系設定是中文,區域設定是台灣,當我使用下面的程式時:
  • ResourceBundleDemo.java
package onlyfun.caterpillar;
 
import java.util.ResourceBundle;

public class ResourceBundleDemo {
public static void main(String[] args) {
ResourceBundle resource =
ResourceBundle.getBundle("messages");

System.out.print(resource.getString(
"onlyfun.caterpillar.welcome") + "!");
System.out.println(resource.getString(
"onlyfun.caterpillar.name") + "!");
}
}

會使用預設的語系"zh"與區域設定"TW",所以就會找尋messages_zh_TW.properties的內容,所以會顯示以下的訊息:
哈囉!世界!

在使用ResourceBundle.getBundle()時可以給定Locale實例作為參數,例如若您想提供 messages_en_US.properties,並想要ResourceBundle.getBundle()取得這個檔案的內容,則可以如下撰寫:
Locale locale = new Locale("en", "US");
ResourceBundle resource = 
            ResourceBundle.getBundle("messages", locale);
 
則取得的訊息會是messages_en_US.properties的內容。

posted @ 2013-03-08 11:03 RTY 阅读(473) | 评论 (0)编辑 收藏

2013年2月17日

根据我的环境说明一下:
1、Cordova的目录:/Users/kevin/Projects/HTML5/cordova-2.4.0/cordova-android

2、AndroidSDK目录: /Users/kevin/TBB/adt-bundle-mac-x86_64/sdk

3、设置方法:
(1)Terminal: 定位到Cordova的目录。
       cd /Users/kevin/Projects/HTML5/cordova-2.4.0/cordova-android
 (2)设置环境变量
       export PATH=/Users/kevin/TBB/adt-bundle-mac-x86_64/sdk:/Users/kevin/TBB/adt-bundle-mac-x86_64/sdk/tools/:$PATH

 (3)执行 ./bin/create ~/Desktop/myapp com.myapp.special MyApp

特殊说明:
./bin/create /Users/kevin/CordovaProjects/Android/ChunMiaoPu com_chunmiaopu_android chunMiaoPuAndroid

会出现错误:
An unexpected error occurred: "$ANDROID_BIN" create project --target $TARGET --path "$PROJECT_PATH" --package $PACKAGE --activity $ACTIVITY >&/dev/null exited with 1
Deleting project...


只有执行如下才可以:./bin/create ~/CordovaProjects/Android/ChunMiaoPu com.chunmiaopu.android chunMiaoPuAndroid


~/MyWorkSpace/JiffAndroidApp 会自动创建JiffAndroidApp目录

devmatoMacBook-2:cordova-android kevin$ ./bin/create ~/MyWorkSpace/JiffAndroidApp me.jiff.AndroidApp JiffAndroidApp
An unexpected error occurred: ANDROID_BIN="${ANDROID_BIN:=$( which android )}" exited with 1
Deleting project...
devmatoMacBook-2:cordova-android kevin$ export PATH=/Applications/eclipseForADT-20130219/sdk:/Applications/eclipseForADT-20130219/sdk/tools/:$PATH  
devmatoMacBook-2:cordova-android kevin$ ./bin/create ~/MyWorkSpace/JiffAndroidApp me.jiff.AndroidApp JiffAndroidApp
devmatoMacBook-2:cordova-android kevin$ 

posted @ 2013-02-17 13:12 RTY 阅读(1070) | 评论 (0)编辑 收藏

2013年2月7日

为你的Cocoa应用程序加入更新支持:Sparkle 简介

发布于:2010-09-20 13:06阅读数:3141

作为一名桌面软件开发者,应该提早考虑程序的更新问题。如何将程序更新及时优雅的推送给用户,是维持用户忠诚度和提高软件使用体验的一个重要方面。而作为Cocoa应用程序开发者,

转自 ibuick.com,原文  http://ibuick.com/index.php/archives/add-automatic-update-support-over-cocoa-app-via-sparkle-framework


作为一名桌面软件开发者,应该提早考虑程序的更新问题。如何将程序更新及时优雅的推送给用户,是维持用户忠诚度和提高软件使用体验的一个重要方面。而作为Cocoa应用程序开发者,我们可以选择自己手动来实现此功能,也可以选择一些优秀的开源框架。Sparkle就是其中之一。

Sparkle是一个非常简单且易用的Cocoa应用程序更新框架。本篇文章将使用一个简单的例子,教你如何使用Sparkle为你的Cocoa应用程序加入更新支持。

1: 新建一个Cocoa Application,TestSparkle

wpid-wpid-xcodecocoaapplication-2010-09-10-16-11-2010-09-10-16-11.png

 

wpid-wpid-cocoaapplicationwithsparkle-2010-09-10-16-11-2010-09-10-16-11.png
2: 去到Sparkle下载Sparkle Framework,最新版本为 1.5b6,

wpid-wpid-sparkle-2010-09-10-16-11-2010-09-10-16-11.png
Sparkle Test App.app 是一个用来演示Sparkle更新框架的一个应用程序。

Extras文件夹下提供了Sparkle的标准图标,Release Notes模版,软件签名工具,源代码和Appcast.xml示例文件,我们后面会再讲到这些工具和文件。

With Garbage Collection, 是一个加入了Garbage Collection支持的Sparkle分发版,如果你的应用程序运行在有GC的环境下,则可以使用这个版本的Sparkle

Sparkle.framework 是通用分发版,笔者建议大家使用此版本的Sparkle

3: 链接Sparkle框架到TestSparkle工程

拖拽Sparkle.framework(或 with Garbage Collection下的 Sparkle.framework)到TestSparkle的Linked Frameworks下,在弹出窗口中记得选中”Copy items into destination group’s folder (if needed)”前面的复选框。

wpid-wpid-addsparkletotestsparkle-2010-09-10-16-11-2010-09-10-16-11.png

4: 为你的工程新建一个Copy Files Build Phase,

wpid-wpid-addcopyfilesbuildphase-2010-09-10-16-11-2010-09-10-16-11.png
5: 右键点击这个新建的Copy Files Build Phase,并在弹出窗口中,点击Destination下拉框,选择Frameworks

wpid-wpid-copyfilesbuildphaseforframework-2010-09-10-16-11-2010-09-10-16-11.png
6: 将Linked Framworks下的Sparkle.framework拖拽到这个新建的Copy Files Build Phase 中

wpid-wpid-addsparkle-2010-09-10-16-11-2010-09-10-16-11.png
7: 在Interface Builder中打开TestSparkle的MainMenu.xib(nib), 然后点击Interface Builder–>Files–>Read Class Files

wpid-wpid-readclassfiles-2010-09-10-16-11-2010-09-10-16-11.png

8: 将Sparkle.framework中的所有头文件选中并读取

wpid-wpid-readheaderfiles-2010-09-10-16-11-2010-09-10-16-11.png
9: 从Library中拖拽一个 NSObject到MainMenu主窗口.

wpid-wpid-addobject-2010-09-10-16-11-2010-09-10-16-11.png

10: 点击此Object对象,点击Inspector,设定此Object的Class为 SUUpdater

wpid-wpid-SUUpdater-2010-09-10-16-11-2010-09-10-16-11.png

11: 添加一个菜单项到到TestSparkle Menu,重命名为 Check For Updates…

wpid-wpid-Checkupdatesmenuitem-2010-09-10-16-11-2010-09-10-16-11.png

12: 将 Check for Updates…菜单项的Send Actions指向Updater Object的checkForUpdates方法

wpid-wpid-addactionforupdate-2010-09-10-16-11-2010-09-10-16-11.png
13: 保存Interface Builder的所有更改,退出Interface Builder。

14: 为了安全防止应用程序更新遭到恶意篡改,我推荐对应用程序更新添加数字签名。

Sparkle使用DAS SHA-1 来对程序更新包进行数字签名。

打开终端,进入步骤2中存放已下载的Sparkle包的文件夹,进入Extras–>Signing Tools,

执行,

ruby generate_keys.rb

这个命令将会生成两个文件 dsa_priv.pem 和 dsa_pub.pem,也就是私钥和公钥,请妥善保存这两个文件,如果私钥丢失,你得用户将再也无法自动通过已安装的程序来获得更新的更新。

15: 建立一个 App Cast Feed文件

Sparkle的运作机理其实非常简洁,本地应用程序Info.plist中含有一个URL,此URL指向一个在你网站上的App Cast Feed XML文件。当你发布更新的时候,上传新的app到你的网站,更新此app cast xml feed。这样,客户端程序在运行检查更新时,会根据Info Plist中的URL找到并Parse此文件,跟本地软件版本进行比对。如果发现更新,则提示用户。这就是App Cast XML Feed文件的作用。

在步骤14中提到的Extras文件夹下,有一个App Cast XML Feed文件的模版:

 

http://you.com/app/2.0.html

Wed, 09 Jan 2006 19:20:11 +0000

http://you.com/app/1.5.html

Wed, 01 Jan 2006 12:20:11 +0000
<!-- Now here's an example of a version with a weird internal version number (like an SVN revision) but a human-readable external one. -->
http://you.com/app/1.4.html

Wed, 25 Dec 2005 12:20:11 +0000

我们可以看出,这其实是一个标准的RSS Feed格式的XML文件。我们只要修改相应的项目即可。

下面我们就来一步步的演示如何使用Sparkle为你的程序加入更新支持。

16: 我们首先在本地搭建一个可用于测试软件更新的网站。打开Mac OS X系统偏好设置(System Preferences), 找到共享(Sharing),开启Web共享(Web Sharing),并通过点击图中所示URL测试Web共享是否成功开启。http://10.0.1.2/~buick 你的显示可能与此不同,,,,

wpid-wpid-websharing-2010-09-10-16-11-2010-09-10-16-11.png
17: 打开你的XCode中 TestSparkle 工程,编辑 TestSparkle-Info.plist,加入两个属性,SUPublicDSAKeyFile 和 SUFeedURL

wpid-wpid-info.plist-2010-09-10-16-11-2010-09-10-16-11.png

其中,SUFeedURL 将是指向一个 App Cast XML Fee 的 URL,比如我的测试地址是 http://10.0.1.2/~buick/testsparkleappcast.xml ,SUPublicDSAKeyFile 指向公钥,我们把刚才步骤14中生成的 dsa_pub.pem 加入到工程的Resources中,并在 TestSparkle-Info.plist 中指定此公钥的名称,,,,那么现在的TestSparkle-Info.plist应该是这样

整个配置完成,我们现在来构建一个TestSparkle.app的1.0版本,点击Build and Run

wpid-wpid-TestSparkle-2010-09-10-16-11-2010-09-10-16-11.png
启动TestSparkle.app, 在TestSparkle菜单下,确认Check for Updates…按钮处于可用状态,如果是灰色不可点击,则返回Interface Builder修改。

wpid-wpid-checkforupdates-2010-09-10-16-11-2010-09-10-16-11.png

将此 TestSparkle.app 1.0 版本拷贝到别处备用。然后返回XCode,将应用程序版本改为1.1,然后构建工程。将TestSparkle.app 的1.1版本打包成zip文件,改名为TestSparkle_1.1.zip

将 dsa_priv.pem (私钥) 和 TestSparkle_1.1.zip 拷贝到 Extras下的Signing Tool文件夹中,

wpid-wpid-signing-2010-09-10-16-11-2010-09-10-16-11.png

打开终端进入到此文件夹,执行:

ruby sign_update.rb TestSparkle_1.1.zip dsa_priv.pem

wpid-wpid-sign-2010-09-10-16-11-2010-09-10-16-11.png
便可得到升级包的签名,MCwCFDZsrVGB+PewvxioJcvptkqchXi3AhQOZDJ4UukRM2/bYmZzzbHTxM2kpA==

用文本编辑器创建一个xml文件(UTF-8 编码),内容如下:

http://10.0.1.2/~buick          The latest TestSparkle updates from localhost, more hot features and sweeties
en

Fri, 10 Sept 2010 0:00:00 +0300             http://10.0.1.2/~buick

注意(由于本网站HTML的设置问题,如果你直接拷贝以上XML Feed文件到你本地测试可能会出编码问题导致XML Parse失败,请到本文最后下载此文件,以及工程压缩包)。

把此XML另存为 testsparkleappcast.xml

熟悉RSS Feed的读者可能很容易理解此文件,,如果我们在浏览器中直接访问此URL,我们会看到

wpid-wpid-feed-2010-09-10-16-11-2010-09-10-16-11.png

而我们要关注的只是这两段:

这段指定的URL是一个介绍页面,如果你希望在更新提示窗口中出现一个介绍新版本的页面(或者说release notes),则使用此URL定向到你网站上的新版本介绍页面。

Sparkle非常贴心的为大家提供了一个模版,在Extras/Release Notes Templates 文件夹下可找到

enclosure sparkle:version=“1.1” sparkle:dsaSignature=“MCwCFDZsrVGB+PewvxioJcvptkqchXi3AhQOZDJ4UukRM2/bYmZzzbHTxM2kpA==“ url=“http://10.0.1.2/~buick/TestSparkle_1.1.zip” length=“436264” type=“application/octet-stream”/>

这段是实现Sparkle Update的关键,

sparkle:version=“1.1” 是指当前更新包版本号,客户端程序就是根据这个版本号来和本地APP进行比对,如果发现不同则提示更新。

sparkle:dsaSignature=“MCwCFDZsrVGB+PewvxioJcvptkqchXi3AhQOZDJ4UukRM2/bYmZzzbHTxM2kpA==“ 这个就是我们刚才为更新包生成的数字签名

url=“http://10.0.1.2/~buick/TestSparkle_1.1.zip” 指向更新包下载地址

length=“436264” 指更新包的大小,上传上去前用 终端 ls -al 命令可查看

type=“application/octet-stream” 是一个想对固定的值,一般不用修改。

现在把testsparkleappcast.xml 和 TestSparkle_1.1.zip 拷贝到

你的用户主目录/Sites 下 (~/Sites,具体路径依你个人配置而定)

wpid-wpid-path-2010-09-10-16-11-2010-09-10-16-11.png
然后在浏览器敲入 http://10.0.1.2/~buick/testsparkleappcast.xml

如果能够看到类似网页,,,说明一切正常。

下面找到我们刚才保存的TestSparkle.app 1.0版本,运行并点击 Check for Updates… 如果一切正常,你可以看到

wpid-update1-2010-09-10-16-11.png

点击Install Update,如果更新成功,即可显示:

wpid-complee-2010-09-10-16-11.png

然后再次点击Check for Updates, 你会看到

wpid-latest-2010-09-10-16-11.png

最后希望你与Sparkle合作愉快。

点击此处下载本次工程源代码和示例XML Feed文件,另外,安装包里面还带有一个Sparkle的简体中文包,将它放入你的Sparkle.framework/Resources下即可。

posted @ 2013-02-07 14:14 RTY 阅读(1028) | 评论 (0)编辑 收藏

2013年2月5日

文字色彩

可以用一个UIColor对象来定义文字的色彩。UIColor这个类提供了许多不同的方法,可以很轻松地调出任何颜色。你可以用静态方法来创建 颜色,这样它们会在停止使用后被释放。可以用灰度值、色相或者RGB复合值等多种形式来创建颜色。要创建一个简单的RGB色彩,可以指定一组4个浮点值, 分别对应红、绿、蓝和alpha值(透明度),取值均在0.0~1.0之间。这些值表示了0%(0.0)~100%(1.0)的范围:

  1. UIColor *myWhiteTransparentColor = [ UIColor 
    colorWithWhite: 1.0 alpha: 0.50 ];  
  2.  
  3. UIColor *myColorHue = [ UIColor colorWithHue: 120.0 / 360.0  
  4.         saturation: 0.75  
  5.         brightness: 0.50  
  6.         alpha: 1.0  
  7. ];  
  8.  
  9. UIColor *myColorRGB = [ UIColor colorWithRed: 0.75  
  10.         green: 1.0  
  11.         blue: 0.75  
  12.         alpha: 1.0  
  13. ]; 

如果你打算重用许多不同的UIColor对象,你也可以创建它们的实例:

  1. UIColor *myWhiteTransparentColor = [ [ UIColor alloc ]  
  2.         initWithWhite: 1.0 alpha: 0.50  
  3. ];  
  4.  
  5. UIColor *myColorHue = [ [ UIColor alloc ]  
  6.         initWithHue: 120.0 / 360.0  
  7.         saturation: 0.75  
  8.         brightness: 0.50  
  9.         alpha: 1.0  
  10. ];  
  11.  
  12. UIColor *myColorRGB = [ [ UIColor alloc ] initWithRed: 0.75  
  13.         green: 1.0  
  14.         blue: 0.75  
  15.         alpha: 1.0  
  16. ]; 

UIColor类还支持许多静态方法,可以创建系统颜色,这些颜色都经过iPhone的校正,以达到尽可能准确的地步。这些方法如下所示,均来自UIColor.h:

  1. + (UIColor *)blackColor;        // 0.0 白色  
  2. + (UIColor *)darkGrayColor;     // 0.333 白色  
  3. + (UIColor *)lightGrayColor;    // 0.667 白色  
  4. + (UIColor *)whiteColor;        // 1.0 白色  
  5. + (UIColor *)grayColor;         // 0.5 白色  
  6. + (UIColor *)redColor;          // 1.0, 0.0, 0.0 RGB  
  7. + (UIColor *)greenColor;        // 0.0, 1.0, 0.0 RGB  
  8. + (UIColor *)blueColor;         // 0.0, 0.0, 1.0 RGB  
  9. + (UIColor *)cyanColor;         // 0.0, 1.0, 1.0 RGB  
  10. + (UIColor *)yellowColor;       // 1.0, 1.0, 0.0 RGB  
  11. + (UIColor *)magentaColor;      // 1.0, 0.0, 1.0 RGB  
  12. + (UIColor *)orangeColor;       // 1.0, 0.5, 0.0 RGB  
  13. + (UIColor *)purpleColor;       // 0.5, 0.0, 0.5 RGB  
  14. + (UIColor *)brownColor;        // 0.6, 0.4, 0.2 RGB  
  15. + (UIColor *)clearColor;        // 0.0 白色, 0.0 alpha 

创建好UIColor对象之后,就可以将其赋给文本视图的色彩属性了:

textView.textColor = myColorHue; 

posted @ 2013-02-05 15:24 RTY 阅读(631) | 评论 (0)编辑 收藏

2013年2月4日

NSString *str = @"011597464952,01521545545,454545474,454545444|Hello this is were the message is.";

NSArray *firstSplit = [str componentsSeparatedByString:@"|"];
NSAssert(firstSplit.count == 2, @"Oops! Parsed string had more than one |, no message or no numbers.");
NSString *msg = [firstSplit lastObject];
NSArray *numbers = [[firstSplit objectAtIndex:0] componentsSepratedByString:@","];

// print out the numbers (as strings)
for(NSString *currentNumberString in number) {
NSLog(@"Number: %@", currentNumberString);

posted @ 2013-02-04 14:22 RTY 阅读(5509) | 评论 (0)编辑 收藏

功能创建一个test.plist文件,textInput作为输入,displayLabel作为显示,有一个按钮来触发保持程序triggerStorage;

-(void)triggerStorage
{
    displayLabel.text = textInput.text;
    
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *path=[paths    objectAtIndex:0];  
    NSString *filename=[path stringByAppendingPathComponent:@"test.plist"];   //获取路径
    
    NSDictionary* dic2 = [NSDictionary dictionaryWithContentsOfFile:filename];  //读取数据
    NSLog(@"dic2 is:%@",dic2); 
    
    //创建一个dic,写到plist文件里
    NSDictionary* dic = [NSDictionary dictionaryWithObjectsAndKeys:displayLabel.text,@"IP",nil]; //写入数据
    [dic writeToFile:filename atomically:YES];   

}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    NSMutableArray *resultData; 
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *path=[paths objectAtIndex:0];
    NSLog(@"path = %@",path);   
    NSString *filename=[path stringByAppendingPathComponent:@"test.plist"]; 
  
    //读文件
    NSDictionary* dic2 = [NSDictionary dictionaryWithContentsOfFile:filename];
    NSLog(@"dic is:%@",dic2);    
    if(dic2 == nil)
    {
        //1. 创建一个plist文件 
        NSFileManager* fm = [NSFileManager defaultManager];
        [fm createFileAtPath:filename contents:nil attributes:nil];        
    }
    else
    {
        resultData=[dic2 objectForKey:@"IP"]; 
        if([dic2 count] > 0)
        {
            displayLabel.text = resultData;
        }
        else
        {
            displayLabel.text = @" ";
        }
    }
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]   //按钮的初始化及触发条件设置
                                               initWithTitle:@"保存" 
                                               style:UIBarButtonItemStylePlain 
                                               target:self 
                                               action:@selector(triggerStorage)] autorelease];    
    [super viewDidLoad];
}

------------------------------------------------------------------------------------------------------------------------------------------------------------

参考代码:

plist 文件读写
    //1. 创建一个plist文件
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *path=[paths    objectAtIndex:0];
    NSLog(@"path = %@",path);
    NSString *filename=[path stringByAppendingPathComponent:@"test.plist"];    
    NSFileManager* fm = [NSFileManager defaultManager];
    [fm createFileAtPath:filename contents:nil attributes:nil];        
    //NSDictionary* dic = [NSDictionary dictionaryWithContentsOfFile:plistPath];
    
    //创建一个dic,写到plist文件里
    NSDictionary* dic = [NSDictionary dictionaryWithObjectsAndKeys:@"sina",@"1",@"163",@"2",nil];
    [dic writeToFile:filename atomically:YES];
    
    //读文件
    NSDictionary* dic2 = [NSDictionary dictionaryWithContentsOfFile:filename];

    NSLog(@"dic is:%@",dic2);

posted @ 2013-02-04 13:49 RTY 阅读(7685) | 评论 (1)编辑 收藏

2013年1月8日

《移动应用开发解决方案》Embarcadero HTML 5 Builder
2012年10月28日 ⁄ 最新素材, 行业软件暂无评论 ⁄ 被围观 324 views+

002364cf_medium.jpg
Embarcadero HTML 5 Builder | 464.2 mb

HTML5 Builder允许开发者在可视化IDE中使用Javascript、HTML5,jQuery mobile以及CSS3开发Web和移动应用。关心跨平台移动支持的开发者,可以使用同一份公共HTML5/CSS3/JavaScript代码,支持iOS,Android,黑莓以及Windows Phone。HTML5 Builder不仅仅关注客户端开发,它还集成了服务端PHP以及数据库(如MySQL)的支持。
HTML5 Builder是增强并重命名的RadPHP。通过对客户端解决方案的更多支持,尤其是对HTML5和CSS3的支持,我们感觉新名字更适合其新能力,并且更符合当前的市场。作为一个完整的端到端Web开发解决方案,HTML5 Builder继续支持PHP后端解决方案(具体讲,就是Zend框架以及数据访问组件)。

HTML5 Builder is Embarcadero's Web and Mobile application development solution enabling corporate and ISV developers to visually design and create apps for Web, iOS, Android, BlackBerry and Windows Phone using a single HTML5, CSS3, PHP and JavaScript codebase.

HTML5 Builder is the replacement for RadPHP in the Embarcadero product portfolio for Web and Mobile application platforms. With this groundbreaking new developer solution you can now build web and mobile apps with a single codebase using web standards - and deliver your apps to users via desktop and mobile Web browsers or natively "on device" via Apple, Android, BlackBerry and Windows Phone mobile app stores.

About Embarcadero Technologies
Embarcadero Technologies, Inc. is a leading provider of award-winning tools for application developers and database professionals so they can design systems right, build them faster and run them better, regardless of their platform or programming language. Ninety of the Fortune 100 and an active community of more than three million users worldwide rely on Embarcadero products to increase productivity, reduce costs, simplify change management and compliance, and accelerate innovation. Founded in 1993, Embarcadero is headquartered in San Francisco, with offices located around the world.

VIP服务

posted @ 2013-01-08 16:31 RTY 阅读(639) | 评论 (0)编辑 收藏

     摘要: Parse .strings file with PythonParse .strings file with Pythonup vote1down votefavoriteI'm trying to write a small Python script to parse the .strings file in my iPhone application project and determi...  阅读全文

posted @ 2013-01-08 13:44 RTY 阅读(566) | 评论 (0)编辑 收藏

2013年1月7日

cocoa中虽然有[[NSFileManager defaultManager] fileExistsAtPath:filename]来检查文件是否可写的方法,但是对文件目录却不起作用,没办法只好自己写一个比较山寨的方法:

bool IsDirectoryWritable(NSString *dir)
{
    bool result = false;
    
    if(![[NSFileManager defaultManager] fileExistsAtPath:dir])
        return result;
    
    NSString* fileName = [dir stringByAppendingFormat:@"/  _#t.txt"];
    NSData *data = [fileName dataUsingEncoding:NSUTF8StringEncoding];
    [data writeToFile:fileName atomically:NO];
    
    result = [[NSFileManager defaultManager] fileExistsAtPath:fileName];
    if(result)
    {
        [[NSFileManager defaultManager] removeItemAtPath:fileName error:NULL];
    }
    
    return true;
}

这个方法的不好之处就是有可能用于尝试的fileName可能已经存在(虽然已经起的很奇怪了快哭了),这样会导致返回结果不准确,也有可能测试文件创建成功了但是删除却失败了,那么也会导致下次测试不准确,。如果哪位高人有更好的办法,麻烦指教。

posted @ 2013-01-07 23:24 RTY 阅读(663) | 评论 (0)编辑 收藏