提交 3946698a 编写于 作者: 小傅哥's avatar 小傅哥

《互联网 · 分布式架构》第 1 节:基础内容介绍

上级 c880d7d5
itstack.org
\ No newline at end of file
![logo](_media/tree.png)
# CodeGuide
## 程序员编码指南
- 本代码库是作者小傅哥多年从事一线互联网 `Java` 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!
[![stars](https://badgen.net/github/stars/fuzhengwei/CodeGuide?icon=github&color=4ab8a1)](https://github.com/fuzhengwei/CodeGuide) [![forks](https://badgen.net/github/forks/fuzhengwei/CodeGuide?icon=github&color=4ab8a1)](https://github.com/fuzhengwei/CodeGuide) [<img src="https://itstack.org/_media/wxbugstack.svg">](https://itstack.org/_media/qrcode.png?x-oss-process=style/may)
[GitHub](<https://github.com/fuzhengwei/CodeGuide>)
[开始阅读](README.md)
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg class="icon" width="200px" height="138.85px" viewBox="0 0 1475 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<path d="M1438.175947 987.166567H36.67147l60.675821-758.677015h1279.541492l61.287164 758.677015z" fill="#B2EDA6"/>
<path d="M1438.481619 1024H36.67147a36.833433 36.833433 0 0 1-26.899105-11.768358A36.22209 36.22209 0 0 1 0.143709 984.262687l61.134328-758.677015a36.374925 36.374925 0 0 1 36.374925-33.623881h1279.235821a36.680597 36.680597 0 0 1 36.527761 33.623881l61.134329 754.397612a36.986269 36.986269 0 0 1 0 7.183283A36.527761 36.527761 0 0 1 1438.481619 1024zM76.561619 950.638806h1322.029851l-55.326567-685.621493H131.124007z"
fill="#3C663E"/>
<path d="M280.138932 73.055522s172.093134-22.772537 263.183284-22.772537 187.98806 51.2 187.98806 108.207761v706.712836S749.039231 733.61194 520.549679 733.61194s-285.650149 56.243582-285.65015 56.243582z"
fill="#FFFFFF"/>
<path d="M731.15744 886.447761h-1.681194a24.453731 24.453731 0 0 1-22.772537-24.453731v-11.921194c-2.751045-28.274627-26.899104-91.701493-186.15403-91.701493-210.30209 0-268.532537 49.213134-268.991045 49.671642a25.065075 25.065075 0 0 1-27.05194 3.820896 24.453731 24.453731 0 0 1-13.90806-23.231045l45.850746-717.411343a24.453731 24.453731 0 0 1 20.48-22.31403c7.183284-0.917015 174.691343-23.078209 266.392836-23.078209 100.413134 0 212.136119 53.186866 212.136119 129.604776v692.65194a72.597015 72.597015 0 0 1 0 17.423284A24.300896 24.300896 0 0 1 731.15744 886.447761zM520.549679 709.922388c95.369552 0 152.835821 18.64597 186.459701 45.850746V158.490746c0-35.610746-76.41791-83.906866-163.687164-83.906865-70.457313 0-192.420299 14.213731-240.105075 20.174328l-41.112835 652.608955c42.641194-17.576119 121.198806-37.444776 258.445373-37.444776z"
fill="#3C663E"/>
<path d="M147.630276 886.600597l87.269253-107.596418 45.239403-705.948657-86.65791 113.862687-45.850746 699.682388z"
fill="#FFFFFF"/>
<path d="M147.630276 910.901493a22.31403 22.31403 0 0 1-8.864478-1.681194 24.14806 24.14806 0 0 1-15.283582-24.300896l45.850746-699.529552a24.300896 24.300896 0 0 1 4.890747-13.143881l86.65791-114.015522a24.606567 24.606567 0 0 1 27.968955-7.947463 23.995224 23.995224 0 0 1 15.283582 24.300896L259.964604 780.532537a25.829254 25.829254 0 0 1-5.502089 13.90806l-87.269254 106.985075a23.995224 23.995224 0 0 1-19.562985 9.475821z m69.693134-714.965971l-40.348657 615.928359 34.235224-42.182687L250.641619 152.835821z"
fill="#3C663E"/>
<path d="M146.407589 889.657313h584.902687C729.629082 914.416716 750.109082 733.61194 497.777141 733.61194 214.113858 733.61194 146.407589 889.657313 146.407589 889.657313z"
fill="#FFFFFF"/>
<path d="M731.310276 913.958209c-3.66806 0-7.336119 1.528358-10.392836 0H146.407589a27.968955 27.968955 0 0 1-20.48-14.060896 24.300896 24.300896 0 0 1-1.83403-23.078209c3.056716-7.030448 78.099104-169.953433 373.683582-169.953432 232.004776 0 255.235821 146.111045 257.528359 175.302686a26.899104 26.899104 0 0 1 0 6.113433v1.528358a25.065075 25.065075 0 0 1-23.995224 24.14806z m-536.14806-48.754627h511.847164c-11.768358-39.890149-58.536119-109.583284-209.232239-109.583283-181.263284 0-265.475821 67.859104-302.614925 109.583283z"
fill="#3C663E"/>
<path d="M1189.664903 73.055522s-168.119403-22.772537-258.903881-22.772537-199.756418 48.143284-199.756418 105.151045v718.328358S725.808186 733.61194 953.533559 733.61194s285.650149 56.243582 285.65015 56.243582z"
fill="#FFFFFF"/>
<path d="M707.00938 158.490746c0-80.238806 130.216119-132.661493 223.751642-132.661492A2599.890149 2599.890149 0 0 1 1192.263112 48.907463a24.606567 24.606567 0 0 1 21.091343 22.466865l49.518806 717.411344A24.300896 24.300896 0 0 1 1222.830276 807.890149s-58.383284-49.213134-268.685373-49.213134c-189.210746 0-197.769552 101.482985-198.686568 114.168358v1.528358a24.606567 24.606567 0 0 1-23.995223 24.453732 22.31403 22.31403 0 0 1-23.995224-21.397015v-718.328358m223.293134-84.518209c-88.644776 0-175.302687 45.850746-175.302687 80.850149v614.552836c34.999403-32.55403 95.063881-60.064478 198.686568-60.064478 137.552239 0 215.651343 19.868657 258.292537 37.444776l-45.850746-652.761791c-46.614925-5.807761-165.521194-20.021493-235.825672-20.021492z"
fill="#3C663E"/>
<path d="M1326.758634 886.600597l-87.574925-107.596418-49.518806-705.948657 90.32597 113.862687 46.767761 699.682388z"
fill="#FFFFFF"/>
<path d="M1326.758634 910.901493a24.300896 24.300896 0 0 1-18.951642-9.17015l-87.422089-106.985074a24.300896 24.300896 0 0 1-5.50209-13.755224L1165.211171 74.736716a24.759403 24.759403 0 0 1 15.283582-24.453731 24.300896 24.300896 0 0 1 27.81612 7.641791L1299.248186 171.787463a24.912239 24.912239 0 0 1 5.196418 13.602388l45.850746 696.167164a26.746269 26.746269 0 0 1 0 5.043582 24.453731 24.453731 0 0 1-24.453731 24.300896z m-63.732537-141.220299l34.235224 42.029851-41.112836-615.469851-36.680597-45.850746z"
fill="#3C663E"/>
<path d="M1328.439828 889.657313H731.310276S725.808186 733.61194 976.458932 733.61194c283.05194 0 351.980896 156.045373 351.980896 156.045373z"
fill="#FFFFFF"/>
<path d="M1328.7455 913.958209H731.310276a24.300896 24.300896 0 0 1-24.300896-23.383881 158.643582 158.643582 0 0 1 45.850746-108.054925c45.850746-48.143284 122.268657-72.597015 223.293135-72.597015 275.104478 0 359.469851 140.608955 372.460895 166.132537a23.078209 23.078209 0 0 1 4.126567 13.602388 24.300896 24.300896 0 0 1-23.995223 24.300896z m-569.160597-48.754627h522.545671c-37.444776-41.724179-124.561194-106.985075-305.671642-106.985075-86.046567 0-150.848955 19.562985-187.376716 56.854926a116.919403 116.919403 0 0 0-29.497313 50.130149z"
fill="#3C663E"/>
<path d="M737.882216 175.608358a36.527761 36.527761 0 0 1-36.527761-36.527761c0-24.912239-73.361194-66.025075-157.115224-66.025075-87.727761 0-256.764179 22.31403-258.445373 22.466866a36.527761 36.527761 0 0 1-9.628657-72.444179C283.348485 22.161194 451.773559 0 544.239231 0c111.264478 0 230.170746 55.93791 230.170746 139.080597a36.527761 36.527761 0 0 1-36.527761 36.527761z"
fill="#3C663E"/>
<path d="M152.979529 251.109254a37.29194 37.29194 0 0 1-23.231044-8.253135 36.527761 36.527761 0 0 1-4.890747-51.505671l127.923583-155.281194a36.527761 36.527761 0 0 1 56.396417 45.850746l-127.923582 155.892537a36.22209 36.22209 0 0 1-28.274627 13.296717zM738.035052 175.608358a36.527761 36.527761 0 0 1-36.527761-36.527761C701.507291 55.93791 820.566395 0 932.442216 0a2621.592836 2621.592836 0 0 1 262.877612 23.078209 36.527761 36.527761 0 1 1-9.781493 72.444179c-1.681194 0-166.285373-22.466866-253.860298-22.466866-83.601194 0-157.115224 41.112836-157.115224 66.025075a36.527761 36.527761 0 0 1-36.527761 36.527761z"
fill="#3C663E"/>
<path d="M1328.134156 257.222687a36.986269 36.986269 0 0 1-27.816119-12.685374l-137.552239-161.241791a36.527761 36.527761 0 1 1 55.479403-47.684776l137.552239 161.241791a36.680597 36.680597 0 0 1-3.973731 51.658508 37.29194 37.29194 0 0 1-23.689553 8.711642zM655.962216 669.26806a24.300896 24.300896 0 0 1-20.938507-12.07403c-17.117612-28.274627-170.41194-47.226269-297.418508-16.81194a24.300896 24.300896 0 0 1-11.309851-47.379105c113.709851-27.357612 311.479403-25.523582 350.452538 38.973134a24.453731 24.453731 0 0 1-8.253135 33.471045 23.689552 23.689552 0 0 1-12.532537 3.820896zM655.962216 548.374925a24.300896 24.300896 0 0 1-20.938507-11.768358C618.058932 508.637612 477.755649 489.074627 349.832067 519.641791a24.300896 24.300896 0 0 1-11.309851-47.379104c114.779701-27.510448 298.946866-25.98209 338.225672 38.973134a24.300896 24.300896 0 0 1-8.253135 33.471045 23.689552 23.689552 0 0 1-12.532537 3.668059zM655.962216 432.372537a24.300896 24.300896 0 0 1-20.938507-11.768358c-17.117612-28.427463-146.263881-47.226269-272.964777-16.81194a24.300896 24.300896 0 1 1-11.462686-47.379105c110.80597-26.593433 285.802985-27.816119 326.151642 38.973135a24.300896 24.300896 0 0 1-8.253135 33.471044 23.689552 23.689552 0 0 1-12.532537 3.515224zM816.286992 547.45791a24.912239 24.912239 0 0 1-13.90806-4.432238 24.300896 24.300896 0 0 1-5.960597-33.929553c49.671642-70.915821 152.835821-61.134328 220.847762-55.479403A24.912239 24.912239 0 0 1 1039.427291 480.057313a23.995224 23.995224 0 0 1-25.829254 22.161194c-58.230448-5.196418-144.124179-12.991045-177.74806 34.846568a24.300896 24.300896 0 0 1-19.562985 10.392835zM816.286992 426.564776a25.065075 25.065075 0 0 1-12.532537-3.515224 24.453731 24.453731 0 0 1-8.864478-33.471045c39.278806-64.955224 223.44597-66.483582 338.378508-38.973134a24.300896 24.300896 0 1 1-11.462687 47.379105c-127.923582-30.567164-268.226866-11.157015-285.191642 16.81194a24.606567 24.606567 0 0 1-20.327164 11.768358zM816.286992 310.562388a25.065075 25.065075 0 0 1-12.532537-3.515224A24.453731 24.453731 0 0 1 794.889977 273.576119c40.348657-66.789254 215.345672-65.566567 326.151642-39.12597a24.453731 24.453731 0 0 1-11.309851 47.531941c-126.853731-30.567164-256-11.615522-273.117612 16.81194a24.606567 24.606567 0 0 1-20.327164 11.768358z"
fill="#3C663E"/>
<path d="M548.212962 265.017313l-69.998806-60.828656-76.112238 60.828656 0.152835-216.262686h146.263881l-0.305672 216.262686z"
fill="#B2EDA6"/>
<path d="M548.212962 289.471045a24.759403 24.759403 0 0 1-15.283582-5.960597l-54.715224-47.684776-60.370149 48.296119a24.453731 24.453731 0 0 1-25.829254 2.903881 20.021493 20.021493 0 0 1-13.449552-18.951642V48.754627a24.453731 24.453731 0 0 1 24.300896-24.453731h146.26388a24.300896 24.300896 0 0 1 16.506269 7.183283 24.606567 24.606567 0 0 1 7.183283 17.270448v216.415522a24.14806 24.14806 0 0 1-14.366567 22.008358 23.231045 23.231045 0 0 1-10.24 2.292538zM426.708485 73.055522v146.263881l36.222089-34.235224a24.453731 24.453731 0 0 1 30.567164 0l30.567165 33.623881V73.055522z"
fill="#3C663E"/>
</svg>
\ No newline at end of file
<svg width="101.9" height="20" viewBox="0 0 1019 200" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<linearGradient id="a" x2="0" y2="100%">
<stop offset="0" stop-opacity=".1" stop-color="#EEE"/>
<stop offset="1" stop-opacity=".1"/>
</linearGradient>
<mask id="m">
<rect width="1019" height="200" rx="30" fill="#FFF"/>
</mask>
<g mask="url(#m)">
<rect width="479" height="200" fill="#555"/>
<rect width="540" height="200" fill="#4ab8a1" x="479"/>
<rect width="1019" height="200" fill="url(#a)"/>
</g>
<g fill="#fff" text-anchor="start" font-family="Verdana,DejaVu Sans,sans-serif" font-size="110">
<text x="200" y="148" textLength="265" fill="#000" opacity="0.25">Book</text>
<text x="190" y="138" textLength="265">Book</text>
<text x="534" y="148" textLength="440" fill="#000" opacity="0.25">在线阅读</text>
<text x="524" y="138" textLength="440">在线阅读</text>
</g>
<image x="40" y="35" width="130" height="130"
xlink:href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3Ny4wNzUgNzcuNyI+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTQ3LjMyMyA3Ny43Yy0zLjU5NCAwLTYuNzktMi4zOTYtNy43ODctNS45OWwtMTcuMTcyLTYxLjdjLS45OTgtNC4zOTMgMS41OTgtOC43ODYgNS45OS05Ljc4NCA0LjE5My0xIDguMzg3IDEuMzk3IDkuNTg0IDUuMzlsMTYuOTczIDYxLjdjMS4xOTggNC4zOTQtMS4zOTcgOC43ODYtNS41OSA5Ljk4NC0uNi4yLTEuMzk3LjQtMS45OTcuNHoiLz48cGF0aCBmaWxsPSIjRkZGIiBkPSJNMTcuMzcyIDcwLjcxYy00LjM5MyAwLTcuOTg3LTMuNTkzLTcuOTg3LTcuOTg1IDAtMS45OTcuOC0zLjk5NCAxLjk5Ny01LjM5Mkw1NC4xMTIgOS40MWMyLjk5NS0zLjM5MyA3Ljk4Ni0zLjU5MyAxMS4zOC0uNTk4czMuNTk1IDcuOTg3LjYgMTEuMzhsLTQyLjczIDQ3LjcyM2MtMS41OTcgMS43OTgtMy43OTQgMi43OTYtNS45OSAyLjc5NnoiLz48cGF0aCBmaWxsPSIjRkZGIiBkPSJNNjkuMDg3IDU2LjczNGMtLjc5OCAwLTEuNTk3LS4yLTIuNTk2LS40TDUuNTkgMzYuMzY4QzEuNCAzNC45Ny0uOTk3IDMwLjM3Ny40IDI2LjE4NGMxLjM5Ny00LjE5MyA1Ljk5LTYuNTkgMTAuMTgzLTUuMTlsNjAuOSAxOS45NjZjNC4xOTMgMS4zOTcgNi41OSA1Ljk5IDUuMTkgMTAuMTg0LS45OTYgMy4zOTQtMy45OSA1LjU5LTcuNTg2IDUuNTl6Ii8+PC9zdmc+"/>
</svg>
\ No newline at end of file
<svg width="148.0" height="20" viewBox="0 0 1480 200" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<linearGradient id="a" x2="0" y2="100%">
<stop offset="0" stop-opacity=".1" stop-color="#EEE"/>
<stop offset="1" stop-opacity=".1"/>
</linearGradient>
<mask id="m">
<rect width="1480" height="200" rx="30" fill="#FFF"/>
</mask>
<g mask="url(#m)">
<rect width="540" height="200" fill="#07c160"/>
<rect width="940" height="200" fill="#e7232c" x="540"/>
<rect width="1480" height="200" fill="url(#a)"/>
</g>
<g fill="#fff" text-anchor="start" font-family="Verdana,DejaVu Sans,sans-serif" font-size="110">
<text x="200" y="148" textLength="310" fill="#000" opacity="0.25">公众号</text>
<text x="190" y="138" textLength="310">公众号</text>
<text x="594" y="148" textLength="840" fill="#000" opacity="0.25">bugstack虫洞栈</text>
<text x="584" y="138" textLength="840">bugstack虫洞栈</text>
</g>
<image x="40" y="35" width="130" height="130"
xlink:href="data:image/png;base64,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"/>
</svg>
\ No newline at end of file
* [:octocat: 首页](/README)
* :memo: 目录
* [第 1 章 - 引言](/notes/asm-doc/1引言.md)
* `第一部分 核心 API`
* [第 2 章 - 类](notes/asm-doc/2.0类.md)
* [2.1 结构](notes/asm-doc/2.1结构.md)
* [2.2 接口和组件](notes/asm-doc/2.2接口和组件.md)
* [2.3 工具](notes/asm-doc/2.3工具.md)
* [第 3 章 - 方法](/notes/asm-doc/3.0方法.md)
* [3.1 结构](/notes/asm-doc/3.1结构.md)
* [3.2 接口和组件](/notes/asm-doc/3.2接口和组件.md)
* [3.3 工具](/notes/asm-doc/3.3工具.md)
* [第 4 章 - 元数据](/notes/asm-doc/4.0元数据.md)
* [4.1 泛型](/notes/asm-doc/4.1泛型.md)
* [4.2 注释](/notes/asm-doc/4.2注释.md)
* [4.3 调试](/notes/asm-doc/4.3调试.md)
* [第 5 章 - 后向兼容](/notes/asm-doc/5.0后向兼容.md)
* [5.1 引言](/notes/asm-doc/5.1引言.md)
* [5.2 规则](/notes/asm-doc/5.2规则.md)
* `第二部分 树 API`
* [第 6 章 - 类](/notes/asm-doc/6.0类.md)
* [6.1 接口和组件](/notes/asm-doc/6.1接口和组件.md)
* [6.2 组件合成](/notes/asm-doc/6.2组件合成.md)
* [第 7 章 - 方法](/notes/asm-doc/7.0方法.md)
* [7.1 接口和组件](/notes/asm-doc/7.1接口和组件.md)
* [7.2 组件合成](/notes/asm-doc/7.2组件合成.md)
* [第 8 章 - 方法分析](/notes/asm-doc/8.0方法分析.md)
* [8.1 介绍](/notes/asm-doc/8.1介绍.md)
* [8.2 组件与接口](/notes/asm-doc/8.2组件与接口.md)
* [第 9 章 - 元数据](/notes/asm-doc/9.0元数据.md)
* [9.1 泛型](/notes/asm-doc/9.1泛型.md)
* [9.2 注释](/notes/asm-doc/9.2注释.md)
* [9.2 调试](/notes/asm-doc/9.3调试.md)
* [第 10 章 - 后向兼容](/notes/asm-doc/10.0后向兼容.md)
* [10.1 介绍](/notes/asm-doc/10.1介绍.md)
* [10.2 规则](/notes/asm-doc/10.2规则.md)
* [A. 附录](/notes/asm-doc/A.0附录.md)
* [A.1 字节代码指令](/notes/asm-doc/A.1字节代码指.md)
* [A.2 子例程](/notes/asm-doc/A.2子例程.md)
* [A.3 属性](/notes/asm-doc/A.3属性.md)
* [A.4 规则](/notes/asm-doc/A.4规则.md)
* [A.5 性能](/notes/asm-doc/A.5性能.md)
* [JVM指令表](/notes/asm-doc/JVM-指令表.md)
\ No newline at end of file
此差异已折叠。
@import url("https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,400,600");*{-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;box-sizing:border-box}body:not(.ready){overflow:hidden}body:not(.ready) .app-nav,body:not(.ready)>nav,body:not(.ready) [data-cloak]{display:none}div#app{font-size:30px;font-weight:lighter;margin:40vh auto;text-align:center}div#app:empty:before{content:"Loading..."}.emoji{height:1.2rem;vertical-align:middle}.progress{background-color:var(--theme-color,#42b983);height:2px;left:0;position:fixed;right:0;top:0;transition:width .2s,opacity .4s;width:0;z-index:999999}.search .search-keyword,.search a:hover{color:var(--theme-color,#42b983)}.search .search-keyword{font-style:normal;font-weight:700}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#34495e;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0;overflow-x:hidden}img{max-width:100%}a[disabled]{cursor:not-allowed;opacity:.6}kbd{border:1px solid #ccc;border-radius:3px;display:inline-block;font-size:12px!important;line-height:12px;margin-bottom:3px;padding:3px 5px;vertical-align:middle}li input[type=checkbox]{margin:0 .2em .25em 0;vertical-align:middle}.app-nav{margin:25px 60px 0 0;position:absolute;right:0;text-align:right;z-index:10}.app-nav.no-badge{margin-right:25px}.app-nav p{margin:0}.app-nav>a{margin:0 1rem;padding:5px 0}.app-nav li,.app-nav ul{display:inline-block;list-style:none;margin:0}.app-nav a{color:inherit;font-size:16px;text-decoration:none;transition:color .3s}.app-nav a.active,.app-nav a:hover{color:var(--theme-color,#42b983)}.app-nav a.active{border-bottom:2px solid var(--theme-color,#42b983)}.app-nav li{display:inline-block;margin:0 1rem;padding:5px 0;position:relative}.app-nav li ul{background-color:#fff;border:1px solid;border-color:#ddd #ddd #ccc;border-radius:4px;box-sizing:border-box;display:none;max-height:calc(100vh - 61px);overflow-y:auto;padding:10px 0;position:absolute;right:-15px;text-align:left;top:100%;white-space:nowrap}.app-nav li ul li{display:block;font-size:14px;line-height:1rem;margin:8px 14px;white-space:nowrap}.app-nav li ul a{display:block;font-size:inherit;margin:0;padding:0}.app-nav li ul a.active{border-bottom:0}.app-nav li:hover ul{display:block}.github-corner{border-bottom:0;position:fixed;right:0;text-decoration:none;top:0;z-index:1}.github-corner:hover .octo-arm{-webkit-animation:octocat-wave .56s ease-in-out;animation:octocat-wave .56s ease-in-out}.github-corner svg{color:#fff;fill:var(--theme-color,#42b983);height:80px;width:80px}main{display:block;position:relative;width:100vw;height:100%;z-index:0}main.hidden{display:none}.anchor{display:inline-block;text-decoration:none;transition:all .3s}.anchor span{color:#34495e}.anchor:hover{text-decoration:underline}.sidebar{border-right:1px solid rgba(0,0,0,.07);overflow-y:auto;padding:40px 0 0;position:absolute;top:0;bottom:0;left:0;transition:transform .25s ease-out;width:300px;z-index:20}.sidebar>h1{margin:0 auto 1rem;font-size:1.5rem;font-weight:300;text-align:center}.sidebar>h1 a{color:inherit;text-decoration:none}.sidebar>h1 .app-nav{display:block;position:static}.sidebar .sidebar-nav{line-height:2em;padding-bottom:40px}.sidebar li.collapse .app-sub-sidebar{display:none}.sidebar ul{margin:0 0 0 15px;padding:0}.sidebar li>p{font-weight:700;margin:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{border-bottom:none;display:block}.sidebar ul li ul{padding-left:20px}.sidebar::-webkit-scrollbar{width:4px}.sidebar::-webkit-scrollbar-thumb{background:transparent;border-radius:4px}.sidebar:hover::-webkit-scrollbar-thumb{background:hsla(0,0%,53.3%,.4)}.sidebar:hover::-webkit-scrollbar-track{background:hsla(0,0%,53.3%,.1)}.sidebar-toggle{background-color:transparent;background-color:hsla(0,0%,100%,.8);border:0;outline:none;padding:10px;position:absolute;bottom:0;left:0;text-align:center;transition:opacity .3s;width:284px;z-index:30}.sidebar-toggle .sidebar-toggle-button:hover{opacity:.4}.sidebar-toggle span{background-color:var(--theme-color,#42b983);display:block;margin-bottom:4px;width:16px;height:2px}body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}.content{padding-top:60px;position:absolute;top:0;right:0;bottom:0;left:300px;transition:left .25s ease}.markdown-section{margin:0 auto;max-width:800px;padding:30px 15px 40px;position:relative}.markdown-section>*{box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section hr{border:none;border-bottom:1px solid #eee;margin:2em 0}.markdown-section iframe{border:1px solid #eee;width:1px;min-width:100%}.markdown-section table{border-collapse:collapse;border-spacing:0;display:block;margin-bottom:1rem;overflow:auto;width:100%}.markdown-section th{font-weight:700}.markdown-section td,.markdown-section th{border:1px solid #ddd;padding:6px 13px}.markdown-section tr{border-top:1px solid #ccc}.markdown-section p.tip,.markdown-section tr:nth-child(2n){background-color:#f8f8f8}.markdown-section p.tip{border-bottom-right-radius:2px;border-left:4px solid #f66;border-top-right-radius:2px;margin:2em 0;padding:12px 24px 12px 30px;position:relative}.markdown-section p.tip:before{background-color:#f66;border-radius:100%;color:#fff;content:"!";font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:14px;font-weight:700;left:-12px;line-height:20px;position:absolute;height:20px;width:20px;text-align:center;top:14px}.markdown-section p.tip code{background-color:#efefef}.markdown-section p.tip em{color:#34495e}.markdown-section p.warn{background:rgba(66,185,131,.1);border-radius:2px;padding:1rem}.markdown-section ul.task-list>li{list-style-type:none}body.close .sidebar{transform:translateX(-300px)}body.close .sidebar-toggle{width:auto}body.close .content{left:0}@media print{.app-nav,.github-corner,.sidebar,.sidebar-toggle{display:none}}@media screen and (max-width:768px){.github-corner,.sidebar,.sidebar-toggle{position:fixed}.app-nav{margin-top:16px}.app-nav li ul{top:30px}main{height:auto;overflow-x:hidden}.sidebar{left:-300px;transition:transform .25s ease-out}.content{left:0;max-width:100vw;position:static;padding-top:20px;transition:transform .25s ease}.app-nav,.github-corner{transition:transform .25s ease-out}.sidebar-toggle{background-color:transparent;width:auto;padding:30px 30px 10px 10px}body.close .sidebar{transform:translateX(300px)}body.close .sidebar-toggle{background-color:hsla(0,0%,100%,.8);transition:background-color 1s;width:284px;padding:10px}body.close .content{transform:translateX(300px)}body.close .app-nav,body.close .github-corner{display:none}.github-corner:hover .octo-arm{-webkit-animation:none;animation:none}.github-corner .octo-arm{-webkit-animation:octocat-wave .56s ease-in-out;animation:octocat-wave .56s ease-in-out}}@-webkit-keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}section.cover{align-items:center;background-position:50%;background-repeat:no-repeat;background-size:cover;height:100vh;display:none}section.cover.show{display:flex}section.cover.has-mask .mask{background-color:#fff;opacity:.8;position:absolute;top:0;height:100%;width:100%}section.cover .cover-main{flex:1;margin:-20px 16px 0;text-align:center;z-index:1}section.cover a{color:inherit}section.cover a,section.cover a:hover{text-decoration:none}section.cover p{line-height:1.5rem;margin:1em 0}section.cover h1{color:inherit;font-size:2.5rem;font-weight:300;margin:.625rem 0 2.5rem;position:relative;text-align:center}section.cover h1 a{display:block}section.cover h1 small{bottom:-.4375rem;font-size:1rem;position:absolute}section.cover blockquote{font-size:1.5rem;text-align:center}section.cover ul{line-height:1.8;list-style-type:none;margin:1em auto;max-width:500px;padding:0}section.cover .cover-main>p:last-child a{border-radius:2rem;border:1px solid var(--theme-color,#42b983);box-sizing:border-box;color:var(--theme-color,#42b983);display:inline-block;font-size:1.05rem;letter-spacing:.1rem;margin:.5rem 1rem;padding:.75em 2rem;text-decoration:none;transition:all .15s ease}section.cover .cover-main>p:last-child a:last-child{background-color:var(--theme-color,#42b983);color:#fff}section.cover .cover-main>p:last-child a:last-child:hover{color:inherit;opacity:.8}section.cover .cover-main>p:last-child a:hover{color:inherit}section.cover blockquote>p>a{border-bottom:2px solid var(--theme-color,#42b983);transition:color .3s}section.cover blockquote>p>a:hover{color:var(--theme-color,#42b983)}.sidebar,body{background-color:#fff}.sidebar{color:#364149}.sidebar li{margin:6px 0}.sidebar ul li a{color:#505d6b;font-size:14px;font-weight:400;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.sidebar ul li a:hover{text-decoration:underline}.sidebar ul li ul{padding:0}.sidebar ul li.active>a{border-right:2px solid;color:var(--theme-color,#42b983);font-weight:600}.app-sub-sidebar li:before{content:"-";padding-right:4px;float:left}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section strong{color:#2c3e50;font-weight:600}.markdown-section a{color:var(--theme-color,#42b983);font-weight:600}.markdown-section h1{font-size:2rem;margin:0 0 1rem}.markdown-section h2{font-size:1.75rem;margin:45px 0 .8rem}.markdown-section h3{font-size:1.5rem;margin:40px 0 .6rem}.markdown-section h4{font-size:1.25rem}.markdown-section h5{font-size:1rem}.markdown-section h6{color:#777;font-size:1rem}.markdown-section figure,.markdown-section p{margin:1.2em 0}.markdown-section ol,.markdown-section p,.markdown-section ul{line-height:1.6rem;word-spacing:.05rem}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section blockquote{border-left:4px solid var(--theme-color,#42b983);color:#858585;margin:2em 0;padding-left:20px}.markdown-section blockquote p{font-weight:600;margin-left:0}.markdown-section iframe{margin:1em 0}.markdown-section em{color:#7f8c8d}.markdown-section code{border-radius:2px;color:#e96900;font-size:.8rem;margin:0 2px;padding:3px 5px;white-space:pre-wrap}.markdown-section code,.markdown-section pre{background-color:#f8f8f8;font-family:Roboto Mono,Monaco,courier,monospace}.markdown-section pre{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;line-height:1.5rem;margin:1.2em 0;overflow:auto;padding:0 1.4rem;position:relative;word-wrap:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8e908c}.token.namespace{opacity:.7}.token.boolean,.token.number{color:#c76b29}.token.punctuation{color:#525252}.token.property{color:#c08b30}.token.tag{color:#2973b7}.token.string{color:var(--theme-color,#42b983)}.token.selector{color:#6679cc}.token.attr-name{color:#2973b7}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#22a2c9}.token.attr-value,.token.control,.token.directive,.token.unit{color:var(--theme-color,#42b983)}.token.function,.token.keyword{color:#e96900}.token.atrule,.token.regex,.token.statement{color:#22a2c9}.token.placeholder,.token.variable{color:#3d8fd1}.token.deleted{text-decoration:line-through}.token.inserted{border-bottom:1px dotted #202746;text-decoration:none}.token.italic{font-style:italic}.token.bold,.token.important{font-weight:700}.token.important{color:#c94922}.token.entity{cursor:help}.markdown-section pre>code{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;background-color:#f8f8f8;border-radius:2px;color:#525252;display:block;font-family:Roboto Mono,Monaco,courier,monospace;font-size:.8rem;line-height:inherit;margin:0 2px;max-width:inherit;overflow:inherit;padding:2.2em 5px;white-space:inherit}.markdown-section code:after,.markdown-section code:before{letter-spacing:.05rem}code .token{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;min-height:1.5rem;position:relative;left:auto}pre:after{color:#ccc;content:attr(data-lang);font-size:.6rem;font-weight:600;height:15px;line-height:15px;padding:5px 10px 0;position:absolute;right:0;text-align:right;top:0}
\ No newline at end of file
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e():"function"==typeof define&&define.amd?define(e):e()}(0,function(){"use strict";var t,c=(function(t,e){function n(t,e){return e.querySelector(t)}(e=t.exports=function(t,e){return n(t,e=e||document)}).all=function(t,e){return(e=e||document).querySelectorAll(t)},e.engine=function(t){if(!t.one)throw new Error(".one callback required");if(!t.all)throw new Error(".all callback required");return n=t.one,e.all=t.all,e}}(t={exports:{}},t.exports),t.exports);c.all,c.engine;try{var a=c}catch(t){a=c}var e=Element.prototype,r=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector,s=function(t,e){if(!t||1!==t.nodeType)return!1;if(r)return r.call(t,e);for(var n=a.all(e,t.parentNode),i=0;i<n.length;++i)if(n[i]==t)return!0;return!1};try{var i=s}catch(t){i=s}var p=function(t,e,n){n=n||document.documentElement;for(;t&&t!==n;){if(i(t,e))return t;t=t.parentNode}return i(t,e)?t:null};!function(t,e){void 0===e&&(e={});var n=e.insertAt;if(t&&"undefined"!=typeof document){var i=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===n&&i.firstChild?i.insertBefore(a,i.firstChild):i.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}(".docsify-pagination-container{display:flex;flex-wrap:wrap;justify-content:space-between;overflow:hidden;margin:5em 0 1em;border-top:1px solid rgba(0,0,0,.07)}.pagination-item{margin-top:2.5em}.pagination-item a,.pagination-item a:hover{text-decoration:none}.pagination-item a{color:currentColor}.pagination-item a:hover .pagination-item-title{text-decoration:underline}.pagination-item:not(:last-child) a .pagination-item-label,.pagination-item:not(:last-child) a .pagination-item-subtitle,.pagination-item:not(:last-child) a .pagination-item-title{opacity:.3;transition:all .2s}.pagination-item:last-child .pagination-item-label,.pagination-item:not(:last-child) a:hover .pagination-item-label{opacity:.6}.pagination-item:not(:last-child) a:hover .pagination-item-title{opacity:1}.pagination-item-label{font-size:.8em}.pagination-item-label>*{line-height:1;vertical-align:middle}.pagination-item-label svg{height:.8em;width:auto;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1px}.pagination-item--next{margin-left:auto;text-align:right}.pagination-item--next svg{margin-left:.5em}.pagination-item--previous svg{margin-right:.5em}.pagination-item-title{font-size:1.6em}.pagination-item-subtitle{text-transform:uppercase;opacity:.3}");var o=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},l=function(){function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}}(),u=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},f={previousText:"PREVIOUS",nextText:"NEXT",crossChapter:!1,crossChapterText:!1},d="docsify-pagination-container";function h(t){return Array.prototype.slice.call(t)}function m(t){return t.href?t:c("a",t)}function g(e,t){return 1===arguments.length?function(t){return g(e,t)}:decodeURIComponent(t.getAttribute("href").split("?")[0])===decodeURIComponent("#"+e)}var v=function(){function n(t){var e;(o(this,n),t)&&(this.chapter=(e=p(t,"div > ul > li"),c("p",e)),this.hyperlink=m(t))}return l(n,[{key:"toJSON",value:function(){if(this.hyperlink)return{name:this.hyperlink.innerText,href:this.hyperlink.getAttribute("href"),chapterName:this.chapter&&this.chapter.innerText||""}}}]),n}();var x={container:function(){return'<div class="'+d+'"></div>'},inner:function(t,e){return[t.prev&&'\n <div class="pagination-item pagination-item--previous">\n <a href="'+t.prev.href+'">\n <div class="pagination-item-label">\n <svg class="icon" width="10" height="16" viewBox="0 0 10 16" xmlns="http://www.w3.org/2000/svg">\n <polyline fill="none" vector-effect="non-scaling-stroke" points="8,2 2,8 8,14"/>\n </svg>\n <span>'+e.previousText+'</span>\n </div>\n <div class="pagination-item-title">'+t.prev.name+"</div>\n ",t.prev&&e.crossChapterText&&'<div class="pagination-item-subtitle">'+t.prev.chapterName+"</div>",t.prev&&"</a>\n </div>\n ",t.next&&'\n <div class="pagination-item pagination-item--next">\n <a href="'+t.next.href+'">\n <div class="pagination-item-label">\n <span>'+e.nextText+'</span>\n <svg width="10" height="16" viewBox="0 0 10 16" xmlns="http://www.w3.org/2000/svg">\n <polyline fill="none" vector-effect="non-scaling-stroke" points="2,2 8,8 2,14"/>\n </svg>\n </div>\n <div class="pagination-item-title">'+t.next.name+"</div>\n ",t.next&&e.crossChapterText&&'<div class="pagination-item-subtitle">'+t.next.chapterName+"</div>",t.next&&"</a>\n </div>\n "].filter(Boolean).join("")}};window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(t,e){var n=u({},f,e.config.pagination||{});function i(){var t=c("."+d);t&&(t.innerHTML=x.inner(function(t,e){try{var n=t.route.path,i=h(c.all(".sidebar li a")).filter(function(t){return!s(t,".section-link")}),a=i.find(g(n)),r=h((p(a,"ul")||{}).children).filter(function(t){return"LI"===t.tagName.toUpperCase()}),o=e?i.findIndex(g(n)):r.findIndex(function(t){var e=m(t);return e&&g(n,e)}),l=e?i:r;return{prev:new v(l[o-1]).toJSON(),next:new v(l[o+1]).toJSON()}}catch(t){return{}}}(e,n.crossChapter),n))}t.afterEach(function(t){return t+x.container()}),t.doneEach(function(){return i()})}].concat(window.$docsify.plugins||[])});
\ No newline at end of file
此差异已折叠。
此差异已折叠。
/*
* JavaScript MD5
* https://github.com/blueimp/JavaScript-MD5
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*
* Based on
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
*/
/* global define */
/* eslint-disable strict */
;(function($) {
'use strict'
/**
* Add integers, wrapping at 2^32.
* This uses 16-bit operations internally to work around bugs in interpreters.
*
* @param {number} x First integer
* @param {number} y Second integer
* @returns {number} Sum
*/
function safeAdd(x, y) {
var lsw = (x & 0xffff) + (y & 0xffff)
var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
return (msw << 16) | (lsw & 0xffff)
}
/**
* Bitwise rotate a 32-bit number to the left.
*
* @param {number} num 32-bit number
* @param {number} cnt Rotation count
* @returns {number} Rotated number
*/
function bitRotateLeft(num, cnt) {
return (num << cnt) | (num >>> (32 - cnt))
}
/**
* Basic operation the algorithm uses.
*
* @param {number} q q
* @param {number} a a
* @param {number} b b
* @param {number} x x
* @param {number} s s
* @param {number} t t
* @returns {number} Result
*/
function md5cmn(q, a, b, x, s, t) {
return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)
}
/**
* Basic operation the algorithm uses.
*
* @param {number} a a
* @param {number} b b
* @param {number} c c
* @param {number} d d
* @param {number} x x
* @param {number} s s
* @param {number} t t
* @returns {number} Result
*/
function md5ff(a, b, c, d, x, s, t) {
return md5cmn((b & c) | (~b & d), a, b, x, s, t)
}
/**
* Basic operation the algorithm uses.
*
* @param {number} a a
* @param {number} b b
* @param {number} c c
* @param {number} d d
* @param {number} x x
* @param {number} s s
* @param {number} t t
* @returns {number} Result
*/
function md5gg(a, b, c, d, x, s, t) {
return md5cmn((b & d) | (c & ~d), a, b, x, s, t)
}
/**
* Basic operation the algorithm uses.
*
* @param {number} a a
* @param {number} b b
* @param {number} c c
* @param {number} d d
* @param {number} x x
* @param {number} s s
* @param {number} t t
* @returns {number} Result
*/
function md5hh(a, b, c, d, x, s, t) {
return md5cmn(b ^ c ^ d, a, b, x, s, t)
}
/**
* Basic operation the algorithm uses.
*
* @param {number} a a
* @param {number} b b
* @param {number} c c
* @param {number} d d
* @param {number} x x
* @param {number} s s
* @param {number} t t
* @returns {number} Result
*/
function md5ii(a, b, c, d, x, s, t) {
return md5cmn(c ^ (b | ~d), a, b, x, s, t)
}
/**
* Calculate the MD5 of an array of little-endian words, and a bit length.
*
* @param {Array} x Array of little-endian words
* @param {number} len Bit length
* @returns {Array<number>} MD5 Array
*/
function binlMD5(x, len) {
/* append padding */
x[len >> 5] |= 0x80 << len % 32
x[(((len + 64) >>> 9) << 4) + 14] = len
var i
var olda
var oldb
var oldc
var oldd
var a = 1732584193
var b = -271733879
var c = -1732584194
var d = 271733878
for (i = 0; i < x.length; i += 16) {
olda = a
oldb = b
oldc = c
oldd = d
a = md5ff(a, b, c, d, x[i], 7, -680876936)
d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)
c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)
b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)
a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)
d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)
c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)
b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)
a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)
d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)
c = md5ff(c, d, a, b, x[i + 10], 17, -42063)
b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)
a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)
d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)
c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)
b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)
a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)
d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)
c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)
b = md5gg(b, c, d, a, x[i], 20, -373897302)
a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)
d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)
c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)
b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)
a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)
d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)
c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)
b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)
a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)
d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)
c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)
b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)
a = md5hh(a, b, c, d, x[i + 5], 4, -378558)
d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)
c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)
b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)
a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)
d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)
c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)
b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)
a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)
d = md5hh(d, a, b, c, x[i], 11, -358537222)
c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)
b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)
a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)
d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)
c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)
b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)
a = md5ii(a, b, c, d, x[i], 6, -198630844)
d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)
c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)
b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)
a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)
d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)
c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)
b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)
a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)
d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)
c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)
b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)
a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)
d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)
c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)
b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)
a = safeAdd(a, olda)
b = safeAdd(b, oldb)
c = safeAdd(c, oldc)
d = safeAdd(d, oldd)
}
return [a, b, c, d]
}
/**
* Convert an array of little-endian words to a string
*
* @param {Array<number>} input MD5 Array
* @returns {string} MD5 string
*/
function binl2rstr(input) {
var i
var output = ''
var length32 = input.length * 32
for (i = 0; i < length32; i += 8) {
output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff)
}
return output
}
/**
* Convert a raw string to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*
* @param {string} input Raw input string
* @returns {Array<number>} Array of little-endian words
*/
function rstr2binl(input) {
var i
var output = []
output[(input.length >> 2) - 1] = undefined
for (i = 0; i < output.length; i += 1) {
output[i] = 0
}
var length8 = input.length * 8
for (i = 0; i < length8; i += 8) {
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32
}
return output
}
/**
* Calculate the MD5 of a raw string
*
* @param {string} s Input string
* @returns {string} Raw MD5 string
*/
function rstrMD5(s) {
return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))
}
/**
* Calculates the HMAC-MD5 of a key and some data (raw strings)
*
* @param {string} key HMAC key
* @param {string} data Raw input string
* @returns {string} Raw MD5 string
*/
function rstrHMACMD5(key, data) {
var i
var bkey = rstr2binl(key)
var ipad = []
var opad = []
var hash
ipad[15] = opad[15] = undefined
if (bkey.length > 16) {
bkey = binlMD5(bkey, key.length * 8)
}
for (i = 0; i < 16; i += 1) {
ipad[i] = bkey[i] ^ 0x36363636
opad[i] = bkey[i] ^ 0x5c5c5c5c
}
hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)
return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))
}
/**
* Convert a raw string to a hex string
*
* @param {string} input Raw input string
* @returns {string} Hex encoded string
*/
function rstr2hex(input) {
var hexTab = '0123456789abcdef'
var output = ''
var x
var i
for (i = 0; i < input.length; i += 1) {
x = input.charCodeAt(i)
output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)
}
return output
}
/**
* Encode a string as UTF-8
*
* @param {string} input Input string
* @returns {string} UTF8 string
*/
function str2rstrUTF8(input) {
return unescape(encodeURIComponent(input))
}
/**
* Encodes input string as raw MD5 string
*
* @param {string} s Input string
* @returns {string} Raw MD5 string
*/
function rawMD5(s) {
return rstrMD5(str2rstrUTF8(s))
}
/**
* Encodes input string as Hex encoded string
*
* @param {string} s Input string
* @returns {string} Hex encoded string
*/
function hexMD5(s) {
return rstr2hex(rawMD5(s))
}
/**
* Calculates the raw HMAC-MD5 for the given key and data
*
* @param {string} k HMAC key
* @param {string} d Input string
* @returns {string} Raw MD5 string
*/
function rawHMACMD5(k, d) {
return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))
}
/**
* Calculates the Hex encoded HMAC-MD5 for the given key and data
*
* @param {string} k HMAC key
* @param {string} d Input string
* @returns {string} Raw MD5 string
*/
function hexHMACMD5(k, d) {
return rstr2hex(rawHMACMD5(k, d))
}
/**
* Calculates MD5 value for a given string.
* If a key is provided, calculates the HMAC-MD5 value.
* Returns a Hex encoded string unless the raw argument is given.
*
* @param {string} string Input string
* @param {string} [key] HMAC key
* @param {boolean} [raw] Raw output switch
* @returns {string} MD5 output
*/
function md5(string, key, raw) {
if (!key) {
if (!raw) {
return hexMD5(string)
}
return rawMD5(string)
}
if (!raw) {
return hexHMACMD5(key, string)
}
return rawHMACMD5(key, string)
}
if (typeof define === 'function' && define.amd) {
define(function() {
return md5
})
} else if (typeof module === 'object' && module.exports) {
module.exports = md5
} else {
$.md5 = md5
}
})(this)
(function(Prism) {
// $ set | grep '^[A-Z][^[:space:]]*=' | cut -d= -f1 | tr '\n' '|'
// + LC_ALL, RANDOM, REPLY, SECONDS.
// + make sure PS1..4 are here as they are not always set,
// - some useless things.
var envVars = '\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b';
var insideString = {
'environment': {
pattern: RegExp("\\$" + envVars),
alias: 'constant'
},
'variable': [
// [0]: Arithmetic Environment
{
pattern: /\$?\(\([\s\S]+?\)\)/,
greedy: true,
inside: {
// If there is a $ sign at the beginning highlight $(( and )) as variable
'variable': [
{
pattern: /(^\$\(\([\s\S]+)\)\)/,
lookbehind: true
},
/^\$\(\(/
],
'number': /\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,
// Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic
'operator': /--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,
// If there is no $ sign at the beginning highlight (( and )) as punctuation
'punctuation': /\(\(?|\)\)?|,|;/
}
},
// [1]: Command Substitution
{
pattern: /\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,
greedy: true,
inside: {
'variable': /^\$\(|^`|\)$|`$/
}
},
// [2]: Brace expansion
{
pattern: /\$\{[^}]+\}/,
greedy: true,
inside: {
'operator': /:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,
'punctuation': /[\[\]]/,
'environment': {
pattern: RegExp("(\\{)" + envVars),
lookbehind: true,
alias: 'constant'
}
}
},
/\$(?:\w+|[#?*!@$])/
],
// Escape sequences from echo and printf's manuals, and escaped quotes.
'entity': /\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/
};
Prism.languages.bash = {
'shebang': {
pattern: /^#!\s*\/.*/,
alias: 'important'
},
'comment': {
pattern: /(^|[^"{\\$])#.*/,
lookbehind: true
},
'function-name': [
// a) function foo {
// b) foo() {
// c) function foo() {
// but not “foo {”
{
// a) and c)
pattern: /(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,
lookbehind: true,
alias: 'function'
},
{
// b)
pattern: /\b\w+(?=\s*\(\s*\)\s*\{)/,
alias: 'function'
}
],
// Highlight variable names as variables in for and select beginnings.
'for-or-select': {
pattern: /(\b(?:for|select)\s+)\w+(?=\s+in\s)/,
alias: 'variable',
lookbehind: true
},
// Highlight variable names as variables in the left-hand part
// of assignments (“=” and “+=”).
'assign-left': {
pattern: /(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,
inside: {
'environment': {
pattern: RegExp("(^|[\\s;|&]|[<>]\\()" + envVars),
lookbehind: true,
alias: 'constant'
}
},
alias: 'variable',
lookbehind: true
},
'string': [
// Support for Here-documents https://en.wikipedia.org/wiki/Here_document
{
pattern: /((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\2/,
lookbehind: true,
greedy: true,
inside: insideString
},
// Here-document with quotes around the tag
// → No expansion (so no “inside”).
{
pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\3/,
lookbehind: true,
greedy: true
},
// “Normal” string
{
pattern: /(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,
greedy: true,
inside: insideString
}
],
'environment': {
pattern: RegExp("\\$?" + envVars),
alias: 'constant'
},
'variable': insideString.variable,
'function': {
pattern: /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,
lookbehind: true
},
'keyword': {
pattern: /(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,
lookbehind: true
},
// https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html
'builtin': {
pattern: /(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,
lookbehind: true,
// Alias added to make those easier to distinguish from strings.
alias: 'class-name'
},
'boolean': {
pattern: /(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,
lookbehind: true
},
'file-descriptor': {
pattern: /\B&\d\b/,
alias: 'important'
},
'operator': {
// Lots of redirections here, but not just that.
pattern: /\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,
inside: {
'file-descriptor': {
pattern: /^\d/,
alias: 'important'
}
}
},
'punctuation': /\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,
'number': {
pattern: /(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,
lookbehind: true
}
};
/* Patterns in command substitution. */
var toBeCopied = [
'comment',
'function-name',
'for-or-select',
'assign-left',
'string',
'environment',
'function',
'keyword',
'builtin',
'boolean',
'file-descriptor',
'operator',
'punctuation',
'number'
];
var inside = insideString.variable[1].inside;
for(var i = 0; i < toBeCopied.length; i++) {
inside[toBeCopied[i]] = Prism.languages.bash[toBeCopied[i]];
}
Prism.languages.shell = Prism.languages.bash;
})(Prism);
!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/\b[A-Z](?:\w*[a-z]\w*)?\b/;e.languages.java=e.languages.extend("clike",{"class-name":[a,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism);
\ No newline at end of file
(function () {
/*! medium-zoom 1.0.4 | MIT License | https://github.com/francoischalifour/medium-zoom */var _extends=Object.assign||function(a){for(var b,c=1;c<arguments.length;c++){ for(var d in b=arguments[c],b){ Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d]); } }return a},isSupported=function(a){return 'IMG'===a.tagName},isNodeList=function(a){return NodeList.prototype.isPrototypeOf(a)},isNode=function(a){return a&&1===a.nodeType},isSvg=function(a){var b=a.currentSrc||a.src;return '.svg'===b.substr(-4).toLowerCase()},getImagesFromSelector=function(a){try{return Array.isArray(a)?a.filter(isSupported):isNodeList(a)?[].slice.call(a).filter(isSupported):isNode(a)?[a].filter(isSupported):'string'==typeof a?[].slice.call(document.querySelectorAll(a)).filter(isSupported):[]}catch(a){throw new TypeError('The provided selector is invalid.\nExpects a CSS selector, a Node element, a NodeList or an array.\nSee: https://github.com/francoischalifour/medium-zoom')}},createOverlay=function(a){var b=document.createElement('div');return b.classList.add('medium-zoom-overlay'),b.style.background=a,b},cloneTarget=function(a){var b=a.getBoundingClientRect(),c=b.top,d=b.left,e=b.width,f=b.height,g=a.cloneNode(),h=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,i=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;return g.removeAttribute('id'),g.style.position='absolute',g.style.top=c+h+'px',g.style.left=d+i+'px',g.style.width=e+'px',g.style.height=f+'px',g.style.transform='',g},createCustomEvent=function(a,b){var c=_extends({bubbles:!1,cancelable:!1,detail:void 0},b);if('function'==typeof window.CustomEvent){ return new CustomEvent(a,c); }var d=document.createEvent('CustomEvent');return d.initCustomEvent(a,c.bubbles,c.cancelable,c.detail),d},mediumZoom=function a(b){var c=1<arguments.length&&arguments[1]!==void 0?arguments[1]:{},d=window.Promise||function(a){function b(){}a(b,b);},e=function(a){var b=a.target;return b===x?void n():void(-1===r.indexOf(b)||o({target:b}))},f=function(){if(!t&&w.original){var a=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(u-a)>v.scrollOffset&&setTimeout(n,150);}},g=function(){var a=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},b=a;if(a.background&&(x.style.background=a.background),a.container&&a.container instanceof Object&&(b.container=_extends({},v.container,a.container)),a.template){var c=isNode(a.template)?a.template:document.querySelector(a.template);b.template=c;}return v=_extends({},v,b),r.forEach(function(a){a.dispatchEvent(createCustomEvent('medium-zoom:update',{detail:{zoom:y}}));}),y},h=function(){var b=0<arguments.length&&arguments[0]!==void 0?arguments[0]:{};return a(_extends({},v,b))},i=function(){
var arguments$1 = arguments;
for(var a=arguments.length,b=Array(a),c=0;c<a;c++){ b[c]=arguments$1[c]; }var d=b.reduce(function(a,b){return [].concat(a,getImagesFromSelector(b))},[]);return d.filter(function(a){return -1===r.indexOf(a)}).forEach(function(a){r.push(a),a.classList.add('medium-zoom-image');}),s.forEach(function(a){var b=a.type,c=a.listener,e=a.options;d.forEach(function(a){a.addEventListener(b,c,e);});}),y},j=function(){
var arguments$1 = arguments;
for(var a=arguments.length,b=Array(a),c=0;c<a;c++){ b[c]=arguments$1[c]; }w.zoomed&&n();var d=0<b.length?b.reduce(function(a,b){return [].concat(a,getImagesFromSelector(b))},[]):r;return d.forEach(function(a){a.classList.remove('medium-zoom-image'),a.dispatchEvent(createCustomEvent('medium-zoom:detach',{detail:{zoom:y}}));}),r=r.filter(function(a){return -1===d.indexOf(a)}),y},k=function(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};return r.forEach(function(d){d.addEventListener('medium-zoom:'+a,b,c);}),s.push({type:'medium-zoom:'+a,listener:b,options:c}),y},l=function(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};return r.forEach(function(d){d.removeEventListener('medium-zoom:'+a,b,c);}),s=s.filter(function(c){return c.type!=='medium-zoom:'+a||c.listener.toString()!==b.toString()}),y},m=function(){var a=0<arguments.length&&arguments[0]!==void 0?arguments[0]:{},b=a.target,c=function(){var a=Math.min,b={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},c=void 0,d=void 0;if(v.container){ if(v.container instanceof Object){ b=_extends({},b,v.container),c=b.width-b.left-b.right-2*v.margin,d=b.height-b.top-b.bottom-2*v.margin; }else{var e=isNode(v.container)?v.container:document.querySelector(v.container),f=e.getBoundingClientRect(),g=f.width,h=f.height,i=f.left,j=f.top;b=_extends({},b,{width:g,height:h,left:i,top:j});} }c=c||b.width-2*v.margin,d=d||b.height-2*v.margin;var k=w.zoomedHd||w.original,l=isSvg(k)?c:k.naturalWidth||c,m=isSvg(k)?d:k.naturalHeight||d,n=k.getBoundingClientRect(),o=n.top,p=n.left,q=n.width,r=n.height,s=a(l,c)/q,t=a(m,d)/r,u=a(s,t),x=(-p+(c-q)/2+v.margin+b.left)/u,y=(-o+(d-r)/2+v.margin+b.top)/u,z='scale('+u+') translate3d('+x+'px, '+y+'px, 0)';w.zoomed.style.transform=z,w.zoomedHd&&(w.zoomedHd.style.transform=z);};return new d(function(a){if(b&&-1===r.indexOf(b)){ return void a(y); }if(w.zoomed){ return void a(y); }if(b){ w.original=b; }else if(0<r.length){var d=r;w.original=d[0];}else { return void a(y); }if(w.original.dispatchEvent(createCustomEvent('medium-zoom:open',{detail:{zoom:y}})),u=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,t=!0,w.zoomed=cloneTarget(w.original),document.body.appendChild(x),v.template){var e=isNode(v.template)?v.template:document.querySelector(v.template);w.template=document.createElement('div'),w.template.appendChild(e.content.cloneNode(!0)),document.body.appendChild(w.template);}if(document.body.appendChild(w.zoomed),window.requestAnimationFrame(function(){document.body.classList.add('medium-zoom--opened');}),w.original.classList.add('medium-zoom-image--hidden'),w.zoomed.classList.add('medium-zoom-image--opened'),w.zoomed.addEventListener('click',n),w.zoomed.addEventListener('transitionend',function b(){t=!1,w.zoomed.removeEventListener('transitionend',b),w.original.dispatchEvent(createCustomEvent('medium-zoom:opened',{detail:{zoom:y}})),a(y);}),w.original.getAttribute('data-zoom-src')){w.zoomedHd=w.zoomed.cloneNode(),w.zoomedHd.removeAttribute('srcset'),w.zoomedHd.removeAttribute('sizes'),w.zoomedHd.src=w.zoomed.getAttribute('data-zoom-src'),w.zoomedHd.onerror=function(){clearInterval(f),console.warn('Unable to reach the zoom image target '+w.zoomedHd.src),w.zoomedHd=null,c();};var f=setInterval(function(){w.zoomedHd.complete&&(clearInterval(f),w.zoomedHd.classList.add('medium-zoom-image--opened'),w.zoomedHd.addEventListener('click',n),document.body.appendChild(w.zoomedHd),c());},10);}else if(w.original.hasAttribute('srcset')){w.zoomedHd=w.zoomed.cloneNode(),w.zoomedHd.removeAttribute('sizes');var g=w.zoomedHd.addEventListener('load',function(){w.zoomedHd.removeEventListener('load',g),w.zoomedHd.classList.add('medium-zoom-image--opened'),w.zoomedHd.addEventListener('click',n),document.body.appendChild(w.zoomedHd),c();});}else { c(); }})},n=function(){return new d(function(a){if(t||!w.original){ return void a(y); }t=!0,document.body.classList.remove('medium-zoom--opened'),w.zoomed.style.transform='',w.zoomedHd&&(w.zoomedHd.style.transform=''),w.template&&(w.template.style.transition='opacity 150ms',w.template.style.opacity=0),w.original.dispatchEvent(createCustomEvent('medium-zoom:close',{detail:{zoom:y}})),w.zoomed.addEventListener('transitionend',function b(){w.original.classList.remove('medium-zoom-image--hidden'),document.body.removeChild(w.zoomed),w.zoomedHd&&document.body.removeChild(w.zoomedHd),document.body.removeChild(x),w.zoomed.classList.remove('medium-zoom-image--opened'),w.template&&document.body.removeChild(w.template),t=!1,w.zoomed.removeEventListener('transitionend',b),w.original.dispatchEvent(createCustomEvent('medium-zoom:closed',{detail:{zoom:y}})),w.original=null,w.zoomed=null,w.zoomedHd=null,w.template=null,a(y);});})},o=function(){var a=0<arguments.length&&arguments[0]!==void 0?arguments[0]:{},b=a.target;return w.original?n():m({target:b})},p=function(){return v},q=function(){return r},r=[],s=[],t=!1,u=0,v=c,w={original:null,zoomed:null,zoomedHd:null,template:null};'[object Object]'===Object.prototype.toString.call(b)?v=b:(b||'string'==typeof b)&&i(b),v=_extends({margin:0,background:'#fff',scrollOffset:40,container:null,template:null},v);var x=createOverlay(v.background);document.addEventListener('click',e),document.addEventListener('keyup',function(a){27===(a.keyCode||a.which)&&n();}),document.addEventListener('scroll',f),window.addEventListener('resize',n);var y={open:m,close:n,toggle:o,update:g,clone:h,attach:i,detach:j,on:k,off:l,getOptions:p,getImages:q,getZoomedImage:function(){return w.original}};return y};function styleInject(a,b){void 0===b&&(b={});var c=b.insertAt;if(a&&'undefined'!=typeof document){var d=document.head||document.getElementsByTagName('head')[0],e=document.createElement('style');e.type='text/css','top'===c?d.firstChild?d.insertBefore(e,d.firstChild):d.appendChild(e):d.appendChild(e),e.styleSheet?e.styleSheet.cssText=a:e.appendChild(document.createTextNode(a));}}styleInject('.medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}');
var matchesSelector = Element.prototype.matches || Element.prototype.webkitMatchesSelector || Element.prototype.msMatchesSelector;
function install(hook) {
var zoom;
hook.doneEach(function (_) {
var elms = Array.apply(null, document.querySelectorAll('.markdown-section img:not(.emoji):not([data-no-zoom])'));
elms = elms.filter(function (elm) { return matchesSelector.call(elm, 'a img') === false; });
if (zoom) {
zoom.detach();
}
zoom = mediumZoom(elms);
});
}
$docsify.plugins = [].concat(install, $docsify.plugins);
}());
# Java 软件工程师-求职简历
## 个人信息
- 姓名:谢飞机
- 性别:男
- 工作年限:2年
- 学历:本科
- 专业:软件工程
- 院校:长春理工大学
- 联系电话:1520102****
- 通信邮箱:xiefeiji@qq.com
## 求职意向
**目标职能**:Java软件开发工程师
<br/>**目标地点**:长春
<br/>**工作性质**:全职
<br/>**到岗时间**:2周以内
## 技术栈
1. **技能** `Java``Mysql``Redis``Netty``Vue.js``Jquery`
2. **框架** `Spring``SpringMvc``Mybatis``SpringBoot``JFinal`
3. **组件** `Dubbo``ZK``RabbitMQ`
4. **工具** `IDEA``Maven``GIT``postman`
5. **部署** `Linux``Tomcat`
深入学习和使用 *Java* 语言以及相应的服务技能,对部分核心组件以及源码有过了解,其中在 *Netty* 服务设计上有丰富的经验。并且具备面向对象编程思想,可以有效合理的设计代码分层并快速实现功能。
## 工作经验
- 2018年8月 - 至今,长春虫谷科技信息有限公司
- 职位:java后端工程师
- 职责:按照技术经理的功能文档,参与设计并实现功能交付
- 2017年6月 - 2018年7月,长春走码科技有限公司
- 职位:实习开发工程师
- 职责:维护项目系统文档、梳理组织会议、编写简单功能服务
## 项目经验
### 项目一、营销抽奖系统
- 开发环境:Idea+Mac+JDK1.8+Maven3.0+Mysql5.7+Redis+Dubbo+Tomcat7.0+Git
- 系统架构:SSM,三层架构,分布式部署
- 项目描述:这是一个需要整合到目前电商系统中的一个服务模块,主要用于营销抽奖,对用户促活拉动消费。在抽奖服务中使用到了核心模块功能有;防刷、黑白名单、秒杀、发货等。系统在秒杀场景中进行多次优化,目前压测指标为QPS=1500,满足业务发展诉求。
- 工作职责:
1. 负责开发系统服务中的对外提供的统一标准接口,并与外部联调。
2. ERP运营后台开发,针对产品功能不断完善运营操作平台。以及相应的活动配置校验,保证每一个活动的准确性。
3. 参与优化秒杀功能逻辑的设计和开发,对分布式场景下的自动分配库存锁有丰富经验。
### 项目二、数据采集服务
- 开发环境:Idea+JDK1.8+Dubbo+Netty+Mysql+Git+Tomcat7.0
- 系统架构:Spring+Netty+Mybatis+JavaFX,异步分层事务驱动框架
- 项目描述:采集机械设备客户端数据,定时分段回传消息。用于系统的对机房信息监测;温度、湿度、指标、以及系统各项信息。最终对数据进行加工展示到云平台。
- 工作职责:
1. 设计基于Netty编写网络通信模块,对消息协议定制和封装编码解码器。以及对数据传输过程中的业务流程处理,例如;半包年包、弱网分段传输、数据流切块等
2. 开发采集后的数据通过 RPC 框架回传到服务端,并组最终的逻辑处理。
3. 编写工具类以及接口文档的更新,统一维护3个大区域的对接工作。
## 个人评价
1. 有较强的的学习和解决问题的能力,善于通过一些系统问题总结分析根本原因,热爱于技术挑战。
2. 在工作中可以独立承担相关职责,可以较强承受工作压力并愿意不断的提升自我。
3. 性格开朗、积极乐观,可以精神饱满的投入到工作中。有着良好的团队协作能力和责任心,对工作有强烈的使命感。
4. 想要长期从事软件开发行业,希望通过自己不断的努力来提升技术能力,并完成个人的职业发展计划。
\ No newline at end of file
## 😄 个人信息
**姓名**:谢飞机
**性别**:男
**学历**:本科
**专业**:软件工程
**院校**:吉林大学
**联系电话**:1520120****
**通信邮箱**:xiefeiji@qq.com
# Java 软件工程师-求职简历
## 个人信息
- 姓名:谢飞机
- 性别:男
- 工作年限:2年
- 学历:本科
- 专业:软件工程
- 院校:长春理工大学
- 联系电话:1520102****
- 通信邮箱:xiefeiji@qq.com
## 求职意向
**目标职能**:Java软件开发工程师
<br/>**目标地点**:长春
<br/>**工作性质**:全职
<br/>**到岗时间**:2周以内
## 技术栈
1. **技能** `Java``Mysql``Redis``Netty``Vue.js``Jquery`
2. **框架** `Spring``SpringMvc``Mybatis``SpringBoot``JFinal`
3. **组件** `Dubbo``ZK``RabbitMQ`
4. **工具** `IDEA``Maven``GIT``postman`
5. **部署** `Linux``Tomcat`
深入学习和使用 *Java* 语言以及相应的服务技能,对部分核心组件以及源码有过了解,其中在 *Netty* 服务设计上有丰富的经验。并且具备面向对象编程思想,可以有效合理的设计代码分层并快速实现功能。
## 工作经验
- 2018年8月 - 至今,长春虫谷科技信息有限公司
- 职位:java后端工程师
- 职责:按照技术经理的功能文档,参与设计并实现功能交付
- 2017年6月 - 2018年7月,长春走码科技有限公司
- 职位:实习开发工程师
- 职责:维护项目系统文档、梳理组织会议、编写简单功能服务
## 项目经验
### 项目一、营销抽奖系统
- 开发环境:Idea+Mac+JDK1.8+Maven3.0+Mysql5.7+Redis+Dubbo+Tomcat7.0+Git
- 系统架构:SSM,三层架构,分布式部署
- 项目描述:这是一个需要整合到目前电商系统中的一个服务模块,主要用于营销抽奖,对用户促活拉动消费。在抽奖服务中使用到了核心模块功能有;防刷、黑白名单、秒杀、发货等。系统在秒杀场景中进行多次优化,目前压测指标为QPS=1500,满足业务发展诉求。
- 工作职责:
1. 负责开发系统服务中的对外提供的统一标准接口,并与外部联调。
2. ERP运营后台开发,针对产品功能不断完善运营操作平台。以及相应的活动配置校验,保证每一个活动的准确性。
3. 参与优化秒杀功能逻辑的设计和开发,对分布式场景下的自动分配库存锁有丰富经验。
### 项目二、数据采集服务
- 开发环境:Idea+JDK1.8+Dubbo+Netty+Mysql+Git+Tomcat7.0
- 系统架构:Spring+Netty+Mybatis+JavaFX,异步分层事务驱动框架
- 项目描述:采集机械设备客户端数据,定时分段回传消息。用于系统的对机房信息监测;温度、湿度、指标、以及系统各项信息。最终对数据进行加工展示到云平台。
- 工作职责:
1. 设计基于Netty编写网络通信模块,对消息协议定制和封装编码解码器。以及对数据传输过程中的业务流程处理,例如;半包年包、弱网分段传输、数据流切块等
2. 开发采集后的数据通过 RPC 框架回传到服务端,并组最终的逻辑处理。
3. 编写工具类以及接口文档的更新,统一维护3个大区域的对接工作。
## 个人评价
1. 有较强的的学习和解决问题的能力,善于通过一些系统问题总结分析根本原因,热爱于技术挑战。
2. 在工作中可以独立承担相关职责,可以较强承受工作压力并愿意不断的提升自我。
3. 性格开朗、积极乐观,可以精神饱满的投入到工作中。有着良好的团队协作能力和责任心,对工作有强烈的使命感。
4. 想要长期从事软件开发行业,希望通过自己不断的努力来提升技术能力,并完成个人的职业发展计划。
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CodeGuide | 程序员编码指南</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="Description">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//itstack.org/assets/css/vue.css">
<link rel="stylesheet" href="//itstack.org/assets/css/gitalk.css">
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?b3354307876925c625a24bb138d2177c";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</head>
<body>
<div id="app"></div>
<script>
var gitalkConfig = {
clientID: '4a24b04c6f616216335e',
clientSecret: '39d764afbe74c8e0176f71ae9396734c32102a1c',
repo: 'CodeGuide',
owner: 'fuzhengwei',
admin: ["fuzhengwei"],
distractionFreeMode: false
};
window.$docsify = {
name: 'CodeGuide',
repo: 'https://github.com/fuzhengwei/CodeGuide',
auto2top: true,
coverpage: true,
loadSidebar: true,
maxLevel: 4,
subMaxLevel: 2,
search: {
paths: 'auto',
placeholder: '🔍 Type to search ',
noData: '😞 No Results! ',
depth: 6
},
pagination: {
previousText: 'PREVIOUS',
nextText: 'NEXT',
crossChapter: true
},
plugins: [
function (hook, vm) {
hook.doneEach(function() {
var label, domObj, main, divEle, gitalk;
label = md5(decodeURI(vm.route.path.split("/").pop()));
domObj = Docsify.dom;
main = domObj.getNode("#main");
Array.apply(
null,
document.querySelectorAll("div.gitalk-container")
).forEach(function(ele) {
ele.remove();
});
divEle = domObj.create("div");
divEle.id = "gitalk-container-" + label;
divEle.className = "gitalk-container";
divEle.style = "width: " + main.clientWidth + "px; margin: 0 auto 20px;";
domObj.appendTo(domObj.find(".content"), divEle);
gitalk = new Gitalk(
Object.assign(gitalkConfig, { id: !label ? "home" : label })
);
gitalk.render("gitalk-container-" + label);
});
}
]
}
</script>
<script src="//itstack.org/assets/js/md5.js"></script>
<script src="//itstack.org/assets/js/docsify.min.js"></script>
<script src="//itstack.org/assets/js/gitalk.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/docsify@4/lib/plugins/search.js"></script>
<script src="//itstack.org/assets/js/docsify-pagination.min.js"></script>
<script src="//itstack.org/assets/js/zoom-image.js"></script>
<script src="//itstack.org/assets/js/prism-bash.js"></script>
<script src="//itstack.org/assets/js/prism-java.min.js"></script>
</body>
</html>
# 《互联网 · 分布式架构》第 1 节:基础内容介绍
背景:在与星球伙伴1v1聊天的时候,遇到很多粉丝没有经历过大厂,并不清楚大厂都使用什么样的开发技术、平台服务、系统上线、运维监控等内容。所以结合粉丝对互联网大厂技术要求等内容的疑问,开始给球友陆续以《互联网 · 分布式架构》的建设背景,陆续像粉丝伙伴介绍在互联网做开发,都会使用到什么技术、遇到哪些问题、怎么解决各种复杂场景的设计,以及618备战、流量洪峰等各项核心内容。
内容:本章节给大家介绍在互联网做开发,基础环境、开发技术以及上线和监控都会用到哪些东西。一般互联网大厂像阿里、京东、腾讯等都会有公司自研的一些技术组件,比如:RPC、MQ、数据库路由等,但所有的这些技术与市面上的同类组件也是有着相同的协议,使用方式在核心内容上并不会有太大区别。所以小傅哥也会以市面上有的技术来填充到给大家梳理的分布式架构中用到的内容上,方便大家可以自行搜索资料以及测试验证。
文档:在互联网大厂,文档是非常重要的一项内容。从产品出PRD、研发设计、代码评审、系统架构以及你的晋升答辩,都会用到编写文档的各项工具。比如:XMind、Visio、PPT等。有些公司也会自行安装一些文档,比如 Conflue
工具:大部分时候无论是否在互联网工作,工具项还是非常相同的,除非你是在一个非常传统的行业,或者说你是跨语言了。这里的工具包括:JDK、IntelliJ IDEA、Navicat、Postman、Xshell、Xftp、Maven、代码库、Git、TortoiseGit等。
技术:这部分内容主要是以你在建设什么样的系统而决定你会用到哪些技术内容,除了最基本的 Spring、SpringBoot、MyBatis、RPC、MQ、Redis这些非常常用的以外,如果你需要用到分库分表,那么会设计到数据库路由组件,在数据库分库分表后又会需要用到数据整合汇总的服务,比如通过Mysql的binlog日志,把数据通过Otter同步到ES中。而这些背景下你可能还会需要用到分布式任务以及分布式事务的组件,但也可以基于MQ做最终一致性。另外在互联网应用开发中,都是采用前后端分离的,这个时候会有服务端把如RPC这样的接口,转换为http服务,但这种转换只需要把RPC接口配置到网关平台即可,而不需要自己处理http开发。另外网关服务上会提供诸如白名单、黑名单、防刷、切量、限流等各种服务治理的能力。当然在给前端的接口上,也会有一些是LVS/F5、Nginx、CDN等各项能力来保障系统的可用度。
数据:在技术层面我们提到了分库分表的Mysql汇总到ES,同时还会有一些如 HBase 等大型数据服务,用于做使用量化模型做数据分析以及生成人群标签等各项内容。
上线:除了一些小公司刀耕火种的上线方式外,还会有像是大公司里非常方便自动化的上线系统,它们的内核开发有的是基于Jenkins,也有一些是自研的,当然还有上云的服务。另外上线后还会有对应的JMeter压测服务和运行日志实时查询服务。
监控:其实关于系统的监控、数据库的监控,都是非常重要的,尤其是对那些业务体量较大、流量较高、有秒杀和大促的业务场景时,就更需要颗粒度更细的监控系统。比如需要知道 TP99、TP999、可用率、响应时长、TPS、QPS等各种指标,来判断服务的整体可用度。另外在数据库层面的监控需要知道当前的IO吞吐量、慢查询、事务、可用连接数、LOAD等综合指标和日常的数据报表。这些都是可以非常方便的反馈出整体服务的可用度。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册