rabbitMq 安装

  • 安装rabbitmq,必须安装erlang,安装可以下载安装包,也可以下载rpm 文件安装,rabbitmq官网提供了erlang的安装文件,过程中可能会遇到一些问题查看
    1. 问题查看http://thrillerzw.iteye.com/blog/2111335
    2. 下载地址 http://www.rabbitmq.com/releases/erlang/
    3. 版本对照表,下载指定版本的 erlang
    4. 安装 yum install erlang-19.0.4-1.el7.centos.x86_64.rpm
    5. 安装过程 ,提示错误,少了那些依赖包,可参考: http://www.51itong.net/centos6-5-erlang-6590.html
  • 安装 rabbitMq
    1. 下载地址 : http://www.rabbitmq.com/releases/rabbitmq-server/
    2. 安装 : yum install rabbitmq-server-3.6.10-1.el7.noarch.rpm

tip:可以用yum安装,可能版本比较老

配置

  • rabbitmq 安装后,默认的配置
    1. 数据库路径 : /var/lib/rabbitmq
    2. 配置文件路径 : /etc/rabbitmq, 其中,环境配置文件 /etc/rabbitmq/rabbitmq-env.conf 位置不能变,/etc/rabbitmq/rabbitmq.config,可以通过环境变量配置 CONFIG_FILE=/usr/local/etc/rabbitmq/rabbitmq
      NODE_IP_ADDRESS=127.0.0.1
      NODENAME=rabbit-xiaofang
  • 日志路径 : /var/log/rabbitmq ,可以查看插件加载,启动的服务,配置文件在哪,有没有加载配置文件等
  • 安装web 管理插件 rabbitmq-plugins enable rabbitmq_managemen
    rabbitmq-plugins disable rabbitmq_managemen
    访问 http://localhost:15672可以查看web管理界面,
    > tips : 从3.4 以后的版本,guest,就只能本机访问了,外部访问不了,推荐添加新的用户和角色,来管理界面
  • 配置外部访问 [
    {rabbit,[
    {tcp_listeners, [5672]}
    ]
    }
    ].
  • 启动服务 : rabbitmq-server -detached, 启动一个守护进程,后台运行
  • 新建用户和授权 rabbitmqctl add_user admin admin123
    rabbitmqctl set_user_tags admin administrator //给用户赋予角色
    rabbitmqctl list_user //查看用户
    rabbitmqctl list_vhosts
    rabbitmqctl add_vhost xiaofang
    rabbitmqctl set_permissions -p xiaofang admin '.*' '.*' '.*' // set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
    rabbitmqctl list_user_permissions admin //查看某个用户权限

概念

概念

  1. product、exchange、binding、queue 、custome 之间的关系
    [图片]()
    [关系]()
  2. Exchange type : fanout、direct 、topic、headers、
  • fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中 – direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。 – opic类型的Exchange在匹配规则上进行了扩展,它与direct类型的Exchage相似,也是将消息路由到binding key与routing key相匹配的Queue中,但这里的匹配规则有些不同,它约定: – outing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit” binding key与routing key一样也是句点号“. ”分隔的字符串 – binding key中可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

客户端使用

  1. 查看队列里面的内容
  2. 没有用到超时机制。RabbitMQ仅仅通过Consumer的连接中断来确认该Message并没有被正确处理。也就是说,RabbitMQ给了Consumer足够长的时间来做数据处理。
  3. queue也可以自动删除,被标为auto-delete的queue在最后一个Consumer unsubscribe后就会被自动删除。那么如果是创建一个已经存在的queue呢?那么不会有任何的影响。需要注意的是没有任何的影响,也就是说第二次创建如果参数和第一次不一样,那么该操作虽然成功,但是queue的属性并不会被修改
  4. 如果queue不存在,当然Consumer不会得到任何的Message。但是如果queue不存在,那么Producer Publish的Message会被丢弃。所以,还是为了数据不丢失,Consumer和Producer都try to create the queue!反正不管怎么样,这个接口都不会出问题。
  5. queue也可以自动删除,被标为auto-delete的queue在最后一个Consumer unsubscribe后就会被自动删除。
  6. rabbitMq默认是公平分发,RabbitMQ将第n个Message分发给第n个Consumer。当然n是取余后的。它不管Consumer是否还有unacked Message,只是按照这个默认机制进行分发。 prefetch_count=1 (channel.basic_qos(prefetch_count=1) )通过这个设置,可以是客户端,同一时间最多处理一个message,这种方法可能会导致queue满。当然,这种情况下你可能需要添加更多的Consumer,或者创建更多的virtualHost来细化你的设计。
  7. queue 和exchange 创建完之后,就不会改变了, 但是可以修改queue 的binding key
  8. 要建立 binding key ; exchange,要一起设置

rabbitmq 对象属性

exchange属性

  1. Type : exchange类型fanout、direct、topic、header
  2. Durability : 持久性,这是exchange的可选属性,如果你Durability设置为false,那些当前会话结束的时候,该exchange也会被销毁。    新建一个transient exchange
  3. Auto delete: 当没有队列或者其他exchange绑定到此exchange的时候,该exchange被销毁。这个很简单就不示例了。
  4. Internal:表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定。

Queue 属性

  1. Durability和exchange相同,未持久化的队列,服务重启后销毁。
  2. Auto delete : 当没有消费者连接到该队列的时候,队列自动销毁。
  3. Exclusive :使队列成为私有队列,只有当前应用程序可用,当你需要限制队列只有一个消费者,这是很有用的。
  4. Message TTL :在队列自动删除之前可以保留多长时间(对应扩展参数argument “x-expires”)
  5. Max length : 一个队列可以容纳的已准备消息的数量(对应扩展参数argument “x-max-length”) ps:一旦创建了队列和交换机,就不能修改其标志了。例如,如果创建了一个non-durable的队列,然后想把它改变成durable的,唯一的办法就是删除这个队列然后重现创建。

Message 属性

  1. Durabillity : 消息的持久在代码中设置的方法与exchange和queue不同, (DeliveryMode=2)
  2. contentType: 标识消息内容的MIME,例如JSON用application/json
  3. replayTo : 标识回调的queue的地址
  4. correlationId :用于request和response的关联,确保消息的请求和响应的同一性
  5. 状态
  • Ready : 此状态的消息存在于队列中待处理。 – Unacknowledged : 此状态的消息表示已经在处理未确认。 6.

POP3、SMTP和IMAP

POP3

POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

SMTP

SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

IMAP

IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

备注:POP3和IMAP的区别

POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。

IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

同时,IMAPPOP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。此外,IMAP 更好地支持了从多个不同设备中随时访问新邮件。

IMAP及POP3有什么区别?

总之,IMAP 整体上为用户带来更为便捷和可靠的体验。POP3 更易丢失邮件或多次下载相同的邮件,但IMAP 通过邮件客户端与webmail 之间的双向同步功能很好地避免了这些问题。

redis 学习笔记

# redis 学习笔记
## redis 实用命令
1. 启动服务,指定端口
开启服务 `redis-server –port 6370`
停止服务 `redis-cli -p 6370 shutdown `
2. 获取所有的配置
~~config get *
3. 远程服务器上的命令
~~ redis-cli -h host -p port -a password
4. 获取所有的键 `keys * `

5. 返回键的剩余时间 `ttl key`
6. 返回键的类型 `type key`
7. 选择数据库 ` select 1 `
8. 关闭连接 `quit`
9. 服务器验证给定的密码 `auth password`
10. 服务器的统计数据和信息。 `info`
11. `slaveof 114.11.11.11 6379` 设置当前服务器为指定主机的从属服务器,并且删除原有数据,同步主服务器内容
%% 如果没有同步主服务器内容,修改从服务器的配置,bind ip 或者 bind 0.0.0.0 (不安全)

## redis 数据类型
1. Strings-字符串
~~ set xiaofang xiaofnag
~~ get xiaofng
2. Hashs-哈希值;Redis的哈希键值对的集合。 Redis的哈希值是字符串字段和字符串值之间的映射,所以它们被用来表示对象
~~ hmset user:1 name xiaofang age 22 sex male
~~ hgetall user:1
3. lists-列表
~~ lpush list redis
~~ lrange list 0 10
4. sets-集合
~~ sadd list2 redis
~~ smembers list2
5. zset-有序集合
~~ zadd list3 0 redis
~~ zrangbyscore list3 0 1000

## redis 的键命令
1. 此命令删除键,如果存在
~~ del xiaofang
2. 该命令返回存储在指定键的值的序列化版本。
~~ dump key
3. 此命令检查该键是否存在。
~~  exist key
4. 指定键的过期时间
~~  expire key 100000
5. 指定键的过期世间,unix时间戳
~~ expireat key 100000
6. 设置键以毫秒为单位到期
~~ pexpire key milliseconds
7. 移动键到另一个数据库
~~ move key 1
8. 选择数据库
~~ select 1
9. 移除过期的键
~~ persist key
10. 以毫秒为单位获取剩余时间的到期键
~~ pttl xiaofang
11. 以秒为单位获取剩余时间的到期键
~~ ttl key
12. 从Redis返回随机键
~~ randomkey
13. 更改键的名称
~~ rename key newkey
14. 返回存储在键的数据类型的值。
~~ type key

redis Connection refused

Could not connect to Redis at (ip):6379: Connection refused

连接失败

1.检查redis-server 有没有开启服务

2.修改配置文件(/usr/local/redis/etc/redis.conf)
bind 指定ip     0.0.0.0(所有ip)

3.关闭防火墙   chkconfig iptables off  重启永久生效

备注: slaveof ip port 如果不能同步数据,也是检查以上情况

git tag — 标签相关操作

标签可以针对某一时间点的版本做标记,常用于版本发布。

  • 列出标签

$ git tag # 在控制台打印出当前仓库的所有标签
$ git tag -l ‘v0.1.*’ # 搜索符合模式的标签

  • 打标签

git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。
# 创建轻量标签
$ git tag v0.1.2-light

# 创建附注标签
$ git tag -a v0.1.2 -m “0.1.2版本”

创建轻量标签不需要传递参数,直接指定标签名称即可。
创建附注标签时,参数a即annotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。

  • 切换到标签

与切换分支命令相同,用git checkout [tagname]
查看标签信息
git show命令可以查看标签的版本信息:
$ git show v0.1.2

  • 删除标签

误打或需要修改标签时,需要先将标签删除,再打新标签。
$ git tag -d v0.1.2 # 删除标签

参数d即delete的缩写,意为删除其后指定的标签。

  • 给指定的commit打标签

打标签不必要在head之上,也可在之前的版本上打,这需要你知道某个提交对象的校验和(通过git log获取)。
# 补打标签
$ git tag -a v0.1.1 9fbc3d0

  • 标签发布

通常的git push不会将标签对象提交到git服务器,我们需要进行显式的操作:
$ git push origin v0.1.2 # 将v0.1.2标签提交到git服务器
$ git push origin –tags # 将本地所有标签一次性提交到git服务器

 

注意:如果想看之前某个标签状态下的文件,可以这样操作

1.git tag   查看当前分支下的标签

2.git  checkout v0.21   此时会指向打v0.21标签时的代码状态,(但现在处于一个空的分支上)

3. cat  test.txt   查看某个文件

Docker 初体验

一、安装篇
1.自行google
二、基础篇
1.docker version  查看docker版本
2.docker search tutorial  检索镜像
3.docker pull learn/tutorial  安装镜像
4.docker run learn/tutorial echo “hello word”  在沙箱中运行hello world
5.docker run learn/tutorial apt-get install -y ping   在docker中安装软件
6.docker ps -l 显示最后一个创建的docker
7.docker commit 698 learn/ping  复制一个新的镜像
8.docker run learn/ping ping www.google.com
9.docker inspect (版本号,docker ps -l)  查看容器的信息
10.

使用compass自动合并css雪碧图

         css雪碧图又叫css精灵css sprite,是一种背景图片的拼合技术。使用css雪碧图,能够减少页面的请求数、降低图片占用的字节,以此来达到提升页面访问速度的目的。但是它也有令人诟病的地方,就是拼图和后期维护的成本比较大。也正是因为这一点,导致很多开发者懒于使用css雪碧图。

对于这种耗时、枯燥、重复性的工作,最好的解决方法还是交给工具去处理。本文就介绍下怎样使用compass来自动合并css雪碧图。

compass

安装compass

首先请确认电脑已经安装rubysass环境,rubysass的安装过程可参考:

sass入门指南

安装完成后可通过以下指令确认:

$ ruby -v
ruby 2.0.0p451 (2014-02-24) [x64-mingw32]
$ sass -v
Sass 3.4.6 (Selective Steve)

接着安装compass:

$ gem install compass

// 查看compass版本
$ compass -v
Compass 1.0.1 (Polaris)

ps: 本文中代码运行环境为:sass: 3.4.6, compass: 1.0.1, 测试时请确认sass版本不低于3.4.6,compass版本不低于1.0.1

配置compass项目

进入项目目录,命令行中运行:

$ compass init

会生成相应的目录和配置文件。在images目录下建立share目录存放需合并的图标。项目目录结构如下:

- sass
- stylesheet
- images
  |-- share
  |-- magic
  |-- setting

config.rb文件配置如下:

http_path = "/"
css_dir = "stylesheets"
sass_dir = "sass"
images_dir = "images"
javascripts_dir = "javascripts"

relative_assets = true    // 使用相对目录
line_comments = false    // 关闭行注释

完整的项目目录示例可在github上查看:https://github.com/Bubblings/compass-sprite

合并雪碧图

输出所有雪碧图样式

sass目录下新建share.scss文件,并写入以下代码:

@import "compass/utilities/sprites";    // 加载compass sprites模块
@import "share/*.png";                    // 导入share目录下所有png图片
@include all-share-sprites;                // 输出所有的雪碧图css

命令行调用compass compile进行编译,此时会发现images目录下出现了一个合并后的图片share-xxxxxxxx.png, stylesheet目录下生成了对应的share.css文件:

.share-sprite, .share-github, .share-qq, .share-weibo {
  background-image: url('../images/share-s7fefca4b98.png');
  background-repeat: no-repeat;
}

.share-github {
  background-position: 0 0;
}

.share-qq {
  background-position: 0 -23px;
}

.share-weibo {
  background-position: 0 -47px;
}

至此,我们就实现了一个简单的雪碧图合并,而且只用了三行代码。是不是有点小激动^_^。 生成的代码中.share-sprite是雪碧图的基础类,后面介绍配置时会详细说明。生成的每个雪碧图默认的class规则是:.目录名-图片名。如果想自定义,我们可以通过下面调用单个雪碧图的方式来实现。

调用单个雪碧图样式

sass目录下新建single-share.scss文件,并写入以下代码:

@import "compass/utilities/sprites";    // 加载compass sprites模块
@import "share/*.png";                    // 导入share目录下所有png图片
.test {
    @include share-sprites(github);
}

编译后的css为:

.share-sprite, .test {
  background-image: url('../images/share-s7fefca4b98.png');
  background-repeat: no-repeat;
}

.test {
  background-position: 0 -23px;
}

利用魔术精灵选择器智能输出

有的时候我们的图标会有多种状态,比如hover, active, focus, target等。利用compass的魔术精灵选择器我们就可以智能的合并各状态的图标,并输出对应的css。使用时,我们需要将图标按照一定的规则命名。例如:

weibo.png            // 默认状态图标
weibo_hover.png     // hover状态图标
weibo_active.png     // active状态图标

sass目录下新建magic.scss文件,并写入以下代码:

@import "compass/utilities/sprites";
@import "magic/*.png";
@include all-magic-sprites;

编译后的css为:

.magic-sprite, .magic-weibo {
  background-image: url('../images/magic-s758f6928e8.png');
  background-repeat: no-repeat;
}

.magic-weibo {
  background-position: 0 0;
}
.magic-weibo:hover, .magic-weibo.weibo-hover {
  background-position: 0 -48px;
}
.magic-weibo:active, .magic-weibo.weibo-active {
  background-position: 0 -24px;
}

雪碧图配置

我们已经利用compass实现了简单雪碧图的合成。当然compass还提供了很多可供配置的选项,下面来一一介绍。

PS: 以下的配置选项不再单独举例,可参考示例项目中的setting.scss文件。

先来看下配置相关的语法:

$<map>-<property>: setting;                // 配置所有sprite
$<map>-<sprite>-<property>: setting;    // 配置单个sprite

说明:

  • <map>: 对应图标存放的文件夹名称,如上面例子中的:sharemagic
  • <sprite>: 对应单个图标的名称,如上面例子中的: weibo, qq, github

配置sprite间距

$<map>-spacing: 5px;                // 配置所有sprite间距为5px,默认为0px
$<map>-<sprite>-spacing: 10px;        // 配置单个sprite间距为10px,默认继承$<map>-spacing的值

配置sprite重复性

$<map>-repeat: no-repeat/repeat-x;        // 配置所有sprite的重复性,默认为no-repeat
$<map>-<sprite>-repeat: no-repeat/repeat-x;// 配置单个sprite的重复性,默认继承$<map>-repeat的值

配置sprite的位置

$<map>-position: 0px;                // 配置所有sprite的位置,默认为0px
$<map>-<sprite>-position: 0px;        // 配置单个sprite的位置,默认继承$<map>-position的值

配置sprite的布局方式

$<map>-layout: vertical/horizontal/diagonal/smart;        // 默认布局方式为vertical

清除过期的sprite

$<map>-clean-up: true/false;        // 默认值为true

每当添加、删除或改变图片后,都会生成新的sprite,默认情况下compass会自动的移除旧的sprite,当然也可以通过配置$<map>-clean-up: false;来保留旧的sprite。

配置sprite的基础类

在使用sprite时,compass会自动的生成一个基础类来应用公用的样式(如background-image),默认的类名为$<map>-sprite,上面例子中的.share-sprite, .magic-sprite就是这个基础类,当然compass也提供了自定义这个类名的选项:

$<map>-sprite-base-class: ".class-name";

魔术精灵选择器开关

上面已经介绍了怎样利用利用魔术精灵选择器智能输出sprite,默认情况下compass是开启这个功能的,也就是说compass默认会将以_hover, _active等名字结尾的图片自动输出对应的:hover, :active等伪类样式。当然如果不想这样的话,也可以禁用它。

$disabled-magic-sprite-selectors: false;    // 默认为true

设置sprite尺寸

我们在合并雪碧图时,很多时候图片的尺寸都不一样,那么在使用时我们如何给每个sprite设置尺寸呢?compass有提供自动设置每个sprite尺寸的配置,默认是关闭的,我们只需手动启用即可。

$setting-sprite-dimensions: true;    // 启用自动设置sprite尺寸,默认值为false

这时输出的样式中会自动加上图片的尺寸,例如:

.setting-compass {
  background-position: -5px 0;
  height: 35px;
  width: 200px;
}

当然,如果只对某个sprite单独设置的话,compass也提供了这个功能。语法如下:

$<map>-sprite-width($name);     // $name为合并前的图片名称
$<map>-sprite-height($name);

例如:

.special {
    @include setting-sprite(compass);
    width: setting-sprite-width(compass);
    height: setting-sprite-height(compass);
}

则输出的css为:

.special {
  background-position: -5px 0;
  width: 200px;
  height: 35px;
}