本专栏是以杨秀璋老师爬虫著作《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 技术爬取网络数据)
OC语言多界面传值五大方式
Magnetic_h
ios ui 学习 objective-c 开发语言
前言在完成暑假仿写项目时,遇到了许多需要用到多界面传值的地方,这篇博客来总结一下比较常用的五种多界面传值的方式。属性传值属性传值一般用前一个界面向后一个界面传值,简单地说就是通过访问后一个视图控制器的属性来为它赋值,通过这个属性来做到从前一个界面向后一个界面传值。首先在后一个界面中定义属性@interfaceBViewController:UIViewController@propertyNSSt
UI学习——cell的复用和自定义cell
Magnetic_h
ui 学习
目录cell的复用手动(非注册)自动(注册)自定义cellcell的复用在iOS开发中,单元格复用是一种提高表格(UITableView)和集合视图(UICollectionView)滚动性能的技术。当一个UITableViewCell或UICollectionViewCell首次需要显示时,如果没有可复用的单元格,则视图会创建一个新的单元格。一旦这个单元格滚动出屏幕,它就不会被销毁。相反,它被添
小丽成长记(四十三)
玲玲54321
小丽发现,即使她好不容易调整好自己的心态下一秒总会有不确定的伤脑筋的事出现,一个接一个的问题,人生就没有停下的时候,小问题不断出现。不过她今天看的书,她接受了人生就是不确定的,厉害的人就是不断创造确定性,在Ta的领域比别人多的确定性就能让自己脱颖而出,显示价值从而获得的比别人多的利益。正是这样的原因,因为从前修炼自己太少,使得她现在在人生道路上打怪起来困难重重,她似乎永远摆脱不了那种无力感,有种习
学点心理知识,呵护孩子健康
静候花开_7090
昨天听了华中师范大学教育管理学系副教授张玲老师的《哪里才是学生心理健康的最后庇护所,超越教育与技术的思考》的讲座。今天又重新学习了一遍,收获匪浅。张玲博士也注意到了当今社会上的孩子由于心理问题导致的自残、自杀及伤害他人等恶性事件。她向我们普及了一个重要的命题,她说心理健康的一些基本命题,我们与我们通常的一些教育命题是不同的,她还举了几个例子,让我们明白我们原来以为的健康并非心理学上的健康。比如如果
Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断
尐尐呅
结核病是艾滋病合并其他疾病中导致患者死亡的主要原因。其中结核病由结核分枝杆菌(Mycobacteriumtuberculosis,Mtb)感染引起,获得性免疫缺陷综合症(艾滋病)由人免疫缺陷病毒(Humanimmunodeficiencyvirustype1,HIV-1)感染引起。国家感染性疾病临床医学研究中心/深圳市第三人民医院张国良团队携手深圳华大生命科学研究院吴靓团队,共同研究得出单细胞测序
如何在 Fork 的 GitHub 项目中保留自己的修改并同步上游更新?github_fork_update
iBaoxing
github
如何在Fork的GitHub项目中保留自己的修改并同步上游更新?在GitHub上Fork了一个项目后,你可能会对项目进行一些修改,同时原作者也在不断更新。如果想要在保留自己修改的基础上,同步原作者的最新更新,很多人会不知所措。本文将详细讲解如何在不丢失自己改动的情况下,将上游仓库的更新合并到自己的仓库中。问题描述假设你在GitHub上Fork了一个项目,并基于该项目做了一些修改,随后你发现原作者对
30天风格练习-DAY2
黄希夷
Day2(重义)在一个周日/一周的最后一天,我来到位于市中心/市区繁华地带的一家购物中心/商场,中心内人很多/熙熙攘攘。我注意到/看见一个独行/孤身一人的年轻女孩/,留着一头引人注目/长过腰际的头发,上身穿一件暗红色/比正红色更深的衣服/穿在身体上的东西。走下扶梯的时候,她摔倒了/跌向地面,在她正要站起来/让身体离开地面的时候,过长/超过一般人长度的头发被支撑身体/躯干的手掌压/按在下面,她赶紧用
店群合一模式下的社区团购新发展——结合链动 2+1 模式、AI 智能名片与 S2B2C 商城小程序源码
说私域
人工智能 小程序
摘要:本文探讨了店群合一的社区团购平台在当今商业环境中的重要性和优势。通过分析店群合一模式如何将互联网社群与线下终端紧密结合,阐述了链动2+1模式、AI智能名片和S2B2C商城小程序源码在这一模式中的应用价值。这些创新元素的结合为社区团购带来了新的机遇,提升了用户信任感、拓展了营销渠道,并实现了线上线下的完美融合。一、引言随着互联网技术的不断发展,社区团购作为一种新兴的商业模式,在满足消费者日常需
每日一题——第八十四题
互联网打工人no1
C语言程序设计每日一练 c语言
题目:编写函数1、输入10个职工的姓名和职工号2、按照职工由大到小顺序排列,姓名顺序也随之调整3、要求输入一个职工号,用折半查找法找出该职工的姓名#define_CRT_SECURE_NO_WARNINGS#include#include#defineMAX_EMPLOYEES10typedefstruct{intid;charname[50];}Empolyee;voidinputEmploye
每日一题——第八十三题
互联网打工人no1
C语言程序设计每日一练 c语言
题目:将输入的整形数字输出,输出1990,输出"1990"#include#defineMAX_INPUT1024intmain(){intarrr_num[MAX_INPUT];intnum,i=0;printf("请输入一个数字:");scanf_s("%d",&num);while(num!=0){arrr_num[i++]=num%10;num/=10;}printf("\"");for(
WPF中的ComboBox控件几种数据绑定的方式
互联网打工人no1
wpf c#
一、用字典给ItemsSource赋值(此绑定用的地方很多,建议熟练掌握)在XMAL中:在CS文件中privatevoidBindData(){DictionarydicItem=newDictionary();dicItem.add(1,"北京");dicItem.add(2,"上海");dicItem.add(3,"广州");cmb_list.ItemsSource=dicItem;cmb_l
git常用命令笔记
咩酱-小羊
git 笔记
###用习惯了idea总是不记得git的一些常见命令,需要用到的时候总是担心旁边站了人~~~记个笔记@_@,告诉自己看笔记不丢人初始化初始化一个新的Git仓库gitinit配置配置用户信息gitconfig--globaluser.name"YourName"gitconfig--globaluser.email"
[email protected] "基本操作克隆远程仓库gitclone查看
腾讯云技术深度探索:构建高效云原生微服务架构
我的运维人生
云原生 架构 腾讯云 运维开发 技术共享
腾讯云技术深度探索:构建高效云原生微服务架构在当今快速发展的技术环境中,云原生技术已成为企业数字化转型的关键驱动力。腾讯云作为行业领先的云服务提供商,不断推出创新的产品和技术,助力企业构建高效、可扩展的云原生微服务架构。本文将深入探讨腾讯云在微服务领域的最新进展,并通过一个实际案例展示如何在腾讯云平台上构建云原生应用。腾讯云微服务架构概览腾讯云微服务架构基于云原生理念,旨在帮助企业快速实现应用的容
直抒《紫罗兰永恒花园外传》
雷姆的黑色童话
没看过《紫罗兰永恒花园》的我莫名的看完了《紫罗兰永恒花园外传》,又莫名的被故事中的姐妹之情狠狠地感动了的一把。感动何在:困苦中相依为命的姐妹二人被迫分离,用一个人的自由换取另一个人的幸福。之后,虽相隔不知几许依旧心心念念彼此牵挂。这种深深的姐妹情谊就是令我为之动容的所在。贝拉和泰勒分别影片开始,海天之间一个孩童凭栏眺望,手中拿着折旧的信纸。镜头一转,挑灯伏案的薇尔莉特正在打字机前奋笔疾书。这些片段
linux中sdl的使用教程,sdl使用入门
Melissa Corvinus
linux中sdl的使用教程
本文通过一个简单示例讲解SDL的基本使用流程。示例中展示一个窗口,窗口里面有个随机颜色快随机移动。当我们鼠标点击关闭按钮时间窗口关闭。基本步骤如下:1.初始化SDL并创建一个窗口。SDL_Init()初始化SDL_CreateWindow()创建窗口2.纹理渲染存储RGB和存储纹理的区别:比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一
DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理
STU学生网页设计
网页设计 期末网页作业 html静态网页 html5期末大作业 网页设计 web大作业
️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程
2020-04-12每天三百字之连接与替代
冷眼看潮
不知道是不是好为人师,有时候还真想和别人分享一下我对某些现象的看法或者解释。人类社会不断发展进步的过程,就是不断连接与替代的过程。人类发现了火并应用火以后,告别了茹毛饮血的野兽般的原始生活(火烧、烹饪替代了生食)人类用石器代替了完全手工,工具的使用使人类进步一大步。类似这样的替代还有很多,随着科技的发展,有更多的原始的事物被替代,代之以更高效、更先进的技术。在近现代,汽车替代了马车,高速公路和铁路
探索OpenAI和LangChain的适配器集成:轻松切换模型提供商
nseejrukjhad
langchain easyui 前端 python
#探索OpenAI和LangChain的适配器集成:轻松切换模型提供商##引言在人工智能和自然语言处理的世界中,OpenAI的模型提供了强大的能力。然而,随着技术的发展,许多人开始探索其他模型以满足特定需求。LangChain作为一个强大的工具,集成了多种模型提供商,通过提供适配器,简化了不同模型之间的转换。本篇文章将介绍如何使用LangChain的适配器与OpenAI集成,以便轻松切换模型提供商
使用LLaVa和Ollama实现多模态RAG示例
llzwxh888
python 人工智能 开发语言
本文将详细介绍如何使用LLaVa和Ollama实现多模态RAG(检索增强生成),通过提取图像中的结构化数据、生成图像字幕等功能来展示这一技术的强大之处。安装环境首先,您需要安装以下依赖包:!pipinstallllama-index-multi-modal-llms-ollama!pipinstallllama-index-readers-file!pipinstallunstructured!p
有舍才有得
_清净_
为什么经常讲放下?放下就是让你要舍得、舍去。喜舍心就是把自己喜欢的,用慈悲心喜舍出去。这就锻炼了你们在人间,学会放下原本不舍得的东西或一些事物,学会舍出去,学会帮助别人,学会多付出。你今天付出了慈悲心、喜舍心,以后会得到更多的缘助力。缘助力是什么?——贵人缘啊。今天没有付出,不懂得付出,什么都只会想到自己,那你也得不到缘助力。慈悲喜舍就是用慈悲心去帮助别人,用喜舍心去付出,最后也会得到别人回报。别
关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript
二挡起步
web前端期末大作业 javascript html css 旅游 风景
⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip
HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动
二挡起步
web前端期末大作业 web设计网页规划与设计 html css javascript dreamweaver 前端
Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线
Day1笔记-Python简介&标识符和关键字&输入输出
~在杰难逃~
Python python 开发语言 大数据 数据分析 数据挖掘
大家好,从今天开始呢,杰哥开展一个新的专栏,当然,数据分析部分也会不定时更新的,这个新的专栏主要是讲解一些Python的基础语法和知识,帮助0基础的小伙伴入门和学习Python,感兴趣的小伙伴可以开始认真学习啦!一、Python简介【了解】1.计算机工作原理编程语言就是用来定义计算机程序的形式语言。我们通过编程语言来编写程序代码,再通过语言处理程序执行向计算机发送指令,让计算机完成对应的工作,编程
人工智能时代,程序员如何保持核心竞争力?
jmoych
人工智能
随着AIGC(如chatgpt、midjourney、claude等)大语言模型接二连三的涌现,AI辅助编程工具日益普及,程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作,也有人认为AI是提高效率的得力助手。面对这一趋势,程序员应该如何应对?是专注于某个领域深耕细作,还是广泛学习以适应快速变化的技术环境?又或者,我们是否应该将重点转向AI无法轻易替代的软技能?让我们一起探讨程序员
libyuv之linux编译
jaronho
Linux linux 运维 服务器
文章目录一、下载源码二、编译源码三、注意事项1、银河麒麟系统(aarch64)(1)解决armv8-a+dotprod+i8mm指令集支持问题(2)解决armv9-a+sve2指令集支持问题一、下载源码到GitHub网站下载https://github.com/lemenkov/libyuv源码,或者用直接用git克隆到本地,如:gitclonehttps://github.com/lemenko
没有邀请码怎么注册买手妈妈?
氧惠评测
买手妈妈怎么注册小编为大家带来买手妈妈没有邀请码怎么注册。打开买手妈妈APP,点击“马上注册”,输入邀请信息“邀请码”点击下一步,没有邀请码是登录不上的,所以这个必须要填写,那我们没有怎么办?填写成功就可以登录下一步。这里面有手机登录和淘宝登录,手机登录以后也需要用淘宝授权的,所以基本上都是淘宝登录。购物、看电影、点外卖、用氧惠APP!更优惠!氧惠(全网优惠上氧惠)——是与以往完全不同的抖客+淘客
番茄西红柿叶子病害分类数据集12882张11类别
futureflsl
数据集 分类 数据挖掘 人工智能
数据集类型:图像分类用,不可用于目标检测无标注文件数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片图片数量(jpg文件个数):12882分类类别数:11类别名称:["Bacterial_Spot_Bacteria","Early_Blight_Fungus","Healthy","Late_Blight_Water_Mold","Leaf_Mold_Fungus","Powdery
CX8836:小体积大功率升降压方案推荐(附Demo设计指南)
诚芯微科技
社交电子
CX8836是一颗同步四开关单向升降压控制器,在4.5V-40V宽输入电压范围内稳定工作,持续负载电流10A,能够在输入高于或低于输出电压时稳定调节输出电压,可适用于USBPD快充、车载充电器、HUB、汽车启停系统、工业PC电源等多种升降压应用场合,为大功率TYPE-CPD车载充电器提供最优解决方案。提供CX8836Demo测试、CX8836样品申请及CX8836方案开发技术支持。CX8836同升
回溯算法-重新安排行程
chirou_
算法 数据结构 图论 c++ 图搜索
leetcode332.重新安排行程这题我还没自己ac过,只能现在凭着刚学完的热乎劲把我对题解的理解记下来。本题我认为对数据结构的考察比较多,用什么数据结构去存数据,去读取数据,都是很重要的。classSolution{private:unordered_map>targets;boolbacktracking(intticketNum,vector&result){//1.确定参数和返回值//2
【华为OD技术面试真题 - 技术面】- python八股文真题题库(4)
算法大师
华为od 面试 python
华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选**1.Python中的`with`**用途和功能自动资源管理示例:文件操作上下文管理协议示例代码工作流程解析优点2.\_\_new\_\_和**\_\_init\_\_**区别__new____init__区别总结3.**切片(Slicing)操作**基本切片语法
深入浅出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,
-- 姓