June 17, 2014
进程管理工具Supervisord
"Supervisord 简介 上面已经介绍了Go目前是有两种方案来实现他的daemon,但是官方本身还不支持这一块,所以还是建议大家采用第三方成熟工具来管理我们的应用程序,这里我给大家介绍一款目前使用比较广泛的进程管理软件: Supervisord。Supervisord是用Python实现的一款非常实用的进程管理工具。supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启、关闭、重启等操作,而且它管理的进程一旦崩溃会自动重启,这样就可以保证程序执行中断后的情况下有自我修复的功能。\n我前面在应用中踩过一个坑,就是因为所有的应用程序都是由Supervisord父进程生出来的,那么当你修改了操作系统的文件描述符之后,别忘记重启Supervisord,光重启下面的应用程序没用。当初我就是系统安装好之后就先装了Supervisord,然后开始部署程序,修改文件描述符,重启程序,以为文件描述符已经是100000了,其实Supervisord这个时候还是默认的1024个,导致他管理的进程所有的描述符也是1024.开放之后压力一上来系统就开始报文件描述符用光了, …"
June 17, 2014
京东网站url规划分析
"对于一些大型产品网站,当不同产品项的过滤条件不一样的时候,多个过滤条件会完全不一样。如服装行业与电脑配置的许多参数都不一样。而他们又是如何实现自动通过程序来调用的呢,是一个很值得学习的知识的。\n下面我们来通过京东其中一个服装url来看一下,他们是如何实现这一点的。\n上图是对于一些大类频道的url规划信息。非常的清楚,就不再一一讲述了。下面我们主要讲右侧”条件筛选“这一块.\n分析url: http://list.jd.com/list.html?cat=1315%2C1342%2C9733\u0026amp;brand=35553%2Ctzmall\u0026amp;page=1\u0026amp;ext=53345%3A%3A1373%5E%5E64135%3A%3A8646%5E%5E95400%3A%3A8648%5E%5E10669%3A%3A1656%5E%5E29520%3A%3A1589%5E%5E110357%3A%3A10991%5E%5E\u0026amp;delivery=2\u0026amp;sort=sort_dredisprice_asc\n经过用js的unescape(url)反编码后,得出url …"
June 16, 2014
iOS的主要框架介绍(转)
"框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件。一个共享库定义的方法或函数可以被应用程序调用。\nIOS提供了很多你可以在应用程序里调用的框架。要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它。许多应用程序都使用了如Foundation、UIKit、和Core Graphics这些框架。根据你为应用程序选择的模版,相关的框架就已经被自动引入了。如果默认加入的框架不能满足你的应用程序的需求,你也可以加入需要的框架。\n看看HelloWorld.xcodeproj项目里都包含了哪些框架(注:HelloWorld.xcodeproj是《Your First iOS App tutorial 》这篇教程里的一个项目)\n1.在XCode里打开HelloWorld.xcodeproj项目(如果还没有打开)\n在project navigator窗口里点击,点击Frameworks目录前面的三角形图标。你会看到: UIKit.framework,Foundation.framework, 和CoreGraphics.framework\n点击任意一 …"
June 15, 2014
Swift中的柯里化函数
"柯里化函数(curried function)的类型相当于一个嵌套函数类型。例如,下面的柯里化函数 addTwoNumber()() 的类型是 Int -\u0026gt; Int -\u0026gt; Int:\nfunc addTwoNumbers(a: Int)(b: Int) -\u0026gt; Int{ return a + b } addTwoNumbers(4)(5) // returns 9 柯里化函数的函数类型从右向左组成一组。例如,函数类型 Int -\u0026gt; Int -\u0026gt; Int 可以被理解为 Int -\u0026gt; (Int -\u0026gt; Int)——也就是说,一个函数传入一个 Int 然后输出作为另一个函数的输入,然后又返回一个 Int。例如,你可以使用如下嵌套函数来重写柯里化函数 addTwoNumbers()():\nfunc addTwoNumbers(a: Int) -\u0026gt; (Int -\u0026gt; Int){ func addTheSecondNumber(b: Int) -\u0026gt; Int{ return a + b } return addTheSecondNumber } …"
June 12, 2014
Swift中的结构体与类的区别(有坑存在)
"结构体和枚举是值类型 在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Booleans)、字符串(string)、数组(array)和字典(dictionaries),都是值类型,并且都是以结构体的形式在后台所实现。\n在 Swift 中,所有的结构体和枚举都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。\n类是引用类型 与值类型不同,引用类型在被赋予到一个变量,常量或者被传递到一个函数时,操作的并不是其拷贝。因此,引用的是已存在的实例本身而不是其拷贝。\n恒等运算符 因为类是引用类型,有可能有多个常量和变量在后台同时引用某一个类实例。(对于结构体和枚举来说,这并不成立。因为它们作值类型,在被赋予到常量,变量或者传递到函数时,总是会被拷贝。)\n如果能够判定两个常量或者变量是否引用同一个类实例将会很有帮助。为了达到这个目的,Swift 内建了两个恒等运算符:\n等价于 ( === )\n不等价于 ( !== )\n以下是运用这两个运算符检测两个常量或者变量是否引用同一个实例:\nif …"
June 12, 2014
Swift中的函数
"对于Swift语言中的函数还是有许多与其它语言不同的地方的。如下:\n1. 对于指定函数黑夜参数值的函数,在调用函数的时候,如果需要指定参数值的话,需要以“参数名:值”这种格式调用 func join(s1:String, s2: String, joinstr: String = “-“) -\u0026gt; String { return s1 + joinstr + s2 }\nlet result = join(“hello”, “world”, joinstr:”===”) //或者直接写前两个值 println(result)\n2. 常量参数和变量参数(Constant and Variable Parameters)\n数参数默认是常量。试图在函数体中更改参数值将会导致编译错误。这意味着你不能错误地更改参数值。\n但是,有时候,如果函数中有传入参数的变量值副本将是很有用的。你可以通过指定一个或多个参数为变量参数,从而避免自己在函数中定义新的变量。变量参数不是常量,你可以在函数中把它当做新的可修改副本来使用。\n通过在参数名前加关键字 var 来定义变量参数:\nfunc …"
June 11, 2014
Swift编程语言中的optional(可选)
"可选 使用可选来处理值可能缺失的情况。可选表示:\n有值,等于 x 或者\n没有值 注意:C 和 Objective-C 中并没有可选这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回 nil, nil 表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如 NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选可以让你暗示任意类型的值缺失,并不需要一个特殊值。\n来看一个例子。Swift 的 String 类型有一个叫做 toInt 的方法,作用是将一个 String 值转换成一个 Int 值。然而,并不是所有的字符串都可以转换成一个整数。字符串 \u0026quot;123\u0026quot; 可以被转换成数字 123,但是字符串 \u0026quot;hello, world\u0026quot; 不行。\n下面的例子使用 toInt 方法来尝试将一个 String 转换成 Int:\nlet …"
June 10, 2014
Swift中的字典
"//1.创建字典\nvar dict:Dictionary\u0026lt;Int, String\u0026gt; = [:“美国“,1:“中国“, 2:“英国“]\nvar country = [\n“china”: “中国“,\n“en”:“英国“,\n“usa”:“美国“\n]\n//创建一个空的字典\nvar emptyDictionary = Dictionary\u0026lt;String, Float\u0026gt;()\nvar emptyDictionary2 = [:]\nfor (key,value) incountry {\nvar result = key + value\n}\n//2.获取字典中的所有键名和键值及字典元素个数\nvar keys = Array(country.keys)\nvar values = Array(country.values)\nvar cnum = country.count\n//3.访问字典\nvar value = dict[]\nvar value2 = country[“china”]\n//4.修改字典,修改后,字典中的位置会发生改变\ncountry[“china”] = “中华人民 …"
June 10, 2014
swift中的数组操作
"var shopCart: String[] = [“苹果“, “桔子“, “荔枝“]\nvar shoppingList = [“catfilsh”, “water”, “tulips”]\n//创建一个空数组\nvar emptyArray = String\n//数组遍历\nfor str inshopCart {\nprintln(str)\n}\n//带索引值的遍历\nfor (index, value) inenumerate(shopCart) { println(“(index+1):(value)“) }\n//判断数组是否为空及数组元素个数\nifshopCart.isEmpty {\nprintln(“购物车中无任何商品,请购买”)\n} else {\nprintln(“您当前购物车中共 (shopCart.count) 有件商品”)\n}\nprintln(“=================”)\n//数组元素添加,{苹果 桔子 荔枝 芒果}\nshopCart.append(“芒果“)\nfor str inshopCart {\nprintln(str)\n} …"
May 28, 2014
Linux中让crontab以秒为单位执行任务
"Linux下实现秒级定时任务的两种方案(Crontab 每秒运行):\n第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间。\n#!/bin/bash while true ;do command sleep XX //间隔秒数 done 或者使用for语句\n#!/bin/bash for((i=1;i\u0026lt;=20;i++));do /home/somedir/scripts.sh \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 sleep 3 done 第二种方案,使用crontab。\n我们都知道crontab的粒度最小是到分钟,但是我们还是可以通过变通的方法做到隔多少秒运行一次。\n以下方法将每20秒执行一次\ncrontab -e * * * * * /bin/date * * * * * sleep 20; /bin/date.sh * * * * * sleep 40; /bin/date.sh 说明:需要将/bin/date.sh更换成你的命令即可\n这种做法去处理隔几十秒的定时任务还好,要是每1秒运行一次就得添加60条记录。。。如果每秒运行还是用 …"