August 1, 2014
rabbitmq 添加远程访问功能
"刚刚安装过的rabbitmq 消息队列,并启用了插件管理功能,3.3.1版中,处于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,其他的IP无法直接使用这个账号。 这对于服务器上没有安装桌面的情况是无法管理维护的,除非通过在前面添加一层代理向外提供服务,这个又有些麻烦了,这里通过配置文件来实现这个功能。\n只要编辑 /etc/rabbitmq/rabbitmq.config 文件,添加以下配置就可以了。\n[ {rabbit, [{tcp_listeners, [5672]}, {loopback_users, [“asdf”]}]} ].\n现在添加了一个新授权用户asdf,可以通过外网使用这个用户名和密码访问.(记得要先用命令添加这个命令才行,#rabbitmqctl add_user asdf pwd123456)我是通过在管理平台里直接添加的用户和密码的,我的测试环境装有桌面的。 参考文档: http://www.rabbitmq.com/access-control.html\n# rabbitmqctl add_user asdf …"
August 1, 2014
【架构】关于RabbitMQ
"1 什么是RabbitMQ? RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然: 单向解耦 双向解耦(如:RPC)\n例如一个日志系统,很容易使用RabbitMQ简化工作量,一个Consumer可以进行消息的正常处理,另一个Consumer负责对消息进行日志记录,只要在程序中指定两个Consumer所监听的queue以相同的方式绑定到同一个exchange即可,剩下的消息分发工作由RabbitMQ完成。\n使用RabbitMQ server需要:\nErLang语言包;\nRabbitMQ安装包;\nRabbitMQ同时提供了java的客户端(一个jar包)。\n2 概念和特性 2.1 交换机(exchange): 1. 接收消息,转发消息到绑定的队列。四种类型:direct, topic, headers and fanout\ndirect:转发消息到routigKey指定的队列\ntopic:按规则转发 …"
July 28, 2014
mysql中数据类型的长度解释
"11.2. 数值类型 MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。\nBIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。\n作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。\n类型 字节 最小值 最大值 (带符号的/无符号的) (带符号的/无符号的) TINYINT 1 -128 127 0 255 SMALLINT 2 -32768 32767 0 65535 MEDIUMINT 3 -8388608 8388607 0 16777215 INT 4 -2147483648 2147483647 0 4294967295 BIGINT 8 -9223372036854775808 …"
July 23, 2014
MySQL 更新并返回计数
"对于想使用 MySQL 实现简单 ID 分配器, 一般就是设置一个整数字段, 然后想分配的时候加 1 并返回. 新手往往犯错误, 先执行一条 update 语句, 然后再 select 那个字段. 但这是错误的!\nCREATE TABLE `mytable` ( `counter` int(10) NOT NULL DEFAULT \u0026#39;0\u0026#39; ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into mytable values(1); 正确的方式应该是使用 last_insert_id() 函数:\nupdate mytable set counter=last_insert_id(counter+1); select last_insert_id(); 另一种方法(http://imysql.cn/2010/07/01/mysql-faq-using-mysql-as-serial-generator.html):\nSELECT `ID` FROM `ID_RANGE_XX` ORDER BY ID LIMIT 1 FOR …"
June 20, 2014
golint—golang代码质量检测
"github: https://github.com/golang/lint\ngolint是类似javascript中的jslint的工具,主要功能就是检测代码中不规范的地方。golint用于检测go代码。\n使用 $ go get github.com/golang/lint $ go install github.com/golang/lint golint 文件名或者目录 检测对应的代码。\ngolint会输出一些代码存在的问题: 比如:\nrecorder.go:55:5: exported var RecordBind should have comment or be unexported recorder.go:158:1: exported function Record_ErrorRecord should have comment or be unexported recorder.go:173:6: don\u0026#39;t use underscores in Go names; type Data_MemStats should be DataMemStats …"
June 19, 2014
Swift中的标准函数
"Swift中共有74个内建函数,但是在Swift官方文档(“ The Swift Programming Language”)中只记录了7中。剩下的67个都没有记录。\n本文将列举Swift所有的内建函数。本文中提到的所谓的内建函数是指那些在Swift中不需要导入任何模块(如Foundation等)或者引用任何类就可以使用的函数。\nabs(signedNumber): 返回给定的有符号数字的绝对值。很简单,但是没有在文档中记录。\nabs(-1) == 1 abs(-42) == 42 abs(42) == 42 contains(sequence, element): 如果给定的序列(如数组)包含特定的元素,则返回true。\nvar languages = [“Swift”, “Objective-C”] contains(languages, “Swift”) == true contains(languages, “Java”) == false contains([29, 85, 42, 96, 75], 42) == true dropFirst(sequence): 返回一个去 …"
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 } …"