数据库中存储的是html序列化后的文本
前端页面获取时只需要使用v-html标签即可
<p v-html=item.content>{{item.content}}</p>
展示效果
1.1、STL的诞生
长久以来,软件界一直希望建立一种可重复利用的东西 c++的面向对象和泛型编程思想,目的就是复用性的提升 大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量的重复的工作 为了建立数据结构和算法的一套标准,诞生了STL 1.2、STL基本概念
STL(standard tmplate libary),标准模板库 STL从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator)、 容器和算法之间同过迭代器进行无缝连接 STL几乎所有的代码都采用了模板类或者模板函 1.3、STL六大组件
STL大体分为六大组件:
分别是: 容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
1.容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
2.算法:各种常用的算法,如sort、find、copy。for_each等
3.迭代器:扮演了容器与算法之间的胶合剂
4.仿函数:行为类似函数,可以作为算法的某种策略
5.适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
6.空间配置器:负责空间配置与管理
1.4、STL中容器、算法、迭代器
容器:置物之所也
STL容器就i是将运用最广泛的一些数据结构实现出来
常用的数据结构:数组、列表、树、栈、队列、集合、映射表 等
这些容器分为 序列是容器 和 关联式容器 两种:
序列式容器:强调值的排序,序列式容器中的每一个元素均有固定的位置
关联式容器:二叉树结构,各种元素之间没有严格的物理上顺序关系
算法:问题之解法也
有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)
算法分为:质变算法和非质变算法。
质变算法:是指运算过程中更改区间内的元素的内容,如拷贝、替换、删除等等
非质变算法:是指运算过程中不会更改区间内的元素内容,如查找、计数、遍历、寻找极值等等
迭代器:容器和算法之间的胶合剂
提供一种方法,使之能够依靠寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式
每个容器都有自己的专属的迭代器
迭代器使用非常类似指针,初学阶段我们可以先理解迭代器为指针
迭代器种类:
常用的容器中迭代器种类为双向迭代器,和随机访问迭代器
1.5、容器算法、迭代器、初始
了解STL中容器、算法、迭代器概念之后,我们利用代码感受一下STL的魅力
STL中最常用的容器为Vector,可以理解为数组,下面我们将学习如何向这个容器中插入数据,下面我们将学习如何向这个容器中插入数据,并遍历这个容器
简介: 大大的红色,想办法消除了吧,https是加密的,更安全的协议。只要加上证书就好了,我使用的dnspod动态域名,可以免费申请1年期的证书。
一:动态域名申请证书 这里申请,只要填上你的域名,邮箱,等几个小时就可以了。
二:下载对应服务器的证书 有通知以后,这个就变绿了,再次点击就变下载。
看看说明总是不吃亏的。
三:配置证书 创建配置文件:/etc/nginx/conf.d/base.conf
不要想改uci.conf,改不了的。
实际使用,你应该复制uci.conf当中 server一整段,过来。
然后修改location以外的东西。
具体我用的如下:
server { listen 443 ssl ; listen [::]:443 ssl ; include restrict_locally; include conf.d/*.locations; server_name ***.jack****.***; ssl_certificate /etc/nginx/conf.d/***.jack****.***.crt; ssl_certificate_key /etc/nginx/conf.d/***.jack****.***.key; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; } 四:尝试访问 域名没问题,IP就不行了
[email protected] package.json源码 { name: vue, version: 0.6.0, author: { name: Evan You, email:
[email protected], url: http://evanyou.me }, license: MIT, description: A mini front-end MVVM framework, keywords: [ mvvm, browser, framework ], main: src/main.js, repository: { type: git, url: https://github.com/yyx990803/vue.git }, scripts: { test: grunt test }, devDependencies: { grunt: ~0.4.2, grunt-contrib-watch: ~0.5.3, grunt-component-build: ~0.4.1, grunt-contrib-jshint: ~0.7.1, grunt-contrib-uglify: ~0.2.7, grunt-mocha: ~0.4.6, jscoverage: ~0.3.8, jshint-stylish: 0.1.3, semver: ~2.2.1 }, __npminstall_done: true, _from: vue@0.
利用PLSQL导出ORACLE中的索引和主键,外键DDL语句 在数据库迁移过程中,如果能够获取到表的主键和索引信息的创建DDL语句,那将大大方便了我们的迁移过程。
当然了,也可以利用如数据泵之类的工具来直接导出对应的信息,但是不必直接获取对应的ddl来的方便。
但是传统的方法采用DBMS_METEDATA.GET_DDL包来获取对应的DDL语句,也受限于DDL语句的长度,如果语句长度太长,则显示不完整。
下面分享一条语句可以直接将对应的DDL语句获取出来。
SELECT T.TABLE_NAME , --表名 T.INDEX_NAME , --索引名 I.UNIQUENESS , --是否非空 I.INDEX_TYPE , --索引类型 C.CONSTRAINT_TYPE , --键类型 WM_CONCAT(T.COLUMN_NAME) COLS, (CASE WHEN C.CONSTRAINT_TYPE = 'P' OR C.CONSTRAINT_TYPE = 'R' THEN --主键和外键创建脚本拼接 'ALTER TABLE ' || T.TABLE_NAME || ' ADD CONSTRAINT ' || T.INDEX_NAME || (CASE WHEN C.CONSTRAINT_TYPE = 'P' THEN ' PRIMARY KEY (' ELSE ' FOREIGN KEY (' END) || WM_CONCAT(T.COLUMN_NAME) || ');' ELSE --索引创建脚本拼接 'CREATE ' || (CASE WHEN I.
此实验对于本人来说难点有四个:1.阅读的材料很长,但是基本全是干货.2.对于各个寄存器转移的是字节还是字不够明确.3.在编程中的逻辑不够顺畅,4.汇编基本共不扎实.此实验不是我本人独立完成,看了网上鱼C的视频讲解和一些稳炸过以后完成的.
由于时间关系我只能熟悉汇编,看得懂汇编的代码,为后面的微机原理做准备,故在这个时间段内不会对汇编进行深究。希望以后的我看到此段话语明白自己学的很不好,若工作生活中用到汇编请重新好好在学习一遍!
1.对于材料:要求:在屏幕中央输入:“welcome to masm!”,这个字符串在屏幕中央字体和字体背景有不同的颜色。字体和字体北京称为字符串的属性,属性被记录在属性字节当 7 6 5 4 3 2 1 0
中。属性字节的格式为: 含义:BL R G B I R G B 需要哪个属性哪个属性对应的比特位就为1.如红底绿字:0100_0000B.
闪烁 背景 高亮 前景 既然是显示,就要将其送入显存中.显存的空间为:B8000H-B8F9FH.占据整个显示屏的25行,内行有160个字节。所以通过简单的数学计算,在屏幕中间的应该是第12,13,14行,第12行中第80个字节,即为第11*160+64个字节。换算成16进制为720.所以储存位置为:0B8000h+720H=0B8720H.我们将这个当作段地址.将字符串和字符串的属性送入该段地址之后的地址即可完成题目要求.
2.想法如下:
i).需要三个寄存器一个保存字符串的字节,一个保存字符串属性的字节,一个负责接收字符串加属性(字节加字节就是一个字)。
ii)利用循环一个一个送进去
iii)完成一个以后,完成剩下两个。
3.代码如下:
assume cs:code
data segment
db 'welcome to masm!' ;定义每个字母为一个字节
db 02H,24H,71H ;定义字符串的属性,这里将二进制的属性转换为16进制。如02h就是绿色
data ends
stack segment
dw 0,0,0,0,0,0,0,0 ;定义16个字节的栈空间
stack ends
code segment
start: mov ax,data ;无脑先把data地址数据送进ax寄存器
mov es,ax ;将data段地址送进段寄存器es
现象 构建python服务镜像。在使用k8s pod部署时,kubectl logs不显示日志,而过段时间kubectl logs又能够看到日志。
其中,容器内通过
python main.py 启动python服务所有的日志使用print打印。
在使用docker run 启动容器时,docker logs 能够查看日志
根因结论 在k8s启动的pod会触发python print的buffer,导致print不能直接输出到控制台。只有当buffer满了才会输出到控制台
快速解决 参考链接 修改dockerfile,将最后 python main.py 改为
python -u main.py 根因分析 k8s pod底层继承于docker的deamon机制,即将pid为1的主程序以及其子程序的标准控制台输出追踪,并存储至/var/lib/docker/containers/<容器id>/<容器id>-json.log。
在使用docker logs/kubectl logs进行日志获取
参考链接 因此在部署python的容器服务时,docker logs/kubectl logs获取不到的主要原因是print的标准控制台输出,产生了buffer,导致控制台输出不及时。解决该缓存问题或者禁止buffer即可
关于C++中的数组名是似乎一直没搞懂、但也没花时间研究的问题,今天被同学问道(虽然不是直接遇到),又想起了这个悬而未决的疙瘩,于是决定花时间复习下
数组名和指针的关系 在我学习C++的教材(谭浩强)中我一直记得是“数组名就是指针” 但后面的实践中我发现可能不是这么简单 比如:定义一个静态数组,但后sizeof()
int a[10]; cout << sizeof(a) << endl; // 输出是40,即int的大小4*数组长度10 int* b = a; cout << sizeof(b) << endl; //输出是8,一个指针变量的大小 如果数组名只是一个单纯的指针的话,难道不是应该输出8?一个指针变量的大小 这个问题衍生出了数组作为参数传参的问题 于是我决定翻开我珍藏许久(没翻过)的《C++ Primer》打算重新学习一下
狡辩:我觉得这书可能更适合当工具书
然而,数组还有一个特性,在很多用到数组名字的地方,编译器都会自动将其替换为一个指向数组首元素的指针 数组名不是简单的指针,而且数组名不可修改(指针常量)
数组传参的问题 void test(const int* a); void test(const int a[]); void test(const int a[10]); // 不管传哪个都会被看作是一个指针常量
今日内容概要 短信登陆接口 短信注册接口 登陆注册前端 redis介绍和安装 内容详细 1、短信登陆接口 在视图类 user/views.py中修改并添加: from .serializer import MulLoginSerializer, SmsLoginSerializer # RegisterSerializer class LoginView(GenericViewSet): serializer_class = MulLoginSerializer queryset = User # 两个登陆方式都写在这里面(多方式,一个是验证码登陆) # login不是保存,但是用post,咱们的想法是把验证逻辑写到序列化类中 @action(methods=[post], detail=False) def mul_login(self, request): return self._common_login(request) # 127.0.0.1:8000/api/v1/user/login/sms_login @action(methods=[post], detail=False) def sms_login(self, request): # 默认情况下使用的序列化类使用的是MulLoginSerializer---》多方式登陆的逻辑-->不符合短信登陆逻辑 # 再新写一个序列化类,给短信登陆用 return self._common_login(request) def get_serializer_class(self): # 方式一: # if 'mul_login' in self.request.path: # return self.serializer_class # else: # return SmsLoginSerializer # 方式二 if self.
随着短视频的大火,不仅可以给人们带来娱乐,还有热点新闻时事以及各种知识,刷短视频也逐渐成为了日常生活的一部分。本文以一个简单的小例子,简述如何通过Pyhton依托Selenium来爬取短视频,仅供学习分享使用,如有不足之处,还请指正。
涉及知识点 selenium,作为浏览器端一个自动化测试工具,可以模拟用户操作浏览器的动作,就像是人自己操作浏览器一样。关于selenium的具体信息如下 Selenium进行元素定位,主要有ID,Name,ClassName,Css Selector,Partial LinkText,LinkText,XPath,TagName等8种方式。 Selenium获取单一元素(如:find_element)和获取元素数组(如:find_elements)两种方式。 Selenium元素定位后,可以给元素进行赋值和取值,或者进行相应的事件操作(如:click)。 requests,web请求对象,通过selenium获取到视频的url后,再通过requests库进行视频流的获取,然后保存成本地视频文件。 浏览器开发者工具,通过开发者工具可以查看页面上某一个按钮或链接等页面元素对应的html标识。 目标分析 在爬取视频之前,需要分析目标结构,本视频爬取分析可分为三步,具体如下所示:
1. 分析热榜目录 热榜目录是一个ul标签,每一个热榜对象一个li子标签,分别包含热度,标题等内容。点击标题链接可以进入具体视频播放页面,目标分析如下所示:
2.分析视频播放页面 视频在video标签中播放,短视频播放的真实地址,在video的source子标签中,且为了保证播放质量,video下有三个source,任取其一即可,如下所示:
3. 分析弹出框 在爬取过程中,经过弹出需要登录的窗口,需要及时关闭掉,否则可能会导致找不到页面元素,从而爬取不成功。如下所示:
核心代码 经过以上分析,就可以编写爬虫代码了,如下所示:
1. 遍历热点目录 通过获取页面上对应的信息,解析出热点视频的目录,如下所示:
1 self.__driver.get(self.__url) 2 self.close_popup_window() 3 # 4. 最大化窗口 4 self.__driver.maximize_window() 5 time.sleep(self.__wait_sec) 6 # 打开以后,根据class=BHgRhxNh获取ul下的li 7 if self.checkIsExistsByClass(cls='BHgRhxNh'): 8 # 获取 9 hots = self.__driver.find_elements(by=By.CLASS_NAME, value='BHgRhxNh') 10 hot_infos = [] 11 index = 0 12 for hot in hots: 13 hot_info = {} 14 a = hot.