最近,我突发奇想去翻阅了一些我本科期间所做的一些小项目,发现都挺有意思的!当年做这些项目的时候可走了很多弯路,所以想着可以将它们上传到网络上,并通过我的讲解文章可以帮助你们少走一些弯路!
今天,我要分享的是一个0.96寸OLED(SSD1306)屏幕显示的学习笔记,因为我想要讲的详细一点,所以打算做成一个系列,手把手地教你学习和认识屏幕显示。由于我知识有限,如果出现一些错误,希望大家可以帮助我指出来,我们一起学习进步!!!
OLED,即有机发光二极管( Organic Light Emitting Diode )。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
本文采用的是7针的0.96寸OLED显示进行讲解,采用的是SPI协议,速度会比采用I2C协议的更快,但这两者的显示驱动都一样,本质上没有太大差别。屏幕整体分辨率为128*64,有黄蓝、白、蓝三种颜色可选,驱动芯片为SSD1306,下面是引脚功能介绍。
| 名称 | 注释 |
|---|---|
| GND | 接地 |
| VCC | 3.3-5v |
| D0 | SPI中的时钟管脚——SCK |
| D1 | SPI中的数据管脚——MOSI |
| RES | 复位引脚(低电平有效) |
| DC | 数据/命令控制脚 |
| CS | 片选引脚 |
GDDRAM是位映射静态RAM,大小为 128x64 位。GDDRAM分为8页(PAGE0~PAGE7),每页内 1个SEG对应1Byte数据,一页由 128 Byte 组成。一帧显示数据为 1024 Byte(1KB)。即屏幕每8行像素点(8*PIXEL)记为一页(PAGE),64行即为8页,则屏幕变为128列(ROW)8页(PAGE),若要显示整个屏幕,则需要128*8个1字节数。
页寻址模式下,寻址只在一页(PAGEn)内进行,地址指针不会跳到其他页。每次向GDDRAM写入1byte显示数据后,列指针会自动+1。当128列都寻址完之后,列指针会重新指向SEG0而页指针仍然保持不变。通过页寻址模式我们可以方便地对一个小区域内数据进行修改。
一个数据字节写入GDDRAM时,当前列(SEG)同一页(PAGE)的所有行(COM)图像数据都被填充(即由列地址指针指向的整列(8位)被填充)。数据位D0写入顶行,数据位D7写入底行(由上到下,由低到高)。还有水平寻址和垂直寻址,本系列文章并没有用到,故不进行介绍,想要了解的小伙伴可以自行了解。
1、设置屏幕显示开启与关闭(AEH / AFH)
- AEH 开启屏幕
- AFH 关闭屏幕
2、设置GDDRAM寻址模式(20H + A[1:0])
- 00H 水平寻址
- 01H 垂直寻址
- 02H 页寻址
3、设置起始页地址(B0H ~ B7H)
- B0H~B7H 分别设置起始页为 0~7
4、设置输出行扫描顺序(C0H / C8H)
- C0H 显示上下颠倒
- C8H 正常
5、设置输出列扫描顺序(A0H / A1H)
- A0H 显示左右颠倒
- A1H 正常
6、设置颜色显示方式(A0H / A1H)
- A7H 反相显示
- A6H 正常显示
7、设置起始行地址(40H / 7FH)
- 40H 设置显示起始行地址为第0行
- 7FH 设置显示起始行地址为第63行
8、设置屏幕对比度(81H + 00H~FFH)
- 00H~FFH 默认0X7F(亮度设置,越大越亮)
9、设置复用率(A8H + A[5:0])
- 0FH~3FH 复用率为 1~64
10、设置全屏全亮(A4H / A5H)
- A4H 设置显示模式为正常模式,此时屏幕输出GDDRAM中的显示数据
- A5H 设置显示模式为全亮模式,此时屏幕无视GDDRAM中的数据,并点亮全屏
11、设置分频因子与震荡频率(D5H + {A[3:0]:分频系数,A[7:4]震荡频率})
- F0H 频率设置成最高407 kHz,分频系数为1
12、设置预充电周期(D9H + A[7:0])
- 22H 设置为默认值2DCLK
13、设置Vcomh电压(DBH + A[6:4])
- 00H ~0.65 x VCC
- 20H ~0.77 x VCC (RESET)
- 30H ~0.83 x VCC (RESET)
14、设置COM引脚硬件配置(DAH + A[5:4])
- 12H 使用备选引脚配置,并禁用左右反置
15、设置电荷泵(8DH + A[2])
- 14H 使能电荷泵
- 10H 关闭电荷泵
void OLED_SSD1306_Init(void)
{
// GPIO初始化
OLED_GPIO_Init();
// SPI初始化
OLED_SPI_Init();
//延时1秒稳定端口状态
SysTick_Delay_ms(1000);
/* 复位 */
OLED_RES_LOW();
SysTick_Delay_ms(10);
/* 复位正常信号 SSD1306: RES引脚高电平 */
OLED_RES_HIGH();
OLED_Write_Cmd(0xAE); //关闭显示
OLED_Write_Cmd(0x20); //设置模式
OLED_Write_Cmd(0x10); //设置为页显示模式
OLED_Write_Cmd(0xb0); // 设置起始页的地址模式 0-7
OLED_Write_Cmd(0xc8); // 0xc0上下反置 0xc8正常
// OLED_Write_Cmd(0x00); // ---set low column address,初始化设置了没用,因为OLED_SetPos函数中会重设
// OLED_Write_Cmd(0x10); // ---set high column address,初始化设置了没用,因为OLED_SetPos函数中会重设
OLED_Write_Cmd(0x40); //--set start line address,从RAM中哪一行起读取显示内容
OLED_Write_Cmd(0x81); //设置对比度
OLED_Write_Cmd(0xff); //亮度调节 0x00~0xff
OLED_Write_Cmd(0xa1); // 0xa0左右反置 0xa1正常
OLED_Write_Cmd(0xa6); //设置显示方式;bit0:1,反相显示;0,正常显示
OLED_Write_Cmd(0xa8); //--set multiplex ratio(1 to 64)
OLED_Write_Cmd(0x3F); //
OLED_Write_Cmd(0xa4); //全局显示开启;0xa4正常,0xa5无视命令点亮全屏
OLED_Write_Cmd(0xd3); //-set display offset
OLED_Write_Cmd(0x00); //-not offset
OLED_Write_Cmd(0xd5); //设置时钟分频因子,震荡频率
OLED_Write_Cmd(0xf0); //[3:0],分频因子;[7:4],震荡频率
OLED_Write_Cmd(0xd9); //--set pre-charge period
OLED_Write_Cmd(0x22); //
OLED_Write_Cmd(0xda); //--set com pins hardware configuration
OLED_Write_Cmd(0x12);
OLED_Write_Cmd(0xdb); //--set vcomh
OLED_Write_Cmd(0x20); //0x20,0.77xVcc
OLED_Write_Cmd(0x8d); //设置电荷泵开关
OLED_Write_Cmd(0x14); //开
OLED_Write_Cmd(0xaf); //开启显示
}
取字模软件使用的是PCtoLCD2002完美版,使字符串和图像变成字节数据,从而可以显示在OLED屏幕上。由于我们上文中OLED屏幕寻址模式选择的是页寻址以及硬件结构,所以一定要在字模选项中选择阴码、列行式、逆向、C51格式。
0.96寸OLED显示中英文字符串动态图

英文字符串显示
/**
* @brief OLED_ShowStr,显示codetab.h中的ASCII字符,有6*8和8*16可选择
* @param x,y : 起始点坐标(x:0~127, y:0~7);
* ch[] :- 要显示的字符串;
* TextSize : 字符大小(1:6*8 ; 2:8*16)
* @retval 无
*/
void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{
unsigned char c = 0,i = 0,j = 0,k = 0;
switch(TextSize)
{
case 1:
{
while(ch[j] != '\0')
{
c = ch[j] - 32;
if(x > 122)
{
x = 0;
y++;
}
/**/
for(i=0;i<6;i++)
{
for(k=0;k<8;k++)
{
// 先取低位
if(F6x8[c][i]&(0x01<<k))
{
OLED_Set_Pixel(x+i, y*8+k,1);
}
else
{
OLED_Set_Pixel(x+i, y*8+k,0);
}
}
}
x += 6;
j++;
}
}break;
case 2:
{
while(ch[j] != '\0')
{
c = ch[j] - 32;
if(x > 120)
{
x = 0;
y=y+2;
}
/*先构建上半部分*/
for(i=0;i<8;i++)
{
for(k=0;k<8;k++)
{
// 先取低位
if(F8X16[c*16+i]&(0x01<<k))
{
OLED_Set_Pixel(x+i, y*8+k,1);
}
else
{
OLED_Set_Pixel(x+i, y*8+k,0);
}
}
}
for(i=0;i<8;i++)
{
// 先取低位
for(k=0;k<8;k++)
{
if(F8X16[c*16+i+8]&(0x01<<k))
{
OLED_Set_Pixel(x+i, (y+1)*8+k,1);
}
else
{
OLED_Set_Pixel(x+i, (y+1)*8+k,0);
}
}
}
x += 8;
j++;
}
}break;
}
OLED_Refresh_Gram();
}
中文字符串显示
/**
* @brief GUI_ShowFont16,将Font16*16的中文字符显示出来
* @param x : 中文字符串显示的起始位置x(0-127)
y : 中文字符串显示的起始位置y(0-63)
*s : 中文字符串的指针
mode : 0 - 白背景显示黑字符
1 - 黑背景显示白字符
* 2 - 将数据放到长数组里
* @retval 无
*/
void GUI_ShowFont16(uint16_t x,uint8_t y,uint8_t *s,uint8_t mode)
{
uint8_t i,j,k,tmp;
uint16_t num;
num = sizeof(cfont16)/sizeof(typFNT_GB16);
for(i=0;i<num;i++)
{
// 中文字符串进行匹配
if((cfont16[i].Index[0]==*s)&&(cfont16[i].Index[1]==*(s+1)))
{
for(j=0;j<32;j++)
{
if(mode)
{
tmp = cfont16[i].Msk[j];
}
else if(mode==0)
{
tmp = ~(cfont16[i].Msk[j]);
}
for(k=0;k<8;k++)
{
if(tmp&(0x01<<k))
{
if(mode == 2)
{
OLED_Set_Pixel(x+(j%16), y+(j/16)*8+k,11);
}
else
{
OLED_Set_Pixel(x+(j%16), y+(j/16)*8+k,1);
}
}
else
{
if(mode == 2)
{
OLED_Set_Pixel(x+(j%16), y+(j/16)*8+k,10);
}
else
{
OLED_Set_Pixel(x+(j%16), y+(j/16)*8+k,0);
}
}
}
}
break;
}
}
}
/**
* @brief OLED_ShowCN显示中文字符串
* @param x : 中文字符串显示的起始位置x(0-127)
y : 中文字符串显示的起始位置y(0-7)
*str : 中文字符串的指针
mode : 0 - 白背景显示黑字符
1 - 黑背景显示白字符
* @retval 无
*/
void OLED_ShowCN(uint8_t x,uint8_t y,uint8_t *str,uint8_t mode)
{
// 字符串宽度是16
uint8_t hsize=16;
y = y*8;
while(*str!='\0')
{
if(hsize == 16)
{
GUI_ShowFont16(x,y,str,mode);
}
else
{
return;
}
x+=hsize;
// 最大128行
if(x>128-hsize)
{
x=0;
y+=hsize;
}
str+=2;
}
// 刷新屏幕
OLED_Refresh_Gram();
}
codetab.h
// GB16中文显示结构体
typedef struct
{
unsigned char Index[2]; // 一个汉字占2个字节,16位
char Msk[32];//
}typFNT_GB16;
// 宏定义最多显示的中文字符串长度
#define LONG_CN_LEN 20
/***************************点阵字体取模方式:共阴——列行式——逆向输出*********/
const typFNT_GB16 cfont16[] =
{
" ",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
"我",0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00,/*"我",0*/
"是",0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00,0x00,0x81,0x41,0x21,0x1D,0x21,0x41,0x81,0xFF,0x89,0x89,0x89,0x89,0x89,0x81,0x81,0x00,/*"是",1*/
"羌",0x00,0x08,0x48,0x48,0x49,0x4E,0xC8,0x78,0x48,0x4C,0x4B,0x48,0x48,0x08,0x00,0x00,0x82,0x82,0x42,0x22,0x12,0x0E,0x03,0x02,0x7E,0x82,0x82,0x82,0x82,0x82,0xE2,0x00,/*"羌",3*/
"族",0x10,0x10,0xF1,0x96,0x90,0x90,0x10,0x08,0xF7,0x44,0xC4,0x44,0x44,0x44,0x04,0x00,0x80,0x60,0x1F,0x40,0x80,0x7F,0x04,0x85,0x44,0x34,0x0F,0x34,0x44,0x84,0x84,0x00,/*"族",4*/
"小",0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00,0x08,0x04,0x03,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x01,0x0E,0x00,/*"小",5*/
"煞",0x10,0x28,0x27,0x24,0x34,0x2C,0xE0,0x20,0x10,0x6C,0x8B,0x08,0x88,0x78,0x08,0x00,0x88,0x69,0x09,0x09,0x29,0xC9,0x0F,0x00,0x30,0xC8,0x05,0x02,0x25,0xC8,0x10,0x00,/*"煞",6*/
};
/************************************6*8的点阵************************************/
const unsigned char F6x8[][6] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #
0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %
0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '
0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (
0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )
0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,
0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .
0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :
0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <
0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =
0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >
0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y
0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [
0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]
0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^
0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _
0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines
};
本系列所用单片机型号为STM32F103VE,后续我会把本节所涉及的工程及相关资料放在评论区,大家自取!请大家多多点赞、多多收藏、感谢支持!!!我会继续输出优质内容的!!!加油!加油!🌸🌸🌸
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建
在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]