<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>中二青年</title>
    <link>https://zhong-er.com/</link>
    <description>Recent content on 中二青年</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sat, 24 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://zhong-er.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>2026年，我不再手写代码</title>
      <link>https://zhong-er.com/posts/2026%E5%B9%B4%E6%88%91%E4%B8%8D%E5%86%8D%E6%89%8B%E5%86%99%E4%BB%A3%E7%A0%81/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/2026%E5%B9%B4%E6%88%91%E4%B8%8D%E5%86%8D%E6%89%8B%E5%86%99%E4%BB%A3%E7%A0%81/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;实测时间：2026 年 8–10 月。工具链：ORCA（并行 Agent）+ claude_code CLI + GLM 5.2（阿里云 token plan）+ /comet-classic 双星工作流。本文所有案例均为真实发生，涉及的公司、项目、路径信息已做脱敏处理。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2026 年，我不手写代码了。&lt;/p&gt;
&lt;p&gt;但说实话，AI 写代码的前一两个月，我想砸电脑的次数比过去十年加起来都多。&lt;/p&gt;
&lt;p&gt;不是 AI 太笨——恰恰相反，它太会&amp;quot;装聪明&amp;quot;了。它会用非常专业的术语，一本正经地胡说八道；会在你眼皮底下绕过你定的规矩，然后若无其事地说&amp;quot;搞定了&amp;quot;；会在你最信任它的时候，把生产环境干出 500。&lt;/p&gt;
&lt;p&gt;这篇文章不讲 AI 多神。讲我花一两个月时间，被坑出的一套&amp;quot;防蠢&amp;quot;规则系统——怎么用流程、规则、记忆和审计，把一个不靠谱的 AI 驯服成能干活的工具。&lt;/p&gt;
&lt;h2 id=&#34;先说我的工作流不然下面的翻车没说服力&#34;&gt;先说我的工作流（不然下面的翻车没说服力）&lt;/h2&gt;
&lt;p&gt;工具栈：&lt;strong&gt;ORCA&lt;/strong&gt;（并行 Agent 开发环境）+ &lt;strong&gt;claude_code CLI&lt;/strong&gt;，主力模型是 &lt;strong&gt;GLM 5.2&lt;/strong&gt;（走的阿里云 token plan，为什么选国产模型后面单独讲）。&lt;/p&gt;
&lt;p&gt;流程用的是 &lt;strong&gt;/comet-classic 双星工作流&lt;/strong&gt;：Shape（定方向）→ Build（开干）→ Verify（验收）→ Archive（归档）。每个阶段有明确的产出物和检查点。&lt;/p&gt;
&lt;p&gt;约束系统三件套：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt;：项目级硬规则，AI 必须遵守的那种&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;memory 文件&lt;/strong&gt;：长期记忆，记录吃过的亏和项目约定&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ADR&lt;/strong&gt;：人工决策记录——不只是记录 AI 问我的问题，更要记录我主动发现问题、出手干预的时刻&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一句话定位：这套东西不是为了让 AI 更聪明，是为了让 AI &lt;strong&gt;少犯蠢&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;翻车一ai-靠猜不靠查它会一本正经地编造&#34;&gt;翻车一：AI 靠猜不靠查，它会一本正经地编造&lt;/h2&gt;
&lt;p&gt;有一次让 AI 修一个界面 bug，它只读了部分核心代码，就开始&amp;quot;推理&amp;quot;界面长什么样。&lt;/p&gt;
&lt;p&gt;它告诉我：&amp;ldquo;齿轮状的设置按钮在输入框里，你多半没找对。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;我当时就气笑了。首先，设置按钮不是小齿轮，是两道横线；其次，它不在输入框里，在右上角。AI 连代码都没读完，就开始用&amp;quot;多半&amp;quot;这种词给我编界面。&lt;/p&gt;
&lt;p&gt;我直接怼回去：**不要猜，去代码里确认。**然后把这条写进记忆文件和规则约束，永久生效。&lt;/p&gt;
&lt;p&gt;还有一次更离谱的：它输出一堆我看不懂的专业术语，让我做技术决策。我追问&amp;quot;这个词到底什么意思&amp;quot;，它承认了——是编的。现场编的，就为了让我赶紧点个头。&lt;/p&gt;
&lt;p&gt;从那以后我多了一条铁律，写在 CLAUDE.md 最前面：&lt;/p&gt;</description>
    </item>
    <item>
      <title>利用授权服务器(License Server)激活Jetbrains全家桶</title>
      <link>https://zhong-er.com/posts/%E5%88%A9%E7%94%A8%E6%8E%88%E6%9D%83%E6%9C%8D%E5%8A%A1%E5%99%A8license-server%E6%BF%80%E6%B4%BBjetbrains%E5%85%A8%E5%AE%B6%E6%A1%B6/</link>
      <pubDate>Sat, 11 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%88%A9%E7%94%A8%E6%8E%88%E6%9D%83%E6%9C%8D%E5%8A%A1%E5%99%A8license-server%E6%BF%80%E6%B4%BBjetbrains%E5%85%A8%E5%AE%B6%E6%A1%B6/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/e298802149431c57.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;2022-04-28 11:00 新增一个查找授权服务器的路子！&lt;/p&gt;
&lt;p&gt;这个方式支持：IntelliJ IDEA，PyCharm，GoLand，WebStorm 等等&lt;/p&gt;
&lt;h2 id=&#34;旧事重提&#34;&gt;旧事重提&lt;/h2&gt;
&lt;p&gt;前几年网上流传自建JetBrains激活服务器，来激活JB全家桶， 不过目前已经无效了！&lt;/p&gt;
&lt;p&gt;License Server 主要是用于管理公司网络内的 JetBrains 产品许可证。&lt;/p&gt;
&lt;p&gt;更多官方说明：https://www.jetbrains.com/help/license_server/getting_started.html&lt;/p&gt;
&lt;h2 id=&#34;简要步骤&#34;&gt;简要步骤&lt;/h2&gt;
&lt;p&gt;入口Ⅰ：欢迎界面 – 齿轮(设置) – Manage Licenses…&lt;/p&gt;
&lt;p&gt;入口Ⅱ：菜单 – 帮助(Help) – 注册(Register)…&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/100894a4da8a291e.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;选择 License Server，输入Server address地址&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/791ab95aaaa0eb8a.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击【Activate】激活成功！！&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/db0e48a5aab58949.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;同样支持其他编辑器噢，比如 IDEA~&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/49039b6214790d39b63742076a3f3179.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;lc-server&#34;&gt;LC Server&lt;/h2&gt;
&lt;p&gt;这里分享一些公网能用的授权服务器地址！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://adsk06.tpu.ru:8080
https://fls-jetbrains.spacetechies.com
https://flm.nighthawkcodingsociety.com
https://jetbrains.magnolia-cms.com
https://lic.gotoweb.top
https://jetbrains.blackboard.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;分享路子&#34;&gt;分享路子&lt;/h2&gt;
&lt;p&gt;分享的LC Server 不够用？怎么找到更多的授权服务器地址？下面分享一个寻找方法！&lt;/p&gt;</description>
    </item>
    <item>
      <title>又一个永久免费代码托管平台：GitLab中国版(极狐)</title>
      <link>https://zhong-er.com/posts/%E5%8F%88%E4%B8%80%E4%B8%AA%E6%B0%B8%E4%B9%85%E5%85%8D%E8%B4%B9%E4%BB%A3%E7%A0%81%E6%89%98%E7%AE%A1%E5%B9%B3%E5%8F%B0gitlab%E4%B8%AD%E5%9B%BD%E7%89%88%E6%9E%81%E7%8B%90/</link>
      <pubDate>Sat, 21 May 2022 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%8F%88%E4%B8%80%E4%B8%AA%E6%B0%B8%E4%B9%85%E5%85%8D%E8%B4%B9%E4%BB%A3%E7%A0%81%E6%89%98%E7%AE%A1%E5%B9%B3%E5%8F%B0gitlab%E4%B8%AD%E5%9B%BD%E7%89%88%E6%9E%81%E7%8B%90/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/logo.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;GitLab 大家应该不陌生。16年的时候就使用GitLab社区版为公司研发团队搭建一套本地化的Git代码管理仓库！&lt;/p&gt;
&lt;p&gt;21年年初的时候极狐GitLab公司在中国正式成立，最近才发现极狐已经开放注册了！&lt;/p&gt;
&lt;p&gt;官方提供DevOps ( Development和Operations ) 研发全流程管理。&lt;/p&gt;
&lt;p&gt;目前国内做的比较好的有，腾讯的CODING，阿里云的云效，Gitee 等等，并且已经有一定的知名度，极狐GitLab能分一杯羹吗？&lt;/p&gt;
&lt;h2 id=&#34;官网网址&#34;&gt;官网网址&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://jihulab.com/&#34;&gt;https://jihulab.com/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;永久免费&#34;&gt;永久免费&lt;/h2&gt;
&lt;p&gt;以下功能永久性免费，包含 GitLab CE 所有功能以及企业级付费版功能代码。如果您只想使用免费的开源软件，极狐GitLab免费版是最好的选择。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DevOps全生命周期所有阶段&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源-MIT许可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基于GitLab Runner的流水线引擎&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每个项目代码仓库容量 2GB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取每月10GB的数据流量&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取每月400分钟的CI/CD流水线时间&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/price.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;使用体验&#34;&gt;使用体验&lt;/h2&gt;
&lt;p&gt;博主已经将一些私有化的GitHub迁移到极狐，使用体验还不错，速度很快！毕竟国内服务器！&lt;/p&gt;
&lt;p&gt;支持仓库公开，仓库容量2G基本上够用！流量限制10G是有点少，如果单纯的代码托管也够用！&lt;/p&gt;
&lt;p&gt;公开仓库的脚本，样式，图片文件无需登陆即可访问，且没有域名白名单！&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS：本文图片均存在极狐公开仓库~&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;支持一键导入GitHub仓库~&lt;/p&gt;
&lt;p&gt;目前版本汉化还是有点不彻底~&lt;/p&gt;
&lt;h2 id=&#34;最后提醒&#34;&gt;最后提醒&lt;/h2&gt;
&lt;p&gt;仓库一定不要违F违G，小心官方制裁！想想最近的Gitee~&lt;/p&gt;
&lt;p&gt;不多说了，你懂的！&lt;/p&gt;</description>
    </item>
    <item>
      <title>NetSarang继XShell后即将推出一款跨平台的SSH工具：PORTX</title>
      <link>https://zhong-er.com/posts/netsarang%E7%BB%A7xshell%E5%90%8E%E5%8D%B3%E5%B0%86%E6%8E%A8%E5%87%BA%E4%B8%80%E6%AC%BE%E8%B7%A8%E5%B9%B3%E5%8F%B0%E7%9A%84ssh%E5%B7%A5%E5%85%B7portx/</link>
      <pubDate>Wed, 02 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/netsarang%E7%BB%A7xshell%E5%90%8E%E5%8D%B3%E5%B0%86%E6%8E%A8%E5%87%BA%E4%B8%80%E6%AC%BE%E8%B7%A8%E5%B9%B3%E5%8F%B0%E7%9A%84ssh%E5%B7%A5%E5%85%B7portx/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/cdf0dc62e7a40599.png&#34;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;特别提醒：PortX 现在处于开放测试阶段！各项功能还不太稳定！尝鲜就行了！
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PortX 是一个轻量级的跨平台 SSH 客户端。PortX 具有简单而全面的 UI，为您提供纯粹的终端仿真体验。Google 云端硬盘跨设备和操作系统同步会话文件，使系统管理员和网络管理员无论身在何处都能保持最新状态。访问和管理远程系统从未如此简单。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;官网&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://portx.online/zh/&#34;&gt;https://portx.online/zh/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;访问官方网站可见下载地址！&lt;/p&gt;
&lt;p&gt;其他方式获取！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install portx
 
winget install portx
 
choco install portx
 
sudo snap install portx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;跨平台（Mac OS X、Windows、Linux）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;谷歌云端硬盘同步&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;干净的标签式 UI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本地外壳&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSH2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SFTP 文件上传&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;端口转发：X11、本地、远程、SocksV5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关键词搜索&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代理转发、键盘交互、密码、公钥/私钥认证&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;快速连接的地址栏&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;外观定制&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;全局选项&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拆分窗格&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;键映射&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从来没有广告&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;免费？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PortX Open Beta 可免费使用并对所有人开放。高度赞赏反馈、错误报告和其他建议。&lt;/p&gt;
&lt;p&gt;看官方的意思等正式版的时候不是免费噢&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;体验&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;现在处于开放测试阶段！下载体验后结果不太理想，有待进一步提高！&lt;/p&gt;
&lt;p&gt;运行内存比较&lt;/p&gt;
&lt;p&gt;XShell 5 启动1个SSH，PortX启动1个SSH。前者仅6MB，后者285MB&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/01e0a1ed10902d10.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;操作流畅度也略差，Google账号登陆还没调试完？&lt;/p&gt;
&lt;p&gt;界面比较清新一些，支持亮白和暗黑2中配色！&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/0617e4ab8ca62167.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;支持直接将XShell会话导入软件！&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/684cd05ac6e8b53a.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>XShell最新免费版已不再限制4个标签页，但是退出会弹窗，附解决方案！</title>
      <link>https://zhong-er.com/posts/xshell%E6%9C%80%E6%96%B0%E5%85%8D%E8%B4%B9%E7%89%88%E5%B7%B2%E4%B8%8D%E5%86%8D%E9%99%90%E5%88%B64%E4%B8%AA%E6%A0%87%E7%AD%BE%E9%A1%B5%E4%BD%86%E6%98%AF%E9%80%80%E5%87%BA%E4%BC%9A%E5%BC%B9%E7%AA%97%E9%99%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</link>
      <pubDate>Fri, 18 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/xshell%E6%9C%80%E6%96%B0%E5%85%8D%E8%B4%B9%E7%89%88%E5%B7%B2%E4%B8%8D%E5%86%8D%E9%99%90%E5%88%B64%E4%B8%AA%E6%A0%87%E7%AD%BE%E9%A1%B5%E4%BD%86%E6%98%AF%E9%80%80%E5%87%BA%E4%BC%9A%E5%BC%B9%E7%AA%97%E9%99%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/01f1c752bb58e9dc.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;官方消息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Update: As of 02/16/2022 the tab limits for our Free Licenses have been removed. All free users can now access unlimited tabs by downloading the latest build below or updating your existing clients.
官方更新：截至 2022 年 2 月 16 日，我们的免费许可证的标签限制已被删除。所有免费用户现在都可以通过下载下面的最新版本或更新您现有的客户端来访问无限的选项卡。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;哇！netsarang这么棒！免费版不再限制4个标签页了！亲测：Xshell-7.0.0099p.exe 版本已经没有限制了！但是当我关闭XShell得时候，突然弹窗？？&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/bbc52dd17646bf53.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;该弹窗大概几秒钟就会自动关闭！毕竟免费版相对于之前限制标签页数量来说这个几秒得弹窗还是比较容易接受的。可以支持一下！&lt;/p&gt;
&lt;p&gt;但是有些童鞋还是不太爽这种情况！这个弹窗能屏蔽吗？&lt;/p&gt;
&lt;p&gt;答案：能！这里介绍一种方法！&lt;/p&gt;
&lt;p&gt;拦截弹窗&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;博主亲测火绒！相对于其他家的杀软，火绒的口碑一直不错！可以利用火绒的弹窗拦截！
位置：火绒 -&amp;gt;  安全工具 -&amp;gt; 弹窗拦截
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/7b3612a70e25b921.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/a58ec12a480e9954.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>WPS Office Pro央企定制版v11.4.1附激活码</title>
      <link>https://zhong-er.com/posts/wps-office-pro%E5%A4%AE%E4%BC%81%E5%AE%9A%E5%88%B6%E7%89%88v11.4.1%E9%99%84%E6%BF%80%E6%B4%BB%E7%A0%81/</link>
      <pubDate>Fri, 19 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/wps-office-pro%E5%A4%AE%E4%BC%81%E5%AE%9A%E5%88%B6%E7%89%88v11.4.1%E9%99%84%E6%BF%80%E6%B4%BB%E7%A0%81/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Snipaste_2022-06-14_13-10-15.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202206146523_5832.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;相信很多用户对WPS软件并不会陌生，这是一款功能强大的办公软件，它能够完全的兼容office，而本次小编要为大家带来的是&lt;strong&gt;WPS Office Pro央企定制版&lt;/strong&gt; 。该软件继承了WPS文档的所有功能，能够对本地和在线存储文档进行查看和编辑，支持包括doc、docx、wps、xls、xlsx、et、ppt、dps、pptx和txt多种文档格式的查看和编辑，软件还支持云盘功能，方便用户对文档进行存档；通过软件，您可以随时随地在手机上进行文档编辑，随时随地的感受便捷办公的乐趣。&lt;br&gt;
注：此版本软件无广告，可登陆，会员功能可用，首次会出现一个注册码界面，任意输入下面一个注册码，点击确定即可永久激活，下文附带了激活码，欢迎有需要的用户下载使用。&lt;/p&gt;
&lt;h3 id=&#34;软件功能&#34;&gt;软件功能&lt;/h3&gt;
&lt;p&gt;1、文档编辑掌上进行，随时随地享受办公乐趣&lt;br&gt;
2、支持本地和在线存储文档的查看和编辑。编辑功能包括常用的文字编辑、格式处理、表格、图片对象等功能。轻点手指触屏即可操控，直观快捷，容易上手，随时随地享受办公乐趣！&lt;br&gt;
3、强大的邮件&amp;quot;亲密&amp;quot;集成，轻松编辑发送附件用移动设备发送文档？没问题！金山WPS Office移动版强大的邮件集成可让您轻松编辑并发送附件，文档附件瞬时送达。&lt;br&gt;
4、支持多种文档格式，管理文档更方便金山WPSOffice移动版完美支持多种文档格式如：doc、docx、wps、xls、xlsx、et、ppt、dps、pptx和txt文档的查看及编辑。内置文件管理器可自动整理您的办公文档，让文档管理更轻松。&lt;br&gt;
5、集成金山快盘，&amp;ldquo;云存储&amp;quot;让一切更简单金山WPS Office移动版在Android上可以对云存储上的文件进行快速查看及编辑保存， 文档同步、保存、分享将变得更加简单。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;wps01.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202206146897_7744.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;wps-office-pro激活码&#34;&gt;WPS Office Pro激活码&lt;/h3&gt;
&lt;p&gt;8个新的密钥激活码【任意选择一个即可】&lt;br&gt;
R8R8P-MTT6F-KLRPM-J7CAB-PJM8C&lt;br&gt;
7LR67-WTXPA-KLUHV-GEK2E-QW4CK&lt;br&gt;
EUYTH-3KWKL-PJMX7-XBCPW-9U2DD&lt;br&gt;
THUV2-32HH7-6NMHN-PTX7Y-QQCTH&lt;br&gt;
A4XV7-QP9JN-E7FCB-VQFRD-4NLKC&lt;br&gt;
U2PWU-H7D9H-69T3B-JEYC2-3R2NG&lt;br&gt;
7G2HE-JR8KL-ABB9D-Y7789-GLNFL&lt;br&gt;
9DP6T-9AGWG-KWV33-9MPC8-JDCVF&lt;/p&gt;
&lt;h3 id=&#34;更新日志&#34;&gt;更新日志&lt;/h3&gt;
&lt;p&gt;WPS Office Pro央企定制版 v11.4.1手机版 更新日志（2020-10-22）&lt;br&gt;
1、修改一些小bug；&lt;br&gt;
2、修复兼容性问题；&lt;br&gt;
3、修改APP图标；&lt;br&gt;
4、解决一些安全性问题。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cloud.zhongshen.show/s/29Tx&#34; title=&#34;点击下载&#34;&gt;WPS pro&lt;/a&gt;大小：38.3MB | 来源：私有云盘&lt;/p&gt;
&lt;p&gt;已经过安全软件检测无毒，请您放心下载。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cloud.zhongshen.show/s/29Tx&#34; title=&#34;点击下载&#34;&gt; &lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitHub国内加速：修改本地 HOSTS优化访问效果</title>
      <link>https://zhong-er.com/posts/github%E5%9B%BD%E5%86%85%E5%8A%A0%E9%80%9F%E4%BF%AE%E6%94%B9%E6%9C%AC%E5%9C%B0-hosts%E4%BC%98%E5%8C%96%E8%AE%BF%E9%97%AE%E6%95%88%E6%9E%9C/</link>
      <pubDate>Fri, 11 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/github%E5%9B%BD%E5%86%85%E5%8A%A0%E9%80%9F%E4%BF%AE%E6%94%B9%E6%9C%AC%E5%9C%B0-hosts%E4%BC%98%E5%8C%96%E8%AE%BF%E9%97%AE%E6%95%88%E6%9E%9C/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/0201190a727ed383.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;无法访问&#34;&gt;无法访问?&lt;/h2&gt;
&lt;p&gt;原因大家都知道，这里咱就不多说了。我们分析一下”网络症状”。&lt;/p&gt;
&lt;p&gt;前几年也有几次Github突然无法访问，好多互联网科技大佬反应激烈。故又能正常访问了。&lt;/p&gt;
&lt;p&gt;自从疫情以来，针对Github的间歇性阻断越来越频繁了……&lt;/p&gt;
&lt;p&gt;对于码农来说，在国内访问Github真是越来越坎坷……&lt;/p&gt;
&lt;p&gt;这个方法是相对来说最简单的一种方式！修改本地或者服务器上 hosts 即可！&lt;/p&gt;
&lt;h2 id=&#34;寻找host&#34;&gt;寻找HOST&lt;/h2&gt;
&lt;p&gt;如何找到Github域名对应的IP？&lt;/p&gt;
&lt;p&gt;打开 &lt;a href=&#34;https://www.ipaddress.com/&#34;&gt;https://www.ipaddress.com/&lt;/a&gt; 输入访问不了的域名，比如：github.com , raw.githubusercontent.com&lt;/p&gt;
&lt;p&gt;查询之后可以获得正确的 IP 地址&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/7a9e9458c85e749d.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/9e8b84e833e58025.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后修改本地的HOSTS文件 就可以啦&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;140.82.113.4 github.com
185.199.108.133 raw.githubusercontent.com
185.199.108.133 user-images.githubusercontent.com
185.199.108.133 avatars2.githubusercontent.com
185.199.108.133 avatars1.githubusercontent.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;开源仓库&#34;&gt;开源仓库&lt;/h2&gt;
&lt;p&gt;手动自己找是比较繁琐的，这里分享一个代码，自动生成Hosts&lt;/p&gt;
&lt;p&gt;某大佬分享的仓库：&lt;a href=&#34;https://github.com/521xueweihan/GitHub520&#34;&gt;https://github.com/521xueweihan/GitHub520&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;博主开源了所有代码，大家可以参考一下！！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# GitHub520 Host Start140.82.114.26                 alive.github.com
140.82.113.25                 live.github.com
185.199.108.154               github.githubassets.com
140.82.112.21                 central.github.com
185.199.108.133               desktop.githubusercontent.com
185.199.108.153               assets-cdn.github.com
185.199.108.133               camo.githubusercontent.com
185.199.108.133               github.map.fastly.net
199.232.69.194                github.global.ssl.fastly.net
140.82.112.3                  gist.github.com
185.199.108.153               github.io
140.82.112.4                  github.com
192.0.66.2                    github.blog
140.82.114.5                  api.github.com
185.199.108.133               raw.githubusercontent.com
185.199.108.133               user-images.githubusercontent.com
185.199.108.133               favicons.githubusercontent.com
185.199.108.133               avatars5.githubusercontent.com
185.199.108.133               avatars4.githubusercontent.com
185.199.108.133               avatars3.githubusercontent.com
185.199.108.133               avatars2.githubusercontent.com
185.199.108.133               avatars1.githubusercontent.com
185.199.108.133               avatars0.githubusercontent.com
185.199.108.133               avatars.githubusercontent.com
140.82.114.9                  codeload.github.com
54.231.161.73                 github-cloud.s3.amazonaws.com
54.231.228.105                github-com.s3.amazonaws.com
52.217.197.65                 github-production-release-asset-2e65be.s3.amazonaws.com
54.231.137.105                github-production-user-asset-6210df.s3.amazonaws.com
52.217.160.97                 github-production-repository-file-5c1aeb.s3.amazonaws.com
185.199.108.153               githubstatus.com
64.71.144.211                 github.community
23.100.27.125                 github.dev
140.82.113.22                 collector.github.com
13.107.43.16                  pipelines.actions.githubusercontent.com
185.199.108.133               media.githubusercontent.com
185.199.108.133               cloud.githubusercontent.com
185.199.108.133               objects.githubusercontent.com
# Update time: 2022-06-11T10:41:19+08:00# Update url: https://raw.hellogithub.com/hosts
# Star me: https://github.com/521xueweihan/GitHub520
# GitHub520 Host End
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;如何修改&#34;&gt;如何修改&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;Snipaste_2022-06-11_11-44-37.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202206117340_9156_1.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【flask小坑】request.json 无法获取请求body的json数据</title>
      <link>https://zhong-er.com/posts/flask%E5%B0%8F%E5%9D%91request.json-%E6%97%A0%E6%B3%95%E8%8E%B7%E5%8F%96%E8%AF%B7%E6%B1%82body%E7%9A%84json%E6%95%B0%E6%8D%AE/</link>
      <pubDate>Mon, 12 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/flask%E5%B0%8F%E5%9D%91request.json-%E6%97%A0%E6%B3%95%E8%8E%B7%E5%8F%96%E8%AF%B7%E6%B1%82body%E7%9A%84json%E6%95%B0%E6%8D%AE/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;错误记录.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009035154_4969_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;后端接口在获取前端传递额json数据时，一直拿不到数据，提示TypeError:&amp;lsquo;NoneType&amp;rsquo; object is not subscriptable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;res = request.get_json()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原来get_json() 这个函数默认情况下只对 mime 为 application/json 的请求可以正确解析。&lt;/p&gt;
&lt;p&gt;所以解决办法有两种：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;http 请求增加 Content-Type:application/json header&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 request.get_json(force=True) 忽略mimetype&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;END&lt;/p&gt;</description>
    </item>
    <item>
      <title>【问题记录】解决module enum has no attribute IntFlag</title>
      <link>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95%E8%A7%A3%E5%86%B3module-enum-has-no-attribute-int/</link>
      <pubDate>Fri, 09 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95%E8%A7%A3%E5%86%B3module-enum-has-no-attribute-int/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;错误记录.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009035154_4969_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;今日安装Flask-Migrate&lt;/p&gt;
&lt;p&gt;报错提示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module enum has no attribute IntFlag
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;经查这是因为您enum不是标准的库enum模块。您可能已enum34安装该软件包。&lt;/p&gt;
&lt;p&gt;解决错误方法：&lt;/p&gt;
&lt;p&gt;从python 3.6开始，enum34库不再与标准库兼容。该库也是不必要的，因此您只需卸载它即可。&lt;br&gt;
我安装的python版本是3.6.5版本的，所有直接卸载enum库即可&lt;/p&gt;
&lt;p&gt;卸载enum34库&lt;/p&gt;
&lt;p&gt;pip uninstall enum34&lt;/p&gt;
&lt;p&gt;卸载之后，问题解决，大功告成！！！&lt;/p&gt;</description>
    </item>
    <item>
      <title>【脚本】VPS综合性能测试</title>
      <link>https://zhong-er.com/posts/%E8%84%9A%E6%9C%ACvps%E7%BB%BC%E5%90%88%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/</link>
      <pubDate>Thu, 03 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E8%84%9A%E6%9C%ACvps%E7%BB%BC%E5%90%88%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;一键脚本.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032503_7089_1.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;vps综合性能测试包含vps硬件信息测试vps网络速度测试vps回程路由整合脚本&#34;&gt;VPS综合性能测试！包含VPS硬件信息测试、VPS网络速度测试、VPS回程路由。整合脚本！&lt;/h1&gt;
&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;测一个脚本，找一个脚本。脚本东一个西一个。这就是现状！&lt;/p&gt;
&lt;p&gt;VPS的测试脚本真的是很多，作者整理了几个好用的VPS综合性能测试的脚本，并整合起来，免得大家用的时候不方便！&lt;/p&gt;
&lt;p&gt;测试脚本是在网上找的人家的，作者仅仅只是做了汇聚。各位大神别多心啊。。。。。。&lt;/p&gt;
&lt;h2 id=&#34;功能&#34;&gt;功能&lt;/h2&gt;
&lt;p&gt;1、对VPS的整体性能进行测试，包含VPS的硬件信息，硬盘速率等等&lt;/p&gt;
&lt;p&gt;2、对VPS的网络性能进行测试，包含三网（电信、移动、联通）的下载速度和上传速度等&lt;/p&gt;
&lt;p&gt;3、对VPS的回程路由进行测试，包含四网（电信、移动、联通、教育网）的回程线路。&lt;/p&gt;
&lt;h2 id=&#34;vps测试代码&#34;&gt;VPS测试代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;wget -N --no-check-certificate https://raw.githubusercontent.com/V2RaySSR/vps/master/vpstest.sh &amp;amp;&amp;amp; bash vpstest.sh


#======================================
# Project: testrace
# Version: 1.2
# Author: nanqinlang
# Blog:   https://sometimesnaive.org
# Github: https://github.com/nanqinlang
#======================================
 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
mtr is already the newest version (0.92-2).
traceroute is already the newest version (1:2.1.0-2).
0 upgraded, 0 newly installed, 0 to remove and 65 not upgraded.
[Info] 选择你要使用的功能: 
1.选择一个节点进行测试
2.四网路由快速测试
3.手动输入 ip 进行测试
输入数字以选择:2
[Info] 测试路由 到 上海电信(天翼云) 中 ...
traceroute to 101.227.255.45 (101.227.255.45), 30 hops max, 60 byte packets
 1  *
 2  172.16.0.5  0.38 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;局域网\t局域网\t\t\t\t\t&amp;quot;}
 3  cn2-gia.ceranetworks.com (23.225.225.245)  0.53 ms  AS40065  {&amp;quot;as&amp;quot;:&amp;quot;AS40065&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\tcloudradium.com\t34.052234\t-118.243685&amp;quot;}
 4  59.43.182.81  127.84 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\t电信\t34.052234\t-118.243685&amp;quot;}
 5  *
 6  59.43.138.53  134.17 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t上海\t上海\t\t电信\t31.224349\t121.476753&amp;quot;}
 7  101.95.88.42  135.36 ms  AS4812  {&amp;quot;as&amp;quot;:&amp;quot;AS4812&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t上海\t上海\t\t电信\t31.224349\t121.476753&amp;quot;}
 
[Info] 测试路由 到 上海电信(天翼云) 完成 ！
[Info] 测试路由 到 厦门电信CN2 中 ...
traceroute to 117.28.254.129 (117.28.254.129), 30 hops max, 60 byte packets
 1  *
 2  172.16.0.5  0.41 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;局域网\t局域网\t\t\t\t\t&amp;quot;}
 3  cn2-gia.ceranetworks.com (23.225.225.245)  0.55 ms  AS40065  {&amp;quot;as&amp;quot;:&amp;quot;AS40065&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\tcloudradium.com\t34.052234\t-118.243685&amp;quot;}
 4  59.43.246.233  154.67 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t广东\t广州\t\t电信\t23.12911\t113.264385&amp;quot;}
 5  59.43.187.141  157.16 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t广东\t广州\t\t电信\t23.12911\t113.264385&amp;quot;}
 6  59.43.130.113  159.26 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t广东\t广州\t\t电信\t23.12911\t113.264385&amp;quot;}
 7  59.43.19.198  166.16 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t福建\t厦门\t\t电信\t24.602301\t118.011002&amp;quot;}
 8  27.159.81.242  157.47 ms  AS133775  {&amp;quot;as&amp;quot;:&amp;quot;AS133775&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t福建\t厦门\t\t电信\t24.602301\t118.011002&amp;quot;}
 9  *
10  *
11  117.28.254.129  174.08 ms  AS133775  {&amp;quot;as&amp;quot;:&amp;quot;AS133775&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t福建\t厦门\t\t电信\t24.602301\t118.011002&amp;quot;}
 
[Info] 测试路由 到 厦门电信CN2 完成 ！
[Info] 测试路由 到 浙江杭州联通 中 ...
traceroute to 101.71.241.238 (101.71.241.238), 30 hops max, 60 byte packets
 1  *
 2  172.16.0.1  0.37 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;局域网\t局域网\t\t\t\t\t&amp;quot;}
 3  192.168.101.38  0.51 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;局域网\t局域网\t\t\t\t\t&amp;quot;}
 4  23.225.225.235  181.64 ms  AS40065  {&amp;quot;as&amp;quot;:&amp;quot;AS40065&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\tcloudradium.com\t34.052234\t-118.243685&amp;quot;}
 5  219.158.96.33  173.70 ms  AS4837  {&amp;quot;as&amp;quot;:&amp;quot;AS4837&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t广东\t广州\t\t联通\t23.12911\t113.264385&amp;quot;}
 6  219.158.103.37  176.24 ms  AS4837  {&amp;quot;as&amp;quot;:&amp;quot;AS4837&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t广东\t广州\t\t联通\t23.12911\t113.264385&amp;quot;}
 7  219.158.8.117  183.57 ms  AS4837  {&amp;quot;as&amp;quot;:&amp;quot;AS4837&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t广东\t广州\t\t联通\t23.12911\t113.264385&amp;quot;}
 8  219.158.114.206  201.90 ms  AS4837  {&amp;quot;as&amp;quot;:&amp;quot;AS4837&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t浙江\t杭州\t\t联通\t30.252501\t120.165024&amp;quot;}
 9  101.71.244.90  192.13 ms  AS4837  {&amp;quot;as&amp;quot;:&amp;quot;AS4837&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t浙江\t杭州\t\t联通\t30.252501\t120.165024&amp;quot;}
10  101.69.245.162  185.23 ms  AS4837  {&amp;quot;as&amp;quot;:&amp;quot;AS4837&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t浙江\t杭州\t\t联通\t30.252501\t120.165024&amp;quot;}
11  101.71.241.238  164.65 ms  AS4837  {&amp;quot;as&amp;quot;:&amp;quot;AS4837&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t浙江\t杭州\t\t联通\t30.252501\t120.165024&amp;quot;}
 
[Info] 测试路由 到 浙江杭州联通 完成 ！
[Info] 测试路由 到 浙江杭州移动 中 ...
traceroute to 112.17.0.106 (112.17.0.106), 30 hops max, 60 byte packets
 1  *
 2  23.225.120.161  0.93 ms  AS40065  {&amp;quot;as&amp;quot;:&amp;quot;AS40065&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\tcloudradium.com\t34.052234\t-118.243685&amp;quot;}
 3  192.168.77.42  0.56 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;局域网\t局域网\t\t\t\t\t&amp;quot;}
 4  23.225.120.170  0.85 ms  AS40065  {&amp;quot;as&amp;quot;:&amp;quot;AS40065&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\tcloudradium.com\t34.052234\t-118.243685&amp;quot;}
 5  223.120.6.17  0.68 ms  AS58453  {&amp;quot;as&amp;quot;:&amp;quot;AS58453&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\t移动\t34.052234\t-118.243685&amp;quot;}
 6  223.120.13.46  181.56 ms  AS58453  {&amp;quot;as&amp;quot;:&amp;quot;AS58453&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t上海\t上海\t\t移动\t31.224349\t121.476753&amp;quot;}
 7  221.183.55.26  184.24 ms  AS9808  {&amp;quot;as&amp;quot;:&amp;quot;AS9808&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t上海\t上海\t\t移动\t31.224349\t121.476753&amp;quot;}
 8  221.176.22.205  252.69 ms  AS9808  {&amp;quot;as&amp;quot;:&amp;quot;AS9808&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t上海\t上海\t\t移动\t31.224349\t121.476753&amp;quot;}
 9  221.176.22.13  254.24 ms  AS9808  {&amp;quot;as&amp;quot;:&amp;quot;AS9808&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t上海\t上海\t\t移动\t31.224349\t121.476753&amp;quot;}
10  221.183.22.78  254.15 ms  AS9808  {&amp;quot;as&amp;quot;:&amp;quot;AS9808&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t浙江\t杭州\t\t移动\t30.252501\t120.165024&amp;quot;}
11  221.183.23.21  251.92 ms  AS9808  {&amp;quot;as&amp;quot;:&amp;quot;AS9808&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t浙江\t杭州\t\t移动\t30.252501\t120.165024&amp;quot;}
12  *
13  218.205.59.226  249.36 ms  AS56041  {&amp;quot;as&amp;quot;:&amp;quot;AS56041&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t浙江\t杭州\t\t移动\t30.252501\t120.165024&amp;quot;}
 
[Info] 测试路由 到 浙江杭州移动 完成 ！
[Info] 测试路由 到 北京教育网 中 ...
traceroute to 202.205.6.30 (202.205.6.30), 30 hops max, 60 byte packets
 1  *
 2  172.16.0.11  0.39 ms  *  {&amp;quot;as&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;局域网\t局域网\t\t\t\t\t&amp;quot;}
 3  las-b24-link.telia.net (62.115.47.114)  5.92 ms  AS1299  {&amp;quot;as&amp;quot;:&amp;quot;AS1299&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\ttelia.com\t34.052234\t-118.243685&amp;quot;}
 4  las-b21-link.telia.net (62.115.136.46)  0.83 ms  AS1299  {&amp;quot;as&amp;quot;:&amp;quot;AS1299&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\ttelia.com\t34.052234\t-118.243685&amp;quot;}
 5  telstra-ic-326432-las-b21.c.telia.net (213.248.70.79)  1.20 ms  AS1299  {&amp;quot;as&amp;quot;:&amp;quot;AS1299&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\ttelia.com\t34.052234\t-118.243685&amp;quot;}
 6  i-95.1wlt-core02.telstraglobal.net (202.84.143.29)  2.02 ms  AS4637,AS10026  {&amp;quot;as&amp;quot;:&amp;quot;AS4637,AS10026&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;美国\t加利福尼亚州\t洛杉矶\t\ttelstra.com\t34.052234\t-118.243685&amp;quot;}
 7  202.84.138.189  150.38 ms  AS4637  {&amp;quot;as&amp;quot;:&amp;quot;AS4637&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t香港\t\t\ttelstra.com\t22.396428\t114.109497&amp;quot;}
 8  202.84.153.26  145.98 ms  AS4637  {&amp;quot;as&amp;quot;:&amp;quot;AS4637&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t香港\t\t\ttelstra.com\t22.396428\t114.109497&amp;quot;}
 9  61.8.59.38  207.17 ms  AS4637,AS10026  {&amp;quot;as&amp;quot;:&amp;quot;AS4637,AS10026&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t香港\t\t\tpacnet.com\t22.396428\t114.109497&amp;quot;}
10  101.4.114.181  209.52 ms  AS4538  {&amp;quot;as&amp;quot;:&amp;quot;AS4538&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t北京\t北京\t\t教育网\t39.938884\t116.397459&amp;quot;}
11  101.4.114.238  200.94 ms  AS4538  {&amp;quot;as&amp;quot;:&amp;quot;AS4538&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t中国\t\t\t教育网\t36.894402\t104.166&amp;quot;}
12  101.4.114.58  200.55 ms  AS4538  {&amp;quot;as&amp;quot;:&amp;quot;AS4538&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t北京\t北京\t\t教育网\t39.938884\t116.397459&amp;quot;}
13  101.4.114.197  202.37 ms  AS4538  {&amp;quot;as&amp;quot;:&amp;quot;AS4538&amp;quot;,&amp;quot;area&amp;quot;:&amp;quot;中国\t北京\t北京\t\t教育网\t39.938884\t116.397459&amp;quot;}
 
[Info] 测试路由 到 北京教育网 完成 ！
[Info] 四网路由快速测试 已完成 ！
root@ssrbbr:~#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;END&lt;/p&gt;</description>
    </item>
    <item>
      <title>【CentOS7】DNS服务主从配置使用mysql-bind驱动</title>
      <link>https://zhong-er.com/posts/centos7dns%E6%9C%8D%E5%8A%A1%E4%B8%BB%E4%BB%8E%E9%85%8D%E7%BD%AE%E4%BD%BF%E7%94%A8mysql-bind%E9%A9%B1%E5%8A%A8/</link>
      <pubDate>Tue, 01 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/centos7dns%E6%9C%8D%E5%8A%A1%E4%B8%BB%E4%BB%8E%E9%85%8D%E7%BD%AE%E4%BD%BF%E7%94%A8mysql-bind%E9%A9%B1%E5%8A%A8/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;DNS主从复制.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032030_1425_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;准备环境&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;虚拟机：VMware 15.5.5
网络: Net模式,master: 192.168.10.102  slave: 192.168.10.103
CentOS: 7.3
Python: 3.6.8 wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
Bind: 9.14.2 下载地址http://ftp.isc.org/isc/bind9/
MySQL: MariaDB5.5.60 下载地址 https://downloads.mariadb.org/mariadb/5.5.60/
MySQL BIND SDB Driver Files: https://mysql-bind.sourceforge.net/
mysql_bind下载地址: https://sourceforge.net/projects/mysql-bind/files/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;%7B#ZC_BLOG_HOST#%7Dpost/128.html&#34;&gt;Python编译安装&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;%7B#ZC_BLOG_HOST#%7Dpost/127.html&#34;&gt;MariaDB编译安装&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bind编译安装&lt;/p&gt;
&lt;p&gt;放通端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;firewall-cmd --add-port=53/tcp --permanent
firewall-cmd --add-port=953/tcp --permanent
firewall-cmd --add-port=8053/tcp --permanent
firewall-cmd --reload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yum install -y wget groupinstall pcre-devel zlib zlib-devel gcc gcc-c++ autoconf automake make pcre-devel openssl openssl-devel openldap-devel libcap libcap-devel libuv libuv-devel unixODBC-devel gcc libtool
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解压bind包&lt;/p&gt;</description>
    </item>
    <item>
      <title>【CentOS7】编译安装Python</title>
      <link>https://zhong-er.com/posts/centos7%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85python/</link>
      <pubDate>Tue, 01 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/centos7%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85python/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;编译安装python.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009033143_1083_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;安装依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yum -y groupinstall &amp;quot;Development tools&amp;quot;
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
yum install -y libffi-devel zlib1g-dev
yum install zlib* -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下载安装包并解压&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
tar -xvJf  Python-3.6.8.tar.xz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir /usr/local/python3
cd Python-3.6.8
./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl 
#第一个指定安装的路径,不指定的话,安装过程中可能软件所需要的文件复制到其他不同目录,删除软件很不方便,复制软件也不方便.
#第二个可以提高python10%-20%代码运行速度.
#第三个是为了安装pip需要用到ssl,后面报错会有提到.
./configure --prefix=/usr/local/bind --enable-threads --with-openssl 
make &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建软连接&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证是否成功&lt;/p&gt;</description>
    </item>
    <item>
      <title>【CentOS7】编译安装MariaDB5.5.60</title>
      <link>https://zhong-er.com/posts/centos7%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85mariadb5.5.60/</link>
      <pubDate>Thu, 27 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/centos7%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85mariadb5.5.60/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;编译安装MariaDB.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031507_2560_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;1.下载MariaDB&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://downloads.mariadb.org/mariadb/5.5.60/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.ftp上传压缩包至服务器并解压&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tar -zxf mariadb-5.5.60.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3.安装步骤&lt;/p&gt;
&lt;p&gt;关闭SELINUX&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi /etc/selinux/config
#SELINUX=enforcing  # 注释掉
#SELINUXTYPE=targeted # 注释掉
SELINUX=disabled  # 增加
:wq!  # 保存退出
shutdown -r now  # 重启系统
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入安装目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd mariadb5.5.60/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装依赖软件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yum install -y gcc gcc-c++ zlib-dev libaio-dev openssl cmake libncurses libevent-dev ncurses-devel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建数据库的安装目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir /usr/local/mariadb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译并指定安装目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装(时间较长,若夯住则敲几个回车催催)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将安装好的执行文件复制到系统执行命令路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/bin/cp -rf /usr/local/mysql/bin/* /usr/bin/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;复制配置文件&lt;/p&gt;</description>
    </item>
    <item>
      <title>【问题记录】nohup python程序，print无输出</title>
      <link>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95nohup-python%E7%A8%8B%E5%BA%8Fprint%E6%97%A0%E8%BE%93%E5%87%BA/</link>
      <pubDate>Fri, 31 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95nohup-python%E7%A8%8B%E5%BA%8Fprint%E6%97%A0%E8%BE%93%E5%87%BA/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;错误记录.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009035154_4969_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;近期python写了个DNS得轮询脚本，交给调度器每分钟执行一次，解析失败就告警。&lt;/p&gt;
&lt;p&gt;问题来了，中间使用print打印一些日志，想通过nohup运行方式收集print输出内容作为日志，&lt;/p&gt;
&lt;p&gt;但是已经执行5分钟了，nohup.out还是空，什么都没输出，&lt;/p&gt;
&lt;p&gt;起初以为是默认输出级别不对，于是改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nohup python test.py &amp;gt; nohup.out 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然而并没有任何效果，最后搜索引擎告诉了我，&lt;/p&gt;
&lt;p&gt;这是因为python的输出有缓冲，导致nohup.out并不能够马上看到输出。&lt;/p&gt;
&lt;p&gt;python 有个-u参数，使得python不启用缓冲。&lt;/p&gt;
&lt;p&gt;所以最终的启动命令为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nohup python -u test.py &amp;gt; nohup.out 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;END&lt;/p&gt;</description>
    </item>
    <item>
      <title>【问题记录】Win10的IE错误代码inet_e_resource_not_found解决办法</title>
      <link>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95win10%E7%9A%84ie%E9%94%99%E8%AF%AF%E4%BB%A3%E7%A0%81inet_e_resource_not_found/</link>
      <pubDate>Sun, 31 May 2020 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95win10%E7%9A%84ie%E9%94%99%E8%AF%AF%E4%BB%A3%E7%A0%81inet_e_resource_not_found/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;错误记录.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009033599_4055.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Win10系统的IE偶尔出现过问题，chrome和Firefox正常使用，IE却提示错误代码inet_e_resource_not_found。&lt;br&gt;
以前也纠结过怎么处理，网上搜来搜去后来经常是重启解决，反正win10装了SSD之后重启比较快。&lt;br&gt;
不过后来还是找到了解决办法，不过这个问题总是偶尔发生，我也没有太重视这个。&lt;/p&gt;
&lt;p&gt;昨天忽然又不能使用IE了，无奈只好想想常用的办法：&lt;/p&gt;
&lt;p&gt;（1）首先检查下是否开启了兼容视图，在兼容性视图里，把两个勾选框都勾上，很多IE莫名其妙的问题也许会好点。&lt;br&gt;
（3）其次在Internet选项里，点《连接》标签，按下《局域网设置》按钮，在对话框里，勾选上那个《自动检测设置》的勾选框。&lt;br&gt;
确认之后，刷新下IE，问题应该就解决了。&lt;/p&gt;
&lt;p&gt;（3）如果没有解决问题的话，建议重启系统一下，如果还没有解决，那么可以重置IE一次。&lt;/p&gt;
&lt;p&gt;（4）重置IE的按钮在Internet选项的《高级》标签里，下方有个《重置》按钮，重置时不用删除个人设置。&lt;/p&gt;
&lt;p&gt;（5）一般此时，问题就彻底解决了，如果还是不行的话，就将就先用下Firefox或者Chrome了，过一阵子重启也许就可以用了，Windows系统抽风也不是一次两次的。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【问题记录】Windows服务器中无法开启php-fpm</title>
      <link>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95windows%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%AD%E6%97%A0%E6%B3%95%E5%BC%80%E5%90%AFphp-fpm/</link>
      <pubDate>Thu, 12 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95windows%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%AD%E6%97%A0%E6%B3%95%E5%BC%80%E5%90%AFphp-fpm/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;错误记录.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032124_3352_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;windows server 2019 版 安装部署宝塔面板+LNMP环境+微擎框架，微擎提示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;wqbc.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912123043_4085.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;问题原因&#34;&gt;问题原因：&lt;/h1&gt;
&lt;p&gt;PHP-FPM只支持Unix-like系统(Linux/FreeBSD/MacOS),不支持Windows&lt;/p&gt;
&lt;p&gt;Windows上可以用PHP-CGI搭配CGI进程管理器来使用:&lt;br&gt;
比如Apache mod_fcgid 可以用来替代 mod_cgi 和 mod_cgid,具有管理和维持PHP-CGI进程数目的功能.&lt;br&gt;
ApacheLounge提供有Windows上的mod_fcgid二进制包:&lt;br&gt;
&lt;a href=&#34;http://www.apachelounge.com/download/&#34;&gt;http://www.apachelounge.com/download/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果你是搭配IIS使用,则需要PHP Manager这个CGI进程管理器:&lt;br&gt;
&lt;a href=&#34;http://phpmanager.codeplex.com/&#34;&gt;http://phpmanager.codeplex.com/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;解决方案&#34;&gt;解决方案：&lt;/h1&gt;
&lt;p&gt;windows 下安装docker 搭建Nginx和php-fpm&lt;/p&gt;
&lt;p&gt;下面以win7系统为例&lt;/p&gt;
&lt;p&gt;准备工作：挂载本地磁盘到虚拟系统&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1799317870.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912129262_4812.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;本地文件夹结构 E:\docker&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;304126031.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912126294_8641.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;nginx文件夹结构&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1792020786.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912121616_9538.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;conf文件夹结构&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1539272572.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912129275_6125.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;1、&lt;/p&gt;
&lt;p&gt;docker pull nginx&lt;/p&gt;
&lt;p&gt;docker pull php:7.1-fpm&lt;/p&gt;
&lt;p&gt;2、&lt;/p&gt;
&lt;p&gt;启动php容器&lt;/p&gt;
&lt;p&gt;docker run &amp;ndash;name php7.1 -v /e/docker/html:/var/www/html -p 9000:9000 -d php:7.1-fpm&lt;/p&gt;
&lt;p&gt;3、&lt;/p&gt;
&lt;p&gt;启动nginx容器&lt;/p&gt;
&lt;p&gt;docker run -d -p 8080:80 &amp;ndash;name nginx1 -v /e/docker/html:/var/www/html -v /e/docker/nginx/conf/conf.d:/etc/nginx/conf.d -v /e/docker/nginx/logs:/var/log/nginx &amp;ndash;link php7.1:php7.1 nginx&lt;/p&gt;</description>
    </item>
    <item>
      <title>TCPing 一款检测端口是否开启和TCP延迟的工具</title>
      <link>https://zhong-er.com/posts/tcping-%E4%B8%80%E6%AC%BE%E6%A3%80%E6%B5%8B%E7%AB%AF%E5%8F%A3%E6%98%AF%E5%90%A6%E5%BC%80%E5%90%AF%E5%92%8Ctcp%E5%BB%B6%E8%BF%9F%E7%9A%84%E5%B7%A5%E5%85%B7/</link>
      <pubDate>Thu, 12 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/tcping-%E4%B8%80%E6%AC%BE%E6%A3%80%E6%B5%8B%E7%AB%AF%E5%8F%A3%E6%98%AF%E5%90%A6%E5%BC%80%E5%90%AF%E5%92%8Ctcp%E5%BB%B6%E8%BF%9F%E7%9A%84%E5%B7%A5%E5%85%B7/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;img.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912128293_3684_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;在日常玩服务器过程中，我们经常需要测试一下IP或者域名的延迟，一般直接PING 域名或IP即可~&lt;/p&gt;
&lt;p&gt;这种 PING 实际上走的是ICMP协议，其实我们用的最多的是TCP协议。如果直接测试TCP协议的网络延迟，应该是更准确的！&lt;/p&gt;
&lt;p&gt;下面本文介绍一款工具，TCPing，不仅可以使用TCP协议的延迟，还能检测端口的连通情况。对于一些禁PING的域名或者IP，我可以直接利用TCPing来查看延迟情况！&lt;/p&gt;
&lt;h2 id=&#34;windows版&#34;&gt;Windows版&lt;/h2&gt;
&lt;p&gt;下载地址：&lt;a href=&#34;https://www.elifulkerson.com/projects/tcping.php&#34;&gt;https://www.elifulkerson.com/projects/tcping.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装步骤：下载 &lt;a href=&#34;https://51.ruyo.net/go/index.html?u=https://download.elifulkerson.com//files/tcping/0.39/tcping.exe&#34;&gt;tcping.exe&lt;/a&gt; 文件到 C:\Windows\System32\ 即可！&lt;/p&gt;
&lt;p&gt;命令介绍：打开CMD命令控制台，输入 tcping&lt;/p&gt;
&lt;p&gt;使用技巧：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tcping [命令参数] 服务器地址(IP/域名) [服务器端口]
 
 -t     : 连续 TCPing ，直到使用 Ctrl+C 键停止
示例：tcping -t 1.1.1.1 80
 
 -n 5   : TCPing 5次后停止
示例：tcping -n 5 1.1.1.1 80
 
 -i 5   : 每隔 5秒 TCPing 一次
示例：tcping -i 5 1.1.1.1 80
 
 -w 0.5 : 设置超时时间为 0.5秒（1秒=1000毫秒），单位 秒
示例：tcping -w 0.5 1.1.1.1 80
 
 -d     : 在每行返回信息中加入时间信息
示例：tcping -d 1.1.1.1 80
 
 -s     : 当 TCPing 测试成功后（在超时时间以内返回 TCPing 延迟数据）自动停止 TCPing
示例：tcping -s 1.1.1.1 80
 
 -4     : 优先 IPv4（如果一个域名有 IPv4 和 IPv6 解析，那么走 IPv4）
示例：tcping -4 www.google.com 80
 
 -6     : 优先 IPv6（如果一个域名有 IPv4 和 IPv6 解析，那么走 IPv6）
示例：tcping -6 www.google.com 80
 
 --file : TCPing 将逐行循环遍历文件内的 服务器IP/域名 信息（一行一个，支持端口，例如：1.1.1.1 443）
示例：tcping --file D:\abc\1.txt
 
 -v : 显示版本号
示例：tcping -v
 
# 如果你没有写服务器地址的端口，那么默认为 80 端口
# 其实还有很多命令参数，只是大都用不上，所以省略了
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;linux版&#34;&gt;Linux版&lt;/h2&gt;
&lt;p&gt;Linux平台中类似的工具非常多，比如nping ， nc 等~&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Go】GoLand安装使用</title>
      <link>https://zhong-er.com/posts/gogoland%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/gogoland%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;GO语言简明教程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032723_3398_1.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;一-goland集成开发环境下载&#34;&gt;一 GoLand集成开发环境下载&lt;/h2&gt;
&lt;p&gt;IDE 下载地址：&lt;a href=&#34;http://www.jetbrains.com/go/?fromMenu&#34;&gt;http://www.jetbrains.com/go/?fromMenu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IDE安装就是平常的傻瓜式安装，这里就不多说了。&lt;/p&gt;
&lt;h2 id=&#34;二-使用goland&#34;&gt;二 使用GoLand&lt;/h2&gt;
&lt;p&gt;1、 双击运行安装完的GoLand，选择创建项目，并关联GOROOT（会自动关联）&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;fgwgr.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912099571_3392_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;2、在项目上点击右键，按图选择，如下，给文件命一个名字，如 test&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2aymzu.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912094311_8547_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;3、在文件中写入如下代码：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;3bgjsu.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912096118_5294.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;4、在文件上右键，选择 Run go build test.go，就可以看到控制台打印出hello world!啦&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;4wm2.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912093480_9128_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;5u076z.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912094525_9516_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;5、也可以在Terminal窗口下输入go run test.go,就可以看到打印结果&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;6qdjk.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912098158_6868_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;6、或者输入go build test.go ,会在当前路径下生成一个可执行文件(test)，继续输入 ./test ，即可执行该可执行文件&lt;/p&gt;
&lt;p&gt;END&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Go】Hello World</title>
      <link>https://zhong-er.com/posts/gohello-world/</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/gohello-world/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;GO语言简明教程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032723_3398_1.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;建立-go-工作区&#34;&gt;建立 Go 工作区&lt;/h2&gt;
&lt;p&gt;在编写代码之前，我们首先应该建立 Go 的工作区（Workspace）。&lt;/p&gt;
&lt;p&gt;在 Mac 或 Linux 操作系统下，Go 工作区应该设置在 HOME/go∗∗。所以我们要在∗∗HOME/go∗∗。所以我们要在∗∗HOME 目录下创建 go 目录。&lt;/p&gt;
&lt;p&gt;而在 Windows 下，工作区应该设置在 C:\Users\YourName\go。所以请将 go 目录放置在 C:\Users\YourName。&lt;/p&gt;
&lt;p&gt;其实也可以通过设置 GOPATH 环境变量，用其他目录来作为工作区。但为了简单起见，我们采用上面提到的放置方法。&lt;/p&gt;
&lt;p&gt;所有 Go 源文件都应该放置在工作区里的 src 目录下。请在刚添加的 go 目录下面创建目录 src。&lt;/p&gt;
&lt;p&gt;所有 Go 项目都应该依次在 src 里面设置自己的子目录。我们在 src 里面创建一个目录 hello 来放置整个 hello world 项目。&lt;/p&gt;
&lt;p&gt;创建上述目录之后，其目录结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go
  src
    hello
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在我们刚刚创建的 hello 目录下，在 helloworld.go 文件里保存下面的程序。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main
import &amp;quot;fmt&amp;quot;
func main() {  
    fmt.Println(&amp;quot;Hello World&amp;quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建该程序之后，其目录结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go
  src
    hello
      helloworld.go
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;运行-go-程序&#34;&gt;运行 Go 程序&lt;/h2&gt;
&lt;p&gt;运行 Go 程序有多种方式，我们下面依次介绍。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Go】包管理详解</title>
      <link>https://zhong-er.com/posts/go%E5%8C%85%E7%AE%A1%E7%90%86%E8%AF%A6%E8%A7%A3/</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/go%E5%8C%85%E7%AE%A1%E7%90%86%E8%AF%A6%E8%A7%A3/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;GO语言简明教程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032723_3398_1.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;go包管理&#34;&gt;Go包管理&lt;/h1&gt;
&lt;h2 id=&#34;一-包管理历史&#34;&gt;一 包管理历史&lt;/h2&gt;
&lt;p&gt;Golang 的包管理一直被大众所诟病的一个点，但是我们可以看到现在确实是在往好的方向进行发展。下面是官方的包管理工具的发展历史：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在 1.5 版本之前，所有的依赖包都是存放在 GOPATH 下，没有版本控制。这个类似 Google 使用单一仓库来管理代码的方式。这种方式的最大的弊端就是无法实现包的多版本控制，比如项目 A 和项目 B 依赖于不同版本的 package，如果 package 没有做到完全的向前兼容，往往会导致一些问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1.5 版本推出了 vendor 机制。所谓 vendor 机制，就是每个项目的根目录下可以有一个 vendor 目录，里面存放了该项目的依赖的 package。&lt;code&gt;go build&lt;/code&gt; 的时候会先去 vendor 目录查找依赖，如果没有找到会再去 GOPATH 目录下查找。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1.9 版本推出了实验性质的包管理工具 dep，这里把 dep 归结为 Golang 官方的包管理方式可能有一些不太准确。关于 dep 的争议颇多，比如为什么官方后来没有直接使用 dep 而是弄了一个新的 modules，具体细节这里不太方便展开。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1.11 版本推出 modules 机制，简称 mod。modules 的原型其实是 vgo，关于 vgo，可以自行搜索。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除此之外，社区也一直在有几个活跃的包管理工具，使用广泛且具有代表性的主要有下面几个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;godep&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;glide&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;govendor&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;二-modules-的使用&#34;&gt;二 modules 的使用&lt;/h2&gt;
&lt;h3 id=&#34;21-准备&#34;&gt;2.1 准备&lt;/h3&gt;
&lt;p&gt;Golang 版本：1.12.3。在 1.12 版本之前，使用 Go modules 之前需要环境变量 GO111MODULE:&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Go】变量</title>
      <link>https://zhong-er.com/posts/go%E5%8F%98%E9%87%8F/</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/go%E5%8F%98%E9%87%8F/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;GO语言简明教程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032723_3398_1.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;变量是什么&#34;&gt;变量是什么&lt;/h3&gt;
&lt;p&gt;变量指定了某存储单元（Memory Location）的名称，该存储单元会存储特定类型的值。在 Go 中，有多种语法用于声明变量。&lt;/p&gt;
&lt;h3 id=&#34;声明单个变量&#34;&gt;声明单个变量&lt;/h3&gt;
&lt;p&gt;var name type 是声明单个变量的语法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main
import &amp;quot;fmt&amp;quot;
func main() {
    var age int // 变量声明
    fmt.Println(&amp;quot;my age is&amp;quot;, age)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;语句 &lt;code&gt;var age int&lt;/code&gt; 声明了一个 int 类型的变量，名字为 age。我们还没有给该变量赋值。如果变量未被赋值，Go 会自动地将其初始化，赋值该变量类型的零值（Zero Value）。本例中 age 就被赋值为 0。如果你运行该程序，你会看到如下输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my age is 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;变量可以赋值为本类型的任何值。上一程序中的 age 可以赋值为任何整型值（Integer Value）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main
import &amp;quot;fmt&amp;quot;
func main() {
    var age int // 变量声明
    fmt.Println(&amp;quot;my age is&amp;quot;, age)
    age = 29 // 赋值
    fmt.Println(&amp;quot;my age is&amp;quot;, age)
    age = 54 // 赋值
    fmt.Println(&amp;quot;my new age is&amp;quot;, age)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的程序会有如下输出：&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Go】常量</title>
      <link>https://zhong-er.com/posts/go%E5%B8%B8%E9%87%8F/</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/go%E5%B8%B8%E9%87%8F/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;GO语言简明教程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032723_3398_1.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;定义&#34;&gt;定义&lt;/h3&gt;
&lt;p&gt;在 Go 语言中，术语&amp;quot;常量&amp;quot;用于表示固定的值。比如 &lt;code&gt;5&lt;/code&gt; 、&lt;code&gt;-89&lt;/code&gt;、 &lt;code&gt;I love Go&lt;/code&gt;、&lt;code&gt;67.89&lt;/code&gt; 等等。&lt;/p&gt;
&lt;p&gt;看看下面的代码:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var a int = 50  
var b string = &amp;quot;I love Go&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的代码中，变量 a 和 b 分别被赋值为常量 50 和 I love GO。关键字 &lt;code&gt;const&lt;/code&gt; 被用于表示常量，比如 &lt;code&gt;50&lt;/code&gt; 和 &lt;code&gt;I love Go&lt;/code&gt;。即使在上面的代码中我们没有明确的使用关键字 &lt;code&gt;const&lt;/code&gt;，但是在 Go 的内部，它们是常量。&lt;/p&gt;
&lt;p&gt;顾名思义，常量不能再重新赋值为其他的值。因此下面的程序将不能正常工作，它将出现一个编译错误: &lt;code&gt;cannot assign to a.&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main
func main() {  
    const a = 55 // 允许
    a = 89       // 不允许重新赋值
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常量的值会在编译的时候确定。因为函数调用发生在运行时，所以不能将函数的返回值赋值给常量。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main
import (  
    &amp;quot;fmt&amp;quot;
    &amp;quot;math&amp;quot;
)
func main() {  
    fmt.Println(&amp;quot;Hello, playground&amp;quot;)
    var a = math.Sqrt(4)   // 允许
    const b = math.Sqrt(4) // 不允许
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的程序中，因为 &lt;code&gt;a&lt;/code&gt; 是变量，因此我们可以将函数 &lt;code&gt;math.Sqrt(4)&lt;/code&gt; 的返回值赋值给它（我们将在单独的地方详细讨论函数）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Go】函数</title>
      <link>https://zhong-er.com/posts/go%E5%87%BD%E6%95%B0/</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/go%E5%87%BD%E6%95%B0/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;GO语言简明教程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032723_3398_1.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;函数是什么&#34;&gt;函数是什么？&lt;/h2&gt;
&lt;p&gt;函数是一块执行特定任务的代码。一个函数是在输入源基础上，通过执行一系列的算法，生成预期的输出。&lt;/p&gt;
&lt;h2 id=&#34;函数的声明&#34;&gt;函数的声明&lt;/h2&gt;
&lt;p&gt;在 Go 语言中，函数声明通用语法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;func functionname(parametername type) returntype {  
    // 函数体（具体实现的功能）
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数的声明以关键词 &lt;code&gt;func&lt;/code&gt; 开始，后面紧跟自定义的函数名 &lt;code&gt;functionname (函数名)&lt;/code&gt;。函数的参数列表定义在 &lt;code&gt;(&lt;/code&gt; 和 &lt;code&gt;)&lt;/code&gt; 之间，返回值的类型则定义在之后的 &lt;code&gt;returntype (返回值类型)&lt;/code&gt;处。声明一个参数的语法采用 参数名 参数类型 的方式，任意多个参数采用类似 &lt;code&gt;(parameter1 type, parameter2 type) 即(参数1 参数1的类型,参数2 参数2的类型)&lt;/code&gt;的形式指定。之后包含在 &lt;code&gt;{&lt;/code&gt; 和 &lt;code&gt;}&lt;/code&gt; 之间的代码，就是函数体。&lt;/p&gt;
&lt;p&gt;函数中的参数列表和返回值并非是必须的，所以下面这个函数的声明也是有效的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;func functionname() {  
    // 译注: 表示这个函数不需要输入参数，且没有返回值
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;示例函数&#34;&gt;示例函数&lt;/h2&gt;
&lt;p&gt;我们以写一个计算商品价格的函数为例，输入参数是单件商品的价格和商品的个数，两者的乘积为商品总价，作为函数的输出值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;func calculateBill(price int, no int) int {  
    var totalPrice = price * no // 商品总价 = 商品单价 * 数量
    return totalPrice // 返回总价
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述函数有两个整型的输入 &lt;code&gt;price&lt;/code&gt; 和 &lt;code&gt;no&lt;/code&gt;，返回值 &lt;code&gt;totalPrice&lt;/code&gt; 为 &lt;code&gt;price&lt;/code&gt; 和 &lt;code&gt;no&lt;/code&gt; 的乘积，也是整数类型。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Go】开发环境搭建</title>
      <link>https://zhong-er.com/posts/go%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/go%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;GO语言简明教程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032723_3398_1.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;一-下载地址&#34;&gt;一 下载地址&lt;/h2&gt;
&lt;p&gt;安装包下载地址为：&lt;a href=&#34;https://golang.org/dl/&#34;&gt;https://golang.org/dl/&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;如果打不开可以使用这个地址：&lt;a href=&#34;https://golang.google.cn/dl/&#34;&gt;https://golang.google.cn/dl/&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;各个系统对应的包名：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;操作系统&lt;/th&gt;
					&lt;th&gt;包名&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Windows&lt;/td&gt;
					&lt;td&gt;go1.13.3.windows-amd64.msi&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Linux&lt;/td&gt;
					&lt;td&gt;go1.13.3.linux-amd64.tar.gz&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Mac&lt;/td&gt;
					&lt;td&gt;go1.13.3.darwin-amd64.pkg&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;FreeBSD&lt;/td&gt;
					&lt;td&gt;go1.13.3.freebsd-amd64.tar.gz&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt=&#34;dimzn.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912096658_1985.jpg-zhonger.com&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;二-安装&#34;&gt;二 安装&lt;/h2&gt;
&lt;h3 id=&#34;linux安装&#34;&gt;Linux安装&lt;/h3&gt;
&lt;p&gt;1、下载二进制包：go1.13.3.linux-amd64.tar.gz&lt;/p&gt;
&lt;p&gt;2、将下载的二进制包解压至 /usr/local目录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tar -C /usr/local -xzf go1.13.3.linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3、将 /usr/local/go/bin 目录添加至PATH环境变量：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export PATH=$PATH:/usr/local/go/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;windows安装&#34;&gt;Windows安装&lt;/h3&gt;
&lt;p&gt;Windows 下可以使用 .msi 后缀(在下载列表中可以找到该文件，如go1.13.3.windows-amd64.msi)的安装包来安装。&lt;/p&gt;
&lt;p&gt;默认情况下 .msi 文件会安装在 c:\Go 目录下。你可以将 c:\Go\bin 目录添加到 Path 环境变量中。添加后你需要重启命令窗口才能生效&lt;/p&gt;
&lt;h3 id=&#34;mac安装&#34;&gt;Mac安装&lt;/h3&gt;
&lt;p&gt;Mac下直接双击go1.13.3.darwin-amd64.pkg，一路下一步安装即可&lt;/p&gt;
&lt;h2 id=&#34;三-测试安装&#34;&gt;三 测试安装&lt;/h2&gt;
&lt;p&gt;1、创建工作目录 C:&amp;gt;Go_Project。&lt;/p&gt;
&lt;p&gt;2、 创建文件test.go,写入如下代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main
import &amp;quot;fmt&amp;quot;
func main() {
   fmt.Println(&amp;quot;Hello, World!&amp;quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3、打开cmd，切换目录到C:&amp;gt;Go_Project下，执行如下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go run test.go
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看到打印结果：&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Go】类型</title>
      <link>https://zhong-er.com/posts/go%E7%B1%BB%E5%9E%8B/</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/go%E7%B1%BB%E5%9E%8B/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;GO语言简明教程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032723_3398_1.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;类型&#34;&gt;类型&lt;/h1&gt;
&lt;p&gt;下面是 Go 支持的基本类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;bool&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数字类型&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;int8, int16, int32, int64, int&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;uint8, uint16, uint32, uint64, uint&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;float32, float64&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;complex64, complex128&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;byte&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rune&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;string&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;bool&#34;&gt;bool&lt;/h3&gt;
&lt;p&gt;bool 类型表示一个布尔值，值为 true 或者 false。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main
import &amp;quot;fmt&amp;quot;
func main() {  
    a := true
    b := false
    fmt.Println(&amp;quot;a:&amp;quot;, a, &amp;quot;b:&amp;quot;, b)
    c := a &amp;amp;&amp;amp; b
    fmt.Println(&amp;quot;c:&amp;quot;, c)
    d := a || b
    fmt.Println(&amp;quot;d:&amp;quot;, d)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的程序中，a 赋值为 true，b 赋值为 false。&lt;/p&gt;
&lt;p&gt;c 赋值为 a &amp;amp;&amp;amp; b。仅当 a 和 b 都为 true 时，操作符 &amp;amp;&amp;amp; 才返回 true。因此，在这里 c 为 false。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Go】语言介绍</title>
      <link>https://zhong-er.com/posts/go%E8%AF%AD%E8%A8%80%E4%BB%8B%E7%BB%8D/</link>
      <pubDate>Mon, 09 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/go%E8%AF%AD%E8%A8%80%E4%BB%8B%E7%BB%8D/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;GO语言简明教程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032723_3398_1.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;go语言介绍&#34;&gt;Go语言介绍&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;golang.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912095736_191.jpg-zhonger.com&#34;&gt;&lt;/p&gt;
&lt;p&gt;Go 即Golang，是Google公司2009年11月正式对外公开的一门编程语言。&lt;/p&gt;
&lt;p&gt;Go是静态强类型语言，是区别于解析型语言的编译型语言。&lt;/p&gt;
&lt;p&gt;解析型语言——源代码是先翻译为中间代码，然后由解析器对代码进行解释执行。&lt;/p&gt;
&lt;p&gt;编译型语言——源代码编译生成机器语言，然后由机器直接执行机器码即可执行。&lt;/p&gt;
&lt;h2 id=&#34;go语言特性&#34;&gt;Go语言特性&lt;/h2&gt;
&lt;p&gt;跨平台的编译型语言&lt;/p&gt;
&lt;p&gt;语法接近C语言&lt;/p&gt;
&lt;p&gt;管道（channel），切片（slice），并发（routine）&lt;/p&gt;
&lt;p&gt;有垃圾回收的机制&lt;/p&gt;
&lt;p&gt;支持面向对象和面向过程的编程模式&lt;/p&gt;
&lt;h2 id=&#34;go语言发展版本特性&#34;&gt;Go语言发展（版本/特性）&lt;/h2&gt;
&lt;p&gt;2009年11月7日 weekly.2009-11-06 —— 早期的版本&lt;/p&gt;
&lt;p&gt;2012年3月28日 go1 —— 稳定版版的发布&lt;/p&gt;
&lt;p&gt;2013年5月14日 go1.1 —— 语言本身的变化、库的变化等。&lt;/p&gt;
&lt;p&gt;2013年12月01日 go1.2 —— 提供更好的调度和一个新的语言特性。&lt;/p&gt;
&lt;p&gt;2014年6月18日 go1.3 —— 主要是在实现的工作上的变化，以及精准的垃圾回收。&lt;/p&gt;
&lt;p&gt;2014年12月10日 go1.4 —— 包含了2个很小的语言变更。&lt;/p&gt;
&lt;p&gt;2015年8月19日 go1.5 —— 实现的架构变化，同时保留了和旧版本的兼容性。&lt;/p&gt;
&lt;p&gt;2016年2月7日 go1.6 —— 语言本身、运行时、和库的实现的变化。&lt;/p&gt;
&lt;p&gt;2016年8月15日 go1.7 —— 标准库有显着的性能改进和变化。&lt;/p&gt;
&lt;p&gt;2017年2月26日 go1.8 —— 标准库有显着的性能改进和变化。&lt;/p&gt;
&lt;p&gt;2017年8月24日 go1.9 —— 是包含语言，标准库，以及运行时的诸多变化。这个版本中的大部分工作都是对运行时和工具的改进。&lt;/p&gt;
&lt;p&gt;2018年2月16日 go1.10 —— 大部分更改都在工具链，运行时和库的实现中。&lt;/p&gt;
&lt;p&gt;2018年8月24日 go1.11 —— modules和WebAssembly支持。&lt;/p&gt;
&lt;h2 id=&#34;go语言应用&#34;&gt;Go语言应用&lt;/h2&gt;
&lt;h3 id=&#34;谁在用&#34;&gt;谁在用&lt;/h3&gt;
&lt;h4 id=&#34;google&#34;&gt;Google&lt;/h4&gt;
&lt;p&gt;这个不用多做介绍，作为开发Go语言的公司，当仁不让。Google基于Go有很多优秀的项目，比如：&lt;a href=&#34;https://github.com/kubernetes/kubernetes&#34;&gt;https://github.com/kubernetes/kubernetes&lt;/a&gt; ，大家也可以在Github上 &lt;a href=&#34;https://github.com/google/&#34;&gt;https://github.com/google/&lt;/a&gt; 查看更多Google的Go开源项目。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】存储库之MongoDB</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E5%AD%98%E5%82%A8%E5%BA%93%E4%B9%8Bmongodb/</link>
      <pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E5%AD%98%E5%82%A8%E5%BA%93%E4%B9%8Bmongodb/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;一-简介&#34;&gt;一 简介&lt;/h3&gt;
&lt;p&gt;MongoDB是一款强大、灵活、且易于扩展的通用型数据库&lt;br&gt;
1、易用性&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MongoDB是一个面向文档（document-oriented）的数据库，而不是关系型数据库。
不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处，与关系数据库相比，面向文档的数据库不再有“行“（row）的概念取而代之的是更为灵活的“文档”（document）模型。
通过在文档中嵌入文档和数组，面向文档的方法能够仅使用一条记录来表现复杂的层级关系，这与现代的面向对象语言的开发者对数据的看法一致。
另外，不再有预定义模式（predefined schema）：文档的键（key）和值（value）不再是固定的类型和大小。由于没有固定的模式，根据需要添加或删除字段变得更容易了。通常由于开发者能够进行快速迭代，所以开发进程得以加快。而且，实验更容易进行。开发者能尝试大量的数据模型，从中选一个最好的。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、易扩展性&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;应用程序数据集的大小正在以不可思议的速度增长。随着可用带宽的增长和存储器价格的下降，即使是一个小规模的应用程序，需要存储的数据量也可能大的惊人，甚至超出
了很多数据库的处理能力。过去非常罕见的T级数据，现在已经是司空见惯了。
由于需要存储的数据量不断增长，开发者面临一个问题：应该如何扩展数据库，分为纵向扩展和横向扩展，纵向扩展是最省力的做法，但缺点是大型机一般都非常贵，而且
当数据量达到机器的物理极限时，花再多的钱也买不到更强的机器了，此时选择横向扩展更为合适，但横向扩展带来的另外一个问题就是需要管理的机器太多。
MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易地在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载，自动重新分配文档，以及将
用户的请求路由到正确的机器上。这样，开发者能够集中精力编写应用程序，而不需要考虑如何扩展的问题。如果一个集群需要更大的容量，只需要向集群添加新服务器，MongoDB就会自动将现有的数据向新服务器传送
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3、丰富的功能&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MongoDB作为一款通用型数据库，除了能够创建、读取、更新和删除数据之外，还提供了一系列不断扩展的独特功能
#1、索引
支持通用二级索引，允许多种快速查询，且提供唯一索引、复合索引、地理空间索引、全文索引

#2、聚合
支持聚合管道，用户能通过简单的片段创建复杂的集合，并通过数据库自动优化

#3、特殊的集合类型
支持存在时间有限的集合，适用于那些将在某个时刻过期的数据，如会话session。类似地，MongoDB也支持固定大小的集合，用于保存近期数据，如日志

#4、文件存储
支持一种非常易用的协议，用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能，如链接join和复杂的多行事务。省略
这些的功能是处于架构上的考虑，或者说为了得到更好的扩展性，因为在分布式系统中这两个功能难以高效地实现
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4、卓越的性能&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MongoDB的一个主要目标是提供卓越的性能，这很大程度上决定了MongoDB的设计。MongoDB把尽可能多的内存用作缓存cache，视图为每次查询自动选择正确的索引。
总之各方面的设计都旨在保持它的高性能
虽然MongoDB非常强大并试图保留关系型数据库的很多特性，但它并不追求具备关系型数据库的所有功能。只要有可能，数据库服务器就会将处理逻辑交给客户端。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;二-mongodb基础知识&#34;&gt;二 MongoDB基础知识&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&#34;MongoDB.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912038079_6347.png-zhonger.com&#34;&gt;1、文档是MongoDB的核心概念。文档就是键值对的一个有序集{&amp;lsquo;msg&amp;rsquo;:&amp;lsquo;hello&amp;rsquo;,&amp;lsquo;foo&amp;rsquo;:3}。类似于python中的有序字典。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;需要注意的是：
#1、文档中的键/值对是有序的。
#2、文档中的值不仅可以是在双引号里面的字符串，还可以是其他几种数据类型（甚至可以是整个嵌入的文档)。
#3、MongoDB区分类型和大小写。
#4、MongoDB的文档不能有重复的键。
#5、文档中的值可以是多种不同的数据类型，也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况，键可以使用任意UTF-8字符。

文档键命名规范：
#1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。
#2、.和$有特别的意义，只有在特定环境下才能使用。
#3、以下划线&amp;quot;_&amp;quot;开头的键是保留的(不是严格要求的)。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行，那么一个集合就是相当于一张表&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#1、集合存在于数据库中，通常情况下为了方便管理，不同格式和类型的数据应该插入到不同的集合，但其实集合没有固定的结构，这意味着我们完全可以把不同格式和类型的数据统统插入一个集合中。

#2、组织子集合的方式就是使用“.”，分隔不同命名空间的子集合。
比如一个具有博客功能的应用可能包含两个集合，分别是blog.posts和blog.authors，这是为了使组织结构更清晰，这里的blog集合（这个集合甚至不需要存在）跟它的两个子集合没有任何关系。
在MongoDB中，使用子集合来组织数据非常高效，值得推荐

#3、当第一个文档插入时，集合就会被创建。合法的集合名：
集合名不能是空字符串&amp;quot;&amp;quot;。
集合名不能含有\0字符（空字符)，这个字符表示集合名的结尾。
集合名不能以&amp;quot;system.&amp;quot;开头，这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含，这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合，否则千万不要在名字里出现$。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3、数据库：在MongoDB中，多个文档组成集合，多个集合可以组成数据库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串：
#1、不能是空字符串（&amp;quot;&amp;quot;)。
#2、不得含有&#39; &#39;（空格)、.、$、/、\和\0 (空字符)。
#3、应全部小写。
#4、最多64字节。

有一些数据库名是保留的，可以直接访问这些有特殊作用的数据库。
#1、admin： 从身份认证的角度讲，这是“root”数据库，如果将一个用户添加到admin数据库，这个用户将自动获得所有数据库的权限。再者，一些特定的服务器端命令也只能从admin数据库运行，如列出所有数据库或关闭服务器
#2、local: 这个数据库永远都不可以复制，且一台服务器上的所有本地集合都可以存储在这个数据库中
#3、config: MongoDB用于分片设置时，分片信息会存储在config数据库中
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4、强调：把数据库名添加到集合名前，得到集合的完全限定名，即命名空间&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】高性能相关</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E9%AB%98%E6%80%A7%E8%83%BD%E7%9B%B8%E5%85%B3/</link>
      <pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E9%AB%98%E6%80%A7%E8%83%BD%E7%9B%B8%E5%85%B3/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;一-背景知识&#34;&gt;一 背景知识&lt;/h3&gt;
&lt;p&gt;爬虫的本质就是一个socket客户端与服务端的通信过程，如果我们有多个url待爬取，只用一个线程且采用串行的方式执行，那只能等待爬取一个结束后才能继续下一个，效率会非常低。&lt;/p&gt;
&lt;p&gt;需要强调的是：对于单线程下串行N个任务，并不完全等同于低效，如果这N个任务都是纯计算的任务，那么该线程对cpu的利用率仍然会很高，之所以单线程下串行多个爬虫任务低效，是因为爬虫任务是明显的IO密集型程序。&lt;/p&gt;
&lt;p&gt;关于IO模型详见&lt;a href=&#34;http://www.cnblogs.com/linhaifeng/articles/7454717.html&#34;&gt;链接：http://www.cnblogs.com/linhaifeng/articles/7454717.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;那么该如何提高爬取性能呢？且看下述概念&lt;/p&gt;
&lt;h3 id=&#34;二-同步异步回调机制&#34;&gt;二 同步、异步、回调机制&lt;/h3&gt;
&lt;p&gt;1、同步调用：即提交一个任务后就在原地等待任务结束，等到拿到任务的结果后再继续下一行代码，效率低下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 同步调用

import requests

def parse_page(res):
    print(&#39;解析 %s&#39; %(len(res)))

def get_page(url):
    print(&#39;下载 %s&#39; %url)
    response=requests.get(url)
    if response.status_code == 200:
        return response.text

urls=[&#39;https://www.baidu.com/&#39;,&#39;http://www.sina.com.cn/&#39;,&#39;https://www.python.org&#39;]
for url in urls:
    res=get_page(url) #调用一个任务，就在原地等待任务结束拿到结果后才继续往后执行
    parse_page(res)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、一个简单的解决方案：多线程或多进程&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#在服务器端使用多线程（或多进程）。多线程（或多进程）的目的是让每个连接都拥有独立的线程（或进程），这样任何一个连接的阻塞都不会影响其他的连接。


# 多进程或多线程

#IO密集型程序应该用多线程
import requests
from threading import Thread,current_thread

def parse_page(res):
    print(&#39;%s 解析 %s&#39; %(current_thread().getName(),len(res)))

def get_page(url,callback=parse_page):
    print(&#39;%s 下载 %s&#39; %(current_thread().getName(),url))
    response=requests.get(url)
    if response.status_code == 200:
        callback(response.text)

if __name__ == &#39;__main__&#39;:
    urls=[&#39;https://www.baidu.com/&#39;,&#39;http://www.sina.com.cn/&#39;,&#39;https://www.python.org&#39;]
    for url in urls:
        t=Thread(target=get_page,args=(url,))
        t.start()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该方案的问题是：&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】解析库之beautifulsoup库</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%A7%A3%E6%9E%90%E5%BA%93%E4%B9%8Bbeautifulsoup%E5%BA%93/</link>
      <pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%A7%A3%E6%9E%90%E5%BA%93%E4%B9%8Bbeautifulsoup%E5%BA%93/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;一-介绍&#34;&gt;一 介绍&lt;/h3&gt;
&lt;p&gt;Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.你可能在寻找 Beautiful Soup3 的文档,Beautiful Soup 3 目前已经停止开发,官网推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#安装 Beautiful Soup
pip install beautifulsoup4

#安装解析器
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml:

$ apt-get install Python-lxml

$ easy_install lxml

$ pip install lxml

另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:

$ apt-get install Python-html5lib

$ easy_install html5lib

$ pip install html5lib
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下表列出了主要的解析器,以及它们的优缺点,官网推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jiexiqi.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912036355_4097.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html&#34;&gt;中文文档：https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;二-基本使用&#34;&gt;二 基本使用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;html_doc = &amp;quot;&amp;quot;&amp;quot;
&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;The Dormouse&#39;s story&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p class=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;b&amp;gt;The Dormouse&#39;s story&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p class=&amp;quot;story&amp;quot;&amp;gt;Once upon a time there were three little sisters; and their names were
&amp;lt;a href=&amp;quot;http://example.com/elsie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link1&amp;quot;&amp;gt;Elsie&amp;lt;/a&amp;gt;,
&amp;lt;a href=&amp;quot;http://example.com/lacie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link2&amp;quot;&amp;gt;Lacie&amp;lt;/a&amp;gt; and
&amp;lt;a href=&amp;quot;http://example.com/tillie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link3&amp;quot;&amp;gt;Tillie&amp;lt;/a&amp;gt;;
and they lived at the bottom of a well.&amp;lt;/p&amp;gt;

&amp;lt;p class=&amp;quot;story&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;
&amp;quot;&amp;quot;&amp;quot;

#基本使用：容错处理,文档的容错能力指的是在html代码不完整的情况下,使用该模块可以识别该错误。使用BeautifulSoup解析上述代码,能够得到一个 BeautifulSoup 的对象,并能按照标准的缩进格式的结构输出
from bs4 import BeautifulSoup
soup=BeautifulSoup(html_doc,&#39;lxml&#39;) #具有容错功能
res=soup.prettify() #处理好缩进，结构化显示
print(res)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;三-遍历文档树&#34;&gt;三 遍历文档树&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#遍历文档树：即直接通过标签名字选择，特点是选择速度快，但如果存在多个相同的标签则只返回第一个
#1、用法
#2、获取标签的名称
#3、获取标签的属性
#4、获取标签的内容
#5、嵌套选择
#6、子节点、子孙节点
#7、父节点、祖先节点
#8、兄弟节点


#遍历文档树：即直接通过标签名字选择，特点是选择速度快，但如果存在多个相同的标签则只返回第一个
html_doc = &amp;quot;&amp;quot;&amp;quot;
&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;The Dormouse&#39;s story&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p id=&amp;quot;my p&amp;quot; class=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;b id=&amp;quot;bbb&amp;quot; class=&amp;quot;boldest&amp;quot;&amp;gt;The Dormouse&#39;s story&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p class=&amp;quot;story&amp;quot;&amp;gt;Once upon a time there were three little sisters; and their names were
&amp;lt;a href=&amp;quot;http://example.com/elsie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link1&amp;quot;&amp;gt;Elsie&amp;lt;/a&amp;gt;,
&amp;lt;a href=&amp;quot;http://example.com/lacie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link2&amp;quot;&amp;gt;Lacie&amp;lt;/a&amp;gt; and
&amp;lt;a href=&amp;quot;http://example.com/tillie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link3&amp;quot;&amp;gt;Tillie&amp;lt;/a&amp;gt;;
and they lived at the bottom of a well.&amp;lt;/p&amp;gt;

&amp;lt;p class=&amp;quot;story&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;
&amp;quot;&amp;quot;&amp;quot;

#1、用法
from bs4 import BeautifulSoup
soup=BeautifulSoup(html_doc,&#39;lxml&#39;)
# soup=BeautifulSoup(open(&#39;a.html&#39;),&#39;lxml&#39;)

print(soup.p) #存在多个相同的标签则只返回第一个
print(soup.a) #存在多个相同的标签则只返回第一个

#2、获取标签的名称
print(soup.p.name)

#3、获取标签的属性
print(soup.p.attrs)

#4、获取标签的内容
print(soup.p.string) # p下的文本只有一个时，取到，否则为None
print(soup.p.strings) #拿到一个生成器对象, 取到p下所有的文本内容
print(soup.p.text) #取到p下所有的文本内容
for line in soup.stripped_strings: #去掉空白
    print(line)

&#39;&#39;&#39;
如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None，如果只有一个子节点那么就输出该子节点的文本，比如下面的这种结构，soup.p.string 返回为None,但soup.p.strings就可以找到所有文本
&amp;lt;p id=&#39;list-1&#39;&amp;gt;
    哈哈哈哈
    &amp;lt;a class=&#39;sss&#39;&amp;gt;
        &amp;lt;span&amp;gt;
            &amp;lt;h1&amp;gt;aaaa&amp;lt;/h1&amp;gt;
        &amp;lt;/span&amp;gt;
    &amp;lt;/a&amp;gt;
    &amp;lt;b&amp;gt;bbbbb&amp;lt;/b&amp;gt;
&amp;lt;/p&amp;gt;
&#39;&#39;&#39;

#5、嵌套选择
print(soup.head.title.string)
print(soup.body.a.string)

#6、子节点、子孙节点
print(soup.p.contents) #p下所有子节点
print(soup.p.children) #得到一个迭代器,包含p下所有子节点

for i,child in enumerate(soup.p.children):
    print(i,child)

print(soup.p.descendants) #获取子孙节点,p下所有的标签都会选择出来
for i,child in enumerate(soup.p.descendants):
    print(i,child)

#7、父节点、祖先节点
print(soup.a.parent) #获取a标签的父节点
print(soup.a.parents) #找到a标签所有的祖先节点，父亲的父亲，父亲的父亲的父亲...

#8、兄弟节点
print(&#39;=====&amp;gt;&#39;)
print(soup.a.next_sibling) #下一个兄弟
print(soup.a.previous_sibling) #上一个兄弟

print(list(soup.a.next_siblings)) #下面的兄弟们=&amp;gt;生成器对象
print(soup.a.previous_siblings) #上面的兄弟们=&amp;gt;生成器对象
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;四-搜索文档树&#34;&gt;四 搜索文档树&lt;/h3&gt;
&lt;p&gt;1、五种过滤器&lt;/p&gt;</description>
    </item>
    <item>
      <title>利用腾讯云函数设置定时任务实现腾讯视频自动签到获得V力值</title>
      <link>https://zhong-er.com/posts/%E5%88%A9%E7%94%A8%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0%E8%AE%BE%E7%BD%AE%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E5%AE%9E%E7%8E%B0%E8%85%BE%E8%AE%AF%E8%A7%86%E9%A2%91%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E8%8E%B7%E5%BE%97v%E5%8A%9B%E5%80%BC/</link>
      <pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%88%A9%E7%94%A8%E8%85%BE%E8%AE%AF%E4%BA%91%E5%87%BD%E6%95%B0%E8%AE%BE%E7%BD%AE%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E5%AE%9E%E7%8E%B0%E8%85%BE%E8%AE%AF%E8%A7%86%E9%A2%91%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0%E8%8E%B7%E5%BE%97v%E5%8A%9B%E5%80%BC/</guid>
      <description>&lt;p&gt;腾讯视频vip花了钱，还不能自动升级，要每天签到才涨V力值。升级VIP等级。。实在蛋疼。这次又是云服务器函数，搞了个脚本COOKIES方式登录。测试了40多天。还没到期，感觉自用够了。分享出来吧。。&lt;br&gt;
cookies获取麻烦点。不过也就一两分钟的事，能用1个月以上就够了。&lt;/p&gt;
&lt;p&gt;准备工具：&lt;br&gt;
chrome浏览器&lt;br&gt;
qq或微信登录腾讯云&lt;br&gt;
腾讯视频会员一枚&lt;/p&gt;
&lt;h1 id=&#34;第一步获取cookies&#34;&gt;第一步：获取cookies&lt;/h1&gt;
&lt;p&gt;1.浏览器打开腾讯视频官网：&lt;br&gt;
&lt;a href=&#34;https://v.qq.com/&#34;&gt;https://v.qq.com/&lt;/a&gt;&lt;br&gt;
登录VIP账号（这里我就不详写了。应该都会。我是直接手机扫码登录）&lt;/p&gt;
&lt;p&gt;2.VIP账号登录成功后，打开另一个地址：&lt;br&gt;
&lt;a href=&#34;https://vip.video.qq.com/fcgi-bin/comm_cgi?name=hierarchical_task_system&amp;amp;cmd=2&#34;&gt;https://vip.video.qq.com/fcgi-bin/comm_cgi?name=hierarchical_task_system&amp;amp;cmd=2&lt;/a&gt;&lt;br&gt;
（没错这个就是签到地址。APP抓出来的。）&lt;/p&gt;
&lt;p&gt;3.在第二个地址，按下快捷键：CTRL+SHIFT+J&lt;br&gt;
在&amp;gt;后面输入：document.cookie&lt;br&gt;
回车，复制【引号里】的内容（脚本要用的cookies）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pgv_pvi=513475&amp;hellip;&amp;hellip;..（中间打码了。。看个开头和结尾吧）&amp;hellip;. uid=59985555&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;txspqd.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912027759_6945_1.jpg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;第二部腾讯云部署脚本&#34;&gt;第二部：腾讯云部署脚本&lt;/h1&gt;
&lt;p&gt;用qq或者微信登录腾讯云scf(无服务器云函数)&lt;br&gt;
&lt;a href=&#34;https://console.cloud.tencent.com/scf&#34;&gt;https://console.cloud.tencent.com/scf&lt;/a&gt;&lt;br&gt;
函数服务=》（选择区域，上海，广州，成都，香港，北京）&lt;br&gt;
=》新建=》空白函数=》函数名称（随便写，比如txsp_qiandao）=》运行环境（python3.6）=》下一步&lt;br&gt;
复制下面代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# -*- coding: utf8 -*-

import requests
import re
import time
from urllib.parse import quote

def start():
    try:
        s = requests.session()

        cookie1 = &#39;TXSP_COOKIE&#39;

        this_time = int(round(time.time() * 1000))

        login_url = &#39;https://vip.video.qq.com/fcgi-bin/comm_cgi?name=hierarchical_task_system&amp;amp;cmd=2&amp;amp;_=&#39; + str(this_time)

        headers={
            &#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36&#39;,
            &#39;Cookie&#39;: cookie1
        }

        res =s.get(login_url,headers=headers).text

        print(&#39;访问结果：&#39;+res)

        if &#39;Account Verify Error&#39; in res:
            print(&#39;cookies失效，通知SERVER酱！&#39;)
            requests.get(&#39;https://sc.ftqq.com/SCKEY.send?text=&#39; + quote(&#39;腾讯视频自动签到失败~&#39;+time.strftime(&#39;%Y.%m.%d&#39;,time.localtime(time.time()))) +&#39;&amp;amp;desp=&#39;+quote(&#39;cookies失效，请更新！\n&#39;))
        else:
            print(&#39;签到完成&#39;)

    except Exception as e:
        print(&amp;quot;地址访问失败，通知SERVER酱！&amp;quot;)
        requests.get(&#39;https://sc.ftqq.com/SCKEY.send?text=&#39; + quote(&#39;腾讯视频自动签到失败~&#39;+time.strftime(&#39;%Y.%m.%d&#39;,time.localtime(time.time()))) +&#39;&amp;amp;desp=&#39;+quote(&#39;异常代码：\n&#39;+str(e)))


def main_handler(event, context):
    return start()


if __name__ == &#39;__main__&#39;:
    start()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码需要修改的地方3处，&lt;br&gt;
TXSP_COOKIE （一处，刚才获取的cookies字符串）&lt;br&gt;
&lt;a href=&#34;https://sc.ftqq.com/SCKEY.send&#34;&gt;https://sc.ftqq.com/SCKEY.send&lt;/a&gt; （两处，server酱的地址，申请地址：http://sc.ftqq.com/）&lt;/p&gt;</description>
    </item>
    <item>
      <title>数据分析介绍</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%BB%8B%E7%BB%8D/</link>
      <pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%BB%8B%E7%BB%8D/</guid>
      <description>&lt;h3 id=&#34;sjfxjpg&#34;&gt;&lt;img alt=&#34;sjfx.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912025928_8638_1.jpg&#34;&gt;&lt;/h3&gt;
&lt;h3 id=&#34;1数据分析是什么&#34;&gt;1、数据分析是什么&lt;/h3&gt;
&lt;p&gt;在我们如今这个时代，相信大多数人都能明白数据的重要性，数据就是信息，而数据分析就是可以让我们发挥这些信息功能的重要手段。&lt;/p&gt;
&lt;h3 id=&#34;2数据分析能干什么&#34;&gt;2、数据分析能干什么&lt;/h3&gt;
&lt;p&gt;对于数据分析能干什么其实我们可以简单的举几个例子：&lt;/p&gt;
&lt;p&gt;1、淘宝可以观察用户的购买记录、搜索记录以及人们在社交媒体上发布的内容选择商品推荐&lt;/p&gt;
&lt;p&gt;2、股票可以根据相应的数据选择买进卖出&lt;/p&gt;
&lt;p&gt;3、今日头条可以将数据分析应用到新闻推送排行算法当中&lt;/p&gt;
&lt;p&gt;4、爱奇艺可以为用户提供个性化电影推荐服务&lt;/p&gt;
&lt;p&gt;其实数据分析不仅可以完成像以上这样的推荐系统，在制药行业也可运用数据分析来预测什么样的化合物更有可能制成高效药物等&lt;/p&gt;
&lt;p&gt;所以说数据分析绝对是未来所有公司不可或缺的岗位，目前社会上获取数据方式太多了，这么多的数据，只要我们拥有数据分析的技能，绝对可以应付任何岗位上的工作。&lt;/p&gt;
&lt;h3 id=&#34;3为什么利用python进行数据分析&#34;&gt;3、为什么利用Python进行数据分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1、Python的代码语法简单易学&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2、Python可以很容易的整合C、C++等语言的代码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3、Python有大量用于科学计算的库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4、Python不仅可以用于研究和原型构建，同时也适用于构建生产系统&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4数据分析过程概述&#34;&gt;4、数据分析过程概述&lt;/h3&gt;
&lt;h5 id=&#34;41提出问题&#34;&gt;4.1、提出问题&lt;/h5&gt;
&lt;p&gt;在真正的工作场景下，往往我们需要的处理的是多个庞大的数据集还有可能是类型完全不同的数据，那这个时候一个准确的问题就可以让我们聚集与问题相关的那部分数据，为后续的分析操作提供一个明确的方向，帮助我们得到一个有意义的结论。&lt;/p&gt;
&lt;h5 id=&#34;42整理数据&#34;&gt;4.2、整理数据&lt;/h5&gt;
&lt;p&gt;整理数据主要分为三步：&lt;/p&gt;
&lt;p&gt;(1)、收集数据&lt;/p&gt;
&lt;p&gt;通过多种途径拿到数据，导入到&lt;code&gt;Jupyter Notebook&lt;/code&gt;中&lt;/p&gt;
&lt;p&gt;(2)、评估数据&lt;/p&gt;
&lt;p&gt;这一步主要是需要找出数据是否存在质量或者结构等方面的问题&lt;/p&gt;
&lt;p&gt;(3)、清理数据&lt;/p&gt;
&lt;p&gt;通过修改、替换、删除等方式保证数据质量高、结构好&lt;/p&gt;
&lt;h5 id=&#34;33探索性数据分析&#34;&gt;3.3、探索性数据分析&lt;/h5&gt;
&lt;p&gt;在这一步骤主要可以探索并且扩充数据&lt;/p&gt;
&lt;h5 id=&#34;44得出结论&#34;&gt;4.4、得出结论&lt;/h5&gt;
&lt;p&gt;在进行完探索性数据分析之后肯定会得出一个结果或者说是结论，这样我们就可以根据这样一个结论进行相应的操作，就比如说分析股票数据得到那个大盘趋势好可以选择买进，又或者说类似于万达这样的大型商场可以分析那种类型的商品会比较受用户的欢迎，以便针对性的存货。但是具体的操作可能就需要用到机器学习或者推断统计学来实现，这个就与数据分析不一样了&lt;/p&gt;
&lt;h5 id=&#34;45传达结果&#34;&gt;4.5、传达结果&lt;/h5&gt;
&lt;p&gt;分析的能力有多强，分析的价值就有多大。&lt;/p&gt;
&lt;p&gt;这一步主要是向其他人证明你发现的见解以及传达意义&lt;/p&gt;
&lt;h3 id=&#34;5常用库简介&#34;&gt;5、常用库简介&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Numpy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://numpy.org/&#34;&gt;Numpy&lt;/a&gt;是Numerical Python的简写，主要可以用来做Python数值计算。它提供了多种数据结构、算法以及大部分涉及Python数值计算所需的接口。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;快速、高效的多维数组对象ndarray&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基于元素的数组计算以及直接对数组执行数学运算的函数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于读写硬盘上基于数组的数据集的工具&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;线性代数运算、傅里叶变换，以及随机数生成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于将C、C++、Fortran代码集成到python的工具&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Pandas&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pandas使我们进行数据分析的一个主要工具。它所包含的数据结构和数据处理工具的设计使得Python中进行数据清洗和分析非常快捷。pandas一般也是和其他数值计算工具一起使用的，支持大部分Numpy语言风格的数组计算。pandas和numpy最大的区别就是pandas是用来处理表格型或者异质性数据的，而Numpy则刚好相反，它更适合处理同质型的数值类数组数据&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;matplotlib&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;matplotlib是最流行的用于绘制数据图表的python库。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Scipy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Scipy是科学计算领域针对不同标准问题域的包集合。提供了强大的科学计算方法（矩阵分析、信号分析、数理分析等）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;IPython和Juypyter notebook&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;IPython是一个加强版的Python解释器，Juypyter notebook是一种基于Web的代码笔记本，最初也是源于IPython项目。&lt;/p&gt;</description>
    </item>
    <item>
      <title>数据分析开发环境部署</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/</link>
      <pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;anaconda.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912027338_91_1.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;1anaconda&#34;&gt;1、Anaconda&lt;/h3&gt;
&lt;p&gt;Anaconda是Python的一个开源的发行版本，里面包含了很多科学计算相关的包，它和Python的关系就像linux系统中centos和Ubuntu的关系一样，不冲突，你可以同时在电脑上安装这两个东西。那至于为什么我已经在电脑上安装了pycharm还要安装这个Anaconda呢，主要有以下几点原因：&lt;/p&gt;
&lt;p&gt;（1）Anaconda附带了一大批常用数据科学包，它附带了conda、Python和 150 多个科学包及其依赖项。因此你可以用Anaconda立即开始处理数据。&lt;/p&gt;
&lt;p&gt;（2）管理包。Anaconda 是在 conda（一个包管理器和环境管理器）上发展出来的。在数据分析中，你会用到很多第三方的包，而conda（包管理器）可以很好的帮助你在计算机上安装和管理这些包，包括安装、卸载和更新包。&lt;/p&gt;
&lt;p&gt;（3）管理环境。为什么需要管理环境呢？比如你在A项目中用到了Python2，而新的项目要求使用Python3，而同时安装两个Python版本可能会造成许多混乱和错误。这时候conda就可以帮助你为不同的项目建立不同的运行环境。还有很多项目使用的包版本不同，比如不同的pandas版本，不可能同时安装两个pandas版本。你要做的应该是在项目对应的环境中创建对应的pandas版本。这时候conda就可以帮你做到。&lt;/p&gt;
&lt;p&gt;总结：Anaconda解决了官方Python的两大痛点：&lt;/p&gt;
&lt;p&gt;（1）提供了包管理功能，Windows平台安装第三方包经常失败的场景得以解决&lt;/p&gt;
&lt;p&gt;（2）提供环境管理功能，解决了多版本Python并存、切换的问题。&lt;/p&gt;
&lt;p&gt;接下来就需要了解Anaconda如何进行安装&lt;/p&gt;
&lt;h3 id=&#34;2下载&#34;&gt;2、下载&lt;/h3&gt;
&lt;h5 id=&#34;anaconda下载入口&#34;&gt;&lt;a href=&#34;https://www.anaconda.com/distribution/#download-section&#34;&gt;Anaconda下载入口&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;&lt;img alt=&#34;anacondaxz.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912025238_1946.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;按照上面的路径点击下载，下载完成后就可以一路点击下一步完成安装，如果中间需要修改安装路径可以自己改一下。安装成功之后我们会发现，多出来几个应用&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Anaconda Navigtor ：用于管理工具包和环境的图形用户界面，后续涉及的众多管理命令也可以在 Navigator 中手工实现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jupyter notebook ：基于web的交互式计算环境，可以编辑易于人们阅读的文档，用于展示数据分析的过程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qtconsole ：一个可执行 IPython 的仿终端图形界面程序，相比 Python Shell 界面，qtconsole 可以直接显示代码生成的图形，实现多行代码输入执行，以及内置许多有用的功能和函数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;spyder ：一个使用Python语言、跨平台的、科学运算集成开发环境。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;那以上应用我们简单了解一下就好，不需要管。&lt;/p&gt;
&lt;h3 id=&#34;3配置环境变量&#34;&gt;3、配置环境变量&lt;/h3&gt;
&lt;h5 id=&#34;31windows-系统&#34;&gt;3.1、windows 系统&lt;/h5&gt;
&lt;p&gt;如果是Windows环境的话就需要在&lt;code&gt;控制面板\系统和安全\系统\高级系统设置\环境变量\用户变量\PATH&lt;/code&gt;当中添加anaconda的安装目录的Scripts文件夹。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;验证：&lt;br&gt;
打开命令行输入conda &amp;ndash;version，如果能输出版本号就对了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&#34;32mac系统&#34;&gt;3.2、Mac系统&lt;/h5&gt;
&lt;p&gt;在终端输入以下命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export PATH=~/anaconda/bin:$PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;4管理包&#34;&gt;4、管理包&lt;/h3&gt;
&lt;p&gt;在anaconda当中虽然已经存在了很多科学计算的包，但是我们总有需要安装新的包的需求，有了anaconda就可以很好地管理这些包了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 管理包在Python解释器中有pip，在anaconda中conda，它的功能和pip是一样的，在anaconda中选择pip也是可以安装包的
1、安装包
conda install requests
2、卸载包
conda remove requests
3、更新包
conda update requests
4、查询已安装的包
conda list
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;5管理环境&#34;&gt;5、管理环境&lt;/h3&gt;
&lt;p&gt;可以通过conda创建不同的运行环境&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】请求库之selenium库</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%AF%B7%E6%B1%82%E5%BA%93%E4%B9%8Bselenium%E5%BA%93/</link>
      <pubDate>Fri, 29 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%AF%B7%E6%B1%82%E5%BA%93%E4%B9%8Bselenium%E5%BA%93/</guid>
      <description>&lt;h1 id=&#34;爬虫png&#34;&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/h1&gt;
&lt;h1 id=&#34;一介绍&#34;&gt;一、介绍&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

selenium本质是通过驱动浏览器，完全模拟浏览器的操作，比如跳转、输入、点击、下拉等，来拿到网页渲染之后的结果，可支持多种浏览器

from selenium import webdriver
browser=webdriver.Chrome()
browser=webdriver.Firefox()
browser=webdriver.PhantomJS()
browser=webdriver.Safari()
browser=webdriver.Edge()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;http://selenium-python.readthedocs.io/&#34;&gt;官网：http://selenium-python.readthedocs.io&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;二安装&#34;&gt;二、安装&lt;/h1&gt;
&lt;p&gt;1.有界面浏览器&lt;/p&gt;
&lt;p&gt;selenium+chromedriver&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#安装：selenium+chromedriver
pip3 install selenium
下载chromdriver.exe放到python安装路径的scripts目录中即可，注意最新版本是2.38，并非2.9
国内镜像网站地址：http://npm.taobao.org/mirrors/chromedriver/2.38/
最新的版本去官网找:https://sites.google.com/a/chromium.org/chromedriver/downloads

#验证安装
C:\Users\Administrator&amp;gt;python3
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.
&amp;gt;&amp;gt;&amp;gt; from selenium import webdriver
&amp;gt;&amp;gt;&amp;gt; driver=webdriver.Chrome() #弹出浏览器
&amp;gt;&amp;gt;&amp;gt; driver.get(&#39;https://www.baidu.com&#39;)
&amp;gt;&amp;gt;&amp;gt; driver.page_source

#注意：
selenium3默认支持的webdriver是Firfox，而Firefox需要安装geckodriver
下载链接：https://github.com/mozilla/geckodriver/releases

selenium+chromedriver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.无界面浏览器&lt;/p&gt;
&lt;p&gt;selenium+phantomjs&lt;/p&gt;
&lt;p&gt;PhantomJS不再更新&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】基本原理</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86/</link>
      <pubDate>Mon, 25 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;一爬虫是什么&#34;&gt;一、爬虫是什么？&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;pachong.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201911253050_307.jpg&#34;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#1、什么是互联网？
    互联网是由网络设备（网线，路由器，交换机，防火墙等等）和一台台计算机连接而成，像一张网一样。

#2、互联网建立的目的？
    互联网的核心价值在于数据的共享/传递：数据是存放于一台台计算机上的，而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递，否则你只能拿U盘去别人的计算机上拷贝数据了。

#3、什么是上网？爬虫要做的是什么？
    我们所谓的上网便是由用户端计算机发送请求给目标计算机，将目标计算机的数据下载到本地的过程。
    #3.1 只不过，用户获取网络数据的方式是：
      浏览器提交请求-&amp;gt;下载网页代码-&amp;gt;解析/渲染成页面。

```
#3.2 而爬虫程序要做的就是：
  模拟浏览器发送请求-&amp;gt;下载网页代码-&amp;gt;只提取有用的数据-&amp;gt;存放于数据库或文件中
　
#3.1与3.2的区别在于:
```

      我们的爬虫程序只提取网页代码中对我们有用的数据

#4、总结爬虫
    #4.1 爬虫的比喻：
      如果我们把互联网比作一张大的蜘蛛网，那一台计算机上的数据便是蜘蛛网上的一个猎物，而爬虫程序就是一只小蜘蛛，沿着蜘蛛网抓取自己想要的猎物/数据

```
#4.2 爬虫的定义：
```

      向网站发起请求，获取资源后分析并提取有用数据的程序 

```
#4.3 爬虫的价值：
  互联网中最有价值的便是数据，比如天猫商城的商品信息，链家网的租房信息，雪球网的证券投资信息等等，这些数据都代表了各个行业的真金白银，可以说，谁掌握了行业内的第一手数据，谁就成了整个行业的主宰，如果把整个互联网的数据比喻为一座宝藏，那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏，掌握了爬虫技能，你就成了所有互联网信息公司幕后的老板，换言之，它们都在免费为你提供有价值的数据。
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;二爬虫的基本流程&#34;&gt;二、爬虫的基本流程&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;pclc.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201911256154_6066.png&#34;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#1、发起请求
使用http库向目标站点发起请求，即发送一个Request
Request包含：请求头、请求体等

#2、获取响应内容
如果服务器能正常响应，则会得到一个Response
Response包含：html，json，图片，视频等

#3、解析内容
解析html数据：正则表达式，第三方解析库如Beautifulsoup，pyquery等
解析json数据：json模块
解析二进制数据:以b的方式写入文件

#4、保存数据
数据库
文件
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;三请求与响应&#34;&gt;三、请求与响应&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;qqyxy.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201911251408_31.png&#34;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#http协议：http://www.cnblogs.com/linhaifeng/articles/8243379.html

#Request：用户将自己的信息通过浏览器（socket client）发送给服务器（socket server）

#Response：服务器接收请求，分析用户发来的请求信息，然后返回数据（返回的数据中可能包含其他链接，如：图片，js，css等）

#ps：浏览器在接收Response后，会解析其内容来显示给用户，而爬虫程序在模拟浏览器发送请求然后接收Response后，是要提取其中的有用数据。
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;四request&#34;&gt;四、Request&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#1、请求方式：
    常用的请求方式：GET，POST
    其他请求方式：HEAD，PUT，DELETE，OPTHONS

```
ps：用浏览器演示get与post的区别，（用登录演示post）

post与get请求最终都会拼接成这种形式：k1=xxx&amp;amp;k2=yyy&amp;amp;k3=zzz
post请求的参数放在请求体内：
    可用浏览器查看，存放于form data内
get请求的参数直接放在url后
```

#2、请求url
    url全称统一资源定位符，如一个网页文档，一张图片
    一个视频等都可以用url唯一来确定

```
url编码
https://www.baidu.com/s?wd=图片
图片会被编码（看示例代码）
```

```
网页的加载过程是：
加载一个网页，通常都是先加载document文档，
在解析document文档的时候，遇到链接，则针对超链接发起下载图片的请求
```

#3、请求头
    User-agent：请求头中如果没有user-agent客户端配置，
    服务端可能将你当做一个非法用户
    host
    cookies：cookie用来保存登录信息

```
一般做爬虫都会加上请求头
```

#4、请求体
    如果是get方式，请求体没有内容
    如果是post方式，请求体是format data

```
ps：
1、登录窗口，文件上传等，信息都会被附加到请求体内
2、登录，输入错误的用户名密码，然后提交，就可以看到post，正确登录后页面通常会跳转，无法捕捉到post 
```


from urllib.parse import urlencode
import requests

headers={
&#39;Accept&#39;:&#39;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8&#39;,
&#39;Cookie&#39;:&#39;H_WISE_SIDS=101556_115474_115442_114743_108373_100099_115725_106201_107320_115339_114797_115553_116093_115546_115625_115446_114329_115350_114275_116040_110085; PSTM=1494300712; BAIDUID=42FE2934E37AF7AD1FA31D8CC7006D45:FG=1; BIDUPSID=2996557DB2710279BD865C50F9A68615; MCITY=-%3A; __cfduid=da9f97dea6458ca26aa4278280752ebb01508939712; BDSFRCVID=PGLsJeCCxG3wt_3ZUrBLDfv2D_qBZSjAgcEe3J; H_BDCLCKID_SF=tJAOoCLytI03qn5zq4Oh-4oHhxoJq5QxbT7Z0l8KtfcNVJQs-lCMhbtp-l3GJPoLWK6hBKQmWIQHDnbsbq0M2tcQXR5-WROCte74KKJx-4PWeIJo5tKh04JbhUJiB5OLBan7Lq7xfDDbbDtmej_3-PC3ql6354Rj2C_X3b7EfKjIOtO_bfbT2MbyeqrNQlTkLIvXoITJQD_bEP3Fbfj2DPQ3KabZqjDjJbue_I05f-oqebT4btbMqRtthf5KeJ3KaKrKW5rJabC3hPJeKU6qLT5Xjh6B5qDfyDoAbKOt-IOjhb5hMpnx-p0njxQyaR3RL2Kj0p_EWpcxsCQqLUonDh8L3H7MJUntKjnRonTO5hvvhb6O3M7-XpOhDG0fJjtJJbksQJ5e24oqHP-kKPrV-4oH5MQy5toyHD7yWCvjWlT5OR5Jj6KMjMkb3xbz2fcpMIrjob8M5CQESInv3MA--fcLD2ch5-3eQgTI3fbIJJjWsq0x0-jle-bQypoa-U0j2COMahkMal7xO-QO05CaD53yDNDqtjn-5TIX_CjJbnA_Hn7zepoxebtpbt-qJJjzMerW_Mc8QUJBH4tR-T3keh-83xbnBT5KaKO2-RnPXbcWjt_lWh_bLf_kQN3TbxuO5bRiL66I0h6jDn3oyT3VXp0n54nTqjDHfRuDVItXf-L_qtDk-PnVeUP3DhbZKxtqtDKjXJ7X2fclHJ7z-R3IBPCD0tjk-6JnWncKaRcI3poiqKtmjJb6XJkl2HQ405OT-6-O0KJcbRodobAwhPJvyT8DXnO7-fRTfJuJ_DDMJDD3fP36q4QV-JIehmT22jnT32JeaJ5n0-nnhP3mBTbA3JDYX-Oh-jjRX56GhfO_0R3jsJKRy66jK4JKjHKet6vP; ispeed_lsm=0; H_PS_PSSID=1421_24558_21120_17001_24880_22072; BD_UPN=123253; H_PS_645EC=44be6I1wqYYVvyugm2gc3PK9PoSa26pxhzOVbeQrn2rRadHvKoI%2BCbN5K%2Bg; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598&#39;,
&#39;Host&#39;:&#39;www.baidu.com&#39;,
&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36&#39;}

# response=requests.get(&#39;https://www.baidu.com/s?&#39;+urlencode({&#39;wd&#39;:&#39;美女&#39;}),headers=headers)
response=requests.get(&#39;https://www.baidu.com/s&#39;,params={&#39;wd&#39;:&#39;美女&#39;},headers=headers) #params内部就是调用urlencode
print(response.text)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;五response&#34;&gt;五、Response&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#1、响应状态
    200：代表成功
    301：代表跳转
    404：文件不存在
    403：权限
    502：服务器错误

#2、Respone header
    set-cookie：可能有多个，是来告诉浏览器，把cookie保存下来
    
#3、preview就是网页源代码
    最主要的部分，包含了请求资源的内容
    如网页html，图片
    二进制数据等
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;六总结&#34;&gt;六、总结&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#1、总结爬虫流程：
    爬取---&amp;gt;解析---&amp;gt;存储

#2、爬虫所需工具：
    请求库：requests,selenium
    解析库：正则，beautifulsoup，pyquery
    存储库：文件，MySQL，Mongodb，Redis

#3、爬虫常用框架：
    scrapy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;爬取校花网视频&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】请求库之requests库</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%AF%B7%E6%B1%82%E5%BA%93%E4%B9%8Brequests%E5%BA%93/</link>
      <pubDate>Mon, 25 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%AF%B7%E6%B1%82%E5%BA%93%E4%B9%8Brequests%E5%BA%93/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;一介绍&#34;&gt;一、介绍&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#介绍：使用requests可以模拟浏览器的请求，比起之前用到的urllib，requests模块的api更加便捷（本质就是封装了urllib3）

#注意：requests库发送请求将网页内容下载下来以后，并不会执行js代码，这需要我们自己分析目标站点然后发起新的request请求

#安装：pip3 install requests

#各种请求方式：常用的就是requests.get()和requests.post()
&amp;gt;&amp;gt;&amp;gt; import requests
&amp;gt;&amp;gt;&amp;gt; r = requests.get(&#39;https://api.github.com/events&#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.post(&#39;http://httpbin.org/post&#39;, data = {&#39;key&#39;:&#39;value&#39;})
&amp;gt;&amp;gt;&amp;gt; r = requests.put(&#39;http://httpbin.org/put&#39;, data = {&#39;key&#39;:&#39;value&#39;})
&amp;gt;&amp;gt;&amp;gt; r = requests.delete(&#39;http://httpbin.org/delete&#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.head(&#39;http://httpbin.org/get&#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.options(&#39;http://httpbin.org/get&#39;)

#建议在正式学习requests前，先熟悉下HTTP协议
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;http://docs.python-requests.org/en/master/&#34;&gt;官网链接：http://docs.python-requests.org/en/master/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;二基于get请求&#34;&gt;二、基于GET请求&lt;/h1&gt;
&lt;p&gt;1、基本请求&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import requests
response=requests.get(&#39; 
print(response.text)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、带参数的GET请求-&amp;gt;params&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#在请求头内将自己伪装成浏览器，否则百度不会正常返回页面内容
import requests
response=requests.get(&#39;https://www.baidu.com/s?wd=python&amp;amp;pn=1&#39;,
                      headers={
                        &#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36&#39;,
                      })
print(response.text)



#如果查询关键词是中文或者有其他特殊符号，则不得不进行url编码
from urllib.parse import urlencode
wd=&#39;egon老师&#39;
encode_res=urlencode({&#39;k&#39;:wd},encoding=&#39;utf-8&#39;)
keyword=encode_res.split(&#39;=&#39;)[1]
print(keyword)
# 然后拼接成url
url=&#39;https://www.baidu.com/s?wd=%s&amp;amp;pn=1&#39; %keyword

response=requests.get(url,
                      headers={
                        &#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36&#39;,
                      })
res1=response.text

自己拼接GET参数
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;params参数的使用&lt;/p&gt;</description>
    </item>
    <item>
      <title>Chrome浏览器78版本关闭鼠标落在标签页上标题提示</title>
      <link>https://zhong-er.com/posts/chrome%E6%B5%8F%E8%A7%88%E5%99%A878%E7%89%88%E6%9C%AC%E5%85%B3%E9%97%AD%E9%BC%A0%E6%A0%87%E8%90%BD%E5%9C%A8%E6%A0%87%E7%AD%BE%E9%A1%B5%E4%B8%8A%E6%A0%87%E9%A2%98%E6%8F%90%E7%A4%BA/</link>
      <pubDate>Wed, 20 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/chrome%E6%B5%8F%E8%A7%88%E5%99%A878%E7%89%88%E6%9C%AC%E5%85%B3%E9%97%AD%E9%BC%A0%E6%A0%87%E8%90%BD%E5%9C%A8%E6%A0%87%E7%AD%BE%E9%A1%B5%E4%B8%8A%E6%A0%87%E9%A2%98%E6%8F%90%E7%A4%BA/</guid>
      <description>&lt;p&gt;Chrome 78版本开启了鼠标落在标签页标题内容提示 怎么关闭这个提示呢？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chrome://flags/#tab-hover-cards  为 Disable 即可！
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有网友发现还有一项设置：Tab Hover Card Images&lt;br&gt;
鼠标落在标签页，显示缩略图！&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;chrome1.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201911204021_6678_1.png&#34;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chrome://flags/#tab-hover-card-images 默认是关闭，设置成 Enable 即可开启
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Chrome浏览器多线程下载开关</title>
      <link>https://zhong-er.com/posts/chrome%E6%B5%8F%E8%A7%88%E5%99%A8%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8B%E8%BD%BD%E5%BC%80%E5%85%B3/</link>
      <pubDate>Wed, 20 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/chrome%E6%B5%8F%E8%A7%88%E5%99%A8%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%8B%E8%BD%BD%E5%BC%80%E5%85%B3/</guid>
      <description>&lt;p&gt;chrome://flags/#enable-parallel-downloading&lt;/p&gt;
&lt;p&gt;Enable parallel downloading to accelerate download speed. – Mac, Windows, Linux, Chrome OS, Android&lt;br&gt;
启用并行下载以加快下载速度。–Mac、Windows、Linux、Chrome操作系统、Android&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;chrome2.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201911205628_1937_1.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【DRF】 django rest framework总结</title>
      <link>https://zhong-er.com/posts/drf-django-rest-framework%E6%80%BB%E7%BB%93/</link>
      <pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf-django-rest-framework%E6%80%BB%E7%BB%93/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;1接口&#34;&gt;1.接口**&lt;/h1&gt;
&lt;p&gt;**&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
1、什么是接口：url+请求参数+响应数据 | 接口文档

2、接口规范：
	url：https，api，资源(名词复数)，v1，get|post表示操作资源的方式，?过滤条件
	响应数据：status，msg，results|data，url资源数据
&amp;quot;&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;2drf入门&#34;&gt;2.DRF入门&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
1、封装风格

2、请求生命周期：走APIView的as_view =&amp;gt; View的as_view调用APIView的dispatch =&amp;gt; 分发给视图类的请求函数 =&amp;gt; 响应

3、请求模块：二次封装request

4、解析模块：局部全局配置，form-data、urlencoding、json

5、渲染模块：局部全局配置，html、json

6、响应模块：Response(data, http_status, header)
data={&#39;detail&#39;: serializer_obj.errors} =&amp;gt; http_status=4..|5..
# 4,5开头字段状态码，前台axios请求响应会解析到catch分支
axios({}).then().catch()

7、二次封装Response：
	i) 继承Response
	ii) 自定义参数格式化成data，传给 super().__init__(data=data)
	iii) 网络状态码、响应头等信息带给super().__init__()
	
8、异常模块：在请求生命周期中，分发请求任务执行时，被一个超大的try except包裹，一旦出现任何异常，都会交给exception_handler函数处理
	自定义原因：系统只处理了部分，所以手动还需要处理；后期异常信息需要记录到日志文件
	工作流程：先交给drf处理异常，如果有响应结果，代表drf已处理，如果是None，自己处理
&amp;quot;&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;3序列化组件&#34;&gt;3.序列化组件**&lt;/h1&gt;
&lt;p&gt;**&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1）可以将model对象序列化成可以返回给前台的json数据
# 2）可以校验前台传来的数据，完成model的增与改
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模型层&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class User(models.Model):
    name = models.CharField(max_length=16)
    
    # 自定义插拔序列化字段 - 完成连表深度查询
    @property
    def my_name(self):
        return self.name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;序列化层&lt;/p&gt;</description>
    </item>
    <item>
      <title>【DRF】偏移分页组件/游标分页组件/自定义过滤器/过滤器插件</title>
      <link>https://zhong-er.com/posts/drf%E5%81%8F%E7%A7%BB%E5%88%86%E9%A1%B5%E7%BB%84%E4%BB%B6%E6%B8%B8%E6%A0%87%E5%88%86%E9%A1%B5%E7%BB%84%E4%BB%B6%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BF%87%E6%BB%A4%E5%99%A8%E8%BF%87%E6%BB%A4%E5%99%A8%E6%8F%92%E4%BB%B6/</link>
      <pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf%E5%81%8F%E7%A7%BB%E5%88%86%E9%A1%B5%E7%BB%84%E4%BB%B6%E6%B8%B8%E6%A0%87%E5%88%86%E9%A1%B5%E7%BB%84%E4%BB%B6%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BF%87%E6%BB%A4%E5%99%A8%E8%BF%87%E6%BB%A4%E5%99%A8%E6%8F%92%E4%BB%B6/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;1drf偏移分页组件&#34;&gt;1.drf偏移分页组件&lt;/h1&gt;
&lt;p&gt;pahenations.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from rest_framework.pagination import LimitOffsetPagination
class MyLimitOffsetPagination(LimitOffsetPagination):
    # ?offset=从头偏移的条数&amp;amp;limit=要显示的条数
    limit_query_param = &#39;limit&#39;
    offset_query_param = &#39;offset&#39;
    # ?不传offset和limit默认显示前3条，只设置offset就是从偏移位往后再显示3条
    default_limit = 3
    # ?limit可以自定义一页显示的最大条数
    max_limit = 5

    # 只使用limit结合ordering可以实现排行前几或后几
    # ?ordering=-price&amp;amp;limit=2  =&amp;gt; 价格前2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;views.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from rest_framework.generics import ListAPIView

class CarListAPIView(ListAPIView):
    # 如果queryset没有过滤条件，就必须 .all()，不然分页会出问题
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer
    
    # 分页组件 - 给视图类配置分页类即可 - 分页类需要自定义，继承drf提供的分页类即可
    pagination_class = pagenations.MyLimitOffsetPagination
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;2drf游标分页组件&#34;&gt;2.drf游标分页组件&lt;/h1&gt;
&lt;p&gt;pahenations.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 注：必须基于排序规则下进行分页
# 1）如果接口配置了OrderingFilter过滤器，那么url中必须传ordering
# 1）如果接口没有配置OrderingFilter过滤器，一定要在分页类中声明ordering按某个字段进行默认排序
from rest_framework.pagination import CursorPagination
class MyCursorPagination(CursorPagination):
    cursor_query_param = &#39;cursor&#39;
    page_size = 3
    page_size_query_param = &#39;page_size&#39;
    max_page_size = 5
    ordering = &#39;-pk&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;views.py&lt;/p&gt;</description>
    </item>
    <item>
      <title>【DRF】频率组件</title>
      <link>https://zhong-er.com/posts/drf%E9%A2%91%E7%8E%87%E7%BB%84%E4%BB%B6/</link>
      <pubDate>Tue, 22 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf%E9%A2%91%E7%8E%87%E7%BB%84%E4%BB%B6/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;1频率类源码入口&#34;&gt;&lt;strong&gt;1.频率类源码入口&lt;/strong&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 1）APIView的dispath方法中的 self.initial(request, *args, **kwargs) 点进去
# 2）self.check_throttles(request) 进行频率认证

# 频率组件核心源码分析
def check_throttles(self, request):
    throttle_durations = []
    # 1）遍历配置的频率认证类，初始化得到一个个频率认证类对象（会调用频率认证类的 __init__() 方法）
    # 2）频率认证类对象调用 allow_request 方法，判断是否限次（没有限次可访问，限次不可访问）
    # 3）频率认证类对象在限次后，调用 wait 方法，获取还需等待多长时间可以进行下一次访问
    # 注：频率认证类都是继承 SimpleRateThrottle 类
    for throttle in self.get_throttles():
        if not throttle.allow_request(request, self):
            # 只要频率限制了，allow_request 返回False了，才会调用wait
            throttle_durations.append(throttle.wait())

            if throttle_durations:
                # Filter out `None` values which may happen in case of config / rate
                # changes, see #1438
                durations = [
                    duration for duration in throttle_durations
                    if duration is not None
                ]

                duration = max(durations, default=None)
                self.throttled(request, duration)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;2自定义频率类&#34;&gt;&lt;strong&gt;2.自定义频率类&lt;/strong&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 1) 自定义一个继承 SimpleRateThrottle 类 的频率类
# 2) 设置一个 scope 类属性，属性值为任意见名知意的字符串
# 3) 在settings配置文件中，配置drf的DEFAULT_THROTTLE_RATES，格式为 {scope字符串: &#39;次数/时间&#39;}
# 4) 在自定义频率类中重写 get_cache_key 方法
	# 限制的对象返回 与限制信息有关的字符串
    # 不限制的对象返回 None (只能放回None，不能是False或是&#39;&#39;等)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;短信接口1/min频率限制&lt;/p&gt;</description>
    </item>
    <item>
      <title>【DRF】认证组件/权限组件</title>
      <link>https://zhong-er.com/posts/drf%E8%AE%A4%E8%AF%81%E7%BB%84%E4%BB%B6%E6%9D%83%E9%99%90%E7%BB%84%E4%BB%B6/</link>
      <pubDate>Mon, 21 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf%E8%AE%A4%E8%AF%81%E7%BB%84%E4%BB%B6%E6%9D%83%E9%99%90%E7%BB%84%E4%BB%B6/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三大认证源码分析&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1）APIView的dispath(self, request, *args, **kwargs)
2）dispath方法内 self.initial(request, *args, **kwargs) 进入三大认证
	# 认证组件：校验用户 - 游客、合法用户、非法用户
    # 游客：代表校验通过，直接进入下一步校验（权限校验）
    # 合法用户：代表校验通过，将用户存储在request.user中，再进入下一步校验（权限校验）
    # 非法用户：代表校验失败，抛出异常，返回403权限异常结果
    self.perform_authentication(request)
    
    # 权限组件：校验用户权限 - 必须登录、所有用户、登录读写游客只读、自定义用户角色
    # 认证通过：可以进入下一步校验（频率认证）
    # 认证失败：抛出异常，返回403权限异常结果
    self.check_permissions(request)
    
    # 频率组件：限制视图接口被访问的频率次数 - 限制的条件(IP、id、唯一键)、频率周期时间(s、m、h)、频率的次数（3/s）
    # 没有达到限次：正常访问接口
    # 达到限次：限制时间内不能访问，限制时间达到后，可以重新访问
    self.check_throttles(request)
    
    
3) 认证组件
	Request类的 方法属性 user 的get方法 =&amp;gt; self._authenticate() 完成认证
	
	认证的细则：
	# 做认证
    def _authenticate(self):
        # 遍历拿到一个个认证器，进行认证
        # self.authenticators配置的一堆认证类产生的认证类对象组成的 list
        for authenticator in self.authenticators:
            try:
                # 认证器(对象)调用认证方法authenticate(认证类对象self, request请求对象)
                # 返回值：登陆的用户与认证的信息组成的 tuple
                # 该方法被try包裹，代表该方法会抛异常，抛异常就代表认证失败
                user_auth_tuple = authenticator.authenticate(self)
            except exceptions.APIException:
                self._not_authenticated()
                raise

            # 返回值的处理
            if user_auth_tuple is not None:
                self._authenticator = authenticator
                # 如何有返回值，就将 登陆用户 与 登陆认证 分别保存到 request.user、request.auth
                self.user, self.auth = user_auth_tuple
                return
        # 如果返回值user_auth_tuple为空，代表认证通过，但是没有 登陆用户 与 登陆认证信息，代表游客
        self._not_authenticated()

4) 权限组件
	self.check_permissions(request)
	认证细则：
    def check_permissions(self, request):
        # 遍历权限对象列表得到一个个权限对象(权限器)，进行权限认证
        for permission in self.get_permissions():
            # 权限类一定有一个has_permission权限方法，用来做权限认证的
            # 参数：权限对象self、请求对象request、视图类对象
            # 返回值：有权限返回True，无权限返回False
            if not permission.has_permission(request, self):
                self.permission_denied(
                    request, message=getattr(permission, &#39;message&#39;, None)
                )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;自定义认证类&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【DRF】视图家族</title>
      <link>https://zhong-er.com/posts/drf%E8%A7%86%E5%9B%BE%E5%AE%B6%E6%97%8F/</link>
      <pubDate>Mon, 21 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf%E8%A7%86%E5%9B%BE%E5%AE%B6%E6%97%8F/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;视图类传递参数给序列化类&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1）在视图类中实例化序列化对象时，可以设置context内容
2）在序列化类中的局部钩子、全局钩子、create、update方法中，都可以用self.context访问视图类传递过来的内容

需求：
1) 在视图类中，可以通过request得到登陆用户request.user
2) 在序列化类中，要完成数据库数据的校验与入库操作，可能会需要知道当前的登陆用户，但序列化类无法访问request
3) 在视图类中实例化序列化对象时，将request对象传递进去
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;视图层：views.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Book(APIView):
    def post(self, request, *args, **kwargs):
        book_ser = serializers.BookModelSerializer(data=request_data,context={&#39;request&#39;:request})
        book_ser.is_valid(raise_exception=True)
        book_result = book_ser.save()
        return Response({
            &#39;status&#39;: 0,
            &#39;msg&#39;: &#39;ok&#39;,
            &#39;results&#39;: serializers.BookModelSerializer(book_result).data
        })
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;序列化层：serializer.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class BookModelSerializer(ModelSerializer):
    class Meta:
        model = models.Book
        fields = (&#39;name&#39;, &#39;price&#39;)
    def validate_name(self, value):
        print(self.context.get(&#39;request&#39;).method)
        return value
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;二次封装Response类&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Response({
    &#39;status&#39;: 0,
    &#39;msg&#39;: &#39;ok&#39;,
    &#39;results&#39;: [],
    &#39;token&#39;: &#39;&#39;  # 有这样的额外的key-value数据结果
},status=http_status,headers=headers,exception=True|False)

APIResponse() =&amp;gt; Response({&#39;status&#39;: 0,&#39;msg&#39;: &#39;ok&#39;})


from rest_framework.response import Response

class APIResponse(Response):
    def __init__(self, data_status=0, data_msg=&#39;ok&#39;, results=None, http_status=None, headers=None, exception=False, **kwargs):
        # data的初始状态：状态码与状态信息
        data = {
            &#39;status&#39;: data_status,
            &#39;msg&#39;: data_msg,
        }
        # data的响应数据体
        # results可能是False、0等数据，这些数据某些情况下也会作为合法数据返回
        if results is not None:
            data[&#39;results&#39;] = results
        # data响应的其他内容
        # if kwargs is not None:
        #     for k, v in kwargs.items():
        #         setattr(data, k, v)
        data.update(kwargs)

        super().__init__(data=data, status=http_status, headers=headers, exception=exception)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;视图家族&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【DRF】接口/CBV生命周期</title>
      <link>https://zhong-er.com/posts/drf%E6%8E%A5%E5%8F%A3cbv%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/</link>
      <pubDate>Thu, 17 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf%E6%8E%A5%E5%8F%A3cbv%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DRF框架&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;全称：Django-rest framework&lt;/p&gt;
&lt;p&gt;知识点&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
1、接口：什么是接口、restful接口规范
2、CBV生命周期源码 - 基于restful规范下的CBV接口
3、请求组件、解析组件、响应组件
4、序列化组件(灵魂)
5、三大认证(重中之重)：认证、权限(权限六表)、频率
6、其他组件：过滤、筛选、排序、分页、路由
&amp;quot;&amp;quot;&amp;quot;

# 难点：源码分析
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;接口&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
接口：联系两个物质的媒介，完成信息交互
web程序中：联系前台页面与后台数据库的媒介
web接口组成：
	url：长得像放回数据的url链接
	请求参数：前台按照指定的key提供数据给后台
	响应数据：后台与数据库交互后将数据反馈给前台
&amp;quot;&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;restful接口规范&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接口规范：就是为了采用不同的后台语言，也能使用同样的接口获取到同样的数据&lt;/p&gt;
&lt;p&gt;如何写接口：接口规范是规范化书写接口，写接口要写url、响应数据&lt;/p&gt;
&lt;p&gt;注：如果将请求参数也纳入考量范围，那就是在写接口文档&lt;/p&gt;
&lt;p&gt;两大部分：&lt;/p&gt;
&lt;p&gt;url&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1) 用api关键字表示接口url
    api.baidu.com | www.baidu.com/api
	
2) 接口数据安全性决定优先选择https协议

3) 如果一个接口有多版本存在，需要在url中标识体现
    api.baidu.com/v1/... | api.baidu.com/v2/...
	
4) 接口操作的数据源称之为 资源，在url中一般采用资源复数形式，一个接口可以概括对该资源的多种操作方式
    api.baidu.com/books | api.baidu.com/books/(pk)
	
5) 请求方式有多种，用一个url处理如何保证不混乱 - 通过请求方式标识操作资源的方式
    /books		get			获取所有
    /books		post		增加一个(多个)
    /books/(pk)	delete		删除一个
    /books/(pk)	put			整体更新一个
    /books/(pk)	patch		局部更新一个

6) 资源往往涉及数据的各种操作方式 - 筛选、排序、限制
	api.baidu.com/books/?search=西&amp;amp;ordering=-price&amp;amp;limit=3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;响应数据&lt;/p&gt;</description>
    </item>
    <item>
      <title>【DRF】解析/异常/响应模块/序列化组件</title>
      <link>https://zhong-er.com/posts/drf%E8%A7%A3%E6%9E%90%E5%BC%82%E5%B8%B8%E5%93%8D%E5%BA%94%E6%A8%A1%E5%9D%97%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%84%E4%BB%B6/</link>
      <pubDate>Thu, 17 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf%E8%A7%A3%E6%9E%90%E5%BC%82%E5%B8%B8%E5%93%8D%E5%BA%94%E6%A8%A1%E5%9D%97%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%84%E4%BB%B6/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解析模块&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为什么要配置解析模块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
1）drf给我们通过了多种解析数据包方式的解析类
2）我们可以通过配置来控制前台提交的哪些格式的数据后台在解析，哪些数据不解析
3）全局配置就是针对每一个视图类，局部配置就是针对指定的视图来，让它们可以按照配置规则选择性解析数据
&amp;quot;&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;源码入口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# APIView类的dispatch方法中
request = self.initialize_request(request, *args, **kwargs)  # 点进去

# 获取解析类
parsers=self.get_parsers(),  # 点进去

# 去类属性(局部配置) 或 配置文件(全局配置) 拿 parser_classes
return [parser() for parser in self.parser_classes]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;全局配置：项目settings.py文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;REST_FRAMEWORK = {
    # 全局解析类配置
    &#39;DEFAULT_PARSER_CLASSES&#39;: [
        &#39;rest_framework.parsers.JSONParser&#39;,  # json数据包
        &#39;rest_framework.parsers.FormParser&#39;,  # urlencoding数据包
        &#39;rest_framework.parsers.MultiPartParser&#39;  # form-date数据包
    ],
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;局部配置：应用views.p的具体视图类&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from rest_framework.parsers import JSONParser
class Book(APIView):
    # 局部解析类配置，只要json类型的数据包才能被解析
    parser_classes = [JSONParser]
    pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;异常模块&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【DRF】序列化/反序列/序列化与反序列整合</title>
      <link>https://zhong-er.com/posts/drf%E5%BA%8F%E5%88%97%E5%8C%96%E5%8F%8D%E5%BA%8F%E5%88%97%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8E%E5%8F%8D%E5%BA%8F%E5%88%97%E6%95%B4%E5%90%88/</link>
      <pubDate>Thu, 17 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf%E5%BA%8F%E5%88%97%E5%8C%96%E5%8F%8D%E5%BA%8F%E5%88%97%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8E%E5%8F%8D%E5%BA%8F%E5%88%97%E6%95%B4%E5%90%88/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;环境配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;配置：settings.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INSTALLED_APPS = [
    # ...
    &#39;rest_framework&#39;,
]

DATABASES = {
    &#39;default&#39;: {
        &#39;ENGINE&#39;: &#39;django.db.backends.mysql&#39;,
        &#39;NAME&#39;: &#39;dg_proj&#39;,
        &#39;USER&#39;: &#39;root&#39;,
        &#39;PASSWORD&#39;: &#39;123&#39;,
    }
}
&amp;quot;&amp;quot;&amp;quot;
任何__init__文件
import pymysql
pymysql.install_as_MySQLdb()
&amp;quot;&amp;quot;&amp;quot;

LANGUAGE_CODE = &#39;zh-hans&#39;
TIME_ZONE = &#39;Asia/Shanghai&#39;
USE_I18N = True
USE_L10N = True
USE_TZ = False

MEDIA_URL = &#39;/media/&#39;
MEDIA_ROOT = os.path.join(BASE_DIR, &#39;media&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;路由&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 主
from django.conf.urls import url, include
from django.contrib import admin
from django.views.static import serve
from django.conf import settings
urlpatterns = [
    url(r&#39;^admin/&#39;, admin.site.urls),
    url(r&#39;^api/&#39;, include(&#39;api.urls&#39;)),
    url(r&#39;^media/(?P&amp;lt;path&amp;gt;.*)&#39;, serve, {&#39;document_root&#39;: settings.MEDIA_ROOT}),
]

# 子
from django.conf.urls import url
from . import views
urlpatterns = [
    
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;多表设计&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【vue】项目配置</title>
      <link>https://zhong-er.com/posts/vue%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE/</link>
      <pubDate>Thu, 10 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/vue%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;img alt=&#34;vue.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910086430_9431_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vue项目环境搭建&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;node ~~ python: node是用c++编写用来运行js代码的&lt;/p&gt;
&lt;p&gt;npm(cnpm) ~~ pip: npm是一个终端应用商城，可以换国内源cnpm&lt;/p&gt;
&lt;p&gt;vue ~~ django: vue是用来搭建vue前端项目的&lt;/p&gt;
&lt;p&gt;1）安装node&lt;/p&gt;
&lt;p&gt;官网下载安装包，傻瓜式安装：https://nodejs.org/zh-cn/&lt;/p&gt;
&lt;p&gt;2）换源安装cnpm&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;: npm install -g cnpm &amp;ndash; registry=https://registry.npm.taobao.org&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;3）安装vue项目脚手架&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;: cnpm install -g @vue/cli&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注：2或3终端安装失败时，可以清空 npm缓存 再重复执行失败的步骤&lt;/p&gt;
&lt;p&gt;npm cache clean &amp;ndash;force&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vue项目创建&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入存放项目的目录&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;: cd ***&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;创建项目&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;: vue create 项目名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;项目初始化&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;vue项目创建.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910104859_8974_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;pycharm配置并启动vue项目&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;用pycharm打开vue项目&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加配置npm启动&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;配置vue启动.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910101130_940_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vue项目目录结构分析&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;├── v-proj
|	├── node_modules  	// 当前项目所有依赖，一般不可以移植给其他电脑环境
|	├── public			
|	|	├── favicon.ico	// 标签图标
|	|	└── index.html	// 当前项目唯一的页面
|	├── src
|	|	├── assets		// 静态资源img、css、js
|	|	├── components	// 小组件
|	|	├── views		// 页面组件
|	|	├── App.vue		// 根组件
|	|	├── main.js		// 全局脚本文件（项目的入口）
|	|	├── router.js	// 路由脚本文件（配置路由 url链接 与 页面组件的映射关系）
|	|	└── store.js	// 仓库脚本文件（vuex插件的配置文件，数据仓库）
|	├── README.md
└	└── **配置文件
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;vue组件(.vue文件)&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【vue】条件循环/计算属性/属性监听</title>
      <link>https://zhong-er.com/posts/vue%E6%9D%A1%E4%BB%B6%E5%BE%AA%E7%8E%AF%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7%E5%B1%9E%E6%80%A7%E7%9B%91%E5%90%AC/</link>
      <pubDate>Wed, 09 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/vue%E6%9D%A1%E4%BB%B6%E5%BE%AA%E7%8E%AF%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7%E5%B1%9E%E6%80%A7%E7%9B%91%E5%90%AC/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;&lt;img alt=&#34;vue.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910086430_9431_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;条件指令&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）两种都可以控制标签的显隐，绑定的值是布尔类型值，当都隐藏标签时&lt;/p&gt;
&lt;p&gt;v-if是不渲染标签&lt;/p&gt;
&lt;p&gt;v-show以 display:none 方式渲染&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&amp;quot;app&amp;quot;&amp;gt;
    &amp;lt;p v-if=&amp;quot;isShow&amp;quot;&amp;gt;if条件指令&amp;lt;/p&amp;gt;
    &amp;lt;p v-show=&amp;quot;isShow&amp;quot;&amp;gt;show条件指令&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script src=&amp;quot;js/vue.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
    new Vue({
        el: &#39;#app&#39;,
        data: {
            isShow: false,
        }
    })
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2）v-if/v-else-if/v-else&lt;/p&gt;
&lt;p&gt;一组分支上成立，分支会屏蔽下方所有分支，else分支没有条件，在所有分支不成立后才显示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;style&amp;gt;
    .box {
        width: 400px;
        height: 300px;
    }
    .r { background-color: red; }
    .y { background-color: yellow }
    .b { background-color: blue; }
    .active {
        background-color: pink;
    }
&amp;lt;/style&amp;gt;
&amp;lt;div id=&amp;quot;app&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;em&amp;quot;&amp;gt;
        &amp;lt;p&amp;gt;
            &amp;lt;button @click=&amp;quot;changeBox(&#39;rBox&#39;)&amp;quot; :class=&amp;quot;{active: showName == &#39;rBox&#39;}&amp;quot;&amp;gt;红&amp;lt;/button&amp;gt;
            &amp;lt;button @click=&amp;quot;changeBox(&#39;yBox&#39;)&amp;quot; :class=&amp;quot;{active: showName == &#39;yBox&#39;}&amp;quot;&amp;gt;黄&amp;lt;/button&amp;gt;
            &amp;lt;button @click=&amp;quot;changeBox(&#39;bBox&#39;)&amp;quot; :class=&amp;quot;{active: showName == &#39;bBox&#39;}&amp;quot;&amp;gt;蓝&amp;lt;/button&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;
            &amp;lt;button @click=&amp;quot;changeBox(&#39;rBox&#39;)&amp;quot; :class=&amp;quot;showName == &#39;rBox&#39; ? &#39;active&#39; : &#39;&#39;&amp;quot;&amp;gt;红&amp;lt;/button&amp;gt;
            &amp;lt;button @click=&amp;quot;changeBox(&#39;yBox&#39;)&amp;quot; :class=&amp;quot;showName == &#39;yBox&#39; ? &#39;active&#39; : &#39;&#39;&amp;quot;&amp;gt;黄&amp;lt;/button&amp;gt;
            &amp;lt;button @click=&amp;quot;changeBox(&#39;bBox&#39;)&amp;quot; :class=&amp;quot;showName == &#39;bBox&#39; ? &#39;active&#39; : &#39;&#39;&amp;quot;&amp;gt;蓝&amp;lt;/button&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;div class=&amp;quot;box r&amp;quot; v-if=&amp;quot;showName == &#39;rBox&#39;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;box y&amp;quot; v-else-if=&amp;quot;showName == &#39;yBox&#39;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;box b&amp;quot; v-else&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script src=&amp;quot;js/vue.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
    new Vue({
        el: &#39;#app&#39;,
        data: {
            showName: &#39;rBox&#39;
        },
        methods: {
            changeBox(name) {
                this.showName = name;
            }
        }
    })
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&#34;001.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910098559_2432.png-zhonger.com&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【vue】组件</title>
      <link>https://zhong-er.com/posts/vue%E7%BB%84%E4%BB%B6/</link>
      <pubDate>Wed, 09 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/vue%E7%BB%84%E4%BB%B6/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img alt=&#34;vue.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910086430_9431_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;********&lt;strong&gt;组件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）组件：一个包含html、css、js独立的集合体，这样的集合体可以完成页面结构的代码复用&lt;/p&gt;
&lt;p&gt;2）组件分为根组件、全局组件与局部组件&lt;/p&gt;
&lt;p&gt;根组件：所有被new Vue()产生的组件，在项目开发阶段，一个项目只会出现一个根组件&lt;/p&gt;
&lt;p&gt;全局组件：不用注册，就可以成为任何一个组件的字组件&lt;/p&gt;
&lt;p&gt;局部组件：必须注册，才可以成为注册该局部组件的子组件&lt;/p&gt;
&lt;p&gt;3）每一个组件都有自身的html结构，css样式，js逻辑&lt;/p&gt;
&lt;p&gt;每一个组件其实都有自己的template，就是用来标识自己html结构的&lt;/p&gt;
&lt;p&gt;template模板中有且只有一个根标签&lt;/p&gt;
&lt;p&gt;根组件一般不提供template，就由挂载点的真实DOM提供html结构&lt;/p&gt;
&lt;p&gt;4）除根组件的其他组件，数据要有局部作用域，保证组件复用是，各组件间数据的独立性&lt;/p&gt;
&lt;p&gt;5）在多组件共处时，在哪个组件模板中出现的变量，由当前组件提供&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;局部组件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）创建局部组件&lt;/p&gt;
&lt;p&gt;2）在父组件中注册该局部组件&lt;/p&gt;
&lt;p&gt;3）在父组件的template模板中渲染该局部组件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;style&amp;gt;
    .box {
        box-shadow: 0 3px 5px 0 #666;
        width: 240px;
        height: 300px;
        text-align: center;
        padding: 20px 0;
        float: left;
        margin: 5px;
    }
    .box img {
        width: 200px;
    }
&amp;lt;/style&amp;gt;
&amp;lt;div id=&amp;quot;app&amp;quot;&amp;gt;
    &amp;lt;!--&amp;lt;mcc&amp;gt;&amp;lt;/mcc&amp;gt;--&amp;gt;
    &amp;lt;local-tag&amp;gt;&amp;lt;/local-tag&amp;gt;
    &amp;lt;local-tag&amp;gt;&amp;lt;/local-tag&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script src=&amp;quot;js/vue.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
    let localTag = {
        template: `
        &amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;
            &amp;lt;img src=&amp;quot;img/666.jpg&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;
            &amp;lt;h3&amp;gt;凤哥&amp;lt;/h3&amp;gt;
            &amp;lt;p&amp;gt;马叉虫❤马叉虫&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
        `
    };

    new Vue({
        el: &#39;#app&#39;,
        components: {
            // mcc: localTag,
            // localTag,
            &#39;local-tag&#39;: localTag,
        }
    })
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;全局组件&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【vue】模板语法</title>
      <link>https://zhong-er.com/posts/vue%E6%A8%A1%E6%9D%BF%E8%AF%AD%E6%B3%95/</link>
      <pubDate>Tue, 08 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/vue%E6%A8%A1%E6%9D%BF%E8%AF%AD%E6%B3%95/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;img alt=&#34;vue.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910086430_9431_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;vue导读&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）vue框架是前台框架，常见的前台框架有：Angular、React、Vue&lt;/p&gt;
&lt;p&gt;2）vue是结合其他框架的优点：轻量级、中文API、数据驱动、双向绑定、MVVM设计模式、支持组件化开发、单页面应用&lt;/p&gt;
&lt;p&gt;MVVM设计模式：MV数据到视图一层数据处理，向后台请求数据渲染页面；VM视图再到数据一层数据处理，前台获取的用户数据到后台。&lt;/p&gt;
&lt;p&gt;3）vue环境，本地导入与cdn导入&lt;/p&gt;
&lt;p&gt;4）vue是js渐进式框架&lt;/p&gt;
&lt;p&gt;根据开发需求，可以决定vue框架控制项目的具体方位：可以为一个标签，也可以为一个页面，甚至可以为整个项目&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实例成员-挂载点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）vue通过挂载点与html页面结构建立关联&lt;/p&gt;
&lt;p&gt;2）html与body不能作为挂载点&lt;/p&gt;
&lt;p&gt;3）一个vue对象挂载点只会索引一个匹配结果，所以挂载点一般用id标识&lt;/p&gt;
&lt;p&gt;el：实例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&amp;quot;wrap&amp;quot;&amp;gt;
    {{ }}
    &amp;lt;hr&amp;gt;
    &amp;lt;div class=&amp;quot;main&amp;quot;&amp;gt;
        {{ }}
    &amp;lt;/div&amp;gt;
    &amp;lt;hr&amp;gt;
    &amp;lt;div class=&amp;quot;main&amp;quot;&amp;gt;
        {{ }}
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script src=&amp;quot;js/vue.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
    new Vue({
        el: &#39;#wrap&#39;  // el表示挂载点
    })
&amp;lt;/script&amp;gt;
//实例与页面挂载点一一对应
//一个页面中可以出现多个实例对应多个挂载点
//实例只操作挂载点内部内容
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;js对象(字典)补充&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let b = 20;
let dic = {
    a: 10,  // 字典本身就是对象，key都是字符串形式可以省略引号
    b  // 值为变量时，且与key同名，可以简写
};
console.log(dic)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;实例成员-数据&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）用实例成员data为vue环境提供数据，数据采用字典{}形式&lt;/p&gt;
&lt;p&gt;2）在插值表达式{{}}中，直接书写数据的key来访问数据&lt;/p&gt;
&lt;p&gt;{{}}是插值表达式，中间出现的info是vue变量&lt;/p&gt;
&lt;p&gt;插值表达式内可以直接做简单的数学运算&lt;/p&gt;
&lt;p&gt;复杂的运算就需要借助过滤器&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Django】中间件/Auth模块</title>
      <link>https://zhong-er.com/posts/django%E4%B8%AD%E9%97%B4%E4%BB%B6auth%E6%A8%A1%E5%9D%97/</link>
      <pubDate>Wed, 25 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/django%E4%B8%AD%E9%97%B4%E4%BB%B6auth%E6%A8%A1%E5%9D%97/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Django中间件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Django中间件类似于Django的保安。请求的时候需要先经过中间件才能到达Django后端(urls,views,templates,models),响应走的时候也需要经过中间件才能到达web服务网关接口。&lt;/p&gt;
&lt;p&gt;Django默认的七个中间件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MIDDLEWARE = [
    &#39;django.middleware.security.SecurityMiddleware&#39;,
    &#39;django.contrib.sessions.middleware.SessionMiddleware&#39;,
    &#39;django.middleware.common.CommonMiddleware&#39;,
    &#39;django.middleware.csrf.CsrfViewMiddleware&#39;,
    &#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;,
    &#39;django.contrib.messages.middleware.MessageMiddleware&#39;,
    &#39;django.middleware.clickjacking.XFrameOptionsMiddleware&#39;,
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们点进去几个组件查看源码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class SecurityMiddleware(MiddlewareMixin):
    def __init__(self, get_response=None):
        pass

    def process_request(self, request):
        path = request.path.lstrip(&amp;quot;/&amp;quot;)
        if (self.redirect and not request.is_secure() and not any(pattern.search(path) for pattern in self.redirect_exempt)):
            host = self.redirect_host or request.get_host()
            return HttpResponsePermanentRedirect(&amp;quot;https://%s%s&amp;quot; % (host, request.get_full_path()))

    def process_response(self, request, response):
        ...
        return response


class CsrfViewMiddleware(MiddlewareMixin):
    def process_request(self, request):
        pass

    def process_view(self, request, callback, callback_args, callback_kwargs):
        ...
        return self._accept(request)

    def process_response(self, request, response):
        ...
        return response

class AuthenticationMiddleware(MiddlewareMixin):    
    def process_request(self, request):
        assert hasattr(request, &#39;session&#39;), (
            &amp;quot;The Django authentication middleware requires session middleware &amp;quot;
            &amp;quot;to be installed. Edit your MIDDLEWARE%s setting to insert &amp;quot;
            &amp;quot;&#39;django.contrib.sessions.middleware.SessionMiddleware&#39; before &amp;quot;
            &amp;quot;&#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;.&amp;quot;
        ) % (&amp;quot;_CLASSES&amp;quot; if settings.MIDDLEWARE is None else &amp;quot;&amp;quot;)
        request.user = SimpleLazyObject(lambda: get_user(request))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不难发现一些规律：&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Django】form组件/cookie与session</title>
      <link>https://zhong-er.com/posts/djangoform%E7%BB%84%E4%BB%B6cookie%E4%B8%8Esession/</link>
      <pubDate>Tue, 24 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/djangoform%E7%BB%84%E4%BB%B6cookie%E4%B8%8Esession/</guid>
      <description>&lt;p&gt;**多对多三种创建方式&lt;br&gt;
**&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.全自动&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;优势：不需要你手动创建第三张表&lt;/p&gt;
&lt;p&gt;不足：由于第三张表不是你手动创建的，也就意味着第三张表字段时固定的无法做扩展&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    authors = models.ManyToManyField(to=&#39;Author&#39;)

 
class Author(models.Model):
    name = models.CharField(max_length=32)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2.纯手动&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;自己创建第三张表&lt;/p&gt;
&lt;p&gt;优势：第三张表可以任意的扩展字段&lt;/p&gt;
&lt;p&gt;不足：orm查询不方便&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)

class Author(models.Model):
    name = models.CharField(max_length=32)

class Book2Author(models.Model):
    book = models.ForeignKey(to=&#39;Book&#39;)
    author = models.ForeignKey(to=&#39;Author&#39;)
    create_time = models.DateField(auto_now_add=True)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3.半自动(推荐使用)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;优势：结合了全自动和纯手动的两个优点&lt;/p&gt;
&lt;p&gt;不足：不再支持多对多字段的add(),set(),remove(),clear()方法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    authors = models.ManyToManyField(to=&#39;Author&#39;,through=&#39;Book2Author&#39;,through_fields=(&#39;book&#39;,&#39;author&#39;))
    # through 告诉django orm 书籍表和作者表的多对多关系是通过Book2Author来记录的
    # through_fields 告诉django orm记录关系时用过Book2Author表中的book字段和author字段来记录的

class Author(models.Model):
    name = models.CharField(max_length=32)
    # books = models.ManyToManyField(to=&#39;Book&#39;, through=&#39;Book2Author&#39;, through_fields=(&#39;author&#39;, &#39;book&#39;))

class Book2Author(models.Model):
    book = models.ForeignKey(to=&#39;Book&#39;)
    author = models.ForeignKey(to=&#39;Author&#39;)
    create_time = models.DateField(auto_now_add=True)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;forms组件&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Django】Ajax/序列化组件/sweetalert/分页器</title>
      <link>https://zhong-er.com/posts/djangoajax%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%84%E4%BB%B6sweetalert%E5%88%86%E9%A1%B5%E5%99%A8/</link>
      <pubDate>Mon, 23 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/djangoajax%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%84%E4%BB%B6sweetalert%E5%88%86%E9%A1%B5%E5%99%A8/</guid>
      <description>&lt;p&gt;&lt;strong&gt;choices参数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们存用户信息性别时，写入数据库时，写入的是数字1或2，&lt;/p&gt;
&lt;p&gt;但从数据库读取时，我们又不能直接将数字展示给用户，&lt;/p&gt;
&lt;p&gt;我们需要将1和2对应的男女展示给用户&lt;/p&gt;
&lt;p&gt;choices的定义&lt;/p&gt;
&lt;p&gt;choices参数是在models中定义&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from django.db import models
class User(models.Model):
    username = models.CharField(max_length=32)
    age = models.IntegerField()    choices = (
        (1,&#39;男&#39;),(2,&#39;女&#39;),(3,&#39;其他&#39;)
    )
    gender = models.IntegerField(choices=choices)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;choices怎么用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(user_obj.get_gender_display())
# 只要是choices字段 在获取数字对应的值 
# 固定语法：get_choices字段名_display()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;choices容错&lt;/p&gt;
&lt;p&gt;比如数据库中某个用户的gender存的是4， 但是choices中没有4对应的值那么不会报错，&lt;/p&gt;
&lt;p&gt;而是展示的是数据库中存的这个值4&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user_obj = models.User.objects.filter(name=&#39;jason&#39;).first()
print(user_obj.get_gender_display())    # 男user_obj = models.User.objects.filter(name=&#39;tank&#39;).first()
print(user_obj.get_gender_display())    # 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;MTV和MVC模型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;django框架 自称为是MTV框架&lt;/p&gt;
&lt;p&gt;M:models&lt;/p&gt;
&lt;p&gt;T:templates&lt;/p&gt;
&lt;p&gt;V:views&lt;/p&gt;
&lt;p&gt;MVC&lt;/p&gt;
&lt;p&gt;M:models&lt;/p&gt;
&lt;p&gt;V:views&lt;/p&gt;
&lt;p&gt;C:controller控制器(urls)&lt;/p&gt;
&lt;p&gt;本质:MTV其实也是MVC&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ajax&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;特点： 异步提交 局部刷新（比如注册页面，实时检测用户名是否已存在）&lt;/p&gt;
&lt;p&gt;目前发送请求的方式 GET POST&lt;/p&gt;
&lt;p&gt;a标签href属性 GET请求&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Django】ORM中常用字段和参数</title>
      <link>https://zhong-er.com/posts/djangoorm%E4%B8%AD%E5%B8%B8%E7%94%A8%E5%AD%97%E6%AE%B5%E5%92%8C%E5%8F%82%E6%95%B0/</link>
      <pubDate>Fri, 20 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/djangoorm%E4%B8%AD%E5%B8%B8%E7%94%A8%E5%AD%97%E6%AE%B5%E5%92%8C%E5%8F%82%E6%95%B0/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201909169981_9838.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;常用字段&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常见字段&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AutoField&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;int自增列，必须填入参数primary_key=True。当model中如果没有自增列，则会自动创建一个列名为id的列。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IntegerField&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个整数类型，范围在-214748368to214748367。(一般不用它来存手机号，位数也不够，直接用字符串存)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CharField&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;字符类型，必须提供max_length参数，max_length表示字符长度。&lt;/p&gt;
&lt;p&gt;这里需要知道的是Django中的CharField对应的MySQL数据库中的varchar类型，没有设置对应char类型的字段，但是Django允许我们自定义新的字段，下面我们来自定义对应于数据库的char类型&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201909207986_7402.png-zhonger.com&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EmailField()&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;varchar(254)内部是个varchar字段**&lt;br&gt;
**&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BooleanField(Field)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;is_delete = BooleanField()&lt;/p&gt;
&lt;p&gt;给该字段传值的时候 你只需要传布尔值即可&lt;/p&gt;
&lt;p&gt;但是对应到数据库 它存的是0和1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TextField(Field)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- 文本类型&lt;/p&gt;
&lt;p&gt;用来存大段文本&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FileField(Field)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- 字符串，路径保存在数据库，文件上传到指定目录&lt;/p&gt;
&lt;p&gt;- 参数：&lt;/p&gt;
&lt;p&gt;upload_to = &amp;quot;&amp;quot; 用户上传的文件会自动放到等号后面指定的文件路径中&lt;/p&gt;
&lt;p&gt;storage = None 存储组件，默django.core.files.storage.FileSystemStorage&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自定义char字段&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from django.db import models

# Create your models here.
#Django中没有对应的char类型字段，但是我们可以自己创建
class FixCharField(models.Field):
    &#39;&#39;&#39;
    自定义的char类型的字段类
    &#39;&#39;&#39;
    def __init__(self,max_length,*args,**kwargs):
        self.max_length=max_length
        super().__init__(max_length=max_length,*args,**kwargs)

    def db_type(self, connection):
        &#39;&#39;&#39;
        限定生成的数据库表字段类型char，长度为max_length指定的值
        :param connection:
        :return:
        &#39;&#39;&#39;
        return &#39;char(%s)&#39;%self.max_length
#应用上面自定义的char类型
class Class(models.Model):
    id=models.AutoField(primary_key=True)
    title=models.CharField(max_length=32)
    class_name=FixCharField(max_length=16)
    gender_choice=((1,&#39;男&#39;),(2,&#39;女&#39;),(3,&#39;保密&#39;))
    gender=models.SmallIntegerField(choices=gender_choice,default=3)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;DateField&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Django】模型层</title>
      <link>https://zhong-er.com/posts/django%E6%A8%A1%E5%9E%8B%E5%B1%82/</link>
      <pubDate>Thu, 19 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/django%E6%A8%A1%E5%9E%8B%E5%B1%82/</guid>
      <description>&lt;p&gt;&lt;strong&gt;ORM单表操作&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;单表操作演示表&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Book(models.Model):
      name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_place=2)
    publish = models.CharField(max_length=32)
    author = models.CharField(max_length=32)
    create_time = models.DateField(null=True)
    # 配置auto_now_add=True，创建数据记录的时候会把当前时间添加到数据库。
    # 配置上auto_now=True，每次更新数据记录的时候会更新该字段。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;新增数据&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 第一种：有返回值，并且就是当前被创建的数据对象
modles.Book.objects.create(name=&#39;&#39;,price=&#39;&#39;,publish=&#39;&#39;,author=&#39;&#39;,create_time=&#39;2019-5-1&#39;)
# 第二种：先实例化产生对象，然后调用save方法保存
book_obj = models.Book(name=&#39;&#39;,price=&#39;&#39;,publish=&#39;&#39;,author=&#39;&#39;,create_time=&#39;2019-5-1&#39;)
book_obj.save()
# 2.验证时间格式字段即可以传字符串也可以传时间对象
import datetime
ctime = datetime.datetime.now()
book = models.Book.objects.create(name=&#39;&#39;,price=&#39;&#39;,author=&#39;&#39;,create_time=ctime)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除数据&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;删除数据&amp;quot;&amp;quot;&amp;quot;
# 1.删除书名为xxx的这本书  queryset方法
res = models.Book.objects.filter(name=&#39;&#39;).delete()
print(res)
# 2.删除书名为xxx的这本书  queryset方法
res = models.Book.objects.filter(name=&#39;&#39;).first()
res.delete()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;修改数据&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1.queryset修改
models.Book.objects.filter(name=&#39;&#39;).update(price=&#39;&#39;)
# 2.对象修改
book = models.Book.objects.filter(name=&#39;&#39;).first()
book.price = 66.66
book.save()  # 对象只有保存方法 这样也能实现修改需求
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;查询数据的13个方法&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Django】模板层</title>
      <link>https://zhong-er.com/posts/django%E6%A8%A1%E6%9D%BF%E5%B1%82/</link>
      <pubDate>Wed, 18 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/django%E6%A8%A1%E6%9D%BF%E5%B1%82/</guid>
      <description>&lt;p&gt;&lt;strong&gt;模版语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;两大类&lt;/p&gt;
&lt;p&gt;{{}} 变量相关&lt;/p&gt;
&lt;p&gt;{%%} 逻辑相关&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;给模版传值&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;python所有的数据类型都可以被传递到前端页面&lt;/p&gt;
&lt;p&gt;注意在传递函数的时候，会自动加括号调用，前端展示的是函数调用的之后的返回值(ps:前端在调用函数的时候，是不支持给函数传递额外参数的)&lt;/p&gt;
&lt;p&gt;如果你想在前端获取后端传递的某个容器类型中的具体元素&lt;/p&gt;
&lt;p&gt;那么你可以通过句点符来获取具体的元素&lt;/p&gt;
&lt;p&gt;.索引&lt;/p&gt;
&lt;p&gt;.键&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;变量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Django的模板语言中按此语法使用：{{ 变量名 }}。&lt;/p&gt;
&lt;p&gt;当模版引擎遇到一个变量，它将计算这个变量，然后用结果替换掉它本身。 变量的命名包括任何字母数字以及下划线 (&amp;quot;_&amp;quot;)的组合。 变量名称中不能有空格或标点符号。&lt;/p&gt;
&lt;p&gt;点（.）在模板语言中有特殊的含义。当模版系统遇到点(&amp;quot;.&amp;quot;)，它将以这样的顺序查询：&lt;/p&gt;
&lt;p&gt;字典查询（Dictionary lookup）&lt;br&gt;
属性或方法查询（Attribute or method lookup）&lt;br&gt;
数字索引查询（Numeric index lookup）&lt;/p&gt;
&lt;p&gt;注意事项：&lt;/p&gt;
&lt;p&gt;如果计算结果的值是可调用的，它将被无参数的调用。 调用的结果将成为模版的值。&lt;/p&gt;
&lt;p&gt;如果使用的变量不存在， 模版系统将插入 string_if_invalid 选项的值， 它被默认设置为&amp;rsquo;&amp;rsquo; (空字符串) 。&lt;/p&gt;
&lt;p&gt;几个例子：&lt;/p&gt;
&lt;p&gt;view中代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def template_test(request):
    l = [11, 22, 33]
    d = {&amp;quot;name&amp;quot;: &amp;quot;alex&amp;quot;}

    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def dream(self):
            return &amp;quot;{} is dream...&amp;quot;.format(self.name)

    Alex = Person(name=&amp;quot;Alex&amp;quot;, age=34)
    Egon = Person(name=&amp;quot;Egon&amp;quot;, age=9000)
    Eva_J = Person(name=&amp;quot;Eva_J&amp;quot;, age=18)

    person_list = [Alex, Egon, Eva_J]
    return render(request, &amp;quot;template_test.html&amp;quot;, {&amp;quot;l&amp;quot;: l, &amp;quot;d&amp;quot;: d, &amp;quot;person_list&amp;quot;: person_list})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模板中支持的写法：&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Django】路由层、视图层</title>
      <link>https://zhong-er.com/posts/django%E8%B7%AF%E7%94%B1%E5%B1%82%E8%A7%86%E5%9B%BE%E5%B1%82/</link>
      <pubDate>Tue, 17 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/django%E8%B7%AF%E7%94%B1%E5%B1%82%E8%A7%86%E5%9B%BE%E5%B1%82/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201909169981_9838.jpg&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.Django orm中表与表之间建关系&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据库表与表之间建关系&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;图书管理系统为例，书籍表，作者表，出版社表，作者详情表&lt;/p&gt;
&lt;p&gt;书籍和出版社是一对多 外键字段建在书籍表中&lt;/p&gt;
&lt;p&gt;书籍和作者是多对多 需要第三个表记录多对多关系&lt;/p&gt;
&lt;p&gt;作者和作者详情是一对一 记录在最常用的那张表&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django orm中&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一对多 ForeignKey(to=&amp;lsquo;Publish&amp;rsquo;)&lt;/p&gt;
&lt;p&gt;一对一 OneToOneField(to=&amp;lsquo;AuthorDetail&amp;rsquo;)&lt;/p&gt;
&lt;p&gt;多对多 ManyToManyField(to=&amp;lsquo;Author&amp;rsquo;)&lt;/p&gt;
&lt;p&gt;注意：前面两个关键字会自动在字段后面加id&lt;/p&gt;
&lt;p&gt;最后一个关键字 并不会产生实际字段 只是告诉django orm自动创建第三张表&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.路由层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.1 URL配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基本格式【1.0版本】&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图函数，参数，别名),
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;基本格式【2.0版本】&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from django.urls import path

urlpatterns = [
    path(&#39;articles/2003/&#39;, views.special_case_2003),
    path(&#39;articles/&amp;lt;int:year&amp;gt;/&#39;, views.year_archive),
    path(&#39;articles/&amp;lt;int:year&amp;gt;/&amp;lt;int:month&amp;gt;/&#39;, views.month_archive),
    path(&#39;articles/&amp;lt;int:year&amp;gt;/&amp;lt;int:month&amp;gt;/&amp;lt;slug:slug&amp;gt;/&#39;, views.article_detail),
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.0版本已经不能使用正则表达式，只能精准匹配&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.0版本参数说明&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正则表达式：一个正则表达式字符串&lt;/p&gt;
&lt;p&gt;views视图函数：一个可调用对象，通常为一个视图函数或一个指定视图函数路径的字符串&lt;/p&gt;
&lt;p&gt;参数：可选的要传递给视图函数的默认参数（字典形式）&lt;/p&gt;
&lt;p&gt;别名：一个可选的name参数&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django版本区别&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;django1.X跟django2.X版本区别&lt;/p&gt;
&lt;p&gt;1.路由层1.X用的是url，而2.X用的是path&lt;/p&gt;
&lt;p&gt;2.路由层2.X中的path第一个参数不再是正则表达式,而是写什么就匹配什么 是精准匹配,&lt;/p&gt;
&lt;p&gt;3.当你使用2.X不习惯的时候,2.X还有一个叫re_path，2.x中的re_path就是你1.X的url&lt;/p&gt;
&lt;p&gt;4.虽然2.X中path不支持正则表达式 但是它提供了五种默认的转换器&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Django】总览</title>
      <link>https://zhong-er.com/posts/django%E6%80%BB%E8%A7%88/</link>
      <pubDate>Mon, 16 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/django%E6%80%BB%E8%A7%88/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Django简易版&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. 纯手撸一个简易版的web框架&lt;/p&gt;
&lt;p&gt;1.1 手动处理socket请求&lt;/p&gt;
&lt;p&gt;1.2 手动处理http请求&lt;/p&gt;
&lt;p&gt;1.3 根据用户访问url的不同，响应不同的结果&lt;/p&gt;
&lt;p&gt;2. wsgireg模块(web服务端网关接口)&lt;/p&gt;
&lt;p&gt;2.1 封装socket代码&lt;/p&gt;
&lt;p&gt;2.2 拆分请求发来时的http格式的数据为一个大字典&lt;/p&gt;
&lt;p&gt;2.3 打包数据为响应发回时的http格式的数据&lt;/p&gt;
&lt;p&gt;2.4 启动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server = make_server(&#39;127.0.0.1&#39;,8080,run)  # 实时监测，一旦有客户端接入，自动加括号调用run方法
server.server_forever()  # 启动服务端
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3. 如何给html页面传递数据&lt;/p&gt;
&lt;p&gt;3.1 字符串替换&lt;/p&gt;
&lt;p&gt;3.2 jinja2模块&lt;/p&gt;
&lt;p&gt;1. 模版的渲染(传数据)&lt;/p&gt;
&lt;p&gt;2. 模版语法(极其贴近python语法)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from  jinja2 import Template
# 将文本格式的html数据传入Template
render()

# 模板语法
{{ data }}
{% for user in user_list %}
{% endfor %}

# 模板语法 只有两种情况 
{{}}:变量相关
{%%}:逻辑相关
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4.对不同的功能拆封成不同的文件&lt;/p&gt;
&lt;p&gt;templates文件夹(专门放html文件)&lt;/p&gt;
&lt;p&gt;urls.py&lt;/p&gt;
&lt;p&gt;views.py&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Django总览版&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Django】框架简介</title>
      <link>https://zhong-er.com/posts/django%E6%A1%86%E6%9E%B6%E7%AE%80%E4%BB%8B/</link>
      <pubDate>Thu, 12 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/django%E6%A1%86%E6%9E%B6%E7%AE%80%E4%BB%8B/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201909169981_9838.jpg&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Web框架本质&lt;/p&gt;
&lt;p&gt;我们可以这样理解：所有的Web应用本质上就是一个socket服务端，而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。&lt;/p&gt;
&lt;p&gt;半成品自定义web框架&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import socket

sk = socket.socket()
sk.bind((&amp;quot;127.0.0.1&amp;quot;, 80))
sk.listen()


while True:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    conn.send(b&amp;quot;OK&amp;quot;)
    conn.close()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以说Web服务本质上都是在这十几行代码基础上扩展出来的。这段代码就是它们的祖宗。&lt;/p&gt;
&lt;p&gt;用户的浏览器一输入网址，会给服务端发送数据，那浏览器会发送什么数据？怎么发？这个谁来定？ 你这个网站是这个规定，他那个网站按照他那个规定，这互联网还能玩么？&lt;/p&gt;
&lt;p&gt;所以，必须有一个统一的规则，让大家发送消息、接收消息的时候有个格式依据，不能随便写。&lt;/p&gt;
&lt;p&gt;这个规则就是HTTP协议，以后浏览器发送请求信息也好，服务器回复响应信息也罢，都要按照这个规则来。&lt;/p&gt;
&lt;p&gt;HTTP协议主要规定了客户端和服务器之间的通信格式，那HTTP协议是怎么规定消息格式的呢？&lt;/p&gt;
&lt;p&gt;让我们首先打印下我们在服务端接收到的消息是什么。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import socket

sk = socket.socket()
sk.bind((&amp;quot;127.0.0.1&amp;quot;, 80))
sk.listen()


while True:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    print(data)  # 将浏览器发来的消息打印出来
    conn.send(b&amp;quot;OK&amp;quot;)
    conn.close()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;b&#39;GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nDNT: 1\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: csrftoken=RKBXh1d3M97iz03Rpbojx1bR6mhHudhyX5PszUxxG3bOEwh1lxFpGOgWN93ZH3zv\r\n\r\n&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们再看一下我们访问博客园官网时浏览器收到的响应信息是什么。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【前端】BOM和DOM</title>
      <link>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFbom%E5%92%8Cdom/</link>
      <pubDate>Mon, 09 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFbom%E5%92%8Cdom/</guid>
      <description>&lt;h1 id=&#34;前戏&#34;&gt;前戏&lt;/h1&gt;
&lt;p&gt;到目前为止，我们已经学过了JavaScript的一些简单的语法。但是这些简单的语法，并没有和浏览器有任何交互。&lt;/p&gt;
&lt;p&gt;也就是我们还不能制作一些我们经常看到的网页的一些交互，我们需要继续学习BOM和DOM相关知识。&lt;/p&gt;
&lt;p&gt;JavaScript分为 ECMAScript，DOM，BOM。&lt;/p&gt;
&lt;p&gt;BOM（Browser Object Model）是指浏览器对象模型，它使 JavaScript 有能力与浏览器进行“对话”。&lt;/p&gt;
&lt;p&gt;DOM （Document Object Model）是指文档对象模型，通过它，可以访问HTML文档的所有元素。&lt;/p&gt;
&lt;p&gt;Window对象是客户端JavaScript最高层对象之一，由于window对象是其它大部分对象的共同祖先，在调用window对象的方法和属性时，可以省略window对象的引用。例如：window.document.write()可以简写成：document.write()。&lt;/p&gt;
&lt;h2 id=&#34;window对象&#34;&gt;window对象&lt;/h2&gt;
&lt;p&gt;所有浏览器都支持 window 对象。它表示浏览器窗口。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;*如果文档包含框架（frame 或 iframe 标签），浏览器会为 HTML 文档创建一个 window 对象，并为每个框架创建一个额外的 window 对象。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;*没有应用于 window 对象的公开标准，不过所有浏览器都支持该对象。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。&lt;/p&gt;
&lt;p&gt;全局变量是 window 对象的属性。全局函数是 window 对象的方法。&lt;/p&gt;
&lt;p&gt;接下来要讲的HTML DOM 的 document 也是 window 对象的属性之一。&lt;/p&gt;
&lt;p&gt;一些常用的Window方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;window.innerHeight - 浏览器窗口的内部高度&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;window.innerWidth - 浏览器窗口的内部宽度&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;window.open() - 打开新窗口&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;window.close() - 关闭当前窗口&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;window的子对象&#34;&gt;window的子对象&lt;/h2&gt;
&lt;h3 id=&#34;navigator对象了解即可&#34;&gt;navigator对象（了解即可）&lt;/h3&gt;
&lt;p&gt;浏览器对象，通过这个对象可以判定用户所使用的浏览器，包含了浏览器相关信息。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;navigator.appName　　// Web浏览器全称
navigator.appVersion　　// Web浏览器厂商和版本的详细字符串
navigator.userAgent　　// 客户端绝大部分信息
navigator.platform　　　// 浏览器运行所在的操作系统
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;screen对象了解即可&#34;&gt;screen对象（了解即可）&lt;/h3&gt;
&lt;p&gt;屏幕对象，不常用。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【前端】JavaScript</title>
      <link>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFjavascript/</link>
      <pubDate>Mon, 09 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFjavascript/</guid>
      <description>&lt;h2 id=&#34;javascript引入方式&#34;&gt;JavaScript引入方式&lt;/h2&gt;
&lt;h3 id=&#34;script标签内写代码&#34;&gt;Script标签内写代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  // 在这里写你的JS代码
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;引入额外的js文件&#34;&gt;引入额外的JS文件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&amp;quot;myscript.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;javascript语言规范&#34;&gt;JavaScript语言规范&lt;/h2&gt;
&lt;h3 id=&#34;注释注释是代码之母&#34;&gt;注释（注释是代码之母）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 这是单行注释

/*
这是
多行注释
*/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;结束符&#34;&gt;结束符&lt;/h3&gt;
&lt;p&gt;JavaScript中的语句要以分号（;）为结束符。&lt;/p&gt;
&lt;h2 id=&#34;javascript语言基础&#34;&gt;JavaScript语言基础&lt;/h2&gt;
&lt;h3 id=&#34;变量声明&#34;&gt;变量声明&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;JavaScript的变量名可以使用_，数字，字母，$组成，不能以数字开头。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;声明变量使用 var 变量名; 的格式来进行声明&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;var name = &amp;quot;Alex&amp;quot;;
var age = 18;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;p&gt;变量名是区分大小写的。&lt;/p&gt;
&lt;p&gt;推荐使用驼峰式命名规则。&lt;/p&gt;
&lt;p&gt;保留字不能用做变量名。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;补充：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ES6新增了let命令，用于声明变量。其用法类似于var，但是所声明的变量只在let命令所在的代码块内有效。例如：for循环的计数器就很适合使用let命令。&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (let i=0;i&amp;lt;arr.length;i++){...}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;ES6新增const用来声明常量。一旦声明，其值就不能改变。&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const PI = 3.1415;
PI // 3.1415

PI = 3
// TypeError: &amp;quot;PI&amp;quot; is read-only
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;javascript数据类型&#34;&gt;JavaScript数据类型&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;JavaScript拥有动态类型&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var x;  // 此时x是undefined
var x = 1;  // 此时x是数字
var x = &amp;quot;Alex&amp;quot;  // 此时x是字符串
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;数值number&#34;&gt;&lt;strong&gt;数值(Number)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;JavaScript不区分整型和浮点型，就只有一种数字类型。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【前端】JQuery</title>
      <link>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFjquery/</link>
      <pubDate>Mon, 09 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFjquery/</guid>
      <description>&lt;h1 id=&#34;jquerypng&#34;&gt;&lt;img alt=&#34;jQuery.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201909106733_5460.png&#34;&gt;&lt;/h1&gt;
&lt;h1 id=&#34;jquery&#34;&gt;jQuery&lt;/h1&gt;
&lt;h2 id=&#34;jquery介绍&#34;&gt;jQuery介绍&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;jQuery是一个轻量级的、兼容多浏览器的JavaScript库。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jQuery使用户能够更方便地处理HTML Document、Events、实现动画效果、方便地进行Ajax交互，能够极大地简化JavaScript编程。它的宗旨就是：“Write less, do more.“&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;jquery的优势&#34;&gt;jQuery的优势&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;一款轻量级的JS框架。jQuery核心js文件才几十kb，不会影响页面加载速度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;丰富的DOM选择器,jQuery的选择器用起来很方便，比如要找到某个DOM对象的相邻元素，JS可能要写好几行代码，而jQuery一行代码就搞定了，再比如要将一个表格的隔行变色，jQuery也是一行代码搞定。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;链式表达式。jQuery的链式操作可以把多个操作写在一行代码里，更加简洁。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;事件、样式、动画支持。jQuery还简化了js操作css的代码，并且代码的可读性也比js要强。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajax操作支持。jQuery简化了AJAX操作，后端只需返回一个JSON格式的字符串就能完成与前端的通信。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;跨浏览器兼容。jQuery基本兼容了现在主流的浏览器，不用再为浏览器的兼容问题而伤透脑筋。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;插件扩展开发。jQuery有着丰富的第三方的插件，例如：树形菜单、日期控件、图片切换插件、弹出窗口等等基本前端页面上的组件都有对应插件，并且用jQuery插件做出来的效果很炫，并且可以根据自己需要去改写和封装插件，简单实用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;jquery内容&#34;&gt;jQuery内容：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;选择器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;筛选器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;样式操作&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文本操作&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;属性操作&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文档处理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;事件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动画效果&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;插件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;each、data、Ajax&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下载链接：&lt;a href=&#34;https://jquery.com/&#34;&gt;jQuery官网&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;中文文档：&lt;a href=&#34;http://jquery.cuishifeng.cn/&#34;&gt;jQuery AP中文文档&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;jquery版本&#34;&gt;jQuery版本&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1.x：兼容IE678,使用最为广泛的，官方只做BUG维护，功能不再新增。因此一般项目来说，使用1.x版本就可以了，最终版本：1.12.4 (2016年5月20日)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2.x：不兼容IE678，很少有人使用，官方只做BUG维护，功能不再新增。如果不考虑兼容低版本的浏览器可以使用2.x，最终版本：2.2.4 (2016年5月20日)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.x：不兼容IE678，只支持最新的浏览器。需要注意的是很多老的jQuery插件不支持3.x版。目前该版本是官方主要更新维护的版本。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;维护IE678是一件让人头疼的事情，一般我们都会额外加载一个CSS和JS单独处理。值得庆幸的是使用这些浏览器的人也逐步减少，PC端用户已经逐步被移动端用户所取代，如果没有特殊要求的话，一般都会选择放弃对678的支持。&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;jquery对象&#34;&gt;jQuery对象&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;jQuery对象就是通过jQuery包装DOM对象后产生的对象。jQuery对象是 jQuery独有的。如果一个对象是 jQuery对象，那么它就可以使用jQuery里的方法：例如$(“#i1”).html()。
$(&amp;quot;#i1&amp;quot;).html()的意思是：获取id值为 i1的元素的html代码。其中 html()是jQuery里的方法。
相当于： document.getElementById(&amp;quot;i1&amp;quot;).innerHTML;
虽然 jQuery对象是包装 DOM对象后产生的，但是 jQuery对象无法使用 DOM对象的任何方法，同理 DOM对象也没不能使用 jQuery里的方法。
一个约定，我们在声明一个jQuery对象变量的时候在变量名前面加上$：


var $variable = jQuery对像
var variable = DOM对象
$variable[0]//jQuery对象转成DOM对象
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;拿上面那个例子举例，jQuery对象和DOM对象的使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(&amp;quot;#i1&amp;quot;).html();//jQuery对象可以使用jQuery的方法
$(&amp;quot;#i1&amp;quot;)[0].innerHTML;// DOM对象使用DOM的方法
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;jquery基础语法&#34;&gt;jQuery基础语法&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$(selector).action()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;查找标签&#34;&gt;查找标签&lt;/h2&gt;
&lt;h3 id=&#34;基本选择器&#34;&gt;基本选择器&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;id选择器：&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【前端】CSS</title>
      <link>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFcss/</link>
      <pubDate>Wed, 04 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFcss/</guid>
      <description>&lt;p&gt;&lt;strong&gt;1. CSS介绍&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CSS（Cascading Style Sheet，层叠样式表)定义如何显示HTML元素。&lt;/p&gt;
&lt;p&gt;当浏览器读到一个样式表，它就会按照这个样式表来对文档进行格式化（渲染）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. CSS语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.1 CSS实例&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每个CSS样式由两个组成部分：选择器和声明。声明又包括属性和属性值。每个声明之后用分号结束。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;867021-20171215115756808-909989248.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201909042855_2638.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.2 CSS注释&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/*这是注释*/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. CSS的几种引入方式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.1 行内样式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;行内式是在标记的style属性中设定CSS样式。不推荐大规模使用。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;p style=&amp;quot;color: red&amp;quot;&amp;gt;Hello world.&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3.2内部样式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;嵌入式是将CSS样式集中写在网页的&lt;head&gt;&lt;/head&gt;标签对的&lt;style&gt;&lt;/style&gt;标签对中。格式如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        p{
            background-color: #2b99ff;
        }
    &amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3.3 外部样式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;外部样式就是将css写在一个单独的文件中，然后在页面进行引入即可。推荐使用此方式。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link href=&amp;quot;mystyle.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4. CSS选择器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.1 基本选择器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;元素选择器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/*元素选择器*/
p {color: &amp;quot;red&amp;quot;;}

/*ID选择器*/
#i1 {
  background-color: red;
}

/*类选择器*/
.c1 {
  font-size: 14px;
}
p.c1 {
  color: red;
}
/*注意：
样式类名不要用数字开头（有的浏览器不认）。
标签中的class属性如果有多个，要用空格分隔。*/

/*通用选择器*/
* {
  color: white;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4.2 组合选择器&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【前端】HTML</title>
      <link>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFhtml/</link>
      <pubDate>Tue, 03 Sep 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%89%8D%E7%AB%AFhtml/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;HTML.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201909033609_3808_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/1xQPI57bf8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web服务本质&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.浏览器发请求 &amp;ndash;&amp;gt; HTTP协议 &amp;ndash;&amp;gt;&lt;/p&gt;
&lt;p&gt;2.服务端接收请求 &amp;ndash;&amp;gt;&lt;/p&gt;
&lt;p&gt;3.服务端返回响应 &amp;ndash;&amp;gt; 服务端把HTML文件内容发给浏览器 &amp;ndash;&amp;gt;&lt;/p&gt;
&lt;p&gt;4.浏览器渲染页面&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import socket
sk = socket.socket()
sk.bind((&amp;quot;127.0.0.1&amp;quot;, 8080))
sk.listen(5)
while True:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    conn.send(b&amp;quot;HTTP/1.1 200 OK\r\n\r\n&amp;quot;)
    conn.send(b&amp;quot;&amp;lt;h1&amp;gt;Hello world!&amp;lt;/h1&amp;gt;&amp;quot;)
    conn.close()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;HTTP协议&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;超文本传输协议，规定了浏览器与服务端之间消息传输的数据格式&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;四大特性：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.基于请求响应&lt;/p&gt;
&lt;p&gt;2.基于TCP/IP之上的作用于应用层的协议&lt;/p&gt;
&lt;p&gt;3.无状态(服务端无法保存用户的状态)&lt;/p&gt;
&lt;p&gt;4.无连接(请求一次响应一次，之后立刻断开连接)&lt;/p&gt;
&lt;p&gt;websocket相当于HTTP协议的一个补丁，它支持长连接&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请求数据格式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;请求首行(表示HTTP协议版本，当前请求方式)&lt;/p&gt;
&lt;p&gt;请求头(一大堆k,v键值对)&lt;/p&gt;
&lt;p&gt;请求体(携带的是一些敏感信息比如密码、身份证号&amp;hellip;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;响应数据格式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;响应首行(标识HTTP协议版本,响应状态码)&lt;/p&gt;
&lt;p&gt;响应头(一大堆k,v键值对)&lt;/p&gt;
&lt;p&gt;响应体(返回给浏览器页面的数据 通常响应体都是html页面)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;响应状态码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用一串简单的数字来表示一些复杂的状态或者提示信息&lt;/p&gt;
&lt;p&gt;1XX:服务端已经成功接收了你的数据正在处理 你可以继续提交额外的数据&lt;/p&gt;
&lt;p&gt;2XX:服务端成功响应 你想要的数据(请求成功200)&lt;/p&gt;
&lt;p&gt;3XX:重定向(当你在访问一个需要登录之后才能访问的页面 你会发现窗口会自动调到登录页面 301 302)&lt;/p&gt;
&lt;p&gt;4XX:请求错误(请求资源不存在404,请求不合法不符合内部规定会权限不够403)&lt;/p&gt;
&lt;p&gt;5XX:服务器内部错误(500)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请求方式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;get请求(向服务端要资源）&lt;/p&gt;
&lt;p&gt;post请求(向服务端提交数据)&lt;/p&gt;</description>
    </item>
    <item>
      <title>【数据库】事务/索引与慢查询优化</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1%E7%B4%A2%E5%BC%95%E4%B8%8E%E6%85%A2%E6%9F%A5%E8%AF%A2%E4%BC%98%E5%8C%96/</link>
      <pubDate>Fri, 23 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1%E7%B4%A2%E5%BC%95%E4%B8%8E%E6%85%A2%E6%9F%A5%E8%AF%A2%E4%BC%98%E5%8C%96/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;事务_索引与慢查询优化.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908238895_3436_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;事务/索引与慢查询优化 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2qUg6bPFW8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11400755.html&#34; title=&#34;博客园&#34;&gt;&lt;/a&gt;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11400755.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;视图&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;什么是视图？&lt;br&gt;
视图就是通过查询得到一张虚拟表，然后保存下来，下次直接使用即可&lt;/p&gt;
&lt;p&gt;为什么要用视图？&lt;br&gt;
如果要频繁使用一张虚拟表，可以不用重复查询&lt;/p&gt;
&lt;p&gt;如何用视图&lt;br&gt;
create &lt;strong&gt;view&lt;/strong&gt; teacher2course &lt;strong&gt;as&lt;/strong&gt; select * from teacher inner join course on teacher.tid = course.teacher_id;&lt;/p&gt;
&lt;p&gt;强调&lt;/p&gt;
&lt;p&gt;1、在硬盘中，视图只有表结构文件，没有表数据文件&lt;/p&gt;
&lt;p&gt;2、视图通常是用于查询，尽量不要修改视图中的数据&lt;br&gt;
drop view teacher2course;&lt;/p&gt;
&lt;p&gt;思考:开发过程中会不会去使用视图？&lt;br&gt;
不会！视图是mysql的功能，如果你的项目里面大量的使用到了视图，那意味着你后期想要扩张某个功能的时候这个功能恰巧又需要对视图进行修改，意味着你需要先在mysql这边将视图先修改一下，然后再去应用程序中修改对应的sql语句，这就涉及到跨部门沟通的问题，所以通常不会使用视图，而是通过重新修改sql语句来扩展功能&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;触发器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;什么是触发器？&lt;br&gt;
在满足对某张表数据的增、删、改的情况下，自动触发的功能称之为触发器&lt;/p&gt;
&lt;p&gt;为何要用触发器？&lt;br&gt;
触发器专门针对我们对某一张表数据增insert、删delete、改update的行为，这类行为一旦执行 就会触发触发器的执行，即自动运行另外一段sql代码&lt;/p&gt;
&lt;p&gt;创建触发器语法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 针对插入
create trigger tri_after_insert_t1 after insert on 表名 for each row
begin
    sql代码。。。
end 
create trigger tri_after_insert_t2 before insert on 表名 for each row
begin
    sql代码。。。
end
# 针对删除
create trigger tri_after_delete_t1 after delete on 表名 for each row
begin
    sql代码。。。
end
create trigger tri_after_delete_t2 before delete on 表名 for each row
begin
    sql代码。。。
end
# 针对修改
create trigger tri_after_update_t1 after update on 表名 for each row
begin
    sql代码。。。
end
create trigger tri_after_update_t2 before update on 表名 for each row
begin
    sql代码。。。
end
# 案例
CREATE TABLE cmd (
    id INT PRIMARY KEY auto_increment,
    USER CHAR (32),
    priv CHAR (10),
    cmd CHAR (64),
    sub_time datetime,  # 提交时间
    success enum (&#39;yes&#39;, &#39;no&#39;)  # 0代表执行失败
);
CREATE TABLE errlog (
    id INT PRIMARY KEY auto_increment,
    err_cmd CHAR (64),
    err_time datetime
);
delimiter $$  # 将mysql默认的结束符由;换成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
    if NEW.success = &#39;no&#39; then  # 新记录都会被MySQL封装成NEW对象
        insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
    end if;
end $$
delimiter ;  # 结束之后记得再改回来，不然后面结束符就都是$$了
# 往表cmd中插入记录，触发触发器，根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
    USER,
    priv,
    cmd,
    sub_time,
    success
)
VALUES
    (&#39;egon&#39;,&#39;0755&#39;,&#39;ls -l /etc&#39;,NOW(),&#39;yes&#39;),
    (&#39;egon&#39;,&#39;0755&#39;,&#39;cat /etc/passwd&#39;,NOW(),&#39;no&#39;),
    (&#39;egon&#39;,&#39;0755&#39;,&#39;useradd xxx&#39;,NOW(),&#39;no&#39;),
    (&#39;egon&#39;,&#39;0755&#39;,&#39;ps aux&#39;,NOW(),&#39;yes&#39;);
# 查询errlog表记录
select * from errlog;
# 删除触发器
drop trigger tri_after_insert_cmd;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;事务&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【数据库】Navicat/Pytcharm连接MySQL</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93navicatpytcharm%E8%BF%9E%E6%8E%A5mysql/</link>
      <pubDate>Thu, 22 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93navicatpytcharm%E8%BF%9E%E6%8E%A5mysql/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Navicat_Pytcharm连接MySQL.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908227713_7199.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Navicat/Pytcharm连接MySQL&lt;/strong&gt;**&amp;gt;&lt;strong&gt;&lt;strong&gt;&amp;gt; &amp;gt;&lt;strong&gt;&lt;a href=&#34;https://mubu.com/doc/12gY78M4W8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11396758.html&#34; title=&#34;博客园&#34;&gt;博客园&lt;/a&gt;**&lt;/p&gt;
&lt;p&gt;Navicat连接MySQL&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;测试+链接数据库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新建库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新建表，新增字段+类型+约束&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设计表：外键&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新建查询&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立表模型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;批量加注释：ctrl+？键&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;批量去注释：ctrl+shift+？键&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pytcharm连接MySQL&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;安装pymysql模块&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代码连接&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;import pymysql
# 链接
conn=pymysql.connect(
  host=&amp;lsquo;localhost&amp;rsquo;,
  user=&amp;lsquo;root&amp;rsquo;,
  password=&amp;lsquo;123&amp;rsquo;,
  database=&amp;lsquo;dbname&amp;rsquo;,
  charset=&amp;lsquo;utf8&amp;rsquo;)  # 编码千万不要加- 如果写成了utf-8会直接报错
  autocommit = True  # 这个参数配置完成后  增删改操作都不需要在手动加conn.commit了
# 游标
cursor=conn.cursor()  # 执行完毕返回的结果集默认以元组显示
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)  
# 产生一个游标对象  以字典的形式返回查询出来的数据 键是表的字段  值是表的字段对应的信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pymysql操作数据库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;user = input(&amp;quot;&amp;raquo;&amp;gt;:&amp;quot;).strip()
pwd = input(&amp;quot;&amp;raquo;&amp;gt;:&amp;quot;).strip()
sql=&amp;lsquo;select * from userinfo where name=&amp;quot;%s&amp;quot; and password=&amp;quot;%s&amp;quot;&amp;rsquo; %(user,pwd)  # 注意%s需要加引号
rows=cursor.execute(sql)  # 执行sql语句，返回sql查询成功的记录数目
# 获取真实数据cursor.fetchone(),cursor.fetchall(),cursor.fetchmany(),类似管道取值，获取一条，所有，多条
print(cursor.fetchone())  # 只获取一条数据
print(cursor.fetchall())  # 获取所有的数据  返回的结果是一个列表
cursor.scroll(1,&amp;lsquo;relative&amp;rsquo;)  # 相对移动 relative相对于当前位置 往后移动几位
cursor.scroll(3,&amp;lsquo;absolute&amp;rsquo;)  # 绝对移动 absolute相对于起始位置 往后移动几位
cursor.close()
conn.close()&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sql注入问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;# 不要手动去拼接查询的sql语句
username = input(&amp;quot;&amp;raquo;&amp;gt;:&amp;quot;).strip()
password = input(&amp;quot;&amp;raquo;&amp;gt;:&amp;quot;).strip()
sql = &amp;ldquo;select * from user where username=&amp;rsquo;%s&amp;rsquo; and password=&amp;rsquo;%s&amp;rsquo;&amp;rdquo;%(username,password)
# 用户名正确
username &amp;raquo;&amp;gt;: jason&amp;rsquo; &amp;ndash; jjsakfjjdkjjkjs
# 用户名密码都不对的情况
username &amp;raquo;&amp;gt;: xxx&amp;rsquo; or 1=1 &amp;ndash;asdjkdklqwjdjkjasdljad
password &amp;raquo;&amp;gt;: &amp;rsquo;&amp;rsquo;
&amp;quot;&amp;quot;&amp;quot;
sql注入 就是利用注释等具有特殊意义的符号 来完成一些骚操作
后续写sql语句  不要手动拼接关键性的数据
而是让excute帮你去做拼接
&amp;quot;&amp;quot;&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;增删改&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;# 增
sql = &amp;ldquo;insert into user(username,password) values(%s,%s)&amp;rdquo;
rows = cursor.excute(sql,(&amp;lsquo;jason&amp;rsquo;,&amp;lsquo;123&amp;rsquo;))
# 修改
sql = &amp;ldquo;update user set username=&amp;lsquo;jasonDSB&amp;rsquo; where id=1&amp;rdquo;
rows = cursor.excute(sql)
&amp;quot;&amp;quot;&amp;quot;
增和改单单执行excute并不会真正影响到数据，需要再执行conn.commit()才可以完成真正的增改
&amp;quot;&amp;quot;&amp;quot;
# 一次插入多行记录
res = cursor,excutemany(sql,[(),(),()]）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>【数据库】表的查询</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E7%9A%84%E6%9F%A5%E8%AF%A2/</link>
      <pubDate>Wed, 21 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E7%9A%84%E6%9F%A5%E8%AF%A2/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;表的查询.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908214364_2376_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表的查询 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/GmqlUoRwa&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11391437.html&#34; title=&#34;博客园&#34;&gt;&lt;/a&gt;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11391437.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;单表查询&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前期表准备&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;create table emp(
  id int not null unique auto_increment,
  name varchar(20) not null,
  sex enum(&#39;male&#39;,&#39;female&#39;) not null default &#39;male&#39;,  # 大部分是男的
  age int(3) unsigned not null default 28,
  hire_date date not null,
  post varchar(50),
  post_comment varchar(100),
  salary double(15,2),
  office int,  # 一个部门一个屋子
  depart_id int
);# 插入记录# 三个部门：教学，销售，运营insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
(&#39;jason&#39;,&#39;male&#39;,18,&#39;20170301&#39;,&#39;张江第一帅形象代言&#39;,7300.33,401,1),  # 以下是教学部
(&#39;egon&#39;,&#39;male&#39;,78,&#39;20150302&#39;,&#39;teacher&#39;,1000000.31,401,1),
(&#39;kevin&#39;,&#39;male&#39;,81,&#39;20130305&#39;,&#39;teacher&#39;,8300,401,1),
(&#39;tank&#39;,&#39;male&#39;,73,&#39;20140701&#39;,&#39;teacher&#39;,3500,401,1),
(&#39;owen&#39;,&#39;male&#39;,28,&#39;20121101&#39;,&#39;teacher&#39;,2100,401,1),
(&#39;jerry&#39;,&#39;female&#39;,18,&#39;20110211&#39;,&#39;teacher&#39;,9000,401,1),
(&#39;nick&#39;,&#39;male&#39;,18,&#39;19000301&#39;,&#39;teacher&#39;,30000,401,1),
(&#39;sean&#39;,&#39;male&#39;,48,&#39;20101111&#39;,&#39;teacher&#39;,10000,401,1),
(&#39;歪歪&#39;,&#39;female&#39;,48,&#39;20150311&#39;,&#39;sale&#39;,3000.13,402,2),  # 以下是销售部门
(&#39;丫丫&#39;,&#39;female&#39;,38,&#39;20101101&#39;,&#39;sale&#39;,2000.35,402,2),
(&#39;丁丁&#39;,&#39;female&#39;,18,&#39;20110312&#39;,&#39;sale&#39;,1000.37,402,2),
(&#39;星星&#39;,&#39;female&#39;,18,&#39;20160513&#39;,&#39;sale&#39;,3000.29,402,2),
(&#39;格格&#39;,&#39;female&#39;,28,&#39;20170127&#39;,&#39;sale&#39;,4000.33,402,2),
(&#39;张野&#39;,&#39;male&#39;,28,&#39;20160311&#39;,&#39;operation&#39;,10000.13,403,3),  # 以下是运营部门
(&#39;程咬金&#39;,&#39;male&#39;,18,&#39;19970312&#39;,&#39;operation&#39;,20000,403,3),
(&#39;程咬银&#39;,&#39;female&#39;,18,&#39;20130311&#39;,&#39;operation&#39;,19000,403,3),
(&#39;程咬铜&#39;,&#39;male&#39;,18,&#39;20150411&#39;,&#39;operation&#39;,18000,403,3),
(&#39;程咬铁&#39;,&#39;female&#39;,18,&#39;20140512&#39;,&#39;operation&#39;,17000,403,3);
# ps：如果在windows系统中，插入中文字符，select的结果为空白，可以将所有字符编码统一设置成gbk
+----+-----------+--------+-----+------------+-----------------------------+--------------+------------+--------+-----------+
| id | name      | sex    | age | hire_date  | post                        | post_comment | salary     | office | depart_id |
+----+-----------+--------+-----+------------+-----------------------------+--------------+------------+--------+-----------+
|  1 | jason     | male   |  18 | 2017-03-01 | 张江第一帅形象代言          | NULL         |    7300.33 |    401 |         1 |
|  2 | egon      | male   |  78 | 2015-03-02 | teacher                     | NULL         | 1000000.31 |    401 |         1 |
|  3 | kevin     | male   |  81 | 2013-03-05 | teacher                     | NULL         |    8300.00 |    401 |         1 |
|  4 | tank      | male   |  73 | 2014-07-01 | teacher                     | NULL         |    3500.00 |    401 |         1 |
|  5 | owen      | male   |  28 | 2012-11-01 | teacher                     | NULL         |    2100.00 |    401 |         1 |
|  6 | jerry     | female |  18 | 2011-02-11 | teacher                     | NULL         |    9000.00 |    401 |         1 |
|  7 | nick      | male   |  18 | 1900-03-01 | teacher                     | NULL         |   30000.00 |    401 |         1 |
|  8 | sean      | male   |  48 | 2010-11-11 | teacher                     | NULL         |   10000.00 |    401 |         1 |
|  9 | 歪歪      | female |  48 | 2015-03-11 | sale                        | NULL         |    3000.13 |    402 |         2 |
| 10 | 丫丫      | female |  38 | 2010-11-01 | sale                        | NULL         |    2000.35 |    402 |         2 |
| 11 | 丁丁      | female |  18 | 2011-03-12 | sale                        | NULL         |    1000.37 |    402 |         2 |
| 12 | 星星      | female |  18 | 2016-05-13 | sale                        | NULL         |    3000.29 |    402 |         2 |
| 13 | 格格      | female |  28 | 2017-01-27 | sale                        | NULL         |    4000.33 |    402 |         2 |
| 14 | 张野      | male   |  28 | 2016-03-11 | operation                   | NULL         |   10000.13 |    403 |         3 |
| 15 | 程咬金    | male   |  18 | 1997-03-12 | operation                   | NULL         |   20000.00 |    403 |         3 |
| 16 | 程咬银    | female |  18 | 2013-03-11 | operation                   | NULL         |   19000.00 |    403 |         3 |
| 17 | 程咬铜    | male   |  18 | 2015-04-11 | operation                   | NULL         |   18000.00 |    403 |         3 |
| 18 | 程咬铁    | female |  18 | 2014-05-12 | operation                   | NULL         |   17000.00 |    403 |         3 |
+----+-----------+--------+-----+------------+-----------------------------+--------------+------------+--------+-----------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;语法执行顺序&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【数据库】表与表的关系</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E4%B8%8E%E8%A1%A8%E7%9A%84%E5%85%B3%E7%B3%BB/</link>
      <pubDate>Tue, 20 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E4%B8%8E%E8%A1%A8%E7%9A%84%E5%85%B3%E7%B3%BB/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;表与表的关系.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908208866_4264_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表与表的关系 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/1SXlYCyZo8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11385551.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表与表之间的关系&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所有信息都记录在一张表中所带来的问题&lt;/p&gt;
&lt;p&gt;1.表的结构不清晰&lt;/p&gt;
&lt;p&gt;2.浪费硬盘空间&lt;/p&gt;
&lt;p&gt;3.表的扩展性极差(无法忽略的缺点)&lt;/p&gt;
&lt;p&gt;类似于我们将所有的代码都写在同一个py文件内&lt;/p&gt;
&lt;p&gt;确立表与表之间的关系一定要换位思考(必须两方都考虑周全之后才能得出结论)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一对多关系&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以员工表和部门为例&lt;/p&gt;
&lt;p&gt;先站在员工表看，一个部门可以有多个员工&lt;/p&gt;
&lt;p&gt;再站在部门表看，一个员工不能属多个部门&lt;/p&gt;
&lt;p&gt;结论：员工表和部门表之间仅仅是单向的多对一，那么他们的表关系就是‘一对多’(表关系中没有多对一一说，只有一对多，无论是多对一还是一对多都叫‘一对多’)&lt;/p&gt;
&lt;p&gt;外键&lt;/p&gt;
&lt;p&gt;如何让两种表有代码层上真正的关联，就必须使用外键。&lt;/p&gt;
&lt;p&gt;什么是外键？外键就是让表与表有硬性层上的关系&lt;/p&gt;
&lt;p&gt;foreign key 外键约束&lt;/p&gt;
&lt;p&gt;1.在创建表的时候，必须先创建被关联表&lt;/p&gt;
&lt;p&gt;2.插入数据的时候，也必须先插入被关联表的数据&lt;/p&gt;
&lt;p&gt;建表&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;create table dep(
        id int primary key auto_increment,
        dep_name varchar(32),
        dep_desc varchar(128)
    );

create table emp(
        id int primary key auto_increment,
        emp_name varchar(64),
        emp_gender enum(&#39;male&#39;,&#39;female&#39;,&#39;others&#39;) default &#39;male&#39;,
        dep_id int,
        foreign key(dep_id) references dep(id)	
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;插入数据&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;insert into dep(dep_name,dep_desc) values(&#39;外交部&#39;,&#39;搞外交&#39;),
(&#39;教学部&#39;,&#39;教书育人&#39;),
(&#39;技术部&#39;,&#39;技术能力有限部门&#39;);

insert into emp(emp_name,dep_id) values(&#39;jason&#39;,1),
(&#39;egon&#39;,2),
(&#39;tank&#39;,2),
(&#39;kevin&#39;,3);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改表数据&lt;/p&gt;</description>
    </item>
    <item>
      <title>【数据库】表操作</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E6%93%8D%E4%BD%9C/</link>
      <pubDate>Mon, 19 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8%E6%93%8D%E4%BD%9C/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;表操作.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908198617_7065_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表操作 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/3r9ztv_KD8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt;****&amp;gt; &amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11379733.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;********&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据类型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建表的完整语法&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 语法：
create table 表名(
字段名1 类型[(宽度)约束条件]，
字段名2 类型[(宽度)约束条件]，
字段名3类型[(宽度)约束条件]
)
# 注意：
1.在同一张表中，字段名不嫩相同
2.宽度和约束条件可选，字段名和类型是必须的
3.最后一个字段后不能加逗号
# 补充：
# 1.宽度指的是对存储数据的限制
create table userinfo(name char)
insert into userinfo values(&#39;jsaon&#39;)
&amp;quot;&amp;quot;&amp;quot;
1.没有安全模式的数据库版本，能够存放数据，但只会存进去一个j
2.最新版的数据库版本直接报错提示无法存储：Data too long for column &#39;name&#39; at row 1
&amp;quot;&amp;quot;&amp;quot;
# 2.约束条件初识&amp;gt;&amp;gt;&amp;gt; null 与 not null
create table t1(id int,name char not null);
insert into t1 values(1,&#39;j&#39;);  # 正常存储
insert into t1 values(2,null);  # 报错
# 总结 类型与约束条件的区别
# 类型：限制字段必须以什么样的数据类型存储
# 约束条件：约束条件是在类型之外添加的一种额外的限制
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;基本数据类型&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【数据库】初识MySQL数据库</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%88%9D%E8%AF%86mysql%E6%95%B0%E6%8D%AE%E5%BA%93/</link>
      <pubDate>Fri, 16 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%88%9D%E8%AF%86mysql%E6%95%B0%E6%8D%AE%E5%BA%93/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;初识数据库.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908165672_5043_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;初识MySQL数据库 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/1Tr5lwG5a8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****************&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;博客园&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据库概念&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;SQL能干嘛呢？它就是一款软件，安装在任何一台计算机或者服务器上的时候，只要告诉它擦混关键一个文件，新增一个数据，删除一个数据，它就能帮我去做想要的操作。SQL就是用来帮我们操作文件的。&lt;/p&gt;
&lt;p&gt;软件目录开发规范规定了数据的存放位置，但是这样的存取操作都是在本地存取数据，无法基于互联网通信，所以我们需要保存数据到一个公共的地方，所有的用户涉及到数据相关都必须来这个公共地方查找。&lt;/p&gt;
&lt;p&gt;MySQL的本质就是一款基于网络通信的应用软件，任何基于网路通信的软件，底层都是socket&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;服务端-基于socket通信-收发消息-SQL语句(是一个公共的标准)
客户端-基于socket通信-收发消息-SQL语句(是一个公共的标准)
ps:MySQL不仅支持MySQL的客户端来操作，也支持其他编程语言直接操作，但不同编程语言操作的语法都不一样
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MySQL其实可以把它看成一款支持远程操作文件的软件&lt;/p&gt;
&lt;p&gt;一些数据常用的名词例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;库 &amp;gt;&amp;gt;&amp;gt; 文件夹
表 &amp;gt;&amp;gt;&amp;gt; 文件
记录 &amp;gt;&amp;gt;&amp;gt; 文件内一行行的数据叫做一条条的记录
表头 &amp;gt;&amp;gt;&amp;gt; 表格的第一行数据
字段 &amp;gt;&amp;gt;&amp;gt; 字段名+字段类型
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;DBMS：数据库管理系统&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;数据库分为关系型数据库和非关系型数据库&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关系型数据库&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关系型数据库就是数据与数据之间可以有关联和限制&lt;/p&gt;
&lt;p&gt;关系型数据库通常都是表结构，也就意味着你在用关系型数据库的时候第一步就是确定表结构&lt;/p&gt;
&lt;p&gt;常见的关系型数据库：MySQL,oracle,sqlite,db2,sql server等&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;非关系行数据库&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通常都是以k,v键值的形式 存储数据&lt;/p&gt;
&lt;p&gt;常见的非关系型数据库：redis,memcache,mongodb(文档型数据库，非常接近关系型的非关系型数据)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MySQL安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件目录初识&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;官网下载MySQL社区版后解压查看文件目录，bin目录下含有：&lt;/p&gt;
&lt;p&gt;mysqld.exe服务端&lt;/p&gt;
&lt;p&gt;mysql.exe客户端&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cmd启动服务端与客户端&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先切换到bin目录下再执行命令，终端建议使用管理员身份运行，通过win+r启动的是普通用户&lt;/p&gt;
&lt;p&gt;启动mysqld&lt;/p&gt;
&lt;p&gt;启动mysql&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;如果不输入用户名和密码 默认是访客模式登陆  所能用到的功能很少
mysql -h 127.0.0.1 -P 3306 -uroot -p
可以简写：mysql -uroot -p
mysql在初始登陆的时候 是没有密码的 直接回车即可
mysql中的sql语句 是以分号结束的 不敲分号 默认你没有输入完客户端还会让你继续输入，此时可输入；补全sql语句并执行
当命令输入错误的时候  可以用\c取消前面的命令  cancel
客户端退出登录：exit 或 quit
查看某个进程：tasklist |findstr 名称
杀死进程：taskkill /F /PID 进程号
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;环境变量配置&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【并发编程】IO模型</title>
      <link>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8Bio%E6%A8%A1%E5%9E%8B/</link>
      <pubDate>Thu, 15 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8Bio%E6%A8%A1%E5%9E%8B/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;IO模型.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908156909_500_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IO模型 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2BCYe2Z478&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11359300.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IO模型介绍&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了更好地了解IO模型，我们需要事先回顾下：同步、异步、阻塞、非阻塞&lt;/p&gt;
&lt;p&gt;同步（synchronous） IO和异步（asynchronous） IO，阻塞（blocking） IO和非阻塞（non-blocking）IO分别是什么，到底有什么区别？这个问题其实不同的人给出的答案都可能不同，比如wiki，就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同，并且在讨论这个问题的时候上下文(context)也不相同。所以，为了更好的回答这个问题，我先限定一下本文的上下文。&lt;/p&gt;
&lt;p&gt;本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”，6.2节“I/O Models ”，Stevens在这节中详细说明了各种IO的特点和区别，如果英文够好的话，推荐直接阅读。Stevens的文风是有名的深入浅出，所以不用担心看不懂。本文中的流程图也是截取自参考文献。&lt;/p&gt;
&lt;p&gt;Stevens在文章中一共比较了五种IO Model：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;blocking IO 阻塞IO&lt;/li&gt;
&lt;li&gt;nonblocking IO 非阻塞IO&lt;/li&gt;
&lt;li&gt;IO multiplexing IO多路复用&lt;/li&gt;
&lt;li&gt;signal driven IO 信号驱动IO&lt;/li&gt;
&lt;li&gt;asynchronous IO 异步IO&lt;br&gt;
由signal driven IO（信号驱动IO）在实际中并不常用，所以主要介绍其余四种IO Model。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再说一下IO发生时涉及的对象和步骤。对于一个network IO (这里我们以read举例)，它会涉及到两个系统对象，一个是调用这个IO的process (or thread)，另一个就是系统内核(kernel)。当一个read操作发生时，该操作会经历两个阶段：&lt;/p&gt;
&lt;p&gt;#1）等待数据准备 (Waiting for the data to be ready)&lt;/p&gt;
&lt;p&gt;#2）将数据从内核拷贝到进程中(Copying the data from the kernel to the process)&lt;/p&gt;</description>
    </item>
    <item>
      <title>【并发编程】进程池/线程池/协程</title>
      <link>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E8%BF%9B%E7%A8%8B%E6%B1%A0%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%8D%8F%E7%A8%8B/</link>
      <pubDate>Thu, 15 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E8%BF%9B%E7%A8%8B%E6%B1%A0%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%8D%8F%E7%A8%8B/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img alt=&#34;并发编程(四).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908152948_8824_1.png&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;并发编程(四) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/3EDdlPqM78&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11359207.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;进程池与线程池&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;什么是池？在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率 但是保证了计算机硬件的安全 (硬件的发展跟不上软件的速度)&lt;/p&gt;
&lt;p&gt;p = ThreadPoolExecutor()创建线程池，括号内可以传参数指定线程池内的线程个数，也可以不传，不传默认是当前所在计算机的cpu个数乘5&lt;/p&gt;
&lt;p&gt;p = ProcessPoolExecutor()创建进程池，默认是当前计算机cpu的个数&lt;/p&gt;
&lt;p&gt;池子中创建的进程/线程创建一次就不会再创建了，至始至终用的都是最初的那几个，这样的话节省了反复开辟进程/线程的资源&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;concurrent.futures 模块提供异步执行回调高层接口&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;异步执行可以由 ThreadPoolExecutor 使用线程或由 ProcessPoolExecutor 使用单独的进程来实现。 两者都是实现抽像类 Executor 定义的接口。&lt;/p&gt;
&lt;p&gt;p.submit(fn, *args, **kwargs)朝池子提交任务，异步提交&lt;/p&gt;
&lt;h1 id=&#34;调度可调用对象-fn以-fnargs-kwargs-方式执行并返回-future-对像代表可调用对象的执行&#34;&gt;调度可调用对象 fn，以 fn(*args **kwargs) 方式执行并返回 Future 对像代表可调用对象的执行。&lt;/h1&gt;
&lt;p&gt;p.shutdown(wait=True)关闭池子&lt;/p&gt;
&lt;p&gt;#等待池子中所有的任务执行完毕之后 才会往下运行代码&lt;/p&gt;
&lt;p&gt;ThreadPoolExecutor 是 Executor 的子类，它使用线程池来异步执行调用。&lt;/p&gt;
&lt;p&gt;ProcessPoolExecutor 是 Executor 的子类，它使用进程池来实现异步执行调用。&lt;/p&gt;
&lt;h1 id=&#34;processpoolexecutor-使用-multiprocessing-回避-global-interpreter-lock-但也意味着只可以处理和返回可序列化的对象-main-模块必须可以被工作者子进程导入这意味着-processpoolexecutor-不可以工作在交互式解释器中&#34;&gt;ProcessPoolExecutor 使用 multiprocessing 回避 Global Interpreter Lock 但也意味着只可以处理和返回可序列化的对象。 &lt;strong&gt;main&lt;/strong&gt; 模块必须可以被工作者子进程导入。这意味着 ProcessPoolExecutor 不可以工作在交互式解释器中。&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;异步回调&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;提交任务的方式&lt;/p&gt;
&lt;p&gt;同步：提交任务之后 原地等待任务的返回结果 期间不做任何事&lt;/p&gt;
&lt;p&gt;异步：提交任务之后 不等待任务的返回结果(异步的结果怎么拿？？？) 直接执行下一行代码&lt;/p&gt;
&lt;p&gt;异步回调机制:当异步提交的任务有返回结果之后，会自动触发回调函数的执行&lt;/p&gt;
&lt;p&gt;result()原地等待任务的返回结果&lt;/p&gt;
&lt;p&gt;p.submit(fn,*args, **kwargs).add_done_callback(fn)提交任务的时候 绑定一个回调函数 一旦该任务有结果 立刻执行对于的回调函数&lt;/p&gt;</description>
    </item>
    <item>
      <title>【并发编程】锁/线程队列/信号量/Event事件</title>
      <link>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%94%81%E7%BA%BF%E7%A8%8B%E9%98%9F%E5%88%97%E4%BF%A1%E5%8F%B7%E9%87%8Fevent%E4%BA%8B%E4%BB%B6/</link>
      <pubDate>Wed, 14 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%94%81%E7%BA%BF%E7%A8%8B%E9%98%9F%E5%88%97%E4%BF%A1%E5%8F%B7%E9%87%8Fevent%E4%BA%8B%E4%BB%B6/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;并发编程(三).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908143610_2559_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;并发编程(三) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2TRm4OQzz8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11352646.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GIL全局解释器锁&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cpython解释器：python解释器有很多种，最常见的就是Cpython解释器&lt;/p&gt;
&lt;p&gt;GIL本质也是一把互斥锁&lt;/p&gt;
&lt;p&gt;将并发变成串行牺牲效率保证数据的安全&lt;/p&gt;
&lt;p&gt;用来阻止同一个进程下的多个线程的同时执行&lt;/p&gt;
&lt;p&gt;(同一个进程内多个线程无法实现并行但是可以实现并发)&lt;/p&gt;
&lt;p&gt;GIL的存在是因为CPython解释器的内存管理不是线程安全的&lt;/p&gt;
&lt;p&gt;因为进程内的垃圾回收机制也是一个线程，所以有可能造成其他线程例如赋值时，刚创建值，还没指向变量名就被回收，再赋值直接报错&lt;/p&gt;
&lt;p&gt;python的多线程没法利用多核优势 是不是就是没有用了?&lt;/p&gt;
&lt;p&gt;研究python的多线程是否有用需要分情况讨论&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;四个任务 计算密集型的  10s
单核情况下
    开线程更省资源
多核情况下
    开进程 10s
    开线程 40s
四个任务 IO密集型的  
单核情况下
    开线程更节省资源
多核情况下
    开线程更节省资源
python的多线程到底有没有用
需要看情况而定  并且肯定是有用的
多进程+多线程配合使用
多线程不能使用多核是所有解释型语言的通病
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GIL与普通互斥锁&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from threading import Thread
import time
n = 100
def task():
    global n
    tmp = n
    # time.sleep(1)
    n = tmp -1
t_list = []
for i in range(100):
    t = Thread(target=task)
    t.start()
    t_list.append(t)
for t in t_list:
    t.join()
print(n)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;死锁与递归锁&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【并发编程】队列/进程间通信/线程</title>
      <link>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%98%9F%E5%88%97%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E7%BA%BF%E7%A8%8B/</link>
      <pubDate>Mon, 12 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%98%9F%E5%88%97%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E7%BA%BF%E7%A8%8B/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;并发编程(二).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908124424_9438_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;并发编程(二) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/ZRlhGS9Ua&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11340425.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;队列&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;队列：先进先出&lt;/p&gt;
&lt;p&gt;堆栈：先进后出&lt;/p&gt;
&lt;p&gt;q = Queue(5) 括号内可以传参数：表示的是这个队列的最大存储数&lt;/p&gt;
&lt;p&gt;q.put(1) 括号内可以传参数：表示往队列中添加数据，当对列满了，程序会阻塞，直到有人从队列中取走值&lt;/p&gt;
&lt;p&gt;q.get()：表示向队列取值，当取完后再次获取，程序会阻塞，直到有人往队列存入值&lt;/p&gt;
&lt;p&gt;q.full()：判断对列是否满了&lt;/p&gt;
&lt;p&gt;q.empty()：判断队列中的数据是否取完&lt;/p&gt;
&lt;p&gt;q.get_nowait()：取值，没有值不等待直接报错&lt;/p&gt;
&lt;p&gt;full,get_nowait,empty都不适用与多进程的情况&lt;/p&gt;
&lt;p&gt;其他方法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;q.qsize() 
    返回队列中目前项目的正确数量。此函数的结果并不可靠，因为在返回结果和在稍后程序中使用结果之间，队列中可能添加或删除了项目。在某些系统上，此方法可能引发NotImplementedError异常。
q.close() 
    关闭队列，防止队列中加入更多数据。调用此方法时，后台线程将继续写入那些已入队列但尚未写入的数据，但将在此方法完成时马上关闭。如果q被垃圾收集，将自动调用此方法。关闭队列不会在队列使用者中生成任何类型的数据结束信号或异常。例如，如果某个使用者正被阻塞在get（）操作上，关闭生产者中的队列不会导致get（）方法返回错误。
q.cancel_join_thread()
    不会再进程退出时自动连接后台线程。这可以防止join_thread()方法阻塞。
q.join_thread() 
    连接队列的后台线程。此方法用于在调用q.close()方法后，等待所有队列项被消耗。默认情况下，此方法由不是q的原始创建者的所有进程调用。调用q.cancel_join_thread()方法可以禁止这种行为。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;进程间的通信IPC机制&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;子进程放数据，主进程获取数据&lt;/p&gt;
&lt;p&gt;两个子进程相互放，取数据&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from multiprocessing import Process,Queue
def producer(q):
    q.put(&#39;hello GF~&#39;)
def consumer(q):
    print(q.get())
if __name__ == &#39;__main__&#39;:
    q = Queue()
    p = Process(target=producer,args=(q,))
    c = Process(target=consumer, args=(q,))
    p.start()
    c.start()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;生产者消费者模型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;生产者：生产/制造数据的&lt;/p&gt;
&lt;p&gt;消费者：消费/处理数据的&lt;/p&gt;
&lt;p&gt;例子：做包子的，买包子的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1.做包子远比买包子的多
# 2.做包子的远比包子的少
# 供需不平衡的问题
from multiprocessing import Process,Queue,JoinableQueue
import random
import time
def producer(name,food,q):
    for i in range(10):
        data = &#39;%s生产了%s%s&#39;%(name,food,i)
        time.sleep(random.random())
        q.put(data)
        print(data)
def consumer(name,q):
    while True:
        data = q.get()
        if data == None:break
        print(&#39;%s吃了%s&#39;%(name,data))
        time.sleep(random.random())
        q.task_done()  # 告诉队列你已经从队列中取出了一个数据 并且处理完毕了
if __name__ == &#39;__main__&#39;:
    q = JoinableQueue()
    p = Process(target=producer,args=(&#39;大厨egon&#39;,&#39;馒头&#39;,q))
    p1 = Process(target=producer,args=(&#39;跟班tank&#39;,&#39;生蚝&#39;,q))
    c = Process(target=consumer,args=(&#39;许兆龙&#39;,q))
    c1 = Process(target=consumer,args=(&#39;吃货jerry&#39;,q))
    p.start()
    p1.start()
    c.daemon = True
    c1.daemon = True
    c.start()
    c1.start()
    p.join()
    p1.join()
    q.join()  # 等到队列中数据全部取出
    # q.put(None)
    # q.put(None)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;线程&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【并发编程】进程</title>
      <link>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E8%BF%9B%E7%A8%8B/</link>
      <pubDate>Sun, 11 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E8%BF%9B%E7%A8%8B/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;并发编程(一).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908119816_8792_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;并发编程(一) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/3SQHwb0bb8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11337291.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;操作系统的作用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1：隐藏丑陋复杂的硬件接口，提供良好的抽象接口&lt;/p&gt;
&lt;p&gt;2：管理、调度进程，并且将多个进程对硬件的竞争变得有序&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多道技术&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.空间上的复用：多个赓续公用一套计算机硬件&lt;/p&gt;
&lt;p&gt;2.时间上的复用：切换+保存状态&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;1.当一个程序遇到IO操作
操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率 并且也不影响程序的执行效率)
&amp;gt;2.当一个程序长时间占用cpu
操作系统也会剥夺该程序的cpu执行权限(降低了程序的执行效率)
并发:看起来像同时运行的就可以
并行:真正意义上的同时执行
单核的计算机不能实现并行,但是可以实现并发
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;单道程序工作示例&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;单道程序工作示例.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908114716_2734_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;多道程序工作示例&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;多道程序工作示例.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908111904_1209.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;进程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;程序：一堆代码**&lt;br&gt;
**&lt;/p&gt;
&lt;p&gt;进程：正在运行的程序&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;第一，进程是一个实体。每一个进程都有它自己的地址空间，一般情况下，包括文本区域（text region）、数据区域（data region）和堆栈（stack region）。文本区域存储处理器执行的代码；数据区域存储变量和进程执行期间使用的动态分配的内存；堆栈区域存储着活动过程调用的指令和本地变量。
第二，进程是一个“执行中的程序”。程序是一个没有生命的实体，只有处理器赋予程序生命时（操作系统执行之），它才能成为一个活动的实体，我们称其为进程。[3] 
进程是操作系统中最基本、重要的概念。是多道程序系统出现后，为了刻画系统内部出现的动态情况，描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;进程的特征&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;动态性：进程的实质是程序在多道程序系统中的一次执行过程，进程是动态产生，动态消亡的。
并发性：任何进程都可以同其他进程一起并发执行
独立性：进程是一个能独立运行的基本单位，同时也是系统分配资源和调度的独立单位；
异步性：由于进程间的相互制约，使进程具有执行的间断性，即进程按各自独立的、不可预知的速度向前推进
结构特征：进程由程序、数据和进程控制块三部分组成。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;进程的调度&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.先来先服务调度算法
先来先服务（FCFS）调度算法是一种最简单的调度算法，该算法既可用于作业调度，也可用于进程调度。FCFS算法比较有利于长作业（进程），而不利于短作业（进程）。由此可知，本算法适合于CPU繁忙型作业，而不利于I/O繁忙型的作业（进程）。
2.短作业优先调度算法
短作业（进程）优先调度算法（SJ/PF）是指对短作业或短进程优先调度的算法，该算法既可用于作业调度，也可用于进程调度。但其对长作业不利；不能保证紧迫性作业（进程）被及时处理；作业的长短只是被估算出来的。
3.时间片轮转法
时间片轮转(Round Robin，RR)法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例。在时间片轮转法中，需要将CPU的处理时间分成固定大小的时间片，例如，几十毫秒至几百毫秒。如果一个进程在被调度选中之后用完了系统规定的时间片，但又未完成要求的任务，则它自行释放自己所占有的CPU而排到就绪队列的末尾，等待下一次调度。同时，进程调度程序又去调度当前就绪队列中的第一个进程。 显然，轮转法只能用来调度分配一些可以抢占的资源。这些可以抢占的资源可以随时被剥夺，而且可以将它们再分配给别的进程。CPU是可抢占资源的一种。但打印机等资源是不可抢占的。由于作业调度是对除了CPU之外的所有系统硬件资源的分配，其中包含有不可抢占资源，所以作业调度不使用轮转法。在轮转法中，时间片长度的选取非常重要。首先，时间片长度的选择会直接影响到系统的开销和响应时间。如果时间片长度过短，则调度程序抢占处理机的次数增多。这将使进程上下文切换次数也大大增加，从而加重系统开销。反过来，如果时间片长度选择过长，例如，一个时间片能保证就绪队列中所需执行时间最长的进程能执行完毕，则轮转法变成了先来先服务法。时间片长度的选择是根据系统对响应时间的要求和就绪队列中所允许最大的进程数来确定的。 在轮转法中，加入到就绪队列的进程有3种情况： 一种是分给它的时间片用完，但进程还未完成，回到就绪队列的末尾等待下次调度去继续执行。 另一种情况是分给该进程的时间片并未用完，只是因为请求I/O或由于进程的互斥与同步关系而被阻塞。当阻塞解除之后再回到就绪队列。 第三种情况就是新创建进程进入就绪队列。 如果对这些进程区别对待，给予不同的优先级和时间片从直观上看，可以进一步改善系统服务质量和效率。例如，我们可把就绪队列按照进程到达就绪队列的类型和进程被阻塞时的阻塞原因分成不同的就绪队列，每个队列按FCFS原则排列，各队列之间的进程享有不同的优先级，但同一队列内优先级相同。这样，当一个进程在执行完它的时间片之后，或从睡眠中被唤醒以及被创建之后，将进入不同的就绪队列。
4.多级反馈队列
前面介绍的各种用作进程调度的算法都有一定的局限性。如短进程优先的调度算法，仅照顾了短进程而忽略了长进程，而且如果并未指明进程的长度，则短进程优先和基于进程长度的抢占式调度算法都将无法使用。而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间，而且还可以满足各种类型进程的需要，因而它是目前被公认的一种较好的进程调度算法。在采用多级反馈队列调度算法的系统中，调度算法的实施过程如下所述。(1) 应设置多个就绪队列，并为各个队列赋予不同的优先级。第一个队列的优先级最高，第二个队列次之，其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同，在优先权愈高的队列中，为每个进程所规定的执行时间片就愈小。例如，第二个队列的时间片要比第一个队列的时间片长一倍，……，第i+1个队列的时间片要比第i个队列的时间片长一倍。(2) 当一个新进程进入内存后，首先将它放入第一队列的末尾，按FCFS原则排队等待调度。当轮到该进程执行时，如它能在该时间片内完成，便可准备撤离系统；如果它在一个时间片结束时尚未完成，调度程序便将该进程转入第二队列的末尾，再同样地按FCFS原则等待调度执行；如果它在第二队列中运行一个时间片后仍未完成，再依次将它放入第三队列，……，如此下去，当一个长作业(进程)从第一队列依次降到第n队列后，在第n 队列便采取按时间片轮转的方式运行。(3) 仅当第一队列空闲时，调度程序才调度第二队列中的进程运行；仅当第1～(i-1)队列均空时，才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时，又有新进程进入优先权较高的队列(第1～(i-1)中的任何一个队列)，则此时新进程将抢占正在运行进程的处理机，即由调度程序把正在运行的进程放回到第i队列的末尾，把处理机分配给新到的高优先权进程。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&#34;时间片转轮发+多级反馈队列.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908118541_248.jpg-zhonger.com&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;进程的并发与并行&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;并行： 并行是指两者同时执行（资源够用，比如三个线程，四核的CPU ）
并发：并发是指资源有限的情况下，两者交替轮流使用资源
区别
并行是从微观上，也就是在一个精确的时间片刻，有不同的程序在执行，这就要求必须有多个处理器
并发是从宏观上，在一个时间段上可以看出是同时执行的，比如一个服务器同时处理多个session
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;同步异步阻塞非阻塞&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】异常处理</title>
      <link>https://zhong-er.com/posts/python%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86/</link>
      <pubDate>Thu, 08 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img alt=&#34;Python异常处理.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908112295_3450_1.png&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python异常处理 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/3HxHgXnqf8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11322367.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么是异常处理？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;程序在运行过程中出现了不可预知的错误&lt;/p&gt;
&lt;p&gt;并且该错误没有对应的处理机制，那么就会以异常的形式表现出来&lt;/p&gt;
&lt;p&gt;造成的影响就是整个程序无法正常运行&lt;/p&gt;
&lt;p&gt;异常的结构&lt;/p&gt;
&lt;p&gt;1.异常的类型：NAMEERROR&lt;/p&gt;
&lt;p&gt;2.异常的信息：name &amp;lsquo;abc&amp;rsquo; is not defined&lt;/p&gt;
&lt;p&gt;3.异常的位置：Traceback (most recent call last): File &amp;ldquo;路径&amp;rdquo;, line 1, in &lt;module&gt; abc&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;异常的种类：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.语法错误&lt;br&gt;
是你程序立刻就能解决的，这种错误是不能被容忍的，语法上的错误，发现之后应该立刻解决&lt;/p&gt;
&lt;p&gt;2.逻辑错误&lt;br&gt;
这种错误是可以被容忍的，因为一眼看不出来，针对逻辑上的错误，可以采用异常处理机制进行捕获&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常见的错误类型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;NameError 名字错误&lt;/p&gt;
&lt;p&gt;SyntaxError 语法错误&lt;/p&gt;
&lt;p&gt;KeyError 健不存在&lt;/p&gt;
&lt;p&gt;valueError 值错误&lt;/p&gt;
&lt;p&gt;IndexError 索引错误&lt;/p&gt;
&lt;p&gt;TypeError 类型错误&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;异常处理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在你认为可能出现bug的代码块上方try一下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;try:
	可能出错的代码
except 出错的类型 as e:  # 将报错信息赋值给变量e
	出错之后的处理机制
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意try内部的代码块越少越好&lt;/p&gt;
&lt;p&gt;try后可跟多种except异常类型的捕获，但是不会连续连续捕获，因为有一个错误发生之后，会立刻停止代码的运行，执行该类型错误的except语句&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;try:
    name
    l = [1,2,3]
    l[111]
    d = {&#39;name&#39;:&#39;jason&#39;}
    d[&#39;password&#39;]
except NameError:
    print(&#39;NameError&#39;)
except IndexError:
    print(&#39;indexerror&#39;)
except KeyError:
    print(&#39;keyerror&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Exception 所有异常的基类，所有异常类型都被捕获&lt;/p&gt;</description>
    </item>
    <item>
      <title>【网络编程】Socket</title>
      <link>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Bsocket/</link>
      <pubDate>Thu, 08 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Bsocket/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;网络编程(三).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908085255_559_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网络编程(三) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/FpZaknXLa&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11322341.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基于TCP协议使用socket分发大文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;案例：电影上传&lt;/p&gt;
&lt;p&gt;思路：客户端端循环一行一行读文件并一行一行传输，服务端循环接收并写入文件&lt;/p&gt;
&lt;p&gt;客户端代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import socket,json,os,struct
client = cocket.socket()
client.connet((&#39;127.0.0.1&#39;,8080))
while True:
    # 获取电影类表，循环展示
    MOVIE_DIR = r&#39;D:\路径\视频&#39;
    movie_list = os.listdir(MOVIE_DIR)
    for i,movie in enumerate(movie_list,1):
        print(i,movie)
    # 用户选择
    choice = input(&#39;please choice movie to upload&amp;gt;&amp;gt;&amp;gt;:&#39;)
    # 判断是否是数字
    if choice.isdigit():
        # 将字符串转为int
        choice = in(choice) - 1
        # 判断用户选择在不在列表范围内
        if choice in range(0,len(movie_list))
           # 获取用户想上传的文件路径
            path = movie_list[choice]
           # 拼接文件的绝对路径
           file_path = os.path.join(MOVIE_DIR,path)
           # 获取文件的大小
           file_size = os.path.getsize(file_path)
           # 定义一个字典
           res_d = {
                      &#39;file_name&#39;:&#39;性感荷官在线发牌.,mp4&#39;,
                      &#39;file_size&#39;:file_size,
                      &#39;msg&#39;:&#39;注意身体，多喝营养快线&#39;
           }
           # 序列话字典
           json_d = json.dunps(res_d)
           json_bytes = json_d.encode(&#39;utf-8&#39;)
           # 1.先制作字典格式的报头
           header = struct.pack(&#39;i&#39;,len(json_bytes))
           # 2.发送字典的报头
           client.send(header)
           # 3.再发字典
           client.send(json_bytes)
           # 4.再发文件数据(打开文件循环发送)
           with open(file_path,r&#39;b&#39;) as f:
               for line in f:
                   client.send(line)
        else:
           print(&#39;not in rang&#39;)
    else:
        print(&#39;must be a number&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;服务端代码&lt;/p&gt;</description>
    </item>
    <item>
      <title>【网络编程】TCP协议与粘包问题</title>
      <link>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Btcp%E5%8D%8F%E8%AE%AE%E4%B8%8E%E7%B2%98%E5%8C%85%E9%97%AE%E9%A2%98/</link>
      <pubDate>Wed, 07 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Btcp%E5%8D%8F%E8%AE%AE%E4%B8%8E%E7%B2%98%E5%8C%85%E9%97%AE%E9%A2%98/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;网络编程(二).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908079748_6105_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网络编程(二) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/M0ZxVWd7a&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11317624.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基于TCP协议的Socket套接字&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;server端&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import socket
sk = socket.socket()
sk.bind((&#39;127.0.0.1&#39;,8898))  # 把地址绑定到套接字
sk.listen()          # 监听链接
conn,addr = sk.accept() # 接受客户端链接
ret = conn.recv(1024)  # 接收客户端信息
print(ret)       # 打印客户端信息
conn.send(b&#39;hi&#39;)        # 向客户端发送信息
conn.close()       # 关闭客户端套接字
sk.close()        # 关闭服务器套接字(可选)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;client端&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import socket
sk = socket.socket()           # 创建客户套接字
sk.connect((&#39;127.0.0.1&#39;,8898))    # 尝试连接服务器
sk.send(b&#39;hello!&#39;)
ret = sk.recv(1024)         # 对话(发送/接收)
print(ret)
sk.close()            # 关闭客户套接字
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;127.0.0.1本机回还地址：只能自己识别自己 其他人无法访问&lt;/p&gt;
&lt;p&gt;send与recv对应，不要出现两边都是相同的情况&lt;/p&gt;
&lt;p&gt;recv是跟内存要数据，至于数据的来源 你无需考虑&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TCP特点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;会将数据量比较小的并且时间间隔比较短的数据一次性打包发送给对方&lt;/p&gt;
&lt;p&gt;TCP是基于链接的，必须先启动服务端，然后再启动客户端去连接服务端&lt;/p&gt;</description>
    </item>
    <item>
      <title>【网络编程】OSI七层协议/TCP协议</title>
      <link>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Bosi%E4%B8%83%E5%B1%82%E5%8D%8F%E8%AE%AEtcp%E5%8D%8F%E8%AE%AE/</link>
      <pubDate>Tue, 06 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Bosi%E4%B8%83%E5%B1%82%E5%8D%8F%E8%AE%AEtcp%E5%8D%8F%E8%AE%AE/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;网络编程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908068133_5580_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网络编程(一) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2o2v35H6G8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11312188.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件开发架构&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C/S架构(clinet/server)：客户端/服务端&lt;/p&gt;
&lt;p&gt;B/S架构(browser/server)：浏览器/服务器&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网络编程发展史&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;任何先进的技术最早都源于军事&lt;/p&gt;
&lt;p&gt;要想实现远程通信第一个需要具备的条件是：物理连接介质&lt;/p&gt;
&lt;p&gt;计算机之间要想实现远程通信除了有物理连接介质还需要一套公共标准/协议、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OSI七层协议&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;应用层&lt;/strong&gt;&lt;br&gt;
HTTP协议FTP协议&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表示层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;会话层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;传输层&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TCP\UDP都是基于端口(port)工作的协议
计算机与计算机之间其实是计算机上的应用程序与应用程序之间的通信
端口:用来唯一标识一台计算机上的某个应用程序
端口号的范围:0~65535
注意:0~1024这些都是操作系统默认使用的端口号
建议:使用8000之后的端口
MySQL默认端口:3306
Redis默认端口:6379
django默认端口:8000
flask默认端口:5000	

端口号是动态分配的 第一次起qq分配到的是8989将qq关闭再次启动端口号可能就变了

总结
ip地址:用来唯一标识接入互联网的一台计算机
port端口:用来唯一标识一台计算机上的某个应用程序
ip+port:唯一标识接入互联网一台计算机上的某个应用程序
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;网络层&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IP协议规定了只要是接入互联网的计算机都必须有一个IP地址
ip地址特点:点分十进制
ip地址最小:0.0.0.0
ip地址最大:255.255.255.255
ip地址目前有两个版本:IPV4  IPV6(由于IPV4已经不够表示目前存在的计算机了 所以推出了IPV6版本)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;数据链路层&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.规定的电信号的分组方式
2.规定了任何一台接入互联网的计算机都必须有一块网卡
每一块网卡上面都刻有世界上独一无二的编号
12位16进制数：前6位是厂商编号，后6位是流水线编号	
我们管这12数叫mac地址
ps:以上两点合称为&amp;quot;以太网协议&amp;quot;
交换机：基于以太网协议通信，不能跨局域网通信。
以太网协议通信的特点：通信基本靠吼！
                缺点：广播风暴
互联网是有N多个局域网彼此之间连接而成的。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;物理连接层&lt;/strong&gt;&lt;br&gt;
基于电信号传输010101001010二进制数据&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TCP协议(详见&lt;/strong&gt;&lt;a href=&#34;%7B#ZC_BLOG_HOST#%7Dpost/56.html&#34; title=&#34;TCP协议三次握手四次挥手&#34;&gt;&lt;strong&gt;《TCP协议三次握手四次挥手》&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;流式协议,可靠协议&lt;/p&gt;
&lt;p&gt;基于TCP协议通信 必先建立双向通道&lt;/p&gt;
&lt;p&gt;TCP协议传输数据可靠的原因在于它有反馈机制，发送消息之后对方必须回复确认收到消息才会将数据从内存中清空，否则在限定的时间时间内会每隔一段时间发送一次，如果超过限定时间还未收到，就会把对方计算机列为宕机或其他故障，停止向此计算机发送消息&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三次握手&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所谓三次握手(Three-way Handshake)，是指建立一个 TCP 连接时，需要客户端和服务器总共发送3个包。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;第一次客户端发送SYN包给服务端，客户端发送完毕进入SYN_SEND状态，
第二次服务端收到第一次客户端发送的SYN包后发回ACK确认包并同时也发送一个SYN包到客户端，服务端发送完毕进入SYN_RECV状态，
第三次客户端接收到服务端发送的ACK+SYN包后向服务端发回ACK确认包，发送完毕进入Established状态。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;四次挥手&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【网络编程】TCP协议的三次握手四次挥手-详解</title>
      <link>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Btcp%E5%8D%8F%E8%AE%AE%E7%9A%84%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B-%E8%AF%A6%E8%A7%A3/</link>
      <pubDate>Tue, 06 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Btcp%E5%8D%8F%E8%AE%AE%E7%9A%84%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B-%E8%AF%A6%E8%A7%A3/</guid>
      <description>&lt;h2 id=&#34;tcp-的特性&#34;&gt;TCP 的特性&lt;/h2&gt;
&lt;p&gt;TCP 提供一种面向连接的、可靠的字节流服务&lt;/p&gt;
&lt;p&gt;在一个 TCP 连接中，仅有两方进行彼此通信。广播和多播不能用于 TCP&lt;/p&gt;
&lt;p&gt;TCP 使用校验和，确认和重传机制来保证可靠传输&lt;/p&gt;
&lt;p&gt;TCP 给数据分节进行排序，并使用累积确认保证数据的顺序不变和非重复&lt;/p&gt;
&lt;p&gt;TCP 使用滑动窗口机制来实现流量控制，通过动态改变窗口的大小进行拥塞控制&lt;/p&gt;
&lt;p&gt;注意：TCP 并不能保证数据一定会被对方接收到，因为这是不可能的。TCP 能够做到的是，如果有可能，就把数据递送到接收方，否则就（通过放弃重传并且中断连接这一手段）通知用户。因此准确说 TCP 也不是 100% 可靠的协议，它所能提供的是数据的可靠递送或故障的可靠通知。&lt;/p&gt;
&lt;h2 id=&#34;三次握手与四次挥手&#34;&gt;三次握手与四次挥手&lt;/h2&gt;
&lt;p&gt;所谓三次握手(Three-way Handshake)，是指建立一个 TCP 连接时，需要客户端和服务器总共发送3个包。&lt;/p&gt;
&lt;p&gt;三次握手的目的是连接服务器指定端口，建立 TCP 连接，并同步连接双方的序列号和确认号，交换 TCP 窗口大小信息。在 socket 编程中，客户端执行 &lt;code&gt;connect()&lt;/code&gt; 时。将触发三次握手。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一次握手(SYN=1, seq=x):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;客户端发送一个 TCP 的 SYN 标志位置1的包，指明客户端打算连接的服务器的端口，以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。&lt;/p&gt;
&lt;p&gt;发送完毕后，客户端进入 &lt;code&gt;SYN_SEND&lt;/code&gt; 状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号，放到 Seq 域里，同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1，即X+1。 发送完毕后，服务器端进入 &lt;code&gt;SYN_RCVD&lt;/code&gt; 状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三次握手(ACK=1，ACKnum=y+1)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;客户端再次发送确认包(ACK)，SYN 标志位为0，ACK 标志位为1，并且把服务器发来 ACK 的序号字段+1，放在确定字段中发送给对方，并且在数据段放写ISN的+1&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】反射/元类</title>
      <link>https://zhong-er.com/posts/python%E5%8F%8D%E5%B0%84%E5%85%83%E7%B1%BB/</link>
      <pubDate>Tue, 30 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E5%8F%8D%E5%B0%84%E5%85%83%E7%B1%BB/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第21课(反射_元类).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907306609_2135_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python反射/元类) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/3nvhkZgcw8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11271212.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;反射reflect&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;什么是反射, 其实是反省,自省的意思&lt;/p&gt;
&lt;p&gt;反射指的是一个对象应该具备,可以检测,修改,增加自身属性的能力&lt;/p&gt;
&lt;p&gt;反射就是通过字符串操作属性&lt;/p&gt;
&lt;p&gt;涉及的四个函数,这四个函数就是普通的内置函数 没有双下划綫,与print等等没有区别&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hasattr  getattr setattr delattr 

p = Person(&amp;quot;jack&amp;quot;,18,&amp;quot;man&amp;quot;)

# if hasattr(p,&amp;quot;name&amp;quot;): # 1.判断某个对象是否存在某个属性
#     print(getattr(p,&amp;quot;names&amp;quot;,None)) # 2.从对象中取出属性,第三个值位默认值 当属性不存在是返回默认值

# 3.为对象添加新的属性
setattr(p,&amp;quot;id&amp;quot;,&amp;quot;123&amp;quot;)
print(p.id)

# 4.从对象中删除属性
delattr(p,&amp;quot;id&amp;quot;)
print(p.id)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用场景:反射其实就是对属性的增删改查,但是如果直接使用内置的dict来操作,语法繁琐,不好理解&lt;/p&gt;
&lt;p&gt;另外一个最主要的问题是,如果对象不是我自己写的是另一方提供的,我就必须判断这个对象是否满足的要求,也就是是否我需要的属性和方法&lt;/p&gt;
&lt;p&gt;框架代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
反射被称为框架的基石,为什么
因为框架的设计者,不可能提前知道你的对象到底是怎么设计的
所以你提供给框架的对象 必须通过判断验证之后才能正常使用
判断验证就是反射要做的事情,
当然通过__dict__也是可以实现的, 其实这些方法也就是对__dict__的操作进行了封装
需求:要实现一个用于处理用户的终端指令的小框架
框架就是已经实现了最基础的构架,就是所有项目都一样的部分
&amp;quot;&amp;quot;&amp;quot;

import plugins

# 框架已经实现的部分
def run(plugin):
    while True:
        cmd = input(&amp;quot;请输入指令:&amp;quot;)
        if cmd == &amp;quot;exit&amp;quot;:
            break
        # 因为无法确定框架使用者是否传入正确的对象所以需要使用反射来检测
        # 判断对象是否具备处理这个指令的方法
        if hasattr(plugin,cmd):
            # 取出对应方法方法
            func = getattr(plugin,cmd)
            func() # 执行方法处理指令
        else:
            print(&amp;quot;该指令不受支持...&amp;quot;)
    print(&amp;quot;see you la la!&amp;quot;)


# 创建一个插件对象 调用框架来使用它
# wincmd = plugins.WinCMD()
# 框架之外的部分就有自定义对象来完成
linux = plugins.LinuxCMD()
run(linux)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;插件部分&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】多态</title>
      <link>https://zhong-er.com/posts/python%E5%A4%9A%E6%80%81/</link>
      <pubDate>Mon, 29 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E5%A4%9A%E6%80%81/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第20课(多态).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907295353_7862_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python多态 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2Z5T8az_x8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11264086.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;********&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多态&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;概念&lt;/strong&gt; ：一种事物具备多种 不同的形态&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例如&lt;/strong&gt; ：水“固态”、“液态”、“气态”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;官方解释&lt;/strong&gt; ：多个不同类的对象可以响应同一个方法，产生不同的结果&lt;/p&gt;
&lt;p&gt;首先强调多态不是一种特殊的语法，而是一种状态、特性(即多个不同对象可以响应同一个方法，产生不同结果)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;好处&lt;/strong&gt; ：对于使用者而言，大大的降低了使用难度&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实现多态&lt;/strong&gt; ：接口、抽象类、鸭子类型都可以写出具备多态的代码，最简单的就是鸭子类型&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;案例&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
要管理 鸡 鸭 鹅
如何能够最方便的 管理,就是我说同一句话,他们都能理解
既它们拥有相同的方法

&amp;quot;&amp;quot;&amp;quot;
class JI:
    def bark(self):
        print(&amp;quot;哥哥哥&amp;quot;)

    def spawn(self):
        print(&amp;quot;下鸡蛋..&amp;quot;)

class Duck:
    def bark(self):
        print(&amp;quot;嘎嘎嘎&amp;quot;)

    def spawn(self):
        print(&amp;quot;下鸭蛋&amp;quot;)

class E:
    def bark(self):
        print(&amp;quot;饿饿饿....&amp;quot;)

    def spawn(self):
        print(&amp;quot;下鹅蛋..&amp;quot;)

j = JI()
y = Duck()
e = E()

def mange(obj):
    obj.spawn()


mange(j)
mange(y)
mange(e)


# python中到处都有多态  
a = 10
b = &amp;quot;10&amp;quot;
c = [10]

print(type(a))
print(type(b))
print(type(c))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;isinstance&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】封装</title>
      <link>https://zhong-er.com/posts/python%E5%B0%81%E8%A3%85/</link>
      <pubDate>Sat, 27 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E5%B0%81%E8%A3%85/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第19课(封装).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907279602_9365_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python封装 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/3bGhBW7908&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11257242.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;封装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么是封装？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;就是将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口&lt;/p&gt;
&lt;p&gt;对外隐藏内部实现细节,并提供访问的接口&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么时候应该封装？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当有一些数据不希望外界可以直接修改时&lt;/p&gt;
&lt;p&gt;当有一些函数不希望给外界使用时&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么需要封装 ？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.为了保证 关键数据的安全性&lt;/p&gt;
&lt;p&gt;2.对外部隐藏实现细节,隔离复杂度&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Person:
    def __init__(self,id_number,name,age)
    
	self.__id_number = id_number
        self.name = name
        self.age = age
   
p = Person(&amp;quot;1111111111111&amp;quot;,&amp;quot;jack&amp;quot;,29)
p.id_number = &amp;quot;222&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;被封装的内容的特点:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.外界不能直接访问&lt;/p&gt;
&lt;p&gt;2.内部依然可以使用&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;权限&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;学习了封装后就可以控制属性的权限&lt;/p&gt;
&lt;p&gt;在python只要两种权限&lt;/p&gt;
&lt;p&gt;1.公开的.默认就是公开的&lt;/p&gt;
&lt;p&gt;2.私有的,只能由当前类自己使用&lt;/p&gt;
&lt;p&gt;在外界访问私有的内容&lt;/p&gt;
&lt;p&gt;属性虽然被封装了,但是还是需要使用的,在外界如何访问&lt;/p&gt;
&lt;p&gt;通过定义方法类完成对私有属性的修改和访问&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
这是一个下载器类,需要提供一个缓存大小这样的属性
缓存大小不能超过内存限制
&amp;quot;&amp;quot;&amp;quot;
class Downloader:
    def __init__(self,filename,url,buffer_size):
        self.filename = filename
        self.url = url
        self.__buffer_size= buffer_size
    def start_download(self):
        if self.__buffer_size &amp;lt;= 1024*1024:
            print(&amp;quot;开始下载....&amp;quot;)
            print(&amp;quot;当前缓冲器大小&amp;quot;,self.__buffer_size)
        else:
            print(&amp;quot;内存炸了! &amp;quot;)
    def set_buffer_size(self,size):
        #可以在方法中添加额外的逻辑
        if not type(size) == int:
            print(&amp;quot;大哥 缓冲器必须是整型&amp;quot;)
        else:
            print(&amp;quot;缓冲区大小修改成功!&amp;quot;)
            self.__buffer_size = size
    def get_buffer_size(self):
        return self.__buffer_size
d = Downloader(&amp;quot;葫芦娃&amp;quot;,&amp;quot;http://www.baicu.com&amp;quot;,1024*1024)
# 通过函数取修改内部封装的属性
d.set_buffer_size(1024*512)
# 通过函数访问内部封装的属性
print(d.get_buffer_size())
d.start_download()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样一来我们可以在外界修改这个关键数据时,做一些限制&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】继承</title>
      <link>https://zhong-er.com/posts/python%E7%BB%A7%E6%89%BF/</link>
      <pubDate>Thu, 25 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E7%BB%A7%E6%89%BF/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第十八课(继承).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907256978_8464_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python继承 ****&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/1E2IpX7lH8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;************************&lt;/a&gt;&lt;strong&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11247379.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;********&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么是继承？&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;继承是一种关系,描述两个对象之间,什么是什么的关系
例如麦兜,佩奇,猪刚鬣 都是猪啊,
在程序中,继承描述的是类和类之间的关系  
例如a继承了b, a就能直接使用b已经存在的方法和属性
a称之为子类,b称之为父类,也称之为基类
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;为什么要使用继承&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;继承的一方可以直接使用被继承一方已经有的东西
其目的是为了重用已经有的代码,提高重用性
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;如何使用继承&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;语法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class 类名称(父类的名称):
    类的内容 
    
#在python中 一个子类可以同时继承多个父类
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;抽象&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;不具体,不清晰,很模糊,看不懂  
将多个子类中相同的部分,进行抽取,形成一个新的类,这个过程也称之为抽象的过程
正确的使用继承:
	1.先抽象在继承
	2.继承一个已经现存的类,扩展或是修改原始的功能
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;属性的查找顺序&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class A:
    text = &amp;quot;haha&amp;quot;

class B(A):
    text = &amp;quot;heihei&amp;quot;
    pass

b = B()
b.text = &amp;quot;xixi&amp;quot;

print(b.text)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对象自己的 - &amp;gt; 所在类中 -&amp;gt; 找父类 - &amp;gt;父类的父类 -&amp;gt;Object&lt;/p&gt;
&lt;p&gt;派生&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类
通常子类都会写一些新的代码,不可能和父类完全一样 , 既通常都是派生类,
所以派生类指的就是子类
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;覆盖&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】面向对象</title>
      <link>https://zhong-er.com/posts/python%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/</link>
      <pubDate>Wed, 24 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第十七课(面向对象基础).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907245717_4819_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python面向对象 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2IXliWSXW8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11239449.html&#34; title=&#34;博客园&#34;&gt;&lt;/a&gt;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11239449.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;面向对象编程思想OOP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么是面向对象&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[os-copy]&lt;/p&gt;
&lt;p&gt;面向对象是一种编程思想，是前辈们总结出的经验，指导程序员如何编写出更好的程序，核心是对象，程序就是一系列对象的集合，程序员负责调度控制这些对象来交互着完成任务&lt;/p&gt;
&lt;p&gt;案例1 把大象装进冰箱？&lt;br&gt;
面向过程:&lt;br&gt;
1.打开冰箱&lt;br&gt;
2.装入大象&lt;br&gt;
3.关闭冰箱&lt;br&gt;
面向对象:&lt;br&gt;
找个具备装大象的技能的对象&lt;/p&gt;
&lt;p&gt;在面向对象中程序员的角度发生改变，从具体的操作者变成了指挥者&lt;br&gt;
强调：对象不是凭空产生的，需要我们自己设计&lt;/p&gt;
&lt;p&gt;案例2 西天取经&lt;br&gt;
如来有一堆破书要传出去,他没有自己干,&lt;br&gt;
而是找了五个对象帮他去干, 如来只要负责控制调度的对象即可,&lt;/p&gt;
&lt;p&gt;如果某个对象发生变化,也不会影响其他的对象 , 扩展性&lt;/p&gt;
&lt;p&gt;案例3 曹操吟诗&lt;br&gt;
喝酒吃肉,人生真爽&lt;br&gt;
喝酒吃肉,人生几何&lt;br&gt;
对酒当歌,人生几何&lt;/p&gt;
&lt;p&gt;[/os-copy]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;面向对象三大优点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[os-copy]&lt;/p&gt;
&lt;p&gt;1.扩展性&lt;/p&gt;
&lt;p&gt;2.灵活性&lt;/p&gt;
&lt;p&gt;3.重用性&lt;/p&gt;
&lt;p&gt;[/os-copy]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[os-copy]&lt;/p&gt;
&lt;p&gt;1.程序的复杂度提高了&lt;/p&gt;
&lt;p&gt;2.无法准确预知结果&lt;/p&gt;
&lt;p&gt;[/os-copy]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用场景：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对扩展性要求较高，通常是直接面向用户的，例如：QQ，微信&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;面向过程编程思想&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[os-copy]&lt;/p&gt;
&lt;p&gt;关注的核心是过程,过程是就是一步一步的执行步骤,既先干啥在干啥&lt;/p&gt;
&lt;p&gt;优点:逻辑清晰 , 复杂问题简单化,流程化&lt;/p&gt;
&lt;p&gt;缺点: 扩展性差,可维护性差&lt;/p&gt;
&lt;p&gt;使用场景:对扩展性要求较低的程序例如:系统内核,git,计算器&lt;/p&gt;
&lt;p&gt;记住:不是所有程序都要面向对象,得分析具体需求&lt;/p&gt;
&lt;p&gt;[/os-copy]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;类和对象&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;类&lt;/strong&gt; ：即类型，类别，是一种抽象概念，是一系列具备相同特征和相同行的对象的集合&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;对象&lt;/strong&gt; ：就是具体存在的某个事物，具备自己的特征和行为，对象就是特征和技能的结合体&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;类和对象的关系&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[os-copy]&lt;/p&gt;
&lt;p&gt;类包含一系列对象，对象属于某个类&lt;/p&gt;
&lt;p&gt;在生活中是先有对象再有类，而在程序中是先有类才能有对象,我们必须先告诉计算机这类的对象有什么特征有什么行为&lt;/p&gt;
&lt;p&gt;总结出一个结论:在使用面向对象编程时,第一步就是思考需要什么样的对象,对象具备什么样的特征和行为,从而根据 这些信息总结出需要的类型&lt;/p&gt;
&lt;p&gt;[/os-copy]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建类和对象&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;定义类的语法&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】深浅拷贝/hashlib/logging/openpyxl模块</title>
      <link>https://zhong-er.com/posts/python%E6%B7%B1%E6%B5%85%E6%8B%B7%E8%B4%9Dhashlibloggingopenpyxl%E6%A8%A1%E5%9D%97/</link>
      <pubDate>Fri, 19 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E6%B7%B1%E6%B5%85%E6%8B%B7%E8%B4%9Dhashlibloggingopenpyxl%E6%A8%A1%E5%9D%97/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第十六课(模块3).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907194511_4004_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;深浅拷贝/hashlib/logging/openpyxl模块 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/1XBfSvM5X8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;博客园&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模块与包&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;模块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
三种来源
    1.内置的
    2.第三方的
    3.自定义的
四种表示形式
    1.py文件(******)
    2.共享库
    3.文件夹(一系列模块的结合体)(******)
    4.C++编译的连接到python内置的
&amp;quot;&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;导入模块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
先产生一个执行文件的名称空间
    1.创建模块文件的名称空间
    2.执行模块文件中的代码 将产生的名字放入模块的名称空间中
    3.在执行文件中拿到一个指向模块名称空间的名字
&amp;quot;&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;什么是包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
什么是包?
    它是一系列模块文件的结合体,表示形式就是一个文件夹
    该文件夹内部通常会有一个__init__.py文件
    包的本质还是一个模块
&amp;quot;&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;导入包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;先产生一个执行文件的名称空间
    1.创建包下面的__init__.py文件的名称空间
    2.执行包下面的__init__.py文件中的代码 将产生的名字放入包下面的__init__.py文件名称空间中
    3.在执行文件中拿到一个指向包下面的__init__.py文件名称空间的名字
在导入语句中 .号的左边肯定是一个包(文件夹)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当你作为包的设计者来说&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.当模块的功能特别多的情况下 应该分文件管理
2.每个模块之间为了避免后期模块改名的问题 你可以使用相对导入(包里面的文件都应该是被导入的模块)
# 研究模块与包 还可以站另外两个角度分析不同的问题
# 1.模块的开发者
# 2.模块的使用者
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;研究模块与包还可以站另外两个角度分析不同的问题&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.站在包的开发者
如果使用绝对路径来管理的自己的模块 那么它只需要永远以包的路径为基准依次导入模块
2.站在包的使用者
你必须得将包所在的那个文件夹路径添加到system
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python2如果要导入包 包下面必须要有__init__.py文件
python3如果要导入包 包下面没有__init__.py文件也不会报错
当你在删程序不必要的文件的时候 千万不要随意删除__init__.py文件
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;相对导入与绝对导入&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】时间/序列化/sys/os模块</title>
      <link>https://zhong-er.com/posts/python%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E5%8C%96sysos%E6%A8%A1%E5%9D%97/</link>
      <pubDate>Thu, 18 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E5%8C%96sysos%E6%A8%A1%E5%9D%97/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第十五课(模块2).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907191143_207_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python****时间/序列化/sys/os模块 &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/24AoWYUXS8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11210464.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****************&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;collections模块&#34;&gt;collections模块&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;collections模块在内置的数据类型，比如：int、str、list、dict等基础之上额外提供了几种数据类型。
1.namedtuple(): 生成可以使用名字来访问元素内容的tuple子类
2.deque: 双端队列，可以快速的从另外一侧追加和推出对象
3.Counter: 计数器，主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;****&lt;strong&gt;具名元组(namedtuple)&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;pre&gt;&lt;code&gt;tuple是一个不可变的集合，namedtuple是一个函数，她用来构建一个自定义的tuple对象，
并且规定了tuple元素的个数，可通过属性而不是索引来引用tuple的某个元素。
我们可以通过namedtuple很方便的自定义一个数据类型，它具有tuple 的不变属性又可以根据属性来引用。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;****想表示空间坐标点x为1， y为2，z为5的坐标&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from collections import namedtuple
point = namedtuple(&#39;坐标&#39;,[&#39;x&#39;,&#39;y&#39;,&#39;z&#39;])  # 第二个参数既可以传可迭代对象
point1 = namedtuple(&#39;坐标&#39;,&#39;x y z&#39;)  # 也可以传字符串 但是字符串之间以空格隔开
p = point(1,2,5)
p1 = point1(2,3,6)print(p,p.x,p.y,p.z)  # 坐标(x=1, y=2, z=5) 1 2 5print(p1,p1.x,p1.y,p1.z)  # 坐标(x=2, y=3, z=6) 2 3 6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;想表示一张黑桃A的扑克牌&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;card = namedtuple(&#39;扑克牌&#39;,&#39;color number&#39;)
card1 = namedtuple(&#39;扑克牌&#39;,[&#39;color&#39;,&#39;number&#39;])
A = card(&#39;♠&#39;,&#39;A&#39;)
B = card1(&#39;♠&#39;,&#39;A&#39;)print(A.color,A.number,A)  # ♠ A 扑克牌(color=&#39;♠&#39;, number=&#39;A&#39;)print(B.color,B.number,B)  # ♠ A 扑克牌(color=&#39;♠&#39;, number=&#39;A&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;想表示一个城市&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】正则表达式与re模块</title>
      <link>https://zhong-er.com/posts/python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%8Ere%E6%A8%A1%E5%9D%97/</link>
      <pubDate>Wed, 17 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%8Ere%E6%A8%A1%E5%9D%97/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第十三课(模块1).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907172541_862_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python正则表达式与re模块&lt;/strong&gt;************&amp;gt; &amp;raquo;转到****&lt;a href=&#34;https://mubu.com/doc/1cDg8PhNk8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/strong&gt;************************************&lt;/a&gt;&lt;strong&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;/strong&gt;********&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11196211.html&#34; title=&#34;博客园&#34;&gt;博客园&lt;/a&gt;****&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正则表达式与re模块的关系&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.正则表达式是一门独立的技术，任何语言均可使用&lt;/p&gt;
&lt;p&gt;2.python中要想使用正则表达式需要通过re模块&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正则表达式应用场景&lt;/strong&gt;&lt;br&gt;
推荐书籍：正则指引&lt;/p&gt;
&lt;p&gt;1.爬虫&lt;/p&gt;
&lt;p&gt;2.数据分析&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;字符组概念&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在同一个位置可能出现的各种字符组成了一个字符组，在正则表达式中用[]表示(一个字符组每次只能匹配一个字符)&lt;/p&gt;
&lt;p&gt;小例子&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;匹配0-9数字([0123456789]也支持简写[0-9])(如果想匹配横杠,转义即可)
匹配A-Z字母(依据上面的简写规则[A-Z])
匹配a-z字母(依据上面的简写规则[a-z])
ps:这种上面到上面的范围必须是从小到大[a-Z]不行，[A-z]可以(但是内部有几个特殊符号)，因为内部对应的asicc码A在所有字母里面最小，z在所有字母里面最大
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;正则&lt;/th&gt;
					&lt;th&gt;待匹配字符&lt;/th&gt;
					&lt;th&gt;匹配结果&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;[0123456789]&lt;/td&gt;
					&lt;td&gt;8&lt;/td&gt;
					&lt;td&gt;True&lt;/td&gt;
					&lt;td&gt;在一个字符组里枚举合法的所有字符，字符组里的任意一个字符&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;和&amp;quot;待匹配字符&amp;quot;相同都视为可以匹配&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;[0123456789]&lt;/td&gt;
					&lt;td&gt;a&lt;/td&gt;
					&lt;td&gt;False&lt;/td&gt;
					&lt;td&gt;由于字符组中没有&amp;quot;a&amp;quot;字符，所以不能匹配&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;[0-9]| 7| True| 也可以用-表示范围,[0-9]就和[0123456789]是一个意思&lt;/p&gt;
&lt;p&gt;[a-z]| s| True| 同样的如果要匹配所有的小写字母，直接用[a-z]就可以表示&lt;/p&gt;
&lt;p&gt;[A-Z]| B| True| [A-Z]就表示所有的大写字母&lt;/p&gt;
&lt;p&gt;[0-9a-fA-f]| e| True| 可以匹配数字，大小写形式的a～f，用来验证十六进制字符&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;字符&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;元字符&lt;br&gt;
| 匹配内容&lt;/p&gt;
&lt;p&gt;&amp;mdash;|&amp;mdash;&lt;br&gt;
. | 匹配除换行符以外的任意字符&lt;br&gt;
\w| 匹配字母或数字或下划线&lt;br&gt;
\s| 匹配任意的空白符&lt;br&gt;
\d| 匹配数字&lt;br&gt;
\n| 匹配一个换行符&lt;br&gt;
\t| 匹配一个制表符&lt;br&gt;
\b| 匹配一个单词的结尾&lt;br&gt;
^| 匹配字符串的开始&lt;br&gt;
$| 匹配字符串的结尾&lt;br&gt;
\W| 匹配非字母或数字或下划线&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】模块</title>
      <link>https://zhong-er.com/posts/python%E6%A8%A1%E5%9D%97/</link>
      <pubDate>Tue, 16 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E6%A8%A1%E5%9D%97/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第十三课(模块1).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907164750_6602_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python模块&lt;/strong&gt;******&amp;gt; &amp;raquo;转到**&lt;a href=&#34;https://mubu.com/doc/2SBPS0hBq8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;********************&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11203235.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;************&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.什么是模块？&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1模块就是一系列工能的结合体
2模块的三种来源：
    1.内置的(python解释器自带)
    2.第三方的(别人写的)
    3.自定义的(你自己写的)
3模块的四种表现形式
    1.使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)
    2.已被编译为共享库或DLL的C或C++扩展(了解)
    3.包好一组模块的包：把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件，该文件夹称之为包) 包:一系列py文件的结合体
    4.使用C编写并链接到python解释器的内置模块
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2.为什么要用模块&lt;/strong&gt;**？**&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.从文件级别组织程序，更方便管理。
当多个文件中都需要使用相同的方法的时候 可以将该公共的方法写到一个py文件中，其他的文件以模块的形式导过去直接调用即可
2.拿来主义，提升开发效率
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3如何使用模块？&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.import的使用
    模块可以包含可执行的语句和函数的定义，这些语句的目的是初始化模块，它们只在模块名第一次遇到导入import语句时才执行
2.在第一次导入模块时会做三件事，重复导入会直接引用内存中已经加载好的结果
    1.首先创建一个执行文件(run.py)的名称空间，执行模块文件
在模块中定义的函数和方法若是使用到了global时访问的就是这个名称空间
    2.运行模块文件(md.py)中的代码将产生的名字与值存放到执行文件(run.py)的名称空间中
        在新创建的命名空间中执行模块中包含的代码
    3.在执行文件中产生一个执行指向名称空间的名字(md)
        创建名字来引用该命名空间
3from...import...句式缺点:
    1.访问模块中的名字不需要加模块名前缀
    2.在访问模块中的名字可能会与当前执行文件中的名字冲突
4补充知识点：
    __name__
        当文件被当做执行文件执行的时候__name__打印的结果是__main__
        当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)
    __all__
        __all__可以指定当所在py文件被当做模块导入的时候,可以限制导入者能够拿到的名字个数
    from md1 import *
        一次性将md1模块中的名字全部加载过来 不推荐使用 并且你根本不知道到底有哪些名字可以用
    异常有两大类
        1.语法结构错误:需要你当场修改 异常捕获没法完成
        2.逻辑错误:异常捕获可以处理
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4.循环导入&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.如果出现循环导入问题 那么一定是你的程序设计的不合理。循环导入问题应该在程序设计阶段就应该避免。
2.解决循环导入问题的方式
    1.方式1：将循环导入的句式写在文件最下方()
    2.方式2：函数内导入模块
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;5.模块的查找顺序&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.先从内存中找
2.再从内置中找
3.最后环境变量(sys.path)中找
    一定要分清楚谁是执行文件谁是被导入文件sys.path返回的是一个大列表,里面放了一对文件路径,第一个路径永远是执行文件所在的文件夹注意:py文件名不应该与模块名(内置的,第三方)冲突
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;6.绝对导入与相对导入&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1绝对导入
    绝对导入必须依据执行文件所在的文件夹路径为准
    绝对导入无论在执行文件中还是被导入文件都适用
2相对导入
    .代表的当前路径
    ..代表的上一级路径
    ...代表的是上上一级路径
    注意相对导入不能再执行文件中使用
    相对导入只能在被导入的模块中使用,使用相对导入就不需要考虑执行文件到底是谁，只需要知道模块与模块之间路径关系
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;7.软件开发规范&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】迭代器/生成器</title>
      <link>https://zhong-er.com/posts/python%E8%BF%AD%E4%BB%A3%E5%99%A8%E7%94%9F%E6%88%90%E5%99%A8/</link>
      <pubDate>Mon, 15 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E8%BF%AD%E4%BB%A3%E5%99%A8%E7%94%9F%E6%88%90%E5%99%A8/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第十二课(迭代器_生成器).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907152595_5668_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python迭代器/生成器&lt;/strong&gt;******&amp;gt; &amp;raquo;转到**&lt;a href=&#34;https://mubu.com/doc/3Hk6DuxYi8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11191167.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.迭代&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.1什么是迭代：&lt;/p&gt;
&lt;p&gt;更新换代(重复)的过程，每次迭代都必须基于上一次的结果&lt;/p&gt;
&lt;p&gt;1.2什么是迭代器：&lt;/p&gt;
&lt;p&gt;迭代取值的工具&lt;/p&gt;
&lt;p&gt;1.3为什么要有迭代器：&lt;/p&gt;
&lt;p&gt;迭代器提供了一种不依赖于索引取值的方式&lt;br&gt;
对于序列类型：字符串、列表、元组，我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的，若还想取出其内部包含的元素，则必须找出一种不依赖于索引的迭代方式，这就是迭代器&lt;/p&gt;
&lt;p&gt;1.4什么是可迭代对象：&lt;/p&gt;
&lt;p&gt;可迭代对象指的是内置有__iter__方法的对象，即obj.&lt;strong&gt;iter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.5什么是迭代器对象：&lt;/p&gt;
&lt;p&gt;可迭代对象执行obj.&lt;strong&gt;iter&lt;/strong&gt;()得到的结果就是迭代器对象。而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象。&lt;/p&gt;
&lt;p&gt;1.6注意：&lt;/p&gt;
&lt;p&gt;迭代器对象一定是可迭代对象，而可迭代对象不一定是迭代器对象&lt;/p&gt;
&lt;p&gt;需要迭代取值的数据类型：字符串str、列表list、元组tuple、字典dict、集合set、文件对象&lt;/p&gt;
&lt;p&gt;文件对象执行内置的__iter__之后还是本身 没有任何变化，文件对象本身就是迭代器对象&lt;/p&gt;
&lt;p&gt;针对双下线开头双下划线结尾的方法，推荐读:双下+方法名&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.迭代器取值：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;迭代器取值 调用__next__&lt;/p&gt;
&lt;p&gt;迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身&lt;/p&gt;
&lt;p&gt;2.1异常报错StopIteration：取完了&lt;/p&gt;
&lt;p&gt;2.2异常处理：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;while True: 
    try: 
        print(iter_d.__next__()) 
    except StopIteration: 
        print(&#39;老母猪生不动了&#39;)
    break
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.3迭代器取值的特点：只能往后依次取，不能后退&lt;/p&gt;
&lt;p&gt;2.4迭代器取值的优点：&lt;/p&gt;
&lt;p&gt;1.不依赖于索引取值&lt;/p&gt;
&lt;p&gt;2.内存中永远只占一份空间,不会导致内存溢出&lt;/p&gt;
&lt;p&gt;2.5迭代器取值的缺点：&lt;/p&gt;
&lt;p&gt;1.不能够获取指定的元素&lt;/p&gt;
&lt;p&gt;2.取完之后会报StopIteration错&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.for循环的本质&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.将in后面的对象调用__iter__转换成迭代器对象&lt;/p&gt;
&lt;p&gt;2.调用__next__迭代取值&lt;/p&gt;
&lt;p&gt;3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.生成器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;只要函数内部包含有yield关键字，那么函数名()的到的结果就是生成器，并且不会执行函数内部代码&lt;/p&gt;
&lt;p&gt;生成器就是迭代器，可以用__next__方法取值&lt;/p&gt;
&lt;p&gt;yield后面跟的值就是调用迭代器__next__方法你能得到的值&lt;/p&gt;
&lt;p&gt;yield既可以返回一个值也可以返回多个值，并且多个值也是按照元组的形式返回&lt;/p&gt;
&lt;p&gt;可以用.send给yield左边的变量传参，但必须先将代码运行至yield才能为期传值&lt;/p&gt;
&lt;p&gt;yeild&lt;/p&gt;
&lt;p&gt;1.帮你提供了一种自定义生成器方式&lt;/p&gt;
&lt;p&gt;2.会帮你将函数的运行状态暂停住&lt;/p&gt;
&lt;p&gt;3.可以返回值&lt;/p&gt;
&lt;p&gt;yeid与return异同:&lt;/p&gt;
&lt;p&gt;相同点：都可以返回值,并且都可以返回多个&lt;/p&gt;
&lt;p&gt;不同点：yield可以返回多次值,而return只能返回一次函数立即结束，yield还可以接受外部传入的值&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.生成器表达式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例如：res = (i for i in range(1,10) if i != 4)&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】函数</title>
      <link>https://zhong-er.com/posts/46-python%E5%87%BD%E6%95%B0/</link>
      <pubDate>Fri, 12 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/46-python%E5%87%BD%E6%95%B0/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第十一课(函数4).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907129002_6648_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python函数 &amp;raquo;&amp;gt;转到&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/1IPnO44N88&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11178851.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;递归函数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;函数在调用阶段直接或间接的又调用自身&lt;/p&gt;
&lt;p&gt;如果一个函数在内部调用自身本身，这个函数就是递归函数。&lt;/p&gt;
&lt;p&gt;举例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 举个例子，我们来计算阶乘n! = 1 x 2 x 3 x ... x n，用函数fact(n)表示，可以看出：
# fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
# 所以，fact(n)可以表示为n x fact(n-1)，只有n=1时需要特殊处理。
# 于是，fact(n)用递归的方式写出来就是：
def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)
# 如果我们计算fact(5)，可以根据函数定义看到计算过程如下：
===&amp;gt; fact(5)
===&amp;gt; 5 * fact(4)
===&amp;gt; 5 * (4 * fact(3))
===&amp;gt; 5 * (4 * (3 * fact(2)))
===&amp;gt; 5 * (4 * (3 * (2 * fact(1))))
===&amp;gt; 5 * (4 * (3 * (2 * 1)))
===&amp;gt; 5 * (4 * (3 * 2))
===&amp;gt; 5 * (4 * 6)
===&amp;gt; 5 * 24
===&amp;gt; 120
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扩展 import sys&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】装饰器</title>
      <link>https://zhong-er.com/posts/python%E8%A3%85%E9%A5%B0%E5%99%A8/</link>
      <pubDate>Fri, 12 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E8%A3%85%E9%A5%B0%E5%99%A8/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第十课(函数3).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907122677_6873_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python装饰器&lt;/strong&gt;&amp;gt; &amp;raquo;转到****&lt;a href=&#34;https://mubu.com/doc/IAt9WRlRa&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;********&lt;/a&gt;&lt;strong&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11178817.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;闭包函数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.定义在函数内部的函数&lt;/p&gt;
&lt;p&gt;2.内部函数内部函数引用了外部函数名称空间作用域的名字&lt;/p&gt;
&lt;p&gt;只要满足以上两点都叫做闭包函数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def func():
    name = jason&#39;  # 先在内部找name没有再往上层找 有了就停止查找
    def inner():
        print(name)  # 现在内部找name没有再往上层找
    return inner
f = func()  # f获取到的是inner的内存地址
f()  # 相当于执行 inner()
# 函数在定义阶段名字的查找孙旭就已经固定死了，不会因为函数调用位置的变化而变化
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;给函数传参的两种方式&lt;/p&gt;
&lt;p&gt;1.直接传参&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def index(name):
    print(name)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.闭包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def outter(name):
    # name = &#39;jason&#39;
    def index():
        print(name)
    return index
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;装饰器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;器：就是一个工具&lt;/p&gt;
&lt;p&gt;装饰：就是给被装饰对象添加新的功能&lt;/p&gt;
&lt;p&gt;开放封闭原则：&lt;/p&gt;
&lt;p&gt;开放：对扩展开放&lt;/p&gt;
&lt;p&gt;封闭：对修改封闭&lt;/p&gt;
&lt;p&gt;装饰器(可调用对象)必须遵循的两个原则：&lt;/p&gt;
&lt;p&gt;1.不改变被装饰对象的源代码&lt;/p&gt;
&lt;p&gt;2.不改变被装饰对象(可调用对象)调用方法&lt;/p&gt;
&lt;p&gt;可调用：callable&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def new():
    print(&#39;这是原始函数&#39;)

def outter(func):
    def inner():
        print(&#39;这是内部函数，这里可以加新功能&#39;)
        func()  # 这里的func是你想调用的最原始的函数的内存地址,加上()直接调用
        print(&#39;这是内部函数，这里可以加新功能&#39;)
    return inner  # 这里不加括号 返回的是inner函数的内存地址
new = outter(new)  # 括号内的new指向的是最原始的new函数的内存地址，前面的new获取的是outter函数的返回值，返回值我们自定义了返回 inner函数的内存地址
# 总结：前面的new获取的是inner的内存地址，后面括号内的new指向的就是最原始的new的内存地址
new()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扩展：import time&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】名称空间与作用域/函数的嵌套</title>
      <link>https://zhong-er.com/posts/python%E5%90%8D%E7%A7%B0%E7%A9%BA%E9%97%B4%E4%B8%8E%E4%BD%9C%E7%94%A8%E5%9F%9F%E5%87%BD%E6%95%B0%E7%9A%84%E5%B5%8C%E5%A5%97/</link>
      <pubDate>Wed, 10 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E5%90%8D%E7%A7%B0%E7%A9%BA%E9%97%B4%E4%B8%8E%E4%BD%9C%E7%94%A8%E5%9F%9F%E5%87%BD%E6%95%B0%E7%9A%84%E5%B5%8C%E5%A5%97/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第九课(函数2).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907105483_5533_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python名称空间与作用域/函数的嵌套&lt;/strong&gt;** &amp;raquo;&amp;gt;转到**&lt;a href=&#34;https://mubu.com/doc/25A0qDQkG8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;********&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到****&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11158059.html&#34;&gt;博客园&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;命名关键字参数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在函数定义阶段，写在*和**可变长参数之间的形参&lt;/p&gt;
&lt;p&gt;在给命名关键字参数传值的时候，只能用关键字为期传值&lt;/p&gt;
&lt;p&gt;在定义阶段 给你感觉好像是z是默认值参数，放在了m这个位置参数的前面了，应该报错&lt;/p&gt;
&lt;p&gt;其实z和m都是命名关键字参数，不是默认值参数和位置参数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def func(x,y=1,*args,z=3,m,**kwargs):
    print(x,y)
    print(args)
    print(z,m)
    print(kwargs)
func(1,2,1,2,3,4,5,6,7,78,8,9,0,z=69,m=999,o=666999,l = 999666)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;函数对象&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;函数是第一类对象：函数名指向的值可以被当中的参数传递&lt;/p&gt;
&lt;p&gt;1.函数名可以被传递&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name = &#39;jason&#39;
x = name
print(x)
print(id(x))
def func():
    print(&#39;from func&#39;)
# print(func)
print(id(func))
f = func

func()
print(f)
f()  # 其实指向的也是函数func指向函数体代码的内存地址
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.函数名可以被党组参数传递给其他函数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def func():
    print(&#39;from func&#39;)

def index(args):
    print(args)
    args()
    print(&#39;from index&#39;)
# index(1)
index(func)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3.函数名可以被当做函数的返回值&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def index():
    print(&#39;index&#39;)


def func():
    print(&#39;func&#39;)
    return index
res = func()
print(res)
res()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4.函数名可以被当做容器类型的参数&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】函数</title>
      <link>https://zhong-er.com/posts/43-python%E5%87%BD%E6%95%B0/</link>
      <pubDate>Tue, 09 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/43-python%E5%87%BD%E6%95%B0/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第八课(函数).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907099354_6068_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python函数 &lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/15Mo0f_bV8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/strong&gt;********&lt;/a&gt;&lt;strong&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11158059.html&#34;&gt;&lt;strong&gt;&lt;strong&gt;博客园&lt;/strong&gt;&lt;/strong&gt;****************&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;函数的返回值&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;函数内要想返回给调用者值 必须用关键字return&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不写return:函数默认返回None&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def func():
    print(&#39;hahaha&#39;)
res = func()
print(res)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;只写return:return除了可以返回值之外，还可以直接结束整个函数的运行&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;只写return 返回的也是None(None就表示什么都没有)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;只写return 返回的也是None(None就表示什么都没有)
def func():
    l = [&#39;jason&#39;,&#39;egon&#39;,&#39;tank&#39;]
    while True:
        for i in l:
            if i == &#39;egon&#39;:  # 当i为egon的时候 直接结束函数运行
                # break
                return
                # print(&#39;asdasdkljlsjadl&#39;)  # 这一行代码拥有都不会运行
            print(i)
res = func()
print(res)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;写return None:跟上面的只写return是一样的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def func():
    return None
res = func()
print(res)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;写return返回一个值:这个值可以是python任意数据类型&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def func():
    return &#39;123&#39;
def func1():
    return [1,2,3]
def func2():
    return {&#39;name&#39;:&#39;jason&#39;}
def func3():
    return (1,)
def func4():
    return {1,2,3,4,5}
def func5():
    return True
print(func(),func1(),func2(),func3(),func4(),func5())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;写return返回多个值:return会自动将多个值以元组的形式返回给调用者&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】文件操作/函数前戏</title>
      <link>https://zhong-er.com/posts/python%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0%E5%89%8D%E6%88%8F/</link>
      <pubDate>Mon, 08 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0%E5%89%8D%E6%88%8F/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第07课(文件操作_函数前戏).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908067592_1286_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python文件操作/函数前戏 &amp;raquo;&amp;gt;转到&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2qvfaKltq8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;********&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11151888.html&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;文件操作模式补充&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;+&amp;quot; 表示可以同时读写某个文件
r+， 读写【可读，可写】
w+，写读【可读，可写】
a+， 写读【可读，可写】
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件内光标移动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;一: read(3)：
1. 文件打开方式为文本模式时，代表读取3个字符
2. 文件打开方式为b模式时，代表读取3个字节
二: 其余的文件内光标移动都是以字节为单位如seek，tell，truncate
注意：
1. seek有三种移动方式0，1，2，其中1和2必须在b模式下进行，但无论哪种模式，都是以bytes为单位移动的
2. truncate是截断文件，所以文件的打开方式必须可写，但是不能用w或w+等方式打开，因为那样直接清空文件了，所以truncate要在r+或a或a+等模式下测试效果
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检测文件内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;with open(r&#39;test01.txt&#39;,&#39;rb&#39;) as f:
    # 先将光标移动到文件末尾
    f.seek(0,2)
    while True:
        res = f.readline()
        # 查看光标移动了多少位 bytes
        # print(f.tell())
        if res:
            print(&amp;quot;新增的文件内容:%s&amp;quot;%res.decode(&#39;utf-8&#39;))
            # 说明有人操作当前文件
        # else:
        #     # 说明文件没有被任何人操作
        #     print(&#39;暂无其他人操作该文件&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;截断文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;with open(r&#39;test&#39;,&#39;a&#39;,encoding=&#39;utf-8&#39;) as f:
    f.truncate(6)  # 接收的字节的长度 整型
    # 保留0~6字节数 后面的全部删除(截断)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改文件&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】字符编码/文件操作</title>
      <link>https://zhong-er.com/posts/python%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C/</link>
      <pubDate>Fri, 05 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C/</guid>
      <description>&lt;h2&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;Python第06课(字符编码_文件操作).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908063789_220_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python字符编码/文件操作 &amp;raquo;&amp;gt;转到&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2mwGPbqdZ8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11140402.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;字符编码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 字符编码针对的是文字。
# 字符编码只跟文本文件有关。
# 文本编辑器的输入和输出是两个过程。
# 字符编码表就是字符与数字的对应关系

ASCII码表 用八位二进制表示一个英文字符

GBK 用2Bytes表示一个中文字符，还是用1Bytes表示一个英文字母。最多能表示65535个字符

Unicode万国码 统一用2Bytes表示所有的字符
    1.浪费存储空间
    2.IO次数增加，程序运行效率降低(致命)
    
# 当内存中的unicode编码格式数据存到硬盘的时候，会按照utf-8编码

# 会将unicode的英文字符由原来的2Bytes变成1Bytes
# 会将unicode中文字符由原来的2Bytes变成3Bytes
# 现在的计算机内存都是unicode，硬盘都是utf-8

unicode的两个特点
    1.用户在输入的时候，无论输什么字符都能够兼容万国字符
    2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
    
# 数据由内存保存到硬盘
    内存中的unicode格式二进制数字 &amp;gt;&amp;gt;&amp;gt;编码(encode)&amp;gt;&amp;gt;&amp;gt;utf-8格式的二进制数据
# 硬盘中的数据由硬盘读到内存
    硬盘中的utf-8格式的二进制数据&amp;gt;&amp;gt;&amp;gt;解码(decode)&amp;gt;&amp;gt;&amp;gt;内存中unicode格式的二进制数据
    
# 保证不乱码在于文本文件以什么编码编的就以什么编码解

# python2将py文件按照文本文件读入解释器中默认使用ASCII码
# python3将py文件按照文本文件读入解释器中默认使用utf-8

# 文件头 # coding:utf-8 因为所有的编码都支持英文字符,所以文件头才能够正常生效
# python3中字符串默认就是unicode编码格式的二进制数
# pycharm终端用的是utf-8格式，windows终端采用的是gbk格式。

encode() # 将unicode编码成可以存储和传输的utf-8的二进制数据
# bytes类型  字节串类型  你就把它当成二进制数据即可
decode()  # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据

x = &#39;上&#39;
res1 = x.encode(&#39;gbk&#39;)  # 将unicode编码成可以存储和传输的utf-8的二进制数据
print(res1)  # b&#39;\xe4\xb8\x8a&#39;
# bytes类型  字节串类型  你就把它当成二进制数据即可
res2 = res1.decode(&#39;gbk&#39;)  # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据
print(res2)


# 补充:
# 你a他
# 1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes
# 1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;文件处理&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【问题记录】如何删除多系统引导菜单</title>
      <link>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E5%A4%9A%E7%B3%BB%E7%BB%9F%E5%BC%95%E5%AF%BC%E8%8F%9C%E5%8D%95/</link>
      <pubDate>Fri, 05 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E5%A4%9A%E7%B3%BB%E7%BB%9F%E5%BC%95%E5%AF%BC%E8%8F%9C%E5%8D%95/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;错误记录.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009035154_4969_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907059811_1071_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;win+r打开运行&lt;/p&gt;
&lt;p&gt;输入msconfig&lt;/p&gt;
&lt;p&gt;回车&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201907055973_1361_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击引导选项卡&lt;/p&gt;
&lt;p&gt;进一步设置引导&lt;/p&gt;
&lt;p&gt;可以选择不需要的系统进行删除，然后格式化磁盘，最终实现多系统的删除。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】列表/字典/元组/集合</title>
      <link>https://zhong-er.com/posts/python%E5%88%97%E8%A1%A8%E5%AD%97%E5%85%B8%E5%85%83%E7%BB%84%E9%9B%86%E5%90%88/</link>
      <pubDate>Thu, 04 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E5%88%97%E8%A1%A8%E5%AD%97%E5%85%B8%E5%85%83%E7%BB%84%E9%9B%86%E5%90%88/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第05课(数据类型5).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908067586_2449_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python列表/字典/元组/集合 &amp;raquo;&amp;gt;转到&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/3wTzttZOc8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;********&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11133594.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;列表list&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;count()用来统计列表某个元素的个数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; l = [1,2,3,4,5,6,7]
&amp;gt;&amp;gt;&amp;gt; res = l.count(8)
&amp;gt;&amp;gt;&amp;gt; print(res)
0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;clear()用来清除列表元素&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; res = l.clear()
&amp;gt;&amp;gt;&amp;gt; print(res)
None
&amp;gt;&amp;gt;&amp;gt; print(l)
[]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;reverse()用来将列表反转&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; l = [1,2,3,4,5,6,7]
&amp;gt;&amp;gt;&amp;gt; print(id(l))
2271674158920
&amp;gt;&amp;gt;&amp;gt; l.reverse()
&amp;gt;&amp;gt;&amp;gt; print(l)
[7, 6, 5, 4, 3, 2, 1]
&amp;gt;&amp;gt;&amp;gt; print(id(l))
2271674158920
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sort()按升序将列表元素排序&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; l.sort()
&amp;gt;&amp;gt;&amp;gt; print(l)
[1, 2, 3, 4, 5, 6, 7]
&amp;gt;&amp;gt;&amp;gt; print(id(l))
2271674158920
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;队列：先进先出&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】数据类型</title>
      <link>https://zhong-er.com/posts/python%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/</link>
      <pubDate>Wed, 03 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第04课(数据类型).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908064143_4756_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python数据类型 &amp;raquo;&amp;gt;转到&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/3BB-YIvKm8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11128314.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;整型(int)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用途：记录QQ号、手机号、身份证号等&lt;/p&gt;
&lt;p&gt;定义：age = 18&lt;/p&gt;
&lt;p&gt;常用操作+内置的方法&lt;/p&gt;
&lt;p&gt;int只能转存数字的字符串，小数点都不行&lt;/p&gt;
&lt;p&gt;进制转换&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; print(int(&#39;1100&#39;,2))  # 二进制转十进制  0,1
12
&amp;gt;&amp;gt;&amp;gt; print(int(&#39;14&#39;,8))  # 八进制转十进制  0-7
12
&amp;gt;&amp;gt;&amp;gt; print(int(&#39;c&#39;,16))  # 十六进制转十进制 0-9 A-F
12
# int可以传第一个参数，表示的是第一个参数到底是什么进制  然后转成十进制

&amp;gt;&amp;gt;&amp;gt; print(bin(12))  # 10进制转二进制
0b1100  # 0b1100  0b表示后面的数字是二进制数
&amp;gt;&amp;gt;&amp;gt; print(oct(12))  # 10进制转八进制
0o14  # 0o14  0o表示后面的数字是八进制数
&amp;gt;&amp;gt;&amp;gt; print(hex(12))  # 10进制转16进制
0xc  # 0xc  0x表示后面的数字是十六进制数
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有序：但凡有索引的数据都是有序的&lt;/p&gt;
&lt;p&gt;不可变：值改变的情况下，id一定变&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;浮点型(float)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用途：记录薪资、身高、体重等&lt;/p&gt;
&lt;p&gt;定义：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;salary = 1.1 # salary = float(1.1)

&amp;gt;&amp;gt;&amp;gt; res = float(&#39;1.11&#39;)
&amp;gt;&amp;gt;&amp;gt; print(type(res))
&amp;lt;class &#39;float&#39;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有序：但凡有索引的数据都是有序的&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】流程控制</title>
      <link>https://zhong-er.com/posts/python%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6/</link>
      <pubDate>Tue, 02 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第03课(流程控制).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908064421_9543_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python流程控制 &amp;raquo;&amp;gt;转到&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/3DKlGWgq58&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11120996.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;********&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;if判断&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;判断失误的对错，真假，是否可行&lt;/p&gt;
&lt;p&gt;固定语法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if 条件:
    代码1
    代码2
    代码3
    代码4
    ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;python的缩进表示代码的归属&lt;/p&gt;
&lt;p&gt;同一缩进的代码，称之为代码块&lt;/p&gt;
&lt;p&gt;补充：布尔值位False数据由哪些：0,None,&amp;rsquo; &amp;lsquo;,[ ],{ }&lt;/p&gt;
&lt;p&gt;布尔值也可以直接用来判断&lt;/p&gt;
&lt;p&gt;变量名也可以用来判断，因为变量名指向的值对应的就是True或False&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;else 语法&lt;/strong&gt; # 不能单独使用，必须和if，while，for配合使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if 条件:
    代码1
    代码2
    代码3
    代码4
    ...
else:  # 不能单独使用，必须和if，while，for配合使用
    代码1
    代码2
    代码3
    代码4
    ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;if elif else 语法&lt;/strong&gt; ：同一级别配合使用的时候，只会指向一个代码块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if 条件:
    代码1
    代码2
    代码3
    代码4
    ...
elif 条件:
    代码1
    代码2
    代码3
    代码4
    ...
else:  # 不能单独使用，必须和if，while，for配合使用
    代码1
    代码2
    代码3
    代码4
    ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;走了if就不会走elif else，走了elif就不会走else，if看到没走，走了else说明if elif都没走，都不满足if elif的条件&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Python】输入输出/数据类型/运算符</title>
      <link>https://zhong-er.com/posts/python%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E8%BF%90%E7%AE%97%E7%AC%A6/</link>
      <pubDate>Mon, 01 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E8%BF%90%E7%AE%97%E7%AC%A6/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第02课(输入输出_数据类型_运算符).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908066557_7614_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python输入输出/数据类型/运算符 &amp;raquo;&amp;gt;转到&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/SDSzaoBba&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;********&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11116171.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;********&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Python的注释&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单行注释# 和多行注释&amp;rsquo;&amp;rsquo;&amp;rsquo; &amp;rsquo;&amp;rsquo;&#39;&#39;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;输入&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;python3中的input全部存成字符串类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;python2中需要认为告诉input输入的什么数据类型&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt; name = input(&amp;lsquo;please input&amp;raquo;&amp;gt;:&amp;rsquo;)
please input&amp;raquo;&amp;gt;:jason
Traceback (most recent call last):
File &amp;ldquo;&lt;stdin&gt;&amp;quot;, line 1, in &lt;module&gt;
File &amp;ldquo;&lt;string&gt;&amp;quot;, line 1, in &lt;module&gt;
NameError: name &amp;lsquo;jason&amp;rsquo; is not defined
 name = input(&amp;lsquo;please input&amp;raquo;&amp;gt;:&amp;rsquo;)
please input&amp;raquo;&amp;gt;:&amp;rsquo;egon&amp;rsquo;
 name
&amp;rsquo;egon&amp;rsquo;
 type(name)
&amp;lt;type &amp;lsquo;str&amp;rsquo;&amp;gt;
 name = input(&amp;lsquo;please input&amp;raquo;&amp;gt;:&amp;rsquo;)
please input&amp;raquo;&amp;gt;:[1,2,3,4]
 name
[1, 2, 3, 4]
 type(name)
&amp;lt;type &amp;rsquo;list&amp;rsquo;&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;raw_input()会统一存为字符串&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt; name1 = raw_input(&amp;rsquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;:&amp;rsquo;)&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;:jason
 name1
&amp;lsquo;jason&amp;rsquo;
 type(name1)
&amp;lt;type &amp;lsquo;str&amp;rsquo;&amp;gt;
 name1 = raw_input(&amp;rsquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;&amp;raquo;:&amp;rsquo;)
:[1,2,3,4,5]
 name1
&amp;lsquo;[1,2,3,4,5]&amp;rsquo;
 type(name1)
&amp;lt;type &amp;lsquo;str&amp;rsquo;&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>【Python】计算机发展史/变量/垃圾回收机制</title>
      <link>https://zhong-er.com/posts/python%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%8F%91%E5%B1%95%E5%8F%B2%E5%8F%98%E9%87%8F%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6/</link>
      <pubDate>Fri, 28 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%8F%91%E5%B1%95%E5%8F%B2%E5%8F%98%E9%87%8F%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python第01课(计算机发展史_变量_垃圾回收.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908062863_1504_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python计算机发展史/变量/垃圾回收机制 &amp;raquo;&amp;gt;转到&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2rsFXAwli8&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;********&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;转到&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11103673.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;********&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11103673.html&#34; title=&#34;博客园&#34;&gt;****&lt;/a&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11103673.html&#34; title=&#34;博客园&#34;&gt;&lt;/a&gt;&lt;strong&gt;编程语言发展史&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;机器语言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;站在奴隶主的角度说奴隶主的话&lt;/p&gt;
&lt;p&gt;1.编译型(类似于谷歌翻译)&lt;/p&gt;
&lt;p&gt;2.解释型(类似于同声传译)&lt;/p&gt;
&lt;p&gt;PS:一次翻译之后，就可以拿着翻译之后的结果多次运行&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;汇编语言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用简单的英文标签来表示二进制数，直接操作硬件&lt;/p&gt;
&lt;p&gt;优点：开发效率高于机器语言&lt;/p&gt;
&lt;p&gt;缺点：执行效率较机器语言低&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;高级语言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;站在奴隶主的角度说奴隶主的话&lt;/p&gt;
&lt;p&gt;1.编译型(类似于谷歌翻译)&lt;/p&gt;
&lt;p&gt;一次翻译之后，就可以拿着翻译之后的结果多次运行&lt;/p&gt;
&lt;p&gt;编译的过程需要用到编译器&lt;/p&gt;
&lt;p&gt;优点：执行效率高&lt;/p&gt;
&lt;p&gt;缺点：开发效率低&lt;/p&gt;
&lt;p&gt;2.解释型(类似于同声传译)&lt;/p&gt;
&lt;p&gt;一行一行的翻译(读一行翻译一行)&lt;/p&gt;
&lt;p&gt;解释的过程需要用到解释器&lt;/p&gt;
&lt;p&gt;优点：开发效率高&lt;/p&gt;
&lt;p&gt;缺点：执行效率低&lt;/p&gt;
&lt;p&gt;PS:&lt;/p&gt;
&lt;p&gt;学习难度：高级语言&amp;raquo;&amp;gt;汇编语言&amp;raquo;&amp;gt;机器语言&lt;/p&gt;
&lt;p&gt;执行效率：机器语言&amp;raquo;&amp;gt;汇编语言&amp;raquo;&amp;gt;高级语言&lt;/p&gt;
&lt;p&gt;开发效率：机器语言&amp;raquo;&amp;gt;汇编语言&amp;raquo;&amp;gt;高级语言&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;python是解释型语言&lt;/p&gt;
&lt;p&gt;1.胶水语言&lt;/p&gt;
&lt;p&gt;2.调包侠&lt;/p&gt;
&lt;p&gt;python解释器，环境变量配置，多版本共存&lt;/p&gt;
&lt;p&gt;在IT行业不要贸然尝试用最新版本的软件！！！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一个Python程序&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.交互式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;优点：输入内容立刻就有对应的返回结果&lt;/p&gt;
&lt;p&gt;缺点：无法永久保存数据&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.命令行(文件形式)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;优点：可以永久保存数据&lt;/p&gt;
&lt;p&gt;缺点：暂时来看运行该文件有点麻烦&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PS：文件后缀名&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;仅仅是给人看的&lt;/p&gt;
&lt;p&gt;你所认为的不同的文件后缀有不同的功能那是程序员自己写的&lt;/p&gt;
&lt;p&gt;python文件默认的后缀名就是.py结尾&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;运行一个py文件需要走的步骤(&lt;/strong&gt;*&lt;strong&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.将python解释器代码从硬盘督导内存(就等价于双击了word图标)&lt;/p&gt;
&lt;p&gt;2.将你写好的py文件由应哦按读到内存(就等价于你双击了一个word文档)&lt;/p&gt;
&lt;p&gt;3.解释器解释读取py文件中的内容，解释成计算机能够识别的语句(如果是一个普通文本文件，仅仅只会将文件内容展示到屏幕上给用户查看，不会检测翻译文件内容)&lt;/p&gt;
&lt;p&gt;PS:Pyhon解释器与普通文本编辑器前面两步是一毛一样的，仅仅第三步不一样(一个是解释语法，一个是文本展示)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;变量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.什么是变量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;量：衡量/记录事物的状态/特征&lt;/p&gt;
&lt;p&gt;变：状态/特征是可以变化的&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.为什么要有变量？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;帮助你记录保存事物的某种状态或特征&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.变量的定义&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1.只能包含数字，字母，下划线&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;2.数字不能开头&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;3.关键字不能作为变量名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;变量必须先定义后调用(使用)，变量名不要加引号&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.变量额三要素&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. id():返回的是一串数字&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;2. type():返回的是该变量对应的主句的类型&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;3. value:该变量指向的内存当中数据的值&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>【Python】计算机组成原理/编程语言</title>
      <link>https://zhong-er.com/posts/python%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/</link>
      <pubDate>Thu, 27 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/python%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Python学前准备课(计算机组成原理_编程语言).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908067099_3043_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python是一门编程语言 &amp;raquo;&amp;gt;转到&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/17ZnX4ax0a&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;** &amp;raquo;&amp;gt;转到**&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11098821.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编程&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.&lt;em&gt;&lt;strong&gt;什么是编程&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;编写程序，谁来编写，人来编写。&lt;/p&gt;
&lt;p&gt;将自己的思维逻辑和想法通过计算机能够识别的语言写下，告诉计算机按照你的思维逻辑去帮你干活。&lt;/p&gt;
&lt;p&gt;编程的最终结果就是一丢文件。&lt;/p&gt;
&lt;p&gt;2.&lt;em&gt;&lt;strong&gt;为什么要编程&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;让计算机能够按照你的思维逻辑去工作，解放人力！！！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;汉语，日语，英语，法语，德育&lt;/p&gt;
&lt;p&gt;事物与事物之间沟通交流的媒介&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;操作系统：（windows,linux,unix&amp;hellip;）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.操作系统是帮你操作计算机硬件的，它帮你封装好了一系列操作硬件的方法。&lt;/p&gt;
&lt;p&gt;2.程序员只需要按照操作系统提供的操作方法即可简介操作硬件。&lt;/p&gt;
&lt;p&gt;3.一套完整的计算机系统由一下三部分组成&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1.应用程序&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;2.操作系统（中间人）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;3.计算机硬件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ps:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1.程序员开发的程序都叫做应用程序。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;2.操作系统也是应用程序,但是它针对的是计算机硬件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;操作系统也是一款应用软件，但是它是针对计算机硬件的，将复杂丑陋的操作封装起来，暴露给用户简单快捷的操作接口，帮助你协调，管理，调度计算机各个硬件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;计算机五大组成部分&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.&lt;strong&gt;&lt;em&gt;控制器&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2.&lt;strong&gt;&lt;em&gt;运算器&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;控制器+运算器=计算机中央处理器（CPU）&lt;/p&gt;
&lt;p&gt;3.&lt;strong&gt;&lt;em&gt;存储器&lt;/em&gt;&lt;/strong&gt; ：计算机存储系统&lt;/p&gt;
&lt;p&gt;内存&lt;/p&gt;
&lt;p&gt;基于电工作的，通电数据正常读取，一旦断电数据即可丢失。&lt;/p&gt;
&lt;p&gt;优点：读取速度快&lt;/p&gt;
&lt;p&gt;缺点：断电数据丢失&lt;/p&gt;
&lt;p&gt;外存&lt;/p&gt;
&lt;p&gt;优点：能够永久保存数据&lt;/p&gt;
&lt;p&gt;缺点：读取速度慢&lt;/p&gt;
&lt;p&gt;4.&lt;strong&gt;&lt;em&gt;输入设备&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;键盘，鼠标，触摸屏&lt;/p&gt;
&lt;p&gt;5.&lt;strong&gt;&lt;em&gt;输出设备&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;显示器，音响，打印机&lt;/p&gt;
&lt;p&gt;ps:&lt;/p&gt;
&lt;p&gt;输入设备也称input&lt;/p&gt;
&lt;p&gt;输出设备也称output&lt;/p&gt;
&lt;p&gt;存储器也可以叫着IO设备&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;计算机三大核心组件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.&lt;strong&gt;&lt;em&gt;CPU&lt;/em&gt;&lt;/strong&gt; ：大脑&lt;/p&gt;
&lt;p&gt;2.&lt;strong&gt;&lt;em&gt;内存&lt;/em&gt;&lt;/strong&gt; ：短期记忆&lt;/p&gt;
&lt;p&gt;3.&lt;strong&gt;&lt;em&gt;硬盘&lt;/em&gt;&lt;/strong&gt; ：永远不会消失的本子&lt;/p&gt;
&lt;p&gt;计算机是基于电工作的，而电信号只有高低电频两种状态0和1，计算机里面存储的都是0101的二进制数据。&lt;/p&gt;
&lt;p&gt;CPU工作流程：选取内存中读取命令，将命令解析翻译成自己能够对应上的操作步骤，控制硬件执命令。&lt;/p&gt;
&lt;p&gt;简单指令集&lt;/p&gt;
&lt;p&gt;复杂指令集&lt;/p&gt;
&lt;p&gt;x86架构&lt;/p&gt;
&lt;p&gt;CPU到内存中获取数据最多读32位&lt;/p&gt;
&lt;p&gt;64位 32位&lt;/p&gt;
&lt;p&gt;64位向下兼容32位的软件&lt;/p&gt;
&lt;p&gt;而32位不能够兼容64的软件&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;存储器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;寄存器&lt;/strong&gt;&lt;/em&gt; ：cpu下一步即将要用到的数据（容量小）&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;高速缓存&lt;/strong&gt;&lt;/em&gt; ：将经常需要用到的容量比较小的数据存储在高速缓存&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;内存&lt;/strong&gt;&lt;/em&gt; ：cpu获取数据的主力还是内存&lt;/p&gt;</description>
    </item>
    <item>
      <title>【脚本】OpenVZ安装BBR加速</title>
      <link>https://zhong-er.com/posts/%E8%84%9A%E6%9C%ACopenvz%E5%AE%89%E8%A3%85bbr%E5%8A%A0%E9%80%9F/</link>
      <pubDate>Tue, 18 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E8%84%9A%E6%9C%ACopenvz%E5%AE%89%E8%A3%85bbr%E5%8A%A0%E9%80%9F/</guid>
      <description>&lt;p&gt;vps管理面板打开TUN/TAP&lt;/p&gt;
&lt;p&gt;一般在vps管理面板里就可以打开，如果找不到，请联系咨询客服。&lt;/p&gt;
&lt;p&gt;判断是否成功打开TUN/TAP&lt;/p&gt;
&lt;p&gt;cat /dev/net/tun&lt;/p&gt;
&lt;p&gt;返回值如下即为打开成功&lt;/p&gt;
&lt;p&gt;File descriptor in bad state&lt;/p&gt;
&lt;p&gt;如果本机glibc小于2.14，先更新glibc&lt;/p&gt;
&lt;p&gt;ldd &amp;ndash;version&lt;/p&gt;
&lt;p&gt;如果小于2.14，则需要编译安装新版本&amp;gt;2.14&lt;/p&gt;
&lt;p&gt;先安装gcc&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yum install gcc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再编译glibc&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget http://ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gz
wget http://ftp.gnu.org/gnu/glibc/glibc-ports-2.15.tar.gz
tar -zxf glibc-2.15.tar.gz
tar -zxf glibc-ports-2.15.tar.gz
mv glibc-ports-2.15 glibc-2.15/ports
mkdir glibc-build-2.15
cd glibc-build-2.15
../glibc-2.15/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make all &amp;amp;&amp;amp; make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装BBR&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget https://raw.githubusercontent.com/kuoruan/shell-scripts/master/ovz-bbr/ovz-bbr-installer.sh
chmod +x ovz-bbr-installer.sh
./ovz-bbr-installer.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置加速端口&lt;/p&gt;
&lt;p&gt;安装的时候只配置了一个加速端口，但是你可以配置多端口加速，修改文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi /usr/local/haproxy-lkl/etc/port-rules
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在文件里添加需要加速的端口，每行一条，可以配置单个端口或者端口范围，配置完后需要重启haproxy-lkl&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;service haproxy-lkl restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要卸载：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./ovz-bbr-installer.sh uninstall
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查BBR是否正常&lt;/p&gt;</description>
    </item>
    <item>
      <title>【win10】1903 Pro 私人定制版封装首发</title>
      <link>https://zhong-er.com/posts/win101903-pro-%E7%A7%81%E4%BA%BA%E5%AE%9A%E5%88%B6%E7%89%88%E5%B0%81%E8%A3%85%E9%A6%96%E5%8F%91/</link>
      <pubDate>Mon, 10 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/win101903-pro-%E7%A7%81%E4%BA%BA%E5%AE%9A%E5%88%B6%E7%89%88%E5%B0%81%E8%A3%85%E9%A6%96%E5%8F%91/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;win10.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201906105992_5552_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2019-9-5 20:00&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;鉴于，1903BUG出奇的多，暂时不要使用了，使用1809版本吧&lt;/p&gt;
&lt;p&gt;1809最新版会提示更新1903，先不要点立即下载了，等几个月这个版本稳定了再用&lt;/p&gt;
&lt;p&gt;【win10】1903 Pro 私人定制版封装首发 2019 系列（一）&lt;/p&gt;
&lt;p&gt;本系列同步win10更新而更迭版本，本次首发版考虑到部分office365订阅用户需求（博主也在用），未安装office软件。需要安装office2019的用户请等待第二版更新，有其他需求的用户欢迎评论区定制，博主会综合用户需求进行相应版本分支的封装。&lt;/p&gt;
&lt;p&gt;此次封装的常用软件请参考上图，&lt;/p&gt;
&lt;p&gt;封装设置优化包含：&lt;/p&gt;
&lt;p&gt;1.Windows设置优化&lt;/p&gt;
&lt;p&gt;2.控制面板优化&lt;/p&gt;
&lt;p&gt;3.服务项优化&lt;/p&gt;
&lt;p&gt;4.组策略优化&lt;/p&gt;
&lt;p&gt;5.添加摄像头补丁&lt;/p&gt;
&lt;p&gt;6.软媒美化大师优化&lt;/p&gt;
&lt;p&gt;7.软媒设置大师优化&lt;/p&gt;
&lt;p&gt;8.DISM++优化&lt;/p&gt;
&lt;p&gt;9.联网更新系统&lt;/p&gt;
&lt;p&gt;10.软媒清理大师清理&lt;/p&gt;
&lt;p&gt;11.DISM++清理&lt;/p&gt;
&lt;p&gt;具体请参看&lt;a href=&#34;https://www.itsk.com/&#34; title=&#34;IT天空&#34;&gt;IT天空&lt;/a&gt;论坛的封装教程&lt;/p&gt;
&lt;p&gt;使用过程如有报错请及时反馈。&lt;/p&gt;
&lt;p&gt;下载地址&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pan.baidu.com/s/1BsmT9CxTgSvwtHYDd49Hpg&#34; title=&#34;点击下载&#34;&gt;win10定制&lt;/a&gt;大小：3.83G | 来源：百度网盘&lt;/p&gt;
&lt;p&gt;已经过安全软件检测无毒，请您放心下载。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pan.baidu.com/s/1BsmT9CxTgSvwtHYDd49Hpg&#34; title=&#34;点击下载&#34;&gt; &lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【脚本】BBR原版/魔改/Plus/锐速四合一加速脚本</title>
      <link>https://zhong-er.com/posts/%E8%84%9A%E6%9C%ACbbr%E5%8E%9F%E7%89%88%E9%AD%94%E6%94%B9plus%E9%94%90%E9%80%9F%E5%9B%9B%E5%90%88%E4%B8%80%E5%8A%A0%E9%80%9F%E8%84%9A%E6%9C%AC/</link>
      <pubDate>Tue, 04 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E8%84%9A%E6%9C%ACbbr%E5%8E%9F%E7%89%88%E9%AD%94%E6%94%B9plus%E9%94%90%E9%80%9F%E5%9B%9B%E5%90%88%E4%B8%80%E5%8A%A0%E9%80%9F%E8%84%9A%E6%9C%AC/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;一键脚本.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032503_7089_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;BBR是来自于Google的黑科技，目的是通过优化和控制TCP的拥塞，充分利用带宽并降低延迟，起到神奇般的加速效果。在BBR出来之前，就只有锐速比较好用，但是锐速是一个国产的闭源软件。&lt;/p&gt;
&lt;p&gt;有些朋友会担心是否会有有害代码的问题。不过BBR就是一个开源在GITHUB的项目。前面我已经介绍过了&lt;a href=&#34;%7B#ZC_BLOG_HOST#%7Dpost/24.html&#34; title=&#34;【脚本】服务器加速BBR脚本安装&#34;&gt;《【脚本】服务器加速BBR脚本安装》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;BBR在大部分的时间都是比较好用的。但是偶尔也会在某些机器，某些线路上面的效果不明显。&lt;/p&gt;
&lt;p&gt;这里就给大家推荐某大佬修改的一键脚本，集成了BBR原版/魔改/plus+锐速的四合一脚本。&lt;/p&gt;
&lt;p&gt;项目开源地址：&lt;a href=&#34;https://github.com/cx9208/Linux-NetSpeed&#34;&gt;https://github.com/cx9208/Linux-NetSpeed&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;脚本安装命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget &amp;quot;https://github.com/cx9208/Linux-NetSpeed/raw/master/tcp.sh&amp;quot; &amp;amp;&amp;amp; chmod +x tcp.sh &amp;amp;&amp;amp; ./tcp.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在vultr上Centos 7, Debian 8/9, Ubuntu 16/18测试通过,&lt;strong&gt;不支持ovz虚拟方式的vps&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;google cloud实机也测试通过。&lt;/p&gt;
&lt;p&gt;oracle centos7 暂时无法安装，oracle其他系统未测试&lt;/p&gt;
&lt;p&gt;Oracle的Ubuntu可以直接bbr，但centos需要执行以下命令否则报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 切换成 root  
2. 重新生成 grub2.cfg， 命令如下：  
grub2-mkconfig -o /boot/grub2/grub.cfg  
3. 跑你要跑的 bbr.sh  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt=&#34;QQ截图20190227204001.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201906044487_8147_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;1.先选择1-3在切换内核（第一次显示为bbr内核也要切换一遍），重启&lt;/p&gt;
&lt;p&gt;2. 重启后不用再下载脚本，直接 ./tcp.sh ，在[4 – 8]中选你要开的加速&lt;/p&gt;
&lt;p&gt;“1. 安装 BBR/BBR魔改版内核” 对应4,5,6（原版，魔改，暴力魔改）&lt;br&gt;
“2. 安装 BBRplus版内核 ” 对应7（plus）&lt;br&gt;
“3. 安装 Lotserver(锐速)内核” 对应8（锐速）&lt;/p&gt;
&lt;p&gt;3. 开启后再 ./tcp.sh ， 显示开启成功则启动成功，你也可以自己手动确认&lt;/p&gt;
&lt;p&gt;现在你可以自由的切换你想要的加速，直到你不想折腾为止~&lt;/p&gt;
&lt;p&gt;END&lt;/p&gt;</description>
    </item>
    <item>
      <title>【脚本】一键卸载安骑士脚本 屏蔽阿里云ECS以及腾讯云后台监控</title>
      <link>https://zhong-er.com/posts/%E8%84%9A%E6%9C%AC%E4%B8%80%E9%94%AE%E5%8D%B8%E8%BD%BD%E5%AE%89%E9%AA%91%E5%A3%AB%E8%84%9A%E6%9C%AC-%E5%B1%8F%E8%94%BD%E9%98%BF%E9%87%8C%E4%BA%91ecs%E4%BB%A5%E5%8F%8A%E8%85%BE%E8%AE%AF%E4%BA%91%E5%90%8E%E5%8F%B0%E7%9B%91%E6%8E%A7/</link>
      <pubDate>Mon, 27 May 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E8%84%9A%E6%9C%AC%E4%B8%80%E9%94%AE%E5%8D%B8%E8%BD%BD%E5%AE%89%E9%AA%91%E5%A3%AB%E8%84%9A%E6%9C%AC-%E5%B1%8F%E8%94%BD%E9%98%BF%E9%87%8C%E4%BA%91ecs%E4%BB%A5%E5%8F%8A%E8%85%BE%E8%AE%AF%E4%BA%91%E5%90%8E%E5%8F%B0%E7%9B%91%E6%8E%A7/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;一键脚本.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032503_7089_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;国内的服务器：阿里云、腾讯云的服务器跟百度云加速都自带监控，它会自动检测你的文章内容跟URL。&lt;/p&gt;
&lt;p&gt;你可能会发现有些网站或者出现关键字会被扫描到提示不安全内容，而且可能会被自动屏蔽这篇文章的URL，甚至要求我们删除这篇文章。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cdn.laod.wang/wp-content/uploads/2017/03/20170309165219.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;20170309165219.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905271925_5798_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;比如阿里云：&lt;/p&gt;
&lt;p&gt;打开这个页面就可以看到你的阿里云被屏蔽的所有页面：&lt;a href=&#34;https://yundun.console.aliyun.com/?p=sc#/sc/fine&#34;&gt;https://yundun.console.aliyun.com/?p=sc#/sc/fine&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;阿里云&#34;&gt;阿里云：&lt;/h2&gt;
&lt;p&gt;一、卸载安骑士&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh
chmod x quartz_uninstall.sh
./quartz_uninstall.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;二、删除残留文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rm -rf /etc/init.d/agentwatch /usr/sbin/aliyun-service
rm -rf /usr/local/aegis*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三、屏蔽云盾&lt;/p&gt;
&lt;p&gt;同时，云盾也是需要屏蔽掉的，这里我们直接将云盾的IP段屏蔽到iptables中。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iptables -I INPUT -s 140.205.201.0/28 -j DROP
iptables -I INPUT -s 140.205.201.16/29 -j DROP
iptables -I INPUT -s 140.205.201.32/28 -j DROP
iptables -I INPUT -s 140.205.225.192/29 -j DROP
iptables -I INPUT -s 140.205.225.200/30 -j DROP
iptables -I INPUT -s 140.205.225.184/29 -j DROP
iptables -I INPUT -s 140.205.225.183/32 -j DROP
iptables -I INPUT -s 140.205.225.206/32 -j DROP
iptables -I INPUT -s 140.205.225.205/32 -j DROP
iptables -I INPUT -s 140.205.225.195/32 -j DROP
iptables -I INPUT -s 140.205.225.204/32 -j DROP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入之后然后保存iptables，这样就完成了屏蔽阿里云安骑士，以及云盾。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【脚本】Linux系统服务器性能跑分测试脚本/UnixBench一键跑分测试脚本</title>
      <link>https://zhong-er.com/posts/%E8%84%9A%E6%9C%AClinux%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%80%A7%E8%83%BD%E8%B7%91%E5%88%86%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%ACunixbench%E4%B8%80%E9%94%AE%E8%B7%91%E5%88%86%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%AC/</link>
      <pubDate>Mon, 20 May 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E8%84%9A%E6%9C%AClinux%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%80%A7%E8%83%BD%E8%B7%91%E5%88%86%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%ACunixbench%E4%B8%80%E9%94%AE%E8%B7%91%E5%88%86%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%AC/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;一键脚本.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032503_7089_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;UnixBench是一款开源的用于测试Unix、BSD、Linux系统基本性能的工具，比较通用于Linux系统VPS性能测试，主要测试项目有：系统调用、读写、进程、图形化测试、2D、3D、管道、运算、C库等系统基准性能提供测试数据。&lt;/p&gt;
&lt;h2 id=&#34;一脚本命令&#34;&gt;一、脚本命令&lt;/h2&gt;
&lt;p&gt;如果你想使用UnixBench测试你的服务器性能，请使用SSH工具连接你的服务器后执行下面命令。脚本默认使用UnixBench5.1.3版本，因为大多VPS都没有显卡或者是集成显卡，不需要进行图像性能测试，所以作者注释了关于graphic的测试项。此脚本运行测试时间大约10-30分钟，跑分结束后得分越高性能越好。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget --no-check-certificate https://github.com/wn789/unixbench/blob/master/unixbench.sh 
chmod +x unixbench.sh
./unixbench.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;二测试效果&#34;&gt;二、测试效果&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: vmu8i5vg.hostflyte.com: GNU/Linux
   OS: GNU/Linux -- 3.10.0-862.6.3.el7.x86_64 -- #1 SMP Tue Jun 26 16:32:21 UTC 2018
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap=&amp;quot;UTF-8&amp;quot;, collate=&amp;quot;UTF-8&amp;quot;)
   CPU 0: Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz (5200.0 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   02:55:47 up 3 days, 10:29,  1 user,  load average: 0.00, 0.17, 0.39; runlevel 3

------------------------------------------------------------------------
Benchmark Run: Mon May 20 2019 02:55:47 - 03:24:31
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       20693875.6 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3391.4 MWIPS (10.0 s, 7 samples)
Execl Throughput                               1960.6 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        306812.9 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           85444.0 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        820093.2 KBps  (30.0 s, 2 samples)
Pipe Throughput                              489059.0 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 101501.3 lps   (10.0 s, 7 samples)
Process Creation                               6539.4 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   2674.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    364.4 lpm   (60.1 s, 2 samples)
System Call Overhead                         427380.5 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   20693875.6   1773.3
Double-Precision Whetstone                       55.0       3391.4    616.6
Execl Throughput                                 43.0       1960.6    456.0
File Copy 1024 bufsize 2000 maxblocks          3960.0     306812.9    774.8
File Copy 256 bufsize 500 maxblocks            1655.0      85444.0    516.3
File Copy 4096 bufsize 8000 maxblocks          5800.0     820093.2   1414.0
Pipe Throughput                               12440.0     489059.0    393.1
Pipe-based Context Switching                   4000.0     101501.3    253.8
Process Creation                                126.0       6539.4    519.0
Shell Scripts (1 concurrent)                     42.4       2674.3    630.7
Shell Scripts (8 concurrent)                      6.0        364.4    607.4
System Call Overhead                          15000.0     427380.5    284.9
                                                                   ========
System Benchmarks Index Score                                         584.6



======= Script description and score comparison completed! =======
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本脚本适用于CentOS的下载脚本、&lt;/p&gt;</description>
    </item>
    <item>
      <title>【脚本】服务器加速BBR脚本安装</title>
      <link>https://zhong-er.com/posts/%E8%84%9A%E6%9C%AC%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8A%A0%E9%80%9Fbbr%E8%84%9A%E6%9C%AC%E5%AE%89%E8%A3%85/</link>
      <pubDate>Mon, 20 May 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E8%84%9A%E6%9C%AC%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8A%A0%E9%80%9Fbbr%E8%84%9A%E6%9C%AC%E5%AE%89%E8%A3%85/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;一键脚本.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009032503_7089_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;下载.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905201401_6528.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;通过脚本一键升级内核并安装BBR加速.&lt;/p&gt;
&lt;p&gt;Linux系统中root用户拥有最高权限, 出于安全考虑, GCP默认是以普通用户登录的, 我们需要先切换到root用户, 否则运行某些命令时会提示无权限.&lt;/p&gt;
&lt;p&gt;先切换到root用户.&lt;br&gt;
Xshell连上服务器后, 输入命令:&lt;br&gt;
&lt;code&gt;sudo -i&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;切换后, 命令前面的提示符中也会显示root&lt;/p&gt;
&lt;p&gt;依次运行以下4条命令 (输完一条记得按回车呀)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yum install -y wget 

wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh

chmod +x bbr.sh

./bbr.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果遇到问题, 记得看提示!&lt;/p&gt;
&lt;p&gt;安装完成后，脚本会提示需要重启VPS，输入 &lt;code&gt;y&lt;/code&gt; 并&lt;code&gt;回车&lt;/code&gt;后重启, 这时Xshell连接也会自动断开。&lt;/p&gt;
&lt;p&gt;VPS重启可能需要几分钟, 耐心等待一下.&lt;/p&gt;
&lt;p&gt;重启完成后，再用Xhell重新连接VPS, &lt;code&gt;sudo -i&lt;/code&gt;切换到root用户.&lt;/p&gt;
&lt;p&gt;现在验证一下是否成功安装了最新内核并开启BBR.&lt;br&gt;
输入以下命令：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;uname -r&lt;/code&gt;&lt;br&gt;
查看内核版本，如果返回值含有4.13或以上版本, 就表示OK了.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;bbr.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905206557_6888.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sysctl net.ipv4.tcp_available_congestion_control&lt;/code&gt;&lt;br&gt;
返回值一般为：&lt;br&gt;
net.ipv4.tcp_available_congestion_control = bbr cubic reno&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sysctl net.ipv4.tcp_congestion_control&lt;/code&gt;&lt;br&gt;
返回值一般为：&lt;br&gt;
net.ipv4.tcp_congestion_control = bbr&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sysctl net.core.default_qdisc&lt;/code&gt;&lt;br&gt;
返回值一般为：&lt;br&gt;
net.core.default_qdisc = fq&lt;/p&gt;
&lt;p&gt;&lt;code&gt;lsmod | grep bbr&lt;/code&gt;&lt;br&gt;
返回值有 tcp_bbr 模块即说明bbr已启动。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【菲律宾电话卡】Globe电话卡</title>
      <link>https://zhong-er.com/posts/%E8%8F%B2%E5%BE%8B%E5%AE%BE%E7%94%B5%E8%AF%9D%E5%8D%A1globe%E7%94%B5%E8%AF%9D%E5%8D%A1/</link>
      <pubDate>Mon, 06 May 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E8%8F%B2%E5%BE%8B%E5%AE%BE%E7%94%B5%E8%AF%9D%E5%8D%A1globe%E7%94%B5%E8%AF%9D%E5%8D%A1/</guid>
      <description>&lt;h2 id=&#34;购买globe电话卡&#34;&gt;购买Globe电话卡&lt;/h2&gt;
&lt;p&gt;在菲律宾当地711或者街边小店可以买到Globe电话卡，不过一般存货不多，不会超过20张，有两个类型，一个是原装Globe，另外一种叫Globe Switch，使用过程中没发现有什么大的区别，唯一区别就是拨打143弹出的菜单顺序不一样。如图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;globe.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905067151_9475.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;有需要电话卡的可联系我。&lt;/p&gt;
&lt;h2 id=&#34;globe电话卡充值&#34;&gt;Globe电话卡充值&lt;/h2&gt;
&lt;p&gt;我一般使用GCash电子钱包给菲律宾的电话卡充值，10P起充，无手续费。使用GCash充值还打折，一般是95折。即充值10P只收9.5P。&lt;/p&gt;
&lt;p&gt;GCash的使用我会再写一篇，随后附上。&lt;/p&gt;
&lt;p&gt;也可以微信搜索：优行旅游 或 Youxing-Travel 关注微信公众号：优行旅游 在线微信支付进行充值。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;扫码预约&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905064783_9975_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;话费充值&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905062959_5193_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;选择号码&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905064165_794_1.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;globe电话卡套餐&#34;&gt;Globe电话卡套餐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;流量套餐&lt;br&gt;
60M免费流量 发送短信FREE到8080即可获得，有效期一天。&lt;br&gt;
7天无限流量 发送短信SUPERSURF250到8080，费用250P&lt;br&gt;
7天2G流量 发送短信GOTSCOMBODD90到8080，费用90P&lt;br&gt;
7天1G流量 发送短信GOTSCOMBODD70到8080，费用70P&lt;br&gt;
5天无限流量 发送短信SUPERSURF200到8080，费用200P&lt;br&gt;
3天1G流量 发送短信GoSurf50到8080，费用50P&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;语音短信套餐&lt;br&gt;
20分钟中国通话 发送GOTIPIDD50到8080，费用50P，有效期7天&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上面说的都是菲律宾当地的电话、流量套餐，国内不适用。&lt;/p&gt;
&lt;h2 id=&#34;globe漫游费用&#34;&gt;Globe漫游费用&lt;/h2&gt;
&lt;p&gt;菲律宾globe电话卡可以在国内使用，漫游后的服务商为中国联通或者中国移动，无月租费，不使用不要钱，打电话120 pesos每分钟，接听电话60 pesos每分钟，发短信20 pesos一条，接收短信免费。充值后有效期为一年，充值10P可延长一年。当手机卡内余额多于60P时，在国内才可以被拨通；当余额多于120P时才可以拨出电话。&lt;/p&gt;
&lt;p&gt;使用Globe电话卡在国内漫游上网？可以上网，但是费用很高，我了解到的情况是：599PHP一天，大约80人民币，不限流量。1150人民币包月，估计没有人会这么干吧。菲律宾Smart电话卡也可以，130买5天的1G流量包。家里有矿的朋友可以试试。&lt;/p&gt;
&lt;p&gt;所以在国内使用的话，还是要先关闭移动数据网。&lt;/p&gt;
&lt;h2 id=&#34;globe查话费和流量&#34;&gt;Globe查话费和流量&lt;/h2&gt;
&lt;p&gt;使用装有Globe手机卡的电话拨打功能强大的 *143#，弹出以下菜单：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;menu.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905063485_525_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;回复2，然后再回复2，继续回复1即可查询本机号码余额及有效期。如图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;balance.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905067653_3433_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;其他功能：一切有关GCash电子钱包的操作也可以在这个菜单里实现，还能开通流量套餐。路径：5 Surfing–&amp;gt;1 GoSURF–&amp;gt;可选&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;GoSurf15 2天40M流量，费用15P&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GoSurf50 3天1G流量，费用50P，送2GB看视频、听音乐、打游戏和社交流量&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GoSurf299 30天1.5G流量，费用299P&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GoSurf599 30天4G流量，费用599P&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GoSurf999 30天8G流量，费用999P&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其中视频是YouTube、 HOOQ、Netflix，音乐是Spotify，游戏有:Clash royale,Arena of Valor和Clash Of Clans，社交软件有:Instagram,Facebook,Snapchat,Viber,Twitter&lt;/p&gt;
&lt;p&gt;如果要查流量的使用情况，路径是:5 Surfing–&amp;gt;4 GS Status 流量使用情况会以短信的形式发到你的手机上。或者下载手机APP GServices查询。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【香港电话卡】易博通eSender</title>
      <link>https://zhong-er.com/posts/%E9%A6%99%E6%B8%AF%E7%94%B5%E8%AF%9D%E5%8D%A1%E6%98%93%E5%8D%9A%E9%80%9Aesender/</link>
      <pubDate>Mon, 06 May 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E9%A6%99%E6%B8%AF%E7%94%B5%E8%AF%9D%E5%8D%A1%E6%98%93%E5%8D%9A%E9%80%9Aesender/</guid>
      <description>&lt;p&gt;易博通eSender是由香港虚拟网络运营商博元讯息集团推出的一个服务，提供中国香港和中国大陆的手机号码，申请成功后可通过微信接收短信。每个微信可以申请两个香港手机号码和一个大陆手机号码。&lt;/p&gt;
&lt;h2 id=&#34;资费标准&#34;&gt;资费标准&lt;/h2&gt;
&lt;p&gt;这里列出的只是无限接收短信的资费标准，语音及数据的套餐可在易博通eSender的微信公众号查询。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;fee.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905065840_4512_1.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;申请方法&#34;&gt;申请方法&lt;/h2&gt;
&lt;p&gt;易博通eSender的申请及充值均通过微信公众号进行，因此先关注易博通eSender的微信公众号。扫码关注：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;二维码&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905067170_8180_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;申请中国大陆的手机号码需要输入一个大陆手机号码及身份证号码，申请中国香港的手机号码只需要输入一个大陆手机号码即可。下面是申请大陆手机号码的截图，可免费使用一个星期。大陆号码需要在指定的时间内进行实名认证，否则会暂停使用且不另行通知。香港的手机号码不需要实名。如图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;register-1.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905069000_4054.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;其中大陆可以使用的证件有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;People’s Republic Of China Resident(中国内地身份证)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;People’s Republic Of China Passport(中华人民共和国护照)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;中文申请界面是这样的&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;chinese.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905065506_8621.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;如果要申请香港手机号码，可以先在微信搜索 易博通 关注微信公众号，或者直接扫下面这个二维码：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;hknumber-300x300.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905061663_2838.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;关注以后通过以下方式登记服务，如图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;getanumber.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905062297_4816.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击「易博通」＞点击「登记开通服务」＞选择「开通中国内地号码」或「开通香港号码」&lt;/p&gt;
&lt;p&gt;如果你只需要接收短信，直接选”登记开通服务”即可，如图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;getahknb2.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905069001_1686.png&#34;&gt;&lt;br&gt;
如果你只想通过微信接收短信，选择“无SIM卡（只限微信收短信）”即可，如果你使用具有eSIM功能的手机，也可以试试eSIM，例如pixel3&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;wechatsms.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905069412_5517.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入你的大陆手机号码，选择一个套餐，然后易博通会提供几个香港手机号码让你选，有可能有机会选取和你大陆手机尾号一样的香港手机号，比如我的香港手机号是57459832，9832就是我大陆手机号码的尾号。可以使用微信和支付宝付款，非常方便。&lt;/p&gt;
&lt;p&gt;易博通提供的香港手机号码可以接收大陆、香港手机号码发的短信，Google Fi和Lycamobile发的短信收不到，应该是易博通拒收了。收到短信后微信有通知，基本没有延迟。如图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;sms.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905068828_7649_1.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;留言信箱&#34;&gt;留言信箱&lt;/h2&gt;
&lt;p&gt;无SIM卡的易博通号码不能接听电话，但是可以开通留言信箱，不过这个服务默认是开闭的，当别人打你的电话时会听到忙音。你可以通过以下方法开启：&lt;/p&gt;
&lt;p&gt;点击【我的帐号】-&amp;gt;点击【留言信箱】-&amp;gt;选择要设置留言信箱的号码-&amp;gt;选中”开启留言信箱”-&amp;gt;录下你充满磁性的嗓音-&amp;gt;上传&lt;/p&gt;
&lt;p&gt;使用易博通提供的香港手机号码，可以注册香港支付宝，八达通好易畀，拍住赏，香港微信钱包以及香港人的电子钱包TNG等多个电子钱包，更多玩法就靠大家自已去测试了。&lt;/p&gt;
&lt;h2 id=&#34;博主测试&#34;&gt;博主测试&lt;/h2&gt;
&lt;p&gt;我使用的是无实体卡的，微信公众号接受消息，也没有绑定eSIM设备，成功注册微信，支付宝HK，其他暂未测试。微信可能提示已绑定其他微信号，直接选不是本人的，或者通过忘记密码找回即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【虚拟信用卡】美国运通虚拟卡</title>
      <link>https://zhong-er.com/posts/%E8%99%9A%E6%8B%9F%E4%BF%A1%E7%94%A8%E5%8D%A1%E7%BE%8E%E5%9B%BD%E8%BF%90%E9%80%9A%E8%99%9A%E6%8B%9F%E5%8D%A1/</link>
      <pubDate>Mon, 06 May 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E8%99%9A%E6%8B%9F%E4%BF%A1%E7%94%A8%E5%8D%A1%E7%BE%8E%E5%9B%BD%E8%BF%90%E9%80%9A%E8%99%9A%E6%8B%9F%E5%8D%A1/</guid>
      <description>&lt;p&gt;Globe GCash是菲律宾电信公司Globe旗下的一个小额支付系统，华人通常称之为菲律宾版支付宝，而马云也曾为GCash站台并亲自体验扫描支付。不得不说，GCash的功能和支付宝非常相似，用户可通过GCash给手机充话费、买流量，支付各种生活帐单：电费、水费、网费、还信用卡，简单一模一样。但是支付宝想推出但最终没能实现的功能：虚拟信用卡，GCash通过和美国运通合作实现了。这张美国运通虚拟卡链接到客户的GCash电子钱包(共享余额)，客户可以使用这张卡在国际网站购买电子商品和服务，而这正是我们需要的功能。&lt;/p&gt;
&lt;h2 id=&#34;本卡优点&#34;&gt;本卡优点&lt;/h2&gt;
&lt;p&gt;本卡支持AVS(Address Verification Service)验证，帐单地址是美国加州的。&lt;/p&gt;
&lt;p&gt;可以在以下网上或者商户消费：Amazon,PayPal,eBay U.S.,Zappos,Sephora,Drugstore,Gap,Old Navy,Agoda,Booking,AirBnb,Google Play Store,US PlayStation Store,Steam Store.&lt;/p&gt;
&lt;p&gt;不能在Best Buy及iTunes U.S. App Store（以前可以）消费。Supreme要求帐单地址和收货地址一样，因此无法下单。&lt;/p&gt;
&lt;p&gt;由于该卡的帐单地址为美国，可以有效地避免被砍单。&lt;/p&gt;
&lt;p&gt;另外，该卡不需要实名认证即可正常使用，不需要充值即可获得卡号和有效期(但必须充值以后才可以绑卡验证或者消费)。我已将该卡绑定到微信及AirBnb，可正常消费，Airbnb识别此卡为美国，有图为证：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;airbnbpay.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905064308_1021.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;下载app&#34;&gt;下载APP&lt;/h2&gt;
&lt;p&gt;注意：&lt;strong&gt;最好使用菲律宾IP地址注册&lt;/strong&gt; （博主测试加拿大IP,美国IP，其他未测试，主要是菲律宾节点实在难搞），否则可能出现无法注册或者注册成功后无法登录的情况。我是在菲律宾注册的GCash，回国几天后发现无法登录，发邮件给客服，客服的回复是：&lt;/p&gt;
&lt;p&gt;As advise you cannot log in your account due to this is not supported to international**.(不支持国际用户)**&lt;/p&gt;
&lt;p&gt;Yes you can use it again here in Philippines. 你可以到菲律宾以后再使用。&lt;/p&gt;
&lt;p&gt;掏出你的手机，如果是iPhone，打开App Store，搜索GCash，如图:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;dapp.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905064236_6285.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;注册gcash电子钱包&#34;&gt;注册GCash电子钱包&lt;/h2&gt;
&lt;p&gt;打开下载好的软件，输入你的菲律宾电话号码，目前只支持菲律宾电话号码申请，然后点右上角的”Next”&lt;/p&gt;
&lt;p&gt;可以微信扫码的我的推荐码或推荐链接免费获得50比索。官网说要5个工作日才能到帐，可能会有延迟，但确实到账了。&lt;/p&gt;
&lt;p&gt;如图：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;scan.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905066194_920_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;Hi, you can get P50 worth of freebies for you to buy load, pay bills and more on the GCash app! Just register here:&lt;/p&gt;</description>
    </item>
    <item>
      <title>【win10】官方最新版本1909下载-持续更新</title>
      <link>https://zhong-er.com/posts/win10%E5%AE%98%E6%96%B9%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC1909%E4%B8%8B%E8%BD%BD-%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/</link>
      <pubDate>Thu, 25 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/win10%E5%AE%98%E6%96%B9%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC1909%E4%B8%8B%E8%BD%BD-%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;1.JPG&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201904258833_590_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;Windows 10 (business editions), version 1909 (x64) - DVD (Chinese-Simplified) 详细信息&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;cn_windows_10_business_editions_version_1909_x64_dvd_0ca83907.iso&lt;/p&gt;
&lt;p&gt;SHA1&lt;/p&gt;
&lt;p&gt;a153526cdd406a249a93f30b447b259fed560c1d&lt;/p&gt;
&lt;p&gt;文件大小&lt;/p&gt;
&lt;p&gt;4.91GB&lt;/p&gt;
&lt;p&gt;发布时间&lt;/p&gt;
&lt;p&gt;2019-10-16&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    ed2k://|file|cn_windows_10_business_editions_version_1909_x64_dvd_0ca83907.iso|5275090944|9BCD5FA6C8009E4D0260E4B23008BD47|/
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>【CentOS7】防火墙端口增删</title>
      <link>https://zhong-er.com/posts/centos7%E9%98%B2%E7%81%AB%E5%A2%99%E7%AB%AF%E5%8F%A3%E5%A2%9E%E5%88%A0/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/centos7%E9%98%B2%E7%81%AB%E5%A2%99%E7%AB%AF%E5%8F%A3%E5%A2%9E%E5%88%A0/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;timg.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201904237682_3532.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;CentOS 7 防火墙配置常用命令汇总&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1.查看防火墙状态
systemctl status firewalld
# 2.开启防火墙
systemctl start firewalld
# 3.防火墙开机自启动
systemctl enable firewalld
# 4.未安装防火墙
sudo yum install firewalld
# 5.查看所有打开的端口
firewall-cmd --zone=public --list-ports
# 6.添加单端口
firewall-cmd --add-port=22/tcp --permanent
# 7.添加端口区间
firewall-cmd --zone=public --add-port=39000-40000/tcp --permanent
# 8.重载防火墙
firewall-cmd --reload
# 9.删除指定端口
firewall-cmd --permanent --remove-port=123/tcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一、防火墙的基本使用&lt;/p&gt;
&lt;p&gt;1.查看防火墙状态&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl status firewalld
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.开启防火墙&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl start firewalld
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3.关闭防火墙&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl stop firewalld
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4.若遇无法开启&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//先用
systemctl unmask firewalld.service 
//再用
systemctl start firewalld.service
#如果还是not found 就是未安装，执行以下命令安装
sudo yum install firewalld
//再启动就OK了
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;5.开机启用防火墙&lt;/p&gt;</description>
    </item>
    <item>
      <title>【CentOS7】修改SSH默认22号端口</title>
      <link>https://zhong-er.com/posts/centos7%E4%BF%AE%E6%94%B9ssh%E9%BB%98%E8%AE%A422%E5%8F%B7%E7%AB%AF%E5%8F%A3/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/centos7%E4%BF%AE%E6%94%B9ssh%E9%BB%98%E8%AE%A422%E5%8F%B7%E7%AB%AF%E5%8F%A3/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Linux.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201904231935_7469.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;目前很多人还是使用密码来登陆服务器，并且服务器都是默认的 22端口，但是这样会有被暴力破解密码的危险（除非足够复杂）。&lt;/p&gt;
&lt;p&gt;为了服务器安全，推荐：非22端口+Key密匙登陆+Key密匙密码，这样搭配最安全。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;为了保险起见，我们先添加一个SSH端口并添加对应的防火墙规则，然后用这个新的端口连接服务器试试，如果没问题了，我们再删除默认的22端口。&lt;br&gt;
添加SSH端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi /etc/ssh/sshd_config
# vi打开文件后，按 I键  进入编辑模式，然后按下面的要求添加端口配置，最后按 ESC键  退出编辑模式并输入 :wq 保存并退出vi编辑器。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们在默认的SSH端口配置下面添加一个我们要用的新的端口，例如 23456&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Port 22
# 默认的22端口配置
Port 23456
# 新添加的 23456端口配置
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们重启SSH:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;service ssh restart
# 如果提示服务不存在，那就用
service sshd restart

# CentOS 7 使用
systemctl restart sshd.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;防火墙放通23456端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;firewall-cmd --add-port=23456/tcp --permanent
#重载防火墙
firewall-cmd --reload
#查询指定端口是否开启成功
firewall-cmd --query-port=23456/tcp
#返回yes就放通成功了
yes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面步骤做完了，那么请断开当前的SSH连接，然后把SSH端口改为新的端口（示例端口为 23456），链接新端口试试，如果连接正常，那么继续下面的步骤，如果连接不正常，那么使用旧端口 22 连接上面去排除问题。&lt;br&gt;
取消默认SSH 22号端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们再打开SSH配置文件，删除 Port 22 这一行，然后重启SSH即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【EVA Facial Mouse】解放双手！用脸操作手机</title>
      <link>https://zhong-er.com/posts/eva-facial-mouse%E8%A7%A3%E6%94%BE%E5%8F%8C%E6%89%8B%E7%94%A8%E8%84%B8%E6%93%8D%E4%BD%9C%E6%89%8B%E6%9C%BA/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/eva-facial-mouse%E8%A7%A3%E6%94%BE%E5%8F%8C%E6%89%8B%E7%94%A8%E8%84%B8%E6%93%8D%E4%BD%9C%E6%89%8B%E6%9C%BA/</guid>
      <description>&lt;p&gt;只要用过智能手机，所有人都离不开它。但有时候 —— 比如躺在椅子上看小说的时候，我却想要一种不用接触智能手机的方式，然后我找到了 EVA Facial Mouse。&lt;/p&gt;
&lt;p&gt;EVA Facial Mouse 是由沃达丰开发的一款开源应用，目的是让用户无需使用双手，仅仅通过摄像头就可以操作手机。当然，这个 App 肯定不是给四肢健全的「懒鬼」设计的，沃达丰为了能让那些由于某些原因而无法使用手，并依靠其他人来满足其基本需求的人，比如截肢，脑瘫，脊髓损伤，肌营养不良，多发性硬化症，肌萎缩侧索硬化症（ ALS ）或其他残疾的人也能够感受到智能化生活的便利从而制作了 EVA Facial Mouse。在强调包容性发展作为实现可持续发展的正确道路的时代，针对残疾人福利的重点举措至关重要。这个来自沃达丰的应用程序是一项小型举措，可以帮助包容性增长。&lt;/p&gt;
&lt;p&gt;当然我们偶尔用来偷个懒也是十分好用的，接下来我就仔细讲讲它的操控方式吧。&lt;/p&gt;
&lt;p&gt;新奇的脸部操控&lt;/p&gt;
&lt;p&gt;第一次打开 EVA Facial Mouse ，在给了相关权限后会进入教学向导（提供跳过但是不建议跳过）。这里我录制了一个视频让大家直观地看一下它的操控方式和精确度：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1.gif&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811228531_2496_1.gif&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2.gif&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811228937_6136.gif&#34;&gt;&lt;/p&gt;
&lt;p&gt;可以看到检测到吴彦祖帅气的脸之后整个流程算是十分流畅（还得加上我对不准位置的锅），即使脸离开前置摄像头一小会儿也不会影响鼠标跟踪。由于手机前置摄像头成像的局限性，EVA Facial Mouse 并没有采用 Win10 支持的眼球追踪，而是将头部作为追踪点控制虚拟鼠标，优点是通用性高，只需要有前置摄像头就行了，缺点是比起眼球追踪还是不够舒服。当然对于那些行动不便的用户来讲做到「便宜还能用」的程度已经比什么都没有好太多了。&lt;/p&gt;
&lt;p&gt;现在我看小说的时候都用它来翻页，架好手机，小说设置好全屏点击翻页之后，只需要盯住页面一小会儿就可以轻松翻到下一页，「葛优躺」更加舒服了。偶尔头累了就控制鼠标点击「 Rest Mode 」休息一下。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;3.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811227025_9297_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;总结&lt;/p&gt;
&lt;p&gt;虽然我拿着「 EVA Facial Mouse 」来做了一些不务正业的事情，但这个应用本身可以能极大地帮助到有需要的人，如果各位朋友周围有很难或者没办法去使用手机的人，请一定要推荐这篇文章给他们，或许他们的生活会变得更加地便利。&lt;/p&gt;
&lt;p&gt;应用已汉化&lt;/p&gt;
&lt;p&gt;此应用可以放开双手，利用前置摄像头捕捉眼球动作来控制手机。功能比较丰富，基本上不用动手，眼神都可以搞定了。并且桌面多了一个类似电脑鼠标箭头，这个箭头会随着面部的移动而移动，非常的神奇。左侧是安卓的操作按键，集成了返回，Home，以及多任务，和下拉状态栏的按键操作。完全摆脱了动手操作。全靠眼球移动操作。当面部让鼠标停留在一个地方一定的时间后会调出菜单。选择点击或者长按。右侧工具栏倒数第二个按钮可以启动或者禁止菜单的弹出，禁止菜单后鼠标默认为点击，不会有长按功能。基本上整体的交互逻辑和日常使用的功能都具备了，可用性还是很高的。&lt;/p&gt;
&lt;p&gt;博主体验了一把，灵敏度还是可以的，就是需要来回摇头点头的，体验一下还是有必要的，但是对于四肢健全的人来说还是不会选择长期使用这款软件的。&lt;/p&gt;
&lt;p&gt;2019年8月8日更新 v3.1.1 Google play store 英文版&lt;/p&gt;
&lt;p&gt;经测试较之前版本有所优化&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pan.baidu.com/s/16rQvgUOJsm8HI09LyySLlQ&#34; title=&#34;点击下载&#34;&gt;黑科技面部&lt;/a&gt;大小：25.1MB | 来源：百度云 | 提取码：dbcd&lt;/p&gt;
&lt;p&gt;已经过安全软件检测无毒，请您放心下载。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pan.baidu.com/s/16rQvgUOJsm8HI09LyySLlQ&#34; title=&#34;点击下载&#34;&gt; &lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Ubuntu】在Ubuntu 14.04 64bit中永久添加DNS的方法</title>
      <link>https://zhong-er.com/posts/ubuntu%E5%9C%A8ubuntu-14.04-64bit%E4%B8%AD%E6%B0%B8%E4%B9%85%E6%B7%BB%E5%8A%A0dns%E7%9A%84%E6%96%B9%E6%B3%95/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/ubuntu%E5%9C%A8ubuntu-14.04-64bit%E4%B8%AD%E6%B0%B8%E4%B9%85%E6%B7%BB%E5%8A%A0dns%E7%9A%84%E6%96%B9%E6%B3%95/</guid>
      <description>&lt;p&gt;DNS信息是由/etc/resolv.conf提供的，它是每次开机时，由/sbin/resolvconf生成的&lt;/p&gt;
&lt;p&gt;/etc/resolv.conf是/run/resolvconf/resolv.conf的符号链接&lt;/p&gt;
&lt;p&gt;错误的修改方法&lt;/p&gt;
&lt;p&gt;直接修改/etc/resolv.conf文件添加DNS的方法并不可行，因为重启系统后，该配置文件会被重新覆盖。&lt;/p&gt;
&lt;p&gt;这一点也可以该文件顶部的注释行证明&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201903277344_3426_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;原因解释：&lt;/p&gt;
&lt;p&gt;在Ubuntu中有一个 resolvconf的服务，这个服务用来控制/etc/resolv.conf的内容。&lt;/p&gt;
&lt;p&gt;所以一旦我们重启了系统或者该服务，那么/etc/resolv.conf文件中的内容将被还原为原来的内容。&lt;/p&gt;
&lt;p&gt;所以直接修改/etc/resolv.conf并不能解决这个问题。&lt;/p&gt;
&lt;p&gt;正确的修改方法&lt;/p&gt;
&lt;p&gt;修改如下文件，默认是空的&lt;/p&gt;
&lt;p&gt;sudo vim /etc/resolvconf/resolv.conf.d/base&lt;/p&gt;
&lt;p&gt;在里面加入你想添加的DNS服务器，一行一个&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201903276502_7185_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;修改好后保存，然后执行&lt;br&gt;
sudo /sbin/resolvconf -u&lt;br&gt;
或者&lt;br&gt;
sudo etc/init.d/resolvconf restart&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;3.png&#34; loading=&#34;lazy&#34; src=&#34;https://p.zhong-er.com/2019/03/201903272387_4216.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;或者重启系统&lt;/p&gt;
&lt;p&gt;再查看/etc/resolv.conf文件，已经将我们添加的内容加上了&lt;/p&gt;
&lt;p&gt;cat /etc/resolv.conf&lt;/p&gt;
&lt;p&gt;另一种方法&lt;/p&gt;
&lt;p&gt;sudo vim /etc/network/interfaces&lt;/p&gt;
&lt;p&gt;dns-nameservers 8.8.8.8 114.114.114.114&lt;/p&gt;
&lt;p&gt;遇到的问题&lt;/p&gt;
&lt;p&gt;无法实现上面的功能，不知道是什么原因？&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://jingyan.baidu.com/article/e5c39bf5bbe0e739d7603396.html&#34;&gt;http://jingyan.baidu.com/article/e5c39bf5bbe0e739d7603396.html&lt;/a&gt; 似乎有价值&lt;/p&gt;
&lt;p&gt;最后的折衷解决方案，在网卡配置GUI中手动加入dns配置，然后使用下面的命令检查&lt;/p&gt;
&lt;p&gt;nmcli dev list iface wlan0 | grep DNS&lt;/p&gt;
&lt;p&gt;把wlan0换成你网路连接的硬体，看DNS是哪一个，就知道现在使用的DNS是谁&lt;/p&gt;
&lt;p&gt;参考文献&lt;/p&gt;
&lt;p&gt;[1].http://blog.csdn.net/yangcs2009/article/details/26674311&lt;/p&gt;
&lt;p&gt;[2].http://www.linuxidc.com/Linux/2009-08/21425.htm 解决方法在文章最后&lt;/p&gt;
&lt;p&gt;[3].http://www.tuicool.com/articles/iiUjAj 这个是最终解决办法&lt;/p&gt;
&lt;p&gt;[4].http://askubuntu.com/questions/130452/how-do-i-add-a-dns-server-via-resolv-conf&lt;/p&gt;
&lt;p&gt;[5].http://www.tuicool.com/articles/RVZn2y 针对Ubuntu 14.04的&lt;/p&gt;</description>
    </item>
    <item>
      <title>【VPS流行语】常用的VPS江湖黑话</title>
      <link>https://zhong-er.com/posts/vps%E6%B5%81%E8%A1%8C%E8%AF%AD%E5%B8%B8%E7%94%A8%E7%9A%84vps%E6%B1%9F%E6%B9%96%E9%BB%91%E8%AF%9D/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/vps%E6%B5%81%E8%A1%8C%E8%AF%AD%E5%B8%B8%E7%94%A8%E7%9A%84vps%E6%B1%9F%E6%B9%96%E9%BB%91%E8%AF%9D/</guid>
      <description>&lt;p&gt;经常逛VPS论坛的朋友，都会看到有些人说什么，毒妇、传家宝、吃灰啊，这些词，真的是让人一头雾水，和网络流行语一样，我们也还是有必要知道一点这些VPS切口的，大鸟这里就简单介绍几个常用的。让那些小白们逛vps论坛的时候能跟得上节奏。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2016111612481734.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201904232543_261.jpg&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;一oneman&#34;&gt;一.oneman&lt;/h4&gt;
&lt;p&gt;指只有一个人经营的idc服务商，业内比较出名的有ramnode，不过这家严格说并不是oneman，人家是夫妻店，是俩人23333。还有那个常年侮辱中国客户的bugetvz，是个澳洲村炮自己开的oneman店。&lt;/p&gt;
&lt;h4 id=&#34;二毒妇杜甫&#34;&gt;二.毒妇，杜甫&lt;/h4&gt;
&lt;p&gt;指的是独立服务器，缩写是独服，因为输入法经常打成毒妇或者是杜甫，所以这个称呼也沿用开了。&lt;/p&gt;
&lt;h4 id=&#34;三小鸡&#34;&gt;三.小鸡&lt;/h4&gt;
&lt;p&gt;指小型vps，往往配置非常低，但是麻雀虽小五脏俱全，往往都有独立ip，同时价格也很便宜。另外一个意思就是独立服务器里开出来的小vps，也叫小鸡。&lt;/p&gt;
&lt;h4 id=&#34;四母鸡&#34;&gt;四.母鸡&lt;/h4&gt;
&lt;p&gt;指独立服务器。因为vps都是拿独立服务器虚拟出来的（其实就是独服开了一堆虚拟机），所以小vps叫小鸡，生出小vps来的独服叫母鸡。&lt;/p&gt;
&lt;h4 id=&#34;五超售&#34;&gt;五.超售&lt;/h4&gt;
&lt;p&gt;前面说了，vps其实就是独服的虚拟机。超售就是开了太多的小鸡在独服里。举个例子，本来一台独服是4核4g内存，如果用kvm开小鸡，如果要开的套餐是1核1g内存，那么就只能开4台出来。但是实际的情况并不是这样，商家为了多赚钱，强行开了八台出来，还全都是1核512m内存的，其原因就是超了cpu，强行让本来应该为四个人服务的cpu给八个人服务，但是却内存没超。虚拟的主流架构有openvz，kvm和xen，其中ovz啥都能超，kvm可以超cpu但是不能超内存和硬盘。xen不太了解，应该和kvm一样（存疑，超售的这个具体原理我也不是很懂）&lt;/p&gt;
&lt;h4 id=&#34;五传家宝&#34;&gt;五.传家宝&lt;/h4&gt;
&lt;p&gt;部分vps卖断货后，往往其价格会飞速飙升。这是因为如果商家不再开卖的话，一台母鸡里就这么多小鸡了，商家不会再超售了。那么小鸡的稳定性就大大提升，求购二手vps的基佬就会趋之若鹜，价格自然水涨船高。当年搬瓦工3.99刀卖断货后价格一度飞涨七八倍，涨幅都超过五道口宇宙中心的房价涨幅了，被戏称为传家宝。传家宝一名因此得来。&lt;/p&gt;
&lt;h4 id=&#34;六黄牛&#34;&gt;六.黄牛&lt;/h4&gt;
&lt;p&gt;倒卖各种二手vps的人，称之为黄牛，鄙人也是做这买卖的。干这行非常考验眼力和手速，当然利润也是相当不错。曾经一刀买的800块人民币卖掉了，我会乱说？&lt;/p&gt;
&lt;h4 id=&#34;七石头盘&#34;&gt;七.石头盘&lt;/h4&gt;
&lt;p&gt;指硬盘io过低的vps。基本低于100m/s就是石头盘了。有人笑称是用石头做出来的硬盘，因此得名。硬盘转速太低基本干啥都卡，因此大家都不喜欢石头盘的vps。与此同时还有一个说法是钻石盘，指垃圾中的战斗机硬盘。当年cac的vps一度跑出了10m/s的成绩，惊为天人，简直是石头盘中的石头盘，钻石盘这个说法就出来了。&lt;/p&gt;
&lt;h4 id=&#34;八吃灰&#34;&gt;八.吃灰&lt;/h4&gt;
&lt;p&gt;指剁手党看到好vps就买买买，结果买回来发现并不需要，于是放着吃灰。&lt;/p&gt;
&lt;h4 id=&#34;九探针&#34;&gt;九.探针&lt;/h4&gt;
&lt;p&gt;一个php小程序，挂在vps上能够查看vps的各项参数性能。基佬们经常互相交换探针地址来加深友♂谊，是py交易的前奏。&lt;/p&gt;
&lt;h4 id=&#34;十油管&#34;&gt;十.油管&lt;/h4&gt;
&lt;p&gt;指有图比，很多基佬喜欢用u2b的视频播放效果来衡量线路的好坏，虽然这个并不是一个很精准的检验方法。&lt;/p&gt;
&lt;h4 id=&#34;十一mjj&#34;&gt;十一.mjj&lt;/h4&gt;
&lt;p&gt;“没鸡鸡”的缩写，hostloc论坛的基佬们的自称。hostloc是中国vps玩家和黄赌毒站长们的聚集地。&lt;/p&gt;
&lt;h4 id=&#34;十二刀&#34;&gt;十二.刀&lt;/h4&gt;
&lt;p&gt;指美元，dollar的音译。大部分vps商家只支持美元支付。&lt;/p&gt;
&lt;h4 id=&#34;十三海外机房缩写&#34;&gt;十三.海外机房缩写：&lt;/h4&gt;
&lt;p&gt;HK香港，KR韩国，JP日本，SG新加坡， LA洛杉矶等等。&lt;/p&gt;
&lt;h4 id=&#34;十四大水管小水管&#34;&gt;十四.大水管，小水管&lt;/h4&gt;
&lt;p&gt;在A站B站看电影和电视的时候，会有很多很多老司机提醒说，小水管不要点超清播放，要点高清播放，尤其是2m小水管，有些在贴吧发资源的时候，也常常听到有人说，好像这个词跟看电影有关吧，请问“小水管”是什么意思？2M小水管呢？4M小水管呢？&lt;/p&gt;
&lt;p&gt;简单说下：如果家里的宽带是100M就是大水管，你弄个2M就是小水管，套用在VPS上面，国外的vps带宽动辄G口宽带，国内的带宽太贵，我们买个阿里云的Vps的时候钱太少，只能选择1M的带宽，那G口的就是大水管，1M的就是小水管。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【Win10】任务栏一键透明小插件</title>
      <link>https://zhong-er.com/posts/win10%E4%BB%BB%E5%8A%A1%E6%A0%8F%E4%B8%80%E9%94%AE%E9%80%8F%E6%98%8E%E5%B0%8F%E6%8F%92%E4%BB%B6/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/win10%E4%BB%BB%E5%8A%A1%E6%A0%8F%E4%B8%80%E9%94%AE%E9%80%8F%E6%98%8E%E5%B0%8F%E6%8F%92%E4%BB%B6/</guid>
      <description>&lt;p&gt;Win10更新到今日，任务栏还是无法实现全透明，最多也是如下图的半透明毛玻璃效果&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;1.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905088268_1165_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;今天给大家带来一款插件Private.BlurClear&lt;br&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;%7B#ZC_BLOG_HOST%23%7Dzb_users/upload/2019/05/20190506095921_43741.jpg&#34;&gt;&lt;br&gt;
双击运行即可一键使任务栏透明&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905084980_8586_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;下面介绍一下如何添加开机启动项，使用到的软件是Uninstall Tool，可以查看另一篇文章下载使用&lt;a href=&#34;%7B#ZC_BLOG_HOST#%7Dpost/14.html&#34;&gt;《软件卸载利器：Uninstall Tool Pro》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;3.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905089499_2891_1.jpg&#34;&gt;&lt;br&gt;
&lt;img alt=&#34;20190506095922_61572.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905084727_5347_1.jpg&#34;&gt;&lt;img alt=&#34;20190506095922_26817.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201905083445_8062_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;这样开机就会自动运行了！&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pan.baidu.com/s/1She556YwYxzzgQjXhQKB-w&#34; title=&#34;点击下载&#34;&gt;Private&lt;/a&gt;大小：27k | 来源：百度网盘&lt;/p&gt;
&lt;p&gt;已经过安全软件检测无毒，请您放心下载。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pan.baidu.com/s/1_MGWtu2KPKq86lsMQ7iQCw&#34; title=&#34;点击下载&#34;&gt; &lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【宝塔面板】5.9版本安装指令</title>
      <link>https://zhong-er.com/posts/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF5.9%E7%89%88%E6%9C%AC%E5%AE%89%E8%A3%85%E6%8C%87%E4%BB%A4/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF5.9%E7%89%88%E6%9C%AC%E5%AE%89%E8%A3%85%E6%8C%87%E4%BB%A4/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;5.9.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201904233944_3958.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;安装要求：&lt;/p&gt;
&lt;p&gt;Python版本： 2.6/2.7（安装宝塔时会自动安装）&lt;/p&gt;
&lt;p&gt;内存：128M以上，推荐512M以上（纯面板约占系统10M内存）&lt;/p&gt;
&lt;p&gt;硬盘：100M以上可用硬盘空间（纯面板约占20M磁盘空间）&lt;/p&gt;
&lt;p&gt;系统：CentOS 6.x / 7.x (Ubuntu、Debian、Fedora )，&lt;/p&gt;
&lt;p&gt;确保是干净的操作系统，不支持32位系统，没有安装过其它环境带的Apache/Nginx/php/MySQL（已有环境不可安装）&lt;/p&gt;
&lt;h3 id=&#34;linux面板59稳定版安装命令&#34;&gt;Linux面板5.9（稳定版）安装命令：&lt;/h3&gt;
&lt;p&gt;Centos安装命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yum install -y wget &amp;amp;&amp;amp; wget -O install.sh http://download.bt.cn/install/install.sh &amp;amp;&amp;amp; sh install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ubuntu/Deepin安装命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh &amp;amp;&amp;amp; sudo bash install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Debian安装命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh &amp;amp;&amp;amp; bash install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fedora安装命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -O install.sh http://download.bt.cn/install/install.sh &amp;amp;&amp;amp; bash install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;备用节点广东&#34;&gt;备用节点【广东】：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;yum install -y wget &amp;amp;&amp;amp; wget -O install.sh http://125.88.182.172:5880/install/install.sh &amp;amp;&amp;amp; sh install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;备用节点香港&#34;&gt;备用节点【香港】：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;yum install -y wget &amp;amp;&amp;amp; wget -O install.sh http://103.224.251.67:5880/install/install.sh &amp;amp;&amp;amp; sh install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;备用节点美国&#34;&gt;备用节点【美国】：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;yum install -y wget &amp;amp;&amp;amp; wget -O install.sh http://128.1.164.196:5880/install/install.sh &amp;amp;&amp;amp; sh install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;若点击更新后没生效，请尝试重启面板服务：&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【宝塔面板】常用脚本命令</title>
      <link>https://zhong-er.com/posts/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E5%B8%B8%E7%94%A8%E8%84%9A%E6%9C%AC%E5%91%BD%E4%BB%A4/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E5%B8%B8%E7%94%A8%E8%84%9A%E6%9C%AC%E5%91%BD%E4%BB%A4/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;2.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811228186_8847.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;虽然目前宝塔面板开始收费，但是免费版本功能还是够用的。至少目前还没有其他相对好的免费面板替换，所以如果希望使用在Linux服务器可视化面板，还是建议使用宝塔面板的。老蒋在平时有帮助网友解决有服务器中安装宝塔面板的问题时候，有需要查看宝塔面板特定的脚本命令。&lt;/p&gt;
&lt;p&gt;所以，在这篇文章中将宝塔面板常用的脚本整理出来，这样下次不用再去搜索。其实我们在做任何事情的时候，记忆力或者不想记，可以记录下来，以便以后使用的时候直接寻找文档。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一、宝塔面板安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;请查看前文&lt;a href=&#34;%7B#ZC_BLOG_HOST#%7Dpost/3.html&#34; title=&#34;宝塔面版：5.9版本安装指令&#34;&gt;《宝塔面板：5.9版本安装指令》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二、宝塔面板管理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;停止&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/init.d/bt stop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/init.d/bt start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/init.d/bt restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;卸载&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/etc/init.d/bt stop &amp;amp;&amp;amp; chkconfig --del bt &amp;amp;&amp;amp; rm -f /etc/init.d/bt &amp;amp;&amp;amp; rm -rf /www/server/panel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看当前面本端口&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat /www/server/panel/data/port.pl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改面板端口，如要改成8881（centos 6 系统）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &#39;8881&#39; &amp;gt; /www/server/panel/data/port.pl &amp;amp;&amp;amp; /etc/init.d/bt restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改面板端口，如要改成8881（centos 7 系统）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo &#39;8881&#39; &amp;gt; /www/server/panel/data/port.pl &amp;amp;&amp;amp; /etc/init.d/bt restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;强制修改MySQL管理(root)密码，如要改成123456&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd /www/server/panel &amp;amp;&amp;amp; python tools.py root 123456
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改面板密码，如要改成123456&lt;/p&gt;</description>
    </item>
    <item>
      <title>【法定VPN信道】联通沃享小颗粒</title>
      <link>https://zhong-er.com/posts/%E6%B3%95%E5%AE%9Avpn%E4%BF%A1%E9%81%93%E8%81%94%E9%80%9A%E6%B2%83%E4%BA%AB%E5%B0%8F%E9%A2%97%E7%B2%92/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%B3%95%E5%AE%9Avpn%E4%BF%A1%E9%81%93%E8%81%94%E9%80%9A%E6%B2%83%E4%BA%AB%E5%B0%8F%E9%A2%97%E7%B2%92/</guid>
      <description>&lt;p&gt;昨天在某群看到有大佬在推介《联通沃享小颗粒》的VPN，对于VPN这里不做太多解释，可自行百度，据说是通过法定信道进行国际互联，受国家监管。&lt;/p&gt;
&lt;p&gt;博主还未进行测试。需要企业营业执照进行申请，只有符合申请要求的才能通过审核，主要面向外贸企业、归国留学生等等，具体看一下介绍。&lt;/p&gt;
&lt;p&gt;官网：&lt;a href=&#34;http://xiaokeli.com.cn/&#34; title=&#34;联通沃享小颗粒&#34;&gt;联通沃享小颗粒&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;111.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201903307452_9185_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;123.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201903309907_1553_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;下面是大佬给出的套餐方案&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;FD8AE749F00D12DFD31CF24D964C14F3.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201903305451_9087_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;有需求的话可以尝试一下。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【淘宝小镇】申请个体工商户(电子营业执照)新方式</title>
      <link>https://zhong-er.com/posts/%E6%B7%98%E5%AE%9D%E5%B0%8F%E9%95%87%E7%94%B3%E8%AF%B7%E4%B8%AA%E4%BD%93%E5%B7%A5%E5%95%86%E6%88%B7%E7%94%B5%E5%AD%90%E8%90%A5%E4%B8%9A%E6%89%A7%E7%85%A7%E6%96%B0%E6%96%B9%E5%BC%8F/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%B7%98%E5%AE%9D%E5%B0%8F%E9%95%87%E7%94%B3%E8%AF%B7%E4%B8%AA%E4%BD%93%E5%B7%A5%E5%95%86%E6%88%B7%E7%94%B5%E5%AD%90%E8%90%A5%E4%B8%9A%E6%89%A7%E7%85%A7%E6%96%B0%E6%96%B9%E5%BC%8F/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;tbxz.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201901033971_7695_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;针对淘宝自然人经营者的工商电子营业执照！有需要的可以申请去了！！不过目前申请的人比较多一天估计下不来！&lt;/p&gt;
&lt;p&gt;当然也能自己到当地办理~ 花不了几个钱~ 也有很多大佬说这个个体工商注销很麻烦。 大家酌情上车~~~&lt;/p&gt;
&lt;h2 id=&#34;办理地址&#34;&gt;办理地址&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://taobao.yuntrial.com&#34;&gt;https://taobao.yuntrial.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;123.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201904242343_7136_1.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;简要流程&#34;&gt;简要流程&lt;/h2&gt;
&lt;p&gt;注册账号，完善信息，实名认证（需要电脑或者手机摄像头）&lt;/p&gt;
&lt;p&gt;办理执照，完善信息，经营范围，申请审核&lt;/p&gt;
&lt;h2 id=&#34;常见问题&#34;&gt;常见问题&lt;/h2&gt;
&lt;p&gt;淘宝小镇电商园政策问答&lt;br&gt;
关于注册对象：&lt;br&gt;
问：已经注册公司了，能否迁到园区？能够变更企业名称么，需要走什么流程？&lt;br&gt;
答：目前线上注册只针对淘宝上的自然人经营者（个体工商户），暂时不对企业开放。已经注册为企业的淘宝商家暂无法在本平台做工商变 更和名称变更。已经注册公司的淘宝商家，后续如想入驻园区，可与园区运营方对接。注册过程的问题：&lt;br&gt;
问：注册过程中需要填写的注册金额一般写多少？&lt;br&gt;
答：根据个人实际经营情况填写即可，金额不做具体限制。问：注册地址是否必须填写“浙江省杭州市余杭区五常街道文一西路998号18幢111室”？&lt;br&gt;
答：是的。该地址是淘宝小镇电商园统一的注册地址，实际地址位于杭州未来科技城海创园，距离阿里巴巴淘宝城仅一路之隔。 只有按此地址注册才能享受园区政策。目前系统已经将注册地址一栏默认为“浙江省杭州市余杭区五常街道文一西路998号18幢111室”，各位商家知晓即可。&lt;/p&gt;
&lt;p&gt;关于营业执照：&lt;br&gt;
问：淘宝小镇电商园发出的营业执照是真实有效的吗？&lt;br&gt;
答：淘宝小镇电商园与工商部门等多部门合作开展“最多跑一次”改革，电子营业执照是从工商部门系统发出，真实有效且具有法律效应，后 续可查询全国企业信用公示系统。&lt;/p&gt;
&lt;p&gt;问：刚注册拿到执照，能否注销？注册时选的经营范围少了，以后要增加经营范围，该如何操作？&lt;br&gt;
答：目前只开放电子营业执照注册，后期将推出电子营业执照的在线变更和注销。&lt;/p&gt;
&lt;p&gt;问：申请营业执照时注册淘宝类别没有找到广告制作行业这块，请问以后会有吗？&lt;br&gt;
答：目前系统内嵌的经营范围是根据淘宝现有商家的常见经营范围筛选得到，可能存在部分遗漏。欢迎联系我们，后期我们会将符合条件的 淘宝类别添入系统。&lt;/p&gt;
&lt;p&gt;后续服务：&lt;br&gt;
问：是否提供银行基本户的开立服务？&lt;br&gt;
答：我们正在工商银行洽谈合作，为产业园入园商户提供线上申请开户，异地见证等创新服务，实现“最多跑一次”的开户体验（商户去其所 在地当地工行网点异地面签）,敬请期待。&lt;/p&gt;
&lt;p&gt;问：升级成个体工商户的公章怎么申请？&lt;br&gt;
答：我们正在对接公安部门，后续将提供电子签章或实体刻章寄送服务。&lt;/p&gt;
&lt;p&gt;问：发票怎么开？&lt;br&gt;
答：我们将引入第三方机构提供电子发票服务。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【系统还原】罗列主流的系统还原软件</title>
      <link>https://zhong-er.com/posts/%E7%B3%BB%E7%BB%9F%E8%BF%98%E5%8E%9F%E7%BD%97%E5%88%97%E4%B8%BB%E6%B5%81%E7%9A%84%E7%B3%BB%E7%BB%9F%E8%BF%98%E5%8E%9F%E8%BD%AF%E4%BB%B6/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%B3%BB%E7%BB%9F%E8%BF%98%E5%8E%9F%E7%BD%97%E5%88%97%E4%B8%BB%E6%B5%81%E7%9A%84%E7%B3%BB%E7%BB%9F%E8%BF%98%E5%8E%9F%E8%BD%AF%E4%BB%B6/</guid>
      <description>&lt;p&gt;老友开了个电竞酒店，组了十台电脑，需要装系统还原软件，正好之前也了解过这方面的，就简单做了下对比。&lt;/p&gt;
&lt;p&gt;我用的第一款软件是&lt;a href=&#34;http://www.yingzixitong.cn/&#34; title=&#34;影子系统PowerShadow&#34;&gt;影子系统PowerShadow&lt;/a&gt;，奈何更新太慢，还是14年的版本，安装后电脑加载会变慢，影响用户体验。&lt;img alt=&#34;111.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811082572_8021_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;第二款是&lt;a href=&#34;http://www.njanyue.com/&#34; title=&#34;雨过天晴电脑保护系统&#34;&gt;雨过天晴电脑保护系统&lt;/a&gt;，这款软件是付费的，对win7系统支持比较好，但是对win10不太友好，我也就没去购买测试，目前主要使用win10系统。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;112.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811081563_4216_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;第三款&lt;a href=&#34;http://www.bingdiancn.com/&#34; title=&#34;冰点还原精灵DeepFreeze&#34;&gt;冰点还原精灵DeepFreeze&lt;/a&gt;，这款软件我之前家里台式一直在用，还不错，当然这个是付费软件，网上的和谐版之前很多，自从思杰马克丁的出现，国内和谐版已经死绝了。只好去Google搜索了，一个链接挂了，还有千千万万个链接。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;113.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811082421_2600_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;我向老友推荐了DeepFreeze,先看看库存的8.3版本还能用不能，挂上虚拟机测试一下。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2SS4JU1J6RA93X91PK~RU1Y.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811085068_4266_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;貌似安装成功了，检查下注册信息，凉凉，没注册成功。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;HFL5WCB01HPZ3C`_{T5OGJY.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811085402_9720_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;只好去Google找新版的了，看到个企业版想着先下载试试，&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;114.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811087297_8297.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;尼玛，这么复杂，不适合小白使用，配置好估计还要研究半天，还是换基础版吧&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;115.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201811081755_5192_1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;嗯，这个样子貌似就成功了，删几个文件，重启，还原成功。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.lanzous.com/i2nkddg&#34; title=&#34;点击下载&#34;&gt;DeepFreeze 8.53.020.5458企业版&lt;/a&gt;大小：55.8MB | 来源：蓝奏云&lt;/p&gt;
&lt;p&gt;已经过安全软件检测无毒，请您放心下载。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.lanzous.com/i2nkddg&#34; title=&#34;点击下载&#34;&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.lanzous.com/i2nkdeh&#34; title=&#34;点击下载&#34;&gt;DeepFreeze 8.53.020.5458注册机&lt;/a&gt;大小：95.6KB | 来源：蓝奏云&lt;/p&gt;
&lt;p&gt;已经过安全软件检测无毒，请您放心下载。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.lanzous.com/i2nkdeh&#34; title=&#34;点击下载&#34;&gt; &lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【迅雷极速版】禁用升级弹窗！</title>
      <link>https://zhong-er.com/posts/%E8%BF%85%E9%9B%B7%E6%9E%81%E9%80%9F%E7%89%88%E7%A6%81%E7%94%A8%E5%8D%87%E7%BA%A7%E5%BC%B9%E7%AA%97/</link>
      <pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E8%BF%85%E9%9B%B7%E6%9E%81%E9%80%9F%E7%89%88%E7%A6%81%E7%94%A8%E5%8D%87%E7%BA%A7%E5%BC%B9%E7%AA%97/</guid>
      <description>&lt;p&gt;2019年6月4日更新&lt;/p&gt;
&lt;p&gt;请直接下载使用：极速迅雷最终优化版&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pan.baidu.com/s/1MNJau9nyK_UawfyHqjSyRA&#34; title=&#34;点击下载&#34;&gt;极速迅雷优化版&lt;/a&gt;大小：13.3MB | 来源：百度网盘&lt;/p&gt;
&lt;p&gt;已经过安全软件检测无毒，请您放心下载。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://pan.baidu.com/s/1MNJau9nyK_UawfyHqjSyRA&#34; title=&#34;点击下载&#34;&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果喜欢界面UI质感十足的迅雷X系列软件的请下载：迅雷X（10.1.14.438）去广告版绿色精简版&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.lanzous.com/i4ej9ab&#34; title=&#34;点击下载&#34;&gt;迅雷X&lt;/a&gt;大小：50.9MB | 来源：蓝奏云&lt;/p&gt;
&lt;p&gt;已经过安全软件检测无毒，请您放心下载。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.lanzous.com/i4ej9ab&#34; title=&#34;点击下载&#34;&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下为旧内容&lt;/p&gt;
&lt;p&gt;最近迅雷极速版开始抽风，关闭界面后开始疯狂弹窗提示升级！&lt;br&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201903132192_5748_1.jpg&#34;&gt;&lt;br&gt;
下面给出解决方法，禁用此弹窗！&lt;br&gt;
1.先退出迅雷，首先找到安装文件夹下面的Data/ThunderPush这个文件夹，把整个文件夹删除，&lt;br&gt;
2.建一个ThunderPush的文本文件,不要TXT后缀&lt;br&gt;
3.右键属性–设置只读，安全-编辑-权限里面全部选拒绝。&lt;br&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201903131002_9560_1.gif&#34;&gt;&lt;br&gt;
整体来说迅雷极速版的速度还是可以的，推荐使用！&lt;br&gt;
&lt;img loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201903131609_326_1.jpg&#34;&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
