首页 文章 精选 留言 我的

精选列表

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

搭建网站必不可少的知识8

如何选择主机操作系统?一、请根据网站使用的编程语言来选择合适的操作系统和主机类型:1、网站开发语言为ASP、.NET、HTML,请选择Windows系统虚拟主机免费版及其以上型号主机;2、网站开发语言为PHP、HTML、WAP,请选择Linux系统虚拟主机免费版及其以上型号主机;3、网站开发语言为PERL、CGI,请选择Linux/Windows系统的独享经济版及其以上型号独享虚拟主机。二、如果网站需要使用数据库,请选择合适的操作系统和主机类型:1、数据库为ACCESS、SQL Server ,请选择Windows系统的虚拟主机免费版及其以上型号;2、数据库为MySQL、SQLite ,请选择Linux系统的虚拟主机免费版及其以上型号主机。三、询问开发人员网站的语言和数据库,了解网站估计的流量和所需带宽等情况进行选择。 之前介绍过要在主机上绑定域名,“基础环境设置”-“域名绑定”,如果绑定成功并备案,提升解析成功,就可以访问了。 在“基础环境设置”“默认首页设置”中,我们可以添加网站默认首页并调整访问的优先级,比如我的首页有2个,一个是index.php一个是index.html。我讲index.php调整到顶部,index.html在index.php的下面,这样访问的时候是看到的index.php的首页。设置这里主要是能访问到首页,并且在这个页面不存在的时候可以访问第二个首页,如果全部设置的默认访问首页都不能访问就有了404页面,在下面的“404页面设置”我们可以选择显示的404页面(文件要先上传到主机上哦)。 选择“浏览” 在文件目录中选择我要设置的404显示页面,点击“确定”。 “基础环境设置”中的“301重定向”是指我们在更换域名后或者有多个域名的情况下使其都访问设置的目标的域名。比如我原来的域名是1.com后来更换为2.com,但是老用户不知道呀,就想要301重定向将1.com指向2.com的域名,这样当别人访问1.com的时候都会转到2.com页面上面。图中假设的就是这种新老域名的添加。原域名选择以前的,目标域名就是新域名。之后“添加”即可。安装网站的时候,有的需要支持环境的版本,虽然虚拟主机已经有了环境,但是默认的不是版本最高的,当需要调整版本的时候。在“高级环境设置”“PHP版本设置”中选择适合的版本,点击“保存设置”。 既然有要求版本,网站需要的一些环境参数和函数也是可以调整的,这部分一般默认即可。具体看安装网站时候显示的要求来配置。

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

3.Swift翻译教程系列——Swift基础知识

英语PDF下载链接http://download.csdn.net/detail/tsingheng/7480427 Swift是用来开发iOS和OS X应用的新语言,可是很多地方用起来跟C或者OC是差点儿相同的。 Swift提供了C语言和OC的基本数据类型,比方整型用Int,浮点型用Double或者Float,布尔型用Bool,字符串文本用String。Swift还提供了两种集合类型。Array和Dictionary,后面会介绍。 Swift也跟C一样用唯一的变量名来存储与使用数据,还能使用一些值不会变的变量,应该说是常量,比C里面的常量要强大。在涉及到一些值不会发生变化的数据时使用常量类型能让代码更安全整洁。 除了跟C和OC相似的类型之外,Swift还添加了一些OC中没有的类型。比方元组,使用元组能够创建或者传递多个值。函数返回值使用元组就能够返回多个值了。 Swift还添加了可选类型。 可选类型的变量要么有个确切值,要么是没有值。 有点儿像OC里面值为nil的指针。可是OC里面指针仅仅能用于对象,Swift可选类型能用于不论什么数据类型。 可选类型比OC中的nil指针更安全更好用,Swift非常多核心牛逼的特性都要指望他。 可选类型也能说明了Swift是一种类型安全的语言。Swift能让程序猿清楚知道自己使用的是什么类型。 假设代码中须要一个String对象,类型安全机制能够保证Int之类的非String类型对象被传过来。 类型安全机制能让你在写代码的时候就能发现并纠正一些错误。 1.常量和变量 常量跟变量都由名称跟值组成,常量的值一旦设置就不同意再改变。变量就没有这个限制了。仅仅要类型没错就能为所欲为。 常量和变量的声明 常量和变量在使用之前都必须声明。常量用let声明,变量用var声明。这边有个样例用常量和变量来记录用户尝试登录次数。 let maximumNumberOfLoginAttempts = 10 var currentLoginAttempt = 0 这两行代码能够这样翻译:“声明一个叫做maximumNumberOfLoginAttempts的常量,给他赋值为10,然后声明一个叫currentLoginAttempt的变量,给他赋值为0。” 这个样例里面maximumNumberOfLoginAttempts是被声明为常量的,由于最多同意登录尝试次数是固定的。不会变的。 而currentLoginAttempt表示用户当前已经尝试的次数。是随着用户登录尝试要添加的,所以要被定义成变量。 声明变量或者常量的时候也能够一行声明多个。中间用逗号分隔。 比方 var x = 0.0, y = 0.0, z = 0.0 NOTE假设代码里面要用到不会改变的值。尽量都用let声明成常量,仅仅有须要改变的才声明成变量。 类型标注 声明变量或者常量的时候还能够加个类型标注,来限定这个变量或者常量能够存储什么类型的值。写法是在变量名或常量名后面加上冒号空格再加存储类型。举个样例。我要声明一个存储String类型的变量,代码就是 var welcomeMessage: String。冒号的意思是“...类型为...”。所曾经面的代码能够翻译成:“声明一个类型为String的变量welcomeMessage”。“类型为String”意思是说“能够存储不论什么的String值”。 welcomeMessage如今能够被赋值,不会报错了。 welcomeMessage = “Hello” NOTE实际上这个类型标注可能非常少用,假设在声明变量或者常量的时候就给他个初始值,编译器就能自己判断出来变量或者常量的类型是什么了。这个在后面类型安全与类型判断里面会江到。上面这个样例中welcomeMessage没有初始值。所以编译器没有办法判断出来他是什么类型,也就须要用类型标注来指明变量类型了。 变量或常量命名 Swift变量常量命名非常自由,甚至能够用中文或者表情字符来命名。 let π = 3.14159 let 你好 = "你好中国" let 狗狗表情 = "dogcow" 可是名称里面不能包括数学符号,大于小于号。或者保留的(或者非法的)Unicode编码位。或者连接线与制表符。也不能用数字打头。可是后面能够用数字。 变量或者常量的名字不能反复声明,类型也不能变。变量跟常量也不能互相转变。 NOTE 假设你想用Swiftkeyword同名的名字,你能够在名字前后加上倒引號(好像是数字1前面那个键)即可了。只是要尽量避免使用keyword。除非说是没的选了(比方说领导要求的)。 变量的值能够改成跟现有值同样类型的值。 var friendlyWelcome = "Hello!" friendlyWelcome = "Bonjour!" // friendlyWelcome is now "Bonjour!" 常量就不一样了,常量值一旦设定就不能改了,假设要给常量再赋值,就会报错了。 let languageName = "Swift" languageName = "Swift++" // this is a compile-time error - languageName cannot be changed 输出常量和变量 能够使用println函数来输出常量或者变量的值。 println(frientlyWelcome) //输出“Bonjour” println是用来输出的全局函数。输出结果最后会自己主动换行。 假设是用Xcode,println函数会把结果输出到Xcode的控制台。(还有另外一个函数print,也是用来输出的,可是print输出的结尾不会自己主动换行。) println函数能够输出不论什么字符串。 println("This is a string") // prints "This is a string" println函数还能用来输出更复杂的日志。跟Cocoa的NSLog函数差点儿相同。 日志能够包括常量也能包括变量。 Swift使用字符串填补的方式在长字符串中使用常量或者变量。 用法是用括号把变量名括起来,前面在加个反斜杠。然后直接放入字符串中。 println("The current value of friendlyWelcome is \(friendlyWelcome)") // prints "The current value of friendlyWelcome is Bonjour!" NOTE 使用字符串填补时的其它全部选项在后面字符串填补里面会有介绍。 2.凝视 使用凝视能够在代码中增加一段不被运行的文字。编译器编译的时候会把全部的凝视都忽略掉。 Swift的凝视跟C的凝视很像,单行凝视用双斜杠打头。比方 // 这是一行凝视 多行凝视用/*开头,*/结尾 /* this is also a comment, but written over multiple lines */ 可是多行凝视有一个跟C不一样的地方,Swift的多行凝视能够嵌套。你能够先写一个/*开头。然后再写个/*作为内层凝视,然后先用*/表示内层凝视结尾。再写个*/表示外层凝视结尾。 /* this is the start of the first multiline comment /* this is the second, nested multiline comment */ this is the end of the first multiline comment */ 能够嵌套的多行凝视能让我们非常方便的凝视掉一大块儿内容,不用事先去看这块儿内容里面是不是已经有多行凝视了。 3.分号 跟很多编程语言不一样。Swift不要求在每一行语句后面加分号。只是你要是想加也能够加。可是假设要在一行写多条语句就必须加分号了。 let cat = "cat"; println(cat) 4.整型 整型数是指没有小数的数字。比方42啊,-23啊之类的。整型要么是有符号的(正数,0,负数)要么是无符号的(正数或者0)。 Swfit的无符号数提供8位。16位,32位以及64位的版本号。这些类型的命名方式跟C是差点儿相同的。 比方8位的无符号整型是UInt8,32位有符号整型是Int32。跟其它类型一样,这些类型首字母都要大写。 整型范围 你能够通过整型类型的min属性和max属性来获取各自的最小值和最大值。 let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8 let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8 使用上面两个属性得到的数值的类型跟使用的类型是一样的,比方上面得到的minValue和maxValue类型都是UInt8,假设要在表达式里面跟其它变量计算或者比較,那其它的变量类型也要是这个类型。 Int 大部分情况下你不须要去指定整型详细是几位的,Swift提供了第二种整型类型,Int,这个类型的长度跟程序执行的机器字长一样。32位平台执行,Int长度就跟Int32一样。64位平台执行,Int长度就跟Int64一样。 除非说你一定要使用特定长度的整型,不然尽量用Int来表示整型。这样能提高代码的一致性和通用性。就算是32位平台,Int存储范围是-2147483648到2147483647,这范围足够大了。 UInt Swift还提供了一种没有符号的整型UInt,跟Int一样长度由程序执行的平台决定。 NOTE 仅仅有当你确实须要使用无符号数的时候採用UInt,不然尽量使用Int,就算你知道要保存的值不会有负数。使用Int能增强代码的一致性和通用性,避免了各种类型数字计算的时候再去类型转换。 5.浮点数 浮点数就是带小数部分的数字。比方3.1415。-273.354。 浮点型能存储的数字范围比整型大得多。而且能够存储比整型数最大值更大的数,和比整型数最小值更小的值。 Swift提供两种带符号的浮点数类型。 Double:占用64位,当要存储的值很很大并且须要很精确的时候用Double。 Float:占32位,当你要用小数可是用不着Double的时候就用Float。 NOTEDouble类型提供至少15位小数的精度。Float的小数精度仅仅有6位。 选哪种类型要依据你要处理的数据的实际情况。 6.类型安全与类型判断 Swift是一种类型安全的语言。类型安全的语言要让你清楚自己使用的变量是什么类型。假设变量是String类型。就不能赋Int值给他哦。 由于Swift是类型安全的,所以编译器在编译代码的时候要进行类型检查,对于不论什么类型匹配不对的地方都会报错。这个特性能让你在开发的时候就发现并纠正非常多错误了。 当你要处理各种各样不同类型的数据的时候,类型检查能帮你避免非常多错误。 可是并非说你必须在声明每个常量或者变量的时候就要指定相应的类型。 假设你不指定。Swift会自己主动判断出相应的类型。类型判断能够让编译器在编译的时候通过你提供的值来自己主动判断出其所相应的数据类型。 由于有了类型判断,Swift里面的类型声明就比C或者OC这种语言里面少的多了。 当你声明常量或者变量的同一时候还提供初始值得时候类型判断就很好用了。通常要在声明变量或者常量的时候给他提供一个字面值。(字面值就好比是个马上数,不须要额外计算的。比方以下样例中的42或者3.14159。 ) 比方假设你把字面值42赋给一个刚声明的常量,可是不指定常量类型,Swift会判断出来这个常量是Int类型的,由于你提供的初始值是Int类型的。 let meaningOfLife = 42 // meaningOfLife is inferred to be of type Int 假设你用浮点数做初始值。而且不指定类型,Swift判断出来的结果就是Double。 let pi = 3.14159 // pi is inferred to be of type Double Swift判断小数类型的时候结果是Double而不会是Float。 假设你在表达式里用整数和小数相加,结果判断出来的是Double。 let anotherPi = 3 + 0.14159 // anotherPi is also inferred to be of type Double 字面值3没有明白表示自己的类型,而表达式中出现了Double类型。所以最后判断出来的类型是Double。 7.数字字面值 整数字面值能够用以下几种方式表示: 十进制数字。没有前缀 二进制数字,0b开头 八进制数字,0o开头 十六进制数字,0x开头 比方以下这几个数字的十进制值都是17 let decimalInteger = 17 let binaryInteger = 0b10001 // 17 in binary notation let octalInteger = 0o21 // 17 in octal notation let hexadecimalInteger = 0x11 // 17 in hexadecimal notation 小数字面值能够是十进制(没有前缀),护着十六进制(0x开头)。小数点两边都必须有数字。浮点数还有第二种指数表示方法,十进制浮点数用大写或小写字母E,十六进制浮点数用大写或小写字母P。 对于十进制来说假设指数是exp,就表示用基数乘以10的exp次方: 1.25e2表示1.25乘以10的2次方。或者125.0 1.25e-2表示1.25乘以10的-2次方,或者0.0125 对于十六进制数来说假设指数是ext,就表示用基数乘以2的exp次方: 0xFp2表示15乘以2的2次方,或者60.0 0xFp-2表示15乘以2的-2次方,或者3.75 以下的几个浮点数字面量都是十进制的12.1875 let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0 数字字面值还能加一些其它的格式让人更easy看懂。整数和浮点数都能在前面加入额外的0,还能加入下划线。 这些格式都不会影响字面量的值。 8.数字类型转换 要存储数字的时候尽量都用Int,即便是你知道要存储的值不会是负数。假设你每次都用默认的整型类型来定义常量和变量,这样你定义的这些变量跟常量的类型就能跟字面值判断出来的类型一样了。代码通用性就非常强。 仅仅有当你必需要用其它类型的整型的时候才去用。比方要在代码上用确切位数来保证性能。或者内存优化或者其它必要的优化。使用指定长度的类型能够帮助你避免一些不小心的值溢出。也能够为数据提供一份隐式的说明。 整型转换 对于整型常量或者变量,不一样的数字类型能存储的数据范围是不同的。Int8类型能存储的范围是-128到127,UInt8能够存储的范围是0到255。赋值的时候假设数据超出这个范围内,编译器会报错。 let cannotBeNegative: UInt8 = -1 // UInt8类型不能存储负数,所以会报错。 UInt8 cannot store negative numbers, and so this will report an error let tooBig: Int8 = Int8.max + 1 // <pre name="code" class="objc">Int8 不能存储超过最大值得数字,所以这里也会报错。 <span style="font-family: Arial, Helvetica, sans-serif;">Int8 cannot store a number larger than its maximum value,</span> // and so this will also report an error 由于各种数字类型能存储的数据范围不同。所以你就必需要依据详细情况来进行类型转换了。 这样能防止隐式转换的错误,还能让代码里的类型转换意图变得清晰。 要转换成其它类型。你须要实例化一个须要转换的类型的实例而且用现有的值给他初始化。拿上面的样例来说。常量twoThousand是UInt6类型,而常量one是UInt8类型,由于类型不一样所以两个常量不能直接相加。以下样例用UInt16(one)来创建一个UInt16类型的实例并用one来初始化。然后用这个值跟twoThousand相加。 let twoThousand: UInt16 = 2_000 let one: UInt8 = 1 let twoThousandAndOne = twoThousand + UInt16(one) 如今加号两边都是UInt16了,所以不会报错了。由于相加的和是UInt16型的,所以常量twoThousandAndOne也是UInt16类型。 类型(值)是调用类型的初始化器并传入一个初始值的默认方式。当然这须要有个前提。就是UInt16有一个接受UInt8參数的初始化器,所以才干用这个方式来用UInt8创建UInt16。 所以这里你不能随便传其它类型的,必须是UInt16提供了对应的初始化器的才行。 拓展现有的初始化器。加入新的类型參数支持(例如说要支持自定义的类型)在后面的扩展部分里会介绍。 整型和浮点型的转换 整型和浮点型之间转换必需要显式转换。 let three = 3 let pointOneFourOneFiveNine = 0.14159 let pi = Double(three) + pointOneFourOneFiveNine // pi=3.14159,所以pi被判断出来时Double类型。pi equals 3.14159, and is inferred to be of type Double 这个样例中常量three的被用来创建另外一个Double类型。这样加号两边的类型才一样。假设不转换,是不能相加的。 反过来也是一样的,Double或者Float类型的值也能够用来初始化一个整型的值。 let integerPi = Int(pi) // integerPi equals 3, and is inferred to be of type Int 用浮点数来初始化整型数的时候小数部分都会被阉割,例如说4.75转换变成4,-3.9转换变成-3。 NOTE数字变量或者常量相加的规则跟数字字面量相加规则是不一样的(还记得前面有个3+0.14159吗)。字面量3能够直接跟字面量0.14159相加,由于字面量本身还没有一个确切的类型,仅仅有当编译器计算和的时候才会去判断字面量的类型。 9.类型别名 类型别名是指使用现有类型的第二种方式。 类型别名使用keywordtypealias来定义。 当你想用更合适的方式来使用现有的类型的时候。类型别名就派上用场了。 例如说你要在外部代码中使用指定长度的数据。 typealias AutioSample = UInt16 仅仅要你定义了类型别名。那其它仅仅要能用原名的地方都能用别名。 var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound is now 0 上面样例AudioSample被定义成是UInt16的别名,所以调用AudioSample.min实际上就是调用UInt16.min。 10.布尔型 Swift有一个主要的布尔类型,叫Bool。布尔值是一种逻辑值,要么是true要么是false。Swift提供了两个布尔的常量值。没错。你猜对了,true和false。 let orangesAreOrange = true let turnipsAreDelicious = false 上面样例中两个常量分别用值true和false来初始化,所以编译器给他们判断出来的类型就是Bool。 跟前面声明的Int和Double变量一样。这里你也不须要特别指明是Bool型。当然须要你在创建的时候用true或者false给他们初始化哦。 类型判断要让常量或者变量在创建的时候用还有一个类型已知的值来初始化,这让Swift的代码非常easy介绍也非常明了。 当你使用if之类的条件推断语句的时候布尔值就显得非常须要了。 if turnipsAreDelicious { println("Mmm, tasty turnips!") } else { println("Eww, turnips are horrible.") } // prints "Eww, turnips are horrible." 条件推断语句在后面流程控制里面会细讲。 Swift的类型安全机制会保证不能再须要Bool值得地方用其它类型的值来取代。以下的样例就会报错。 let i = 1 if i { // this example will not compile, and will report an error } 以下这样写才是对的。 let i = 1 if i == 1 { // this example will compile successfully } i==1的比較结果是Bool类型的,所以另外一种方式能够通过类型安全检測,类似i==1这种比較运算会在后面的基本运算里介绍。 跟其它的类型安全的样例一样。这个也能避免一些偶然的错误,保证代码的意思清晰明了。 11.元组 元组能把好几个值放在一起组成一个复合值。元组里面的值能够是不论什么类型,各个值还不须要类型同样。举个样例。(404, "NotFound")这个元组用来表示一个HTTP状态码。 HTTP状态码是指你向一个HTTPserver请求页面的时候server返回的一个特殊值,假设你请求的页面不存在,server就会返回404 Not Found。 let http404Error = (404, "Not Found") // http404Error is of type (Int, String), and equals (404, "Not Found") (404, "NotFound")这个元组把Int和String结合在一起,返回的HTT状态码有两个值:一个数字,和一段人能看懂的描写叙述。它能够被称为是类型为(Int, String)的元组。 你能够使用不论什么一组类型来创建元组。你想要不论什么不同的类型,都能满足你。没有什么能够阻挠你创建(Int, Int, Int)或者(String, Bool)或者不论什么其它的你想要的元组类型。 你能够把元组的数据解析出来存进常量或者变量。比方以下这样: let (statusCode, statusMessage) = http404Error println("The status code is \(statusCode)") // prints "The status code is 404" println("The status message is \(statusMessage)") // prints "The status message is Not Found" 假设说你不须要某个位置的值,用下划线来替换那个位置的名字就OK了。 let (justTheStatusCode, _) = http404Error println("The status code is \(justTheStatusCode)") // prints "The status code is 404" 或者你也能够用下标来获取元组里面的值。 下标从0開始。 println("The status code is \(http404Error.0)") // prints "The status code is 404" println("The status message is \(http404Error.1)") // prints "The status message is Not Found" 创建元组的时候还能给里面的值命名。比方说let http200Status = (statusCode: 200, description: "OK")。假设这样创建的话。就能用名字来获取对应的值。 println("The status code is \(http200Status.statusCode)") // prints "The status code is 200" println("The status message is \(http200Status.description)") // prints "The status message is OK" 我经验不多,只是我感觉这东西跟JS的对象非常像啊。 元组用来作为函数的返回值的时候特别实用。例如说有个检索页面的函数。返回(Int, String)类型的元组来表示检索页面成功还是失败。通过返回带有两个值的元组,就能比仅仅返回单个值的函数提供很多其它信息。很多其它介绍,请查看多返回值函数。 NOTE 元组对于临时组装一些相关的数据很实用。他不须要你去定义一些复杂的数据结构。 假设你的数据结果不仅仅是临时使用例如说还得存盘。这个时候使用创建一个类或者结果体会更合适。很多其它相关信息请查阅类和结构。 12.可选值 假设说某个值有可能不存在,那你能够使用可选值,可选值表示这里有个值等于多少多少,或者说这里没有值。 NOTEC跟OC里面是不存在可选值的概念的。 OC里面跟可选值最接近的特性就是方法要么返回nil要么返回对象。返回nil表示没有可用的对象。可是这仅仅针对对象有效,对于结构体。基本类型或者枚举类型是不适用的。对于这些类型,OC的方法返回了一个特别的值(比方说NSNotFound)来说明这里没有值。这样的方式要求调用方法的地方知道这里会返回特殊值。而且要记得去推断。Swift的可选值就没有类型的限制,也就不须要额外特殊额常量了。 这边有个样例,Swift的String类型有个方法叫做toInt。用来把字符串的值转换成Int值。 可是。并非全部的字符串都能转换成数字的,“123"能够转换成123可是”hello, china“显然是转不了的。 以下的样例就用toInt方法来吧String转换成Int: let possibleNumber = "123" let convertedNumber = possibleNumber.toInt() // convertedNumber is inferred to be of type "Int?", or "optional Int" 由于toInt方法是有可能转换失败的,所以他返回的是一个可选的Int,而不是Int。可选Int类型用"Int?"表示而不是"Int"。 问号表示这个值是可选的。也就是说变量里面有可能是某个Int值,也有可能什么都没有。(注意这里不可能包括其它比方Bool,或者String类型的值,要么是Int要么什么都没有。) if语句和强行拆箱 你能够使用if语句来验证一个可选值是不是包括有值。假设有值。返回的是true。假设没有值返回的就是false。 假设你确定可选值有值,你能够在变量名后面加个感叹号来取得里面的值。感叹号的意思相当于:”小样儿我知道你带的有钱。交出来哥要用。“这个就是可选值强制拆箱。 if convertedNumber { println("\(possibleNumber) has an integer value of \(convertedNumber!)") } else { println("\(possibleNumber) could not be converted to an integer") } // prints "123 has an integer value of 123" 很多其它if语句的介绍。请參阅控制流。 NOTE假设用感叹号去获取没有值的可选值,会发生执行时错误。一定要当你确定可选值有值的时候才使用感叹号。想想你鼓起勇气打劫了个穷光蛋。一毛钱没捞着还进去了。 可选值绑定 你也能够用可选值绑定来验证可选值里面是不是有值,通过这样的方式能够让可选值暂时存储在一个暂时的常量或者变量里。可选值绑定能够用在if或者while的条件语句中推断可选变量里面是不是有值,而且顺便把值取出来放到常量或者变量里面。 if跟while在控制流里面介绍。一般有点儿基础的应该都能够跳过了。 if中使用可选值绑定是以下这种 if let constantName = someOptional { statements } 那么上上面那个样例就能用可选值绑定来取代强制拆箱了。 if let actualNumber = possibleNumber.toInt() { println("\(possibleNumber) has an integer value of \(actualNumber)") } else { println("\(possibleNumber) could not be converted to an integer") } // prints "123 has an integer value of 123" 代码翻译为:”假设possibleNumber.toInt返回的可选值里面有值。那么定义一个可选常量actualNumber,值就是方法返回的值“。 假设转换成功。常量actualNumber就能在if的大括号中面用了。并且actualNumber已经用转换方法返回的值初始化了,所以就没有必要再用感叹号去获取常量的值了。这个样例中actualNumber仅仅是简单的用来输出转换的结果。 在使用可选值绑定的时候能够用常量也能够用变量。假设你想在if第一个大括号中改动actualNumber的值,就用if var actualNumber取代,然后可选值包括的值就是个变量而不是常量了。 nil 假设你要把一个可选变量变成没有值的状态,给他赋值为ni就能够了。 var serverResponseCode: Int? = 404 // serverResponseCode contains an actual Int value of 404 serverResponseCode = nil // serverResponseCode now contains no value NOTE nil不能用来给非可选变量或者常量赋值,假设某个变量或者常量有可能会没有值,一定要给他声明成相应的可选类型。 记住是问号哦。 假设你定义一个可选常量或者变量的时候没有提供默认值,那他的值会被自己主动设为nil。 var surveyAnswer: String? // surveyAnswer is automatically set to nil NOTE Swift的nil跟OC里面的nil不太一样。在OC里面nil是一个不指向不论什么对象的指针,而在Swift里面nil不是指针,并且说这个地方没有值。不论什么类型都能用nil,而不不过对象类型。 隐式拆箱可选值 上面说的,可选值是说能够没有值的常量或者变量。 可选值能够用if语句来检測是不是有值,也能够用可选绑定来拆箱而且获取当中的值。 有时候有的可选值里面非常明显总是会有值的。在这样的情况下就没有必要每次使用的时候都去检查来拆箱获取值,由于我确定他总是会有值得。这样的可选值被称为隐式拆箱可选值。 定义这样的类型要在类型后面加感叹号,而不是问号。 当某个可选值被定义的时候就被赋值,并且以后都能确定他总是会有值。这个时候隐式拆箱可选值就能够使用。最開始使用隐式拆箱可选值的地方时在类初始化的地方。很多其它内容在无引用和隐式拆箱可选值属性里面介绍。 隐式拆箱可选值也就是一种可选值,可是还能像非可选值一样来使用。而不想要每次使用的时候都去拆箱。以下举个样例说明可选字符串与隐式拆箱可选字符串的差别。 let possibleString: String? = "An optional string." println(possibleString!) // requires an exclamation mark to access its value // prints "An optional string." let assumedString: String! = "An implicitly unwrapped optional string." println(assumedString) // no exclamation mark is needed to access its value // prints "An implicitly unwrapped optional string." 你能够觉得隐式拆箱可选值是一种拥有自己主动拆箱权限的可选值。声明可选变量的时候类型后面加感叹号就是隐式拆箱可选变量,就不用每次使用的时候都在变量名后面加感叹号了。 NOTE假设你试图訪问一个没有值的隐式拆箱可选变量,会产生执行时错误,就像你在一个没有值得可选变量后面加个感叹号一样。 你还能够像使用普通可选值一样使用隐式产想可选值。比方说用If推断其是否有值 if assumedString { println(assumedString) } // prints "An implicitly unwrapped optional string." NOTE 假设说可选值以后有可能会变成nil,就不要使用隐式拆箱可选。 假设变量生命周期内有可能须要检測是否为nil就使用普通的可选。 13.断言(Assetions) 可选类型能够让你检測值是否存在,然后处理值不存在的情况。可是在有些情况下,假设值不存在就没办法进行,或者有值可是这个值不符合条件。这样的情况下你能够触发断言来结束运行,从而能够调试为什么值不存在。 使用断言调试 断言是指在运行期间检測一个逻辑值是否为true。也就是说断言断定那个条件是true。你能够使用断言来保证程序运行的时候仅仅有当满足了某个条件的时候才继续往下运行。假设条件表达式计算结果为true,程序照常运行,假设结果为false,就不再运行了,应用也就退出了。 假设你在调试环境中执行代码而且触发了断言,那你能够清楚的看到哪里的条件没通过,而且能够查看当断言触发的时候应用时什么状态。断言还能够接受你提供的一些调试信息。通过调用全局函数assert来使用断言。第一个參数须要是范围true或者false的表达式,第二个參数的信息能够在表达式返回false的时候输出。 let age = -3 assert(age >= 0, "A person's age cannot be less than zero") // this causes the assertion to trigger, because age is not >= 0 上面样例假设age>=0返回true的话代码还会继续运行,也就是说age是非负数的时候。假设age是负数,age>=0就是false了,这个时候断言就触发了,应用终止。 注意第二个參数不能使用字符串填补。只是第二个參数能够省略,比方asset(age >= 0) 什么时候要用断言 假设说某个地方你一定须要满足什么条件才干继续运行的时候就能够用断言。当中包含下面场景: 在使用下标语法的时候数字下标的值不能太大也不能太小。 调用函数的时候假设传递非法參数函数就不能完毕任务。 有个可选值当时是nil,可是后面代码的运行须要他有值。 NOTE 当某些条件达不到的时候断言会让应用终止,让应用程序终止肯定不是最好的方式。可是在开发阶段还是保证那些条件被注意到的有效的方式。 要做到这一点,该产品没有被释放。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4665257.html,如需转载请自行联系原作者

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

docker基础知识之挂载本地目录的方法

Docker可以支持把一个宿主机上的目录挂载到镜像里。docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。现在镜像内就可以共享宿主机里的文件了。默认挂载的路径权限为读写。如果指定为只读可以用:rodocker run -it -v /home/dock/Downloads:/usr/Downloads:roubuntu64 /bin/bashdocker还提供了一种高级的用法。叫数据卷。数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。看示例:docker run -v /home/dock/Downloads:/usr/Downloads --name dataVol ubuntu64 /bin/bash创建一个普通的容器。用--name给他指定了一个名(不指定的话会生成一个随机的名子)。再创建一个新的容器,来使用这个数据卷。docker run -it--volumes-fromdataVol ubuntu64 /bin/bash--volumes-from用来指定要从哪个数据卷来挂载数据。如何在Docker容器内外互相拷贝数据?从容器内拷贝文件到主机上docker cp <containerId>:/file/path/within/container /host/path/target 从主机上拷贝文件到容器内1.用-v挂载主机数据卷到容器内docker run -v /path/to/hostdir:/mnt $container在容器内拷贝cp /mnt/sourcefile /path/to/destfile2.直接在主机上拷贝到容器物理存储系统A. 获取容器名称或者id :$ docker psB. 获取整个容器的id$ docker inspect -f '``.`Id`' 步骤A获取的名称或者idC. 在主机上拷贝文件:$ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE 或者 $ sudo cp path-file-host /var/lib/docker/devicemapper/mnt/123abc<<id>>/rootfs/root 例子:$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd8e703d7e303 solidleon/ssh:latest /usr/sbin/sshd -D cranky_pare$docker inspect -f '``.`Id`'cranky_pareor $ docker inspect -f '``.`Id`' d8e703d7e303d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e53.用输入输出符docker run -i ubuntu /bin/bash -c 'cat > /path/to/container/file' < /path/to/host/file/ 或者docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/ Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。 譬如我要启动一个CentOS容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定: #docker run -it -v /test:/soft centos /bin/bash 这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。 貌似简单,其实不然,下面我们来验证一下: 一、容器目录不可以为相对路径 [root@localhost ~]# docker run -it -v /test:soft centos /bin/bash invalid value "/test:soft" for flag -v: soft is not an absolute path See 'docker run --help'. 直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头。 二、宿主机目录如果不存在,则会自动生成 如果宿主机中存在/test目录,首先删除它 [root@localhost ~]# rm -rf /test [root@localhost ~]# ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var 启动容器 [root@localhost ~]#docker run -it -v /test:/soft centos /bin/bash [root@a487a3ca7997 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin soft srv sys tmp usr var 查看宿主机,发现新增了一个/test目录 [root@localhost ~]# ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var 三、宿主机的目录如果为相对路径呢? 这次,我们换个目录名test1试试 # docker run -it -v test1:/soft centos /bin/bash 再到宿主机上查看是否新增了一个/test1目录,结果没有,是不是因为我用的是相对路径,所以生成的test1目录在当前目录下,结果发现还是没有。那容器内的/soft目录挂载到哪里去了?通过docker inspect命令,查看容器“Mounts”那一部分,我们可以得到这个问题的答案。 "Mounts": [ { "Name": "test1", "Source": "/var/lib/docker/volumes/test1/_data", "Destination": "/soft", "Driver": "local", "Mode": "z", "RW": true } ], 可以看出,容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录 原来,所谓的相对路径指的是/var/lib/docker/volumes/,与宿主机的当前目录无关。 四、如果只是-v指定一个目录,这个又是如何对应呢? 启动一个容器 [root@localhost ~]# docker run -it -v /test2 centos /bin/bash [root@ea24067bc902 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys test2 tmp usr var 同样使用docker inspect命令查看宿主机的挂载目录 "Mounts": [ { "Name": "96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a", "Source": "/var/lib/docker/volumes/96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a/_data", "Destination": "/test2", "Driver": "local", "Mode": "", "RW": true } ], 可以看出,同3中的结果类似,只不过,它不是相对路径的目录名,而是随机生成的一个目录名。 五、如果在容器内修改了目录的属主和属组,那么对应的挂载点是否会修改呢? 首先开启一个容器,查看容器内/soft目录的属性 [root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash [root@b5ed8216401f /]# ll -d /soft/ drwxr-xr-x 2 root root 6 Sep 24 03:48 /soft/ 查看宿主机内/test目录的属性 [root@localhost ~]# ll -d /test/ drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/ 在容器内新建用户,修改/soft的属主和属组 [root@b5ed8216401f /]# useradd victor [root@b5ed8216401f /]# chown -R victor.victor /soft/ [root@b5ed8216401f /]# ll -d /soft/ drwxr-xr-x 2 victor victor 6 Sep 24 03:48 /soft/ 再来看看宿主机内/test目录的属主和属组是否会发生变化? [root@localhost ~]# ll -d /test/ drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/ 竟然变为mycat了。。。原来,这个与UID有关系,UID,即“用户标识号”,是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。 首先查看容器内victor对应的UID是多少, [root@b5ed8216401f /]#cat /etc/passwd | grep victor victor:x:1000:1000::/home/victor:/bin/bash victor的UID为1000,那么宿主机内1000对应的用户是谁呢? [root@localhost ~]#cat /etc/passwd |grep 1000 mycat:x:1000:1000::/home/mycat:/bin/bash 可以看出,宿主机内UID 1000对应的用户是mycat。 六、容器销毁了,在宿主机上新建的挂载目录是否会消失? 在这里,主要验证两种情况: 一、指定了宿主机目录,即 -v /test:/soft。 二、没有指定宿主机目录,即-v /soft 第一种情况: [root@localhost ~]# rm -rf /test --首先删除宿主机的/test目录 [root@localhost ~]# ls / --可以看到,宿主机上无/test目录 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@localhost ~]#docker run -it --name=centos_test -v /test:/soft centos /bin/bash --启动容器,为了删除方便,我用--name参数指定了容器的名字 [root@82ad7f3a779a /]# exit exit [root@localhost ~]# docker rm centos_test --删除容器 centos_test [root@localhost ~]# ls / --发现 /test目录依旧存在 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var 可以看出,即便容器销毁了,新建的挂载目录不会消失。进一步也可验证,如果宿主机目录的属主和属组发生了变化,容器销毁后,宿主机目录的属主和属组不会恢复到挂载之前的状态。 第二种情况,通过上面的验证知道,如果没有指定宿主机的目录,则容器会在/var/lib/docker/volumes/随机配置一个目录,那么我们看看这种情况下的容器销毁是否会导致相应目录的删除 首先启动容器 [root@localhost ~]#docker run -it --name=centos_test -v /soft centos /bin/bash [root@6b75579ec934 /]# exit exit 通过docker inspect命令查看容器在宿主机上生成的挂载目录 "Mounts": [ { "Name": "b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301", "Source": "/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data", "Destination": "/soft", "Driver": "local", "Mode": "", "RW": true } ], 对应的是/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data目录 销毁容器,看目录是否存在 [root@localhost ~]# docker rm centos_test centos_test [root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301 total 0 drwxr-xr-x 2 root root 6 Sep 24 14:25 _data发现该目录依旧存在,即便重启了docker服务,该目录依旧存在 [root@localhost ~]# systemctl restart docker [root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301 total 0 drwxr-xr-x 2 root root 6 Sep 24 14:25 _data 七、挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。 可通过两种方式解决: 1>关闭selinux。 临时关闭:# setenforce 0 永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。 2> 以特权方式启动容器 指定--privileged参数 如:#docker run -it --privileged -v /test:/soft centos /bin/bash 一、通过docker run命令 1、运行命令:docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash 其中的-v 标记 在容器中设置了一个挂载点 /data(就是容器中的一个目录),并将主机上的 /home/xqh/myimage 目录中的内容关联到 /data下。 这样在容器中对/data目录下的操作,还是在主机上对/home/xqh/myimage的操作,都是完全实时同步的,因为这两个目录实际都是指向主机目录。 2、运行命令:docker run --name test1 -it -v /data ubuntu /bin/bash 上面-v的标记只设置了容器的挂载点,并没有指定关联的主机目录。这时docker会自动绑定主机上的一个目录。通过docker inspect 命令可以查看到。 xqh@ubuntu:~/myimage$docker inspect test1 [ { "Id": "1fd6c2c4bc545163d8c5c5b02d60052ea41900a781a82c20a8f02059cb82c30c", ............................. "Mounts": [ { "Name": "0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01", "Source": "/var/lib/docker/volumes/0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true } ], ........................... 上面 Mounts下的每条信息记录了容器上一个挂载点的信息,"Destination" 值是容器的挂载点,"Source"值是对应的主机目录。 可以看出这种方式对应的主机目录是自动创建的,其目的不是让在主机上修改,而是让多个容器共享。 二、通过dockerfile创建挂载点 上面介绍的通过docker run命令的-v标识创建的挂载点只能对创建的容器有效。 通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。 还有一个区别是,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。 #test FROM ubuntu MAINTAINER hello1 VOLUME ["/data1","/data2"] 上面的dockfile文件通过VOLUME指令指定了两个挂载点 /data1 和 /data2. 我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息 "Mounts": [ { "Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21", "Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data", "Destination": "/data1", "Driver": "local", "Mode": "", "RW": true }, { "Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36", "Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data", "Destination": "/data2", "Driver": "local", "Mode": "", "RW": true } ], 可以看到两个挂载点的信息。 三、容器共享卷(挂载点) docker run --name test1 -it myimage /bin/bash 上面命令中的 myimage是用前面的dockerfile文件构建的镜像。 这样容器test1就有了 /data1 和 /data2两个挂载点。 下面我们创建另一个容器可以和test1共享 /data1 和 /data2卷 ,这是在 docker run中使用--volumes-from标记,如: 可以是来源不同镜像,如: docker run --name test2 -it--volumes-fromtest1 ubuntu /bin/bash 也可以是同一镜像,如: docker run --name test3 -it--volumes-fromtest1 myimage /bin/bash 上面的三个容器 test1 , test2 , test3 均有 /data1 和 /data2 两个目录,且目录中内容是共享的,任何一个容器修改了内容,别的容器都能获取到。 四、最佳实践:数据容器 如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据容器,该容器有1个或多个卷。 其它容器通过--volumes-from 来共享这个数据容器的卷。因为容器的卷本质上对应主机上的目录,所以这个数据容器也不需要启动。 如: docker run --name dbdata myimage echo "data container" 本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1953035,如需转载请自行联系原作者

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

Service官方直译深入理解(基础知识完)

Service 被设计为不和用户直接交互,在后台执行长期操作的一种系统组件,也可被其它应用使用。每一个服务必须在AndroidManifest中声明。服务可以通过Context.startService() and Context.bindService().启动。Note:service运行在主线程,因此执行网络操作需要另起线程,但IntentService可以解决这个问题。 What is a Service? 首先,我们来说说服务不是什么: 1:服务不是一个单独的进程,通常情况下它运行在应用进程的一部分 2.服务不是线程,它不能在应用无响应时工作 下面来说说服务两个主要的特征: 1.很方便的通知系统,我有一些后台任务需要处理,直到明确停止服务 2.很方便的给其它应用提供功能 Note:因为服务很简单,所以我们可以以任何我们想交互的方式来设计一个服务。我们可以将服务看成一个可以随时调用它方法的普通的Java对象,通过AIDL来交互。 Service Lifecycle 服务可以通过两种方式启动。如果有人调用了Context.startService(),那么服务的oncreate()和onStartCommand(Intent, int, int)会被回调,不管执行多少次startService,服务都不会重新创建,而会多次调用onStartCommand,所以并不存在停止不了服务的情况。服务会持续下去直到Context.stopService() or stopSelf()被调用。onStartCommand返回的不同值对应不同的服务需要。 用户还可以通过Context.bindService()来持有一个服务连接。当服务没运行的时候将会调用oncreate方法,但不会调用onStartCommand方法。客户端会接收到服务onBind(Intent)方法回调的IBinder对象,允许客户端回调服务里面的方法。通常情况下,IBinder是由复杂的接口创建的。 上述两种启动方式可以同时存在 Permissions 当一个服务在清单文件中声明,全局访问它将会拒绝。这时需要在自己的清单文件中声明合适的权限来启动,停止和绑定特定的服务。以Android 2.3为例,当调用Context.startService(Intent),我们也需要设置Intent.FLAG_GRANT_READ_URI_PERMISSION and/or Intent.FLAG_GRANT_WRITE_URI_PERMISSION。 这会暂时同意Service访问Intent指定的Uri,直到服务停止。这个对Service没有exported也同样适用。 Process Lifecycle Android系统会尽可能长的保留持有service的进程,但是当内存不足需要杀掉一些进程时,有如下的优先级: 1.当前服务正在回调onCreate(), onStartCommand(), or onDestroy()方法,则视为前台进程,不会被kill 2.当服务长期运行在后台时,有极高的可能性被kill 3.我们可以通过startForeground(int, Notification)来设置前台进程,除非在内存极端紧张下,否则不会被杀 Note 有很大的可能,一个正在运行的服务在内存不足时会被系统杀掉,但是被杀掉后,系统会稍后试着重启这个服务。我们可以在onStartCommand()方法用START_FLAG_REDELIVERY回调一个Intent来继续执行我们的服务 基础完

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

第一行代码阅读笔记---基本知识

在res中,我们会看到很多目录,分别如下: drawable-hdpi drawable-ldpi drawable-mdpi drawable-xxhdpi layout menu values values-sw600dp values-sw720dp-land values-v11 values-v14 其实很简单,以上所有的目录中,drawable开头的文件夹是用来存放图片的,以value开头是用来存放字符串的,layout是用来存放布局文件的 menu文件夹是用来放菜单文件的。 很多情况下,美工提供的图片放在drawable-hdpi该文件夹,在ActivityMainfest.xml文件中,icon就是对应着应用程序的图标,我们可以在res的drawable目录下找到对应的图片,将其替换就可以换应用程序的图标啦。 活动的注册声明要放在<application>标签内,这里是通过<activity>标签来对活动进行注册的。 如下所示: <application> <activity android:name=".FirstActivity" //具体注册哪一个活动 android:label="This is FirstActivity" > //应用程序标题栏的名称 <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>下面这个是为了阐述Toast功能而调用使用的案例,在第一行代码书上可找到。 Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new OnClickListener() { //通过setOnClickListener方法为按钮注册一个监听器,这样,点击按钮就会执行监听器中的on_click方法。 @Override public void onClick(View v) { //Toast功能 //通过makeText()创建一个Toast对象,然后调用show()将Toast显示出来。 //makeText有三个参数 //1、Context,也就是Toast要求的上下文,由于活动本身就是一个Context对象,因此传入FirstActivity.this就可以 //2、Toast显示的文本内容 //3、Toast显示的时间长度,有两个内置常量可以选择 Toast.LENGTH_SHORT和 Toast.LENGTH_LONG Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show(); } });

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

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

用户登录
用户注册