首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

爬虫入门之爬虫概述与urllib库(一)

1 爬虫概述 (1)互联网爬虫 一个程序,根据Url进行爬取网页,获取有用信息 (2)核心任务 爬取网页 解析数据 难点 :爬虫和反爬虫之间的博弈 (3)爬虫语言 php 多进程和多线程支持不好 java 目前java爬虫需求岗位旺盛,但代码臃肿,重构成本高,而爬虫需要经常修改,所以不好用 C\C++ 学习成本比较高,性能和效率高,停留在研究层面,市场需求量小。体现程序员能力。 python 语法简洁优美、对新手友好学习成本低、支持的模块非常多、有scrapy非常强大的爬虫框架 (4)爬虫分类 #通用爬虫 实例 百度、360、google、sougou等搜索引擎, 将网上的数据进行爬取并进行排名展示 功能 访问网页->抓取数据->数据存储->数据处理->提供检索服务 抓取流程 1. 给定一些起始的URL,放入待爬取队列 2. 从队列中获取url对象,开始爬取数据 3. 分析网页,获取网页内的所有url,入队,继续重复执行第二步 搜索引擎如何获取新网站链接 1. 主动给搜索引擎提交url 2. 在其他网站中设置友情链接 3. 百度和DNS服务商合作,只要有域名,就会收录新网站 robots协议 1.一个约定俗成的协议,添加robots.txt文件,来说明本网站哪些内容不可以被抓取,起到限制作用 2.自己写的爬虫无需遵守 网站排名(SEO) 1. 根据pagerank值进行排名(参考个网站流量、点击率等指标) 2. 百度竞价排名,钱多就是爸爸 缺点: 1. 抓取的数据大多是无用的 2.不能根据用户的需求来精准获取数据 #聚焦爬虫 功能 根据需求,实现爬虫程序,抓取需要的数据 原理 1.网页都有自己唯一的url(统一资源定位符) 2.网页都是html组成 3.传输协议都是http/https 设计思路 1.确定要爬取的url 2.模拟浏览器通过http协议访问url,获取服务器返回的html代码 3.解析html字符串(根据一定规则提取需要的数据) # URL放入爬取队列原因: 很多网页都有友情链接,如果爬虫漫无目的的爬取数据会爬到其他网站,不同的网站都会存在不同的外部链接,所以有可能会重复,从队列中获取可以避免重复网址的爬取 (5)整体框架 1.python语法 2.使用的python库 urllib.request urllib.parse requests scrapy 3.解析内容方式: 正则表达式 xpath 推荐使用xpath bs4 jsonpath 4.采集动态html(一般模拟浏览器):因为所有的网站都不止存在一个请求(js.csss等动态请求),如果仅仅对网站首页 发送请求,会导致网站内容接受不全 selenium + phantomjs 5.scrapy 高性能异步网络爬虫框架 6.分布式爬虫 scrapy-redis组件 7.反爬虫的一般手段 User-Agent 通过请求头传递给服务器,用以说明访问数据浏览器信息反爬虫:先检查是否有UA,或UA是否合法 代理IP : 西刺代理 验证码访问 : 打码平台 动态加载网页 数据加密 : 分析js代码 爬虫-反爬虫-反反爬虫 2 http协议 (1)常见端口 http 明文传输,端口号80 https 加密传输,端口号443 常见服务器端口号 ftp 21 ssh 22 mysql 3306 MongoDB 27017 redis 6379 (2) http工作原理 url组成 协议 主机HOST 端口号 资源路径 query-string参数 锚点 url: http://www.baidu.com:80/index.html?username=dancer&password=123456#anchor 上网原理 : 一个网页一般都不止有一个url请求,在网页内.js\.css文件也都可以是请求。当所有的请求都下载完成后,浏览器会把css.js.img等都翻译成图文并茂的形式 #请求头详解 Accept Accept-Encoding Accept-Language Cache-Control 缓存控制 Connection Cookie Host Upgrade-Insecure-Requests 是否升级为https协议 User-Agent 用户代理 X-Requested-With ajax请求 #响应头详解 Connection Content-Encoding gzip 压缩格式,浏览器需要对其进行解压缩,我们自己写的爬虫,不要写这个 Content-Type 服务器向客户端回传数据类型 Date Expires 过期时间 Server Transfer-Encoding 内容是否分包传输 (3) http常见的状态码 1 xx:信息 100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。 101 Switching Protocols 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。 2xx:成功 200 OK 请求成功(其后是对GET和POST请求的应答文档) 201 Created 请求被创建完成,同时新的资源被创建。 202 Accepted 供处理的请求已被接受,但是处理未完成。 203 Non-authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。 204 No Content 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。 205 Reset Content 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。 206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它。 3xx:重定向 300 Multiple Choices 多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。 301 Moved Permanently 所请求的页面已经转移至新的url。 302 Moved Temporarily 所请求的页面已经临时转移至新的url。 303 See Other 所请求的页面可在别的url下被找到。 304 Not Modified 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。 305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取。 306 Unused 此代码被用于前一版本。目前已不再使用,但是代码依然被保留。 307 Temporary Redirect 被请求的页面已经临时移至新的url。 4xx:客户端错误 400 Bad Request 服务器未能理解请求。 401 Unauthorized 被请求的页面需要用户名和密码。 401.1 登录失败。 401.2 服务器配置导致登录失败。 401.3 由于 ACL 对资源的限制而未获得授权。 401.4 筛选器授权失败。 401.5 ISAPI/CGI 应用程序授权失败。 401.7 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。 402 Payment Required 此代码尚无法使用。 403 Forbidden 对被请求页面的访问被禁止。 403.1 执行访问被禁止。 403.2 读访问被禁止。 403.3 写访问被禁止。 403.4 要求 SSL。 403.5 要求 SSL 128。 403.6 IP 地址被拒绝。 403.7 要求客户端证书。 403.8 站点访问被拒绝。 403.9 用户数过多。 403.10 配置无效。 403.11 密码更改。 403.12 拒绝访问映射表。 403.13 客户端证书被吊销。 403.14 拒绝目录列表。 403.15 超出客户端访问许可。 403.16 客户端证书不受信任或无效。 403.17 客户端证书已过期或尚未生效。 403.18 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。 403.19 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。 403.20 Passport 登录失败。这个错误代码为 IIS 6.0 所专用。 404 Not Found 服务器无法找到被请求的页面。 404.0 没有找到文件或目录。 404.1 无法在所请求的端口上访问 Web 站点。 404.2 Web 服务扩展锁定策略阻止本请求。 404.3 MIME 映射策略阻止本请求。 405 Method Not Allowed 请求中指定的方法不被允许。 406 Not Acceptable 服务器生成的响应无法被客户端所接受。 407 Proxy Authentication Required 用户必须首先使用代理服务器进行验证,这样请求才会被处理。 408 Request Timeout 请求超出了服务器的等待时间。 409 Conflict 由于冲突,请求无法被完成。 410 Gone 被请求的页面不可用。 411 Length Required "Content-Length" 未被定义。如果无此内容,服务器不会接受请求。 412 Precondition Failed 请求中的前提条件被服务器评估为失败。 413 Request Entity Too Large 由于所请求的实体的太大,服务器不会接受请求。 414 Request-url Too Long 由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。 415 Unsupported Media Type 由于媒介类型不被支持,服务器不会接受请求。 416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。 417 Expectation Failed 执行失败。 423 锁定的错误。 5xx:服务器错误 500 Internal Server Error 请求未完成。服务器遇到不可预知的情况。 500.12 应用程序正忙于在 Web 服务器上重新启动。 500.13 Web 服务器太忙。 500.15 不允许直接请求 Global.asa。 500.16 UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。 500.18 URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。 500.100 内部 ASP 错误。 501 Not Implemented 请求未完成。服务器不支持所请求的功能。 502 Bad Gateway 请求未完成。服务器从上游服务器收到一个无效的响应。 502.1 CGI 应用程序超时。 · 502.2 CGI 应用程序出错。 503 Service Unavailable 请求未完成。服务器临时过载或当机。 504 Gateway Timeout 网关超时。 505 HTTP Version Not Supported 服务器不支持请求中指明的HTTP协议版本 3 抓包工具fiddler (1) 配置https 点击Tools-->options--->https--->选中面板下 Capture Https CONNECTS Decrypt Https Traffic Ignore 复选框后,将Fiddler重启即可 (2) Web Session 面板 主要是Fiddler抓取到的每条http请求(每条称一个session),主要包含了请求的url,协议,状态码,body等信息 (3) 数据统计版 Inspector ImageView标签: JPG 格式使用 ImageView 就可以看到图片 TextView 标签: HTML/JS/CSS 使用 TextView 可以看到响应的内容。 Raw标签: Raw标签可以查看响应报文和响应正文,但是不包含请求报文 Cookies标签: Cookies标签可以看到请求的cookie和响应的set-cookie头信息。 WebForms: post请求所有表单数据 Headers: 请求头和响应头信息 Json\XML: Json或XML格式的数据 其他面板 Statistics面板 HTTP请求的性能和其他数据分析 composer面板 可以模拟向相应的服务器发送数据的过程 Filters面板 Filter标签则可以设置Fiddler的过滤规则,来达到过滤http请求的目的。最简单如:过滤内网http 请求而只抓取internet的http请求,或则过滤相应域名的http请求。 WebSession选择功能 select json\html\image cls清除所有请求 ?xxx搜索 4 Urllib库 (1)版本 python2 urllib urllib2 python3 urllib urllib2 官方文档:https://docs.python.org/2/library/urllib2.html urllib2 源码:https://hg.python.org/cpython/file/2.7/Lib/urllib2.py urllib2 在 python3.x 中被改为urllib.request 字节-->字符串 解码decode 字符串-->字节 编码encode (2)常见的命令 请求响应 urllib.request.urlopen() 返回一个response对象 urllib.request.urlretrieve() 读取内容,直接保存到本地 图片/视频/网页 response.read() 读取二进制数据 response.readline() 读取一行 response.readlines() 读取多行 response.getcode() 获取状态码 response.geturl() 获取请求对象l是由哪个url返回来的 response.getheaders() 获得请求头信息 处理URL urllib.parse.urlencode() 把字典对象解析成url可识别的参数字符串 #例如 url = 'https://www.baidu.com/s?' data = { 'wd':'美女' } source = urllib.parse.urlencode(data) url = url+source print(url) urllib.parse.quote() url编码中只能出现-_.a~z 如果有中文需要进行编码 #例如 url在线编码工具 http://tool.oschina.net/encode?type=4 url = urllib.pares.quote('http://www.baidu.com/user=语言&pass=123') urllib.parse.unquote() url解码 构建请求对象 User-Agent定制 urllib.request.Request 可以使用这个类来定制一个请求对象,来模拟浏览器登录 #模拟请求头 headers = { 'User-Agent':'xxxxx' } request = urllib.request.Request(url=url,headers=headers) response = urllib.request.urlopen(request) print(response.read().decode())

优秀的个人博客,低调大师

Java高级特性入门——泛型、反射和注解

数十款阿里云产品限时折扣中, 赶紧点击这里,领劵开始云上实践吧! 本次直播视频精彩回顾, 戳这里! 本次直播涉及到的PPT, 戳这里! 专家简介: 澳明,阿里巴巴高级开发工程师,来自于阿里巴巴研发效能事业部-研发平台-代码智能化团队。 以下内容根据演讲嘉宾视频分享以及PPT整理而成。 本次的分享主要围绕以下三个方面: 一、泛型介绍 二、反射机制 三、注解的使用 一、泛型介绍 在日常编程的过程中,泛型在这三个特性之中使用频率是最高的。”泛型”一词中的泛字可以理解为泛化的意思,即由具体的、个别的扩大为一般的。Oracle对泛型的官方定义是:泛型类型是通过类型参数化的泛型类或接口。一言以蔽之,泛型就是通过类型参数化,来解决程序的通用性设计和实现的若干问题。 Java泛型是1.5版本后引入的特性,它主要被用于解决三类问题: 1、编译器类型检查 例如上图中的实例1设计了一

优秀的个人博客,低调大师

Spring Boot入门(8)文件上传和数据预览

介绍 本次分享将具体介绍如何在Spring Boot中实现文件上传和数据预览。 我们将实现CSV文件的数据预览和部分图片格式的查看。主要的思路如下: 利用Spring Boot的MultipartFile实现文件的上传; 利用Spring MVC实现整个文件上传流程的控制; 利用javacsv API实现CSV文件的读取; 利用JavaScript实现CSV文件的数据预览 话不多说,我们直接上项目! 项目介绍 整个项目的结构如下: 主要是两部分的内容,一部分是Controller(控制器),一部分是view(视图)文件。UploadController.java是控制器,其代码如下: package com.hello.upload.Controller; import java.util.*; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller public class UploadController{ private String filename; //Save the uploaded file to this folder private static String UPLOADED_FOLDER = "E://upload/src/main/resources/static/images/"; /* **文件上传页面 */ @GetMapping("/upload") public String upload(){ return "upload"; } @PostMapping("/upload") public String singleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) { if (file.isEmpty()) { redirectAttributes.addFlashAttribute("message", "文件为空! 请选择非空文件上传!"); return "redirect:/uploadStatus"; } try { // 获取文件并保存到指定文件夹中 byte[] bytes = file.getBytes(); filename = file.getOriginalFilename(); Path path = Paths.get(UPLOADED_FOLDER + filename); Files.write(path, bytes); redirectAttributes.addFlashAttribute("message", "您已成功上传 '" + filename + "', 该文件大小约为 " +bytes.length/1024+" KB."); } catch (IOException e) { e.printStackTrace(); } return "redirect:/uploadStatus"; } /* ** 文件上传信息处理页面 */ @GetMapping("/uploadStatus") public String uploadStatus(){ return "uploadStatus"; } /* ** 数据预览页面: 支持CSV文件和部分图片格式的预览 */ @GetMapping("/review") public String review(Map<String, Object> map) { map.put("filename", filename); String filetype = filename.split("\\.")[1]; map.put("filetype",filetype); System.out.println(filename); if(filetype.equals("csv")) { readCSV read_csv = new readCSV(UPLOADED_FOLDER + filename); List<String> result = read_csv.read(); map.put("result", result); } return "review"; } } 文件上传的错误处理包含在代码GlobalExceptionHandler.java中,其代码如下: package com.hello.upload.Controller; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.multipart.MultipartException; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MultipartException.class) public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) { redirectAttributes.addFlashAttribute("message", e.getCause().getMessage()); return "redirect:/uploadStatus"; } } 接着readCSV.java主要实现CSV文件内容的读取,其代码如下: package com.hello.upload.Controller; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.csvreader.CsvReader; /* ** readCSV类:实现CSV文件内容的读取 */ public class readCSV { // 参数:文件路径 private String file_path; // 构造函数 readCSV(){} readCSV(String file_path){ this.file_path = file_path; } // getter and setter public String getFile_path() { return file_path; } public void setFile_path(String file_path) { this.file_path = file_path; } // read()函数实现具体的读取CSV文件内容的方法 public List<String> read() { List<String> result = new ArrayList<>(); try { // 创建CSV读对象 CsvReader csvReader = new CsvReader(file_path); while (csvReader.readRecord()){ // 读取每一行数据,以逗号分开 // System.out.println(csvReader.getRawRecord()); result.add(csvReader.getRawRecord()); } csvReader.close(); return result; } catch (IOException e) { e.printStackTrace(); return result; } } } 接着是视图部分,文件都位于templates文件夹下。upload.html文件主要是文件上传的页面,其代码如下: <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Upload files by Spring Boot</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script> </head> <body> <center> <br><br><br> <div class="panel panel-primary" style="width:600px"> <div class="panel-heading"> <h3 class="panel-title">文件上传</h3> </div> <div class="panel-body"> <form class="form-horizontal" role="form" method="POST" action="/upload" enctype="multipart/form-data"> <div class="form-group" style="width:600px"> <label for="upload" class="col-sm-2 control-label">选择文件</label> <div class="col-sm-10"> <input type="file" id="upload" name="file" /> </div> </div> <div class="form-group"> <div> <button type="submit" class="btn btn-success" id="btn_upload">提交</button> <input type="reset" class="btn btn-danger" value="重置" /> </div> </div> </form> </div> </div> </center> </body> </html> uploadStatus.html文件主要用来展示文件上传的信息,包括上传成功和失败的信息,其代码如下: <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <center> <br><br> <h2>文件上传状态</h2> <br><br> <div class="panel panel-success" style="width:1000px"> <div class="panel-heading"> <h3 class="panel-title">文件上传</h3> </div> <div class="panel-body"> <div th:if="${message}"> <h3 th:text="${message}"/> </div> </div> </div> <a href="/upload"><button class="btn btn-primary">返回文件上传</button></a> <a href="/review"><button class="btn btn-warning" id="review">数据预览</button></a> </center> </body> </html> 接着是数据预览部分的HTML,主要实现CSV文件的预览和部分图片格式的查看,其代码如下: <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>文件预览</title> <link href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <link href="/css/table.css" rel="stylesheet"> <script th:inline="javascript"> var filetype = [[${filetype}]]; var filename = [[${filename}]]; function show(){ if(filetype == "csv"){ showTable(); } else if((filetype=="jpg") || (filetype=="png") || (filetype=="gif") || (filetype=="bmp")){ document.getElementById("content").innerHTML = filename; document.getElementById("image").src = "/images/"+filename ; } else{ document.getElementById("content").innerHTML = "文件预览只支持csv文件以及部分格式的图片文件!" } } function showTable(){ document.getElementById("content").innerHTML = filename; var thread_content = document.getElementById("index").innerHTML+""; if (thread_content == ""){ var result = /*[[${result}]]*/ null ; var col_count = result[0].split(",").length; if(result.length > 51){ var record_count = 51; } else{ var record_count = result.length; } // 展示表格各个变量的名称 var headers = result[0].split(","); row=document.createElement("tr"); //创建行 for(var i=0; i< col_count; i++){ th1=document.createElement("th"); //创建单元格 th1.appendChild(document.createTextNode(headers[i])); //为单元格添加内容 row.appendChild(th1); //将单元格添加到行内 } document.getElementById("index").append(row); //将行添加到<thread>中 for(var i=1; i < record_count; i++){ row=document.createElement("tr"); //创建行 for(var j=0; j< col_count; j++){ td1=document.createElement("td"); //创建单元格 td1.appendChild(document.createTextNode(result[i].split(",")[j])); //为单元格添加内容 row.appendChild(td1); //将单元格添加到行内 } document.getElementById("body").append(row); //将行添加到<thread>中 } } } </script> </head> <body> <br><br> <center> <button class="btn btn-danger" onclick="show()">文件预览</button> <a href="/upload"><button class="btn btn-warning" id="review">返回主界面</button></a> <br><br> <p id="content"></p> <div style="width:800px"> <table class="table table-striped table-condensed table-responsive"> <thead id="index"></thead> <tbody id="body"></tbody> </table> </div> <img id="image" src="" /> </center> </body> </html> 最后将以下我们的配置文件,application.properties代码如下: server.port=8100 spring.servlet.multipart.max-file-size=5MB spring.servlet.multipart.max-request-size=5MB spring.http.multipart.enabled=false 其设置网络端口为8100,每次上传的文件大小不超过5MB.项目构建文件build.gradle的代码如下: buildscript { ext { springBootVersion = '2.0.1.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'com.hello' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter-thymeleaf') compile('org.springframework.boot:spring-boot-starter-web') compile group: 'net.sourceforge.javacsv', name: 'javacsv', version: '2.0' testCompile('org.springframework.boot:spring-boot-starter-test') } 运行及测试 好不容易写完了项目,不测试一把,对不起观众啊。 启动Spring Boot项目,在浏览器中输入:http://localhost:8100/upload,页面如下: 选择本地的mpg.csv文件上传,它将会上传至E://upload/src/main/resources/static/images/ 文件夹中,上传成功后的页面如下图: 点击数据预览按钮,跳转到review.html页面,再点击该页面的数据预览按钮,显示的页面如下图: 当然也支持部分图片格式的预览,例如:movie.jpg,如下图: 当上传文件大于5MB时,显示的信息如下: 本次分享到此结束,该项目的Github地址为: https://github.com/percent4/Upload-File-Using-Spring-Boot 。 接下来还会继续更新Spring Boot方面的内容,欢迎大家交流~~ 注意:本人现已开通两个微信公众号: 用Python做数学(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

优秀的个人博客,低调大师

hyperledger v1.0.5 区块链运维入门

摘要 你网上搜索hyperledger大部分文章是讲解开发环境的安装与配置,没有一篇关于怎样运维区块链的文章。当你配置好开发环境,写好合约,怎样落地呢?却很少文章提及。 要将区块链落地,我们必须依赖运维技术,这是IT基础设施,区块链应用将建立在这个基础设施之上,否则区块链就是浮云,悬在空中无法落地。 目录 1. 背景 2. 部署拓扑 2.1. 依赖关系 2.2. 准备物理机 3. 生成证书和创世区块 3.2.1. 启动 Docker 容器 3.2.2. 生成证书 3.2.3. 生成创世区块 3.2.4. 生成通道配置文件 3.2.5. generate anchor peer transaction 3.2.6. 清理 Docker 容器 3.1.1. crypto-config.yaml 3.1.2. configtx.yaml 3.1. 创建配置文件 3.2

优秀的个人博客,低调大师

Spring Boot入门(2)使用MySQL数据库

介绍 本文将介绍如何在Spring项目中连接、处理MySQL数据库。 该项目使用Spring Data JPA和Hibernate来连接、处理MySQL数据库,当然,这仅仅是其中一种方式,你也可以使用Spring JDBC或者MyBatis. Spring Data JPA是Spring Data的一个子项目,主要用于简化数据访问层的实现,使用Spring Data JPA可以轻松实现增删改查、分页、排序等。Spring Data拥有很多子项目,除了Spring Data Jpa外,还有如下子项目。 Spring Data Commons Spring Data MongoDB Spring Data Redis Spring Data Solr Spring Data Gemfire Spring Data REST Spring Data Neo4j Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 本文将介绍如何使用Spring Data JPA和Hibernate来连接、处理MySQL数据库。 准备 首先我们需要对MySQL做一些准备处理。我们将要在MySQL中创建db_example数据库,并创建springuser用户,拥有对db_example数据库的所有操作权限。打开MySQL , 输入以下命令: mysql> create database db_example; -- 创建新数据库db_example mysql> create user 'springuser'@'localhost' identified by 'pwd123'; -- 创建新用户springuser,密码为pwd123 mysql> grant all on db_example.* to 'springuser'@'localhost'; -- 给予springuser用户对db_example数据库的所有操作权限 Spring Boot程序 Step1. 创建项目spring_mysql, 以及项目布局: mkdir spring_mysql cd ./spring_mysql touch build.gradle mkdir -p src/main/java mkdir -p src/main/resources mkdir -p src/test/java mkdir -p src/test/resources Step2 编写build.gradle build.gradle代码如下: buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.RELEASE") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' bootJar { baseName = 'gs-accessing-data-mysql' version = '0.1.0' } repositories { mavenCentral() } sourceCompatibility = 1.8 targetCompatibility = 1.8 dependencies { compile("org.springframework.boot:spring-boot-starter-web") // JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) compile 'org.springframework.boot:spring-boot-starter-data-jpa' // Use MySQL Connector-J compile 'mysql:mysql-connector-java' testCompile('org.springframework.boot:spring-boot-starter-test') } 在上述Spring Boot项目中,主要使用spring-boot-starter-web ,spring-boot-starter-data-jpa和mysql:mysql-connector-java来实现在Web端操作MySQL . Step3 配置属性文件 新建src/main/resources/application.properties文件,配置相关属性,代码如下: spring.jpa.hibernate.ddl-auto=create spring.datasource.url=jdbc:mysql://localhost:3306/db_example spring.datasource.username=springuser spring.datasource.password=pwd123 在上述代码中,主要的数据库操作为新建(create),因为数据库中实现不存在相应的表格。使用MySQL的localhost服务器的3306端口的db_example数据库,并设置用户名和密码。 Step4 编写Java文件 创建src/main/java/hello文件夹(package),在该文件夹下新建User.java,Hibernate会将该entity类自动转化成数据库中的表格。User.java的完整代码如下: package hello; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity // This tells Hibernate to make a table out of this class public class User { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer id; private String name; private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } 在上述文件夹中新建UserRepository.java,其代码如下: package hello; import org.springframework.data.repository.CrudRepository; import hello.User; // This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository // CRUD refers Create, Read, Update, Delete public interface UserRepository extends CrudRepository<User, Long> { } 这是repository接口, 它将会被Spring中的bean中自动执行。 在上述文件夹中新建MainController.java,代码如下: package hello; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import hello.User; import hello.UserRepository; @Controller // This means that this class is a Controller @RequestMapping(path="/demo") // This means URL's start with /demo (after Application path) public class MainController { @Autowired // This means to get the bean called userRepository // Which is auto-generated by Spring, we will use it to handle the data private UserRepository userRepository; @GetMapping(path="/add") // Map ONLY GET Requests public @ResponseBody String addNewUser (@RequestParam String name , @RequestParam String email) { // @ResponseBody means the returned String is the response, not a view name // @RequestParam means it is a parameter from the GET or POST request User n = new User(); n.setName(name); n.setEmail(email); userRepository.save(n); return "Saved"; } @GetMapping(path="/all") public @ResponseBody Iterable<User> getAllUsers() { // This returns a JSON or XML with the users return userRepository.findAll(); } } 这是Spring应用的新控制器(Controller)。 在上述文件夹中新建Application.java,代码如下: package hello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 这是该Spring Boot项目的主要程序入口。 Step5 创建可执行jar包 cd spring_mysql gradle build 执行完毕后,会在build/libs文件夹下生成gs-accessing-data-mysql-0.1.0.jar . 运行及测试 使用以下命令启动该Spring Boot项目 java -jar build/libs/gs-accessing-data-mysql-0.1.0.jar 在浏览器端测试,输入以下网址: localhost:8080/demo/add?name=Alex&email=alex@baidu.com localhost:8080/demo/add?name=Jclian&email=github@sina.com localhost:8080/demo/add?name=Bob&email=bob@google.com localhost:8080/demo/add?name=Cook&email=cook@apple.com localhost:8080/demo/add?name=Mark&email=mark@west.com 上述程序将会name和email参数的值解析成数据库中user表中的记录并储存,浏览器界面如下图: 在浏览器中输入网址localhost:8080/demo/all,即可刚看我们我们插入到MySQL中的记录(JSON格式): 最后我们去MySQL中查看数据是否插入成功,结果如下图所示: 结束语 本文将介绍如何使用Spring Data JPA和Hibernate来连接、处理MySQL数据库。 本次分享到此结束,接下来还会继续更新Spring Boot方面的内容,欢迎大家交流~~

优秀的个人博客,低调大师

Linux入门 yum安装与rpm安装的区别

主要的区别在于: rpm :只能安装已经下载到本地机器上的rpm包,无法解决软件包的依赖关系。 yum:在线下载并安装rpm包,能更新系统,能自动处理包与包之间的依赖问题。 yum YUM被称为 Yellow dog Updater, Modified,是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。 YUM使用Python语言写成。YUM客户端基于RPM包进行管理, 可以通过HTTP服务器下载、FTP服务器下载、本地软件池的等方式获得软件包,可以从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系。 YUM在安装RPM时,会从服务器下载相应包,且缓存在本地。 使用YUM进行RPM包的管理,非常简单方便。 rpm RPM管理支持事务机制。增强了程序安装卸载的管理。 RPM的功能: 打包、安装、查询、升级、卸载、校验、数据库管理。 RPM的缺点: 由于Linux中的程序大多是小程序。程序与程序之间存在非常复杂的依赖关系。RPM无法解决软件包的依赖关系。 RPM包 用RPM工具可以将二进制程序进行打包,包被称为RPM包。RPM包并不是跨平台的

优秀的个人博客,低调大师

Python数据挖掘与机器学习技术入门实战

数十款阿里云产品限时折扣中,赶紧点击这里,领劵开始云上实践吧! 本次直播视频精彩回顾,戳这里! 直播涉及到的PPT,戳这里! 课程主讲简介: 韦玮,企业家,资深IT领域专家/讲师/作家,畅销书《精通Python网络爬虫》作者,阿里云社区技术专家。 以下内容根据主讲嘉宾视频分享以及PPT整理而成。 本次课程包含了五个知识点: 1.数据挖掘与机器学习技术简介 2.Python数据预处理实战 3.常见分类算法介绍 4.对鸢尾花进行分类案例实战 5.分类算法的选择思路与技巧 一、数据挖掘与机器学习技术简介 什么是数据挖掘?数据挖掘指的是对现有的一些数据进行相应的处理和分析,最终得到数据与数据之间深层次关系的一种技术。例如在对超市货品进行摆放时,牛奶到底是和面包摆放在一起销量更高,还是和其他商品摆在一起销量更高。数据挖掘技术就可以用于解决这类问题。

优秀的个人博客,低调大师

Linux常用命令大全(新手入门)

系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo 显示CPU info的信息 cat /proc/interrupts 显示中断 cat /proc/meminfo 校验内存使用 cat /proc/swaps 显示哪些swap被使用 cat /proc/version 显示内核的版本 cat /proc/net/dev 显示网络适配器及统计 cat /proc/mounts 显示已加载的文件系统 lspci -tv 罗列 PCI 设备 lsusb -tv 显示 USB 设备 date 显示系统日期 cal 2007 显示2007年的日历表 date 041217002007.00 设置日期和时间 - 月日时分年.秒 clock -w 将时间修改保存到 BIOS 关机 (系统的关机、重启以及登出 ) shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c 取消按预定时间关闭系统 shutdown -r now 重启(1) reboot 重启(2) logout 注销 文件和目录 cd /home 进入 '/ home' 目录' cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 cd - 返回上次所在的目录 pwd 显示工作路径 ls 查看目录中的文件 ls -F 查看目录中的文件 ls -l 显示文件和目录的详细资料 ls -a 显示隐藏文件 ls *[0-9]* 显示包含数字的文件名和目录名 tree 显示文件和目录由根目录开始的树形结构(1) lstree 显示文件和目录由根目录开始的树形结构(2) mkdir dir1 创建一个叫做 'dir1' 的目录' mkdir dir1 dir2 同时创建两个目录 mkdir -p /tmp/dir1/dir2 创建一个目录树 rm -f file1 删除一个叫做 'file1' 的文件' rmdir dir1 删除一个叫做 'dir1' 的目录' rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容 rm -rf dir1 dir2 同时删除两个目录及它们的内容 mv dir1 new_dir 重命名/移动 一个目录 cp file1 file2 复制一个文件 cp dir/* . 复制一个目录下的所有文件到当前工作目录 cp -a /tmp/dir1 . 复制一个目录到当前工作目录 cp -a dir1 dir2 复制一个目录 ln -s file1 lnk1 创建一个指向文件或目录的软链接 ln file1 lnk1 创建一个指向文件或目录的物理链接 touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm) file file1 outputs the mime type of the file as text iconv -l 列出已知的编码 iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding. find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick) 文件搜索 find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录 find / -user user1 搜索属于用户 'user1' 的文件和目录 find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件 find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件 find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件 find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限 find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备 locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令 whereis halt 显示一个二进制文件、源码或man的位置 which halt 显示一个二进制文件或可执行文件的完整路径 挂载一个文件系统 mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出 fuser -km /mnt/hda2 当设备繁忙时强制卸载 umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用 mount /dev/fd0 /mnt/floppy 挂载一个软盘 mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件 mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统 mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备 mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享 磁盘空间 df -h 显示已经挂载的分区列表 ls -lSr |more 以尺寸大小排列文件和目录 du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间' du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小 rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统) 返回顶部索引 ^ 用户和群组 groupadd group_name 创建一个新用户组 groupdel group_name 删除一个用户组 groupmod -n new_group_name old_group_name 重命名一个用户组 useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户 useradd user1 创建一个新用户 userdel -r user1 删除一个用户 ( '-r' 排除主目录) usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性 passwd 修改口令 passwd user1 修改一个用户的口令 (只允许root执行) chage -E 2005-12-31 user1 设置用户口令的失效期限 pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户 grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组 newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组 返回顶部索引 ^ 文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消 ls -lh 显示权限 ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限 chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限 chown user1 file1 改变一个文件的所有人属性 chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性 chgrp group1 file1 改变文件的群组 chown user1:group1 file1 改变一个文件的所有人和群组属性 find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件 chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限 chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的 chmod g-s /home/public 禁用一个目录的 SGID 位 chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件 chmod o-t /home/public 禁用一个目录的 STIKY 位 返回顶部索引 ^ 文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消 chattr +a file1 只允许以追加方式读写文件 chattr +c file1 允许这个文件能被内核自动压缩/解压 chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件 chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接 chattr +s file1 允许一个文件被安全地删除 chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件 lsattr 显示特殊的属性 返回顶部索引 ^ 打包和压缩文件 bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件 bzip2 file1 压缩一个叫做 'file1' 的文件 gunzip file1.gz 解压一个叫做 'file1.gz'的文件 gzip file1 压缩一个叫做 'file1'的文件 gzip -9 file1 最大程度压缩 rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包 rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1' rar x file1.rar 解压rar包 unrar x file1.rar 解压rar包 tar -cvf archive.tar file1 创建一个非压缩的 tarball tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件 tar -tf archive.tar 显示一个包中的内容 tar -xvf archive.tar 释放一个包 tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下 tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包 tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包 tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包 tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包 zip file1.zip file1 创建一个zip格式的压缩包 zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包 unzip file1.zip 解压一个zip格式压缩包 返回顶部索引 ^ RPM 包 - (Fedora, Redhat及类似系统) rpm -ivh package.rpm 安装一个rpm包 rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告 rpm -U package.rpm 更新一个rpm包但不改变其配置文件 rpm -F package.rpm 更新一个确定已经安装的rpm包 rpm -e package_name.rpm 删除一个rpm包 rpm -qa 显示系统中所有已经安装的rpm包 rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包 rpm -qi package_name 获取一个已安装包的特殊信息 rpm -qg "System Environment/Daemons" 显示一个组件的rpm包 rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表 rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表 rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表 rpm -q package_name --whatprovides 显示一个rpm包所占的体积 rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l rpm -q package_name --changelog 显示一个rpm包的修改历史 rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供 rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表 rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 rpm --checksig package.rpm 确认一个rpm包的完整性 rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性 rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 rpm -Va 检查系统中所有已安装的rpm包- 小心使用 rpm -Vp package.rpm 确认一个rpm包还未安装 rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件 rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包 rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包 返回顶部索引 ^ YUM 软件包升级器 - (Fedora, RedHat及类似系统) yum install package_name 下载并安装一个rpm包 yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 yum update package_name.rpm 更新当前系统中所有安装的rpm包 yum update package_name 更新一个rpm包 yum remove package_name 删除一个rpm包 yum list 列出当前系统中安装的所有包 yum search package_name 在rpm仓库中搜寻软件包 yum clean packages 清理rpm缓存删除下载的包 yum clean headers 删除所有头文件 yum clean all 删除所有缓存的包和头文件 返回顶部索引 ^ DEB 包 (Debian, Ubuntu 以及类似系统) dpkg -i package.deb 安装/更新一个 deb 包 dpkg -r package_name 从系统删除一个 deb 包 dpkg -l 显示系统中所有已经安装的 deb 包 dpkg -l | grep httpd 显示所有名称中包含 "httpd" 字样的deb包 dpkg -s package_name 获得已经安装在系统中一个特殊包的信息 dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表 dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表 dpkg -S /bin/ping 确认所给的文件由哪个deb包提供 返回顶部索引 ^ APT 软件工具 (Debian, Ubuntu 以及类似系统) apt-get install package_name 安装/更新一个 deb 包 apt-cdrom install package_name 从光盘安装/更新一个 deb 包 apt-get update 升级列表中的软件包 apt-get upgrade 升级所有已安装的软件 apt-get remove package_name 从系统删除一个deb包 apt-get check 确认依赖的软件仓库正确 apt-get clean 从下载的软件包中清理缓存 apt-cache search searched-package 返回包含所要搜索字符串的软件包名称 返回顶部索引 ^ 查看文件内容 cat file1 从第一个字节开始正向查看文件的内容 tac file1 从最后一行开始反向查看一个文件的内容 more file1 查看一个长文件的内容 less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作 head -2 file1 查看一个文件的前两行 tail -2 file1 查看一个文件的最后两行 tail -f /var/log/messages 实时查看被添加到一个文件中的内容 返回顶部索引 ^ 文本处理 cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中 cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中 grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug" grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇 grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行 grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug" sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2" sed '/^$/d' example.txt 从example.txt文件中删除所有空白行 sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行 echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容 sed -e '1d' result.txt 从文件example.txt 中排除第一行 sed -n '/stringa1/p' 查看只包含词汇 "string1"的行 sed -e 's/ *$//' example.txt 删除每一行最后的空白字符 sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部 sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容 sed -n '5p;5q' example.txt 查看第5行 sed -e 's/00*/0/g' example.txt 用单个零替换多个零 cat -n file1 标示文件的行数 cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行 echo a b c | awk '{print $1}' 查看一行第一栏 echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏 paste file1 file2 合并两个文件或两栏的内容 paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分 sort file1 file2 排序两个文件的内容 sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份) sort file1 file2 | uniq -u 删除交集,留下其他的行 sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件) comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容 comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容 comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分 返回顶部索引 ^ 字符设置和文件格式转换 dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS recode ..HTML < page.txt > page.html 将一个文本文件转换成html recode -l | more 显示所有允许的转换格式 返回顶部索引 ^ 文件系统分析 badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块 fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性 fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性 fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 返回顶部索引 ^ 初始化一个文件系统 mkfs /dev/hda1 在hda1分区创建一个文件系统 mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统 mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统 mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统 fdformat -n /dev/fd0 格式化一个软盘 mkswap /dev/hda3 创建一个swap文件系统 返回顶部索引 ^ SWAP文件系统 mkswap /dev/hda3 创建一个swap文件系统 swapon /dev/hda3 启用一个新的swap文件系统 swapon /dev/hda2 /dev/hdb3 启用两个swap分区 返回顶部索引 ^ 备份 dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份 dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份 restore -if /tmp/home0.bak 还原一个交互式备份 rsync -rogpav --delete /home /tmp 同步两边的目录 rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录 rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录 dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作 dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件 tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作 ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通过ssh在远程目录中复制一个目录内容 ( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通过ssh在远程目录中复制一个本地目录 tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接 find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录 find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包 dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作 dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容 返回顶部索引 ^ 光盘 cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件 mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件 mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件 cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件 gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件 mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件 cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中 cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中(参数-3) cdrecord --scanbus 扫描总线以识别scsi通道 dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD 返回顶部索引 ^ 网络 - (以太网和WIFI无线) ifconfig eth0 显示一个以太网卡的配置 ifup eth0 启用一个 'eth0' 网络设备 ifdown eth0 禁用一个 'eth0' 网络设备 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址 ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing) dhclient eth0 以dhcp模式启用 'eth0' route -n show routing table route add -net 0/0 gw IP_Gateway configura default gateway route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16' route del 0/0 gw IP_gateway remove static route echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing hostname show hostname of system host www.example.com lookup hostname to resolve name to ip address and viceversa(1) nslookup www.example.com lookup hostname to resolve name to ip address and viceversa(2) ip link show show link status of all interfaces mii-tool eth0 show link status of 'eth0' ethtool eth0 show statistics of network card 'eth0' netstat -tup show all active network connections and their PID netstat -tupl show all network services listening on the system and their PID tcpdump tcp port 80 show all HTTP traffic iwlist scan show wireless networks iwconfig eth1 show configuration of a wireless network card hostname show hostname host www.example.com lookup hostname to resolve name to ip address and viceversa nslookup www.example.com lookup hostname to resolve name to ip address and viceversa whois www.example.com lookup on Whois database GO TOP INDEX ^ Microsoft Windows networks (SAMBA) nbtscan ip_addr netbios name resolution nmblookup -A ip_addr netbios name resolution smbclient -L ip_addr/hostname show remote shares of a windows host smbget -Rr smb://ip_addr/share like wget can download files from a host windows via smb mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share mount a windows network share

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册