首页 文章 精选 留言 我的

精选列表

搜索[知识管理],共10010篇文章
优秀的个人博客,低调大师

iOS:XMPP即时聊天知识

XMPP即时聊天框架:XMPPFramework XMPP The Extensible Messaging and Presence Protocol(可扩展通讯和表示协议)。 基于XML XMPP是一个典型的C/S架构,而不是像大多数即时通讯软件一样,使用P2P客户端到客户端的架构 服务器:OpenFire 测试客户端:spark iOS开发框架:XMPPFramework XMPP的地址叫做JabberID(简写为JID),它用来标示XMPP网络中的各个XMPP实体。 JID由三部分组成:domain,node identifier和resource。JID中domain是必不可少的部分。注意:domain和user部分是不分大小写的,但是resource区分大小写。 jid= [ node "@" ] domain [ "/" resource ] domain:通常指网络中的网关或者服务器。 node identifier:通常表示一个向服务器或网关请求和使用网络服务的实体(比如一个客户端),当然它也能够表示其他的实体(比如在多用户聊天系统中的一个房间)。 resource:通常表示一个特定的会话(与某个设备),连接(与某个地址),或者一个附属于某个节点ID实体相关实体的对象(比如多用户聊天室中的一个参加者)。 JID种类有: bare JID:user@domain.tld full JID:user@domain.tld/resource XMPP通信原语有3种:message、presence和iq。 message是一种基本推送消息方法,它不要求响应。主要用于IM、groupChat、alert和notification之类的应用中 presence用来表明用户的状态 (Info / Query)一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行响应 共同属性: to属性:标识消息的接收方。 from属性:指发送方的名字或标示 type属性 实现功能: 登录、注册 个人状态通知 联系人列表(花名册) 添加、删除好友 收发消息 消息存储 修改个人资料 程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式! 本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/5007873.html ,如需转载请自行联系原作者

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

苹果开发基础知识

App ID(应用ID) App ID是识别不同应用程序的唯一标示符。每个app都需要一个App ID或者app标识。 目前有两种类型的App标识:一个是精确的App ID(explicit App ID),一个是通配符App ID(wildcard App ID)。 使用通配符的App ID可以用来构建和安装多个程序。尽管通配符App ID非常方便,但是一个精确的App ID也是需要的, 尤其是当App使用iCloud 或者使用其他iOS功能的时候,比如Game Center、Push Notifications或者IAP。 如果你不确定什么样的App ID适合你的项目,我推荐你读下苹果关于这一主题的文档:Technical Note QA1713。 Distribution Certificate(发布证书) iOS应用都有一个安全证书用于验证开发者身份和签名。为了可以向App Store提交app,你需要创建一个iOS provisioning profile 。 首先需要创建一个distribution certificate(发布证书),过程类似于创建一个development certificate(开发证书)。 如果你已经在实体设备上测试你的App,那么你对创建development certificate就已经很熟悉了。 如果对此不熟悉,我建议你读下苹果关于signing certificates和provisioning profiles的详细指导。 Provisioning Profile(配置文件) 一旦你创建了App ID和distribution certificate,你可以创建一个iOS provisioning profile以方便在App Store中销售你的App。 不过,你不能使用和ad hoc distribution相同的provisioning profile。 你需要为App Store分销创建一个单独的provisioning profile,如果你使用通配符App ID,那么你的多个app就可以使用相同的provisioning profile。 Build Settings(生成设置) 配置App ID、distribution certificate 和provisioning profile已经完成,是时候配置Xcode中target的build settings了。 在Xcode Project Navigator的targets列表中选择一个target,打开顶部的Build Settings选项,然后更新一下Code Signing来跟之前创建的distribution provisioning profile相匹配。 最近添加的provisioning profiles有时候不会立马就在build settings的Code Signing中看到,重启一下Xcode就可以解决这个问题。 Deployment Target(部署目标) 非常有必要说下deployment target,Xcode中每个target都有一个deployment target,它可以指出app可以运行的最小版本。 不过,一旦应用在App Store中生效,再去修改deployment target,你要考虑到一定后果。 如果你在更新app的时候提高了deployment target,但是已经购买应用的用户并没有遇到新的deployment target,那么应用就不能在用户的移动设备上运行。 如果用户通过iTunes (不是设备)下载了一个更新过的app,然后替代了设备上原先的版本,最后却发现新版本不能在设备上运行,这确实是个问题。 证书主要分为两类 Development和Production, Development证书用来开发和调试应用程序, Production主要用来分发应用程序(根据证书种类有不同作用),下面是证书的分类信息:(括号内为证书有效期) Development App Development (1年):用来开发和真机调试应用程序。 Push Development (1年):用来调试Apple Push Notification Production In-House and Ad Hoc (3年):用来发布In-House和AdHoc的应用程序。 App Store :用来发布提交App Store的应用程序。 MDM CSR Push Production (1年):用来在发布版本中使用Apple Push Notification。 Pass Type ID Certificate:用于通行证类证书 Website Push ID Certificate 有一些类型的证书我没有使用过,所以也不了解具体的作用。 证书 1)Developer Certification(开发证书) 2)Distribution Certification(发布证书) 授权文件 1)Developer Provisioning Profile(开发授权文件) 2)Distribution Provisioning Profile(发布授权文件)

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

swift基础知识

//1.if语句以及强制解析 //可以使用if语句和nil比较来判断一个可选值是否包含值,可以使用“==”,'!= ' 来执行比较 //如果可选类型有值,它将不等于nil var num:Int? = 3 if num != nil { print("值不为空") } //感叹号 ! //当你判断一个可选类型确实包含值之后,你可以在可选的名字后面加上感叹号(!)来获取值,这个感叹号表示“我知道这个可选类型有值,请使用它”。这个被称为可选值的强制解析。 //注意:使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。 //2.可选绑定 //使用可选绑定来判断可选类型是否包含值,如果包含,就把值赋值给一个临时常量或者变量。可选绑定可以用在if和while语句中,这条语句不仅可以用来判断可选类型是否有值,同时把可选类型的值赋给常量或者变量。 let empty:String? = nil if let constName = num { print(constName) } if let em = empty { print("aaaaaa") }else{ print("判断为假") } if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 { print("\(firstNumber) < \(secondNumber) < 100") } // 输出 "4 < 42 < 100" if let firstNumber = Int("4") { if let secondNumber = Int("42") { if firstNumber < secondNumber && secondNumber < 100 { print("\(firstNumber) < \(secondNumber) < 100") } } } // 输出 "4 < 42 < 100" //注意:在if条件语句中使用常量和变量来创建一个可选绑定,仅在if语句的句中(body)中才可以获取可选绑定的值。 //相反,在guard语句中使用常量和变量来创建一个可选绑定,仅在guard语句外且在语句后才能获取到值。 //3.隐式解析可选类型 /* 如上所述,可选类型暗示了常量或者变量可以“没有值”。可选可以通过 if 语句来判断是否有值,如果有值的话可以通过可选绑定来解析值。 有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。 这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号(String?)改成感叹号(String!)来声明一个隐式解析可选类型。 当可选类型被第一次赋值之后就可以确定之后一直有值的时候,隐式解析可选类型非常有用。隐式解析可选类型主要被用在 Swift 中类的构造过程中 */ let possibleString :String? = "An optional string" let forcedString :String = possibleString! //需要感叹号来获取值,没有感叹号会报错 let assumeString :String! = "一个隐式解析可选值" let implicitString :String = assumeString //不需要感叹号 //你可以把隐式解析可选类型当做一个可以自动解析的可选类型。你要做的只是声明的时候把感叹号放到类型的结尾,而不是每次取值的可选名字的结尾。 //注意: //如果你在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误。和你在没有值的普通可选类型后面加一个惊叹号一样。 //4.错误处理 //可以使用 错误处理来应对程序执行中可能遇到的错误条件。

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

swift基础知识

import UIKit var str = "Hello, playground" //1.变量,常量 let max = 10 var current = 0 if current < max { print(current) } var x = 0,y = 0.0 //2.类型标注 var message:String message = "Hello" //常量和变量的命名可以使任何喜欢的字符,但是,不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符,也不能以数字开头 let pai = 3.14 let 你好 = "中国🇨🇳" let = "" let ww2 = "heihei" let bool = false //3.分号 //并不强求在每一行的末尾添加分号,也可以根据自己习惯添加,但是有一种情况必须添加,你打算在同一行添加多条独立语句的时候,必须用分号隔开 let first = 0; var second = "haahhaah";print(first,second) //4.整数:没有小数部分的数字,包括有符号整数(正,负,零)和无符号整数(正,零) //swift提供 8,16,32,64位有符号和无符号整数类型 //整数范围:可以访问不同类型整数的最大值和最小值 let minValue = UInt8.min let maxValue = UInt8.max //(2的8次方) let min16 = UInt16.min let max16 = UInt16.max //(2的16次方) //Int //一般情况下,不需要专门指定整数长度,Int的长度与当前平台的原生字长相同 let minInt = Int.min //(本机最小字长,64位) let maxInt = Int.max //数值型字面量 //十进制:没有前缀 //二进制:0b //八进制:0o //十六进制:0x //如果一个十进制数的指数为 exp,那这个数相当于基数和10^exp的乘积: print(1.25e2)//1.25*10^2 print(1.25e-2)//1.25*10^-2 //如果一个十六进制数的指数为exp,那这个数相当于基数和2^exp的乘积: print(0xFp2) //15*2^2 print(0xFp-2) //15*2^-2 相当于15*1/4 //整数类型转换,其他类型转换类似 let twoThousand:UInt16 = 2_000 let one:UInt8 = 1 let sum = twoThousand + UInt16(one) //5.类型别名,typealias //给现有类型起一个别的名字,当你想要给现有类型起一个更有意义的名字时,类型别名非常有用。 typealias AudioSample = UInt16 var maxAudioS = AudioSample.max //6.BOOL 布尔值 true false let yes = true let no = false //Bool类型和整型不可以转换,非零即真在swift中是不适用的 //7.元组 //元组把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是相同类型 let httpError = (404,"Not Found") //httpError的类型是(Int,String),值是(404,"Not Found") //可以将元组内容分解成单独的常量和变量,然后就可以使用它们了 let (statusCode,statusMessage) = httpError print("错误码:(statusCode),错误信息:(statusMessage)") //如果你只需要一部分的元组值,分解的时候可以把要忽略的部分用(_)标记 let (justCode,_) = httpError print("错误 \(justCode)") //可以通过下标访问元组中的元素,下标从0开始 print(httpError.0) print(httpError.1) //定义元组的时候给单个元素命名,命名后可以通过名字访问元组元素的值 let httpOK = (code:200,desc:"OK") print(httpOK.code) print(httpOK.desc) //作为函数返回值的时候,元组是非常有用的 //8.可选类型 optionals //使用可选类型来处理值可能缺失的情况,可选类型表示: //1》有值,等于x //2》没有值 //例如:String转Int,有可能成功,也有可能失败 let possibleNum = "123" let possibleStr = "Hello" let converNum = Int(possibleNum) let converStr = Int(possibleStr) print(possibleNum) print(possibleStr) var cc = converNum! + 1 //var dd = converStr! + 1 //报错 //上面的转换还可以这么写 let conver:Int? = Int(possibleNum) let conver2:Int? = Int(possibleStr) var ee = converNum! + 1 //var ff = converStr! + 1 报错 //你可以给一个可选变量赋值为nil表示它没有值 var serverResCode:Int? = 404 serverResCode = nil //现在serverResCode不包含值 //注意:nil不能用于非可选的变量或者常量 //如果你声明一个可选的常量或者变量但是没有赋值,它们会自动设置成nil var surverAnswer:String? //注意:Swift的nil和OC的nil的意义是不一样的,OC中的nil是指向不存在对象的指针。在Swift中,nil不是指针,它是一个确定的值,表示值缺失。任何类型的值缺失都可以被设置成nil,而不只是对象类型。

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

Swift入门基础知识

var //代表变量,变量的值可以改变 let//代表常量类型不可改变 //声明常量heh类型Swift会自动根据你的值来自动判断该变量的类型也可以指定类型(个人感觉还是指定类型的比较好,可能会减少系统的开销),值为10 //自动判断变量的类型 let heh = 10//假如在下面的代码中没有用到该变量Swift就会提示将let改为下划线,因为下划线代表忽略该变量,就相当于OC中提示并没有用该属性或者变量一样,估计没用到的变量一般人也不会写,只是给刚入门的说一下并不是你写错了或者Xcode有问题,只是Swift提示很细 //声明指定变量的类型 let heh:Double = 10.000 //声明变量hehe类型Swift会自动根据你的值来自动判断该变量的类型也可以指定类型(个人感觉还是指定类型的比较好),值为10 var heh:Double = 10//假如声明的变量没有改变的话Swift也会提示将其改为let //修改变量的值 heh = 12 //输出打印信息 print(heh) Swift还可以用中文当作变量的名字,因为Swift支持unicode编码,所以变量名可以是中文甚至是表情(感觉中文还是好一点,和java一样代码的风格也都和java一样) 比如: var 测试:Double = 10 测试 = 12 print(测试) 而且Swift的字符串不用带@,直接""就可以了 //遍历字符串 let zifu:String="abcdefghijk" for zf in zifu.characters { print(zf) } 或者也可以这样直接将字符串进行遍历(因为Swift会自动把字符串判断成String类型) for zf in "abcdefghijk".characters { print(zf) } //合并字符串(表示和java基本上就是一样啊)直接用加号就可以了字符串a,b。合成字符串c就是c=a+b let zifu:String="abcdefghijk" let zf2="xyz" let zf3 = zifu+zf2 print(zf3) print(zifu+zf2) //转义输出就是5*10=50 let a = 5 let b = 10 let js = "\(a)*\(b)=\(a*b)" print(js) //数组数组元素必须统一这个就不说了 let names = ["赵","钱","孙","李","周","吴","正","王"] print(names) //字典假如键所对应的值类型都是一样就照着下面写就可以 let zidian = ["a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9,"j":10,"k":11] print(zidian) 假如值的类型有很多种那么Swift就会提示变成下面这种 let zd = ["jian":"zhi","hehe":5,"sds":8,"sdffd":43,"fdss":"dsdds","dasa":"dsdsd","cdsd":454] as [String : Any] 一看就知道了,后面语句的意思就是键是String类型的,而值为任意类型的 //循环(基本上其他语言有的这里都有) for zf in "abcdefghijk".characters { print(zf) } //1...5代表遍历1到5包括1和5(三个点代表全闭区间) for number in 1...5 { print(number) } //1..5代表遍历1到5包括1但不包括5(两个点代表半开半闭区间不包含右边的区尾) fornumberin1..5{ print(number) } //遍历字典,可以一下就把键和值都遍历出来 let zd = ["jian":"zhi","hehe":5,"sds":8,"sdffd":43,"fdss":"dsdds","dasa":"dsdsd","cdsd":454] as [String : Any] for (j,z) in zd { print("键=\(j),值=\(z)") } //数组操作 //数组数组元素必须统一这个就不说了 var names = ["赵","钱","孙","李","周","吴","正","王"] //显示元素 print(names[0]) //增加元素 names.append("冯") //修改元素 names[0]="陈" //把第三个元素到第五个元素替换掉 names[3...5]=["楚","魏"] //字典 //定义一个可变字典 var zidian = ["a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9,"j":10,"k":11] //修改字典某个键的值 zidian["a"]=8 //方法,Swift中的方法是这样的 //参数和返回值都为空的一个方法 func kong() { print("空") } //带参数的方法,但是没有返回值 func hello(hehe:String) { print("\(hehe)") } //带参数并且有返回值 func fanhuizhi(name:String) -> String { return name } //多参数多返回值 func duofanhuizhi() -> (Int,String) { return(200,"haha") } //多参数多返回值第二种类型 func duofanhuizhi2() -> (code:Int,name:String) { return(200,"haha") }

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

mapreduce知识点记录

selfMapper extends Mapper< LongWritable, Text, Text, IntWritable> 其中LongWritable是某一行起始位置相对于文件起始位置的偏移量 FileSplit 继承extends InputSplit FileSplit fileSplit=(FileSplit) context.getInputSplit(); Stringpathname=fileSplit.getPath().getName();//获取目录名字 intdepth=fileSplit.getPath().depth();//获取目录深度 Classclass1=fileSplit.getClass();//获取当前类 longlength=fileSplit.getLength();//获取文件长度 SplitLocationInfo[]locationInfo=fileSplit.getLocationInfo();//获取位置信息 String[]locations=fileSplit.getLocations();//获取位置 longstart=fileSplit.getStart();//Thepositionofthefirstbyteinthefiletoprocess. 多文件输入与输出 1.多文件输入 FileInputFormat.setInputPaths() 方法:static void setInputPaths(Job job, Path... inputPaths)、 static void setInputPaths(Job job, String commaSeparatedPaths) 2.多文件输出(MultipleOutputs) public static class AlphabetOutputFormat extends MultipleOutputFormat { @Override protected String generateFileNameForKeyValue(Text key, IntWritable value, Configuration conf) { charc = key.toString().toLowerCase().charAt(0); if(c >='a'&& c <='z') { returnc +".txt"; } return"other.txt"; } } Combiner 作为map和reduce的中间环节,它的作用是聚合map task的磁盘,减少map端磁盘写入,减少reduce端处理的数据量,对于有大量shuffle的job来说,性能往往取决于reduce端。因为reduce 端要经过从map端copy数据、reduce端归并排序,最后才是执行reduce方法,此时如果可以减少map task输出将对整个job带来非常大的影响。 什么时候可以使用Combiner? 比如你的Job是WordCount,那么完全可以通过Combiner对map 函数输出数据先进行聚合,然后再将Combiner输出的结果发送到reduce端。 什么时候不能使用Combiner? WordCount在reduce端做的是加法,如果我们reduce需求是计算一大堆数字的平均数,则要求reduce获取到全部的数字进行计算,才可以得到正确值。此时,是不能使用Combiner的,因为会其会影响最终结果。 注意事项:即使设置Combiner,它也不一定被执行(受参数min.num.spills.for.combine影响),所以使用Combiner的场景应保证即使没有Combiner,我们的MapReduce也能正常运行。 shuffle与排序 Mapreduce的map结束后,把数据重新组织,作为reduce阶段的输入,该过程称 之为shuffle---洗牌。 而数据在Map与Reduce端都会做排序。 Map •Map 的输出是由collector控制的 •我们从collect函数入手 Reduce •reduce的Shuffle过程,分成三个阶段:复制Map输出、排序合并、reduce处理。 •主要代码在reduce的 run函数 JVM重用 启动JVM是一个比较耗时的工作,所以在MapReduce中有JVM重用的机制。 •条件是统一个作业的任务。 •可以通过mapred.job.reuse.jvm.num.tasks定义重用次数,如果属性是-1那么为无限制 StringTokenizer 1、构造函数。 1.StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。 2.StringTokenizer(String str, String delim):构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符。 3.StringTokenizer(String str, String delim, boolean returnDelims):构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。 2、方法。 说明: 1. 所有方法均为public; 2. 书写格式:[修饰符] <返回类型> <方法名([参数列表])> 如: static int parseInt(String s) 表示:此方法(parseInt)为类方法(static),返回类型为(int),方法所需参数为String类型。 1.int countTokens():返回nextToken方法被调用的次数。如果采用构造函数1和2,返回的就是分隔符数量(例2)。 2.boolean hasMoreTokens():返回是否还有分隔符。 3.boolean hasMoreElements():结果同2。 4.String nextToken():返回从当前位置到下一个分隔符的字符串。 5.Object nextElement():结果同4。 6.String nextToken(String delim):与4类似,以指定的分隔符返回结果。 待续。。。。。。。。。。。。。。。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

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部分的功能。

用户登录
用户注册