HTML
声明为html5文档HTML基础
HTML标题
一共有6个标题,分别用h1-h6来表示
HTML段落
<p></p>
浏览器会自动地在段落的前后添加空行
HTML拆行
如果希望在不产生一个新段落的情况下进行换行,可以使用<br>
标签
<p>这个<br>段落<br>演示了分行的效果</p>
文本格式化
<b>加粗文本</b>
<i>斜体文本</i>
<sub>下标</sub>
<sup>上标</sup>
<big>放大</big>
<small>缩小</small>
<code>计算机输出</code>
<kbd>键盘输入</kbd>
<tt>打字机文本</tt>
<samp>计算机代码样本</samp>
<var>计算机变量</var>
<address>地址</address>
<q>块引用</q>
- 预格式文本
- 跳出框架
是不局限于浏览器页面吗
HTML链接
<a href="https://www.baidu.com"></a>
<a href="mailto:someone@example.com?Subject=Hello%20again" target="_top">
<a href="mailto:someone@example.com?cc=someoneelse@example.com&bcc=andsomeoneelse@example.com&subject=Summer%20Party&body=You%20are%20invited%20to%20a%20big%20summer%20party!" target="_top">发送邮件!</a>
发送邮件</a>
单词之间空格使用%20代替,确保浏览器可以正常显示文本。
HTML图像
<img src="/images/logo.png" width="258" height="39" />
HTML水平线
<hr>
HTML注释
<!-- 这是一个注释 -->
XML学习
XML被设计用来传输和存储数据
HTML被设计用来显示数据
网络编程
nc 测试吞吐量
带宽
吞吐量
延迟
使用率
额外开销
策略中心主机部署
?什么是PL_BolPublic.ini
?dcc_sy.xml,dict_sy.xml和pl_dictionary.xml分别是什么
信控业务场景说明
流程图:
?预处理
PLCA信控测试流程(121421)绑定手机上网功能
预处理任务:
绑定手机上网阈值提醒事件,按合并组循环
?预处理规则
事件类型(EVENT_TYPE_ID)
循环模式(LOOP_TYPE)
?基础数据获取
用户资料,余额信息,历史欠费明细,总账明细,累积量量本
?策略匹配
?获取合并规则
?策略计算
每个合并的累积量实例都触发一次策略计算
?策略生成
?合并实例存在
?策略工单生成
各业务的流程图基本一样
阈值提醒
手机上网时长阈值提醒
手机上网流量阈值提醒
4G定向/闲时流量包等阈值提醒
人工触发
一般触发
大账户触发
其他阈值触发
语音短信wlan等阈值提醒
流量卡不足提醒
达量提醒及制定流量提醒
余额提醒
国际数据漫游-首次上网
策略中心新模型
策略工单
STOP_OPEN 停复机
ITF
REMD 实时
REMD_TIME 定时
ACCU 累积
OWE 余额
EXP 到期
ROAM 漫游
NEVERSTOP
LIFECYCLE
UNIFY 集团
REMIND 提醒
INTF
OTHER 其他
TRIGGER 触发
VIP 大账户
ORD
GEN 一般
MAN 人工
PLCA信控
用户个性化定制提醒
余额不足提醒
流量阈值提醒
WIFI上网时长提醒
短信阈值提醒
语音阈值提醒
套餐消费定期提醒
详单查询提醒
redis的操作
json数据格式
线程操作
ctg-mq消息
EOP
常用能力列表
其中有各种各样的函数
通讯录
业务逻辑
接口层:add del search travel
支持层:read write
链表操作:
链表而言:1.Insert 2.Remove
问题:
业务操作和数据结构没有分离,如何实现业务分离
如何解决scanf数组溢出的问题
#include <stdio>
#include <string.h>
#include <
#define NAME_LENGTH 16
#define PHONE_LENGTH 32
// 上线时可以把INFO定义为空,则不会进行打印输出
#define INFO printf
#define LIST_INSERT(item, list) do { \
item->prev = null; \
item->next = list; \
list = item; \
} while(0)
#define LIST_DELETE(item, list) do { \
if(item->prev != NULL) \
{ \
item->prev->next = item->next; \
} \
if(item->next != NULL) \
{ \
item->next->prev = item->prev; \
} \
item->prev = item->next = NULL \
} while(0);
struct person {
char name[NAME_LENGTH];
char phone[PHONE_LENGTH];
struct person *next;
struct person *prev;
};
struct contacts {
struct person *people;
int count;
};
enum {
OPER_INSERT = 1,
OPER_PRINT,
OPER_DELETE,
OPER_SEARCH,
OPER_SAVE,
OPER_LOAD
}
// define interface
int person_insert(struct person **person, struct person *ps)
{
if(ps == NULL)
return -1;
LIST_INSERT(ps, people);
}
int person_delete(struct person *people, struct person *ps)
{
if(ps == NULL)
return -1;
LIST_REMOVE(ps, people);
return 0;
}
int person_search(struct person *person, char *name)
{
struct person *item = NULL;
for(item = people; item != NULL; item = item->next)
{
if(strcmp(name, item->name))
{
break;
}
}
return item;
}
int person_traversal(struct person *person)
{
struct person *item = NULL;
for(item = people; item != NULL; item = item->next)
{
INFO("name:%s,phone:%s,\n",item->name, item->phone);
}
}
int insert_entry(struct contacts *cts)
{
if(cts == NULL)
return -1;
struct person *p = (struct person*)malloc(sizeof(struct person));
if(p == NULL)
return -2;
// name
INFO("Please Input Name:\n");
scanf("%s", p->name);
// phone
INFO("Please Input Phone:\n");
scanf("%s", p->phone);
// add people
if(0 != person_insert(cts->people, p))
{
free(p);
return -3;
}
cts->count++;
INFO("Insert Success\n");
return 0;
}
intp print_entry(struct contacts *cts)
{
// cts->people
if(cts == NULL)
return -1;
person_traversal(cts->person);
}
int delete_entry(struct contacts *cts)
{
// name
if(cts == NULL)
return -1;
INFO("Please Input Name:\n");
char name[NAME_LENGTH] = {0};
scanf("%s",name);
// person
struct person *ps = person_search(cts->people, name);
if(ps == NULL)
{
INFO("Person don't exist\n");
return -2
}
// delete
person_delete(&cts->person, name);
}
int search_entry(struct *cts)
{
if(cts == NULL)
return -1;
INFO("Please Input Name:\n");
char name[NAME_LENGTH]={0};
scanf("%s", name);
if(ps == NULL)
{
INFO("Person don't exist\n");
return -2
}
INFO("name:%s,phone:%s\n",cts->name, cts->phone);
}
int main() {
{
while(1){
int select = 0;
scanf("%d",&select);
switch(select)
{
case OPER_INSERT:
break;
case OPER_PRINT:
break;
case OPER_DELECT:
break;
case OPER_SEARCH:
break;
case OPER_TRAVER:
break;
}
}
}
C学习
Bug分为:
编译时错误
运行时错误
逻辑错误和语义错误
- gcc
-Wall选项可以让gcc提示所有的警告信息
-S 生成汇编文件
-c 生成目标文件
-o 生成可执行文件
-masm=intel 生成Intel格式的汇编代码 - objdump
反汇编
做任何项目,任何产品都需要分层次,这样调试和修改都会十分方便
fopen:打开一个文件
fprintf:按照指定的格式写入文件
fflush:从内存中同步到磁盘中
fclose:关闭一个打开的文件
feof:是否已经读到了文件的结尾
fgets:读取一行
greater()从大到小排序
less()从小到大排序
multimap()是有序的键值对,默认的比较键的函数是less<K>()
。
协程
做什么?
与线程差不多,为什么需要协程?
服务器端:
协程更快?
服务器每增加1000个链接所用到的耗时为5000+ms。
服务器每增加1000个链接所用的耗时,900ms。
协程用在服务器上,用在客户端上
- 服务器定时检测io是否有数据, epoll/select
epoll wait() - 对io进行读写操作
recv()/send()
同时listen 100个端口
工程师只认可数据上面的对比
CMake语法
STREQUAL用于比较字符串,相同则返回true
MATCHES 如果给定的字符串或变量值或给定的正则表达式匹配的话,表达式返回真。
并发
自旋锁:spinlock
while(1)不断检测,锁的内容较少,等待时间的代价小于切换的代价
互斥锁:mutex
引起线程切换,锁的内容较多时,当被锁住时,该线程sleep
什么时候用自旋锁,什么时候用互斥锁
原子操作
单条cpu指令操作,多条指令变为一条指令
CAS -> Compare And Swap 对比交换
linux
本地到远程
scp -r ./LeetCode hua@192.168.79.130:/home/hua/Code/
linux网络库所在位置
- du的代替:ncdu
查看磁盘空间 - top
查看进程,资源占用 - man
命令文档 - sed/grep
- find
SLAM想法
ACNet: Attention Based Network to Exploit Complementary Features for RGBD Semantic Segmentation
sudo apt-get
#
Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
辅助
代码浏览:
- 安装doxygen:sudo apt-get install doxygen doxygen-gui graphviz
- 生成doxygen文档:doxygen open_vins/Doxyfile
LeetCode
174. 地下城游戏
- 动态规划
主要是要反着思考,动态规划可以用于二维数组的问题 - DFS
直接用DFS速度较慢,利用空间来优化,还有需要做相应的剪枝,不然会超时
315. 计算右侧小于当前元素的个数
- 离散化树状数组
- 归并排序