0%

引子

学习下如何使用rabbitMQ

MQ 即 (Message Quene),消息队列

在计算机科学中,消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。

实际上,消息队列常常保存在链表结构中。拥有权限的进程可以向消息队列中写入或读取消息。
目前,有很多消息队列有很多开源的实现,包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、RabbitMQ、IBM MQ、Apache Qpid和HTTPSQS。

RabbitMQ简介

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

RabbitMQ支持以下操作系统:

- Windows
- Linux/Unix
- MAC OS X

RabbitMQ支持下列编程语言:

- C# (using .net/c# client)
- clojure (using Langohr)
- erlang (using erlang client)
- java (using java client)
- javascript/node.js (using amqp.node)
- perl (using Net::RabbitFoot)
- python (using pika)
- python-puka (using puka)
- ruby (using Bunny)
- ruby (using amqp gem)

RabbitMQ官网

阅读全文 »

引子

GDB 调试程序

给个例子程序

1
2
3
4
5
6
7
8
9
10
11
12
13
#include"stdio.h"
int add(int x,int y)
{
return x+y;
}

int main()
{
int p = add(6,5);
printf("%d\n",p);
return 0;
}

编译 gcc

1
2
3
4
5
6
7
8
[root@localhost cpp]# gcc add.cpp -o add.o
[root@localhost cpp]# ll -al
total 20
drwxr-xr-x. 2 root root 34 Oct 15 02:14 .
drwxr-xr-x. 4 root root 39 Oct 15 00:41 ..
-rw-r--r--. 1 root root 121 Oct 15 00:43 add.cpp
-rwxr-xr-x. 1 root root 12776 Oct 15 02:14 add.o
[root@localhost cpp]#
阅读全文 »

引子

为了让逐个编译的过程变成一条命令

3 书写规则

规则包含两个部分,一个是依赖关系,一个是生成目标的方法。

在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标。

好了,还是让我们来看一看如何书写规则

3.1 规则举例

1
2
foo.o : foo.c defs.h       # foo模块
cc -c -g foo.c

看到这个例子,各位应该不是很陌生了,前面也已说过,foo.o是我们的目标,foo.c和defs.h是目标所依赖的源文件,而只有一个命令“cc -c -g foo.c”(以Tab键开头)。这个规则告诉我们两件事:

  1. 文件的依赖关系,foo.o依赖于foo.c和defs.h的文件,如果foo.c和defs.h的文件日期要比foo.o文件日期要新,或是foo.o不存在,那么依赖关系发生。
  2. 生成或更新foo.o文件,就是那个cc命令。它说明了如何生成foo.o这个文件。(当然,foo.c文件include了defs.h文件)
阅读全文 »

引子

汇编不属性,现在拿来复习下

寄存器的分类

通用寄存器

寄存器 名称 作用
AX 通常用来保存函数的返回值
CX 计数器 用作计数器
DX
BX
SP 栈顶指针寄存器 保存栈顶地址
BP 栈底指针寄存器 保存栈底地址
SI 源变址寄存器 MOVS 或 STOS等指令
DI 目的变址寄存器

16位寄存器:(14个)

  • 4个数据寄存器(AX,BX,CX,DX)
  • 2个变址和指针寄存器(SI,DI)
  • 2个指针寄存器(SP,BP)
  • 4个段寄存器(ES,CS,DS,SS)
  • 1个指令指针寄存器(IP)
  • 1个标志寄存器(Flags)

32位寄存器:(16个)

  • 4个数据寄存器(EAX,EBX,ECX,EDX)
  • 2个变址和指针寄存器(ESI,EDI)
  • 2个指针寄存器(ESP,EBP)
  • 6个段寄存器(ES、CS、SS、DS、FS、GS)
  • 1个指令指针寄存器(EIP)
  • 1个标志寄存器(EFlags)

64位寄存器

  • 64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e ,而64位前8个使用了r代替e,也就是r 。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。
  • 32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值
  • 64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用
  • 64位支持一些形式的以PC相关的寻址,而32位只有在jmp的时候才会用到这种寻址方式。
阅读全文 »

引子

汇编

汇编应该如何调试程序

从哪里入手

一般看什么

有哪些调试工具可以使用

阅读全文 »

引子

汇编程序的逻辑

简单的汇编程序的结构

简单的模块

简单的汇编指令

一个HelloWorld例子

如何编译,运行

阅读全文 »

引子

前提

文章基于Unity 引擎
版本为 v2017.4

Unity 可扩展编辑区域

1. Inspector (属性视图)

2. Menu (菜单)

eg :

1
2
3
4
5
[MenuItem("Duan %g", false, 101)]
public static void Duan()
{

}
阅读全文 »

引子

Type 关键字

CSharp 中所有的类型都是 Type

获取 Type 的方法有三种

  1. 使用 typeof 运算符
1
Type t = typeof(int);
  1. 使用 getType() 方法
1
2
int i;
Type t = i.GetType();
  1. 使用Type类的静态方法 GetType()
1
Type t =Type.GetType("System.Double");
阅读全文 »