本专栏是以杨秀璋老师爬虫著作《Python网络数据爬取及分析「从入门到精通」》为主线、个人学习理解为主要内容,以学习笔记形式编写的。 本专栏不光是自己的一个学习分享,也希望能给您普及一些关于爬虫的相关知识以及提供一些微不足道的爬虫思路。专栏地址:Python网络数据爬取及分析「从入门到精通」 更多爬虫实例详见专栏:Python爬虫牛刀小试
前文回顾: 「Python爬虫系列讲解」一、网络数据爬取概述 「Python爬虫系列讲解」二、Python知识初学 「Python爬虫系列讲解」三、正则表达式爬虫之牛刀小试 「Python爬虫系列讲解」四、BeautifulSoup 技术 「Python爬虫系列讲解」五、用 BeautifulSoup 爬取电影信息 「Python爬虫系列讲解」六、Python 数据库知识 「Python爬虫系列讲解」七、基于数据库存储的 BeautifulSoup 招聘爬取 「Python爬虫系列讲解」八、Selenium 技术 「Python爬虫系列讲解」九、用 Selenium 爬取在线百科知识 「Python爬虫系列讲解」十、基于数据库存储的 Selenium 博客爬虫 「Python爬虫系列讲解」十一、基于登录分析的 Selenium 微博爬虫 「Python爬虫系列讲解」十二、基于图片爬取的 Selenium 爬虫
目录
1 安装 Scrapy
2 快速了解 Scrapy
2.1 Scrapy 基础知识
2.2 Scrapy 组成详解及简单示例
2.2.1 新建项目
2.2.2 定义 Item
2.2.3 提取数据
2.2.4 保存数据
3 用 Scrapy 爬取农产品数据集
3.1 创建工程
3.2 设置 items.py 文件
3.3 浏览器审查元素
3.4 创建爬虫并执行
3.5 实现翻页爬取及多页爬取功能
3.6 设置 pipelines.py 文件保存数据至本地
3.7 设置 settings.py 文件
4 本文小结
如果您从爬虫系列讲解一直看到这里时,相信已经初步了解了 Python 爬取网络数据的知识,甚至能利用正则表达式、BeautifulSoup 或 Selenium 技术爬取所需的语料,但这些技术也存在一些问题,比如爬取效率较低。
本文将介绍 Scrapy 技术,其爬取效率较高,是一个爬取网络数据、提取结构性数据的应用框架,将从安装、基本用法和爬虫实例 3 个方面对其进行详细介绍。
1 安装 Scrapy
本爬虫专栏系列主要针对的是 Windows 环境下的 Python 编程,所以安装的 Scrapy 扩展库也是基于 Windows 环境下的。在 Python 的 Scripts 文件夹下输入 Python 的 pip 命令进行安装。
值得注意的是,因为scrapy框架基于Twisted,所以先要下载其whl包安装。
Twisted 下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/
搜索 twisted,根据自己的版本下载进行安装,之后在 cmd 中输入类似如下 pip 命令
pip install *****.whl
注:***.whl 是下载到本地的路径地址(可在属性→安全中查看)
之后安装 Scrapy,scrapy的whl包地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/
pip install *****.whl
注:***.whl 是下载到本地的路径地址(可在属性→安全中查看)
安装成功之后,通过 cmd 输入 “scrapy” 查看其所包含的指令,如下图所示。
2 快速了解 Scrapy
Scrapy 官网地址为:https://scrapy.org/,官方介绍为“An open source and collaborative framework for extracting the data you need from websites.In a fast, simple, yet extensible way.”。
Scrapy 是一个为了快速爬取网站数据、提取结构性数据而编写的应用框架,其最初是为了页面爬取或网络爬取设计的,也可用于获取 API 所返回的数据,如 Amazon Associates Web Services 或者通用的网络爬虫,现在被广泛应用于数据挖掘、信息爬取或 Python 爬虫等领域。
2.1 Scrapy 基础知识
下图所示的是 Scrapy 官网首页,推荐大家从官网学习该工具的用法并实行先相关爬虫案例,这里结合作者的相关经验和官网知识对 Scrapy 进行讲解。
Scrapy 爬虫框架如下图所示,它使用 Twisted 异步网络库来处理网络通信,包含各种中间接口,可以灵活地完成各种需求,只需要定义几个模块,皆可以轻松地爬取所需要的数据集。
上图这种的基本组件介绍如下表所示:
Scrapy 框架的组件介绍
组件
介绍
Scrapy Engine
Scrapy 框架引擎,负责控制数据流在系统所有组件中的流动,并在相应动作发生时触发该事件
Scheduler
调度器,从引擎接受请求(Request)并将它们入队,以便之后引擎请求他们时提供给引擎
Downloader
下载器,负责提取页面数据并提供给引擎,而后提供给爬虫
Spiders
爬虫,它是 Scrapy 用户编写用于分析响应(Response)并提取项目或额外跟进 URL 的类。每个爬虫负责处理一个特定网站或一些网站
Item Pipeline
项目管道,负责处理被爬虫提取出来的项目。典型的处理包括清理、验证及存到数据库中
Downloader Middlewares
下载器中间件,它是 Scrapy 引擎和下载器之间的特定钩子,处理下载器传递给引擎的响应(也包括 Scrapy 引擎传递给下载器的请求),它提供了一个简便的机制,通过插入自定义代码来扩展 Scrapy 功能
Spider Middlewares
爬虫中间件,它是 Scrapy 引擎及 Spiders 之间的特定钩子,处理 Spiders 的输入响应与输出项目和要求
Scheduler Middlewares
调度器中间件,它是在 Scrapy 引擎和调度器之间的特定钩子,处理调度器引擎发送来的请求,以便提供给 Scrapy 引擎
Scrapy 框架中的数据流(Data Flow)由执行引擎控制,根据上图中的虚线箭头表示的数据流向,Scrapy 框架的爬取步骤如下:
Scrapy 引擎打开一个网站,并向该爬虫请求第一个要爬取的 URL(s);
Scrapy 引擎从爬虫中获取到第一个要爬取的 URL 给引擎,引擎将 URL 通过下载器中间件以请求的方式转发给下载器;
Scrapy 引擎向调度器请求下一个要爬取的 URL;
调度器返回下一个要爬取的 URL 引擎,引擎将 URL 通过下载器中间件以请求的方式转发给下载器;
下载器开展下载工作,当页面下载完毕时,下载器将生成该页面的一个响应,并通过下载器中间件返回响应并发送给引擎;
Scrapy 引擎从下载器中接收到响应并通过爬虫中间件发送给爬虫处理;
爬虫处理响应并返回爬取到的项目内容及新的请求给引擎;
引擎将爬虫返回爬取到的项目发送到项目管道处,它将对数据进行后期处理(包括详细分析、过滤、存储等),并将爬虫返回的请求发送给调度器。
重复 2~9,直到调度器中没有更多的请求,Scrapy 引擎关闭该网站。
接下来通过简单示例体会下 Scrapy 爬虫工作原理及具体的使用方法。
2.2 Scrapy 组成详解及简单示例
编写一个 Scrapy 爬虫主要完成以下 4 个任务:
创建一个 Scrapy 项目;
定义提取的 Item,这时需爬取的栏目;
编写爬取网站的爬虫并提取 Item;
编写 Item Piprline 来存储提取的 Item 数据。
下面通过一个实例来讲解 Scrapy 的组成结构及调用过程,与上述任务对应地划分为 4 个部分。
2.2.1 新建项目
首先需要在一个自定义目录下新建一个工程,比如创建 test_scrapy 工程。注意,这里需要调用 cmd 命令行去创建工程,在 cmd 中输入如下指令:
scrapy startproject test_scrapy
该工程创建在作者常存的 Python 文件目录下,如下图所示,同时提示可以调用 “cd test_scrapy” 命令去该目录,调用 “scrapy genspider example example.com” 命令开始第一个爬虫。
该命令创建的 test_scrapy 工程所包含的目录如下,最外层是一个 test_scrapy 目录和一个 scrapy.cfg 文件,test_scrapy 文件夹中包含主要的爬虫文件,如 items.py、middlewares.py、pipelines.py、settings.py 等。
这些文件具体含义图下表所列,后续内容将对各文件进行详细介绍。
Scrapy 工程所包含的基础文件
文 件
含 义
scrapy.cfg
项目的配置文件
test_scrapy / items.py
项目中的 item 文件,定义栏目
test_scrapy / pipelines.py
项目中的 piplines 文件,存储数据
test_scrapy / settings.py
项目的设置文件
test_scrapy / spiders/
放置 spiders 代码的目录
下面将以 Scrapy 爬取作者的博客网站为入门示例。
2.2.2 定义 Item
Item 是保存爬取到数据的容器,其使用方法和 Python 字典类似,并且提供了相应的保护机制来避免拼写错误导致的未定义字段错误。
这里先创建一个 scrapy.item 类,并定义 scrapy.Field 类属性,然后利用该 scrapy.Field 类属性定义一个 Item 中定义相应的字段。例如,items.py 文件中的代码就定义了标题、超链接和摘要 3 个字段,如下:
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class TestScrapyItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field() # 标题
url = scrapy.Field() # 超链接
dedscription = scrapy.Field() # 摘要
通过该文件定义的 Item,读者可以很方便地使用 Scrapy 爬虫所提供的各种方法来爬取这 3 个字段的数据,即对应自己所定义的 Item。
2.2.3 提取数据
接下来需要编写爬虫程序,用于爬取网站数据的类。该类包含一个用于下载的初始 URL,能够跟进网页中的超链接并分析网页内容,提取生成 Item。scrapy.spider 类包含 3 个常用属性,如下:
name :名称字段用于区别爬虫。需要注意的是,改名字必须是唯一的,不可以为不同的爬虫设定相同的名字。
start_urls :该字段包含爬虫在启动时进行的 URL 列表。
parse() :爬虫的一个方法,被调用时,每个初始 URL 完成下载后生成的 Response 对象都将会作为唯一的参数传递给该方法。该方法负责解析返回的数据,提取数据以及生成需要进一步处理的 URL 的Request 对象。
接着在 test_scrapy/ spiders 目录下创建一个 BlogSpider.py 文件,此时工程目录如下图所示:
增加代码如下,注意类名和文件名一致,均为“BlogSpider”。
BlogSpiders.py
import scrapy
class BlogSpider(scrapy.Spider):
name = "IT_charge"
allowed_domains = ["https://blog.csdn.net/IT_charge"]
start_urls = [
"https://blog.csdn.net/IT_charge"
]
def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)
接下来在 cmd 命令行执行下列命令启动爬虫:
cd test_scrapy
scrapy crawl IT_charge
“scrapy crawl IT_charge” 启动爬虫,爬取博客网站,运行结果如下图所示:
此时,Scrapy 为爬虫的 start_urls 属性中的每个 URL 都创建了 scrapy.Request 对象,并将 parse() 方法作为回调函数赋值给了 Request 对象;另外,Request 对象经过调度,执行生成 scrapy.http.Response 对象返回给 spider parse() 方法。
Scrapy 提取 Item 时使用了一种基于 XPath 或 Selenium 技术分析方法,比如:
/html/head/title :定位选择 HTML 文档中 标签下的 元素;
/html/head/title/text() :定位 元素并获取该标题元素中的文字内容;
//td :选择所有的 元素;
//div[@class="price"] :选择所有 “class="price"” 属性的 div 元素。
下表列出了 Selector 常用的 4 个方法:
Selector 常用的方法
方法
含义
xpath()
利用 XPath 技术进行分析,传入 XPath 表达式,返回对应节点的 list 列表
css()
传入 CSS 表达式,返回该表达式所对应的所有节点的 Selector list 列表
extract()
序列化该节点为 unicode 字符串并返回 list 列表
re()
根据传入的正则表达式对数据进行提取,返回 unicode 字符串的 list 列表
假设现在需要爬取博客网站的标题内容,则修改 test_scrapy\ spiders 目录下的 BlogSpider.py 文件,代码如下:
BlogSpiders.py
import scrapy
class BlogSpider(scrapy.Spider):
name = "IT_charge"
allowed_domains = ["https://blog.csdn.net/IT_charge"]
start_urls = [
"https://blog.csdn.net/IT_charge"
]
def parse(self, response):
for t in response.xpath('//title'):
title = t.extract()
print(title)
for t in response.xpath('//title/text()'):
title = t.extract()
print(title)
输入 “scrapy crawl IT_charge” 命令,将爬取网站的标题代码:“
荣仔的博客_荣仔!最靓的仔!_CSDN博客-在王者荣耀角度下分析面向对象程序设计B中23种设计模式,java,Python领域博主 ”,如果需要获取标题内容,则使用 text() 函数来获取 “荣仔的博客_荣仔!最靓的仔!_CSDN博客-在王者荣耀角度下分析面向对象程序设计B中23种设计模式,java,Python领域博主”。
接下来需要获取标题、超链接和摘要,通过浏览器分析源码,如下图所示。
可以看到文章位于
...
标签之间,其 class 属性为 “article-item-box csdn-tracking-statistics”,分别定位 节点下的 “h4” 标签可以获取标题,
标签可以获取摘要。
对应爬取标题、超链接、摘要内容的 BlogSpider.py 文件修改如下:
BlogSpiders.py
import scrapy
class BlogSpider(scrapy.Spider):
name = "IT_charge"
allowed_domains = ["https://blog.csdn.net/IT_charge"]
start_urls = [
"https://blog.csdn.net/IT_charge"
]
def parse(self, response):
for sel in response.xpath('//*[@id="mainBox"]/main/div[2]/div[1]'):
title = sel.xpath('h4/a/text()').extract()[0]
url = sel.xpath('h4/a/@href').extract()[0]
description = sel.xpath('p/a/text()').extract()[0]
print(title)
print(url)
print(description)
同样,在 cmd 命令行下输入 “输入 “scrapy crawl IT_charge” 命令”,运行结果如下图所示:
2.2.4 保存数据
保存数据需要利用 pipeline.py 文件,它主要对爬虫返回的 Item 列表进行保存以及写入文件或数据库操作,通过 process_item() 函数来实现。
首先,修改 BlogSpiders.py 文件,通过 Test13Item() 类产生一个 item 类型,用于存储标题、超链接和摘要,代码如下:
BlogSpiders.py
import scrapy
from Scrapy_project.test_scrapy.test_scrapy.items import *
class BlogSpider(scrapy.Spider):
name = "IT_charge"
allowed_domains = ["https://blog.csdn.net/IT_charge"]
start_urls = [
"https://blog.csdn.net/IT_charge"
]
def parse(self, response):
for sel in response.xpath('//*[@id="mainBox"]/main/div[2]/div[1]'):
item = TestScrapyItem()
item['title'] = sel.xpath('h4/a/text()').extract()[0]
item['url'] = sel.xpath('h4/a/@href').extract()[0]
item['description'] = sel.xpath('p/a/text()').extract()[0]
return item
接下来,修改 pipelines.py 文件,具体修改内容代码如下所示:
pipelines.py
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import json
import codecs
class TestScrapyPipeline(object):
def __init__(self):
self.file = codecs.open('F:/blog.json', 'w', encoding='utf-8')
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
def spider_closed(self, spider):
self.file.close()
接着为了注册启动 Pipeline,需要找到 settings.py 文件,然后将要注册的类加入 “ITEM_PIPELINES” 的配置中,在 settings.py 中加入下述代码,其中,“Scrapy_project.test_scrapy.pipelines.TestScrapyPipeline” 是用户要注册的类,右侧的 “1” 表示 Pipeline 的优先级,其中,优先级的范围为 1~1000,越小优先级越高。
settings.py
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'Scrapy_project.test_scrapy.pipelines.TestScrapyPipeline': 1
}
同样,cmd 输入 “scrapy crawl IT_charge” 命令执行即可。
若出现中文乱码或显示的是 Unicode 编码,则修改 BlogSpider.py 或 pipelines.py 文件转换 unicode 编码即可。
下面给出一个项目实例,讲解如何使用 Scrapy 框架迅速爬取网站数据。
3 用 Scrapy 爬取农产品数据集
再做数据分析时,通常会遇到预测商品价格的情况,而在预测价格之前就需要爬取海量的商品价格信息,比如淘宝、京东商品等,这里采用 Scrapy 技术爬取贵州农产品数据集。
输入 “http://www.gznw.com/eportal/ui?pageId=595091” 网址,打开贵州农经网,可以查看贵州各个地区农产品每天价格的波动情况,如下图所示,主要包括 6 个字段:品种名称、价格类型、价格、单位、市场名称和发布时间。
Scrapy 框架自定义爬虫的主要步骤如下:
在 cmd 命令行模型下创建爬虫工程,即创建 SZProject 工程爬取贵州农经网。
在 items.py 文件中定义要抓取的数据栏目,对应品种名称、价格类型、价格、单位、市场名称和发布时间 6 个字段。
通过浏览器审查元素功能分析所需爬取内容的 DOM 结构并进行定位 HTML 节点。
创建爬虫文件,定位并爬取所需内容。
分析网页翻页方法,并发送多页面跳转爬取请求,不断执行爬虫直到结束。
设置 pipelines.py 文件,将爬取的数据集存储至本地 JSON 文件或 CSV 文件中。
设置 settings.py 文件,设置爬虫的执行优先级。
下面是完整的实现过程,重点是如何实现翻页爬取及多页面爬取。
3.1 创建工程
在 Windows 环境下,按 Ctrl + R 快捷键打开运行对话框,然后输入 cmd 命令打开命令行模式,接着调用 “cd” 命令到某个目录下,再调用 “scrapy startproject GZProject” 命令创建爬取贵州农经网产品信息的爬虫工程。
创建 Scrapy 爬虫的命令如下:
scrapy startproject GZProject
3.2 设置 items.py 文件
接着在 items.py 文件中定义需要爬去的字段,这里主要是 6 字段。调用 scrapy.Item 子类的 Field() 函数创建字段,代码如下:
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class GzprojectItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
num1 = scrapy.Field() # 品种名称
num2 = scrapy.Field() # 价格类型
num3 = scrapy.Field() # 价格
num4 = scrapy.Field() # 单位
num5 = scrapy.Field() # 市场名称
num6 = scrapy.Field() # 发布时间
接下来就是核心内容,分析网页 DOM 结构并编写对应爬虫代码。
3.3 浏览器审查元素
打开浏览器,键盘按下 F12 键,用 “元素选择器” 定位具体目标查看其对应的 HTML 源码,如下图所示:
观察发现,每行数据都位于
节点下;接着调用 scrapy 框架的 XPath、css 等功能进行爬取。
3.4 创建爬虫并执行
在 Spider 文件夹下创建一个 Python 文件——GZSpider.py 文件,主要用于实现爬虫代码。具体代码如下所示:
import scrapy
from scrapy import Request
from scrapy.selector import Selector
# from GZProject.items import *
class GZSpider(scrapy.Spider):
name = "gznw" # 贵州农产品爬虫
allowed_domains = ["gznw.gov.vn"]
start_urls = [
"http://www.gznw.com/eportal/ui?pageId=595091"
]
def parse(self, response):
print('----------------------Start-----------------------')
print(response.url)
for t in response.xpath('//title'):
title = t.extract()
print(title)
接下来执行下列命令启动爬虫:
cd GZProject
scrapy crawl gznw
接下来爬取商品信息,编写完整代码如下:
import scrapy
import os
import time
from selenium import webdriver
from scrapy import Request
from scrapy.selector import Selector
from GZProject.items import *
class GZSpider(scrapy.Spider):
name = "gznw" # 贵州农产品爬虫
# allowed_domains = ["http://www.gznw.com/eportal/ui?pageId=595091"]
start_urls = [
"http://www.gznw.com/eportal/ui?pageId=595091"
]
def parse(self, response):
print('----------------------Start-----------------------')
print(response.url)
# 打开 Chrome 浏览器,这顶等待加载时间
chromedriver = 'E:/software/chromedriver_win32/chromedriver.exe'
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)
# 模拟登录 163 邮箱
url = 'http://www.gznw.com/eportal/ui?pageId=595091'
driver.get(url)
time.sleep(5)
# 用户名、密码
for i in driver.find_elements_by_xpath(
'//*[@id="5c96d136291949729295e25ea7e708b7"]/div[2]/div[2]/table/tbody/tr'):
print(i.text)
3.5 实现翻页爬取及多页爬取功能
这里列出 3 中翻页方法,具体细节请读者自行研究:
方法一:定义 URL 超链接列表分别爬取
start_urls = [
"地址 1"
"地址 2"
"地址 3"
]
方法二:拼接不同的网页的 URL 并发送请求爬取
next_url = "前半段URL地址" + str(i)
方法三:获取下一页超链接并请求爬取其内容
i = 0
next_url = response.xpath('//a[@class="page=link next"]/@href').extract()
if next_(url is not None) and i < 20:
i = i + 1
next_url = '前半段网址' + next_url[0]
yield.Request(next_url, callback=self.parse)
3.6 设置 pipelines.py 文件保存数据至本地
import codecs
import json
class GzprojectPipline(object):
def __init__(self):
self.file = codecs.open('guizhou.json', 'w', encoding='utf-8')
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
def spider_closed(self, spider):
self.file.close()
3.7 设置 settings.py 文件
ITEM_PIPELINES = {
'GZProject.piplines.GzprojectPipeline':1
}
至此,一个完整的 Scrapy 爬虫实例思路已经讲解完了,希望本文对您有所帮助,也相信大家都有所收获。
4 本文小结
我们可以基于 BeautifulSoup 或 Selenium 技术的网络爬虫获取各种网站的信息,但其爬取效率太低,而 Scrapy 技术就很好地解决了这个难题。Scrapy 是一个爬取网络数据、提取结构性数据的高效率应用框架,其底层是异步框架 Twisted。Scrapy 最受欢迎的地方是他的性能,良好的并发性,较高的吞吐量提升了其爬取和解析的速度,而且下载器也是多线程的。同时,Scrapy 还拥有良好的存储功能,可以设置规则爬取具有一定规律的网址,尤其是在需要爬取大量真实的数据时,Scrapy 更是一个令人信服的好框架。
欢迎留言,一起学习交流~
感谢阅读
END
你可能感兴趣的:(「Python爬虫系列讲解」十三、用 Scrapy 技术爬取网络数据)
极狐GitLab 论坛 2.0 全新上线,可以在论坛上查找与 GitLab 相关的问题了~
极小狐
gitlab 极狐GitLab devops GitLab ci/cd devsecops SCM
安装出现依赖错误?版本升级搞不定?遇到422、500就懵逼了?不知道某个功能是免费or付费?……使用GitLab这种全球顶级的DevOps平台进行软件研发时,总会遇到一些困惑,想跟专业的技术人员快速交流以便获得答案,同时又想把这些问题沉淀下来以帮助他人?有这种赠人玫瑰,手有余香的解决方案吗?答案肯定有:论坛!!!论坛——一个各路大神聚集的地方,一个可以解惑答疑问道的地方。解惑:搜索与自己问题相同或
2022年河南省高等职业教育技能大赛云计算赛项竞赛赛卷(样卷)
忘川_ydy
云计算 云计算 openstack kubernetes docker python k8s ansible
#需要资源(软件包及镜像)或有问题的,可私博主!!!#需要资源(软件包及镜像)或有问题的,可私博主!!!#需要资源(软件包及镜像)或有问题的,可私博主!!!第一部分:私有云任务1私有云服务搭建(10分)使用提供的用户名密码,登录竞赛用的云计算平台,按要求自行使用镜像创建两台云主机,创建完云主机后确保网络正常通信,然后按要求配置服务器。根据提供安装脚本框架,补充脚本完成OpenStack平台的安装搭
现在的婚姻是: 高彩礼和诸多要求让感情越来越淡漠
朦蒙哒
很多人搞不明白为什么现在的人对婚姻的质量要求那么高可就是维持不了多久时间,有不少人的婚姻是用礼金堆起来的,但恰恰是这些人最容易夫妻感情出问题导致离婚收场。现在的婚姻让年轻人失望,年轻人为什么对婚姻失望甚至没了渴望,无非就是这几个原因01彩礼高了感情淡了我们都知道,结婚要的高彩礼把很多年轻人给搞怕了,搞得很多年轻人都不敢结婚生子了,可以说彩礼高了让很多男女都失去了真感情,就算能在一起也只是男人需要老
美团自动配送车2024春季招聘 | 社招专场
美团技术团队
关于美团自动配送团队美团自动配送以自研L4级自动驾驶软硬件技术为核心,与美团即时零售业务结合,形成满足公开道路、校园、社区、工业园区等室外全场景下的自动配送整体解决方案。美团自动配送团队成立于2016年,团队成员来自于Waymo、Cruise、Pony.ai、泛亚等自动驾驶行业头部公司,自动驾驶技术团队博士占比高达30%,依靠视觉、激光等传感器,实时感知预测周围环境,通过高精地图定位和智能决策规划
学习JavaEE的日子 Day32 线程池
A 北枝
学习JavaEE 学习 java-ee java 线程池
Day32线程池1.引入一个线程完成一项任务所需时间为:创建线程时间-Time1线程中执行任务的时间-Time2销毁线程时间-Time32.为什么需要线程池(重要)线程池技术正是关注如何缩短或调整Time1和Time3的时间,从而提高程序的性能。项目中可以把Time1,T3分别安排在项目的启动和结束的时间段或者一些空闲的时间段线程池不仅调整Time1,Time3产生的时间段,而且它还显著减少了创建
数据分析:低代码平台助力大数据时代的飞跃发展
快乐非自愿
数据分析 低代码 大数据
随着信息技术的突飞猛进,我们身处于一个数据量空前增长的时代——大数据时代。在这个时代背景下,数据分析已经成为企业决策、政策制定、科学研究等众多领域不可或缺的重要工具。然而,面对海量的数据和日益复杂多变的分析需求,传统的数据分析方法往往捉襟见肘,难以应对。幸运的是,低代码平台的兴起为大数据分析注入了新的活力,成为推动大数据时代发展的重要力量。低代码平台,顾名思义,是一种通过少量甚至无需编写代码,就能
用XMLHttpRequest发送和接收JSON数据
潭池先生
json XMLHttpRequest 前端
百度的AI回答了一个案例:varxhr=newXMLHttpRequest();varurl="your_endpoint_url";//替换为你的API端点vardata=JSON.stringify({key1:"value1",key2:"value2"});xhr.open("POST",url,true);xhr.setRequestHeader("Content-Type","appl
图论记录之最短路迪杰斯特拉
Just right
算法 图论 java 开发语言
简述思想这个思想能用一句话来概括,精简到的极致:每次找到一个最短距离的点并更新起点到各个点的最短距离如果要可视化的话,B站搜索Dijksra算法,有视频讲解伪代码写到这里,其实是想整一个动画的,这样效果更好点,但由于种种原因所以就拖一下intdijkstr(){dist[1]=0;其余的点的距离全部初始化为真无穷,不要写成int的最大值迭代n次将不在s中的,且距离最近的点给tsj即先到t,再加上t
linux基础命令(一)
运维搬运工
linux linux 服务器 centos
Linux基础命令1、设置主机名1.1、hostname查看主机名[root@ansible~]#cat/etc/hostnameansible或[root@ansible~]#hostnameansible注意:主机名中不允许使用下划线“_”,可以用短横线“-”1.2、hostname临时修改主机名#临时修改直接修改的是内存中的,重启会失效[root@ansible~]#hostnameansi
C#WPF控件TextBlock详解
未来无限
C#WPF程序设计 c# wpf 控件 TextBlock 回车换行 多行显示 强制回车换行
本文讲解WPF控件TextBlock。目录定义常用属性实例如何实现自动换行?如何强制回车换行?
虚拟 DOM 的优缺点有哪些
咕噜签名分发
前端 javascript 开发语言
虚拟DOM(VirtualDOM)技术作为现代前端开发中的重要组成部分,已经成为了众多流行前端框架的核心特性。它的引入为前端开发带来了诸多优势,同时也需要我们认真思考其潜在的考量。下面简单的介绍一下虚拟DOM技术的优势与缺点,深入探讨其在实际应用中的影响。提升性能虚拟DOM的最大优势之一是提升页面性能。通过比较前后两次虚拟DOM树的差异,最小化实际DOM操作,从而减少页面重渲染时的性能消耗。这种优
#D174-读书会作业-《财务自由之路》3
白洲笔记
最近沉迷于写作营,一直就没时间去弄读书会的作业,书的第二遍也就看了个开头,趁着日更的时间,赶紧把作业做了,这次是15到21课。【1.印象最深刻的部分】(本周所读内容中印象最深刻的部分)*活在未来,最正确的方法是什么?用正确的方法做正确的事情,判断什么是正确的?逻辑。学会思考。"作对事情"永远比“把事情作对“重要的多。”长远思考,耐心验证,小心总结提炼“证明自己正确并不是学习的任务和目标,时刻成长,
关于举办第十五届蓝桥杯全国软件和信息技术专业人才大赛项目实战赛的通知
QSNKJJSW
蓝桥杯 职场和发展 青少年编程 无人机 机器人 科技 人工智能
各高等院校及相关单位:为贯彻落实《中国教育现代化2035》和《国务院关于印发新时期促进集成电路产业和软件产业高质量发展若干政策的通知》有关精神,为我国制造强国和网络强国战略提供人才支持,提高学生自主创新意识和工程实践能力,工业和信息化部人才交流中心决定举办第十五届蓝桥杯全国软件和信息技术专业人才大赛——项目实战赛。大赛连续四年入围中国高等教育学会“全国普通高校大学生竞赛排行榜”竞赛项目榜单。现将项
3、JavaWeb-Ajax/Axios-前端工程化-Element
所谓远行Misnearch
# JavaWeb 前端 ajax elementui java 前端框架
P34Ajax介绍Ajax:AsynchroousJavaScriptAndXML,异步的JS和XMLJS网页动作,XML一种标记语言,存储数据,作用:数据交换:通过Ajax给服务器发送请求,并获取服务器响应的数据异步交互:在不重新加载整个页面的情况下,与服务器交换数据并实现更新部分网页的技术,例如:搜索联想、用户名是否可用的校验等等。同步与异步:同步:服务器在处理中客户端要处于等待状态,输入域名
el-dialog宽度自适应
STATICHIT静砸
JavaScript vue.js elementui javascript 自适应
最近在自适应上做了很多功夫其中有一个是,在使用element-plus的el-dialog时,在pc端和在手机端打开,由于屏幕宽度的不同,我希望el-dialog的宽度是不一样的。而el-dialog设置宽度是通过width属性,直接用%来相对窗口设置宽度。我先后尝试了媒体查询,监听屏幕宽度和监听视口宽度来自适应。1️⃣首先,直接给el-dialog设置自定义class结合媒体查询是无效的,直接设
好吧,再见
卜者
时光载着青春的记忆愈行愈远,很多人和事都已慢慢的模糊直至消失,但始终忘不了出现在我初中生涯里的那个男孩。喂,前桌,你还记得我吗?初次见你,是在报名入口处,你穿着一件白体恤,很醒目,这让我一下子就注意到了你。你的发型是当时最流行的锅盖头,这使你的帅气中多了几分可爱。你的睫毛很长,在眼睛的带动下忽闪忽闪的,用现代流行语来说就是"很灵"。我呆呆地在原地注视着你,直到你离开了入口处我才回过神来。我从没想过
网络安全(黑客)——自学2024
小言同学喜欢挖漏洞
web安全 安全 网络 学习 网络安全 信息安全 渗透测试
01什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也有Web防御技术(WAF)。作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。02怎样规划网络安全如果你是一
Ai插件脚本合集安装包,免费教程视频网盘分享
全网优惠分享君
随着人工智能技术的不断发展,越来越多的插件脚本涌现出来,为我们的生活和工作带来了便利。然而,如何快速、方便地获取和使用这些插件脚本呢?今天,我将为大家分享一个非常实用的资源——AI插件脚本合集安装包,以及免费教程视频网盘分享。首先,让我们来了解一下这个AI插件脚本合集安装包。它是一个集合了众多AI插件脚本的资源包,涵盖了各种领域,如数据分析、自动化办公、智能客服等等。通过这个安装包,用户可以轻松地
黑客(网络安全)技术自学30天
一个迷人的黑客
web安全 安全 网络 笔记 网络安全 信息安全 渗透测试
01什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也有Web防御技术(WAF)。作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。02怎样规划网络安全如果你是一
《金文成〈正蒙〉日记124。2020-11-9》
金吾生
《金文成〈正蒙〉日记124。2020-11-9》今天是庚子丁亥丙子,九月廿四,2020年11月9日星期一。作者篇7【舜之孝,汤、武之武,虽顺逆不同,其为不幸均矣。】船山讲解说,顺,指的是舜的父亲最终受到感化,转变了态度,结局圆满之事;逆,指的是"桀放、纣诛",即,商汤放桀,周武诛纣,都是采用暴力,不是感化方式,所以是逆。顺与逆,都是为了解决弊政,然其差异之大如此,然而,无论圆满还是遗憾,其实他们都
第一次用eclipse,导入项目错误Plug-in “org.eclipse.m2e.editor“ was unable to instantiate MavenPomEditor
zhangfeng1133
eclipse java ide
第一次用eclipse,导入项目错误Plug-in"org.eclipse.m2e.editor"wasunabletoinstantiateMavenPomEditor。各种项目包,都不存在,maven应该能自动载入类包,比Php的composer方便太多Thecontainer'MavenDependencies'referencesnonexistinglibrary'C:\Users\Ad
2.5 项目讲解流程
王守谦26
项目资料 数据库
一、项目讲解1、自我介绍2、项目流程-===============================二、自我介绍(一)、学员自我介绍,讲解存在的问题比如:讲解年份、卡顿、重点学历、忘记(二)自我规则内容1、开场白:礼貌用语2、时间:自我介绍1-2分钟以内3、内容:姓名、籍贯、毕业院校、(拉进面试官距离)4、技能:功能测试、接口测试、自动化测试、app测试、性能测试、安全测试黑盒测试、白盒测试、灰盒
“姜子牙”回归神位,告别老艺术家蓝天野
喵十一呀
根据央视新闻报道,今天下午,2022年6月8日,著名的人民艺术家,“七一勋章”获得者蓝天野,因病在北京离世,享年95岁。蓝老先生,原名王润森,出生于河北省。从上个世纪四十年代就投身于话剧事业,曾在经典话剧《北京人》《茶馆》《蔡文姬》中扮演重要角色。对于我们父母那一辈人来说,这段记忆比较深刻。而对于七八零后的朋友来说,蓝老先生最让人熟悉的角色便是《封神榜》中的姜子牙。在那个年代,剧组人员硬是用五毛钱
过去一年,这16本好书不容错过
m0_54050778
perl
编者按:2023年在动荡与希望中收尾,2023年注定会被载入史册。疫情寒冬结束,ChatGPT横空出世,带动了人工智能技术的飞速发展;淄博烧烤、天津大爷、尔滨之旅等充满感动与幸福。但与此同时,2023年又是动荡与不安的一年,俄乌冲突的延宕,新一轮的巴以冲突,极端天气频发。在这个大环境下,有一些经典的书籍著作诞生。本文将分享2023年最值得一读的16本书籍,文章来自翻译,希望对你有所启示。关于202
Acrobat Pro DC ----专业PDF编辑与管理
*橙子
office pdf macos
AcrobatProDC2023是一款功能强大的PDF处理软件,它提供了丰富的编辑工具,支持创建、编辑、合并、分割PDF文件,以及高质量的PDF到其他格式的转换功能。同时,该软件集成了最新的OCR技术,可将扫描文档或图片转换成可编辑的PDF。AcrobatProDC2023还具备电子签名功能,支持多人协作和云端同步共享,大大提高了工作效率和团队协作效率。无论是设计、建筑、金融还是法律等行业,Acr
[数据集][图像分类]河道污染分类数据集1923张4类别
FL1623863129
数据集 分类 数据挖掘 人工智能
数据集类型:图像分类用,不可用于目标检测无标注文件数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片图片数量(jpg文件个数):1922分类类别数:4类别名称:["lianghao","qingwei","yanzhong","zhongdu"]每个类别图片数:lianghao图片数:435qingwei图片数:423yanzhong图片数:577zhongdu图片数:487重要说明
【数据结构】实验一 实现顺序表各种基本运算的算法
张鱼·小丸子
数据结构实验 c++ 数据结构
题目:实现顺序表各种基本运算的算法要求:1、建立一个顺序表,输入n个元素并输出;2、查找线性表中的最大元素并输出;3、在线性表的第i个元素前插入一个正整数x;4、删除线性表中的第j个元素;5、将线性表中的元素按升序排列;6、将线性表中的元素就地逆序(只允许用一个暂存单元);#include#defineSIZE1000usingnamespacestd;typedefstruct{int*a;//
酷开科技依托酷开系统用“平台+产品+场景”塑造全屋智能生活!
京创尤品
科技 生活
杰弗里·摩尔的“鸿沟理论”中写道:高科技企业推进产品的早期市场和产品被广泛接受的主流市场之间,存在着一条巨大的“鸿沟”。“鸿沟”,指产品吸引早期接纳者后、赢得更多客户前的那段间歇,以及其中可预知和不可预知的阻碍。多数产品或企业的失败都发生在“鸿沟期”。目前,智慧家居的发展正处在一个“鸿沟期”:势头看似迅猛,但真实用户有限。对于一些企业而言,这条巨大“鸿沟”之所以出现,在于他们对如何推进智慧家居并不
[高精度加法和乘法] 阶乘之和
StudyingPanda
算法
题目描述用高精度计算出S=1!+2!+3!+⋯+n!(n≤50)。其中!表示阶乘,定义为n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。输入格式一个正整数n。输出格式一个正整数S,表示计算结果。输入输出样例输入#13输出#19解题分析思路很简单,求出阶乘之后再累次求和即可,但是关键在于这个数据量实在是太大了,所以必须封装高精度运算,这里我们创建一个BigInt类,
VGG16滤镜可视化和类激活图
LIjin_1006
人工智能 神经网络 深度学习 cnn
这个用keras2.2.4+tensorflow1.15.0importkeraskeras.__version__fromkeras.applicationsimportVGG16fromkerasimportbackendasKimportnumpyasnpfromkerasimportmodelsimportmatplotlib.pyplotaspltimporttensorflowastf
深入浅出Java Annotation(元注解和自定义注解)
Josh_Persistence
Java Annotation 元注解 自定义注解
一、基本概述
Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或
mysql优化特定类型的查询
annan211
java 工作 mysql
本节所介绍的查询优化的技巧都是和特定版本相关的,所以对于未来mysql的版本未必适用。
1 优化count查询
对于count这个函数的网上的大部分资料都是错误的或者是理解的都是一知半解的。在做优化之前我们先来看看
真正的count()函数的作用到底是什么。
count()是一个特殊的函数,有两种非常不同的作用,他可以统计某个列值的数量,也可以统计行数。
在统
MAC下安装多版本JDK和切换几种方式
棋子chessman
jdk
环境:
MAC AIR,OS X 10.10,64位
历史:
过去 Mac 上的 Java 都是由 Apple 自己提供,只支持到 Java 6,并且OS X 10.7 开始系统并不自带(而是可选安装)(原自带的是1.6)。
后来 Apple 加入 OpenJDK 继续支持 Java 6,而 Java 7 将由 Oracle 负责提供。
在终端中输入jav
javaScript (1)
Array_06
JavaScript java 浏览器
JavaScript
1、运算符
运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=)、算术运算符(+,-,*,/,++,--,%)、比较运算符(>,<,<=,>=,==,===,!=,!==)、逻辑运算符(||,&&,!)、条件运算(?:)、位
国内顶级代码分享网站
袁潇含
java jdk oracle .net PHP
现在国内很多开源网站感觉都是为了利益而做的
当然利益是肯定的,否则谁也不会免费的去做网站
&
Elasticsearch、MongoDB和Hadoop比较
随意而生
mongodb hadoop 搜索引擎
IT界在过去几年中出现了一个有趣的现象。很多新的技术出现并立即拥抱了“大数据”。稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化。假如你有诸如Elasticsearch或者Solr这样的搜索引擎,它们存储着JSON文档,MongoDB存着JSON文档,或者一堆JSON文档存放在一个Hadoop集群的HDFS中。你可以使用这三种配
mac os 系统科研软件总结
张亚雄
mac os
1.1 Microsoft Office for Mac 2011
大客户版,自行搜索。
1.2 Latex (MacTex):
系统环境:https://tug.org/mactex/
&nb
Maven实战(四)生命周期
AdyZhang
maven
1. 三套生命周期 Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。 以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post
Linux下Jenkins迁移
aijuans
Jenkins
1. 将Jenkins程序目录copy过去 源程序在/export/data/tomcatRoot/ofctest-jenkins.jd.com下面 tar -cvzf jenkins.tar.gz ofctest-jenkins.jd.com &
request.getInputStream()只能获取一次的问题
ayaoxinchao
request Inputstream
问题:在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据
原因: 1. 一个InputStream对象在被读取完成后,将无法被再次读取,始终返回-1; 2. InputStream并没有实现reset方法(可以重
数据库SQL优化大总结之 百万级数据库优化方案
BigBird2012
SQL优化
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。
这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where
jsonObject的使用
bijian1013
java json
在项目中难免会用java处理json格式的数据,因此封装了一个JSONUtil工具类。
JSONUtil.java
package com.bijian.json.study;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
[Zookeeper学习笔记之六]Zookeeper源代码分析之Zookeeper.WatchRegistration
bit1129
zookeeper
Zookeeper类是Zookeeper提供给用户访问Zookeeper service的主要API,它包含了如下几个内部类
首先分析它的内部类,从WatchRegistration开始,为指定的znode path注册一个Watcher,
/**
* Register a watcher for a particular p
【Scala十三】Scala核心七:部分应用函数
bit1129
scala
何为部分应用函数?
Partially applied function: A function that’s used in an expression and that misses some of its arguments.For instance, if function f has type Int => Int => Int, then f and f(1) are p
Tomcat Error listenerStart 终极大法
ronin47
tomcat
Tomcat报的错太含糊了,什么错都没报出来,只提示了Error listenerStart。为了调试,我们要获得更详细的日志。可以在WEB-INF/classes目录下新建一个文件叫logging.properties,内容如下
Java代码
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHa
不用加减符号实现加减法
BrokenDreams
实现
今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
分析一下,先看最简单的情况,假设1+1,按二进制算的话结果是10,可以看到从右往左的第一位变为0,第二位由于进位变为1。
 
读《研磨设计模式》-代码笔记-状态模式-State
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况
把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化
如果在
CUDA程序block和thread超出硬件允许值时的异常
cherishLC
CUDA
调用CUDA的核函数时指定block 和 thread大小,该大小可以是dim3类型的(三维数组),只用一维时可以是usigned int型的。
以下程序验证了当block或thread大小超出硬件允许值时会产生异常!!!GPU根本不会执行运算!!!
所以验证结果的正确性很重要!!!
在VS中创建CUDA项目会有一个模板,里面有更详细的状态验证。
以下程序在K5000GPU上跑的。
诡异的超长时间GC问题定位
chenchao051
jvm cms GC hbase swap
HBase的GC策略采用PawNew+CMS, 这是大众化的配置,ParNew经常会出现停顿时间特别长的情况,有时候甚至长到令人发指的地步,例如请看如下日志:
2012-10-17T05:54:54.293+0800: 739594.224: [GC 739606.508: [ParNew: 996800K->110720K(996800K), 178.8826900 secs] 3700
maven环境快速搭建
daizj
安装 mavne 环境配置
一 下载maven
安装maven之前,要先安装jdk及配置JAVA_HOME环境变量。这个安装和配置java环境不用多说。
maven下载地址:http://maven.apache.org/download.html,目前最新的是这个apache-maven-3.2.5-bin.zip,然后解压在任意位置,最好地址中不要带中文字符,这个做java 的都知道,地址中出现中文会出现很多
PHP网站安全,避免PHP网站受到攻击的方法
dcj3sjt126com
PHP
对于PHP网站安全主要存在这样几种攻击方式:1、命令注入(Command Injection)2、eval注入(Eval Injection)3、客户端脚本攻击(Script Insertion)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgerie
yii中给CGridView设置默认的排序根据时间倒序的方法
dcj3sjt126com
GridView
public function searchWithRelated() {
$criteria = new CDbCriteria;
$criteria->together = true; //without th
Java集合对象和数组对象的转换
dyy_gusi
java集合
在开发中,我们经常需要将集合对象(List,Set)转换为数组对象,或者将数组对象转换为集合对象。Java提供了相互转换的工具,但是我们使用的时候需要注意,不能乱用滥用。
1、数组对象转换为集合对象
最暴力的方式是new一个集合对象,然后遍历数组,依次将数组中的元素放入到新的集合中,但是这样做显然过
nginx同一主机部署多个应用
geeksun
nginx
近日有一需求,需要在一台主机上用nginx部署2个php应用,分别是wordpress和wiki,探索了半天,终于部署好了,下面把过程记录下来。
1. 在nginx下创建vhosts目录,用以放置vhost文件。
mkdir vhosts
2. 修改nginx.conf的配置, 在http节点增加下面内容设置,用来包含vhosts里的配置文件
#
ubuntu添加admin权限的用户账号
hongtoushizi
ubuntu useradd
ubuntu创建账号的方式通常用到两种:useradd 和adduser . 本人尝试了useradd方法,步骤如下:
1:useradd
使用useradd时,如果后面不加任何参数的话,如:sudo useradd sysadm 创建出来的用户将是默认的三无用户:无home directory ,无密码,无系统shell。
顾应该如下操作:
第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
jinnianshilongnian
nginx lua
JSON库
在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能;目前Lua也有几个JSON库,本人用过cjson、dkjson。其中cjson的语法严格(比如unicode \u0020\u7eaf),要求符合规范否则会解析失败(如\u002),而dkjson相对宽松,当然也可以通过修改cjson的源码来完成
Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
yaerfeng1989
timer quartz 定时器
原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm
有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。
1.Java Timer定时
首先继承jav
Linux下df与du两个命令的差别?
pda158
linux
一、df显示文件系统的使用情况,与du比較,就是更全盘化。 最经常使用的就是 df -T,显示文件系统的使用情况并显示文件系统的类型。 举比例如以下: [root@localhost ~]# df -T Filesystem Type &n
[转]SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
ctfzh
VO android sqlite 反射 Cursor
在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。
使用时需要注意:
考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性。
表中的字段名需要和VO的属性名一样,要是不一样就得在查询的SQL中
该学习笔记用到的Employee表
vipbooks
oracle sql 工作
这是我在学习Oracle是用到的Employee表,在该笔记中用到的就是这张表,大家可以用它来学习和练习。
drop table Employee;
-- 员工信息表
create table Employee(
-- 员工编号
EmpNo number(3) primary key,
-- 姓