当前位置:  编程技术>移动开发
本页文章导读:
    ▪2013.10.30(二)——— git学习之取得仓库        2013.10.30(2)——— git学习之取得仓库 2013.10.30(2)——— git学习之取得仓库获取git仓库的方法有两个:1、自己创建比如说我有一个文件夹 git_workspace,里面有几个文件1.cpp 2.cpp 3.cpp reame 文件.........
    ▪ objective-c中的本地化操作(序列化,存档)(十二)        objective-c中的本地化操作(序列化,归档)(十二) holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7371643   先介绍一个.........
    ▪ 怎么配置官方peerDroid,使其运行起来       如何配置官方peerDroid,使其运行起来一.Peer Droid是JXME协议到android平台的移植,开发者可以利用它来实现android设备以及传统PC机通讯的应用程序,peerDroid的官方demo主要是实现PC端peer和android端.........

[1]2013.10.30(二)——— git学习之取得仓库
    来源: 互联网  发布时间: 2014-02-18
2013.10.30(2)——— git学习之取得仓库
2013.10.30(2)——— git学习之取得仓库

获取git仓库的方法有两个:

1、自己创建
比如说我有一个文件夹 git_workspace,里面有几个文件
1.cpp
2.cpp
3.cpp
reame


文件内容先随便写

cd git_workspace
git init


在当前目录下创建了一个仓库,在当前目录下有一个.git的文件

git add *.cpp
git add readme
git commit -m "init"


这样 我们就得到了 有如干文件的git仓库


2、克隆已存在的仓库
$ git clone git://github.com/schacon/grit.git

这会在当前目录下创建一个名为“grit” 的目录,其中内含一个.git 的目录,并从同步后的仓库中拉出所有的数据,取出最新版本的文件拷贝
$ git clone git://github.com/schacon/grit.git mygrit

唯一的差别就是,现在新建的目录成了mygrit,其他的都和上边的一样

git clone 和svn里面的checkout的区别是:
Git 收取的是项目历史的所有数据,每一个文件的每一个版本
svn是服务器上最新的数据




    
[2] objective-c中的本地化操作(序列化,存档)(十二)
    来源: 互联网  发布时间: 2014-02-18
objective-c中的本地化操作(序列化,归档)(十二)

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7371643

 

先介绍一个自定义类描述的方法description,一般情况下,一个自定义类我们在用%@输出的时候,给出的是一个内存地址,我们在该类的.m文件里重写description方法,来修改输出内容,呆会儿我们要用到这个方法来验证今天学习内容,所以先看一段代码熟悉一下:

Human.h:

 

[plain] view plaincopy
 
  • #import <Foundation/Foundation.h>  
  •   
  • @interface Human : NSObject  
  • {  
  •     int age;  
  •     NSString *name;  
  •     Human *child;  
  • }  
  •   
  • @property int age;  
  • @property (copy)NSString *name;  
  • @property (retain)Human *child;  
  • @end  

  • Human.m:

     

     

    [plain] view plaincopy
     
  • #import "Human.h"  
  •   
  • @implementation Human  
  • @synthesize age;  
  • @synthesize name;  
  • @synthesize child;  
  •   
  • //-(NSString *)description  
  • //{  
  • //    NSString *des = [NSString stringWithFormat:@"%d,%@,%@",age,name,child];  
  • //    return des;  
  • //}  
  •   
  • @end  

  • 上面的重写描述被注释掉了,我们先看未修改前的输出:

     

    main.m:

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • #import "Human.h"  
  •   
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •     @autoreleasepool {  
  •         Human *human1=[[Human alloc]init];  
  •         Human *human2=[[Human alloc]init];  
  •         human1.child=human2;  
  •         human1.name=@"holydancer";  
  •         human1.age=22;  
  •         NSLog(@"%@",human1);  
  •               
  •     }  
  •     return 0;  
  • }  
  •  

     

    2012-03-20 08:47:32.980 category[304:403] <Human: 0x7ff2cb414380>

     

    如果把human.m中的注释去掉的话输出结果如下:

     

    2012-03-20 08:48:09.869 category[315:403] 22,holydancer,0,(null),(null)

     

    很简单吧,这样就可以查看自己定义类的内容了,好了,下面就让我们来研究一下在objective-c中如何实现序列化。

    在OC中,有四类对象是可以直接使用writeToFile方法将内容写入磁盘的,分别是NSString,NSArray,NSDictionary,NSData.看代码:

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • #import "Human.h"  
  •   
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •     @autoreleasepool {  
  •       
  •         NSData *data=[[NSData alloc]init];  
  •         NSString *string=[[NSString alloc]init];  
  •         NSArray *array=[[NSArray alloc]init];  
  •         NSDictionary *dictionary=[[NSDictionary alloc]init];  
  •                   
  •         [data writeToFile:@"/Users/holydancer/Desktop/text1.txt" atomically:YES];  
  •         [string writeToFile:@"/Users/holydancer/Desktop/text2.txt" atomically:YES];  
  •         [array writeToFile:@"/Users/holydancer/Desktop/text3.txt" atomically:YES];  
  •         [dictionary writeToFile:@"/Users/holydancer/Desktop/text4.txt" atomically:YES];  
  •         //atomically参数是指是否将写入文件的内容开启保护机制,如果开启,会在复制时创建临时文件进行复制,以免写入失败破坏原始文件。安全,但是会消耗内存。  
  •         //上面的文件地址,如果不存在的话会自动生成。有的话会覆盖原有文件内容。      
  •     }  
  •     return 0;  
  • }  


  •  


    以上四种是COCOA自带可以写入磁盘文件的类型,但是我们常常用到自定义类,可是里面并没有writeToFile方法,怎么办呢?这时NSData的作用就体现出来了,我们可以把任意自定义类转化成NSData格式即可,这个过程我们称之为编码,或者archive归档,需要将自定义类实现NSCoding协议并重写encodeWithCoder和initWithCoder两个方法,分别用以编码和反编码。然后在编码时会用NSCoder的子类NSKeyedArchiver和NSKeyedUnarchiver分别调用archivedDataWithRootObject和unarchiveObjectWithData来启动自定义类中重写的那两个方法,类似于回调。看代码:

    Human.h:

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  •   
  • @interface Human : NSObject<NSCoding>  
  • {  
  •     int age;  
  •     NSString *name;  
  •     Human *child;  
  • }  
  •   
  • @property int age;  
  • @property (copy)NSString *name;  
  • @property (retain)Human *child;  
  • @end  

  • Human.m:

     

     

    [plain] view plaincopy
     
  • #import "Human.h"  
  •   
  • @implementation Human  
  • @synthesize age;  
  • @synthesize name;  
  • @synthesize child;  
  •   
  • -(NSString *)description  
  • {  
  •     NSString *des = [NSString stringWithFormat:@"%d,%@,%@",age,name,child];  
  •     return des;  
  • }  
  • -(void)encodeWithCoder:(NSCoder *)aCoder//要一一对应  
  • {  
  •     [aCoder encodeInt:age forKey:@"age"];  
  •     [aCoder encodeObject:name forKey:@"name"];  
  •     [aCoder encodeObject:child forKey:@"child"];  
  • }  
  • -(id)initWithCoder:(NSCoder *)aDecoder//和上面对应  
  • {  
  •     if (self=[super init]) {  
  •         self.age=[aDecoder decodeIntForKey:@"age"];  
  •         self.name=[aDecoder decodeObjectForKey:@"name"];  
  •         self.child=[aDecoder decodeObjectForKey:@"child"];  
  •     }  
  •     return self;  
  • }  
  • @end  

  • main.m:

     

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • #import "Human.h"  
  • #import <Foundation/NSKeyedArchiver.h>  
  •   
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •     @autoreleasepool {  
  •       
  •         Human *human1=[[Human alloc]init];  
  •         Human *human2=[[Human alloc]init];  
  •         human1.age=20;  
  •         human1.name=@"holydancer";  
  •         human1.child=human2;  
  •         //定义好自定义对象后使用NSCoding的子类调用archivedDataWithRootObject方法进行archive  
  •         NSData *data1=[NSKeyedArchiver archivedDataWithRootObject:human1];  
  •         //转成NSData类型后就可以写入本地磁盘了  
  •         [data1 writeToFile:@"/Users/holydancer/Desktop/tmp.txt" atomically:YES];  
  •         //倒过来的话先读取磁盘文件  
  •         NSData *data2=[NSData dataWithContentsOfFile:@"/Users/holydancer/Desktop/tmp.txt"];  
  •         Human *human3=[NSKeyedUnarchiver unarchiveObjectWithData:data2];  
  •         NSLog(@"%@,%@",human1,human3);  
  •     }  
  •     return 0;  
  • }  
  •  

     

    2012-03-20 10:10:29.871 category[458:403] 

    20,holydancer,0,(null),(null)

    20,holydancer,0,(null),(null)

    有的同学一直不太清楚NSKeyedArchiver和NSKeyedUnarchiver是什么,调用的又是什么方法,大家可以在头文件里找到这样的信息:

    可以发现,NSKeyedArchiver是NSCoder的子类,而archivedDataWithRootObject是里面的一个类方法,这时我们看到archivedDataWithRootObject方法下在还有一个方法,不错,这个方法可以直接将自定义类写入本地磁盘,所以上在的代码我们还可以这样写:

     

    [plain] view plaincopy
     
  • #import <Foundation/Foundation.h>  
  • #import "Human.h"  
  • #import <Foundation/NSKeyedArchiver.h>  
  •   
  • int main(int argc, const char * argv[])  
  • {  
  •   
  •     @autoreleasepool {  
  •       
  •         Human *human1=[[Human alloc]init];  
  •         Human *human2=[[Human alloc]init];  
  •         human1.age=20;  
  •         human1.name=@"holydancer";  
  •         human1.child=human2;  
  •         [NSKeyedArchiver archiveRootObject:human1 toFile:@"/Users/holydancer/Desktop/tmp.txt"];//直接写入磁盘  
  •         Human *human3=[NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/holydancer/Desktop/tmp.txt"];//从磁盘直接读取为id类型  
  •         NSLog(@"\n%@\n%@",human1,human3);  
  •     }  
  •     return 0;  
  • }  


  •  

    2012-03-20 10:16:43.561 category[475:403] 

    20,holydancer,0,(null),(null)

    20,holydancer,0,(null),(null)

    最后,不得不说说cocoa中的方法命名,一个一个方法长得,虽然很人性化很好记,不过敲起来真是麻烦啊。

     

    关键字:objective-c ,objective c , oc ,本地化,序列化,归档,archive ,NSCoder ,NSCoding , NSKeyedArchiver ,NSKeyedUnarchiver


        
    [3] 怎么配置官方peerDroid,使其运行起来
        来源: 互联网  发布时间: 2014-02-18
    如何配置官方peerDroid,使其运行起来

    一.Peer Droid是JXME协议到android平台的移植,开发者可以利用它来实现android设备以及传统PC机通讯的应用程序,peerDroid的官方demo主要是实现PC端peer和android端peer聊天的功能,那么如何配置服务器等使peerDroid的官方demo运行起来,进行通信?(官网网址:http://code.google.com/p/peerdroid/)

     

        硬件环境:PC和Android设备

        软件环境:服务器(这里用的tomcat),eclipse

         运行环境:能访问到rdvlist.txt的服务器(tomcat上布置可以访问到rdvlist.txt文件),pc端收集相应peer消息或者传递消息的RDV节点程序(PeerDroidRDV.zip),一个或者两个android端peer程序(PeerDroidSample_09_12_2009.tar.gz),pc端peer程序(JXTA-PeerDroidSample_09_12_2009.tar.gz),一共要运行四个程序。

         材料下载:http://code.google.com/p/peerdroid/downloads/list

     

       相应的配置(我这里将服务器和rdv配置在了一台电脑上):

    1.  首先配置服务器,想要进入P2P网络中的peers需要知道RDV的ip,因此必须有一个简单的txt文件记录下一个或者更多的rdv的信息,在官网程序中,这个文件叫做rdvlist.txt文件,rdvlist.txt里面的主要内容是:

    tcp://160.78.28.131:9701 
    http://160.78.28.131:9700

    其中160.78.28.131是rdv的ip地址,如果这个网络是在局域网内peer之间通信,则rdv的ip可以是私有的,静态的,如果是在广域网内通信,则需要一个公网ip,其中9700和9701是peerDroid中默认的端口,记住端口不要修改,这里只需要修改ip即可,比如如果你的rdv的ip地址是10.50.147.10,则rdvlist.txt里的内容应该是

    tcp://10.50.147.10:9701

    http://10.50.147.10:9700

      这里开始配置服务器,使得浏览器中可以访问到这个文件,如果开发者知道如何配置,可以跳过此处。比如,开发者将rdvlist.txt存在F盘的根目录下,在tomcat的conf目录下找到server.xml文件

    (比如:D:\ProgramFiles\apache-tomcat-6.0.35\conf),在<Host></Host>里面加上<Context path=""

             docBase="F:\"

             reloadable="true"

                   cookies="false">

                  </Context>

    其中docBase="F:\"是rdvlist.txt的存放路径,可参考下图修改:

     

    配置好了后,保存server.xml文件,启动服务器,在浏览器中输入网址:http://localhost:8080/rdvlist.txt或者http://10.50.147.10:8080/rdvlist.txt,如果可以看到这个文件的内容,则服务器配置成功

     

     

    2.RDV配置,RDV是一个java的程序,官网上对应的下载代码是PeerDroidRDV.zip,这个可以直接导入到eclipse中运行,不需要任何修改,运行RDV的ip地址即是rdvlist中的ip地址

    3.  android端的peer和PC端的peer,需要分别将(PeerDroidSample_09_12_2009.tar.gz)和(JXTA-PeerDroidSample_09_12_2009.tar.gz)程序中类JXTAService的变量rdvlist修改为可以访问到rdvlist.txt的地址:

    private staticString rdvlist = "http://10.50.147.10:8080/rdvlist.txt";

     

         到这里,配置基本结束了,如果没有公网ip,则要保证所有的设备都连接的是同一个局域网,可先启动服务器,运行rdv程序,pc端peer程序,android端peer程序,保证都连接上了,即可进行群组聊天了



        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3